From 3c4ab0244592d085fc6f2904e5e3ad94cf9638eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 2 Oct 2023 15:36:23 +0200 Subject: [PATCH 001/126] PMM-12251 Service accounts. --- managed/services/grafana/client.go | 38 ++++++++++++++++++++++++++---- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 20333cf1bb..dba4e060bd 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -218,9 +218,23 @@ func (c *Client) GetUserID(ctx context.Context) (int, error) { // Otherwise, it returns a role in the default organization (with ID 1). // Ctx is used only for cancelation. func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (authUser, error) { - // Check if it's API Key - if c.isAPIKeyAuth(authHeaders.Get("Authorization")) { - role, err := c.getRoleForAPIKey(ctx, authHeaders) + // Check if it's API Key or Service Token + auth := authHeaders.Get("Authorization") + if c.isBearerTokenAuth(auth) { + h := strings.TrimPrefix(auth, "Basic ") + d, err := base64.StdEncoding.DecodeString(strings.TrimSpace(h)) + if err != nil { + return authUser{}, err + } + if strings.HasPrefix(string(d), "api_key") { + role, err := c.getRoleForAPIKey(ctx, authHeaders) + return authUser{ + role: role, + userID: 0, + }, err + } + + role, err := c.getRoleForServiceToken(ctx, authHeaders) return authUser{ role: role, userID: 0, @@ -277,7 +291,7 @@ func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (auth }, nil } -func (c *Client) isAPIKeyAuth(authHeader string) bool { +func (c *Client) isBearerTokenAuth(authHeader string) bool { switch { case strings.HasPrefix(authHeader, "Bearer"): return true @@ -287,7 +301,7 @@ func (c *Client) isAPIKeyAuth(authHeader string) bool { if err != nil { return false } - return strings.HasPrefix(string(d), "api_key:") + return strings.HasPrefix(string(d), "api_key:") || strings.HasPrefix(string(d), "service_token:") } return false } @@ -327,6 +341,20 @@ func (c *Client) getRoleForAPIKey(ctx context.Context, authHeaders http.Header) return c.convertRole(role), nil } +func (c *Client) getRoleForServiceToken(ctx context.Context, authHeaders http.Header) (role, error) { + var k map[string]interface{} + if err := c.do(ctx, http.MethodGet, "/api/auth/serviceaccount", "", authHeaders, nil, &k); err != nil { + return none, err + } + + if id, _ := k["orgId"].(float64); id != 1 { + return none, nil + } + + role, _ := k["role"].(string) + return c.convertRole(role), nil +} + func (c *Client) testCreateUser(ctx context.Context, login string, role role, authHeaders http.Header) (int, error) { // https://grafana.com/docs/http_api/admin/#global-users b, err := json.Marshal(map[string]string{ From f4fec783e373492bcb52b37a1ce3c401c997ea56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 4 Oct 2023 10:59:12 +0200 Subject: [PATCH 002/126] PMM-12251Create service account and token. --- managed/services/grafana/client.go | 49 ++++++++++++++++++++++++++++- managed/services/management/node.go | 17 +++++----- 2 files changed, 57 insertions(+), 9 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index dba4e060bd..6af1258b37 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -47,7 +47,10 @@ import ( // ErrFailedToGetToken means it failed to get user's token. Most likely due to the fact user is not logged in using Percona Account. var ErrFailedToGetToken = errors.New("failed to get token") -const defaultEvaluationInterval = time.Minute +const ( + defaultEvaluationInterval = time.Minute + pmmServiceTokenName = "pmm-agent-service-token" +) // Client represents a client for Grafana API. type Client struct { @@ -404,6 +407,15 @@ func (c *Client) CreateAdminAPIKey(ctx context.Context, name string) (int64, str return c.createAPIKey(ctx, name, admin, authHeaders) } +// CreateServiceAccountAndToken creates service account and token with Admin role and provided name. +func (c *Client) CreateServiceAccountAndToken(ctx context.Context, name string) (int64, string, error) { + authHeaders, err := c.authHeadersFromContext(ctx) + if err != nil { + return 0, "", err + } + return c.createServiceAccountAndToken(ctx, name, admin, authHeaders) +} + // DeleteAPIKeysWithPrefix deletes all API keys with provided prefix. If there is no api key with provided prefix just ignores it. func (c *Client) DeleteAPIKeysWithPrefix(ctx context.Context, prefix string) error { authHeaders, err := c.authHeadersFromContext(ctx) @@ -606,6 +618,41 @@ func (c *Client) deleteAPIKey(ctx context.Context, apiKeyID int64, authHeaders h return c.do(ctx, "DELETE", "/api/auth/keys/"+strconv.FormatInt(apiKeyID, 10), "", authHeaders, nil, nil) } +type serviceToken struct { + ID int64 `json:"id"` + Name string `json:"name"` + Role string `json:"role"` + Expiration *time.Time `json:"expiration,omitempty"` +} + +func (c *Client) createServiceAccountAndToken(ctx context.Context, name string, role role, authHeaders http.Header) (int64, string, error) { + b, err := json.Marshal(apiKey{Name: name, Role: role.String()}) + if err != nil { + return 0, "", errors.WithStack(err) + } + var m map[string]interface{} + if err = c.do(ctx, "POST", "/api/serviceaccounts", "", authHeaders, b, &m); err != nil { + return 0, "", err + } + serviceAccountID := m["id"].(int64) //nolint:forcetypeassert + + b, err = json.Marshal(serviceToken{Name: pmmServiceTokenName}) + if err != nil { + return 0, "", errors.WithStack(err) + } + if err = c.do(ctx, "POST", fmt.Sprintf("/api/serviceaccounts/%d/tokens", serviceAccountID), "", authHeaders, b, &m); err != nil { + return 0, "", err + } + serviceTokenID := m["id"].(int64) //nolint:forcetypeassert + serviceTokenKey := m["key"].(string) //nolint:forcetypeassert + + return serviceTokenID, serviceTokenKey, nil +} + +func (c *Client) deleteServiceAccount(ctx context.Context, serviceAccountID, serviceTokenID int64, authHeaders http.Header) error { + return c.do(ctx, "DELETE", fmt.Sprintf("/api/serviceaccounts/%d/tokens/%d", serviceAccountID, serviceTokenID), "", authHeaders, nil, nil) +} + // Annotation contains grafana annotation response. type annotation struct { Time time.Time `json:"-"` diff --git a/managed/services/management/node.go b/managed/services/management/node.go index f8a43a2220..90d85940ac 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -31,23 +31,24 @@ import ( "github.com/percona/pmm/managed/services" ) -//go:generate ../../../bin/mockery --name=apiKeyProvider --case=snake --inpackage --testonly +//go:generate ../../../bin/mockery --name=authProvider --case=snake --inpackage --testonly -type apiKeyProvider interface { +type authProvider interface { CreateAdminAPIKey(ctx context.Context, name string) (int64, string, error) + CreateServiceAccountAndToken(ctx context.Context, name string) (int64, string, error) } // NodeService represents service for working with nodes. type NodeService struct { - db *reform.DB - akp apiKeyProvider + db *reform.DB + ap authProvider } // NewNodeService creates NodeService instance. -func NewNodeService(db *reform.DB, akp apiKeyProvider) *NodeService { +func NewNodeService(db *reform.DB, ap authProvider) *NodeService { return &NodeService{ - db: db, - akp: akp, + db: db, + ap: ap, } } @@ -137,7 +138,7 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo } apiKeyName := fmt.Sprintf("pmm-agent-%s-%d", req.NodeName, rand.Int63()) //nolint:gosec - _, res.Token, e = s.akp.CreateAdminAPIKey(ctx, apiKeyName) + _, res.Token, e = s.ap.CreateServiceAccountAndToken(ctx, apiKeyName) if e != nil { return nil, e } From 1612b8c8ad49cbc0ee7f49a329ba35f8e386fbed Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 4 Oct 2023 12:06:01 +0200 Subject: [PATCH 003/126] PMM-12251 Another changes. --- managed/services/grafana/client.go | 7 ++++++- managed/services/management/node.go | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 6af1258b37..ce03200b1e 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -618,6 +618,10 @@ func (c *Client) deleteAPIKey(ctx context.Context, apiKeyID int64, authHeaders h return c.do(ctx, "DELETE", "/api/auth/keys/"+strconv.FormatInt(apiKeyID, 10), "", authHeaders, nil, nil) } +type serviceAccount struct { + Name string `json:"name"` + Role string `json:"role"` +} type serviceToken struct { ID int64 `json:"id"` Name string `json:"name"` @@ -626,10 +630,11 @@ type serviceToken struct { } func (c *Client) createServiceAccountAndToken(ctx context.Context, name string, role role, authHeaders http.Header) (int64, string, error) { - b, err := json.Marshal(apiKey{Name: name, Role: role.String()}) + b, err := json.Marshal(serviceAccount{Name: name, Role: role.String()}) if err != nil { return 0, "", errors.WithStack(err) } + var m map[string]interface{} if err = c.do(ctx, "POST", "/api/serviceaccounts", "", authHeaders, b, &m); err != nil { return 0, "", err diff --git a/managed/services/management/node.go b/managed/services/management/node.go index 90d85940ac..3e3c4f26c3 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -137,8 +137,8 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo return nil, e } - apiKeyName := fmt.Sprintf("pmm-agent-%s-%d", req.NodeName, rand.Int63()) //nolint:gosec - _, res.Token, e = s.ap.CreateServiceAccountAndToken(ctx, apiKeyName) + serviceAccountName := fmt.Sprintf("pmm-agent-%s-%d", req.NodeName, rand.Int63()) //nolint:gosec + _, res.Token, e = s.ap.CreateServiceAccountAndToken(ctx, serviceAccountName) if e != nil { return nil, e } From 979b1bed7ae7d50ad936f24fb3551ec1e5b50aa8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 4 Oct 2023 12:37:10 +0200 Subject: [PATCH 004/126] PMM-12251 Fix for http client status code, creating of service token. --- managed/services/grafana/client.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index ce03200b1e..0205acaec8 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -141,7 +141,7 @@ func (c *Client) do(ctx context.Context, method, path, rawQuery string, headers if err != nil { return errors.WithStack(err) } - if resp.StatusCode != 200 && resp.StatusCode != 202 { + if resp.StatusCode != 200 && resp.StatusCode != 201 && resp.StatusCode != 202 { cErr := &clientError{ Method: req.Method, URL: req.URL.String(), @@ -639,7 +639,8 @@ func (c *Client) createServiceAccountAndToken(ctx context.Context, name string, if err = c.do(ctx, "POST", "/api/serviceaccounts", "", authHeaders, b, &m); err != nil { return 0, "", err } - serviceAccountID := m["id"].(int64) //nolint:forcetypeassert + + serviceAccountID := int64(m["id"].(float64)) //nolint:forcetypeassert b, err = json.Marshal(serviceToken{Name: pmmServiceTokenName}) if err != nil { @@ -648,8 +649,8 @@ func (c *Client) createServiceAccountAndToken(ctx context.Context, name string, if err = c.do(ctx, "POST", fmt.Sprintf("/api/serviceaccounts/%d/tokens", serviceAccountID), "", authHeaders, b, &m); err != nil { return 0, "", err } - serviceTokenID := m["id"].(int64) //nolint:forcetypeassert - serviceTokenKey := m["key"].(string) //nolint:forcetypeassert + serviceTokenID := int64(m["id"].(float64)) //nolint:forcetypeassert + serviceTokenKey := m["key"].(string) //nolint:forcetypeassert return serviceTokenID, serviceTokenKey, nil } From 9343f12ca54d4fe08392142fc861c5701775466a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 4 Oct 2023 16:07:38 +0200 Subject: [PATCH 005/126] PMM-12251 Set orgId to 1 to avoid problem with default (-1). --- managed/services/grafana/client.go | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 0205acaec8..5284e2c2d1 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -619,8 +619,9 @@ func (c *Client) deleteAPIKey(ctx context.Context, apiKeyID int64, authHeaders h } type serviceAccount struct { - Name string `json:"name"` - Role string `json:"role"` + Name string `json:"name"` + Role string `json:"role"` + OrgID int64 `json:"orgId"` } type serviceToken struct { ID int64 `json:"id"` @@ -642,6 +643,15 @@ func (c *Client) createServiceAccountAndToken(ctx context.Context, name string, serviceAccountID := int64(m["id"].(float64)) //nolint:forcetypeassert + // orgId is ignored during creating service account and default is -1 + // orgId should be setup to 1 + if err != nil { + return 0, "", errors.WithStack(err) + } + if err = c.do(ctx, "PATCH", fmt.Sprintf("/api/serviceaccounts/%d", serviceAccountID), "", authHeaders, []byte("{\"orgId\": 1}"), &m); err != nil { + return 0, "", err + } + b, err = json.Marshal(serviceToken{Name: pmmServiceTokenName}) if err != nil { return 0, "", errors.WithStack(err) From 9a2f09c8f86a5d67f987b7b4de8527da86a88952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 5 Oct 2023 10:24:51 +0200 Subject: [PATCH 006/126] PMM-12251 Mock regen. --- .../management/mock_api_key_provider_test.go | 60 ------------ .../management/mock_auth_provider_test.go | 91 +++++++++++++++++++ managed/services/management/node_test.go | 8 +- 3 files changed, 95 insertions(+), 64 deletions(-) delete mode 100644 managed/services/management/mock_api_key_provider_test.go create mode 100644 managed/services/management/mock_auth_provider_test.go diff --git a/managed/services/management/mock_api_key_provider_test.go b/managed/services/management/mock_api_key_provider_test.go deleted file mode 100644 index 45ebeb1966..0000000000 --- a/managed/services/management/mock_api_key_provider_test.go +++ /dev/null @@ -1,60 +0,0 @@ -// Code generated by mockery v2.33.0. DO NOT EDIT. - -package management - -import ( - context "context" - - mock "github.com/stretchr/testify/mock" -) - -// mockApiKeyProvider is an autogenerated mock type for the apiKeyProvider type -type mockApiKeyProvider struct { - mock.Mock -} - -// CreateAdminAPIKey provides a mock function with given fields: ctx, name -func (_m *mockApiKeyProvider) CreateAdminAPIKey(ctx context.Context, name string) (int64, string, error) { - ret := _m.Called(ctx, name) - - var r0 int64 - var r1 string - var r2 error - if rf, ok := ret.Get(0).(func(context.Context, string) (int64, string, error)); ok { - return rf(ctx, name) - } - if rf, ok := ret.Get(0).(func(context.Context, string) int64); ok { - r0 = rf(ctx, name) - } else { - r0 = ret.Get(0).(int64) - } - - if rf, ok := ret.Get(1).(func(context.Context, string) string); ok { - r1 = rf(ctx, name) - } else { - r1 = ret.Get(1).(string) - } - - if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { - r2 = rf(ctx, name) - } else { - r2 = ret.Error(2) - } - - return r0, r1, r2 -} - -// newMockApiKeyProvider creates a new instance of mockApiKeyProvider. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. -// The first argument is typically a *testing.T value. -func newMockApiKeyProvider(t interface { - mock.TestingT - Cleanup(func()) -}, -) *mockApiKeyProvider { - mock := &mockApiKeyProvider{} - mock.Mock.Test(t) - - t.Cleanup(func() { mock.AssertExpectations(t) }) - - return mock -} diff --git a/managed/services/management/mock_auth_provider_test.go b/managed/services/management/mock_auth_provider_test.go new file mode 100644 index 0000000000..caf611163d --- /dev/null +++ b/managed/services/management/mock_auth_provider_test.go @@ -0,0 +1,91 @@ +// Code generated by mockery v2.33.0. DO NOT EDIT. + +package management + +import ( + context "context" + + mock "github.com/stretchr/testify/mock" +) + +// mockAuthProvider is an autogenerated mock type for the authProvider type +type mockAuthProvider struct { + mock.Mock +} + +// CreateAdminAPIKey provides a mock function with given fields: ctx, name +func (_m *mockAuthProvider) CreateAdminAPIKey(ctx context.Context, name string) (int64, string, error) { + ret := _m.Called(ctx, name) + + var r0 int64 + var r1 string + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string) (int64, string, error)); ok { + return rf(ctx, name) + } + if rf, ok := ret.Get(0).(func(context.Context, string) int64); ok { + r0 = rf(ctx, name) + } else { + r0 = ret.Get(0).(int64) + } + + if rf, ok := ret.Get(1).(func(context.Context, string) string); ok { + r1 = rf(ctx, name) + } else { + r1 = ret.Get(1).(string) + } + + if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { + r2 = rf(ctx, name) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// CreateServiceAccountAndToken provides a mock function with given fields: ctx, name +func (_m *mockAuthProvider) CreateServiceAccountAndToken(ctx context.Context, name string) (int64, string, error) { + ret := _m.Called(ctx, name) + + var r0 int64 + var r1 string + var r2 error + if rf, ok := ret.Get(0).(func(context.Context, string) (int64, string, error)); ok { + return rf(ctx, name) + } + if rf, ok := ret.Get(0).(func(context.Context, string) int64); ok { + r0 = rf(ctx, name) + } else { + r0 = ret.Get(0).(int64) + } + + if rf, ok := ret.Get(1).(func(context.Context, string) string); ok { + r1 = rf(ctx, name) + } else { + r1 = ret.Get(1).(string) + } + + if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { + r2 = rf(ctx, name) + } else { + r2 = ret.Error(2) + } + + return r0, r1, r2 +} + +// newMockAuthProvider creates a new instance of mockAuthProvider. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. +// The first argument is typically a *testing.T value. +func newMockAuthProvider(t interface { + mock.TestingT + Cleanup(func()) +}, +) *mockAuthProvider { + mock := &mockAuthProvider{} + mock.Mock.Test(t) + + t.Cleanup(func() { mock.AssertExpectations(t) }) + + return mock +} diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index 8f6bcf9f14..6f37989316 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -53,10 +53,10 @@ func TestNodeService(t *testing.T) { require.NoError(t, sqlDB.Close()) } - var apiKeyProvider mockApiKeyProvider - apiKeyProvider.Test(t) - apiKeyProvider.On("CreateAdminAPIKey", ctx, mock.AnythingOfType("string")).Return(int64(0), "test-token", nil) - s = NewNodeService(db, &apiKeyProvider) + var authProvider mockAuthProvider + authProvider.Test(t) + authProvider.On("CreateServiceAccountAndToken", ctx, mock.AnythingOfType("string")).Return(int64(0), "test-token", nil) + s = NewNodeService(db, &authProvider) return } From 5d467fed7a5c3c925d907114cfd83639a3335254 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 5 Oct 2023 11:52:20 +0200 Subject: [PATCH 007/126] PMM-12251 Setup, tokens. --- agent/commands/setup.go | 7 ++++++- managed/services/grafana/client.go | 27 +++++++++++++++++++++++---- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/agent/commands/setup.go b/agent/commands/setup.go index 16db5e6fa5..4e8730b69b 100644 --- a/agent/commands/setup.go +++ b/agent/commands/setup.go @@ -19,6 +19,7 @@ import ( "fmt" "net/http" "os" + "strings" "time" "github.com/pkg/errors" @@ -160,7 +161,11 @@ func register(cfg *config.Config, l *logrus.Entry) { } cfg.ID = agentID if token != "" { - cfg.Server.Username = "api_key" + if strings.HasPrefix(token, "glsa_") { + cfg.Server.Username = "service_token" + } else { + cfg.Server.Username = "api_key" + } cfg.Server.Password = token } else { l.Info("PMM Server responded with an empty api key token. Consider upgrading PMM Server to the latest version.") diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 5284e2c2d1..6dcfba81b9 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -25,6 +25,7 @@ import ( "encoding/json" "fmt" "io" + "math/rand" "net" "net/http" "net/url" @@ -652,12 +653,19 @@ func (c *Client) createServiceAccountAndToken(ctx context.Context, name string, return 0, "", err } - b, err = json.Marshal(serviceToken{Name: pmmServiceTokenName}) + // due to reregister of node PMM agent related tokens should be deleted first + err = c.deletePMMAgentRelatedServiceTokens(ctx, serviceAccountID, authHeaders) + if err != nil { + return 0, "", errors.WithStack(err) + } + + serviceTokenName := fmt.Sprintf("%s-%s-%d", pmmServiceTokenName, name, rand.Int63()) + b, err = json.Marshal(serviceToken{Name: serviceTokenName}) if err != nil { return 0, "", errors.WithStack(err) } if err = c.do(ctx, "POST", fmt.Sprintf("/api/serviceaccounts/%d/tokens", serviceAccountID), "", authHeaders, b, &m); err != nil { - return 0, "", err + return 0, "", errors.WithStack(err) } serviceTokenID := int64(m["id"].(float64)) //nolint:forcetypeassert serviceTokenKey := m["key"].(string) //nolint:forcetypeassert @@ -665,8 +673,19 @@ func (c *Client) createServiceAccountAndToken(ctx context.Context, name string, return serviceTokenID, serviceTokenKey, nil } -func (c *Client) deleteServiceAccount(ctx context.Context, serviceAccountID, serviceTokenID int64, authHeaders http.Header) error { - return c.do(ctx, "DELETE", fmt.Sprintf("/api/serviceaccounts/%d/tokens/%d", serviceAccountID, serviceTokenID), "", authHeaders, nil, nil) +func (c *Client) deletePMMAgentRelatedServiceTokens(ctx context.Context, serviceAccountID int64, authHeaders http.Header) error { + var tokens []serviceToken + if err := c.do(ctx, "GET", fmt.Sprintf("/api/serviceaccounts/%d/tokens", serviceAccountID), "", authHeaders, nil, &tokens); err != nil { + return err + } + + for _, token := range tokens { + if strings.HasPrefix(token.Name, pmmServiceTokenName) { + c.do(ctx, "DELETE", fmt.Sprintf("/api/serviceaccounts/%d/tokens/%d", serviceAccountID, token.ID), "", authHeaders, nil, nil) + } + } + + return nil } // Annotation contains grafana annotation response. From b18c2d5a150ee5880ecc6b95ca910422245c566d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 5 Oct 2023 15:10:03 +0200 Subject: [PATCH 008/126] PMM-12251 Basic/Bearer auth. --- agent/client/client.go | 17 ++++++++---- agent/client/service_token_auth.go | 44 ++++++++++++++++++++++++++++++ go.mod | 2 ++ go.sum | 5 ++++ 4 files changed, 63 insertions(+), 5 deletions(-) create mode 100644 agent/client/service_token_auth.go diff --git a/agent/client/client.go b/agent/client/client.go index 5e8811d9ee..d96b7675ac 100644 --- a/agent/client/client.go +++ b/agent/client/client.go @@ -742,11 +742,18 @@ func dial(dialCtx context.Context, cfg *config.Config, l *logrus.Entry) (*dialRe opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))) } - if cfg.Server.Username != "" { - opts = append(opts, grpc.WithPerRPCCredentials(&basicAuth{ - username: cfg.Server.Username, - password: cfg.Server.Password, - })) + username := cfg.Server.Username + if username != "" { + if username == "api_key" || username == "service_token" { + opts = append(opts, grpc.WithPerRPCCredentials(&tokenAuth{ + token: cfg.Server.Password, + })) + } else { + opts = append(opts, grpc.WithPerRPCCredentials(&basicAuth{ + username: username, + password: cfg.Server.Password, + })) + } } l.Infof("Connecting to %s ...", cfg.Server.FilteredURL()) diff --git a/agent/client/service_token_auth.go b/agent/client/service_token_auth.go new file mode 100644 index 0000000000..5ac7ce65f8 --- /dev/null +++ b/agent/client/service_token_auth.go @@ -0,0 +1,44 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package client + +import ( + "context" + "encoding/base64" + + "google.golang.org/grpc/credentials" +) + +type tokenAuth struct { + token string +} + +// GetRequestMetadata implements credentials.PerRPCCredentials interface. +func (s *tokenAuth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { + enc := base64.StdEncoding.EncodeToString([]byte(s.token)) + return map[string]string{ + "Authorization": "Bearer " + enc, + }, nil +} + +// RequireTransportSecurity implements credentials.PerRPCCredentials interface. +func (s *tokenAuth) RequireTransportSecurity() bool { + return false +} + +// check interfaces. +var ( + _ credentials.PerRPCCredentials = (*tokenAuth)(nil) +) diff --git a/go.mod b/go.mod index 6b8519ff9f..9d6a2faacf 100644 --- a/go.mod +++ b/go.mod @@ -97,6 +97,8 @@ require ( ) require ( + cloud.google.com/go/compute v1.23.0 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect github.com/Azure/azure-pipeline-go v0.2.3 // indirect github.com/Azure/azure-storage-blob-go v0.14.0 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect diff --git a/go.sum b/go.sum index 0856e749d4..6af1c8f350 100644 --- a/go.sum +++ b/go.sum @@ -13,12 +13,17 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.110.6 h1:8uYAkj3YHTP/1iwReuHPxLSbdcyc+dSBbzFMrVwDR6Q= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= From 9deca51bacdaf607562bf361866ec8eba49e243e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Sat, 7 Oct 2023 09:47:53 +0200 Subject: [PATCH 009/126] PMM-12251 Set transport, check token/basic. --- admin/commands/base/setup.go | 7 +++- agent/commands/clients.go | 7 +++- managed/services/grafana/client.go | 54 +++++++++++++++++------------- 3 files changed, 43 insertions(+), 25 deletions(-) diff --git a/admin/commands/base/setup.go b/admin/commands/base/setup.go index a7dc9a472f..030030f755 100644 --- a/admin/commands/base/setup.go +++ b/admin/commands/base/setup.go @@ -88,8 +88,13 @@ func SetupClients(ctx context.Context, globalFlags *flags.GlobalFlags) { // use JSON APIs over HTTP/1.1 transport := httptransport.New(globalFlags.ServerURL.Host, globalFlags.ServerURL.Path, []string{globalFlags.ServerURL.Scheme}) if u := globalFlags.ServerURL.User; u != nil { + user := u.Username() password, _ := u.Password() - transport.DefaultAuthentication = httptransport.BasicAuth(u.Username(), password) + if user == "service_token" || user == "api_key" { + transport.DefaultAuthentication = httptransport.BearerToken(password) + } else { + transport.DefaultAuthentication = httptransport.BasicAuth(user, password) + } } transport.SetLogger(logrus.WithField("component", "server-transport")) transport.SetDebug(globalFlags.EnableDebug || globalFlags.EnableTrace) diff --git a/agent/commands/clients.go b/agent/commands/clients.go index a1552c7a5f..80c51a7c92 100644 --- a/agent/commands/clients.go +++ b/agent/commands/clients.go @@ -104,8 +104,13 @@ func setServerTransport(u *url.URL, insecureTLS bool, l *logrus.Entry) { // use JSON APIs over HTTP/1.1 transport := httptransport.New(u.Host, u.Path, []string{u.Scheme}) if u.User != nil { + user := u.User.Username() password, _ := u.User.Password() - transport.DefaultAuthentication = httptransport.BasicAuth(u.User.Username(), password) + if user == "service_token" || user == "api_key" { + transport.DefaultAuthentication = httptransport.BearerToken(password) + } else { + transport.DefaultAuthentication = httptransport.BasicAuth(user, password) + } } transport.SetLogger(l) transport.SetDebug(l.Logger.GetLevel() >= logrus.DebugLevel) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 6dcfba81b9..d3d67e162b 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -223,26 +223,12 @@ func (c *Client) GetUserID(ctx context.Context) (int, error) { // Ctx is used only for cancelation. func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (authUser, error) { // Check if it's API Key or Service Token - auth := authHeaders.Get("Authorization") - if c.isBearerTokenAuth(auth) { - h := strings.TrimPrefix(auth, "Basic ") - d, err := base64.StdEncoding.DecodeString(strings.TrimSpace(h)) - if err != nil { - return authUser{}, err - } - if strings.HasPrefix(string(d), "api_key") { - role, err := c.getRoleForAPIKey(ctx, authHeaders) - return authUser{ - role: role, - userID: 0, - }, err - } - - role, err := c.getRoleForServiceToken(ctx, authHeaders) + role, authorized := c.proceedTokenAuth(ctx, authHeaders) + if authorized { return authUser{ role: role, userID: 0, - }, err + }, nil } // https://grafana.com/docs/http_api/user/#actual-user - works only with Basic Auth @@ -295,19 +281,40 @@ func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (auth }, nil } -func (c *Client) isBearerTokenAuth(authHeader string) bool { +func (c *Client) proceedTokenAuth(ctx context.Context, authHeaders http.Header) (role, bool) { + authHeader := authHeaders.Get("Authorization") + token := "" switch { case strings.HasPrefix(authHeader, "Bearer"): - return true + token = strings.TrimSpace(strings.TrimPrefix(authHeader, "Bearer")) case strings.HasPrefix(authHeader, "Basic"): h := strings.TrimPrefix(authHeader, "Basic") - d, err := base64.StdEncoding.DecodeString(strings.TrimSpace(h)) + t, err := base64.StdEncoding.DecodeString(strings.TrimSpace(h)) + if err != nil { + return none, false + } + tk := string(t) + if strings.HasPrefix(tk, "api_key:") || strings.HasPrefix(tk, "service_token:") { + token = strings.Split(tk, ":")[1] + break + } + + return none, false + } + + if strings.HasPrefix(string(token), "glsa_") { + role, err := c.getRoleForServiceToken(ctx, authHeaders) if err != nil { - return false + return none, false } - return strings.HasPrefix(string(d), "api_key:") || strings.HasPrefix(string(d), "service_token:") + return role, true + } + + role, err := c.getRoleForAPIKey(ctx, authHeaders) + if err != nil { + return none, false } - return false + return role, true } func (c *Client) convertRole(role string) role { @@ -347,6 +354,7 @@ func (c *Client) getRoleForAPIKey(ctx context.Context, authHeaders http.Header) func (c *Client) getRoleForServiceToken(ctx context.Context, authHeaders http.Header) (role, error) { var k map[string]interface{} + fmt.Println(authHeaders) if err := c.do(ctx, http.MethodGet, "/api/auth/serviceaccount", "", authHeaders, nil, &k); err != nil { return none, err } From a8a86e317f637a4f9a122b414db398554c79b2f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Sat, 7 Oct 2023 09:56:31 +0200 Subject: [PATCH 010/126] PMM-12251 Tidy. --- go.mod | 2 -- go.sum | 5 ----- 2 files changed, 7 deletions(-) diff --git a/go.mod b/go.mod index c7da875772..5eb96f5051 100644 --- a/go.mod +++ b/go.mod @@ -97,8 +97,6 @@ require ( ) require ( - cloud.google.com/go/compute v1.23.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect github.com/Azure/azure-pipeline-go v0.2.3 // indirect github.com/Azure/azure-storage-blob-go v0.14.0 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect diff --git a/go.sum b/go.sum index 4e32b8aef1..de467d80f9 100644 --- a/go.sum +++ b/go.sum @@ -13,17 +13,12 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.110.6 h1:8uYAkj3YHTP/1iwReuHPxLSbdcyc+dSBbzFMrVwDR6Q= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= From f3f21b007166eb7a02c24c1e936c284c0ac40c81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 9 Oct 2023 11:14:54 +0200 Subject: [PATCH 011/126] PMM-12251 Lint, small changes. --- agent/client/basic_auth.go | 2 +- managed/services/grafana/client.go | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/agent/client/basic_auth.go b/agent/client/basic_auth.go index 5055250fc9..ae822e264b 100644 --- a/agent/client/basic_auth.go +++ b/agent/client/basic_auth.go @@ -31,7 +31,7 @@ func (b *basicAuth) GetRequestMetadata(ctx context.Context, uri ...string) (map[ auth := b.username + ":" + b.password enc := base64.StdEncoding.EncodeToString([]byte(auth)) return map[string]string{ - "authorization": "Basic " + enc, + "Authorization": "Basic " + enc, }, nil } diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index d3d67e162b..a3d5b2883d 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -302,7 +302,7 @@ func (c *Client) proceedTokenAuth(ctx context.Context, authHeaders http.Header) return none, false } - if strings.HasPrefix(string(token), "glsa_") { + if strings.HasPrefix(token, "glsa_") { role, err := c.getRoleForServiceToken(ctx, authHeaders) if err != nil { return none, false @@ -354,7 +354,6 @@ func (c *Client) getRoleForAPIKey(ctx context.Context, authHeaders http.Header) func (c *Client) getRoleForServiceToken(ctx context.Context, authHeaders http.Header) (role, error) { var k map[string]interface{} - fmt.Println(authHeaders) if err := c.do(ctx, http.MethodGet, "/api/auth/serviceaccount", "", authHeaders, nil, &k); err != nil { return none, err } From 9245d443f8be78051275d905564e64d5d831a38a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 9 Oct 2023 15:40:37 +0200 Subject: [PATCH 012/126] PMM-12251 Add test, logic changes. --- managed/services/grafana/client.go | 67 ++++++------- managed/services/grafana/client_test.go | 122 +++++++++++++++--------- 2 files changed, 110 insertions(+), 79 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index a3d5b2883d..3930d12339 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -218,13 +218,33 @@ func (c *Client) GetUserID(ctx context.Context) (int, error) { return int(userID), nil } +var emptyUser = authUser{ + role: none, + userID: 0, +} + // getAuthUser returns grafanaAdmin if currently authenticated user is a Grafana (super) admin. // Otherwise, it returns a role in the default organization (with ID 1). // Ctx is used only for cancelation. func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (authUser, error) { - // Check if it's API Key or Service Token - role, authorized := c.proceedTokenAuth(ctx, authHeaders) - if authorized { + // Check if API Key or Service Token is authorized. + token := c.getTokenAuth(ctx, authHeaders) + if token != "" { + if strings.HasPrefix(token, "glsa_") { + role, err := c.getRoleForServiceToken(ctx, authHeaders) + if err != nil { + return emptyUser, err + } + return authUser{ + role: role, + userID: 0, + }, nil + } + + role, err := c.getRoleForAPIKey(ctx, authHeaders) + if err != nil { + return emptyUser, err + } return authUser{ role: role, userID: 0, @@ -235,10 +255,7 @@ func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (auth var m map[string]interface{} err := c.do(ctx, http.MethodGet, "/api/user", "", authHeaders, nil, &m) if err != nil { - return authUser{ - role: none, - userID: 0, - }, err + return emptyUser, err } id, _ := m["id"].(float64) @@ -281,40 +298,25 @@ func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (auth }, nil } -func (c *Client) proceedTokenAuth(ctx context.Context, authHeaders http.Header) (role, bool) { +func (c *Client) getTokenAuth(ctx context.Context, authHeaders http.Header) string { authHeader := authHeaders.Get("Authorization") - token := "" switch { case strings.HasPrefix(authHeader, "Bearer"): - token = strings.TrimSpace(strings.TrimPrefix(authHeader, "Bearer")) + return strings.TrimSpace(strings.TrimPrefix(authHeader, "Bearer")) case strings.HasPrefix(authHeader, "Basic"): h := strings.TrimPrefix(authHeader, "Basic") t, err := base64.StdEncoding.DecodeString(strings.TrimSpace(h)) if err != nil { - return none, false + return "" } tk := string(t) if strings.HasPrefix(tk, "api_key:") || strings.HasPrefix(tk, "service_token:") { - token = strings.Split(tk, ":")[1] - break + return strings.Split(tk, ":")[1] } - return none, false } - if strings.HasPrefix(token, "glsa_") { - role, err := c.getRoleForServiceToken(ctx, authHeaders) - if err != nil { - return none, false - } - return role, true - } - - role, err := c.getRoleForAPIKey(ctx, authHeaders) - if err != nil { - return none, false - } - return role, true + return "" } func (c *Client) convertRole(role string) role { @@ -653,9 +655,6 @@ func (c *Client) createServiceAccountAndToken(ctx context.Context, name string, // orgId is ignored during creating service account and default is -1 // orgId should be setup to 1 - if err != nil { - return 0, "", errors.WithStack(err) - } if err = c.do(ctx, "PATCH", fmt.Sprintf("/api/serviceaccounts/%d", serviceAccountID), "", authHeaders, []byte("{\"orgId\": 1}"), &m); err != nil { return 0, "", err } @@ -663,7 +662,7 @@ func (c *Client) createServiceAccountAndToken(ctx context.Context, name string, // due to reregister of node PMM agent related tokens should be deleted first err = c.deletePMMAgentRelatedServiceTokens(ctx, serviceAccountID, authHeaders) if err != nil { - return 0, "", errors.WithStack(err) + return 0, "", err } serviceTokenName := fmt.Sprintf("%s-%s-%d", pmmServiceTokenName, name, rand.Int63()) @@ -672,7 +671,7 @@ func (c *Client) createServiceAccountAndToken(ctx context.Context, name string, return 0, "", errors.WithStack(err) } if err = c.do(ctx, "POST", fmt.Sprintf("/api/serviceaccounts/%d/tokens", serviceAccountID), "", authHeaders, b, &m); err != nil { - return 0, "", errors.WithStack(err) + return 0, "", err } serviceTokenID := int64(m["id"].(float64)) //nolint:forcetypeassert serviceTokenKey := m["key"].(string) //nolint:forcetypeassert @@ -688,7 +687,9 @@ func (c *Client) deletePMMAgentRelatedServiceTokens(ctx context.Context, service for _, token := range tokens { if strings.HasPrefix(token.Name, pmmServiceTokenName) { - c.do(ctx, "DELETE", fmt.Sprintf("/api/serviceaccounts/%d/tokens/%d", serviceAccountID, token.ID), "", authHeaders, nil, nil) + if err := c.do(ctx, "DELETE", fmt.Sprintf("/api/serviceaccounts/%d/tokens/%d", serviceAccountID, token.ID), "", authHeaders, nil, nil); err != nil { + return err + } } } diff --git a/managed/services/grafana/client_test.go b/managed/services/grafana/client_test.go index 75b4e5376f..94c626314e 100644 --- a/managed/services/grafana/client_test.go +++ b/managed/services/grafana/client_test.go @@ -103,57 +103,87 @@ func TestClient(t *testing.T) { for _, role := range []role{viewer, editor, admin} { role := role - t.Run(fmt.Sprintf("Basic auth %s", role.String()), func(t *testing.T) { + // t.Run(fmt.Sprintf("Basic auth %s", role.String()), func(t *testing.T) { + // // do not run this test in parallel - they lock Grafana's sqlite3 database + // // t.Parallel() + + // login := fmt.Sprintf("basic-%s-%d", role, time.Now().Nanosecond()) + // userID, err := c.testCreateUser(ctx, login, role, authHeaders) + // require.NoError(t, err) + // require.NotZero(t, userID) + // if err != nil { + // defer func() { + // err = c.testDeleteUser(ctx, userID, authHeaders) + // require.NoError(t, err) + // }() + // } + + // req, err := http.NewRequestWithContext(ctx, http.MethodGet, "/dummy", nil) + // require.NoError(t, err) + // req.SetBasicAuth(login, login) + // userAuthHeaders := req.Header + + // u, err := c.getAuthUsyer(ctx, userAuthHeaders) + // actualRole := u.role + // assert.NoError(t, err) + // assert.Equal(t, role, actualRole) + // assert.Equal(t, role.String(), actualRole.String()) + // }) + + // t.Run(fmt.Sprintf("API Key auth %s", role.String()), func(t *testing.T) { + // // do not run this test in parallel - they lock Grafana's sqlite3 database + // // t.Parallel() + + // login := fmt.Sprintf("api-%s-%d", role, time.Now().Nanosecond()) + // apiKeyID, apiKey, err := c.createAPIKey(ctx, login, role, authHeaders) + // require.NoError(t, err) + // require.NotZero(t, apiKeyID) + // require.NotEmpty(t, apiKey) + // if err != nil { + // defer func() { + // err = c.deleteAPIKey(ctx, apiKeyID, authHeaders) + // require.NoError(t, err) + // }() + // } + + // apiKeyAuthHeaders := http.Header{} + // apiKeyAuthHeaders.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey)) + + // u, err := c.getAuthUser(ctx, apiKeyAuthHeaders) + // actualRole := u.role + // assert.NoError(t, err) + // assert.Equal(t, role, actualRole) + // assert.Equal(t, role.String(), actualRole.String()) + // }) + + t.Run(fmt.Sprintf("Service token auth %s", role.String()), func(t *testing.T) { // do not run this test in parallel - they lock Grafana's sqlite3 database // t.Parallel() - login := fmt.Sprintf("basic-%s-%d", role, time.Now().Nanosecond()) - userID, err := c.testCreateUser(ctx, login, role, authHeaders) + login := fmt.Sprintf("servicetoken-%s-%d", role, time.Now().Nanosecond()) + serviceTokenID, serviceToken, err := c.createServiceAccountAndToken(ctx, login, role, authHeaders) require.NoError(t, err) - require.NotZero(t, userID) - if err != nil { - defer func() { - err = c.testDeleteUser(ctx, userID, authHeaders) - require.NoError(t, err) - }() + require.NotZero(t, serviceTokenID) + require.NotEmpty(t, serviceToken) + // if err != nil { + // defer func() { + // err = c.deleteAPIKey(ctx, apiKeyID, authHeaders) + // require.NoError(t, err) + // }() + // } + + serviceTokenAuthHeaders := http.Header{} + serviceTokenAuthHeaders.Set("Authorization", fmt.Sprintf("Bearer %s", serviceToken)) + u, err := c.getAuthUser(ctx, serviceTokenAuthHeaders) + switch role { + case admin: + assert.NoError(t, err) + actualRole := u.role + assert.Equal(t, role, actualRole) + assert.Equal(t, role.String(), actualRole.String()) + case viewer, editor: + require.ErrorContains(t, err, "Permissions needed: serviceaccounts:read") } - - req, err := http.NewRequestWithContext(ctx, http.MethodGet, "/dummy", nil) - require.NoError(t, err) - req.SetBasicAuth(login, login) - userAuthHeaders := req.Header - - u, err := c.getAuthUser(ctx, userAuthHeaders) - actualRole := u.role - assert.NoError(t, err) - assert.Equal(t, role, actualRole) - assert.Equal(t, role.String(), actualRole.String()) - }) - - t.Run(fmt.Sprintf("API Key auth %s", role.String()), func(t *testing.T) { - // do not run this test in parallel - they lock Grafana's sqlite3 database - // t.Parallel() - - login := fmt.Sprintf("api-%s-%d", role, time.Now().Nanosecond()) - apiKeyID, apiKey, err := c.createAPIKey(ctx, login, role, authHeaders) - require.NoError(t, err) - require.NotZero(t, apiKeyID) - require.NotEmpty(t, apiKey) - if err != nil { - defer func() { - err = c.deleteAPIKey(ctx, apiKeyID, authHeaders) - require.NoError(t, err) - }() - } - - apiKeyAuthHeaders := http.Header{} - apiKeyAuthHeaders.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey)) - - u, err := c.getAuthUser(ctx, apiKeyAuthHeaders) - actualRole := u.role - assert.NoError(t, err) - assert.Equal(t, role, actualRole) - assert.Equal(t, role.String(), actualRole.String()) }) } }) From c3999d16e69f70bf99f21556975a58701e8a5b92 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 10 Oct 2023 08:37:26 +0200 Subject: [PATCH 013/126] PMM-12251 Test, tokens funcs. --- go.sum | 28 ----- managed/services/grafana/client.go | 80 ++++++++++---- managed/services/grafana/client_test.go | 140 ++++++++++++------------ 3 files changed, 128 insertions(+), 120 deletions(-) diff --git a/go.sum b/go.sum index de467d80f9..616a63813e 100644 --- a/go.sum +++ b/go.sum @@ -49,14 +49,12 @@ github.com/Azure/azure-storage-blob-go v0.13.0/go.mod h1:pA9kNqtjUeQF2zOSu4s//nU github.com/Azure/azure-storage-blob-go v0.14.0 h1:1BCg74AmVdYwO3dlKwtFU1V0wU2PZdREkXvAmZJRUlM= github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.28 h1:ndAExarwr5Y+GaHE6VCaY1kyS/HwwGGyuimVhWsHOEM= github.com/Azure/go-autorest/autorest/adal v0.9.2/go.mod h1:/3SMAM86bP6wC9Ev35peQDUeqFZBMH07vvUOmg4z/fE= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/adal v0.9.21 h1:jjQnVFXPfekaqb8vIsv2G1lxshoW+oGv4MDlhRtnYZk= -github.com/Azure/go-autorest/autorest/adal v0.9.21/go.mod h1:zua7mBUaCc5YnSLKYgGJR/w5ePdMDA6H56upLsHzA9U= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= @@ -93,12 +91,10 @@ github.com/Percona-Lab/spec v0.20.5-percona/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5i github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/assert/v2 v2.1.0 h1:tbredtNcQnoSd3QBhQWI7QZ3XHOVkw1Moklp2ojoH/0= -github.com/alecthomas/assert/v2 v2.1.0/go.mod h1:b/+1DI2Q6NckYi+3mXyH3wFb8qG37K/DuK80n7WefXA= github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= github.com/alecthomas/kong v0.8.0 h1:ryDCzutfIqJPnNn0omnrgHLbAggDQM2VWHikE1xqK7s= github.com/alecthomas/kong v0.8.0/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U= github.com/alecthomas/repr v0.1.0 h1:ENn2e1+J3k09gyj2shc0dHr/yjaWSHRlrJ4DPMevDqE= -github.com/alecthomas/repr v0.1.0/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -180,9 +176,7 @@ github.com/denisenkom/go-mssqldb v0.9.0 h1:RSohk2RsiZqLZ0zCjtfn3S4Gp4exhpBWHyQ7D github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dhui/dktest v0.3.16 h1:i6gq2YQEtcrjKbeJpBkWjE8MmLZPYllcjOFbTZuPDnw= -github.com/dhui/dktest v0.3.16/go.mod h1:gYaA3LRmM8Z4vJl2MA0THIigJoZrwOansEOsp+kqxp0= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= @@ -213,7 +207,6 @@ github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/ github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.5.0/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/go-co-op/gocron v1.31.0 h1:8VaWk7ARDpsVYFP8SmjvHrBZQkcPQ7HyAzF7acG57yE= github.com/go-co-op/gocron v1.31.0/go.mod h1:39f6KNSGVOU1LO/ZOoZfcSxwlsJDQOKSu8erN0SH48Y= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= @@ -245,7 +238,6 @@ github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= github.com/go-openapi/analysis v0.21.4 h1:ZDFLvSNxpDaomuCueM0BlSXxpANBlFYiBvr+GXrvIHc= github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo= @@ -285,7 +277,6 @@ github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrt github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gobs/pretty v0.0.0-20180724170744-09732c25a95b h1:/vQ+oYKu+JoyaMPDsv5FzwuL2wwWBgBbtj/YLCi4LuA= github.com/gobs/pretty v0.0.0-20180724170744-09732c25a95b/go.mod h1:Xo4aNUOrJnVruqWQJBtW6+bTBDTniY8yZum5rF3b5jw= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= @@ -329,7 +320,6 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2V github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -343,7 +333,6 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -396,7 +385,6 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -447,7 +435,6 @@ github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyf github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= @@ -508,7 +495,6 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -548,7 +534,6 @@ github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOq github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -574,7 +559,6 @@ github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -589,7 +573,6 @@ github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJ github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b h1:1XF24mVaiu7u+CFywTdcDo2ie1pzzhwjt6RHqzpMU34= github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= @@ -613,9 +596,7 @@ github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= -github.com/onsi/ginkgo/v2 v2.9.4/go.mod h1:gCQYp2Q+kSoIj7ykSVb9nskRSsR6PUj4AiLywzIhbKM= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -725,7 +706,6 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -812,7 +792,6 @@ go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeH go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY= -go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM= go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= go.starlark.net v0.0.0-20230717150657-8a3343210976 h1:7ljYNcZU84T2N0tZdDgvL7U3M4iFmglAUUU1gRFE/2Q= @@ -824,10 +803,8 @@ go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0 go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1079,7 +1056,6 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2 h1:CCXrcPKiGGotvnN6jfUsKk4rRqm7q09/YbKb5xCEvtM= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= @@ -1237,9 +1213,7 @@ modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/libc v1.24.1 h1:uvJSeCKL/AgzBo2yYIPPTy82v21KgGnizcGYfBHaNuM= modernc.org/libc v1.24.1/go.mod h1:FmfO1RLrU3MHJfyi9eYYmZBfi/R+tqZ6+hQ3yQQUkak= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= @@ -1253,11 +1227,9 @@ modernc.org/sqlite v1.26.0/go.mod h1:FL3pVXie73rg3Rii6V/u5BoHlSoyeZeIgKZEgHARyCU modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= -modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c= modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= -modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 3930d12339..6671501f40 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -228,7 +228,7 @@ var emptyUser = authUser{ // Ctx is used only for cancelation. func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (authUser, error) { // Check if API Key or Service Token is authorized. - token := c.getTokenAuth(ctx, authHeaders) + token := c.getTokenAuth(authHeaders) if token != "" { if strings.HasPrefix(token, "glsa_") { role, err := c.getRoleForServiceToken(ctx, authHeaders) @@ -298,7 +298,7 @@ func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (auth }, nil } -func (c *Client) getTokenAuth(ctx context.Context, authHeaders http.Header) string { +func (c *Client) getTokenAuth(authHeaders http.Header) string { authHeader := authHeaders.Get("Authorization") switch { case strings.HasPrefix(authHeader, "Bearer"): @@ -313,7 +313,6 @@ func (c *Client) getTokenAuth(ctx context.Context, authHeaders http.Header) stri if strings.HasPrefix(tk, "api_key:") || strings.HasPrefix(tk, "service_token:") { return strings.Split(tk, ":")[1] } - } return "" @@ -417,15 +416,6 @@ func (c *Client) CreateAdminAPIKey(ctx context.Context, name string) (int64, str return c.createAPIKey(ctx, name, admin, authHeaders) } -// CreateServiceAccountAndToken creates service account and token with Admin role and provided name. -func (c *Client) CreateServiceAccountAndToken(ctx context.Context, name string) (int64, string, error) { - authHeaders, err := c.authHeadersFromContext(ctx) - if err != nil { - return 0, "", err - } - return c.createServiceAccountAndToken(ctx, name, admin, authHeaders) -} - // DeleteAPIKeysWithPrefix deletes all API keys with provided prefix. If there is no api key with provided prefix just ignores it. func (c *Client) DeleteAPIKeysWithPrefix(ctx context.Context, prefix string) error { authHeaders, err := c.authHeadersFromContext(ctx) @@ -458,6 +448,45 @@ func (c *Client) DeleteAPIKeyByID(ctx context.Context, id int64) error { return c.deleteAPIKey(ctx, id, authHeaders) } +// CreateServiceAccount creates service account with Admin role. +func (c *Client) CreateServiceAccount(ctx context.Context) (int64, error) { + authHeaders, err := c.authHeadersFromContext(ctx) + if err != nil { + return 0, err + } + + serviceAccountID, err := c.createServiceAccount(ctx, admin, authHeaders) + if err != nil { + return 0, err + } + + return serviceAccountID, nil +} + +// CreateServiceToken creates service token for provided service account. +func (c *Client) CreateServiceToken(ctx context.Context, serviceAccountID int64) (int64, string, error) { + authHeaders, err := c.authHeadersFromContext(ctx) + if err != nil { + return 0, "", err + } + + serviceTokenID, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, authHeaders) + if err != nil { + return 0, "", err + } + + return serviceTokenID, serviceToken, nil +} + +// DeleteServiceAccount deletes service account by ID. +func (c *Client) DeleteServiceAccount(ctx context.Context, id int64) error { + authHeaders, err := c.authHeadersFromContext(ctx) + if err != nil { + return err + } + return c.deleteAPIKey(ctx, id, authHeaders) +} + // CreateAlertRule creates Grafana alert rule. func (c *Client) CreateAlertRule(ctx context.Context, folderName, groupName string, rule *services.Rule) error { authHeaders, err := c.authHeadersFromContext(ctx) @@ -640,15 +669,16 @@ type serviceToken struct { Expiration *time.Time `json:"expiration,omitempty"` } -func (c *Client) createServiceAccountAndToken(ctx context.Context, name string, role role, authHeaders http.Header) (int64, string, error) { +func (c *Client) createServiceAccount(ctx context.Context, role role, authHeaders http.Header) (int64, error) { + name := fmt.Sprintf("serviceaccount-%s-%d", role, time.Now().Nanosecond()) b, err := json.Marshal(serviceAccount{Name: name, Role: role.String()}) if err != nil { - return 0, "", errors.WithStack(err) + return 0, errors.WithStack(err) } var m map[string]interface{} if err = c.do(ctx, "POST", "/api/serviceaccounts", "", authHeaders, b, &m); err != nil { - return 0, "", err + return 0, err } serviceAccountID := int64(m["id"].(float64)) //nolint:forcetypeassert @@ -656,20 +686,20 @@ func (c *Client) createServiceAccountAndToken(ctx context.Context, name string, // orgId is ignored during creating service account and default is -1 // orgId should be setup to 1 if err = c.do(ctx, "PATCH", fmt.Sprintf("/api/serviceaccounts/%d", serviceAccountID), "", authHeaders, []byte("{\"orgId\": 1}"), &m); err != nil { - return 0, "", err + return 0, err } - // due to reregister of node PMM agent related tokens should be deleted first - err = c.deletePMMAgentRelatedServiceTokens(ctx, serviceAccountID, authHeaders) - if err != nil { - return 0, "", err - } + return serviceAccountID, nil +} - serviceTokenName := fmt.Sprintf("%s-%s-%d", pmmServiceTokenName, name, rand.Int63()) - b, err = json.Marshal(serviceToken{Name: serviceTokenName}) +func (c *Client) createServiceToken(ctx context.Context, serviceAccountID int64, authHeaders http.Header) (int64, string, error) { + serviceTokenName := fmt.Sprintf("%s-%d", pmmServiceTokenName, rand.Int63()) + b, err := json.Marshal(serviceToken{Name: serviceTokenName}) if err != nil { return 0, "", errors.WithStack(err) } + + var m map[string]interface{} if err = c.do(ctx, "POST", fmt.Sprintf("/api/serviceaccounts/%d/tokens", serviceAccountID), "", authHeaders, b, &m); err != nil { return 0, "", err } @@ -696,6 +726,10 @@ func (c *Client) deletePMMAgentRelatedServiceTokens(ctx context.Context, service return nil } +func (c *Client) deleteServiceAccount(ctx context.Context, serviceAccountID int64, authHeaders http.Header) error { + return c.do(ctx, "DELETE", fmt.Sprintf("/api/serviceaccounts/%d", serviceAccountID), "", authHeaders, nil, nil) +} + // Annotation contains grafana annotation response. type annotation struct { Time time.Time `json:"-"` diff --git a/managed/services/grafana/client_test.go b/managed/services/grafana/client_test.go index 94c626314e..1a386fc7fe 100644 --- a/managed/services/grafana/client_test.go +++ b/managed/services/grafana/client_test.go @@ -103,87 +103,89 @@ func TestClient(t *testing.T) { for _, role := range []role{viewer, editor, admin} { role := role - // t.Run(fmt.Sprintf("Basic auth %s", role.String()), func(t *testing.T) { - // // do not run this test in parallel - they lock Grafana's sqlite3 database - // // t.Parallel() - - // login := fmt.Sprintf("basic-%s-%d", role, time.Now().Nanosecond()) - // userID, err := c.testCreateUser(ctx, login, role, authHeaders) - // require.NoError(t, err) - // require.NotZero(t, userID) - // if err != nil { - // defer func() { - // err = c.testDeleteUser(ctx, userID, authHeaders) - // require.NoError(t, err) - // }() - // } - - // req, err := http.NewRequestWithContext(ctx, http.MethodGet, "/dummy", nil) - // require.NoError(t, err) - // req.SetBasicAuth(login, login) - // userAuthHeaders := req.Header - - // u, err := c.getAuthUsyer(ctx, userAuthHeaders) - // actualRole := u.role - // assert.NoError(t, err) - // assert.Equal(t, role, actualRole) - // assert.Equal(t, role.String(), actualRole.String()) - // }) - - // t.Run(fmt.Sprintf("API Key auth %s", role.String()), func(t *testing.T) { - // // do not run this test in parallel - they lock Grafana's sqlite3 database - // // t.Parallel() - - // login := fmt.Sprintf("api-%s-%d", role, time.Now().Nanosecond()) - // apiKeyID, apiKey, err := c.createAPIKey(ctx, login, role, authHeaders) - // require.NoError(t, err) - // require.NotZero(t, apiKeyID) - // require.NotEmpty(t, apiKey) - // if err != nil { - // defer func() { - // err = c.deleteAPIKey(ctx, apiKeyID, authHeaders) - // require.NoError(t, err) - // }() - // } - - // apiKeyAuthHeaders := http.Header{} - // apiKeyAuthHeaders.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey)) - - // u, err := c.getAuthUser(ctx, apiKeyAuthHeaders) - // actualRole := u.role - // assert.NoError(t, err) - // assert.Equal(t, role, actualRole) - // assert.Equal(t, role.String(), actualRole.String()) - // }) + t.Run(fmt.Sprintf("Basic auth %s", role.String()), func(t *testing.T) { + // do not run this test in parallel - they lock Grafana's sqlite3 database + // t.Parallel() + + login := fmt.Sprintf("basic-%s-%d", role, time.Now().Nanosecond()) + userID, err := c.testCreateUser(ctx, login, role, authHeaders) + require.NoError(t, err) + require.NotZero(t, userID) + if err != nil { + defer func() { + err = c.testDeleteUser(ctx, userID, authHeaders) + require.NoError(t, err) + }() + } + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, "/dummy", nil) + require.NoError(t, err) + req.SetBasicAuth(login, login) + userAuthHeaders := req.Header + + u, err := c.getAuthUser(ctx, userAuthHeaders) + actualRole := u.role + assert.NoError(t, err) + assert.Equal(t, role, actualRole) + assert.Equal(t, role.String(), actualRole.String()) + }) + + t.Run(fmt.Sprintf("API Key auth %s", role.String()), func(t *testing.T) { + // do not run this test in parallel - they lock Grafana's sqlite3 database + // t.Parallel() + + login := fmt.Sprintf("api-%s-%d", role, time.Now().Nanosecond()) + apiKeyID, apiKey, err := c.createAPIKey(ctx, login, role, authHeaders) + require.NoError(t, err) + require.NotZero(t, apiKeyID) + require.NotEmpty(t, apiKey) + if err != nil { + defer func() { + err = c.deleteAPIKey(ctx, apiKeyID, authHeaders) + require.NoError(t, err) + }() + } + + apiKeyAuthHeaders := http.Header{} + apiKeyAuthHeaders.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey)) + + u, err := c.getAuthUser(ctx, apiKeyAuthHeaders) + actualRole := u.role + assert.NoError(t, err) + assert.Equal(t, role, actualRole) + assert.Equal(t, role.String(), actualRole.String()) + }) t.Run(fmt.Sprintf("Service token auth %s", role.String()), func(t *testing.T) { // do not run this test in parallel - they lock Grafana's sqlite3 database // t.Parallel() - login := fmt.Sprintf("servicetoken-%s-%d", role, time.Now().Nanosecond()) - serviceTokenID, serviceToken, err := c.createServiceAccountAndToken(ctx, login, role, authHeaders) + serviceAccountID, err := c.createServiceAccount(ctx, role, authHeaders) + if err != nil { + defer func() { + err = c.deleteServiceAccount(ctx, serviceAccountID, authHeaders) + require.NoError(t, err) + }() + } + require.NoError(t, err) + serviceTokenID, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, authHeaders) + if err != nil { + defer func() { + err = c.deletePMMAgentRelatedServiceTokens(ctx, serviceAccountID, authHeaders) + require.NoError(t, err) + }() + } require.NoError(t, err) require.NotZero(t, serviceTokenID) require.NotEmpty(t, serviceToken) - // if err != nil { - // defer func() { - // err = c.deleteAPIKey(ctx, apiKeyID, authHeaders) - // require.NoError(t, err) - // }() - // } serviceTokenAuthHeaders := http.Header{} serviceTokenAuthHeaders.Set("Authorization", fmt.Sprintf("Bearer %s", serviceToken)) u, err := c.getAuthUser(ctx, serviceTokenAuthHeaders) - switch role { - case admin: - assert.NoError(t, err) - actualRole := u.role - assert.Equal(t, role, actualRole) - assert.Equal(t, role.String(), actualRole.String()) - case viewer, editor: - require.ErrorContains(t, err, "Permissions needed: serviceaccounts:read") - } + assert.NoError(t, err) + actualRole := u.role + assert.Equal(t, role, actualRole) + assert.Equal(t, role.String(), actualRole.String()) }) } }) From 8e93cf9f0cf9c5fd8f756a3e9b9cd6e4cadb5cbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 10 Oct 2023 09:18:43 +0200 Subject: [PATCH 014/126] PMM-12251 Not needed, set on transport. --- agent/client/client.go | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/agent/client/client.go b/agent/client/client.go index d96b7675ac..c2a1d2373b 100644 --- a/agent/client/client.go +++ b/agent/client/client.go @@ -742,20 +742,6 @@ func dial(dialCtx context.Context, cfg *config.Config, l *logrus.Entry) (*dialRe opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))) } - username := cfg.Server.Username - if username != "" { - if username == "api_key" || username == "service_token" { - opts = append(opts, grpc.WithPerRPCCredentials(&tokenAuth{ - token: cfg.Server.Password, - })) - } else { - opts = append(opts, grpc.WithPerRPCCredentials(&basicAuth{ - username: username, - password: cfg.Server.Password, - })) - } - } - l.Infof("Connecting to %s ...", cfg.Server.FilteredURL()) conn, err := grpc.DialContext(dialCtx, cfg.Server.Address, opts...) if err != nil { From d0abd62930caa3ed6185f5cb26d29b5df9db8911 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 10 Oct 2023 09:23:50 +0200 Subject: [PATCH 015/126] PMM-12251 Mock gen. --- .../management/mock_auth_provider_test.go | 49 ++++++++++++++----- 1 file changed, 36 insertions(+), 13 deletions(-) diff --git a/managed/services/management/mock_auth_provider_test.go b/managed/services/management/mock_auth_provider_test.go index 0f1ab0347f..4226363bba 100644 --- a/managed/services/management/mock_auth_provider_test.go +++ b/managed/services/management/mock_auth_provider_test.go @@ -44,30 +44,54 @@ func (_m *mockAuthProvider) CreateAdminAPIKey(ctx context.Context, name string) return r0, r1, r2 } -// CreateServiceAccountAndToken provides a mock function with given fields: ctx, name -func (_m *mockAuthProvider) CreateServiceAccountAndToken(ctx context.Context, name string) (int64, string, error) { - ret := _m.Called(ctx, name) +// CreateServiceAccount provides a mock function with given fields: ctx +func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context) (int64, error) { + ret := _m.Called(ctx) + + var r0 int64 + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (int64, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) int64); ok { + r0 = rf(ctx) + } else { + r0 = ret.Get(0).(int64) + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) + } + + return r0, r1 +} + +// CreateServiceToken provides a mock function with given fields: ctx, serviceAccountID +func (_m *mockAuthProvider) CreateServiceToken(ctx context.Context, serviceAccountID int64) (int64, string, error) { + ret := _m.Called(ctx, serviceAccountID) var r0 int64 var r1 string var r2 error - if rf, ok := ret.Get(0).(func(context.Context, string) (int64, string, error)); ok { - return rf(ctx, name) + if rf, ok := ret.Get(0).(func(context.Context, int64) (int64, string, error)); ok { + return rf(ctx, serviceAccountID) } - if rf, ok := ret.Get(0).(func(context.Context, string) int64); ok { - r0 = rf(ctx, name) + if rf, ok := ret.Get(0).(func(context.Context, int64) int64); ok { + r0 = rf(ctx, serviceAccountID) } else { r0 = ret.Get(0).(int64) } - if rf, ok := ret.Get(1).(func(context.Context, string) string); ok { - r1 = rf(ctx, name) + if rf, ok := ret.Get(1).(func(context.Context, int64) string); ok { + r1 = rf(ctx, serviceAccountID) } else { r1 = ret.Get(1).(string) } - if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { - r2 = rf(ctx, name) + if rf, ok := ret.Get(2).(func(context.Context, int64) error); ok { + r2 = rf(ctx, serviceAccountID) } else { r2 = ret.Error(2) } @@ -80,8 +104,7 @@ func (_m *mockAuthProvider) CreateServiceAccountAndToken(ctx context.Context, na func newMockAuthProvider(t interface { mock.TestingT Cleanup(func()) -}, -) *mockAuthProvider { +}) *mockAuthProvider { mock := &mockAuthProvider{} mock.Mock.Test(t) From ca5c3eb312a433758d86fae101d4cac447cc5edf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 10 Oct 2023 10:40:58 +0200 Subject: [PATCH 016/126] PMM-12251 Node changes. --- managed/services/management/node.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/managed/services/management/node.go b/managed/services/management/node.go index 3e3c4f26c3..c3c7352630 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -17,8 +17,6 @@ package management import ( "context" - "fmt" - "math/rand" "github.com/AlekSi/pointer" "google.golang.org/grpc/codes" @@ -35,7 +33,8 @@ import ( type authProvider interface { CreateAdminAPIKey(ctx context.Context, name string) (int64, string, error) - CreateServiceAccountAndToken(ctx context.Context, name string) (int64, string, error) + CreateServiceAccount(ctx context.Context) (int64, error) + CreateServiceToken(ctx context.Context, serviceAccountID int64) (int64, string, error) } // NodeService represents service for working with nodes. @@ -137,11 +136,20 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo return nil, e } - serviceAccountName := fmt.Sprintf("pmm-agent-%s-%d", req.NodeName, rand.Int63()) //nolint:gosec - _, res.Token, e = s.ap.CreateServiceAccountAndToken(ctx, serviceAccountName) + serviceAcountID, e := s.ap.CreateServiceAccount(ctx) + if e != nil { + return nil, e + } + _, res.Token, e = s.ap.CreateServiceToken(ctx, serviceAcountID) if e != nil { return nil, e } - return res, nil } + +// Unregister do remove of node registration. +func (s *NodeService) Unregister(ctx context.Context, req *managementpb.UnregisterNodeRequest) (*managementpb.UnregisterNodeResponse, error) { + return &managementpb.UnregisterNodeResponse{ + Unregistered: true, + }, nil +} From 112d6b7f5ee59849081a2256229aed83a5794b48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 10 Oct 2023 12:10:54 +0200 Subject: [PATCH 017/126] PMM-12251 Add existedServiceToken to NodeRegister. --- agent/commands/clients.go | 4 +- agent/commands/setup.go | 6 +- .../client/node/register_node_responses.go | 3 + api/managementpb/json/managementpb.json | 5 + api/managementpb/node.pb.go | 94 +++++++++++-------- api/managementpb/node.pb.validate.go | 2 + api/managementpb/node.proto | 4 +- api/managementpb/node_grpc.pb.go | 4 +- api/swagger/swagger-dev.json | 5 + api/swagger/swagger.json | 5 + managed/services/management/node.go | 26 +++-- 11 files changed, 98 insertions(+), 60 deletions(-) diff --git a/agent/commands/clients.go b/agent/commands/clients.go index 80c51a7c92..9ddb4712a6 100644 --- a/agent/commands/clients.go +++ b/agent/commands/clients.go @@ -165,7 +165,7 @@ func ParseCustomLabels(labels string) (map[string]string, error) { // serverRegister registers Node on PMM Server. // // This method is not thread-safe. -func serverRegister(cfgSetup *config.Setup) (agentID, token string, _ error) { //nolint:nonamedreturns +func serverRegister(cfgSetup *config.Setup, existedServiceToken string) (agentID, token string, _ error) { //nolint:nonamedreturns nodeTypes := map[string]string{ "generic": node.RegisterNodeBodyNodeTypeGENERICNODE, "container": node.RegisterNodeBodyNodeTypeCONTAINERNODE, @@ -202,6 +202,8 @@ func serverRegister(cfgSetup *config.Setup) (agentID, token string, _ error) { / Reregister: cfgSetup.Force, MetricsMode: pointer.ToString(strings.ToUpper(cfgSetup.MetricsMode)), DisableCollectors: disableCollectors, + + ExistedServiceToken: existedServiceToken, }, Context: context.Background(), }) diff --git a/agent/commands/setup.go b/agent/commands/setup.go index 4e8730b69b..df1217c2a8 100644 --- a/agent/commands/setup.go +++ b/agent/commands/setup.go @@ -138,8 +138,12 @@ func register(cfg *config.Config, l *logrus.Entry) { os.Exit(1) } + existedServiceToken := "" + if strings.HasPrefix(cfg.Server.Username, "service_token") { + existedServiceToken = cfg.Server.Password + } setServerTransport(u, cfg.Server.InsecureTLS, l) - agentID, token, err := serverRegister(&cfg.Setup) + agentID, token, err := serverRegister(&cfg.Setup, existedServiceToken) l.Debugf("Register error: %#v", err) if err != nil { msg := err.Error() diff --git a/api/managementpb/json/client/node/register_node_responses.go b/api/managementpb/json/client/node/register_node_responses.go index 747c5965d7..5caaeb505d 100644 --- a/api/managementpb/json/client/node/register_node_responses.go +++ b/api/managementpb/json/client/node/register_node_responses.go @@ -172,6 +172,9 @@ type RegisterNodeBody struct { // Custom password for exporter endpoint /metrics. AgentPassword string `json:"agent_password,omitempty"` + + // If its provided then it wont create new service account and service token. + ExistedServiceToken string `json:"existed_service_token,omitempty"` } // Validate validates this register node body diff --git a/api/managementpb/json/managementpb.json b/api/managementpb/json/managementpb.json index 57b8c1da00..27237a0f4c 100644 --- a/api/managementpb/json/managementpb.json +++ b/api/managementpb/json/managementpb.json @@ -3675,6 +3675,11 @@ "type": "string", "x-order": 4 }, + "existed_service_token": { + "description": "If its provided then it wont create new service account and service token.", + "type": "string", + "x-order": 15 + }, "machine_id": { "description": "Linux machine-id.", "type": "string", diff --git a/api/managementpb/node.pb.go b/api/managementpb/node.pb.go index 2f557c0dab..32423691a4 100644 --- a/api/managementpb/node.pb.go +++ b/api/managementpb/node.pb.go @@ -63,6 +63,8 @@ type RegisterNodeRequest struct { DisableCollectors []string `protobuf:"bytes,14,rep,name=disable_collectors,json=disableCollectors,proto3" json:"disable_collectors,omitempty"` // Custom password for exporter endpoint /metrics. AgentPassword string `protobuf:"bytes,15,opt,name=agent_password,json=agentPassword,proto3" json:"agent_password,omitempty"` + // If its provided then it wont create new service account and service token. + ExistedServiceToken string `protobuf:"bytes,16,opt,name=existed_service_token,json=existedServiceToken,proto3" json:"existed_service_token,omitempty"` } func (x *RegisterNodeRequest) Reset() { @@ -202,6 +204,13 @@ func (x *RegisterNodeRequest) GetAgentPassword() string { return "" } +func (x *RegisterNodeRequest) GetExistedServiceToken() string { + if x != nil { + return x.ExistedServiceToken + } + return "" +} + type RegisterNodeResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -290,7 +299,7 @@ var file_managementpb_node_proto_rawDesc = []byte{ 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9a, 0x05, 0x0a, 0x13, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xce, 0x05, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, @@ -328,46 +337,49 @@ var file_managementpb_node_proto_rawDesc = []byte{ 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, - 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xda, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x6f, 0x64, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, - 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x52, - 0x0b, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3f, 0x0a, 0x0e, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0d, - 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a, - 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x4d, 0x4d, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0xba, 0x01, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0xb1, - 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, - 0x1f, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x20, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x34, 0x12, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x1a, 0x23, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x70, 0x6d, 0x6d, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x2f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x42, 0x8c, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, - 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x4d, 0x58, - 0x58, 0xaa, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xca, 0x02, - 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x16, 0x4d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x69, 0x73, 0x74, + 0x65, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x53, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x3f, 0x0a, 0x11, 0x43, + 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xda, 0x01, 0x0a, + 0x14, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, + 0x12, 0x3f, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, + 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x6f, + 0x64, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x6f, 0x64, + 0x65, 0x12, 0x30, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0xba, 0x01, 0x0a, 0x04, 0x4e, 0x6f, + 0x64, 0x65, 0x12, 0xb1, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x34, 0x12, 0x0d, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x1a, 0x23, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4e, 0x6f, 0x64, 0x65, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6d, 0x6d, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x2f, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x42, 0x8c, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, + 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0xca, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xe2, + 0x02, 0x16, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/managementpb/node.pb.validate.go b/api/managementpb/node.pb.validate.go index a92c8487c9..7f6f8707aa 100644 --- a/api/managementpb/node.pb.validate.go +++ b/api/managementpb/node.pb.validate.go @@ -98,6 +98,8 @@ func (m *RegisterNodeRequest) validate(all bool) error { // no validation rules for AgentPassword + // no validation rules for ExistedServiceToken + if len(errors) > 0 { return RegisterNodeRequestMultiError(errors) } diff --git a/api/managementpb/node.proto b/api/managementpb/node.proto index ddb52efe7a..b588f405e3 100644 --- a/api/managementpb/node.proto +++ b/api/managementpb/node.proto @@ -44,6 +44,8 @@ message RegisterNodeRequest { repeated string disable_collectors = 14; // Custom password for exporter endpoint /metrics. string agent_password = 15; + // If its provided then it wont create new service account and service token. + string existed_service_token = 16; } message RegisterNodeResponse { @@ -56,7 +58,7 @@ message RegisterNodeResponse { // Node service provides public Management API methods for Nodes. service Node { - // RegisterNode registers a new Node and pmm-agent. + // RegisterNode registers a new Node, pmm-agent and create service account and it's token. rpc RegisterNode(RegisterNodeRequest) returns (RegisterNodeResponse) { option (google.api.http) = { post: "/v1/management/Node/Register" diff --git a/api/managementpb/node_grpc.pb.go b/api/managementpb/node_grpc.pb.go index ee9850d2aa..fb4ace9f19 100644 --- a/api/managementpb/node_grpc.pb.go +++ b/api/managementpb/node_grpc.pb.go @@ -27,7 +27,7 @@ const ( // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type NodeClient interface { - // RegisterNode registers a new Node and pmm-agent. + // RegisterNode registers a new Node, pmm-agent and create service account and it's token. RegisterNode(ctx context.Context, in *RegisterNodeRequest, opts ...grpc.CallOption) (*RegisterNodeResponse, error) } @@ -52,7 +52,7 @@ func (c *nodeClient) RegisterNode(ctx context.Context, in *RegisterNodeRequest, // All implementations must embed UnimplementedNodeServer // for forward compatibility type NodeServer interface { - // RegisterNode registers a new Node and pmm-agent. + // RegisterNode registers a new Node, pmm-agent and create service account and it's token. RegisterNode(context.Context, *RegisterNodeRequest) (*RegisterNodeResponse, error) mustEmbedUnimplementedNodeServer() } diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index af4af60aaa..455d7d8244 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -27257,6 +27257,11 @@ "description": "Custom password for exporter endpoint /metrics.", "type": "string", "x-order": 14 + }, + "existed_service_token": { + "description": "If its provided then it wont create new service account and service token.", + "type": "string", + "x-order": 15 } } } diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index 13fd52ea88..804ca28f61 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -18426,6 +18426,11 @@ "description": "Custom password for exporter endpoint /metrics.", "type": "string", "x-order": 14 + }, + "existed_service_token": { + "description": "If its provided then it wont create new service account and service token.", + "type": "string", + "x-order": 15 } } } diff --git a/managed/services/management/node.go b/managed/services/management/node.go index c3c7352630..fb474c5d1a 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -136,20 +136,18 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo return nil, e } - serviceAcountID, e := s.ap.CreateServiceAccount(ctx) - if e != nil { - return nil, e - } - _, res.Token, e = s.ap.CreateServiceToken(ctx, serviceAcountID) - if e != nil { - return nil, e + if req.ExistedServiceToken == "" { + serviceAcountID, e := s.ap.CreateServiceAccount(ctx) + if e != nil { + return nil, e + } + _, res.Token, e = s.ap.CreateServiceToken(ctx, serviceAcountID) + if e != nil { + return nil, e + } + } else { + res.Token = req.ExistedServiceToken } - return res, nil -} -// Unregister do remove of node registration. -func (s *NodeService) Unregister(ctx context.Context, req *managementpb.UnregisterNodeRequest) (*managementpb.UnregisterNodeResponse, error) { - return &managementpb.UnregisterNodeResponse{ - Unregistered: true, - }, nil + return res, nil } From e80e9c4c5e9a9c8c856afcbce3702609d12604a4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 10 Oct 2023 12:12:48 +0200 Subject: [PATCH 018/126] PMM-12251 Typo. --- managed/services/grafana/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 6671501f40..1035e83bb5 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -484,7 +484,7 @@ func (c *Client) DeleteServiceAccount(ctx context.Context, id int64) error { if err != nil { return err } - return c.deleteAPIKey(ctx, id, authHeaders) + return c.deleteServiceAccount(ctx, id, authHeaders) } // CreateAlertRule creates Grafana alert rule. From af9f6e5132a12a6bb6d16add57980b4e98d4c176 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 11 Oct 2023 12:36:09 +0200 Subject: [PATCH 019/126] PMM-12251 Small logic changes. Validation. --- managed/services/grafana/client.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 1035e83bb5..e9464ec3c0 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -25,7 +25,6 @@ import ( "encoding/json" "fmt" "io" - "math/rand" "net" "net/http" "net/url" @@ -670,6 +669,10 @@ type serviceToken struct { } func (c *Client) createServiceAccount(ctx context.Context, role role, authHeaders http.Header) (int64, error) { + if role == none { + return 0, errors.New("you cannot create service account with empty role") + } + name := fmt.Sprintf("serviceaccount-%s-%d", role, time.Now().Nanosecond()) b, err := json.Marshal(serviceAccount{Name: name, Role: role.String()}) if err != nil { @@ -693,8 +696,8 @@ func (c *Client) createServiceAccount(ctx context.Context, role role, authHeader } func (c *Client) createServiceToken(ctx context.Context, serviceAccountID int64, authHeaders http.Header) (int64, string, error) { - serviceTokenName := fmt.Sprintf("%s-%d", pmmServiceTokenName, rand.Int63()) - b, err := json.Marshal(serviceToken{Name: serviceTokenName}) + serviceTokenName := fmt.Sprintf("%s-%s-%d", pmmServiceTokenName, admin, time.Now().Nanosecond()) + b, err := json.Marshal(serviceToken{Name: serviceTokenName, Role: admin.String()}) if err != nil { return 0, "", errors.WithStack(err) } From 73cd6a04954b564b566ef4eeef703265ab80ffc8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 11 Oct 2023 12:36:48 +0200 Subject: [PATCH 020/126] PMM-12251 Add API tests. --- api-tests/server/auth_test.go | 187 +++++++++++++++++++++++++++++++++- 1 file changed, 186 insertions(+), 1 deletion(-) diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index 99158daac5..111bbd4d03 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -240,7 +240,7 @@ func TestSwagger(t *testing.T) { } } -func TestPermissions(t *testing.T) { +func TestAPIKeyPermissions(t *testing.T) { ts := strconv.FormatInt(time.Now().Unix(), 10) none := "none-" + ts viewer := "viewer-" + ts @@ -521,3 +521,188 @@ func createAPIKeyWithRole(t *testing.T, name, role string) (int, string) { return apiKeyID, apiKey } + +func TestServiceAccountPermissions(t *testing.T) { + // service account role options: viewer, editor, admin + // service token role options: editor, admin + // basic auth format is skipped, endpoint /auth/serviceaccount (to get info about token) requires Bearer authorization + // service_token:token could be used in pmm-agent and pmm-admin (its transformed into Bearer authorization) + + viewerAccountID := createServiceAccountWithRole(t, "Viewer") + defer deleteServiceAccount(t, viewerAccountID) + + editorAccountID := createServiceAccountWithRole(t, "Editor") + editorTokenID, editorToken := createServiceToken(t, editorAccountID) + defer deleteServiceAccount(t, editorAccountID) + defer deleteServiceToken(t, editorAccountID, editorTokenID) + + adminAccountID := createServiceAccountWithRole(t, "Admin") + adminTokenID, adminToken := createServiceToken(t, adminAccountID) + defer deleteServiceAccount(t, adminAccountID) + defer deleteServiceToken(t, adminAccountID, adminTokenID) + + type userCase struct { + userType string + serviceToken string + statusCode int + } + + tests := []struct { + name string + url string + method string + userCase []userCase + }{ + {name: "settings", url: "/v1/Settings/Get", method: "POST", userCase: []userCase{ + {userType: "default", statusCode: 401}, + {userType: "viewer", serviceToken: "", statusCode: 401}, + {userType: "editor", serviceToken: editorToken, statusCode: 401}, + {userType: "admin", serviceToken: adminToken, statusCode: 200}, + }}, + {name: "alerts-default", url: "/alertmanager/api/v2/alerts", method: http.MethodGet, userCase: []userCase{ + {userType: "default", statusCode: 401}, + {userType: "viewer", serviceToken: "", statusCode: 401}, + {userType: "editor", serviceToken: editorToken, statusCode: 401}, + {userType: "admin", serviceToken: adminToken, statusCode: 200}, + }}, + {name: "platform-connect", url: "/v1/Platform/Connect", method: "POST", userCase: []userCase{ + {userType: "default", statusCode: 401}, + {userType: "viewer", serviceToken: "", statusCode: 401}, + {userType: "editor", serviceToken: editorToken, statusCode: 401}, + {userType: "admin", serviceToken: adminToken, statusCode: 400}, // We send bad request, but have access to endpoint + }}, + } + + for _, test := range tests { + test := test + t.Run(test.name, func(t *testing.T) { + for _, user := range test.userCase { + user := user + t.Run(fmt.Sprintf("Service Token auth %s", user.userType), func(t *testing.T) { + // make a BaseURL without authentication + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.User = nil + u.Path = test.url + + req, err := http.NewRequestWithContext(pmmapitests.Context, test.method, u.String(), nil) + require.NoError(t, err) + + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", user.serviceToken)) + + resp, err := http.DefaultClient.Do(req) + require.NoError(t, err) + defer resp.Body.Close() //nolint:gosec + + assert.Equal(t, user.statusCode, resp.StatusCode) + }) + } + }) + } +} + +func createServiceAccountWithRole(t *testing.T, role string) int64 { + t.Helper() + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.Path = "/graph/api/serviceaccounts" + + name := fmt.Sprintf("serviceaccount-%s-%d", role, time.Now().Nanosecond()) + data, err := json.Marshal(map[string]string{ + "name": name, + "role": role, + }) + require.NoError(t, err) + + req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodPost, u.String(), bytes.NewReader(data)) + require.NoError(t, err) + + req.Header.Set("Content-Type", "application/json; charset=utf-8") + + resp, b := doRequest(t, http.DefaultClient, req) + defer resp.Body.Close() //nolint:gosec + + require.Equalf(t, http.StatusCreated, resp.StatusCode, "failed to create Service account, status code: %d, response: %s", resp.StatusCode, b) + + var m map[string]interface{} + err = json.Unmarshal(b, &m) + require.NoError(t, err) + + serviceAccountID := int64(m["id"].(float64)) //nolint:forcetypeassert + u.Path = fmt.Sprintf("/graph/api/serviceaccounts/%d", serviceAccountID) + data, err = json.Marshal(map[string]string{ + "orgId": "1", + }) + require.NoError(t, err) + + req, err = http.NewRequestWithContext(pmmapitests.Context, http.MethodPatch, u.String(), bytes.NewReader(data)) + require.NoError(t, err) + + req.Header.Set("Content-Type", "application/json; charset=utf-8") + + resp1, b := doRequest(t, http.DefaultClient, req) + defer resp1.Body.Close() //nolint:gosec + + require.Equalf(t, http.StatusCreated, resp.StatusCode, "failed to set orgId=1 to Service account, status code: %d, response: %s", resp.StatusCode, b) + + return serviceAccountID +} + +func deleteServiceAccount(t *testing.T, serviceAccountID int64) { + t.Helper() + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.Path = fmt.Sprintf("/graph/api/serviceaccounts/%d", serviceAccountID) + + req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodDelete, u.String(), nil) + require.NoError(t, err) + + resp, b := doRequest(t, http.DefaultClient, req) + defer resp.Body.Close() //nolint:gosec + + require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete service account, status code: %d, response: %s", resp.StatusCode, b) +} + +func createServiceToken(t *testing.T, serviceAccountID int64) (int64, string) { + t.Helper() + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.Path = fmt.Sprintf("/graph/api/serviceaccounts/%d/tokens", serviceAccountID) + + name := fmt.Sprintf("servicetoken-%d-%d", serviceAccountID, time.Now().Nanosecond()) + data, err := json.Marshal(map[string]string{ + "name": name, + }) + require.NoError(t, err) + + req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodPost, u.String(), bytes.NewReader(data)) + require.NoError(t, err) + + req.Header.Set("Content-Type", "application/json; charset=utf-8") + + resp, b := doRequest(t, http.DefaultClient, req) + defer resp.Body.Close() //nolint:gosec + + require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to create Service account, status code: %d, response: %s", resp.StatusCode, b) + + var m map[string]interface{} + err = json.Unmarshal(b, &m) + require.NoError(t, err) + + return int64(m["id"].(float64)), m["key"].(string) //nolint:forcetypeassert +} + +func deleteServiceToken(t *testing.T, serviceAccountID, serviceTokenID int64) { + t.Helper() + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.Path = fmt.Sprintf("/graph/api/serviceaccounts/%d/tokens/%d", serviceAccountID, serviceTokenID) + + req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodDelete, u.String(), nil) + require.NoError(t, err) + + resp, b := doRequest(t, http.DefaultClient, req) + defer resp.Body.Close() //nolint:gosec + + require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete service token, status code: %d, response: %s", resp.StatusCode, b) +} From b0971493c804bd0b204b43b2a75e96f8ddfd6b91 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 11 Oct 2023 13:04:51 +0200 Subject: [PATCH 021/126] PMM-12251 Align mock with changes. --- managed/services/management/node_test.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index 6f37989316..4752be6b7a 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -21,7 +21,6 @@ import ( "github.com/google/uuid" "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -55,7 +54,12 @@ func TestNodeService(t *testing.T) { } var authProvider mockAuthProvider authProvider.Test(t) - authProvider.On("CreateServiceAccountAndToken", ctx, mock.AnythingOfType("string")).Return(int64(0), "test-token", nil) + + serviceAccountID := int64(0) + serviceTokenID := int64(1) + authProvider.On("CreateServiceAccount", ctx).Return(serviceAccountID, nil) + authProvider.On("CreateServiceToken", ctx, serviceAccountID).Return(serviceTokenID, "test-token", nil) + s = NewNodeService(db, &authProvider) return From 2b6d2e53f2bc5991bb44f24038bf44e25323aba0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 11 Oct 2023 13:10:58 +0200 Subject: [PATCH 022/126] Revert "Merge remote-tracking branch 'origin/PMM-12251-service-accounts' into PMM-12251-service-accounts" This reverts commit 82b58264f68fdeb06baa160a890485d70ba7259b, reversing changes made to 88199cd90038a65e3700c732acd12c52724df77c. --- cli-tests/package-lock.json | 16 ++++++++-------- cli-tests/package.json | 2 +- go.sum | 27 --------------------------- 3 files changed, 9 insertions(+), 36 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index c4dbc70b74..f3e552d229 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -22,7 +22,7 @@ "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^6.7.0", "@typescript-eslint/parser": "^6.7.0", - "eslint": "8.50", + "eslint": "8.51", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", "eslint-plugin-import": "^2.28.0", @@ -86,9 +86,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", - "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.51.0.tgz", + "integrity": "sha512-HxjQ8Qn+4SI3/AFv6sOrDB+g6PpUTDwSJiQqOrnneEk8L71161srI9gjzzZvYVbzHiVg/BvcH95+cK/zfIt4pg==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -936,15 +936,15 @@ } }, "node_modules/eslint": { - "version": "8.50.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", - "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", + "version": "8.51.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.51.0.tgz", + "integrity": "sha512-2WuxRZBrlwnXi+/vFSJyjMqrNjtJqiasMzehF0shoLaW7DzS3/9Yvrmq5JiT66+pNjiX4UBnLDiKHcWAr/OInA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", "@eslint/eslintrc": "^2.1.2", - "@eslint/js": "8.50.0", + "@eslint/js": "8.51.0", "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", diff --git a/cli-tests/package.json b/cli-tests/package.json index f6fe7cd1aa..c2e713d27e 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -26,7 +26,7 @@ "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^6.7.0", "@typescript-eslint/parser": "^6.7.0", - "eslint": "8.50", + "eslint": "8.51", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", "eslint-plugin-import": "^2.28.0", diff --git a/go.sum b/go.sum index 7ad41af604..a50646548e 100644 --- a/go.sum +++ b/go.sum @@ -49,14 +49,12 @@ github.com/Azure/azure-storage-blob-go v0.13.0/go.mod h1:pA9kNqtjUeQF2zOSu4s//nU github.com/Azure/azure-storage-blob-go v0.14.0 h1:1BCg74AmVdYwO3dlKwtFU1V0wU2PZdREkXvAmZJRUlM= github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= -github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.28 h1:ndAExarwr5Y+GaHE6VCaY1kyS/HwwGGyuimVhWsHOEM= github.com/Azure/go-autorest/autorest/adal v0.9.2/go.mod h1:/3SMAM86bP6wC9Ev35peQDUeqFZBMH07vvUOmg4z/fE= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/adal v0.9.21 h1:jjQnVFXPfekaqb8vIsv2G1lxshoW+oGv4MDlhRtnYZk= -github.com/Azure/go-autorest/autorest/adal v0.9.21/go.mod h1:zua7mBUaCc5YnSLKYgGJR/w5ePdMDA6H56upLsHzA9U= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= @@ -93,12 +91,10 @@ github.com/Percona-Lab/spec v0.20.5-percona/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5i github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/assert/v2 v2.1.0 h1:tbredtNcQnoSd3QBhQWI7QZ3XHOVkw1Moklp2ojoH/0= -github.com/alecthomas/assert/v2 v2.1.0/go.mod h1:b/+1DI2Q6NckYi+3mXyH3wFb8qG37K/DuK80n7WefXA= github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= github.com/alecthomas/kong v0.8.0 h1:ryDCzutfIqJPnNn0omnrgHLbAggDQM2VWHikE1xqK7s= github.com/alecthomas/kong v0.8.0/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U= github.com/alecthomas/repr v0.1.0 h1:ENn2e1+J3k09gyj2shc0dHr/yjaWSHRlrJ4DPMevDqE= -github.com/alecthomas/repr v0.1.0/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -180,9 +176,7 @@ github.com/denisenkom/go-mssqldb v0.9.0 h1:RSohk2RsiZqLZ0zCjtfn3S4Gp4exhpBWHyQ7D github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dhui/dktest v0.3.16 h1:i6gq2YQEtcrjKbeJpBkWjE8MmLZPYllcjOFbTZuPDnw= -github.com/dhui/dktest v0.3.16/go.mod h1:gYaA3LRmM8Z4vJl2MA0THIigJoZrwOansEOsp+kqxp0= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= -github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= @@ -245,7 +239,6 @@ github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= -github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= github.com/go-openapi/analysis v0.21.4 h1:ZDFLvSNxpDaomuCueM0BlSXxpANBlFYiBvr+GXrvIHc= github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo= @@ -285,7 +278,6 @@ github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrt github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= -github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gobs/pretty v0.0.0-20180724170744-09732c25a95b h1:/vQ+oYKu+JoyaMPDsv5FzwuL2wwWBgBbtj/YLCi4LuA= github.com/gobs/pretty v0.0.0-20180724170744-09732c25a95b/go.mod h1:Xo4aNUOrJnVruqWQJBtW6+bTBDTniY8yZum5rF3b5jw= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= @@ -329,7 +321,6 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2V github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= -github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -343,7 +334,6 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= -github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -396,7 +386,6 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= -github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= @@ -448,7 +437,6 @@ github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyf github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= -github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= @@ -509,7 +497,6 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= -github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -549,7 +536,6 @@ github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOq github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -575,7 +561,6 @@ github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= -github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -590,7 +575,6 @@ github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJ github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b h1:1XF24mVaiu7u+CFywTdcDo2ie1pzzhwjt6RHqzpMU34= github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= @@ -614,9 +598,7 @@ github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= -github.com/onsi/ginkgo/v2 v2.9.4/go.mod h1:gCQYp2Q+kSoIj7ykSVb9nskRSsR6PUj4AiLywzIhbKM= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= -github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -726,7 +708,6 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -813,7 +794,6 @@ go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeH go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY= -go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM= go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= go.starlark.net v0.0.0-20230717150657-8a3343210976 h1:7ljYNcZU84T2N0tZdDgvL7U3M4iFmglAUUU1gRFE/2Q= @@ -825,10 +805,8 @@ go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0 go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= -go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= -go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1080,7 +1058,6 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= -gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2 h1:CCXrcPKiGGotvnN6jfUsKk4rRqm7q09/YbKb5xCEvtM= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= @@ -1238,9 +1215,7 @@ modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= -modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= -modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/libc v1.24.1 h1:uvJSeCKL/AgzBo2yYIPPTy82v21KgGnizcGYfBHaNuM= modernc.org/libc v1.24.1/go.mod h1:FmfO1RLrU3MHJfyi9eYYmZBfi/R+tqZ6+hQ3yQQUkak= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= @@ -1254,11 +1229,9 @@ modernc.org/sqlite v1.26.0/go.mod h1:FL3pVXie73rg3Rii6V/u5BoHlSoyeZeIgKZEgHARyCU modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= -modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c= modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= -modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= From fc5e5816c93b22e89143af5584e115c338405db9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 11 Oct 2023 13:11:52 +0200 Subject: [PATCH 023/126] PMM-12251 Tidy. --- go.sum | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.sum b/go.sum index a50646548e..923b1f12ae 100644 --- a/go.sum +++ b/go.sum @@ -207,7 +207,6 @@ github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/ github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.5.0/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= -github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= github.com/go-co-op/gocron v1.35.1 h1:xi0tfAhxeAmGUKkjiA7bTIjh2VdBJpUYDJ+lPx/EPcM= github.com/go-co-op/gocron v1.35.1/go.mod h1:NLi+bkm4rRSy1F8U7iacZOz0xPseMoIOnvabGoSe/no= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= @@ -821,7 +820,6 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= -golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= From dd3026b6446a8fd65862821a724dd69fe604446c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 11 Oct 2023 13:16:45 +0200 Subject: [PATCH 024/126] PMM-12251 Small refactor. --- managed/services/grafana/client.go | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index e9464ec3c0..1f1296e60c 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -657,15 +657,12 @@ func (c *Client) deleteAPIKey(ctx context.Context, apiKeyID int64, authHeaders h } type serviceAccount struct { - Name string `json:"name"` - Role string `json:"role"` - OrgID int64 `json:"orgId"` + Name string `json:"name"` + Role string `json:"role"` } type serviceToken struct { - ID int64 `json:"id"` - Name string `json:"name"` - Role string `json:"role"` - Expiration *time.Time `json:"expiration,omitempty"` + Name string `json:"name"` + Role string `json:"role"` } func (c *Client) createServiceAccount(ctx context.Context, role role, authHeaders http.Header) (int64, error) { From f9b43396ac673e030974f36e92571a4d36261e24 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 11 Oct 2023 13:28:43 +0200 Subject: [PATCH 025/126] PMM-12251 Fix. --- managed/services/grafana/client.go | 1 + managed/services/management/mock_auth_provider_test.go | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 1f1296e60c..fd36493342 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -661,6 +661,7 @@ type serviceAccount struct { Role string `json:"role"` } type serviceToken struct { + ID int64 `json:"id"` Name string `json:"name"` Role string `json:"role"` } diff --git a/managed/services/management/mock_auth_provider_test.go b/managed/services/management/mock_auth_provider_test.go index 4226363bba..9c4ea9dbaa 100644 --- a/managed/services/management/mock_auth_provider_test.go +++ b/managed/services/management/mock_auth_provider_test.go @@ -104,7 +104,8 @@ func (_m *mockAuthProvider) CreateServiceToken(ctx context.Context, serviceAccou func newMockAuthProvider(t interface { mock.TestingT Cleanup(func()) -}) *mockAuthProvider { +}, +) *mockAuthProvider { mock := &mockAuthProvider{} mock.Mock.Test(t) From 00640593508353c9efa1f54965ddbe8a6c833234 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 11 Oct 2023 15:56:00 +0200 Subject: [PATCH 026/126] PMM-12251 Unregister. --- admin/commands/management/unregister.go | 18 +- .../json/client/node/node_client.go | 41 +++ .../client/node/unregister_node_parameters.go | 144 ++++++++ .../client/node/unregister_node_responses.go | 334 ++++++++++++++++++ api/managementpb/json/managementpb.json | 72 ++++ api/managementpb/node.pb.go | 198 +++++++++-- api/managementpb/node.pb.gw.go | 89 ++++- api/managementpb/node.pb.validate.go | 208 +++++++++++ api/managementpb/node.proto | 20 ++ api/managementpb/node_grpc.pb.go | 42 ++- api/swagger/swagger-dev.json | 72 ++++ api/swagger/swagger.json | 72 ++++ go.mod | 5 + go.sum | 60 ++++ managed/services/grafana/client.go | 26 +- .../services/management/grpc/node_server.go | 5 + .../management/mock_auth_provider_test.go | 14 + managed/services/management/node.go | 22 ++ managed/services/management/node_test.go | 5 +- 19 files changed, 1404 insertions(+), 43 deletions(-) create mode 100644 api/managementpb/json/client/node/unregister_node_parameters.go create mode 100644 api/managementpb/json/client/node/unregister_node_responses.go diff --git a/admin/commands/management/unregister.go b/admin/commands/management/unregister.go index 7632b34433..88cda37fdf 100644 --- a/admin/commands/management/unregister.go +++ b/admin/commands/management/unregister.go @@ -18,10 +18,13 @@ import ( "github.com/pkg/errors" "github.com/percona/pmm/admin/agentlocal" + "github.com/percona/pmm/admin/cli/flags" "github.com/percona/pmm/admin/commands" "github.com/percona/pmm/admin/helpers" - "github.com/percona/pmm/api/inventorypb/json/client" + inventoryClient "github.com/percona/pmm/api/inventorypb/json/client" "github.com/percona/pmm/api/inventorypb/json/client/nodes" + "github.com/percona/pmm/api/managementpb/json/client" + "github.com/percona/pmm/api/managementpb/json/client/node" ) type unregisterResult struct { @@ -45,7 +48,7 @@ type UnregisterCommand struct { NodeName string `help:"Node name (autodetected default: ${hostname})"` } -func (cmd *UnregisterCommand) RunCmd() (commands.Result, error) { +func (cmd *UnregisterCommand) RunCmd(globals *flags.GlobalFlags) (commands.Result, error) { var nodeName string var nodeID string var err error @@ -62,7 +65,7 @@ func (cmd *UnregisterCommand) RunCmd() (commands.Result, error) { } nodeID = status.NodeID - node, err := client.Default.Nodes.GetNode(&nodes.GetNodeParams{ + node, err := inventoryClient.Default.Nodes.GetNode(&nodes.GetNodeParams{ Context: commands.Ctx, Body: nodes.GetNodeBody{ NodeID: nodeID, @@ -77,15 +80,14 @@ func (cmd *UnregisterCommand) RunCmd() (commands.Result, error) { } } - params := &nodes.RemoveNodeParams{ - Body: nodes.RemoveNodeBody{ + params := &node.UnregisterNodeParams{ + Body: node.UnregisterNodeBody{ NodeID: nodeID, - Force: cmd.Force, }, Context: commands.Ctx, } - _, err = client.Default.Nodes.RemoveNode(params) + _, err = client.Default.Node.UnregisterNode(params) if err != nil { return nil, err } @@ -97,7 +99,7 @@ func (cmd *UnregisterCommand) RunCmd() (commands.Result, error) { } func nodeIDFromNodeName(nodeName string) (string, error) { - listNodes, err := client.Default.Nodes.ListNodes(nil) + listNodes, err := inventoryClient.Default.Nodes.ListNodes(nil) if err != nil { return "", err } diff --git a/api/managementpb/json/client/node/node_client.go b/api/managementpb/json/client/node/node_client.go index 49d79d9e66..9a1855222a 100644 --- a/api/managementpb/json/client/node/node_client.go +++ b/api/managementpb/json/client/node/node_client.go @@ -30,6 +30,8 @@ type ClientOption func(*runtime.ClientOperation) type ClientService interface { RegisterNode(params *RegisterNodeParams, opts ...ClientOption) (*RegisterNodeOK, error) + UnregisterNode(params *UnregisterNodeParams, opts ...ClientOption) (*UnregisterNodeOK, error) + SetTransport(transport runtime.ClientTransport) } @@ -72,6 +74,45 @@ func (a *Client) RegisterNode(params *RegisterNodeParams, opts ...ClientOption) return nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code()) } +/* +UnregisterNode unregisters node + +Unregister a Node and pmm-agent +*/ +func (a *Client) UnregisterNode(params *UnregisterNodeParams, opts ...ClientOption) (*UnregisterNodeOK, error) { + // TODO: Validate the params before sending + if params == nil { + params = NewUnregisterNodeParams() + } + op := &runtime.ClientOperation{ + ID: "UnregisterNode", + Method: "POST", + PathPattern: "/v1/management/Node/Unregister", + ProducesMediaTypes: []string{"application/json"}, + ConsumesMediaTypes: []string{"application/json"}, + Schemes: []string{"http", "https"}, + Params: params, + Reader: &UnregisterNodeReader{formats: a.formats}, + Context: params.Context, + Client: params.HTTPClient, + } + for _, opt := range opts { + opt(op) + } + + result, err := a.transport.Submit(op) + if err != nil { + return nil, err + } + success, ok := result.(*UnregisterNodeOK) + if ok { + return success, nil + } + // unexpected success response + unexpectedSuccess := result.(*UnregisterNodeDefault) + return nil, runtime.NewAPIError("unexpected success response: content available as default response in error", unexpectedSuccess, unexpectedSuccess.Code()) +} + // SetTransport changes the transport on the client func (a *Client) SetTransport(transport runtime.ClientTransport) { a.transport = transport diff --git a/api/managementpb/json/client/node/unregister_node_parameters.go b/api/managementpb/json/client/node/unregister_node_parameters.go new file mode 100644 index 0000000000..579b04d3a9 --- /dev/null +++ b/api/managementpb/json/client/node/unregister_node_parameters.go @@ -0,0 +1,144 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package node + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "net/http" + "time" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + cr "github.com/go-openapi/runtime/client" + "github.com/go-openapi/strfmt" +) + +// NewUnregisterNodeParams creates a new UnregisterNodeParams object, +// with the default timeout for this client. +// +// Default values are not hydrated, since defaults are normally applied by the API server side. +// +// To enforce default values in parameter, use SetDefaults or WithDefaults. +func NewUnregisterNodeParams() *UnregisterNodeParams { + return &UnregisterNodeParams{ + timeout: cr.DefaultTimeout, + } +} + +// NewUnregisterNodeParamsWithTimeout creates a new UnregisterNodeParams object +// with the ability to set a timeout on a request. +func NewUnregisterNodeParamsWithTimeout(timeout time.Duration) *UnregisterNodeParams { + return &UnregisterNodeParams{ + timeout: timeout, + } +} + +// NewUnregisterNodeParamsWithContext creates a new UnregisterNodeParams object +// with the ability to set a context for a request. +func NewUnregisterNodeParamsWithContext(ctx context.Context) *UnregisterNodeParams { + return &UnregisterNodeParams{ + Context: ctx, + } +} + +// NewUnregisterNodeParamsWithHTTPClient creates a new UnregisterNodeParams object +// with the ability to set a custom HTTPClient for a request. +func NewUnregisterNodeParamsWithHTTPClient(client *http.Client) *UnregisterNodeParams { + return &UnregisterNodeParams{ + HTTPClient: client, + } +} + +/* +UnregisterNodeParams contains all the parameters to send to the API endpoint + + for the unregister node operation. + + Typically these are written to a http.Request. +*/ +type UnregisterNodeParams struct { + // Body. + Body UnregisterNodeBody + + timeout time.Duration + Context context.Context + HTTPClient *http.Client +} + +// WithDefaults hydrates default values in the unregister node params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *UnregisterNodeParams) WithDefaults() *UnregisterNodeParams { + o.SetDefaults() + return o +} + +// SetDefaults hydrates default values in the unregister node params (not the query body). +// +// All values with no default are reset to their zero value. +func (o *UnregisterNodeParams) SetDefaults() { + // no default values defined for this parameter +} + +// WithTimeout adds the timeout to the unregister node params +func (o *UnregisterNodeParams) WithTimeout(timeout time.Duration) *UnregisterNodeParams { + o.SetTimeout(timeout) + return o +} + +// SetTimeout adds the timeout to the unregister node params +func (o *UnregisterNodeParams) SetTimeout(timeout time.Duration) { + o.timeout = timeout +} + +// WithContext adds the context to the unregister node params +func (o *UnregisterNodeParams) WithContext(ctx context.Context) *UnregisterNodeParams { + o.SetContext(ctx) + return o +} + +// SetContext adds the context to the unregister node params +func (o *UnregisterNodeParams) SetContext(ctx context.Context) { + o.Context = ctx +} + +// WithHTTPClient adds the HTTPClient to the unregister node params +func (o *UnregisterNodeParams) WithHTTPClient(client *http.Client) *UnregisterNodeParams { + o.SetHTTPClient(client) + return o +} + +// SetHTTPClient adds the HTTPClient to the unregister node params +func (o *UnregisterNodeParams) SetHTTPClient(client *http.Client) { + o.HTTPClient = client +} + +// WithBody adds the body to the unregister node params +func (o *UnregisterNodeParams) WithBody(body UnregisterNodeBody) *UnregisterNodeParams { + o.SetBody(body) + return o +} + +// SetBody adds the body to the unregister node params +func (o *UnregisterNodeParams) SetBody(body UnregisterNodeBody) { + o.Body = body +} + +// WriteToRequest writes these params to a swagger request +func (o *UnregisterNodeParams) WriteToRequest(r runtime.ClientRequest, reg strfmt.Registry) error { + if err := r.SetTimeout(o.timeout); err != nil { + return err + } + var res []error + if err := r.SetBodyParam(o.Body); err != nil { + return err + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} diff --git a/api/managementpb/json/client/node/unregister_node_responses.go b/api/managementpb/json/client/node/unregister_node_responses.go new file mode 100644 index 0000000000..066770940e --- /dev/null +++ b/api/managementpb/json/client/node/unregister_node_responses.go @@ -0,0 +1,334 @@ +// Code generated by go-swagger; DO NOT EDIT. + +package node + +// This file was generated by the swagger tool. +// Editing this file might prove futile when you re-run the swagger generate command + +import ( + "context" + "fmt" + "io" + "strconv" + + "github.com/go-openapi/errors" + "github.com/go-openapi/runtime" + "github.com/go-openapi/strfmt" + "github.com/go-openapi/swag" +) + +// UnregisterNodeReader is a Reader for the UnregisterNode structure. +type UnregisterNodeReader struct { + formats strfmt.Registry +} + +// ReadResponse reads a server response into the received o. +func (o *UnregisterNodeReader) ReadResponse(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { + switch response.Code() { + case 200: + result := NewUnregisterNodeOK() + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + return result, nil + default: + result := NewUnregisterNodeDefault(response.Code()) + if err := result.readResponse(response, consumer, o.formats); err != nil { + return nil, err + } + if response.Code()/100 == 2 { + return result, nil + } + return nil, result + } +} + +// NewUnregisterNodeOK creates a UnregisterNodeOK with default headers values +func NewUnregisterNodeOK() *UnregisterNodeOK { + return &UnregisterNodeOK{} +} + +/* +UnregisterNodeOK describes a response with status code 200, with default header values. + +A successful response. +*/ +type UnregisterNodeOK struct { + Payload *UnregisterNodeOKBody +} + +func (o *UnregisterNodeOK) Error() string { + return fmt.Sprintf("[POST /v1/management/Node/Unregister][%d] unregisterNodeOk %+v", 200, o.Payload) +} + +func (o *UnregisterNodeOK) GetPayload() *UnregisterNodeOKBody { + return o.Payload +} + +func (o *UnregisterNodeOK) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + o.Payload = new(UnregisterNodeOKBody) + + // response payload + if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} + +// NewUnregisterNodeDefault creates a UnregisterNodeDefault with default headers values +func NewUnregisterNodeDefault(code int) *UnregisterNodeDefault { + return &UnregisterNodeDefault{ + _statusCode: code, + } +} + +/* +UnregisterNodeDefault describes a response with status code -1, with default header values. + +An unexpected error response. +*/ +type UnregisterNodeDefault struct { + _statusCode int + + Payload *UnregisterNodeDefaultBody +} + +// Code gets the status code for the unregister node default response +func (o *UnregisterNodeDefault) Code() int { + return o._statusCode +} + +func (o *UnregisterNodeDefault) Error() string { + return fmt.Sprintf("[POST /v1/management/Node/Unregister][%d] UnregisterNode default %+v", o._statusCode, o.Payload) +} + +func (o *UnregisterNodeDefault) GetPayload() *UnregisterNodeDefaultBody { + return o.Payload +} + +func (o *UnregisterNodeDefault) readResponse(response runtime.ClientResponse, consumer runtime.Consumer, formats strfmt.Registry) error { + o.Payload = new(UnregisterNodeDefaultBody) + + // response payload + if err := consumer.Consume(response.Body(), o.Payload); err != nil && err != io.EOF { + return err + } + + return nil +} + +/* +UnregisterNodeBody unregister node body +swagger:model UnregisterNodeBody +*/ +type UnregisterNodeBody struct { + // Node_id to be unregistered. + NodeID string `json:"node_id,omitempty"` +} + +// Validate validates this unregister node body +func (o *UnregisterNodeBody) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this unregister node body based on context it is used +func (o *UnregisterNodeBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *UnregisterNodeBody) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *UnregisterNodeBody) UnmarshalBinary(b []byte) error { + var res UnregisterNodeBody + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + +/* +UnregisterNodeDefaultBody unregister node default body +swagger:model UnregisterNodeDefaultBody +*/ +type UnregisterNodeDefaultBody struct { + // code + Code int32 `json:"code,omitempty"` + + // message + Message string `json:"message,omitempty"` + + // details + Details []*UnregisterNodeDefaultBodyDetailsItems0 `json:"details"` +} + +// Validate validates this unregister node default body +func (o *UnregisterNodeDefaultBody) Validate(formats strfmt.Registry) error { + var res []error + + if err := o.validateDetails(formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *UnregisterNodeDefaultBody) validateDetails(formats strfmt.Registry) error { + if swag.IsZero(o.Details) { // not required + return nil + } + + for i := 0; i < len(o.Details); i++ { + if swag.IsZero(o.Details[i]) { // not required + continue + } + + if o.Details[i] != nil { + if err := o.Details[i].Validate(formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("UnregisterNode default" + "." + "details" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("UnregisterNode default" + "." + "details" + "." + strconv.Itoa(i)) + } + return err + } + } + + } + + return nil +} + +// ContextValidate validate this unregister node default body based on the context it is used +func (o *UnregisterNodeDefaultBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + var res []error + + if err := o.contextValidateDetails(ctx, formats); err != nil { + res = append(res, err) + } + + if len(res) > 0 { + return errors.CompositeValidationError(res...) + } + return nil +} + +func (o *UnregisterNodeDefaultBody) contextValidateDetails(ctx context.Context, formats strfmt.Registry) error { + for i := 0; i < len(o.Details); i++ { + if o.Details[i] != nil { + if err := o.Details[i].ContextValidate(ctx, formats); err != nil { + if ve, ok := err.(*errors.Validation); ok { + return ve.ValidateName("UnregisterNode default" + "." + "details" + "." + strconv.Itoa(i)) + } else if ce, ok := err.(*errors.CompositeError); ok { + return ce.ValidateName("UnregisterNode default" + "." + "details" + "." + strconv.Itoa(i)) + } + return err + } + } + } + + return nil +} + +// MarshalBinary interface implementation +func (o *UnregisterNodeDefaultBody) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *UnregisterNodeDefaultBody) UnmarshalBinary(b []byte) error { + var res UnregisterNodeDefaultBody + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + +/* +UnregisterNodeDefaultBodyDetailsItems0 unregister node default body details items0 +swagger:model UnregisterNodeDefaultBodyDetailsItems0 +*/ +type UnregisterNodeDefaultBodyDetailsItems0 struct { + // at type + AtType string `json:"@type,omitempty"` +} + +// Validate validates this unregister node default body details items0 +func (o *UnregisterNodeDefaultBodyDetailsItems0) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this unregister node default body details items0 based on context it is used +func (o *UnregisterNodeDefaultBodyDetailsItems0) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *UnregisterNodeDefaultBodyDetailsItems0) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *UnregisterNodeDefaultBodyDetailsItems0) UnmarshalBinary(b []byte) error { + var res UnregisterNodeDefaultBodyDetailsItems0 + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} + +/* +UnregisterNodeOKBody unregister node OK body +swagger:model UnregisterNodeOKBody +*/ +type UnregisterNodeOKBody struct { + // unregistered + Unregistered bool `json:"unregistered,omitempty"` +} + +// Validate validates this unregister node OK body +func (o *UnregisterNodeOKBody) Validate(formats strfmt.Registry) error { + return nil +} + +// ContextValidate validates this unregister node OK body based on context it is used +func (o *UnregisterNodeOKBody) ContextValidate(ctx context.Context, formats strfmt.Registry) error { + return nil +} + +// MarshalBinary interface implementation +func (o *UnregisterNodeOKBody) MarshalBinary() ([]byte, error) { + if o == nil { + return nil, nil + } + return swag.WriteJSON(o) +} + +// UnmarshalBinary interface implementation +func (o *UnregisterNodeOKBody) UnmarshalBinary(b []byte) error { + var res UnregisterNodeOKBody + if err := swag.ReadJSON(b, &res); err != nil { + return err + } + *o = res + return nil +} diff --git a/api/managementpb/json/managementpb.json b/api/managementpb/json/managementpb.json index 27237a0f4c..7dc3eb5433 100644 --- a/api/managementpb/json/managementpb.json +++ b/api/managementpb/json/managementpb.json @@ -3932,6 +3932,78 @@ } } }, + "/v1/management/Node/Unregister": { + "post": { + "description": "Unregister a Node and pmm-agent", + "tags": [ + "Node" + ], + "summary": "Unregister Node", + "operationId": "UnregisterNode", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "node_id": { + "description": "Node_id to be unregistered.", + "type": "string", + "x-order": 0 + } + } + } + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "unregistered": { + "type": "boolean", + "x-order": 0 + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32", + "x-order": 0 + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "x-order": 0 + } + }, + "additionalProperties": false + }, + "x-order": 2 + }, + "message": { + "type": "string", + "x-order": 1 + } + } + } + } + } + } + }, "/v1/management/PostgreSQL/Add": { "post": { "description": "Adds PostgreSQL Service and starts postgres exporter. It automatically adds a service to inventory, which is running on provided \"node_id\", then adds \"postgres_exporter\" with provided \"pmm_agent_id\" and other parameters.", diff --git a/api/managementpb/node.pb.go b/api/managementpb/node.pb.go index 32423691a4..a3929cce92 100644 --- a/api/managementpb/node.pb.go +++ b/api/managementpb/node.pb.go @@ -283,6 +283,101 @@ func (x *RegisterNodeResponse) GetToken() string { return "" } +type UnregisterNodeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Node_id to be unregistered. + NodeId string `protobuf:"bytes,1,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` +} + +func (x *UnregisterNodeRequest) Reset() { + *x = UnregisterNodeRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_managementpb_node_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UnregisterNodeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UnregisterNodeRequest) ProtoMessage() {} + +func (x *UnregisterNodeRequest) ProtoReflect() protoreflect.Message { + mi := &file_managementpb_node_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UnregisterNodeRequest.ProtoReflect.Descriptor instead. +func (*UnregisterNodeRequest) Descriptor() ([]byte, []int) { + return file_managementpb_node_proto_rawDescGZIP(), []int{2} +} + +func (x *UnregisterNodeRequest) GetNodeId() string { + if x != nil { + return x.NodeId + } + return "" +} + +type UnregisterNodeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Unregistered bool `protobuf:"varint,1,opt,name=unregistered,proto3" json:"unregistered,omitempty"` +} + +func (x *UnregisterNodeResponse) Reset() { + *x = UnregisterNodeResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_managementpb_node_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *UnregisterNodeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UnregisterNodeResponse) ProtoMessage() {} + +func (x *UnregisterNodeResponse) ProtoReflect() protoreflect.Message { + mi := &file_managementpb_node_proto_msgTypes[3] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UnregisterNodeResponse.ProtoReflect.Descriptor instead. +func (*UnregisterNodeResponse) Descriptor() ([]byte, []int) { + return file_managementpb_node_proto_rawDescGZIP(), []int{3} +} + +func (x *UnregisterNodeResponse) GetUnregistered() bool { + if x != nil { + return x.Unregistered + } + return false +} + var File_managementpb_node_proto protoreflect.FileDescriptor var file_managementpb_node_proto_rawDesc = []byte{ @@ -358,7 +453,14 @@ var file_managementpb_node_proto_rawDesc = []byte{ 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0xba, 0x01, 0x0a, 0x04, 0x4e, 0x6f, + 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x30, 0x0a, 0x15, 0x55, 0x6e, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x16, 0x55, + 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x75, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, 0x6e, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x32, 0xf4, 0x02, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0xb1, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, @@ -370,16 +472,28 @@ var file_managementpb_node_proto_rawDesc = []byte{ 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6d, 0x6d, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x2f, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x42, 0x8c, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, - 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0xca, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xe2, - 0x02, 0x16, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0xb7, 0x01, 0x0a, 0x0e, 0x55, 0x6e, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x5e, 0x92, 0x41, 0x32, 0x12, 0x0f, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x1a, 0x1f, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x20, 0x61, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6d, + 0x6d, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, + 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x2f, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x42, 0x8c, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x42, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, + 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, + 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, + 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x0a, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x16, 0x4d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -395,30 +509,34 @@ func file_managementpb_node_proto_rawDescGZIP() []byte { } var ( - file_managementpb_node_proto_msgTypes = make([]protoimpl.MessageInfo, 3) + file_managementpb_node_proto_msgTypes = make([]protoimpl.MessageInfo, 5) file_managementpb_node_proto_goTypes = []interface{}{ (*RegisterNodeRequest)(nil), // 0: management.RegisterNodeRequest (*RegisterNodeResponse)(nil), // 1: management.RegisterNodeResponse - nil, // 2: management.RegisterNodeRequest.CustomLabelsEntry - (inventorypb.NodeType)(0), // 3: inventory.NodeType - (MetricsMode)(0), // 4: management.MetricsMode - (*inventorypb.GenericNode)(nil), // 5: inventory.GenericNode - (*inventorypb.ContainerNode)(nil), // 6: inventory.ContainerNode - (*inventorypb.PMMAgent)(nil), // 7: inventory.PMMAgent + (*UnregisterNodeRequest)(nil), // 2: management.UnregisterNodeRequest + (*UnregisterNodeResponse)(nil), // 3: management.UnregisterNodeResponse + nil, // 4: management.RegisterNodeRequest.CustomLabelsEntry + (inventorypb.NodeType)(0), // 5: inventory.NodeType + (MetricsMode)(0), // 6: management.MetricsMode + (*inventorypb.GenericNode)(nil), // 7: inventory.GenericNode + (*inventorypb.ContainerNode)(nil), // 8: inventory.ContainerNode + (*inventorypb.PMMAgent)(nil), // 9: inventory.PMMAgent } ) var file_managementpb_node_proto_depIdxs = []int32{ - 3, // 0: management.RegisterNodeRequest.node_type:type_name -> inventory.NodeType - 2, // 1: management.RegisterNodeRequest.custom_labels:type_name -> management.RegisterNodeRequest.CustomLabelsEntry - 4, // 2: management.RegisterNodeRequest.metrics_mode:type_name -> management.MetricsMode - 5, // 3: management.RegisterNodeResponse.generic_node:type_name -> inventory.GenericNode - 6, // 4: management.RegisterNodeResponse.container_node:type_name -> inventory.ContainerNode - 7, // 5: management.RegisterNodeResponse.pmm_agent:type_name -> inventory.PMMAgent + 5, // 0: management.RegisterNodeRequest.node_type:type_name -> inventory.NodeType + 4, // 1: management.RegisterNodeRequest.custom_labels:type_name -> management.RegisterNodeRequest.CustomLabelsEntry + 6, // 2: management.RegisterNodeRequest.metrics_mode:type_name -> management.MetricsMode + 7, // 3: management.RegisterNodeResponse.generic_node:type_name -> inventory.GenericNode + 8, // 4: management.RegisterNodeResponse.container_node:type_name -> inventory.ContainerNode + 9, // 5: management.RegisterNodeResponse.pmm_agent:type_name -> inventory.PMMAgent 0, // 6: management.Node.RegisterNode:input_type -> management.RegisterNodeRequest - 1, // 7: management.Node.RegisterNode:output_type -> management.RegisterNodeResponse - 7, // [7:8] is the sub-list for method output_type - 6, // [6:7] is the sub-list for method input_type + 2, // 7: management.Node.UnregisterNode:input_type -> management.UnregisterNodeRequest + 1, // 8: management.Node.RegisterNode:output_type -> management.RegisterNodeResponse + 3, // 9: management.Node.UnregisterNode:output_type -> management.UnregisterNodeResponse + 8, // [8:10] is the sub-list for method output_type + 6, // [6:8] is the sub-list for method input_type 6, // [6:6] is the sub-list for extension type_name 6, // [6:6] is the sub-list for extension extendee 0, // [0:6] is the sub-list for field type_name @@ -455,6 +573,30 @@ func file_managementpb_node_proto_init() { return nil } } + file_managementpb_node_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UnregisterNodeRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_managementpb_node_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UnregisterNodeResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -462,7 +604,7 @@ func file_managementpb_node_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_managementpb_node_proto_rawDesc, NumEnums: 0, - NumMessages: 3, + NumMessages: 5, NumExtensions: 0, NumServices: 1, }, diff --git a/api/managementpb/node.pb.gw.go b/api/managementpb/node.pb.gw.go index 3107389032..988d0a2e24 100644 --- a/api/managementpb/node.pb.gw.go +++ b/api/managementpb/node.pb.gw.go @@ -65,6 +65,38 @@ func local_request_Node_RegisterNode_0(ctx context.Context, marshaler runtime.Ma return msg, metadata, err } +func request_Node_UnregisterNode_0(ctx context.Context, marshaler runtime.Marshaler, client NodeClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UnregisterNodeRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := client.UnregisterNode(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_Node_UnregisterNode_0(ctx context.Context, marshaler runtime.Marshaler, server NodeServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq UnregisterNodeRequest + var metadata runtime.ServerMetadata + + newReader, berr := utilities.IOReaderFactory(req.Body) + if berr != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) + } + if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + msg, err := server.UnregisterNode(ctx, &protoReq) + return msg, metadata, err +} + // RegisterNodeHandlerServer registers the http handlers for service Node to "mux". // UnaryRPC :call NodeServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -94,6 +126,30 @@ func RegisterNodeHandlerServer(ctx context.Context, mux *runtime.ServeMux, serve forward_Node_RegisterNode_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle("POST", pattern_Node_UnregisterNode_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/management.Node/UnregisterNode", runtime.WithHTTPPathPattern("/v1/management/Node/Unregister")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Node_UnregisterNode_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Node_UnregisterNode_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil } @@ -155,9 +211,38 @@ func RegisterNodeHandlerClient(ctx context.Context, mux *runtime.ServeMux, clien forward_Node_RegisterNode_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle("POST", pattern_Node_UnregisterNode_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + var err error + var annotatedContext context.Context + annotatedContext, err = runtime.AnnotateContext(ctx, mux, req, "/management.Node/UnregisterNode", runtime.WithHTTPPathPattern("/v1/management/Node/Unregister")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Node_UnregisterNode_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + + forward_Node_UnregisterNode_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) + return nil } -var pattern_Node_RegisterNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "management", "Node", "Register"}, "")) +var ( + pattern_Node_RegisterNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "management", "Node", "Register"}, "")) + + pattern_Node_UnregisterNode_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "management", "Node", "Unregister"}, "")) +) + +var ( + forward_Node_RegisterNode_0 = runtime.ForwardResponseMessage -var forward_Node_RegisterNode_0 = runtime.ForwardResponseMessage + forward_Node_UnregisterNode_0 = runtime.ForwardResponseMessage +) diff --git a/api/managementpb/node.pb.validate.go b/api/managementpb/node.pb.validate.go index 7f6f8707aa..9fbe4f0c76 100644 --- a/api/managementpb/node.pb.validate.go +++ b/api/managementpb/node.pb.validate.go @@ -370,3 +370,211 @@ var _ interface { Cause() error ErrorName() string } = RegisterNodeResponseValidationError{} + +// Validate checks the field values on UnregisterNodeRequest with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *UnregisterNodeRequest) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on UnregisterNodeRequest with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// UnregisterNodeRequestMultiError, or nil if none found. +func (m *UnregisterNodeRequest) ValidateAll() error { + return m.validate(true) +} + +func (m *UnregisterNodeRequest) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for NodeId + + if len(errors) > 0 { + return UnregisterNodeRequestMultiError(errors) + } + + return nil +} + +// UnregisterNodeRequestMultiError is an error wrapping multiple validation +// errors returned by UnregisterNodeRequest.ValidateAll() if the designated +// constraints aren't met. +type UnregisterNodeRequestMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m UnregisterNodeRequestMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m UnregisterNodeRequestMultiError) AllErrors() []error { return m } + +// UnregisterNodeRequestValidationError is the validation error returned by +// UnregisterNodeRequest.Validate if the designated constraints aren't met. +type UnregisterNodeRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e UnregisterNodeRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e UnregisterNodeRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e UnregisterNodeRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e UnregisterNodeRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e UnregisterNodeRequestValidationError) ErrorName() string { + return "UnregisterNodeRequestValidationError" +} + +// Error satisfies the builtin error interface +func (e UnregisterNodeRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sUnregisterNodeRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = UnregisterNodeRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = UnregisterNodeRequestValidationError{} + +// Validate checks the field values on UnregisterNodeResponse with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *UnregisterNodeResponse) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on UnregisterNodeResponse with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// UnregisterNodeResponseMultiError, or nil if none found. +func (m *UnregisterNodeResponse) ValidateAll() error { + return m.validate(true) +} + +func (m *UnregisterNodeResponse) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + // no validation rules for Unregistered + + if len(errors) > 0 { + return UnregisterNodeResponseMultiError(errors) + } + + return nil +} + +// UnregisterNodeResponseMultiError is an error wrapping multiple validation +// errors returned by UnregisterNodeResponse.ValidateAll() if the designated +// constraints aren't met. +type UnregisterNodeResponseMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m UnregisterNodeResponseMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m UnregisterNodeResponseMultiError) AllErrors() []error { return m } + +// UnregisterNodeResponseValidationError is the validation error returned by +// UnregisterNodeResponse.Validate if the designated constraints aren't met. +type UnregisterNodeResponseValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e UnregisterNodeResponseValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e UnregisterNodeResponseValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e UnregisterNodeResponseValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e UnregisterNodeResponseValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e UnregisterNodeResponseValidationError) ErrorName() string { + return "UnregisterNodeResponseValidationError" +} + +// Error satisfies the builtin error interface +func (e UnregisterNodeResponseValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sUnregisterNodeResponse.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = UnregisterNodeResponseValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = UnregisterNodeResponseValidationError{} diff --git a/api/managementpb/node.proto b/api/managementpb/node.proto index b588f405e3..94186c62f6 100644 --- a/api/managementpb/node.proto +++ b/api/managementpb/node.proto @@ -56,6 +56,15 @@ message RegisterNodeResponse { string token = 4; } +message UnregisterNodeRequest { + // Node_id to be unregistered. + string node_id = 1; +} + +message UnregisterNodeResponse { + bool unregistered = 1; +} + // Node service provides public Management API methods for Nodes. service Node { // RegisterNode registers a new Node, pmm-agent and create service account and it's token. @@ -69,4 +78,15 @@ service Node { description: "Registers a new Node and pmm-agent." }; } + // UnregisterNode unregister a Node,pmm-agent and remove service account and it's token. + rpc UnregisterNode(UnregisterNodeRequest) returns (UnregisterNodeResponse) { + option (google.api.http) = { + post: "/v1/management/Node/Unregister" + body: "*" + }; + option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = { + summary: "Unregister Node" + description: "Unregister a Node and pmm-agent" + }; + } } diff --git a/api/managementpb/node_grpc.pb.go b/api/managementpb/node_grpc.pb.go index fb4ace9f19..71b511fd34 100644 --- a/api/managementpb/node_grpc.pb.go +++ b/api/managementpb/node_grpc.pb.go @@ -20,7 +20,8 @@ import ( const _ = grpc.SupportPackageIsVersion7 const ( - Node_RegisterNode_FullMethodName = "/management.Node/RegisterNode" + Node_RegisterNode_FullMethodName = "/management.Node/RegisterNode" + Node_UnregisterNode_FullMethodName = "/management.Node/UnregisterNode" ) // NodeClient is the client API for Node service. @@ -29,6 +30,8 @@ const ( type NodeClient interface { // RegisterNode registers a new Node, pmm-agent and create service account and it's token. RegisterNode(ctx context.Context, in *RegisterNodeRequest, opts ...grpc.CallOption) (*RegisterNodeResponse, error) + // UnregisterNode unregister a Node,pmm-agent and remove service account and it's token. + UnregisterNode(ctx context.Context, in *UnregisterNodeRequest, opts ...grpc.CallOption) (*UnregisterNodeResponse, error) } type nodeClient struct { @@ -48,12 +51,23 @@ func (c *nodeClient) RegisterNode(ctx context.Context, in *RegisterNodeRequest, return out, nil } +func (c *nodeClient) UnregisterNode(ctx context.Context, in *UnregisterNodeRequest, opts ...grpc.CallOption) (*UnregisterNodeResponse, error) { + out := new(UnregisterNodeResponse) + err := c.cc.Invoke(ctx, Node_UnregisterNode_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // NodeServer is the server API for Node service. // All implementations must embed UnimplementedNodeServer // for forward compatibility type NodeServer interface { // RegisterNode registers a new Node, pmm-agent and create service account and it's token. RegisterNode(context.Context, *RegisterNodeRequest) (*RegisterNodeResponse, error) + // UnregisterNode unregister a Node,pmm-agent and remove service account and it's token. + UnregisterNode(context.Context, *UnregisterNodeRequest) (*UnregisterNodeResponse, error) mustEmbedUnimplementedNodeServer() } @@ -63,6 +77,10 @@ type UnimplementedNodeServer struct{} func (UnimplementedNodeServer) RegisterNode(context.Context, *RegisterNodeRequest) (*RegisterNodeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method RegisterNode not implemented") } + +func (UnimplementedNodeServer) UnregisterNode(context.Context, *UnregisterNodeRequest) (*UnregisterNodeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method UnregisterNode not implemented") +} func (UnimplementedNodeServer) mustEmbedUnimplementedNodeServer() {} // UnsafeNodeServer may be embedded to opt out of forward compatibility for this service. @@ -94,6 +112,24 @@ func _Node_RegisterNode_Handler(srv interface{}, ctx context.Context, dec func(i return interceptor(ctx, in, info, handler) } +func _Node_UnregisterNode_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UnregisterNodeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(NodeServer).UnregisterNode(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Node_UnregisterNode_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(NodeServer).UnregisterNode(ctx, req.(*UnregisterNodeRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Node_ServiceDesc is the grpc.ServiceDesc for Node service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -105,6 +141,10 @@ var Node_ServiceDesc = grpc.ServiceDesc{ MethodName: "RegisterNode", Handler: _Node_RegisterNode_Handler, }, + { + MethodName: "UnregisterNode", + Handler: _Node_UnregisterNode_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "managementpb/node.proto", diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index 455d7d8244..b45b07b00a 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -27465,6 +27465,78 @@ } } }, + "/v1/management/Node/Unregister": { + "post": { + "description": "Unregister a Node and pmm-agent", + "tags": [ + "Node" + ], + "summary": "Unregister Node", + "operationId": "UnregisterNode", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "node_id": { + "description": "Node_id to be unregistered.", + "type": "string", + "x-order": 0 + } + } + } + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "unregistered": { + "type": "boolean", + "x-order": 0 + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32", + "x-order": 0 + }, + "message": { + "type": "string", + "x-order": 1 + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "x-order": 0 + } + }, + "additionalProperties": false + }, + "x-order": 2 + } + } + } + } + } + } + }, "/v1/management/PostgreSQL/Add": { "post": { "description": "Adds PostgreSQL Service and starts postgres exporter. It automatically adds a service to inventory, which is running on provided \"node_id\", then adds \"postgres_exporter\" with provided \"pmm_agent_id\" and other parameters.", diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index 804ca28f61..58e7cb948a 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -18634,6 +18634,78 @@ } } }, + "/v1/management/Node/Unregister": { + "post": { + "description": "Unregister a Node and pmm-agent", + "tags": [ + "Node" + ], + "summary": "Unregister Node", + "operationId": "UnregisterNode", + "parameters": [ + { + "name": "body", + "in": "body", + "required": true, + "schema": { + "type": "object", + "properties": { + "node_id": { + "description": "Node_id to be unregistered.", + "type": "string", + "x-order": 0 + } + } + } + } + ], + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "type": "object", + "properties": { + "unregistered": { + "type": "boolean", + "x-order": 0 + } + } + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32", + "x-order": 0 + }, + "message": { + "type": "string", + "x-order": 1 + }, + "details": { + "type": "array", + "items": { + "type": "object", + "properties": { + "@type": { + "type": "string", + "x-order": 0 + } + }, + "additionalProperties": false + }, + "x-order": 2 + } + } + } + } + } + } + }, "/v1/management/PostgreSQL/Add": { "post": { "description": "Adds PostgreSQL Service and starts postgres exporter. It automatically adds a service to inventory, which is running on provided \"node_id\", then adds \"postgres_exporter\" with provided \"pmm_agent_id\" and other parameters.", diff --git a/go.mod b/go.mod index 1b3bc8f9a0..28709ab652 100644 --- a/go.mod +++ b/go.mod @@ -79,6 +79,7 @@ require ( golang.org/x/sys v0.13.0 golang.org/x/text v0.13.0 golang.org/x/tools v0.14.0 + google.golang.org/api v0.126.0 google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d google.golang.org/grpc v1.58.0 @@ -97,6 +98,8 @@ require ( ) require ( + cloud.google.com/go/compute v1.23.0 // indirect + cloud.google.com/go/compute/metadata v0.2.3 // indirect github.com/Azure/azure-pipeline-go v0.2.3 // indirect github.com/Azure/azure-storage-blob-go v0.14.0 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect @@ -114,7 +117,9 @@ require ( github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.2.0 // indirect + github.com/google/s2a-go v0.1.4 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.2 // indirect github.com/imdario/mergo v0.3.12 // indirect diff --git a/go.sum b/go.sum index 923b1f12ae..33712d5e3a 100644 --- a/go.sum +++ b/go.sum @@ -13,12 +13,17 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= +cloud.google.com/go v0.110.6 h1:8uYAkj3YHTP/1iwReuHPxLSbdcyc+dSBbzFMrVwDR6Q= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= +cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= +cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= +cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= +cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -49,12 +54,14 @@ github.com/Azure/azure-storage-blob-go v0.13.0/go.mod h1:pA9kNqtjUeQF2zOSu4s//nU github.com/Azure/azure-storage-blob-go v0.14.0 h1:1BCg74AmVdYwO3dlKwtFU1V0wU2PZdREkXvAmZJRUlM= github.com/Azure/azure-storage-blob-go v0.14.0/go.mod h1:SMqIBi+SuiQH32bvyjngEewEeXoPfKMgWlBDaYf6fck= github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0= +github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest v0.11.28 h1:ndAExarwr5Y+GaHE6VCaY1kyS/HwwGGyuimVhWsHOEM= github.com/Azure/go-autorest/autorest/adal v0.9.2/go.mod h1:/3SMAM86bP6wC9Ev35peQDUeqFZBMH07vvUOmg4z/fE= github.com/Azure/go-autorest/autorest/adal v0.9.13/go.mod h1:W/MM4U6nLxnIskrw4UwWzlHfGjwUS50aOsc/I3yuU8M= github.com/Azure/go-autorest/autorest/adal v0.9.21 h1:jjQnVFXPfekaqb8vIsv2G1lxshoW+oGv4MDlhRtnYZk= +github.com/Azure/go-autorest/autorest/adal v0.9.21/go.mod h1:zua7mBUaCc5YnSLKYgGJR/w5ePdMDA6H56upLsHzA9U= github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= @@ -91,10 +98,12 @@ github.com/Percona-Lab/spec v0.20.5-percona/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5i github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/assert/v2 v2.1.0 h1:tbredtNcQnoSd3QBhQWI7QZ3XHOVkw1Moklp2ojoH/0= +github.com/alecthomas/assert/v2 v2.1.0/go.mod h1:b/+1DI2Q6NckYi+3mXyH3wFb8qG37K/DuK80n7WefXA= github.com/alecthomas/kingpin v2.2.6+incompatible/go.mod h1:59OFYbFVLKQKq+mqrL6Rw5bR0c3ACQaawgXx0QYndlE= github.com/alecthomas/kong v0.8.0 h1:ryDCzutfIqJPnNn0omnrgHLbAggDQM2VWHikE1xqK7s= github.com/alecthomas/kong v0.8.0/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U= github.com/alecthomas/repr v0.1.0 h1:ENn2e1+J3k09gyj2shc0dHr/yjaWSHRlrJ4DPMevDqE= +github.com/alecthomas/repr v0.1.0/go.mod h1:2kn6fqh/zIyPLmm3ugklbEi5hg5wS435eygvNfaDQL8= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -106,6 +115,7 @@ github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8V github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= @@ -162,6 +172,11 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= +github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= +github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= @@ -176,7 +191,9 @@ github.com/denisenkom/go-mssqldb v0.9.0 h1:RSohk2RsiZqLZ0zCjtfn3S4Gp4exhpBWHyQ7D github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dhui/dktest v0.3.16 h1:i6gq2YQEtcrjKbeJpBkWjE8MmLZPYllcjOFbTZuPDnw= +github.com/dhui/dktest v0.3.16/go.mod h1:gYaA3LRmM8Z4vJl2MA0THIigJoZrwOansEOsp+kqxp0= github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI= +github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ= github.com/docker/distribution v2.7.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/distribution v2.8.2+incompatible h1:T3de5rq0dB1j30rp0sA2rER+m322EBzniBPB6ZIzuh8= github.com/docker/distribution v2.8.2+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= @@ -195,6 +212,8 @@ github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= +github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= @@ -207,6 +226,8 @@ github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/ github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/frankban/quicktest v1.5.0/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-co-op/gocron v1.35.1 h1:xi0tfAhxeAmGUKkjiA7bTIjh2VdBJpUYDJ+lPx/EPcM= github.com/go-co-op/gocron v1.35.1/go.mod h1:NLi+bkm4rRSy1F8U7iacZOz0xPseMoIOnvabGoSe/no= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= @@ -238,6 +259,7 @@ github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbV github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/zapr v1.2.3 h1:a9vnzlIBPQBBkeaR9IuMUfmVOrQlkoC4YfPoFkX3T7A= +github.com/go-logr/zapr v1.2.3/go.mod h1:eIauM6P8qSvTw5o2ez6UEAfGjQKrxQTl5EoK+Qa2oG4= github.com/go-openapi/analysis v0.21.2/go.mod h1:HZwRk4RRisyG8vx2Oe6aqeSQcoxRp47Xkp3+K6q+LdY= github.com/go-openapi/analysis v0.21.4 h1:ZDFLvSNxpDaomuCueM0BlSXxpANBlFYiBvr+GXrvIHc= github.com/go-openapi/analysis v0.21.4/go.mod h1:4zQ35W4neeZTqh3ol0rv/O8JBbka9QyAgQRPp9y3pfo= @@ -277,6 +299,7 @@ github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrt github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls= github.com/gobs/pretty v0.0.0-20180724170744-09732c25a95b h1:/vQ+oYKu+JoyaMPDsv5FzwuL2wwWBgBbtj/YLCi4LuA= github.com/gobs/pretty v0.0.0-20180724170744-09732c25a95b/go.mod h1:Xo4aNUOrJnVruqWQJBtW6+bTBDTniY8yZum5rF3b5jw= github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd/go.mod h1:4duuawTqi2wkkpB4ePgWMaai6/Kc6WEz83bhFwpHzj0= @@ -320,6 +343,7 @@ github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe/go.mod h1:8vg3r2V github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/glog v1.1.0 h1:/d3pCKDPWNnvIWe0vVUpNP32qc8U3PDVxySP/y360qE= +github.com/golang/glog v1.1.0/go.mod h1:pfYeQZ3JWZoXTV5sFc986z3HTpwQs9At6P4ImfuP3NQ= github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= @@ -333,6 +357,7 @@ github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw= github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= +github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= @@ -348,6 +373,7 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -385,14 +411,20 @@ github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= +github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= +github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= +github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -401,6 +433,7 @@ github.com/grafana/grafana-api-golang-client v0.24.0 h1:9cUvft7xCMnnL/Uscwy7eold github.com/grafana/grafana-api-golang-client v0.24.0/go.mod h1:24W29gPe9yl0/3A9X624TPkAOR8DpHno490cPwnkv8E= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= +github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -436,6 +469,7 @@ github.com/hashicorp/golang-lru/v2 v2.0.2/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyf github.com/hashicorp/memberlist v0.5.0 h1:EtYPN8DpAURiapus508I4n9CzHs2W+8NZGbmmR/prTM= github.com/hashicorp/memberlist v0.5.0/go.mod h1:yvyXLpo0QaGE59Y7hDTsTzDD25JYBZ4mHgHUZ8lrOI0= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= @@ -496,6 +530,7 @@ github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORN github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -535,6 +570,7 @@ github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOq github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y= +github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -560,6 +596,7 @@ github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= +github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= @@ -574,6 +611,7 @@ github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJ github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b h1:1XF24mVaiu7u+CFywTdcDo2ie1pzzhwjt6RHqzpMU34= github.com/muesli/ansi v0.0.0-20211018074035-2e021307bc4b/go.mod h1:fQuZ0gauxyBcmsdE3ZT4NasjaRdxmbCS0jRHsrWu3Ho= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= @@ -597,7 +635,9 @@ github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= github.com/onsi/ginkgo/v2 v2.9.4 h1:xR7vG4IXt5RWx6FfIjyAtsoMAtnc3C/rFXBBd2AjZwE= +github.com/onsi/ginkgo/v2 v2.9.4/go.mod h1:gCQYp2Q+kSoIj7ykSVb9nskRSsR6PUj4AiLywzIhbKM= github.com/onsi/gomega v1.27.6 h1:ENqfyGeS5AX/rlXDd/ETokDz93u0YufY1Pgxuy/PvWE= +github.com/onsi/gomega v1.27.6/go.mod h1:PIQNjfQwkP3aQAH7lf7j87O/5FiNr+ZR8+ipb+qQlhg= github.com/opencontainers/go-digest v1.0.0-rc1/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= @@ -701,12 +741,14 @@ github.com/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab h1:ZjX6I48eZSFetP github.com/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab/go.mod h1:/PfPXh0EntGc3QAAyUaviy4S9tzy4Zp0e2ilq4voC6E= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= +github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.1/go.mod h1:JeRgkft04UBgHMgCIwADu4Pn6Mtm5d4nPKWu0nJ5d+o= github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= +github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/ryanuber/columnize v2.1.0+incompatible/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= @@ -744,6 +786,7 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -793,8 +836,10 @@ go.opentelemetry.io/otel v1.16.0/go.mod h1:vl0h9NUa1D5s1nv3A5vZOYWn8av4K8Ml6JDeH go.opentelemetry.io/otel/metric v1.16.0 h1:RbrpwVG1Hfv85LgnZ7+txXioPDoh6EdbZHo26Q3hqOo= go.opentelemetry.io/otel/metric v1.16.0/go.mod h1:QE47cpOmkwipPiefDwo2wDzwJrlfxxNYodqc4xnGCo4= go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvxGzY= +go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM= go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= +go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20230717150657-8a3343210976 h1:7ljYNcZU84T2N0tZdDgvL7U3M4iFmglAUUU1gRFE/2Q= go.starlark.net v0.0.0-20230717150657-8a3343210976/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -804,8 +849,10 @@ go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0 go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI= +go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= +go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -820,6 +867,7 @@ golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= @@ -1056,6 +1104,7 @@ golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gomodules.xyz/jsonpatch/v2 v2.2.0 h1:4pT439QV83L+G9FkcCriY6EkpcK6r6bK+A5FBUMI7qY= +gomodules.xyz/jsonpatch/v2 v2.2.0/go.mod h1:WXp+iVDkoLQqPudfQ9GBlwB2eZ5DKOnjQZCYdOS8GPY= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.8.2 h1:CCXrcPKiGGotvnN6jfUsKk4rRqm7q09/YbKb5xCEvtM= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= @@ -1077,6 +1126,8 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= +google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= +google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1109,6 +1160,7 @@ google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= +google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -1133,6 +1185,9 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= +google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= +google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= +google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1167,6 +1222,7 @@ gopkg.in/reform.v1 v1.5.1/go.mod h1:AIv0CbDRJ0ljQwptGeaIXfpDRo02uJwTq92aMFELEeU= gopkg.in/tomb.v2 v2.0.0-20140626144623-14b3d72120e8/go.mod h1:BHsqpu/nsuzkT5BpiH1EMZPLyqSMM8JbIavyFACoFNk= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1213,7 +1269,9 @@ modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0= modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw= modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY= modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= +modernc.org/ccorpus v1.11.6/go.mod h1:2gEUTrWqdpH2pXsmTM1ZkjeSrUWDpjMu2T6m29L/ErQ= modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= +modernc.org/httpfs v1.0.6/go.mod h1:7dosgurJGp0sPaRanU53W4xZYKh14wfzX420oZADeHM= modernc.org/libc v1.24.1 h1:uvJSeCKL/AgzBo2yYIPPTy82v21KgGnizcGYfBHaNuM= modernc.org/libc v1.24.1/go.mod h1:FmfO1RLrU3MHJfyi9eYYmZBfi/R+tqZ6+hQ3yQQUkak= modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ= @@ -1227,9 +1285,11 @@ modernc.org/sqlite v1.26.0/go.mod h1:FL3pVXie73rg3Rii6V/u5BoHlSoyeZeIgKZEgHARyCU modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY= modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw= modernc.org/tcl v1.15.2 h1:C4ybAYCGJw968e+Me18oW55kD/FexcHbqH2xak1ROSY= +modernc.org/tcl v1.15.2/go.mod h1:3+k/ZaEbKrC8ePv8zJWPtBSW0V7Gg9g8rkmhI1Kfs3c= modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg= modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM= modernc.org/z v1.7.3 h1:zDJf6iHjrnB+WRD88stbXokugjyc0/pB91ri1gO6LZY= +modernc.org/z v1.7.3/go.mod h1:Ipv4tsdxZRbQyLq9Q1M6gdbkxYzdlrciF2Hi/lS7nWE= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index fd36493342..ff884c0ddf 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -366,6 +366,19 @@ func (c *Client) getRoleForServiceToken(ctx context.Context, authHeaders http.He return c.convertRole(role), nil } +func (c *Client) getIDForServiceAccount(ctx context.Context, authHeaders http.Header) (int64, error) { + var k map[string]interface{} + if err := c.do(ctx, http.MethodGet, "/api/auth/serviceaccount", "", authHeaders, nil, &k); err != nil { + return 0, err + } + + if id, _ := k["orgId"].(float64); id != 1 { + return 0, nil + } + + return int64(k["id"].(float64)), nil +} + func (c *Client) testCreateUser(ctx context.Context, login string, role role, authHeaders http.Header) (int, error) { // https://grafana.com/docs/http_api/admin/#global-users b, err := json.Marshal(map[string]string{ @@ -477,13 +490,20 @@ func (c *Client) CreateServiceToken(ctx context.Context, serviceAccountID int64) return serviceTokenID, serviceToken, nil } -// DeleteServiceAccount deletes service account by ID. -func (c *Client) DeleteServiceAccount(ctx context.Context, id int64) error { +// DeleteServiceAccount deletes service account by current service token. +func (c *Client) DeleteServiceAccount(ctx context.Context) error { authHeaders, err := c.authHeadersFromContext(ctx) if err != nil { return err } - return c.deleteServiceAccount(ctx, id, authHeaders) + + serviceAccountID, err := c.getIDForServiceAccount(ctx, authHeaders) + if err != nil { + return err + } + // TO DO add check of tokens + + return c.deleteServiceAccount(ctx, serviceAccountID, authHeaders) } // CreateAlertRule creates Grafana alert rule. diff --git a/managed/services/management/grpc/node_server.go b/managed/services/management/grpc/node_server.go index 1191ee3081..0136fa8195 100644 --- a/managed/services/management/grpc/node_server.go +++ b/managed/services/management/grpc/node_server.go @@ -38,3 +38,8 @@ func NewManagementNodeServer(s *management.NodeService) managementpb.NodeServer func (s *nodeServer) RegisterNode(ctx context.Context, req *managementpb.RegisterNodeRequest) (*managementpb.RegisterNodeResponse, error) { return s.svc.Register(ctx, req) } + +// UnregisterNode do unregistration of the Node. +func (s *nodeServer) UnregisterNode(ctx context.Context, req *managementpb.UnregisterNodeRequest) (*managementpb.UnregisterNodeResponse, error) { + return s.svc.Unregister(ctx, req) +} diff --git a/managed/services/management/mock_auth_provider_test.go b/managed/services/management/mock_auth_provider_test.go index 9c4ea9dbaa..1d189ddd72 100644 --- a/managed/services/management/mock_auth_provider_test.go +++ b/managed/services/management/mock_auth_provider_test.go @@ -99,6 +99,20 @@ func (_m *mockAuthProvider) CreateServiceToken(ctx context.Context, serviceAccou return r0, r1, r2 } +// DeleteServiceAccount provides a mock function with given fields: ctx +func (_m *mockAuthProvider) DeleteServiceAccount(ctx context.Context) error { + ret := _m.Called(ctx) + + var r0 error + if rf, ok := ret.Get(0).(func(context.Context) error); ok { + r0 = rf(ctx) + } else { + r0 = ret.Error(0) + } + + return r0 +} + // newMockAuthProvider creates a new instance of mockAuthProvider. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. // The first argument is typically a *testing.T value. func newMockAuthProvider(t interface { diff --git a/managed/services/management/node.go b/managed/services/management/node.go index fb474c5d1a..f45be7ed6f 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -35,6 +35,7 @@ type authProvider interface { CreateAdminAPIKey(ctx context.Context, name string) (int64, string, error) CreateServiceAccount(ctx context.Context) (int64, error) CreateServiceToken(ctx context.Context, serviceAccountID int64) (int64, string, error) + DeleteServiceAccount(ctx context.Context) error } // NodeService represents service for working with nodes. @@ -151,3 +152,24 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo return res, nil } + +// Unregister do unregistration of the node. +func (s *NodeService) Unregister(ctx context.Context, req *managementpb.UnregisterNodeRequest) (*managementpb.UnregisterNodeResponse, error) { + res := &managementpb.UnregisterNodeResponse{ + Unregistered: true, + } + + e := s.db.InTransaction(func(tx *reform.TX) error { + return models.RemoveNode(tx.Querier, req.NodeId, models.RemoveCascade) + }) + if e != nil { + return nil, e + } + + e = s.ap.DeleteServiceAccount(ctx) + if e != nil { + return nil, e + } + + return res, nil +} diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index 4752be6b7a..c47ce98012 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -36,7 +36,7 @@ import ( ) func TestNodeService(t *testing.T) { - t.Run("Register", func(t *testing.T) { + t.Run("Register/Unregister", func(t *testing.T) { setup := func(t *testing.T) (ctx context.Context, s *NodeService, teardown func(t *testing.T)) { t.Helper() @@ -59,6 +59,7 @@ func TestNodeService(t *testing.T) { serviceTokenID := int64(1) authProvider.On("CreateServiceAccount", ctx).Return(serviceAccountID, nil) authProvider.On("CreateServiceToken", ctx, serviceAccountID).Return(serviceTokenID, "test-token", nil) + authProvider.On("DeleteServiceAccount", ctx).Return(nil) s = NewNodeService(db, &authProvider) @@ -151,6 +152,8 @@ func TestNodeService(t *testing.T) { assert.Equal(t, expected, res) assert.NoError(t, err) }) + + // TODO unregister tests }) }) } From c99246e03adf3aefe403bd3cccbb23ad491de0dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 11 Oct 2023 15:56:46 +0200 Subject: [PATCH 027/126] PMM-12251 Tidy. --- go.mod | 5 ----- go.sum | 31 ------------------------------- 2 files changed, 36 deletions(-) diff --git a/go.mod b/go.mod index 28709ab652..1b3bc8f9a0 100644 --- a/go.mod +++ b/go.mod @@ -79,7 +79,6 @@ require ( golang.org/x/sys v0.13.0 golang.org/x/text v0.13.0 golang.org/x/tools v0.14.0 - google.golang.org/api v0.126.0 google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d google.golang.org/grpc v1.58.0 @@ -98,8 +97,6 @@ require ( ) require ( - cloud.google.com/go/compute v1.23.0 // indirect - cloud.google.com/go/compute/metadata v0.2.3 // indirect github.com/Azure/azure-pipeline-go v0.2.3 // indirect github.com/Azure/azure-storage-blob-go v0.14.0 // indirect github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect @@ -117,9 +114,7 @@ require ( github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.5.9 // indirect github.com/google/gofuzz v1.2.0 // indirect - github.com/google/s2a-go v0.1.4 // indirect github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect - github.com/googleapis/enterprise-certificate-proxy v0.2.3 // indirect github.com/hashicorp/go-uuid v1.0.2 // indirect github.com/hashicorp/golang-lru/v2 v2.0.2 // indirect github.com/imdario/mergo v0.3.12 // indirect diff --git a/go.sum b/go.sum index 33712d5e3a..7ad41af604 100644 --- a/go.sum +++ b/go.sum @@ -13,17 +13,12 @@ cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKV cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs= cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc= cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY= -cloud.google.com/go v0.110.6 h1:8uYAkj3YHTP/1iwReuHPxLSbdcyc+dSBbzFMrVwDR6Q= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg= cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc= cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ= -cloud.google.com/go/compute v1.23.0 h1:tP41Zoavr8ptEqaW6j+LQOnyBBhO7OkOMAGrgLopTwY= -cloud.google.com/go/compute v1.23.0/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= -cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= -cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE= cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= @@ -115,7 +110,6 @@ github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8V github.com/andybalholm/brotli v1.0.5 h1:8uQZIdzKmjc/iuPu7O2ioW48L81FgatrcpfFmiq/cCs= github.com/andybalholm/brotli v1.0.5/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= -github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= github.com/armon/go-metrics v0.4.0 h1:yCQqn7dwca4ITXb+CbubHmedzaQYHhNhrEXLYUeEe8Q= github.com/armon/go-metrics v0.4.0/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= @@ -172,11 +166,6 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg= github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= -github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81 h1:q2hJAaP1k2wIvVRd/hEHD7lacgqrCPS+k8g1MndzfWY= github.com/containerd/console v1.0.4-0.20230313162750-1ae8d489ac81/go.mod h1:YynlIjWYF8myEu6sdkwKIvGQq+cOckRm6So2avqoYAk= @@ -212,8 +201,6 @@ github.com/emicklei/go-restful/v3 v3.9.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= -github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= -github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE= @@ -227,7 +214,6 @@ github.com/form3tech-oss/jwt-go v3.2.2+incompatible/go.mod h1:pbq4aXjuKjdthFRnoD github.com/frankban/quicktest v1.5.0/go.mod h1:jaStnuzAqU1AJdCO0l53JDCJrVDKcS03DbaAcR7Ks/o= github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= -github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/go-co-op/gocron v1.35.1 h1:xi0tfAhxeAmGUKkjiA7bTIjh2VdBJpUYDJ+lPx/EPcM= github.com/go-co-op/gocron v1.35.1/go.mod h1:NLi+bkm4rRSy1F8U7iacZOz0xPseMoIOnvabGoSe/no= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= @@ -373,7 +359,6 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= -github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= @@ -413,18 +398,13 @@ github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hf github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26 h1:Xim43kblpZXfIBQsbuBVKCudVG457BR2GZFIz3uw3hQ= github.com/google/pprof v0.0.0-20221118152302-e6195bd50e26/go.mod h1:dDKJzRmX4S37WGHujM7tX//fmj1uioxKzKxz3lo4HJo= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= -github.com/google/s2a-go v0.1.4 h1:1kZ/sQM3srePvKs3tXAvQzo66XfcReoqFpIpIccE7Oc= -github.com/google/s2a-go v0.1.4/go.mod h1:Ej+mSEMGRnqRzjc7VtF+jdBwYG5fuJfiZ8ELkjEwM0A= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4= github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/googleapis/enterprise-certificate-proxy v0.2.3 h1:yk9/cqRKtT9wXZSsRH9aurXEpJX+U6FLtpYTdC3R06k= -github.com/googleapis/enterprise-certificate-proxy v0.2.3/go.mod h1:AwSRAtLfXpU5Nm3pW+v7rGDHp09LsPtGY9MduiEsR9k= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= @@ -433,7 +413,6 @@ github.com/grafana/grafana-api-golang-client v0.24.0 h1:9cUvft7xCMnnL/Uscwy7eold github.com/grafana/grafana-api-golang-client v0.24.0/go.mod h1:24W29gPe9yl0/3A9X624TPkAOR8DpHno490cPwnkv8E= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0 h1:RtRsiaGvWxcwd8y3BiRZxsylPT8hLWZ5SPcfI+3IDNk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.0/go.mod h1:TzP6duP4Py2pHLVPPQp42aoYI92+PCrVotyR5e8Vqlk= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -741,7 +720,6 @@ github.com/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab h1:ZjX6I48eZSFetP github.com/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab/go.mod h1:/PfPXh0EntGc3QAAyUaviy4S9tzy4Zp0e2ilq4voC6E= github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs= github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro= -github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.2.2/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= @@ -786,7 +764,6 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= @@ -839,7 +816,6 @@ go.opentelemetry.io/otel/sdk v1.14.0 h1:PDCppFRDq8A1jL9v6KMI6dYesaq+DFcDZvjsoGvx go.opentelemetry.io/otel/sdk v1.14.0/go.mod h1:bwIC5TjrNG6QDCHNWvW4HLHtUQ4I+VQDsnjhvyZCALM= go.opentelemetry.io/otel/trace v1.16.0 h1:8JRpaObFoW0pxuVPapkgH8UhHQj+bJW8jJsCZEu5MQs= go.opentelemetry.io/otel/trace v1.16.0/go.mod h1:Yt9vYq1SdNz3xdjZZK7wcXv1qv2pwLkqr2QVwea0ef0= -go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20230717150657-8a3343210976 h1:7ljYNcZU84T2N0tZdDgvL7U3M4iFmglAUUU1gRFE/2Q= go.starlark.net v0.0.0-20230717150657-8a3343210976/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= @@ -1126,8 +1102,6 @@ google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0M google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE= google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM= google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc= -google.golang.org/api v0.126.0 h1:q4GJq+cAdMAC7XP7njvQ4tvohGLiSlytuL4BQxbIZ+o= -google.golang.org/api v0.126.0/go.mod h1:mBwVAtz+87bEN6CbA1GtZPDOqY2R5ONPqJeIlvyo4Aw= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -1160,7 +1134,6 @@ google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfG google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U= google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= @@ -1185,9 +1158,6 @@ google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKa google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak= -google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0= -google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= -google.golang.org/grpc v1.45.0/go.mod h1:lN7owxKUQEqMfSyQikvvk5tf/6zMPsrK+ONuO11+0rQ= google.golang.org/grpc v1.58.0 h1:32JY8YpPMSR45K+c3o6b8VL73V+rR8k+DeMIr4vRH8o= google.golang.org/grpc v1.58.0/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= @@ -1222,7 +1192,6 @@ gopkg.in/reform.v1 v1.5.1/go.mod h1:AIv0CbDRJ0ljQwptGeaIXfpDRo02uJwTq92aMFELEeU= gopkg.in/tomb.v2 v2.0.0-20140626144623-14b3d72120e8/go.mod h1:BHsqpu/nsuzkT5BpiH1EMZPLyqSMM8JbIavyFACoFNk= gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= From 8de6288b3c9801395f724f0606fe4502fdb07463 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 12 Oct 2023 11:14:11 +0200 Subject: [PATCH 028/126] PMM-12251 Unregister complete. --- admin/commands/management/unregister.go | 7 +- .../client/node/unregister_node_responses.go | 4 +- api/managementpb/json/managementpb.json | 5 +- api/managementpb/node.pb.go | 82 +++++++++---------- api/managementpb/node.pb.validate.go | 2 +- api/managementpb/node.proto | 3 +- api/swagger/swagger-dev.json | 5 +- api/swagger/swagger.json | 5 +- managed/services/grafana/client.go | 40 +++++++-- .../management/mock_auth_provider_test.go | 20 +++-- managed/services/management/node.go | 22 +++-- managed/services/management/node_test.go | 2 +- 12 files changed, 122 insertions(+), 75 deletions(-) diff --git a/admin/commands/management/unregister.go b/admin/commands/management/unregister.go index 88cda37fdf..e5e9c44dad 100644 --- a/admin/commands/management/unregister.go +++ b/admin/commands/management/unregister.go @@ -16,6 +16,7 @@ package management import ( "github.com/pkg/errors" + "github.com/sirupsen/logrus" "github.com/percona/pmm/admin/agentlocal" "github.com/percona/pmm/admin/cli/flags" @@ -87,11 +88,15 @@ func (cmd *UnregisterCommand) RunCmd(globals *flags.GlobalFlags) (commands.Resul Context: commands.Ctx, } - _, err = client.Default.Node.UnregisterNode(params) + res, err := client.Default.Node.UnregisterNode(params) if err != nil { return nil, err } + if res.Payload.Warning != "" { + logrus.Warning(res.Payload.Warning) + } + return &unregisterResult{ NodeID: nodeID, NodeName: nodeName, diff --git a/api/managementpb/json/client/node/unregister_node_responses.go b/api/managementpb/json/client/node/unregister_node_responses.go index 066770940e..1cb74a417d 100644 --- a/api/managementpb/json/client/node/unregister_node_responses.go +++ b/api/managementpb/json/client/node/unregister_node_responses.go @@ -301,8 +301,8 @@ UnregisterNodeOKBody unregister node OK body swagger:model UnregisterNodeOKBody */ type UnregisterNodeOKBody struct { - // unregistered - Unregistered bool `json:"unregistered,omitempty"` + // Warning message if there are more service tokens attached to service account. + Warning string `json:"warning,omitempty"` } // Validate validates this unregister node OK body diff --git a/api/managementpb/json/managementpb.json b/api/managementpb/json/managementpb.json index 7dc3eb5433..6386c29eaf 100644 --- a/api/managementpb/json/managementpb.json +++ b/api/managementpb/json/managementpb.json @@ -3963,8 +3963,9 @@ "schema": { "type": "object", "properties": { - "unregistered": { - "type": "boolean", + "warning": { + "description": "Warning message if there are more service tokens attached to service account.", + "type": "string", "x-order": 0 } } diff --git a/api/managementpb/node.pb.go b/api/managementpb/node.pb.go index a3929cce92..8484ceaff6 100644 --- a/api/managementpb/node.pb.go +++ b/api/managementpb/node.pb.go @@ -336,7 +336,8 @@ type UnregisterNodeResponse struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Unregistered bool `protobuf:"varint,1,opt,name=unregistered,proto3" json:"unregistered,omitempty"` + // Warning message if there are more service tokens attached to service account. + Warning string `protobuf:"bytes,1,opt,name=warning,proto3" json:"warning,omitempty"` } func (x *UnregisterNodeResponse) Reset() { @@ -371,11 +372,11 @@ func (*UnregisterNodeResponse) Descriptor() ([]byte, []int) { return file_managementpb_node_proto_rawDescGZIP(), []int{3} } -func (x *UnregisterNodeResponse) GetUnregistered() bool { +func (x *UnregisterNodeResponse) GetWarning() string { if x != nil { - return x.Unregistered + return x.Warning } - return false + return "" } var File_managementpb_node_proto protoreflect.FileDescriptor @@ -456,44 +457,43 @@ var file_managementpb_node_proto_rawDesc = []byte{ 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x30, 0x0a, 0x15, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x22, 0x3c, 0x0a, 0x16, 0x55, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x22, 0x32, 0x0a, 0x16, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x75, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, 0x6e, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x65, 0x64, 0x32, 0xf4, 0x02, 0x0a, 0x04, 0x4e, 0x6f, - 0x64, 0x65, 0x12, 0xb1, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, - 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x34, 0x12, 0x0d, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x1a, 0x23, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4e, 0x6f, 0x64, 0x65, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6d, 0x6d, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x2f, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0xb7, 0x01, 0x0a, 0x0e, 0x55, 0x6e, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x5e, 0x92, 0x41, 0x32, 0x12, 0x0f, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x1a, 0x1f, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x20, 0x61, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6d, - 0x6d, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, - 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x2f, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x42, 0x8c, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x42, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, - 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, - 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x0a, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x16, 0x4d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x32, + 0xf4, 0x02, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0xb1, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, + 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, + 0x34, 0x12, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4e, 0x6f, 0x64, 0x65, + 0x1a, 0x23, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, + 0x77, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6d, 0x6d, 0x2d, 0x61, + 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, + 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x4e, + 0x6f, 0x64, 0x65, 0x2f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0xb7, 0x01, 0x0a, + 0x0e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, + 0x21, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, + 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x32, 0x12, 0x0f, 0x55, 0x6e, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x1a, 0x1f, 0x55, 0x6e, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6d, 0x6d, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x2f, 0x55, 0x6e, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x42, 0x8c, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, + 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0xca, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xe2, + 0x02, 0x16, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, + 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/managementpb/node.pb.validate.go b/api/managementpb/node.pb.validate.go index 9fbe4f0c76..e565b33f2b 100644 --- a/api/managementpb/node.pb.validate.go +++ b/api/managementpb/node.pb.validate.go @@ -497,7 +497,7 @@ func (m *UnregisterNodeResponse) validate(all bool) error { var errors []error - // no validation rules for Unregistered + // no validation rules for Warning if len(errors) > 0 { return UnregisterNodeResponseMultiError(errors) diff --git a/api/managementpb/node.proto b/api/managementpb/node.proto index 94186c62f6..3af15b4e72 100644 --- a/api/managementpb/node.proto +++ b/api/managementpb/node.proto @@ -62,7 +62,8 @@ message UnregisterNodeRequest { } message UnregisterNodeResponse { - bool unregistered = 1; + // Warning message if there are more service tokens attached to service account. + string warning = 1; } // Node service provides public Management API methods for Nodes. diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index b45b07b00a..9b0436002a 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -27496,8 +27496,9 @@ "schema": { "type": "object", "properties": { - "unregistered": { - "type": "boolean", + "warning": { + "description": "Warning message if there are more service tokens attached to service account.", + "type": "string", "x-order": 0 } } diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index 58e7cb948a..1aa21f753c 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -18665,8 +18665,9 @@ "schema": { "type": "object", "properties": { - "unregistered": { - "type": "boolean", + "warning": { + "description": "Warning message if there are more service tokens attached to service account.", + "type": "string", "x-order": 0 } } diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index ff884c0ddf..c8def88cf0 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -379,6 +379,20 @@ func (c *Client) getIDForServiceAccount(ctx context.Context, authHeaders http.He return int64(k["id"].(float64)), nil } +func (c *Client) getTokenCountForServiceAccount(ctx context.Context, authHeaders http.Header) (int64, error) { + serviceAccountID, err := c.getIDForServiceAccount(ctx, authHeaders) + if err != nil { + return 0, err + } + + var k []map[string]interface{} + if err := c.do(ctx, http.MethodGet, fmt.Sprintf("/api/auth/serviceaccount/%d/tokens", serviceAccountID), "", authHeaders, nil, &k); err != nil { + return 0, err + } + + return int64(len(k)), nil +} + func (c *Client) testCreateUser(ctx context.Context, login string, role role, authHeaders http.Header) (int, error) { // https://grafana.com/docs/http_api/admin/#global-users b, err := json.Marshal(map[string]string{ @@ -491,19 +505,35 @@ func (c *Client) CreateServiceToken(ctx context.Context, serviceAccountID int64) } // DeleteServiceAccount deletes service account by current service token. -func (c *Client) DeleteServiceAccount(ctx context.Context) error { +func (c *Client) DeleteServiceAccount(ctx context.Context) (string, error) { + warning := "" authHeaders, err := c.authHeadersFromContext(ctx) if err != nil { - return err + return warning, err } serviceAccountID, err := c.getIDForServiceAccount(ctx, authHeaders) if err != nil { - return err + return warning, err + } + + err = c.deletePMMAgentRelatedServiceTokens(ctx, serviceAccountID, authHeaders) + if err != nil { + return warning, err + } + + tokensCount, err := c.getTokenCountForServiceAccount(ctx, authHeaders) + if err != nil { + return warning, err + } + + if tokensCount > 0 { + warning = "Service account wont be deleted, because there are more service tokens." + } else { + err = c.deleteServiceAccount(ctx, serviceAccountID, authHeaders) } - // TO DO add check of tokens - return c.deleteServiceAccount(ctx, serviceAccountID, authHeaders) + return warning, err } // CreateAlertRule creates Grafana alert rule. diff --git a/managed/services/management/mock_auth_provider_test.go b/managed/services/management/mock_auth_provider_test.go index 1d189ddd72..1559e8501a 100644 --- a/managed/services/management/mock_auth_provider_test.go +++ b/managed/services/management/mock_auth_provider_test.go @@ -100,17 +100,27 @@ func (_m *mockAuthProvider) CreateServiceToken(ctx context.Context, serviceAccou } // DeleteServiceAccount provides a mock function with given fields: ctx -func (_m *mockAuthProvider) DeleteServiceAccount(ctx context.Context) error { +func (_m *mockAuthProvider) DeleteServiceAccount(ctx context.Context) (string, error) { ret := _m.Called(ctx) - var r0 error - if rf, ok := ret.Get(0).(func(context.Context) error); ok { + var r0 string + var r1 error + if rf, ok := ret.Get(0).(func(context.Context) (string, error)); ok { + return rf(ctx) + } + if rf, ok := ret.Get(0).(func(context.Context) string); ok { r0 = rf(ctx) } else { - r0 = ret.Error(0) + r0 = ret.Get(0).(string) + } + + if rf, ok := ret.Get(1).(func(context.Context) error); ok { + r1 = rf(ctx) + } else { + r1 = ret.Error(1) } - return r0 + return r0, r1 } // newMockAuthProvider creates a new instance of mockAuthProvider. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations. diff --git a/managed/services/management/node.go b/managed/services/management/node.go index f45be7ed6f..39280d2c12 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -35,7 +35,7 @@ type authProvider interface { CreateAdminAPIKey(ctx context.Context, name string) (int64, string, error) CreateServiceAccount(ctx context.Context) (int64, error) CreateServiceToken(ctx context.Context, serviceAccountID int64) (int64, string, error) - DeleteServiceAccount(ctx context.Context) error + DeleteServiceAccount(ctx context.Context) (string, error) } // NodeService represents service for working with nodes. @@ -155,21 +155,19 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo // Unregister do unregistration of the node. func (s *NodeService) Unregister(ctx context.Context, req *managementpb.UnregisterNodeRequest) (*managementpb.UnregisterNodeResponse, error) { - res := &managementpb.UnregisterNodeResponse{ - Unregistered: true, - } - - e := s.db.InTransaction(func(tx *reform.TX) error { + err := s.db.InTransaction(func(tx *reform.TX) error { return models.RemoveNode(tx.Querier, req.NodeId, models.RemoveCascade) }) - if e != nil { - return nil, e + if err != nil { + return nil, err } - e = s.ap.DeleteServiceAccount(ctx) - if e != nil { - return nil, e + warning, err := s.ap.DeleteServiceAccount(ctx) + if err != nil { + return nil, err } - return res, nil + return &managementpb.UnregisterNodeResponse{ + Warning: warning, + }, nil } diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index c47ce98012..e74e9d7a41 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -59,7 +59,7 @@ func TestNodeService(t *testing.T) { serviceTokenID := int64(1) authProvider.On("CreateServiceAccount", ctx).Return(serviceAccountID, nil) authProvider.On("CreateServiceToken", ctx, serviceAccountID).Return(serviceTokenID, "test-token", nil) - authProvider.On("DeleteServiceAccount", ctx).Return(nil) + authProvider.On("DeleteServiceAccount", ctx).Return(nil, nil) s = NewNodeService(db, &authProvider) From 41de6fc4fd6ce4f91cca731a64af69cfa2497c9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 12 Oct 2023 12:59:41 +0200 Subject: [PATCH 029/126] PMM-12251 Unregister. --- managed/services/grafana/client.go | 32 +++++++++++----------- managed/services/management/node_test.go | 34 ++++++++++++++++++++++-- 2 files changed, 49 insertions(+), 17 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 58b0120e28..0f5533ab23 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -379,18 +379,25 @@ func (c *Client) getIDForServiceAccount(ctx context.Context, authHeaders http.He return int64(k["id"].(float64)), nil } -func (c *Client) getTokenCountForServiceAccount(ctx context.Context, authHeaders http.Header) (int64, error) { +func (c *Client) getNotPMMAgentTokenCountForServiceAccount(ctx context.Context, authHeaders http.Header) (int64, error) { serviceAccountID, err := c.getIDForServiceAccount(ctx, authHeaders) if err != nil { return 0, err } - var k []map[string]interface{} - if err := c.do(ctx, http.MethodGet, fmt.Sprintf("/api/auth/serviceaccount/%d/tokens", serviceAccountID), "", authHeaders, nil, &k); err != nil { + var tokens []serviceToken + if err := c.do(ctx, http.MethodGet, fmt.Sprintf("/api/auth/serviceaccount/%d/tokens", serviceAccountID), "", authHeaders, nil, &tokens); err != nil { return 0, err } - return int64(len(k)), nil + count := 0 + for _, token := range tokens { + if !strings.HasPrefix(token.Name, pmmServiceTokenName) { + count++ + } + } + + return int64(count), nil } func (c *Client) testCreateUser(ctx context.Context, login string, role role, authHeaders http.Header) (int, error) { @@ -517,22 +524,17 @@ func (c *Client) DeleteServiceAccount(ctx context.Context) (string, error) { return warning, err } - err = c.deletePMMAgentRelatedServiceTokens(ctx, serviceAccountID, authHeaders) - if err != nil { - return warning, err + customsTokensCount, err := c.getNotPMMAgentTokenCountForServiceAccount(ctx, authHeaders) + if customsTokensCount > 0 { + warning = "Service account wont be deleted, because there are more PMM agent not related service tokens." + err = c.deletePMMAgentRelatedServiceTokens(ctx, serviceAccountID, authHeaders) + } else { + err = c.deleteServiceAccount(ctx, serviceAccountID, authHeaders) } - - tokensCount, err := c.getTokenCountForServiceAccount(ctx, authHeaders) if err != nil { return warning, err } - if tokensCount > 0 { - warning = "Service account wont be deleted, because there are more service tokens." - } else { - err = c.deleteServiceAccount(ctx, serviceAccountID, authHeaders) - } - return warning, err } diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index e74e9d7a41..9c5ae2a41c 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -59,7 +59,7 @@ func TestNodeService(t *testing.T) { serviceTokenID := int64(1) authProvider.On("CreateServiceAccount", ctx).Return(serviceAccountID, nil) authProvider.On("CreateServiceToken", ctx, serviceAccountID).Return(serviceTokenID, "test-token", nil) - authProvider.On("DeleteServiceAccount", ctx).Return(nil, nil) + authProvider.On("DeleteServiceAccount", ctx).Return("", nil) s = NewNodeService(db, &authProvider) @@ -153,7 +153,37 @@ func TestNodeService(t *testing.T) { assert.NoError(t, err) }) - // TODO unregister tests + t.Run("Unregister", func(t *testing.T) { + resRegister, err := s.Register(ctx, &managementpb.RegisterNodeRequest{ + NodeType: inventorypb.NodeType_GENERIC_NODE, + NodeName: "node", + Address: "some.address.org", + Region: "region", + Reregister: true, + }) + expected := &managementpb.RegisterNodeResponse{ + GenericNode: &inventorypb.GenericNode{ + NodeId: "/node_id/00000000-0000-4000-8000-00000000000e", + NodeName: "node", + Address: "some.address.org", + Region: "region", + }, + ContainerNode: (*inventorypb.ContainerNode)(nil), + PmmAgent: &inventorypb.PMMAgent{ + AgentId: "/agent_id/00000000-0000-4000-8000-00000000000f", + RunsOnNodeId: "/node_id/00000000-0000-4000-8000-00000000000e", + }, + Token: "test-token", + } + assert.Equal(t, expected, resRegister) + assert.NoError(t, err) + + res, err := s.Unregister(ctx, &managementpb.UnregisterNodeRequest{ + NodeId: resRegister.GenericNode.NodeId, + }) + assert.NoError(t, err) + assert.Equal(t, "", res.Warning) + }) }) }) } From fda1e01d4f8038cffd52d06eda22e4b4da6d12e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 12 Oct 2023 13:16:57 +0200 Subject: [PATCH 030/126] PMM-12251 Fix. --- managed/services/grafana/client.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 0f5533ab23..b660230657 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -386,7 +386,7 @@ func (c *Client) getNotPMMAgentTokenCountForServiceAccount(ctx context.Context, } var tokens []serviceToken - if err := c.do(ctx, http.MethodGet, fmt.Sprintf("/api/auth/serviceaccount/%d/tokens", serviceAccountID), "", authHeaders, nil, &tokens); err != nil { + if err := c.do(ctx, http.MethodGet, fmt.Sprintf("/api/serviceaccounts/%d/tokens", serviceAccountID), "", authHeaders, nil, &tokens); err != nil { return 0, err } @@ -525,8 +525,12 @@ func (c *Client) DeleteServiceAccount(ctx context.Context) (string, error) { } customsTokensCount, err := c.getNotPMMAgentTokenCountForServiceAccount(ctx, authHeaders) + if err != nil { + return warning, err + } + fmt.Printf("\n\n\n\n %d \n\n\n\n", customsTokensCount) if customsTokensCount > 0 { - warning = "Service account wont be deleted, because there are more PMM agent not related service tokens." + warning = "Service account wont be deleted, because there are more not PMM agent related service tokens." err = c.deletePMMAgentRelatedServiceTokens(ctx, serviceAccountID, authHeaders) } else { err = c.deleteServiceAccount(ctx, serviceAccountID, authHeaders) From d8da6522c198ceb0324cfba007e456718104fdb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 12 Oct 2023 13:19:07 +0200 Subject: [PATCH 031/126] PMM-12251 Remove print. --- managed/services/grafana/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index b660230657..044f64ac95 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -528,7 +528,7 @@ func (c *Client) DeleteServiceAccount(ctx context.Context) (string, error) { if err != nil { return warning, err } - fmt.Printf("\n\n\n\n %d \n\n\n\n", customsTokensCount) + if customsTokensCount > 0 { warning = "Service account wont be deleted, because there are more not PMM agent related service tokens." err = c.deletePMMAgentRelatedServiceTokens(ctx, serviceAccountID, authHeaders) From 4bcd1e06d6a5f81d98fd84f2ff9f4bb8ae9d2b31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 12 Oct 2023 13:34:55 +0200 Subject: [PATCH 032/126] PMM-12251 Refactor ID int64 to int. --- managed/services/grafana/client.go | 22 ++++++++--------- .../management/mock_auth_provider_test.go | 24 +++++++++---------- managed/services/management/node.go | 4 ++-- managed/services/management/node_test.go | 4 ++-- 4 files changed, 27 insertions(+), 27 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 044f64ac95..90769d552c 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -366,7 +366,7 @@ func (c *Client) getRoleForServiceToken(ctx context.Context, authHeaders http.He return c.convertRole(role), nil } -func (c *Client) getIDForServiceAccount(ctx context.Context, authHeaders http.Header) (int64, error) { +func (c *Client) getIDForServiceAccount(ctx context.Context, authHeaders http.Header) (int, error) { var k map[string]interface{} if err := c.do(ctx, http.MethodGet, "/api/auth/serviceaccount", "", authHeaders, nil, &k); err != nil { return 0, err @@ -376,7 +376,7 @@ func (c *Client) getIDForServiceAccount(ctx context.Context, authHeaders http.He return 0, nil } - return int64(k["id"].(float64)), nil + return int(k["id"].(float64)), nil //nolint:forcetypeassert } func (c *Client) getNotPMMAgentTokenCountForServiceAccount(ctx context.Context, authHeaders http.Header) (int64, error) { @@ -482,7 +482,7 @@ func (c *Client) DeleteAPIKeyByID(ctx context.Context, id int64) error { } // CreateServiceAccount creates service account with Admin role. -func (c *Client) CreateServiceAccount(ctx context.Context) (int64, error) { +func (c *Client) CreateServiceAccount(ctx context.Context) (int, error) { authHeaders, err := c.authHeadersFromContext(ctx) if err != nil { return 0, err @@ -497,7 +497,7 @@ func (c *Client) CreateServiceAccount(ctx context.Context) (int64, error) { } // CreateServiceToken creates service token for provided service account. -func (c *Client) CreateServiceToken(ctx context.Context, serviceAccountID int64) (int64, string, error) { +func (c *Client) CreateServiceToken(ctx context.Context, serviceAccountID int) (int, string, error) { authHeaders, err := c.authHeadersFromContext(ctx) if err != nil { return 0, "", err @@ -722,7 +722,7 @@ type serviceToken struct { Role string `json:"role"` } -func (c *Client) createServiceAccount(ctx context.Context, role role, authHeaders http.Header) (int64, error) { +func (c *Client) createServiceAccount(ctx context.Context, role role, authHeaders http.Header) (int, error) { if role == none { return 0, errors.New("you cannot create service account with empty role") } @@ -738,7 +738,7 @@ func (c *Client) createServiceAccount(ctx context.Context, role role, authHeader return 0, err } - serviceAccountID := int64(m["id"].(float64)) //nolint:forcetypeassert + serviceAccountID := int(m["id"].(float64)) //nolint:forcetypeassert // orgId is ignored during creating service account and default is -1 // orgId should be setup to 1 @@ -749,7 +749,7 @@ func (c *Client) createServiceAccount(ctx context.Context, role role, authHeader return serviceAccountID, nil } -func (c *Client) createServiceToken(ctx context.Context, serviceAccountID int64, authHeaders http.Header) (int64, string, error) { +func (c *Client) createServiceToken(ctx context.Context, serviceAccountID int, authHeaders http.Header) (int, string, error) { serviceTokenName := fmt.Sprintf("%s-%s-%d", pmmServiceTokenName, admin, time.Now().Nanosecond()) b, err := json.Marshal(serviceToken{Name: serviceTokenName, Role: admin.String()}) if err != nil { @@ -760,13 +760,13 @@ func (c *Client) createServiceToken(ctx context.Context, serviceAccountID int64, if err = c.do(ctx, "POST", fmt.Sprintf("/api/serviceaccounts/%d/tokens", serviceAccountID), "", authHeaders, b, &m); err != nil { return 0, "", err } - serviceTokenID := int64(m["id"].(float64)) //nolint:forcetypeassert - serviceTokenKey := m["key"].(string) //nolint:forcetypeassert + serviceTokenID := int(m["id"].(float64)) //nolint:forcetypeassert + serviceTokenKey := m["key"].(string) //nolint:forcetypeassert return serviceTokenID, serviceTokenKey, nil } -func (c *Client) deletePMMAgentRelatedServiceTokens(ctx context.Context, serviceAccountID int64, authHeaders http.Header) error { +func (c *Client) deletePMMAgentRelatedServiceTokens(ctx context.Context, serviceAccountID int, authHeaders http.Header) error { var tokens []serviceToken if err := c.do(ctx, "GET", fmt.Sprintf("/api/serviceaccounts/%d/tokens", serviceAccountID), "", authHeaders, nil, &tokens); err != nil { return err @@ -783,7 +783,7 @@ func (c *Client) deletePMMAgentRelatedServiceTokens(ctx context.Context, service return nil } -func (c *Client) deleteServiceAccount(ctx context.Context, serviceAccountID int64, authHeaders http.Header) error { +func (c *Client) deleteServiceAccount(ctx context.Context, serviceAccountID int, authHeaders http.Header) error { return c.do(ctx, "DELETE", fmt.Sprintf("/api/serviceaccounts/%d", serviceAccountID), "", authHeaders, nil, nil) } diff --git a/managed/services/management/mock_auth_provider_test.go b/managed/services/management/mock_auth_provider_test.go index 1559e8501a..170964ad49 100644 --- a/managed/services/management/mock_auth_provider_test.go +++ b/managed/services/management/mock_auth_provider_test.go @@ -45,18 +45,18 @@ func (_m *mockAuthProvider) CreateAdminAPIKey(ctx context.Context, name string) } // CreateServiceAccount provides a mock function with given fields: ctx -func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context) (int64, error) { +func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context) (int, error) { ret := _m.Called(ctx) - var r0 int64 + var r0 int var r1 error - if rf, ok := ret.Get(0).(func(context.Context) (int64, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context) (int, error)); ok { return rf(ctx) } - if rf, ok := ret.Get(0).(func(context.Context) int64); ok { + if rf, ok := ret.Get(0).(func(context.Context) int); ok { r0 = rf(ctx) } else { - r0 = ret.Get(0).(int64) + r0 = ret.Get(0).(int) } if rf, ok := ret.Get(1).(func(context.Context) error); ok { @@ -69,28 +69,28 @@ func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context) (int64, er } // CreateServiceToken provides a mock function with given fields: ctx, serviceAccountID -func (_m *mockAuthProvider) CreateServiceToken(ctx context.Context, serviceAccountID int64) (int64, string, error) { +func (_m *mockAuthProvider) CreateServiceToken(ctx context.Context, serviceAccountID int) (int, string, error) { ret := _m.Called(ctx, serviceAccountID) - var r0 int64 + var r0 int var r1 string var r2 error - if rf, ok := ret.Get(0).(func(context.Context, int64) (int64, string, error)); ok { + if rf, ok := ret.Get(0).(func(context.Context, int) (int, string, error)); ok { return rf(ctx, serviceAccountID) } - if rf, ok := ret.Get(0).(func(context.Context, int64) int64); ok { + if rf, ok := ret.Get(0).(func(context.Context, int) int); ok { r0 = rf(ctx, serviceAccountID) } else { - r0 = ret.Get(0).(int64) + r0 = ret.Get(0).(int) } - if rf, ok := ret.Get(1).(func(context.Context, int64) string); ok { + if rf, ok := ret.Get(1).(func(context.Context, int) string); ok { r1 = rf(ctx, serviceAccountID) } else { r1 = ret.Get(1).(string) } - if rf, ok := ret.Get(2).(func(context.Context, int64) error); ok { + if rf, ok := ret.Get(2).(func(context.Context, int) error); ok { r2 = rf(ctx, serviceAccountID) } else { r2 = ret.Error(2) diff --git a/managed/services/management/node.go b/managed/services/management/node.go index 39280d2c12..d29b7633f9 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -33,8 +33,8 @@ import ( type authProvider interface { CreateAdminAPIKey(ctx context.Context, name string) (int64, string, error) - CreateServiceAccount(ctx context.Context) (int64, error) - CreateServiceToken(ctx context.Context, serviceAccountID int64) (int64, string, error) + CreateServiceAccount(ctx context.Context) (int, error) + CreateServiceToken(ctx context.Context, serviceAccountID int) (int, string, error) DeleteServiceAccount(ctx context.Context) (string, error) } diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index 9c5ae2a41c..b945a823f0 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -55,8 +55,8 @@ func TestNodeService(t *testing.T) { var authProvider mockAuthProvider authProvider.Test(t) - serviceAccountID := int64(0) - serviceTokenID := int64(1) + serviceAccountID := int(0) + serviceTokenID := int(1) authProvider.On("CreateServiceAccount", ctx).Return(serviceAccountID, nil) authProvider.On("CreateServiceToken", ctx, serviceAccountID).Return(serviceTokenID, "test-token", nil) authProvider.On("DeleteServiceAccount", ctx).Return("", nil) From a5a64af9318c7c18c635a6eb9296a9f0cd036eee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 12 Oct 2023 13:45:23 +0200 Subject: [PATCH 033/126] PMM-12251 Modify description in md to be aligned with Service acc. --- docs/api/welcome/authentication.md | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/docs/api/welcome/authentication.md b/docs/api/welcome/authentication.md index 6693f8765d..9934099d3c 100644 --- a/docs/api/welcome/authentication.md +++ b/docs/api/welcome/authentication.md @@ -12,7 +12,7 @@ PMM Server's user authentication is built on top of and is compatible with [Graf In this section we will talk about two main authentication mechanisms: - Basic HTTP authentication -- Bearer Authentication (Authentication with an API key) +- Bearer Authentication (Authentication with an Service Token or API key) ### Basic HTTP Authentication @@ -37,8 +37,23 @@ curl -X GET -u admin:admin -H 'Content-Type: application/json' https://127.0.0.1 ### Bearer Authentication -Bearer authentication (also called token authentication) is an HTTP authentication scheme that involves security tokens called bearer tokens. The bearer token is a cryptic API key, which can be generated by the server admin from the Settings UI or via a respective API call (read more about how to generate an API key). The client must send the API key in the `Authorization` header when making requests to protected resources: +Bearer authentication (also called token authentication) is an HTTP authentication scheme that involves security tokens called bearer tokens. The bearer token is a cryptic Service Token, or API key, which can be generated by the server admin from the Settings UI or via a respective API call (read more about how to generate Service token or API key). The client must send the Service Token/API key in the `Authorization` header when making requests to protected resources: +Service Token example: +```shell +curl -X GET -H 'Authorization: Bearer glsa_Fp0ggev31R58ueNJbJgYw7fIGfO3yKWH_746383ab' \ + -H 'Content-Type: application/json' https://127.0.0.1/v1/version +``` + +You can use the Service Token in basic authentication as well: + +```shell +curl -X GET -H 'Content-Type: application/json' \ + https://service_tokne:glsa_Fp0ggev31R58ueNJbJgYw7fIGfO3yKWH_746383ab@127.0.0.1/v1/version +``` +Service Token has always prefix "glsa_". That's how you can identify, if it's Service Token or API key. + +API key example: ```shell curl -X GET -H 'Authorization: Bearer eyJrIjoiUXRkeDNMS1g1bFVyY0tUj1o0SmhBc3g4QUdTRVAwekoiLCJuIjoicG1tLXRlc3QiLCJpZCI6MX0=' \ -H 'Content-Type: application/json' https://127.0.0.1/v1/version From 1a11ac551afa9df80fcb9a6f6ca1789996affe5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 12 Oct 2023 13:58:11 +0200 Subject: [PATCH 034/126] PMM-12251 Int64 to int in tests. --- api-tests/server/auth_test.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index e6ca0506b6..753ef4d7dc 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -601,7 +601,7 @@ func TestServiceAccountPermissions(t *testing.T) { } } -func createServiceAccountWithRole(t *testing.T, role string) int64 { +func createServiceAccountWithRole(t *testing.T, role string) int { t.Helper() u, err := url.Parse(pmmapitests.BaseURL.String()) require.NoError(t, err) @@ -628,7 +628,7 @@ func createServiceAccountWithRole(t *testing.T, role string) int64 { err = json.Unmarshal(b, &m) require.NoError(t, err) - serviceAccountID := int64(m["id"].(float64)) //nolint:forcetypeassert + serviceAccountID := int(m["id"].(float64)) //nolint:forcetypeassert u.Path = fmt.Sprintf("/graph/api/serviceaccounts/%d", serviceAccountID) data, err = json.Marshal(map[string]string{ "orgId": "1", @@ -648,7 +648,7 @@ func createServiceAccountWithRole(t *testing.T, role string) int64 { return serviceAccountID } -func deleteServiceAccount(t *testing.T, serviceAccountID int64) { +func deleteServiceAccount(t *testing.T, serviceAccountID int) { t.Helper() u, err := url.Parse(pmmapitests.BaseURL.String()) require.NoError(t, err) @@ -663,7 +663,7 @@ func deleteServiceAccount(t *testing.T, serviceAccountID int64) { require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete service account, status code: %d, response: %s", resp.StatusCode, b) } -func createServiceToken(t *testing.T, serviceAccountID int64) (int64, string) { +func createServiceToken(t *testing.T, serviceAccountID int) (int, string) { t.Helper() u, err := url.Parse(pmmapitests.BaseURL.String()) require.NoError(t, err) @@ -689,10 +689,10 @@ func createServiceToken(t *testing.T, serviceAccountID int64) (int64, string) { err = json.Unmarshal(b, &m) require.NoError(t, err) - return int64(m["id"].(float64)), m["key"].(string) //nolint:forcetypeassert + return int(m["id"].(float64)), m["key"].(string) //nolint:forcetypeassert } -func deleteServiceToken(t *testing.T, serviceAccountID, serviceTokenID int64) { +func deleteServiceToken(t *testing.T, serviceAccountID, serviceTokenID int) { t.Helper() u, err := url.Parse(pmmapitests.BaseURL.String()) require.NoError(t, err) From 9fbcd56025727adc9265f1334ef5601e1f2a5b6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 12 Oct 2023 14:22:32 +0200 Subject: [PATCH 035/126] PMM-12251 Lint. --- api-tests/server/auth_test.go | 16 ++++++++-------- managed/services/grafana/client.go | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index 753ef4d7dc..c9b125c586 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -592,7 +592,7 @@ func TestServiceAccountPermissions(t *testing.T) { resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck assert.Equal(t, user.statusCode, resp.StatusCode) }) @@ -620,7 +620,7 @@ func createServiceAccountWithRole(t *testing.T, role string) int { req.Header.Set("Content-Type", "application/json; charset=utf-8") resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck require.Equalf(t, http.StatusCreated, resp.StatusCode, "failed to create Service account, status code: %d, response: %s", resp.StatusCode, b) @@ -628,7 +628,7 @@ func createServiceAccountWithRole(t *testing.T, role string) int { err = json.Unmarshal(b, &m) require.NoError(t, err) - serviceAccountID := int(m["id"].(float64)) //nolint:forcetypeassert + serviceAccountID := int(m["id"].(float64)) u.Path = fmt.Sprintf("/graph/api/serviceaccounts/%d", serviceAccountID) data, err = json.Marshal(map[string]string{ "orgId": "1", @@ -641,7 +641,7 @@ func createServiceAccountWithRole(t *testing.T, role string) int { req.Header.Set("Content-Type", "application/json; charset=utf-8") resp1, b := doRequest(t, http.DefaultClient, req) - defer resp1.Body.Close() //nolint:gosec + defer resp1.Body.Close() //nolint:gosec,errcheck require.Equalf(t, http.StatusCreated, resp.StatusCode, "failed to set orgId=1 to Service account, status code: %d, response: %s", resp.StatusCode, b) @@ -658,7 +658,7 @@ func deleteServiceAccount(t *testing.T, serviceAccountID int) { require.NoError(t, err) resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete service account, status code: %d, response: %s", resp.StatusCode, b) } @@ -681,7 +681,7 @@ func createServiceToken(t *testing.T, serviceAccountID int) (int, string) { req.Header.Set("Content-Type", "application/json; charset=utf-8") resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to create Service account, status code: %d, response: %s", resp.StatusCode, b) @@ -689,7 +689,7 @@ func createServiceToken(t *testing.T, serviceAccountID int) (int, string) { err = json.Unmarshal(b, &m) require.NoError(t, err) - return int(m["id"].(float64)), m["key"].(string) //nolint:forcetypeassert + return int(m["id"].(float64)), m["key"].(string) } func deleteServiceToken(t *testing.T, serviceAccountID, serviceTokenID int) { @@ -702,7 +702,7 @@ func deleteServiceToken(t *testing.T, serviceAccountID, serviceTokenID int) { require.NoError(t, err) resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec + defer resp.Body.Close() //nolint:gosec,errcheck require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete service token, status code: %d, response: %s", resp.StatusCode, b) } diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 90769d552c..b9e6653c0f 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -379,7 +379,7 @@ func (c *Client) getIDForServiceAccount(ctx context.Context, authHeaders http.He return int(k["id"].(float64)), nil //nolint:forcetypeassert } -func (c *Client) getNotPMMAgentTokenCountForServiceAccount(ctx context.Context, authHeaders http.Header) (int64, error) { +func (c *Client) getNotPMMAgentTokenCountForServiceAccount(ctx context.Context, authHeaders http.Header) (int, error) { serviceAccountID, err := c.getIDForServiceAccount(ctx, authHeaders) if err != nil { return 0, err @@ -397,7 +397,7 @@ func (c *Client) getNotPMMAgentTokenCountForServiceAccount(ctx context.Context, } } - return int64(count), nil + return count, nil } func (c *Client) testCreateUser(ctx context.Context, login string, role role, authHeaders http.Header) (int, error) { From 92c8f2f80f2ccb8c31138bacf91b72f53e70a549 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 12 Oct 2023 14:25:14 +0200 Subject: [PATCH 036/126] PMM-12251 Service token ID to int. --- managed/services/grafana/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index b9e6653c0f..6c60cfb137 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -717,7 +717,7 @@ type serviceAccount struct { Role string `json:"role"` } type serviceToken struct { - ID int64 `json:"id"` + ID int `json:"id"` Name string `json:"name"` Role string `json:"role"` } From 511ad4a3cd549fe4950e0bd1d4f51880f879d33a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 12 Oct 2023 14:35:48 +0200 Subject: [PATCH 037/126] PMM-12251 Lint. --- admin/commands/management/unregister.go | 3 +-- managed/services/grafana/client.go | 5 +++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/admin/commands/management/unregister.go b/admin/commands/management/unregister.go index e5e9c44dad..6115b9c3fb 100644 --- a/admin/commands/management/unregister.go +++ b/admin/commands/management/unregister.go @@ -19,7 +19,6 @@ import ( "github.com/sirupsen/logrus" "github.com/percona/pmm/admin/agentlocal" - "github.com/percona/pmm/admin/cli/flags" "github.com/percona/pmm/admin/commands" "github.com/percona/pmm/admin/helpers" inventoryClient "github.com/percona/pmm/api/inventorypb/json/client" @@ -49,7 +48,7 @@ type UnregisterCommand struct { NodeName string `help:"Node name (autodetected default: ${hostname})"` } -func (cmd *UnregisterCommand) RunCmd(globals *flags.GlobalFlags) (commands.Result, error) { +func (cmd *UnregisterCommand) RunCmd() (commands.Result, error) { var nodeName string var nodeID string var err error diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 6c60cfb137..90dec49bf0 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -49,7 +49,7 @@ var ErrFailedToGetToken = errors.New("failed to get token") const ( defaultEvaluationInterval = time.Minute - pmmServiceTokenName = "pmm-agent-service-token" + pmmServiceTokenName = "pmm-agent-service-token" //nolint:gosec ) // Client represents a client for Grafana API. @@ -524,7 +524,8 @@ func (c *Client) DeleteServiceAccount(ctx context.Context) (string, error) { return warning, err } - customsTokensCount, err := c.getNotPMMAgentTokenCountForServiceAccount(ctx, authHeaders) + customsTokensCount := 0 + customsTokensCount, err = c.getNotPMMAgentTokenCountForServiceAccount(ctx, authHeaders) if err != nil { return warning, err } From ea88aa195f788e1a65104f3fc5b978fedfd00f06 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 1 Nov 2023 10:02:58 +0100 Subject: [PATCH 038/126] PMM-12251 Refactor of IF. --- managed/services/grafana/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 90dec49bf0..de5475eb17 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -141,7 +141,7 @@ func (c *Client) do(ctx context.Context, method, path, rawQuery string, headers if err != nil { return errors.WithStack(err) } - if resp.StatusCode != 200 && resp.StatusCode != 201 && resp.StatusCode != 202 { + if resp.StatusCode < 200 || resp.StatusCode > 202 { cErr := &clientError{ Method: req.Method, URL: req.URL.String(), From dea0e7143da13dcca549c345863ea74f412efd00 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 1 Nov 2023 10:08:45 +0100 Subject: [PATCH 039/126] PMM-12251 Warning instead error. --- managed/services/management/node.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/managed/services/management/node.go b/managed/services/management/node.go index d29b7633f9..f20b79474f 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -164,7 +164,9 @@ func (s *NodeService) Unregister(ctx context.Context, req *managementpb.Unregist warning, err := s.ap.DeleteServiceAccount(ctx) if err != nil { - return nil, err + return &managementpb.UnregisterNodeResponse{ + Warning: err.Error(), + }, nil } return &managementpb.UnregisterNodeResponse{ From 873747cf3d38cae062f5aacf25d6b6f34201918d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 1 Nov 2023 11:00:03 +0100 Subject: [PATCH 040/126] PMM-12251 Auth tools, existed token got from headers. --- agent/commands/clients.go | 4 +- agent/commands/setup.go | 6 +- .../client/node/register_node_responses.go | 3 - api/managementpb/json/managementpb.json | 5 - api/managementpb/node.pb.go | 130 ++++++++---------- api/managementpb/node.pb.validate.go | 2 - api/managementpb/node.proto | 2 - api/swagger/swagger-dev.json | 5 - api/swagger/swagger.json | 5 - go.mod | 2 + go.sum | 6 + managed/services/grafana/client.go | 66 ++------- managed/services/management/node.go | 10 +- managed/utils/auth/token.go | 75 ++++++++++ 14 files changed, 163 insertions(+), 158 deletions(-) create mode 100644 managed/utils/auth/token.go diff --git a/agent/commands/clients.go b/agent/commands/clients.go index 9ddb4712a6..80c51a7c92 100644 --- a/agent/commands/clients.go +++ b/agent/commands/clients.go @@ -165,7 +165,7 @@ func ParseCustomLabels(labels string) (map[string]string, error) { // serverRegister registers Node on PMM Server. // // This method is not thread-safe. -func serverRegister(cfgSetup *config.Setup, existedServiceToken string) (agentID, token string, _ error) { //nolint:nonamedreturns +func serverRegister(cfgSetup *config.Setup) (agentID, token string, _ error) { //nolint:nonamedreturns nodeTypes := map[string]string{ "generic": node.RegisterNodeBodyNodeTypeGENERICNODE, "container": node.RegisterNodeBodyNodeTypeCONTAINERNODE, @@ -202,8 +202,6 @@ func serverRegister(cfgSetup *config.Setup, existedServiceToken string) (agentID Reregister: cfgSetup.Force, MetricsMode: pointer.ToString(strings.ToUpper(cfgSetup.MetricsMode)), DisableCollectors: disableCollectors, - - ExistedServiceToken: existedServiceToken, }, Context: context.Background(), }) diff --git a/agent/commands/setup.go b/agent/commands/setup.go index df1217c2a8..4e8730b69b 100644 --- a/agent/commands/setup.go +++ b/agent/commands/setup.go @@ -138,12 +138,8 @@ func register(cfg *config.Config, l *logrus.Entry) { os.Exit(1) } - existedServiceToken := "" - if strings.HasPrefix(cfg.Server.Username, "service_token") { - existedServiceToken = cfg.Server.Password - } setServerTransport(u, cfg.Server.InsecureTLS, l) - agentID, token, err := serverRegister(&cfg.Setup, existedServiceToken) + agentID, token, err := serverRegister(&cfg.Setup) l.Debugf("Register error: %#v", err) if err != nil { msg := err.Error() diff --git a/api/managementpb/json/client/node/register_node_responses.go b/api/managementpb/json/client/node/register_node_responses.go index 5caaeb505d..747c5965d7 100644 --- a/api/managementpb/json/client/node/register_node_responses.go +++ b/api/managementpb/json/client/node/register_node_responses.go @@ -172,9 +172,6 @@ type RegisterNodeBody struct { // Custom password for exporter endpoint /metrics. AgentPassword string `json:"agent_password,omitempty"` - - // If its provided then it wont create new service account and service token. - ExistedServiceToken string `json:"existed_service_token,omitempty"` } // Validate validates this register node body diff --git a/api/managementpb/json/managementpb.json b/api/managementpb/json/managementpb.json index 1037a69d97..5329b873ea 100644 --- a/api/managementpb/json/managementpb.json +++ b/api/managementpb/json/managementpb.json @@ -3685,11 +3685,6 @@ "type": "string", "x-order": 4 }, - "existed_service_token": { - "description": "If its provided then it wont create new service account and service token.", - "type": "string", - "x-order": 15 - }, "machine_id": { "description": "Linux machine-id.", "type": "string", diff --git a/api/managementpb/node.pb.go b/api/managementpb/node.pb.go index 8484ceaff6..9028ccd8e7 100644 --- a/api/managementpb/node.pb.go +++ b/api/managementpb/node.pb.go @@ -63,8 +63,6 @@ type RegisterNodeRequest struct { DisableCollectors []string `protobuf:"bytes,14,rep,name=disable_collectors,json=disableCollectors,proto3" json:"disable_collectors,omitempty"` // Custom password for exporter endpoint /metrics. AgentPassword string `protobuf:"bytes,15,opt,name=agent_password,json=agentPassword,proto3" json:"agent_password,omitempty"` - // If its provided then it wont create new service account and service token. - ExistedServiceToken string `protobuf:"bytes,16,opt,name=existed_service_token,json=existedServiceToken,proto3" json:"existed_service_token,omitempty"` } func (x *RegisterNodeRequest) Reset() { @@ -204,13 +202,6 @@ func (x *RegisterNodeRequest) GetAgentPassword() string { return "" } -func (x *RegisterNodeRequest) GetExistedServiceToken() string { - if x != nil { - return x.ExistedServiceToken - } - return "" -} - type RegisterNodeResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -395,7 +386,7 @@ var file_managementpb_node_proto_rawDesc = []byte{ 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xce, 0x05, 0x0a, 0x13, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x9a, 0x05, 0x0a, 0x13, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x30, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, @@ -433,67 +424,64 @@ var file_managementpb_node_proto_rawDesc = []byte{ 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x50, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x65, 0x78, 0x69, 0x73, 0x74, - 0x65, 0x64, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x65, 0x78, 0x69, 0x73, 0x74, 0x65, 0x64, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x1a, 0x3f, 0x0a, 0x11, 0x43, - 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, - 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xda, 0x01, 0x0a, - 0x14, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, - 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, - 0x12, 0x3f, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x6f, - 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, - 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x6f, - 0x64, 0x65, 0x52, 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x6f, 0x64, - 0x65, 0x12, 0x30, 0x0a, 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, - 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x30, 0x0a, 0x15, 0x55, 0x6e, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x22, 0x32, 0x0a, 0x16, 0x55, - 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x32, - 0xf4, 0x02, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0xb1, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, - 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, - 0x34, 0x12, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4e, 0x6f, 0x64, 0x65, - 0x1a, 0x23, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, - 0x77, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6d, 0x6d, 0x2d, 0x61, - 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, - 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x4e, - 0x6f, 0x64, 0x65, 0x2f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0xb7, 0x01, 0x0a, - 0x0e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, - 0x21, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, - 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x32, 0x12, 0x0f, 0x55, 0x6e, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x1a, 0x1f, 0x55, 0x6e, - 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6d, 0x6d, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x2f, 0x55, 0x6e, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x42, 0x8c, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, - 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, - 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0xca, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xe2, - 0x02, 0x16, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x1a, 0x3f, 0x0a, 0x11, 0x43, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xda, 0x01, 0x0a, 0x14, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, + 0x6f, 0x72, 0x79, 0x2e, 0x47, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x0b, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x3f, 0x0a, 0x0e, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0d, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a, + 0x09, 0x70, 0x6d, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x4d, 0x4d, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, + 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x30, 0x0a, 0x15, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x22, 0x32, 0x0a, 0x16, 0x55, 0x6e, 0x72, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x32, 0xf4, 0x02, 0x0a, 0x04, + 0x4e, 0x6f, 0x64, 0x65, 0x12, 0xb1, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x34, 0x12, 0x0d, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x1a, 0x23, 0x52, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4e, 0x6f, + 0x64, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6d, 0x6d, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, 0x31, 0x2f, + 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x2f, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0xb7, 0x01, 0x0a, 0x0e, 0x55, 0x6e, 0x72, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x72, 0x65, + 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x32, 0x12, 0x0f, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x1a, 0x1f, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x70, 0x6d, 0x6d, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, + 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x2f, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x42, 0x8c, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, + 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x4d, 0x58, + 0x58, 0xaa, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xca, 0x02, + 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x16, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/managementpb/node.pb.validate.go b/api/managementpb/node.pb.validate.go index e565b33f2b..32330522e8 100644 --- a/api/managementpb/node.pb.validate.go +++ b/api/managementpb/node.pb.validate.go @@ -98,8 +98,6 @@ func (m *RegisterNodeRequest) validate(all bool) error { // no validation rules for AgentPassword - // no validation rules for ExistedServiceToken - if len(errors) > 0 { return RegisterNodeRequestMultiError(errors) } diff --git a/api/managementpb/node.proto b/api/managementpb/node.proto index 3af15b4e72..eb1d63155b 100644 --- a/api/managementpb/node.proto +++ b/api/managementpb/node.proto @@ -44,8 +44,6 @@ message RegisterNodeRequest { repeated string disable_collectors = 14; // Custom password for exporter endpoint /metrics. string agent_password = 15; - // If its provided then it wont create new service account and service token. - string existed_service_token = 16; } message RegisterNodeResponse { diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index 114535190c..221987c1f1 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -27327,11 +27327,6 @@ "description": "Custom password for exporter endpoint /metrics.", "type": "string", "x-order": 14 - }, - "existed_service_token": { - "description": "If its provided then it wont create new service account and service token.", - "type": "string", - "x-order": 15 } } } diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index 15b8f61ddb..84cf8d8521 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -18496,11 +18496,6 @@ "description": "Custom password for exporter endpoint /metrics.", "type": "string", "x-order": 14 - }, - "existed_service_token": { - "description": "If its provided then it wont create new service account and service token.", - "type": "string", - "x-order": 15 } } } diff --git a/go.mod b/go.mod index 4d1404a6b3..94da29ca92 100644 --- a/go.mod +++ b/go.mod @@ -40,6 +40,7 @@ require ( github.com/go-openapi/swag v0.22.3 github.com/go-openapi/validate v0.22.1 github.com/go-sql-driver/mysql v1.7.1 + github.com/gogo/status v1.1.1 github.com/golang-migrate/migrate/v4 v4.16.1 github.com/golang/protobuf v1.5.3 github.com/google/uuid v1.4.0 @@ -110,6 +111,7 @@ require ( github.com/go-ini/ini v1.67.0 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect github.com/google/gnostic-models v0.6.8 // indirect github.com/google/go-cmp v0.5.9 // indirect diff --git a/go.sum b/go.sum index e0762e4b94..b3f62ff9ab 100644 --- a/go.sum +++ b/go.sum @@ -316,10 +316,14 @@ github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5x github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a h1:dR8+Q0uO5S2ZBcs2IH6VBKYwSxPo2vYCYq0ot0mu7xA= +github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.3.0/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/gogo/status v1.1.1 h1:DuHXlSFHNKqTQ+/ACf5Vs6r4X/dH2EgIzR9Vr+H65kg= +github.com/gogo/status v1.1.1/go.mod h1:jpG3dM5QPcqu19Hg8lkUhBFBa3TcLs1DG7+2Jqci7oU= github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= github.com/golang-migrate/migrate/v4 v4.16.1 h1:O+0C55RbMN66pWm5MjO6mw0px6usGpY0+bkSGW9zCo0= @@ -1116,6 +1120,7 @@ google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCID google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180518175338-11a468237815/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= @@ -1152,6 +1157,7 @@ google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d h1: google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go.mod h1:KjSP20unUpOx5kyQUFa7k4OJg0qeJ7DEZflGDu2p6Bk= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4= google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M= +google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index de5475eb17..040c5df3fb 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -21,7 +21,6 @@ package grafana import ( "bytes" "context" - "encoding/base64" "encoding/json" "fmt" "io" @@ -41,6 +40,7 @@ import ( "google.golang.org/grpc/status" "github.com/percona/pmm/managed/services" + "github.com/percona/pmm/managed/utils/auth" "github.com/percona/pmm/managed/utils/irt" ) @@ -197,7 +197,7 @@ func (r role) String() string { // GetUserID returns user ID from Grafana for the current user. func (c *Client) GetUserID(ctx context.Context) (int, error) { - authHeaders, err := c.authHeadersFromContext(ctx) + authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { return 0, err } @@ -227,7 +227,7 @@ var emptyUser = authUser{ // Ctx is used only for cancelation. func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (authUser, error) { // Check if API Key or Service Token is authorized. - token := c.getTokenAuth(authHeaders) + token := auth.GetTokenFromHeaders(authHeaders) if token != "" { if strings.HasPrefix(token, "glsa_") { role, err := c.getRoleForServiceToken(ctx, authHeaders) @@ -297,26 +297,6 @@ func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (auth }, nil } -func (c *Client) getTokenAuth(authHeaders http.Header) string { - authHeader := authHeaders.Get("Authorization") - switch { - case strings.HasPrefix(authHeader, "Bearer"): - return strings.TrimSpace(strings.TrimPrefix(authHeader, "Bearer")) - case strings.HasPrefix(authHeader, "Basic"): - h := strings.TrimPrefix(authHeader, "Basic") - t, err := base64.StdEncoding.DecodeString(strings.TrimSpace(h)) - if err != nil { - return "" - } - tk := string(t) - if strings.HasPrefix(tk, "api_key:") || strings.HasPrefix(tk, "service_token:") { - return strings.Split(tk, ":")[1] - } - } - - return "" -} - func (c *Client) convertRole(role string) role { switch role { case "Viewer": @@ -442,7 +422,7 @@ func (c *Client) testDeleteUser(ctx context.Context, userID int, authHeaders htt // CreateAdminAPIKey creates API key with Admin role and provided name. func (c *Client) CreateAdminAPIKey(ctx context.Context, name string) (int64, string, error) { - authHeaders, err := c.authHeadersFromContext(ctx) + authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { return 0, "", err } @@ -451,7 +431,7 @@ func (c *Client) CreateAdminAPIKey(ctx context.Context, name string) (int64, str // DeleteAPIKeysWithPrefix deletes all API keys with provided prefix. If there is no api key with provided prefix just ignores it. func (c *Client) DeleteAPIKeysWithPrefix(ctx context.Context, prefix string) error { - authHeaders, err := c.authHeadersFromContext(ctx) + authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { return err } @@ -474,7 +454,7 @@ func (c *Client) DeleteAPIKeysWithPrefix(ctx context.Context, prefix string) err // DeleteAPIKeyByID deletes API key by ID. func (c *Client) DeleteAPIKeyByID(ctx context.Context, id int64) error { - authHeaders, err := c.authHeadersFromContext(ctx) + authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { return err } @@ -483,7 +463,7 @@ func (c *Client) DeleteAPIKeyByID(ctx context.Context, id int64) error { // CreateServiceAccount creates service account with Admin role. func (c *Client) CreateServiceAccount(ctx context.Context) (int, error) { - authHeaders, err := c.authHeadersFromContext(ctx) + authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { return 0, err } @@ -498,7 +478,7 @@ func (c *Client) CreateServiceAccount(ctx context.Context) (int, error) { // CreateServiceToken creates service token for provided service account. func (c *Client) CreateServiceToken(ctx context.Context, serviceAccountID int) (int, string, error) { - authHeaders, err := c.authHeadersFromContext(ctx) + authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { return 0, "", err } @@ -514,7 +494,7 @@ func (c *Client) CreateServiceToken(ctx context.Context, serviceAccountID int) ( // DeleteServiceAccount deletes service account by current service token. func (c *Client) DeleteServiceAccount(ctx context.Context) (string, error) { warning := "" - authHeaders, err := c.authHeadersFromContext(ctx) + authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { return warning, err } @@ -545,7 +525,7 @@ func (c *Client) DeleteServiceAccount(ctx context.Context) (string, error) { // CreateAlertRule creates Grafana alert rule. func (c *Client) CreateAlertRule(ctx context.Context, folderName, groupName string, rule *services.Rule) error { - authHeaders, err := c.authHeadersFromContext(ctx) + authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { return err } @@ -642,7 +622,7 @@ func (c *Client) GetFolderByUID(ctx context.Context, uid string) (*gapi.Folder, } func (c *Client) createGrafanaClient(ctx context.Context) (*gapi.Client, error) { - authHeaders, err := c.authHeadersFromContext(ctx) + authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { return nil, errors.WithStack(err) } @@ -660,30 +640,6 @@ func (c *Client) createGrafanaClient(ctx context.Context) (*gapi.Client, error) return grafanaClient, nil } -func (c *Client) authHeadersFromContext(ctx context.Context) (http.Header, error) { - headers, ok := metadata.FromIncomingContext(ctx) - if !ok { - return nil, fmt.Errorf("cannot get headers from metadata") - } - // get authorization from headers. - authorizationHeaders := headers.Get("Authorization") - cookieHeaders := headers.Get("grpcgateway-cookie") - if len(authorizationHeaders) == 0 && len(cookieHeaders) == 0 { - return nil, status.Error(codes.Unauthenticated, "Authorization error.") - } - - authHeaders := make(http.Header) - if len(authorizationHeaders) != 0 { - authHeaders.Add("Authorization", authorizationHeaders[0]) - } - if len(cookieHeaders) != 0 { - for _, header := range cookieHeaders { - authHeaders.Add("Cookie", header) - } - } - return authHeaders, nil -} - func (c *Client) createAPIKey(ctx context.Context, name string, role role, authHeaders http.Header) (int64, string, error) { // https://grafana.com/docs/grafana/latest/http_api/auth/#create-api-key b, err := json.Marshal(apiKey{Name: name, Role: role.String()}) diff --git a/managed/services/management/node.go b/managed/services/management/node.go index f20b79474f..d8618f96be 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -27,6 +27,7 @@ import ( "github.com/percona/pmm/api/managementpb" "github.com/percona/pmm/managed/models" "github.com/percona/pmm/managed/services" + "github.com/percona/pmm/managed/utils/auth" ) //go:generate ../../../bin/mockery --name=authProvider --case=snake --inpackage --testonly @@ -137,7 +138,12 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo return nil, e } - if req.ExistedServiceToken == "" { + authHeaders, e := auth.GetHeadersFromContext(ctx) + if e != nil { + return nil, e + } + token := auth.GetTokenFromHeaders(authHeaders) + if token == "" { serviceAcountID, e := s.ap.CreateServiceAccount(ctx) if e != nil { return nil, e @@ -147,7 +153,7 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo return nil, e } } else { - res.Token = req.ExistedServiceToken + res.Token = token } return res, nil diff --git a/managed/utils/auth/token.go b/managed/utils/auth/token.go new file mode 100644 index 0000000000..ae9c31f3ac --- /dev/null +++ b/managed/utils/auth/token.go @@ -0,0 +1,75 @@ +// Copyright (C) 2023 Percona LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +// Package auth contains functions to work with auth tokens and headers. +package auth + +import ( + "context" + "encoding/base64" + "fmt" + "net/http" + "strings" + + "github.com/gogo/status" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" +) + +// GetTokenFromHeaders returns authorization token if it is found in provided HTTP headers. +func GetTokenFromHeaders(authHeaders http.Header) string { + authHeader := authHeaders.Get("Authorization") + switch { + case strings.HasPrefix(authHeader, "Bearer"): + return strings.TrimSpace(strings.TrimPrefix(authHeader, "Bearer")) + case strings.HasPrefix(authHeader, "Basic"): + h := strings.TrimPrefix(authHeader, "Basic") + t, err := base64.StdEncoding.DecodeString(strings.TrimSpace(h)) + if err != nil { + return "" + } + tk := string(t) + if strings.HasPrefix(tk, "api_key:") || strings.HasPrefix(tk, "service_token:") { + return strings.Split(tk, ":")[1] + } + } + + return "" +} + +// GetHeadersFromContext returns authorization headers if they are found in provided context. +func GetHeadersFromContext(ctx context.Context) (http.Header, error) { + headers, ok := metadata.FromIncomingContext(ctx) + if !ok { + return nil, fmt.Errorf("cannot get headers from metadata") + } + // get authorization from headers. + authorizationHeaders := headers.Get("Authorization") + cookieHeaders := headers.Get("grpcgateway-cookie") + if len(authorizationHeaders) == 0 && len(cookieHeaders) == 0 { + return nil, status.Error(codes.Unauthenticated, "Authorization error.") + } + + authHeaders := make(http.Header) + if len(authorizationHeaders) != 0 { + authHeaders.Add("Authorization", authorizationHeaders[0]) + } + if len(cookieHeaders) != 0 { + for _, header := range cookieHeaders { + authHeaders.Add("Cookie", header) + } + } + return authHeaders, nil +} From 4fa9b6a564996a4e0034ffb9cf928382eb7dd03d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 7 Nov 2023 10:54:28 +0100 Subject: [PATCH 041/126] PMM-12251 Fix in doc. --- docs/api/welcome/authentication.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api/welcome/authentication.md b/docs/api/welcome/authentication.md index 9934099d3c..5aeaa8bf77 100644 --- a/docs/api/welcome/authentication.md +++ b/docs/api/welcome/authentication.md @@ -49,9 +49,9 @@ You can use the Service Token in basic authentication as well: ```shell curl -X GET -H 'Content-Type: application/json' \ - https://service_tokne:glsa_Fp0ggev31R58ueNJbJgYw7fIGfO3yKWH_746383ab@127.0.0.1/v1/version + https://service_token:glsa_Fp0ggev31R58ueNJbJgYw7fIGfO3yKWH_746383ab@127.0.0.1/v1/version ``` -Service Token has always prefix "glsa_". That's how you can identify, if it's Service Token or API key. +Service Token has usually prefix "glsa_". If you convert it from API key it will persist same. API key example: ```shell From cb5ab7f8fce4dd188daf59ceae1a27c6f1aa060f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 7 Nov 2023 11:27:17 +0100 Subject: [PATCH 042/126] PMM-12251 Remove token prefix check. --- agent/commands/setup.go | 7 +------ managed/services/grafana/client.go | 13 +------------ 2 files changed, 2 insertions(+), 18 deletions(-) diff --git a/agent/commands/setup.go b/agent/commands/setup.go index 4e8730b69b..99114511f0 100644 --- a/agent/commands/setup.go +++ b/agent/commands/setup.go @@ -19,7 +19,6 @@ import ( "fmt" "net/http" "os" - "strings" "time" "github.com/pkg/errors" @@ -161,11 +160,7 @@ func register(cfg *config.Config, l *logrus.Entry) { } cfg.ID = agentID if token != "" { - if strings.HasPrefix(token, "glsa_") { - cfg.Server.Username = "service_token" - } else { - cfg.Server.Username = "api_key" - } + cfg.Server.Username = "service_token" cfg.Server.Password = token } else { l.Info("PMM Server responded with an empty api key token. Consider upgrading PMM Server to the latest version.") diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 040c5df3fb..e22626f9e0 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -229,18 +229,7 @@ func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (auth // Check if API Key or Service Token is authorized. token := auth.GetTokenFromHeaders(authHeaders) if token != "" { - if strings.HasPrefix(token, "glsa_") { - role, err := c.getRoleForServiceToken(ctx, authHeaders) - if err != nil { - return emptyUser, err - } - return authUser{ - role: role, - userID: 0, - }, nil - } - - role, err := c.getRoleForAPIKey(ctx, authHeaders) + role, err := c.getRoleForServiceToken(ctx, authHeaders) if err != nil { return emptyUser, err } From d71b26d36d96911cd2aa6cb279a35d87fd765397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 8 Nov 2023 13:08:29 +0100 Subject: [PATCH 043/126] Revert "Bump @typescript-eslint/parser from 6.9.0 to 6.10.0 in /cli-tests (#2601)" This reverts commit 2e66592f70b63a41ef547871bd8d364b54e86a2d. --- cli-tests/package-lock.json | 208 +++++++++++++++++++++++++++++++++--- cli-tests/package.json | 2 +- 2 files changed, 194 insertions(+), 16 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index b34019a698..773cc22e17 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -21,7 +21,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^6.10.0", - "@typescript-eslint/parser": "^6.10.0", + "@typescript-eslint/parser": "^6.9.0", "eslint": "8.53", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", @@ -295,16 +295,63 @@ } } }, - "node_modules/@typescript-eslint/parser": { + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.10.0.tgz", - "integrity": "sha512-+sZwIj+s+io9ozSxIWbNB5873OSdfeBEH/FR0re14WLI6BaKuSOnnwCJ2foUiu8uXf4dRp1UqHP0vrZ1zXGrog==", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", + "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "6.10.0", "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", + "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", + "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.10.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.0.tgz", + "integrity": "sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", "debug": "^4.3.4" }, "engines": { @@ -324,13 +371,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", - "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.0.tgz", + "integrity": "sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0" + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0" }, "engines": { "node": "^16.0.0 || >=18.0.0" @@ -367,7 +414,7 @@ } } }, - "node_modules/@typescript-eslint/types": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", @@ -380,7 +427,7 @@ "url": "https://opencollective.com/typescript-eslint" } }, - "node_modules/@typescript-eslint/typescript-estree": { + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", @@ -407,6 +454,63 @@ } } }, + "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", + "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.10.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz", + "integrity": "sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.0.tgz", + "integrity": "sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, "node_modules/@typescript-eslint/utils": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", @@ -432,7 +536,64 @@ "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/visitor-keys": { + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", + "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", + "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", + "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.10.0", + "@typescript-eslint/visitor-keys": "6.10.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", @@ -449,6 +610,23 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz", + "integrity": "sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.9.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", diff --git a/cli-tests/package.json b/cli-tests/package.json index 9d6be03827..fd617899cd 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -25,7 +25,7 @@ "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^6.10.0", - "@typescript-eslint/parser": "^6.10.0", + "@typescript-eslint/parser": "^6.9.0", "eslint": "8.53", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", From 89ecdcdc22cf53976adaf00865748394377e5b98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 8 Nov 2023 13:09:06 +0100 Subject: [PATCH 044/126] Revert "Bump @typescript-eslint/eslint-plugin from 6.9.0 to 6.10.0 in /cli-tests (#2600)" This reverts commit b8a6e931c011b710bd8a7bf6bbfb311e8567f0b2. --- cli-tests/package-lock.json | 216 ++++-------------------------------- cli-tests/package.json | 2 +- 2 files changed, 20 insertions(+), 198 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 773cc22e17..13fdf00155 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -20,7 +20,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/eslint-plugin": "^6.9.0", "@typescript-eslint/parser": "^6.9.0", "eslint": "8.53", "eslint-config-airbnb-base": "^15.0.0", @@ -261,16 +261,16 @@ } }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.10.0.tgz", - "integrity": "sha512-uoLj4g2OTL8rfUQVx2AFO1hp/zja1wABJq77P6IclQs6I/m9GLrm7jCdgzZkvWdDCQf1uEvoa8s8CupsgWQgVg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.0.tgz", + "integrity": "sha512-lgX7F0azQwRPB7t7WAyeHWVfW1YJ9NIgd9mvGhfQpRY56X6AVf8mwM8Wol+0z4liE7XX3QOt8MN1rUKCfSjRIA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/type-utils": "6.10.0", - "@typescript-eslint/utils": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/type-utils": "6.9.0", + "@typescript-eslint/utils": "6.9.0", + "@typescript-eslint/visitor-keys": "6.9.0", "debug": "^4.3.4", "graphemer": "^1.4.0", "ignore": "^5.2.4", @@ -295,53 +295,6 @@ } } }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", - "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", - "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", - "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/parser": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.0.tgz", @@ -388,13 +341,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.10.0.tgz", - "integrity": "sha512-wYpPs3hgTFblMYwbYWPT3eZtaDOjbLyIYuqpwuLBBqhLiuvJ+9sEp2gNRJEtR5N/c9G1uTtQQL5AhV0fEPJYcg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.0.tgz", + "integrity": "sha512-XXeahmfbpuhVbhSOROIzJ+b13krFmgtc4GlEuu1WBT+RpyGPIA4Y/eGnXzjbDj5gZLzpAXO/sj+IF/x2GtTMjQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "6.10.0", - "@typescript-eslint/utils": "6.10.0", + "@typescript-eslint/typescript-estree": "6.9.0", + "@typescript-eslint/utils": "6.9.0", "debug": "^4.3.4", "ts-api-utils": "^1.0.1" }, @@ -414,63 +367,6 @@ } } }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", - "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", - "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", - "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/types": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.0.tgz", @@ -512,17 +408,17 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.10.0.tgz", - "integrity": "sha512-v+pJ1/RcVyRc0o4wAGux9x42RHmAjIGzPRo538Z8M1tVx6HOnoQBCX/NoadHQlZeC+QO2yr4nNSFWOoraZCAyg==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.0.tgz", + "integrity": "sha512-5Wf+Jsqya7WcCO8me504FBigeQKVLAMPmUzYgDbWchINNh1KJbxCgVya3EQ2MjvJMVeXl3pofRmprqX6mfQkjQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@types/json-schema": "^7.0.12", "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "6.10.0", - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/typescript-estree": "6.10.0", + "@typescript-eslint/scope-manager": "6.9.0", + "@typescript-eslint/types": "6.9.0", + "@typescript-eslint/typescript-estree": "6.9.0", "semver": "^7.5.4" }, "engines": { @@ -536,80 +432,6 @@ "eslint": "^7.0.0 || ^8.0.0" } }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.10.0.tgz", - "integrity": "sha512-TN/plV7dzqqC2iPNf1KrxozDgZs53Gfgg5ZHyw8erd6jd5Ta/JIEcdCheXFt9b1NYb93a1wmIIVW/2gLkombDg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.10.0.tgz", - "integrity": "sha512-36Fq1PWh9dusgo3vH7qmQAj5/AZqARky1Wi6WpINxB6SkQdY5vQoT2/7rW7uBIsPDcvvGCLi4r10p0OJ7ITAeg==", - "dev": true, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.10.0.tgz", - "integrity": "sha512-ek0Eyuy6P15LJVeghbWhSrBCj/vJpPXXR+EpaRZqou7achUWL8IdYnMSC5WHAeTWswYQuP2hAZgij/bC9fanBg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "@typescript-eslint/visitor-keys": "6.10.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.10.0.tgz", - "integrity": "sha512-xMGluxQIEtOM7bqFCo+rCMh5fqI+ZxV5RUUOa29iVPz1OgCZrtc7rFnz5cLUazlkPKYqX+75iuDq7m0HQ48nCg==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "6.10.0", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^16.0.0 || >=18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, "node_modules/@typescript-eslint/visitor-keys": { "version": "6.9.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.0.tgz", diff --git a/cli-tests/package.json b/cli-tests/package.json index fd617899cd..9b45f270d7 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@types/promise-retry": "^1.1.3", "@types/shelljs": "^0.8.12", - "@typescript-eslint/eslint-plugin": "^6.10.0", + "@typescript-eslint/eslint-plugin": "^6.9.0", "@typescript-eslint/parser": "^6.9.0", "eslint": "8.53", "eslint-config-airbnb-base": "^15.0.0", From ef098213d97d05b995f2d61f45ef4add502670f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 8 Nov 2023 13:09:31 +0100 Subject: [PATCH 045/126] Revert "Bump golang.org/x/text from 0.13.0 to 0.14.0 (#2593)" This reverts commit 7ca2c1a7ecbdf6df1318191181db63040a1e6bb9. --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 39fb0a0c17..ade5232f32 100644 --- a/go.mod +++ b/go.mod @@ -73,7 +73,7 @@ require ( golang.org/x/crypto v0.14.0 golang.org/x/sync v0.4.0 golang.org/x/sys v0.14.0 - golang.org/x/text v0.14.0 + golang.org/x/text v0.13.0 golang.org/x/tools v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d diff --git a/go.sum b/go.sum index a148a06306..8c2f986a9b 100644 --- a/go.sum +++ b/go.sum @@ -796,8 +796,8 @@ golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k= +golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= From 58000e99cee93311099382ba1a75d9b430056a71 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 8 Nov 2023 13:09:59 +0100 Subject: [PATCH 046/126] Revert "Bump golang.org/x/sys from 0.13.0 to 0.14.0 (#2594)" This reverts commit c472ab8dda9df70498a718bf267f18c0f1cbd8b6. --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index ade5232f32..c9292b3074 100644 --- a/go.mod +++ b/go.mod @@ -72,7 +72,7 @@ require ( go.starlark.net v0.0.0-20230717150657-8a3343210976 golang.org/x/crypto v0.14.0 golang.org/x/sync v0.4.0 - golang.org/x/sys v0.14.0 + golang.org/x/sys v0.13.0 golang.org/x/text v0.13.0 golang.org/x/tools v0.14.0 google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d diff --git a/go.sum b/go.sum index 8c2f986a9b..fd24bea247 100644 --- a/go.sum +++ b/go.sum @@ -778,8 +778,8 @@ golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q= -golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE= +golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= From e0990ad4b0703351c6051252b503ac8a8fff4689 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 8 Nov 2023 13:10:17 +0100 Subject: [PATCH 047/126] Revert "Bump eslint from 8.52.0 to 8.53.0 in /cli-tests (#2596)" This reverts commit fac3eec1ad0060b38a84c8868a5198f4e9c4ac3c. --- cli-tests/package-lock.json | 36 ++++++++++++++++++------------------ cli-tests/package.json | 2 +- 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/cli-tests/package-lock.json b/cli-tests/package-lock.json index 13fdf00155..607348b459 100644 --- a/cli-tests/package-lock.json +++ b/cli-tests/package-lock.json @@ -22,7 +22,7 @@ "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^6.9.0", "@typescript-eslint/parser": "^6.9.0", - "eslint": "8.53", + "eslint": "8.52", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", "eslint-plugin-import": "^2.29.0", @@ -63,9 +63,9 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.3.tgz", - "integrity": "sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { "ajv": "^6.12.4", @@ -86,9 +86,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.53.0.tgz", - "integrity": "sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz", + "integrity": "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -456,9 +456,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.11.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", - "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -942,15 +942,15 @@ } }, "node_modules/eslint": { - "version": "8.53.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.53.0.tgz", - "integrity": "sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag==", + "version": "8.52.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz", + "integrity": "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", - "@eslint/eslintrc": "^2.1.3", - "@eslint/js": "8.53.0", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.52.0", "@humanwhocodes/config-array": "^0.11.13", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -2387,9 +2387,9 @@ } }, "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { "node": ">=6" diff --git a/cli-tests/package.json b/cli-tests/package.json index 9b45f270d7..f8b01a3320 100644 --- a/cli-tests/package.json +++ b/cli-tests/package.json @@ -26,7 +26,7 @@ "@types/shelljs": "^0.8.12", "@typescript-eslint/eslint-plugin": "^6.9.0", "@typescript-eslint/parser": "^6.9.0", - "eslint": "8.53", + "eslint": "8.52", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.1.0", "eslint-plugin-import": "^2.29.0", From 16cbe9e6ec4c027467683cd1933ff9b722b7c862 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 13 Nov 2023 09:03:32 +0100 Subject: [PATCH 048/126] PMM-12251 Remove not used code. --- agent/client/basic_auth.go | 46 ------------------------------ agent/client/client.go | 6 ---- agent/client/service_token_auth.go | 44 ---------------------------- 3 files changed, 96 deletions(-) delete mode 100644 agent/client/basic_auth.go delete mode 100644 agent/client/service_token_auth.go diff --git a/agent/client/basic_auth.go b/agent/client/basic_auth.go deleted file mode 100644 index ae822e264b..0000000000 --- a/agent/client/basic_auth.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package client - -import ( - "context" - "encoding/base64" - - "google.golang.org/grpc/credentials" -) - -type basicAuth struct { - username string - password string -} - -// GetRequestMetadata implements credentials.PerRPCCredentials interface. -func (b *basicAuth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { - auth := b.username + ":" + b.password - enc := base64.StdEncoding.EncodeToString([]byte(auth)) - return map[string]string{ - "Authorization": "Basic " + enc, - }, nil -} - -// RequireTransportSecurity implements credentials.PerRPCCredentials interface. -func (*basicAuth) RequireTransportSecurity() bool { - return false -} - -// check interfaces. -var ( - _ credentials.PerRPCCredentials = (*basicAuth)(nil) -) diff --git a/agent/client/client.go b/agent/client/client.go index f6ba5547a7..7d019169ae 100644 --- a/agent/client/client.go +++ b/agent/client/client.go @@ -917,12 +917,6 @@ func getGRPCOps(cfg *config.Config) []grpc.DialOption { opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))) } - if cfg.Server.Username != "" { - opts = append(opts, grpc.WithPerRPCCredentials(&basicAuth{ - username: cfg.Server.Username, - password: cfg.Server.Password, - })) - } return opts } diff --git a/agent/client/service_token_auth.go b/agent/client/service_token_auth.go deleted file mode 100644 index 5ac7ce65f8..0000000000 --- a/agent/client/service_token_auth.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package client - -import ( - "context" - "encoding/base64" - - "google.golang.org/grpc/credentials" -) - -type tokenAuth struct { - token string -} - -// GetRequestMetadata implements credentials.PerRPCCredentials interface. -func (s *tokenAuth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { - enc := base64.StdEncoding.EncodeToString([]byte(s.token)) - return map[string]string{ - "Authorization": "Bearer " + enc, - }, nil -} - -// RequireTransportSecurity implements credentials.PerRPCCredentials interface. -func (s *tokenAuth) RequireTransportSecurity() bool { - return false -} - -// check interfaces. -var ( - _ credentials.PerRPCCredentials = (*tokenAuth)(nil) -) From b979363e3e880ab6e5605326aab9fae1c27ff02f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 13 Nov 2023 09:21:32 +0100 Subject: [PATCH 049/126] Revert "PMM-12251 Remove not used code." This reverts commit 16cbe9e6ec4c027467683cd1933ff9b722b7c862. --- agent/client/basic_auth.go | 46 ++++++++++++++++++++++++++++++ agent/client/client.go | 6 ++++ agent/client/service_token_auth.go | 44 ++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 agent/client/basic_auth.go create mode 100644 agent/client/service_token_auth.go diff --git a/agent/client/basic_auth.go b/agent/client/basic_auth.go new file mode 100644 index 0000000000..ae822e264b --- /dev/null +++ b/agent/client/basic_auth.go @@ -0,0 +1,46 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package client + +import ( + "context" + "encoding/base64" + + "google.golang.org/grpc/credentials" +) + +type basicAuth struct { + username string + password string +} + +// GetRequestMetadata implements credentials.PerRPCCredentials interface. +func (b *basicAuth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { + auth := b.username + ":" + b.password + enc := base64.StdEncoding.EncodeToString([]byte(auth)) + return map[string]string{ + "Authorization": "Basic " + enc, + }, nil +} + +// RequireTransportSecurity implements credentials.PerRPCCredentials interface. +func (*basicAuth) RequireTransportSecurity() bool { + return false +} + +// check interfaces. +var ( + _ credentials.PerRPCCredentials = (*basicAuth)(nil) +) diff --git a/agent/client/client.go b/agent/client/client.go index 7d019169ae..f6ba5547a7 100644 --- a/agent/client/client.go +++ b/agent/client/client.go @@ -917,6 +917,12 @@ func getGRPCOps(cfg *config.Config) []grpc.DialOption { opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))) } + if cfg.Server.Username != "" { + opts = append(opts, grpc.WithPerRPCCredentials(&basicAuth{ + username: cfg.Server.Username, + password: cfg.Server.Password, + })) + } return opts } diff --git a/agent/client/service_token_auth.go b/agent/client/service_token_auth.go new file mode 100644 index 0000000000..5ac7ce65f8 --- /dev/null +++ b/agent/client/service_token_auth.go @@ -0,0 +1,44 @@ +// Copyright (C) 2023 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package client + +import ( + "context" + "encoding/base64" + + "google.golang.org/grpc/credentials" +) + +type tokenAuth struct { + token string +} + +// GetRequestMetadata implements credentials.PerRPCCredentials interface. +func (s *tokenAuth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { + enc := base64.StdEncoding.EncodeToString([]byte(s.token)) + return map[string]string{ + "Authorization": "Bearer " + enc, + }, nil +} + +// RequireTransportSecurity implements credentials.PerRPCCredentials interface. +func (s *tokenAuth) RequireTransportSecurity() bool { + return false +} + +// check interfaces. +var ( + _ credentials.PerRPCCredentials = (*tokenAuth)(nil) +) From dd3be16859636197aabd5d4bfcad38334aeca015 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 13 Nov 2023 09:27:54 +0100 Subject: [PATCH 050/126] PMM-12251 Token/headers fix. --- managed/services/grafana/client.go | 32 +++++++++++------------------- 1 file changed, 12 insertions(+), 20 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index ce6e66385b..158abab4e2 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -229,7 +229,7 @@ func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (auth // Check if API Key or Service Token is authorized. token := auth.GetTokenFromHeaders(authHeaders) if token != "" { - role, err := c.getRoleForServiceToken(ctx, authHeaders) + role, err := c.getRoleForServiceToken(ctx, token) if err != nil { return emptyUser, err } @@ -307,23 +307,12 @@ type apiKey struct { Expiration *time.Time `json:"expiration,omitempty"` } -func (c *Client) getRoleForAPIKey(ctx context.Context, authHeaders http.Header) (role, error) { - var k map[string]interface{} - if err := c.do(ctx, http.MethodGet, "/api/auth/key", "", authHeaders, nil, &k); err != nil { - return none, err - } - - if id, _ := k["orgId"].(float64); id != 1 { - return none, nil - } - - role, _ := k["role"].(string) - return c.convertRole(role), nil -} +func (c *Client) getRoleForServiceToken(ctx context.Context, token string) (role, error) { + header := http.Header{} + header.Add("Authorization", fmt.Sprintf("Bearer %s", token)) -func (c *Client) getRoleForServiceToken(ctx context.Context, authHeaders http.Header) (role, error) { var k map[string]interface{} - if err := c.do(ctx, http.MethodGet, "/api/auth/serviceaccount", "", authHeaders, nil, &k); err != nil { + if err := c.do(ctx, http.MethodGet, "/api/auth/serviceaccount", "", header, nil, &k); err != nil { return none, err } @@ -335,9 +324,12 @@ func (c *Client) getRoleForServiceToken(ctx context.Context, authHeaders http.He return c.convertRole(role), nil } -func (c *Client) getIDForServiceAccount(ctx context.Context, authHeaders http.Header) (int, error) { +func (c *Client) getIDForServiceAccount(ctx context.Context, token string) (int, error) { + header := http.Header{} + header.Add("Authorization", fmt.Sprintf("Bearer %s", token)) + var k map[string]interface{} - if err := c.do(ctx, http.MethodGet, "/api/auth/serviceaccount", "", authHeaders, nil, &k); err != nil { + if err := c.do(ctx, http.MethodGet, "/api/auth/serviceaccount", "", header, nil, &k); err != nil { return 0, err } @@ -349,7 +341,7 @@ func (c *Client) getIDForServiceAccount(ctx context.Context, authHeaders http.He } func (c *Client) getNotPMMAgentTokenCountForServiceAccount(ctx context.Context, authHeaders http.Header) (int, error) { - serviceAccountID, err := c.getIDForServiceAccount(ctx, authHeaders) + serviceAccountID, err := c.getIDForServiceAccount(ctx, auth.GetTokenFromHeaders(authHeaders)) if err != nil { return 0, err } @@ -488,7 +480,7 @@ func (c *Client) DeleteServiceAccount(ctx context.Context) (string, error) { return warning, err } - serviceAccountID, err := c.getIDForServiceAccount(ctx, authHeaders) + serviceAccountID, err := c.getIDForServiceAccount(ctx, auth.GetTokenFromHeaders(authHeaders)) if err != nil { return warning, err } From b2ef7154997716978c84a3009872a90410acd907 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 13 Nov 2023 10:31:17 +0100 Subject: [PATCH 051/126] Revert "Revert "PMM-12251 Remove not used code."" This reverts commit b979363e3e880ab6e5605326aab9fae1c27ff02f. --- agent/client/basic_auth.go | 46 ------------------------------ agent/client/client.go | 6 ---- agent/client/service_token_auth.go | 44 ---------------------------- 3 files changed, 96 deletions(-) delete mode 100644 agent/client/basic_auth.go delete mode 100644 agent/client/service_token_auth.go diff --git a/agent/client/basic_auth.go b/agent/client/basic_auth.go deleted file mode 100644 index ae822e264b..0000000000 --- a/agent/client/basic_auth.go +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package client - -import ( - "context" - "encoding/base64" - - "google.golang.org/grpc/credentials" -) - -type basicAuth struct { - username string - password string -} - -// GetRequestMetadata implements credentials.PerRPCCredentials interface. -func (b *basicAuth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { - auth := b.username + ":" + b.password - enc := base64.StdEncoding.EncodeToString([]byte(auth)) - return map[string]string{ - "Authorization": "Basic " + enc, - }, nil -} - -// RequireTransportSecurity implements credentials.PerRPCCredentials interface. -func (*basicAuth) RequireTransportSecurity() bool { - return false -} - -// check interfaces. -var ( - _ credentials.PerRPCCredentials = (*basicAuth)(nil) -) diff --git a/agent/client/client.go b/agent/client/client.go index f6ba5547a7..7d019169ae 100644 --- a/agent/client/client.go +++ b/agent/client/client.go @@ -917,12 +917,6 @@ func getGRPCOps(cfg *config.Config) []grpc.DialOption { opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))) } - if cfg.Server.Username != "" { - opts = append(opts, grpc.WithPerRPCCredentials(&basicAuth{ - username: cfg.Server.Username, - password: cfg.Server.Password, - })) - } return opts } diff --git a/agent/client/service_token_auth.go b/agent/client/service_token_auth.go deleted file mode 100644 index 5ac7ce65f8..0000000000 --- a/agent/client/service_token_auth.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (C) 2023 Percona LLC -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package client - -import ( - "context" - "encoding/base64" - - "google.golang.org/grpc/credentials" -) - -type tokenAuth struct { - token string -} - -// GetRequestMetadata implements credentials.PerRPCCredentials interface. -func (s *tokenAuth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { - enc := base64.StdEncoding.EncodeToString([]byte(s.token)) - return map[string]string{ - "Authorization": "Bearer " + enc, - }, nil -} - -// RequireTransportSecurity implements credentials.PerRPCCredentials interface. -func (s *tokenAuth) RequireTransportSecurity() bool { - return false -} - -// check interfaces. -var ( - _ credentials.PerRPCCredentials = (*tokenAuth)(nil) -) From a108afcf69874a55407ce4e0374bc1d80f78723b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 13 Nov 2023 13:05:05 +0100 Subject: [PATCH 052/126] PMM-12251 Doc update. --- docs/api/welcome/authentication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/welcome/authentication.md b/docs/api/welcome/authentication.md index 5aeaa8bf77..2a897a9063 100644 --- a/docs/api/welcome/authentication.md +++ b/docs/api/welcome/authentication.md @@ -51,7 +51,7 @@ You can use the Service Token in basic authentication as well: curl -X GET -H 'Content-Type: application/json' \ https://service_token:glsa_Fp0ggev31R58ueNJbJgYw7fIGfO3yKWH_746383ab@127.0.0.1/v1/version ``` -Service Token has usually prefix "glsa_". If you convert it from API key it will persist same. +Service Token has usually prefix "glsa_". If you convert it from API key it will persist same. If you will use API key then it will be automatically converted into Service Account and Service Token. API key example: ```shell From ea4bca57ab7ae6adab4b71689bf2cc623aaca3b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 14 Nov 2023 11:57:23 +0100 Subject: [PATCH 053/126] PMM-12251 Remove APIKey permissions tests. --- api-tests/server/auth_test.go | 270 ---------------------------------- 1 file changed, 270 deletions(-) diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index c9b125c586..7d549125d0 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -23,7 +23,6 @@ import ( "net/http" "net/http/httputil" "net/url" - "strconv" "strings" "testing" "time" @@ -240,135 +239,6 @@ func TestSwagger(t *testing.T) { } } -func TestAPIKeyPermissions(t *testing.T) { - ts := strconv.FormatInt(time.Now().Unix(), 10) - none := "none-" + ts - viewer := "viewer-" + ts - editor := "editor-" + ts - admin := "admin-" + ts - - noneID := createUser(t, none) - defer deleteUser(t, noneID) - - viewerID := createUserWithRole(t, viewer, "Viewer") - defer deleteUser(t, viewerID) - - editorID := createUserWithRole(t, editor, "Editor") - defer deleteUser(t, editorID) - - adminID := createUserWithRole(t, admin, "Admin") - defer deleteUser(t, adminID) - - viewerAPIKeyID, viewerAPIKey := createAPIKeyWithRole(t, "api-"+viewer, "Viewer") - defer deleteAPIKey(t, viewerAPIKeyID) - - editorAPIKeyID, editorAPIKey := createAPIKeyWithRole(t, "api-"+editor, "Editor") - defer deleteAPIKey(t, editorAPIKeyID) - - adminAPIKeyID, adminAPIKey := createAPIKeyWithRole(t, "api-"+admin, "Admin") - defer deleteAPIKey(t, adminAPIKeyID) - - type userCase struct { - userType string - login string - apiKey string - statusCode int - } - - tests := []struct { - name string - url string - method string - userCase []userCase - }{ - {name: "settings", url: "/v1/Settings/Get", method: "POST", userCase: []userCase{ - {userType: "default", login: none, statusCode: 401}, - {userType: "viewer", login: viewer, apiKey: viewerAPIKey, statusCode: 401}, - {userType: "editor", login: editor, apiKey: editorAPIKey, statusCode: 401}, - {userType: "admin", login: admin, apiKey: adminAPIKey, statusCode: 200}, - }}, - {name: "alerts-default", url: "/alertmanager/api/v2/alerts", method: http.MethodGet, userCase: []userCase{ - {userType: "default", login: none, statusCode: 401}, - {userType: "viewer", login: viewer, apiKey: viewerAPIKey, statusCode: 401}, - {userType: "editor", login: editor, apiKey: editorAPIKey, statusCode: 401}, - {userType: "admin", login: admin, apiKey: adminAPIKey, statusCode: 200}, - }}, - {name: "platform-connect", url: "/v1/Platform/Connect", method: "POST", userCase: []userCase{ - {userType: "default", login: none, statusCode: 401}, - {userType: "viewer", login: viewer, apiKey: viewerAPIKey, statusCode: 401}, - {userType: "editor", login: editor, apiKey: editorAPIKey, statusCode: 401}, - {userType: "admin", login: admin, apiKey: adminAPIKey, statusCode: 400}, // We send bad request, but have access to endpoint - }}, - } - - for _, test := range tests { - test := test - t.Run(test.name, func(t *testing.T) { - for _, user := range test.userCase { - user := user - t.Run(fmt.Sprintf("Basic auth %s", user.userType), func(t *testing.T) { - // make a BaseURL without authentication - u, err := url.Parse(pmmapitests.BaseURL.String()) - require.NoError(t, err) - u.User = url.UserPassword(user.login, user.login) - u.Path = test.url - - req, err := http.NewRequestWithContext(pmmapitests.Context, test.method, u.String(), nil) - require.NoError(t, err) - - resp, err := http.DefaultClient.Do(req) - require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec,errcheck - - assert.Equal(t, user.statusCode, resp.StatusCode) - }) - - t.Run(fmt.Sprintf("API Key auth %s", user.userType), func(t *testing.T) { - if user.apiKey == "" { - t.Skip("API Key is not exist") - } - // make a BaseURL without authentication - u, err := url.Parse(pmmapitests.BaseURL.String()) - require.NoError(t, err) - u.User = nil - u.Path = test.url - - req, err := http.NewRequestWithContext(pmmapitests.Context, test.method, u.String(), nil) - require.NoError(t, err) - - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", user.apiKey)) - - resp, err := http.DefaultClient.Do(req) - require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec,errcheck - - assert.Equal(t, user.statusCode, resp.StatusCode) - }) - - t.Run(fmt.Sprintf("API Key Basic auth %s", user.userType), func(t *testing.T) { - if user.apiKey == "" { - t.Skip("API Key is not exist") - } - // make a BaseURL without authentication - u, err := url.Parse(pmmapitests.BaseURL.String()) - require.NoError(t, err) - u.User = url.UserPassword("api_key", user.apiKey) - u.Path = test.url - - req, err := http.NewRequestWithContext(pmmapitests.Context, test.method, u.String(), nil) - require.NoError(t, err) - - resp, err := http.DefaultClient.Do(req) - require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec,errcheck - - assert.Equal(t, user.statusCode, resp.StatusCode) - }) - } - }) - } -} - func doRequest(tb testing.TB, client *http.Client, req *http.Request) (*http.Response, []byte) { tb.Helper() resp, err := client.Do(req) @@ -382,146 +252,6 @@ func doRequest(tb testing.TB, client *http.Client, req *http.Request) (*http.Res return resp, b } -func createUserWithRole(t *testing.T, login, role string) int { - t.Helper() - userID := createUser(t, login) - setRole(t, userID, role) - - return userID -} - -func deleteUser(t *testing.T, userID int) { - t.Helper() - u, err := url.Parse(pmmapitests.BaseURL.String()) - require.NoError(t, err) - u.Path = "/graph/api/admin/users/" + strconv.Itoa(userID) - - req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodDelete, u.String(), nil) - require.NoError(t, err) - - resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec,errcheck - - require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete user, status code: %d, response: %s", resp.StatusCode, b) -} - -func createUser(t *testing.T, login string) int { - t.Helper() - u, err := url.Parse(pmmapitests.BaseURL.String()) - require.NoError(t, err) - u.Path = "/graph/api/admin/users" - - // https://grafana.com/docs/http_api/admin/#global-users - data, err := json.Marshal(map[string]string{ - "name": login, - "email": login + "@percona.invalid", - "login": login, - "password": login, - }) - require.NoError(t, err) - - req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodPost, u.String(), bytes.NewReader(data)) - require.NoError(t, err) - - req.Header.Set("Content-Type", "application/json; charset=utf-8") - - resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec,errcheck - require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to create user, status code: %d, response: %s", resp.StatusCode, b) - - var m map[string]interface{} - err = json.Unmarshal(b, &m) - require.NoError(t, err) - - return int(m["id"].(float64)) -} - -func setRole(t *testing.T, userID int, role string) { - t.Helper() - u, err := url.Parse(pmmapitests.BaseURL.String()) - require.NoError(t, err) - u.Path = "/graph/api/org/users/" + strconv.Itoa(userID) - - // https://grafana.com/docs/http_api/org/#updates-the-given-user - data, err := json.Marshal(map[string]string{ - "role": role, - }) - require.NoError(t, err) - - req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodPatch, u.String(), bytes.NewReader(data)) - require.NoError(t, err) - - req.Header.Set("Content-Type", "application/json; charset=utf-8") - resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec,errcheck - - require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to set role for user, response: %s", b) -} - -func deleteAPIKey(t *testing.T, apiKeyID int) { - t.Helper() - // https://grafana.com/docs/grafana/latest/http_api/auth/#delete-api-key - u, err := url.Parse(pmmapitests.BaseURL.String()) - require.NoError(t, err) - u.Path = "/graph/api/auth/keys/" + strconv.Itoa(apiKeyID) - - req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodDelete, u.String(), nil) - require.NoError(t, err) - - resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec,errcheck - - require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete API Key, status code: %d, response: %s", resp.StatusCode, b) -} - -func createAPIKeyWithRole(t *testing.T, name, role string) (int, string) { - t.Helper() - u, err := url.Parse(pmmapitests.BaseURL.String()) - require.NoError(t, err) - u.Path = "/graph/api/auth/keys" - - // https://grafana.com/docs/grafana/latest/http_api/auth/#create-api-key - data, err := json.Marshal(map[string]string{ - "name": name, - "role": role, - }) - require.NoError(t, err) - - req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodPost, u.String(), bytes.NewReader(data)) - require.NoError(t, err) - - req.Header.Set("Content-Type", "application/json; charset=utf-8") - - resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec,errcheck - - require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to create API key, status code: %d, response: %s", resp.StatusCode, b) - - var m map[string]interface{} - err = json.Unmarshal(b, &m) - require.NoError(t, err) - apiKey := m["key"].(string) - - u.User = nil - u.Path = "/graph/api/auth/key" - req, err = http.NewRequestWithContext(pmmapitests.Context, http.MethodGet, u.String(), bytes.NewReader(data)) - require.NoError(t, err) - req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey)) - - resp1, b := doRequest(t, http.DefaultClient, req) - defer resp1.Body.Close() //nolint:gosec,errcheck - - require.Equalf(t, http.StatusOK, resp1.StatusCode, "failed to get API key, status code: %d, response: %s", resp1.StatusCode, b) - - var k map[string]interface{} - err = json.Unmarshal(b, &k) - require.NoError(t, err) - - apiKeyID := int(k["id"].(float64)) - - return apiKeyID, apiKey -} - func TestServiceAccountPermissions(t *testing.T) { // service account role options: viewer, editor, admin // service token role options: editor, admin From 9fbce02d0e32d7ae29d9050655978c3c77abe2fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 14 Nov 2023 16:50:35 +0100 Subject: [PATCH 054/126] PMM-12251 Better error message. --- agent/commands/setup.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/agent/commands/setup.go b/agent/commands/setup.go index 99114511f0..55724b9a02 100644 --- a/agent/commands/setup.go +++ b/agent/commands/setup.go @@ -163,7 +163,7 @@ func register(cfg *config.Config, l *logrus.Entry) { cfg.Server.Username = "service_token" cfg.Server.Password = token } else { - l.Info("PMM Server responded with an empty api key token. Consider upgrading PMM Server to the latest version.") + l.Info("PMM Server responded with an empty service token. Consider upgrading PMM Server to the latest version.") } fmt.Printf("Registered.\n") } From 2cffa68101de5f00f82ae877a1c9f280aeb899d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 14 Nov 2023 17:20:39 +0100 Subject: [PATCH 055/126] PMM-12251 Remove API key methods. Refactor. --- managed/services/grafana/client.go | 41 ------------------- .../management/mock_auth_provider_test.go | 31 -------------- managed/services/management/node.go | 11 ++--- 3 files changed, 3 insertions(+), 80 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 158abab4e2..77a2936a4e 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -401,47 +401,6 @@ func (c *Client) testDeleteUser(ctx context.Context, userID int, authHeaders htt return c.do(ctx, "DELETE", "/api/admin/users/"+strconv.Itoa(userID), "", authHeaders, nil, nil) } -// CreateAdminAPIKey creates API key with Admin role and provided name. -func (c *Client) CreateAdminAPIKey(ctx context.Context, name string) (int64, string, error) { - authHeaders, err := auth.GetHeadersFromContext(ctx) - if err != nil { - return 0, "", err - } - return c.createAPIKey(ctx, name, admin, authHeaders) -} - -// DeleteAPIKeysWithPrefix deletes all API keys with provided prefix. If there is no api key with provided prefix just ignores it. -func (c *Client) DeleteAPIKeysWithPrefix(ctx context.Context, prefix string) error { - authHeaders, err := auth.GetHeadersFromContext(ctx) - if err != nil { - return err - } - var keys []apiKey - if err := c.do(ctx, http.MethodGet, "/api/auth/keys", "", authHeaders, nil, &keys); err != nil { - return err - } - - for _, k := range keys { - if strings.HasPrefix(k.Name, prefix) { - err := c.deleteAPIKey(ctx, k.ID, authHeaders) - if err != nil { - return err - } - } - } - - return nil -} - -// DeleteAPIKeyByID deletes API key by ID. -func (c *Client) DeleteAPIKeyByID(ctx context.Context, id int64) error { - authHeaders, err := auth.GetHeadersFromContext(ctx) - if err != nil { - return err - } - return c.deleteAPIKey(ctx, id, authHeaders) -} - // CreateServiceAccount creates service account with Admin role. func (c *Client) CreateServiceAccount(ctx context.Context) (int, error) { authHeaders, err := auth.GetHeadersFromContext(ctx) diff --git a/managed/services/management/mock_auth_provider_test.go b/managed/services/management/mock_auth_provider_test.go index 170964ad49..279efb19cf 100644 --- a/managed/services/management/mock_auth_provider_test.go +++ b/managed/services/management/mock_auth_provider_test.go @@ -13,37 +13,6 @@ type mockAuthProvider struct { mock.Mock } -// CreateAdminAPIKey provides a mock function with given fields: ctx, name -func (_m *mockAuthProvider) CreateAdminAPIKey(ctx context.Context, name string) (int64, string, error) { - ret := _m.Called(ctx, name) - - var r0 int64 - var r1 string - var r2 error - if rf, ok := ret.Get(0).(func(context.Context, string) (int64, string, error)); ok { - return rf(ctx, name) - } - if rf, ok := ret.Get(0).(func(context.Context, string) int64); ok { - r0 = rf(ctx, name) - } else { - r0 = ret.Get(0).(int64) - } - - if rf, ok := ret.Get(1).(func(context.Context, string) string); ok { - r1 = rf(ctx, name) - } else { - r1 = ret.Get(1).(string) - } - - if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { - r2 = rf(ctx, name) - } else { - r2 = ret.Error(2) - } - - return r0, r1, r2 -} - // CreateServiceAccount provides a mock function with given fields: ctx func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context) (int, error) { ret := _m.Called(ctx) diff --git a/managed/services/management/node.go b/managed/services/management/node.go index d8618f96be..161367bc5a 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -33,7 +33,6 @@ import ( //go:generate ../../../bin/mockery --name=authProvider --case=snake --inpackage --testonly type authProvider interface { - CreateAdminAPIKey(ctx context.Context, name string) (int64, string, error) CreateServiceAccount(ctx context.Context) (int, error) CreateServiceToken(ctx context.Context, serviceAccountID int) (int, string, error) DeleteServiceAccount(ctx context.Context) (string, error) @@ -139,11 +138,9 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo } authHeaders, e := auth.GetHeadersFromContext(ctx) - if e != nil { - return nil, e - } - token := auth.GetTokenFromHeaders(authHeaders) - if token == "" { + if e == nil { + res.Token = auth.GetTokenFromHeaders(authHeaders) + } else { serviceAcountID, e := s.ap.CreateServiceAccount(ctx) if e != nil { return nil, e @@ -152,8 +149,6 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo if e != nil { return nil, e } - } else { - res.Token = token } return res, nil From d914c397d9c2149e2f2dabd491fd10ad4e31e750 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 14 Nov 2023 18:04:09 +0100 Subject: [PATCH 056/126] PMM-12251 Fix when token is empty. --- managed/services/management/node.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/managed/services/management/node.go b/managed/services/management/node.go index 161367bc5a..62e8830bd7 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -137,9 +137,10 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo return nil, e } - authHeaders, e := auth.GetHeadersFromContext(ctx) - if e == nil { - res.Token = auth.GetTokenFromHeaders(authHeaders) + authHeaders, _ := auth.GetHeadersFromContext(ctx) + token := auth.GetTokenFromHeaders(authHeaders) + if token != "" { + res.Token = token } else { serviceAcountID, e := s.ap.CreateServiceAccount(ctx) if e != nil { From 5249ff18c2277c57db5f6e5cf58d4a4ad0e48fe6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 21 Nov 2023 11:12:32 +0100 Subject: [PATCH 057/126] PMM-12251 Basic auth tests. --- api-tests/server/auth_test.go | 178 +++++++++++++++++++++++++++++++++- 1 file changed, 175 insertions(+), 3 deletions(-) diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index 7d549125d0..84d0076f68 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -23,6 +23,7 @@ import ( "net/http" "net/http/httputil" "net/url" + "strconv" "strings" "testing" "time" @@ -252,6 +253,159 @@ func doRequest(tb testing.TB, client *http.Client, req *http.Request) (*http.Res return resp, b } +func TestBasicAuthPermissions(t *testing.T) { + ts := strconv.FormatInt(time.Now().Unix(), 10) + none := "none-" + ts + viewer := "viewer-" + ts + editor := "editor-" + ts + admin := "admin-" + ts + + noneID := createUser(t, none) + defer deleteUser(t, noneID) + + viewerID := createUserWithRole(t, viewer, "Viewer") + defer deleteUser(t, viewerID) + + editorID := createUserWithRole(t, editor, "Editor") + defer deleteUser(t, editorID) + + adminID := createUserWithRole(t, admin, "Admin") + defer deleteUser(t, adminID) + + type userCase struct { + userType string + login string + statusCode int + } + + tests := []struct { + name string + url string + method string + userCase []userCase + }{ + {name: "settings", url: "/v1/Settings/Get", method: "POST", userCase: []userCase{ + {userType: "default", login: none, statusCode: 401}, + {userType: "viewer", login: viewer, statusCode: 401}, + {userType: "editor", login: editor, statusCode: 401}, + {userType: "admin", login: admin, statusCode: 200}, + }}, + {name: "alerts-default", url: "/alertmanager/api/v2/alerts", method: http.MethodGet, userCase: []userCase{ + {userType: "default", login: none, statusCode: 401}, + {userType: "viewer", login: viewer, statusCode: 401}, + {userType: "editor", login: editor, statusCode: 401}, + {userType: "admin", login: admin, statusCode: 200}, + }}, + {name: "platform-connect", url: "/v1/Platform/Connect", method: "POST", userCase: []userCase{ + {userType: "default", login: none, statusCode: 401}, + {userType: "viewer", login: viewer, statusCode: 401}, + {userType: "editor", login: editor, statusCode: 401}, + {userType: "admin", login: admin, statusCode: 400}, // We send bad request, but have access to endpoint + }}, + } + + for _, test := range tests { + test := test + t.Run(test.name, func(t *testing.T) { + for _, user := range test.userCase { + user := user + t.Run(fmt.Sprintf("Basic auth %s", user.userType), func(t *testing.T) { + // make a BaseURL without authentication + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.User = url.UserPassword(user.login, user.login) + u.Path = test.url + + req, err := http.NewRequestWithContext(pmmapitests.Context, test.method, u.String(), nil) + require.NoError(t, err) + + resp, err := http.DefaultClient.Do(req) + require.NoError(t, err) + defer resp.Body.Close() //nolint:gosec,errcheck + + assert.Equal(t, user.statusCode, resp.StatusCode) + }) + } + }) + } +} + +func createUserWithRole(t *testing.T, login, role string) int { + t.Helper() + userID := createUser(t, login) + setRole(t, userID, role) + + return userID +} + +func deleteUser(t *testing.T, userID int) { + t.Helper() + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.Path = "/graph/api/admin/users/" + strconv.Itoa(userID) + + req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodDelete, u.String(), nil) + require.NoError(t, err) + + resp, b := doRequest(t, http.DefaultClient, req) + defer resp.Body.Close() //nolint:gosec,errcheck + + require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete user, status code: %d, response: %s", resp.StatusCode, b) +} + +func createUser(t *testing.T, login string) int { + t.Helper() + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.Path = "/graph/api/admin/users" + + // https://grafana.com/docs/http_api/admin/#global-users + data, err := json.Marshal(map[string]string{ + "name": login, + "email": login + "@percona.invalid", + "login": login, + "password": login, + }) + require.NoError(t, err) + + req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodPost, u.String(), bytes.NewReader(data)) + require.NoError(t, err) + + req.Header.Set("Content-Type", "application/json; charset=utf-8") + + resp, b := doRequest(t, http.DefaultClient, req) + defer resp.Body.Close() //nolint:gosec,errcheck + require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to create user, status code: %d, response: %s", resp.StatusCode, b) + + var m map[string]interface{} + err = json.Unmarshal(b, &m) + require.NoError(t, err) + + return int(m["id"].(float64)) +} + +func setRole(t *testing.T, userID int, role string) { + t.Helper() + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.Path = "/graph/api/org/users/" + strconv.Itoa(userID) + + // https://grafana.com/docs/http_api/org/#updates-the-given-user + data, err := json.Marshal(map[string]string{ + "role": role, + }) + require.NoError(t, err) + + req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodPatch, u.String(), bytes.NewReader(data)) + require.NoError(t, err) + + req.Header.Set("Content-Type", "application/json; charset=utf-8") + resp, b := doRequest(t, http.DefaultClient, req) + defer resp.Body.Close() //nolint:gosec,errcheck + + require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to set role for user, response: %s", b) +} + func TestServiceAccountPermissions(t *testing.T) { // service account role options: viewer, editor, admin // service token role options: editor, admin @@ -259,7 +413,9 @@ func TestServiceAccountPermissions(t *testing.T) { // service_token:token could be used in pmm-agent and pmm-admin (its transformed into Bearer authorization) viewerAccountID := createServiceAccountWithRole(t, "Viewer") + viewerTokenID, viewerToken := createServiceToken(t, viewerAccountID) defer deleteServiceAccount(t, viewerAccountID) + defer deleteServiceToken(t, viewerAccountID, viewerTokenID) editorAccountID := createServiceAccountWithRole(t, "Editor") editorTokenID, editorToken := createServiceToken(t, editorAccountID) @@ -285,19 +441,19 @@ func TestServiceAccountPermissions(t *testing.T) { }{ {name: "settings", url: "/v1/Settings/Get", method: "POST", userCase: []userCase{ {userType: "default", statusCode: 401}, - {userType: "viewer", serviceToken: "", statusCode: 401}, + {userType: "viewer", serviceToken: viewerToken, statusCode: 401}, {userType: "editor", serviceToken: editorToken, statusCode: 401}, {userType: "admin", serviceToken: adminToken, statusCode: 200}, }}, {name: "alerts-default", url: "/alertmanager/api/v2/alerts", method: http.MethodGet, userCase: []userCase{ {userType: "default", statusCode: 401}, - {userType: "viewer", serviceToken: "", statusCode: 401}, + {userType: "viewer", serviceToken: viewerToken, statusCode: 401}, {userType: "editor", serviceToken: editorToken, statusCode: 401}, {userType: "admin", serviceToken: adminToken, statusCode: 200}, }}, {name: "platform-connect", url: "/v1/Platform/Connect", method: "POST", userCase: []userCase{ {userType: "default", statusCode: 401}, - {userType: "viewer", serviceToken: "", statusCode: 401}, + {userType: "viewer", serviceToken: viewerToken, statusCode: 401}, {userType: "editor", serviceToken: editorToken, statusCode: 401}, {userType: "admin", serviceToken: adminToken, statusCode: 400}, // We send bad request, but have access to endpoint }}, @@ -326,6 +482,22 @@ func TestServiceAccountPermissions(t *testing.T) { assert.Equal(t, user.statusCode, resp.StatusCode) }) + + t.Run(fmt.Sprintf("Basic auth with Service Token %s", user.userType), func(t *testing.T) { + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.User = url.UserPassword("service_token", user.serviceToken) + u.Path = test.url + + req, err := http.NewRequestWithContext(pmmapitests.Context, test.method, u.String(), nil) + require.NoError(t, err) + + resp, err := http.DefaultClient.Do(req) + require.NoError(t, err) + defer resp.Body.Close() //nolint:gosec,errcheck + + assert.Equal(t, user.statusCode, resp.StatusCode) + }) } }) } From 3da66877db666cf21bc3e741fa0797148dbcbbbf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 21 Nov 2023 11:14:18 +0100 Subject: [PATCH 058/126] PMM-12251 Small refactor. --- managed/services/grafana/client.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 77a2936a4e..4468ab3fa2 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -444,8 +444,7 @@ func (c *Client) DeleteServiceAccount(ctx context.Context) (string, error) { return warning, err } - customsTokensCount := 0 - customsTokensCount, err = c.getNotPMMAgentTokenCountForServiceAccount(ctx, authHeaders) + customsTokensCount, err := c.getNotPMMAgentTokenCountForServiceAccount(ctx, authHeaders) if err != nil { return warning, err } From b1ff21a6ade75277163b0808d729c0372276081c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 14 Nov 2023 13:22:03 +0100 Subject: [PATCH 059/126] PMM-12251 API Tests clean. --- api-tests/helpers.go | 38 +- .../agents_azure_database_exporter_test.go | 16 +- .../agents_external_exporter_test.go | 22 +- .../inventory/agents_mongodb_exporter_test.go | 16 +- .../inventory/agents_mysqld_exporter_test.go | 22 +- .../inventory/agents_node_exporter_test.go | 8 +- .../agents_postgres_exporter_test.go | 18 +- .../agents_proxysql_exporter_test.go | 18 +- .../inventory/agents_rds_exporter_test.go | 16 +- api-tests/inventory/agents_test.go | 50 +- api-tests/inventory/nodes_test.go | 46 +- api-tests/inventory/services_test.go | 66 +- api-tests/management/annotation_test.go | 4 +- api-tests/management/backup/backups_test.go | 2 +- api-tests/management/external_test.go | 26 +- api-tests/management/haproxy_test.go | 24 +- api-tests/management/mongodb_test.go | 42 +- api-tests/management/mysql_test.go | 1613 ++++++++--------- api-tests/management/nodes_test.go | 24 +- api-tests/management/postgresql_test.go | 40 +- api-tests/management/proxysql_test.go | 36 +- .../client/node/unregister_node_responses.go | 3 + api/managementpb/json/managementpb.json | 5 + api/managementpb/node.pb.go | 86 +- api/managementpb/node.pb.validate.go | 2 + api/managementpb/node.proto | 2 + api/swagger/swagger-dev.json | 5 + api/swagger/swagger.json | 5 + managed/services/grafana/client.go | 4 +- .../management/mock_auth_provider_test.go | 23 +- managed/services/management/node.go | 4 +- 31 files changed, 1169 insertions(+), 1117 deletions(-) diff --git a/api-tests/helpers.go b/api-tests/helpers.go index 5ef69250b9..9960f21716 100644 --- a/api-tests/helpers.go +++ b/api-tests/helpers.go @@ -26,10 +26,12 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" - "github.com/percona/pmm/api/inventorypb/json/client" + inventoryClient "github.com/percona/pmm/api/inventorypb/json/client" "github.com/percona/pmm/api/inventorypb/json/client/agents" "github.com/percona/pmm/api/inventorypb/json/client/nodes" "github.com/percona/pmm/api/inventorypb/json/client/services" + "github.com/percona/pmm/api/managementpb/json/client" + "github.com/percona/pmm/api/managementpb/json/client/node" ) type ErrorResponse interface { @@ -128,6 +130,26 @@ func (tt *expectedFailureTestingT) Check() { tt.t.Fatalf("%s expected to fail, but didn't: %s", tt.Name(), tt.link) } +func UnregisterNodes(t TestingT, nodeIDs ...string) { + t.Helper() + + for _, nodeID := range nodeIDs { + params := &node.UnregisterNodeParams{ + Body: node.UnregisterNodeBody{ + NodeID: nodeID, + Force: true, + }, + Context: context.Background(), + } + + res, err := client.Default.Node.UnregisterNode(params) + assert.NoError(t, err) + assert.NotNil(t, res) + assert.NotNil(t, res.Payload) + assert.Empty(t, res.Payload.Warning) + } +} + func RemoveNodes(t TestingT, nodeIDs ...string) { t.Helper() @@ -138,7 +160,7 @@ func RemoveNodes(t TestingT, nodeIDs ...string) { }, Context: context.Background(), } - res, err := client.Default.Nodes.RemoveNode(params) + res, err := inventoryClient.Default.Nodes.RemoveNode(params) assert.NoError(t, err) assert.NotNil(t, res) } @@ -155,7 +177,7 @@ func RemoveServices(t TestingT, serviceIDs ...string) { }, Context: context.Background(), } - res, err := client.Default.Services.RemoveService(params) + res, err := inventoryClient.Default.Services.RemoveService(params) assert.NoError(t, err) assert.NotNil(t, res) } @@ -171,7 +193,7 @@ func RemoveAgents(t TestingT, agentIDs ...string) { }, Context: context.Background(), } - res, err := client.Default.Agents.RemoveAgent(params) + res, err := inventoryClient.Default.Agents.RemoveAgent(params) assert.NoError(t, err) assert.NotNil(t, res) } @@ -187,7 +209,7 @@ func AddGenericNode(t TestingT, nodeName string) *nodes.AddGenericNodeOKBodyGene }, Context: Context, } - res, err := client.Default.Nodes.AddGenericNode(params) + res, err := inventoryClient.Default.Nodes.AddGenericNode(params) assert.NoError(t, err) require.NotNil(t, res) require.NotNil(t, res.Payload) @@ -205,7 +227,7 @@ func AddRemoteNode(t TestingT, nodeName string) *nodes.AddRemoteNodeOKBody { }, Context: Context, } - res, err := client.Default.Nodes.AddRemoteNode(params) + res, err := inventoryClient.Default.Nodes.AddRemoteNode(params) assert.NoError(t, err) require.NotNil(t, res) return res.Payload @@ -219,7 +241,7 @@ func AddNode(t TestingT, nodeBody *nodes.AddNodeBody) *nodes.AddNodeOKBody { Context: Context, } - res, err := client.Default.Nodes.AddNode(params) + res, err := inventoryClient.Default.Nodes.AddNode(params) assert.NoError(t, err) require.NotNil(t, res) @@ -229,7 +251,7 @@ func AddNode(t TestingT, nodeBody *nodes.AddNodeBody) *nodes.AddNodeOKBody { func AddPMMAgent(t TestingT, nodeID string) *agents.AddPMMAgentOKBody { t.Helper() - res, err := client.Default.Agents.AddPMMAgent(&agents.AddPMMAgentParams{ + res, err := inventoryClient.Default.Agents.AddPMMAgent(&agents.AddPMMAgentParams{ Body: agents.AddPMMAgentBody{ RunsOnNodeID: nodeID, }, diff --git a/api-tests/inventory/agents_azure_database_exporter_test.go b/api-tests/inventory/agents_azure_database_exporter_test.go index 5228a6169e..04b8931f85 100644 --- a/api-tests/inventory/agents_azure_database_exporter_test.go +++ b/api-tests/inventory/agents_azure_database_exporter_test.go @@ -34,11 +34,11 @@ func TestAzureDatabaseExporter(t *testing.T) { //nolint:tparallel t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := addRemoteAzureDatabaseNode(t, pmmapitests.TestString(t, "Remote node for Azure database exporter")) nodeID := node.RemoteAzureDatabase.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -137,7 +137,7 @@ func TestAzureDatabaseExporter(t *testing.T) { //nolint:tparallel genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -152,7 +152,7 @@ func TestAzureDatabaseExporter(t *testing.T) { //nolint:tparallel }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddAzureDatabaseExporterRequest.NodeId: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.AzureDatabaseExporter.AgentID) + pmmapitests.UnregisterNodes(t, res.Payload.AzureDatabaseExporter.AgentID) } }) @@ -161,7 +161,7 @@ func TestAzureDatabaseExporter(t *testing.T) { //nolint:tparallel genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -185,7 +185,7 @@ func TestAzureDatabaseExporter(t *testing.T) { //nolint:tparallel t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) res, err := client.Default.Agents.AddAzureDatabaseExporter(&agents.AddAzureDatabaseExporterParams{ Body: agents.AddAzureDatabaseExporterBody{ @@ -204,11 +204,11 @@ func TestAzureDatabaseExporter(t *testing.T) { //nolint:tparallel t.Run("With PushMetrics", func(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := addRemoteAzureDatabaseNode(t, pmmapitests.TestString(t, "Remote node for Azure database exporter")) nodeID := node.RemoteAzureDatabase.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID diff --git a/api-tests/inventory/agents_external_exporter_test.go b/api-tests/inventory/agents_external_exporter_test.go index d1562a148e..d226bd35ce 100644 --- a/api-tests/inventory/agents_external_exporter_test.go +++ b/api-tests/inventory/agents_external_exporter_test.go @@ -35,7 +35,7 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addExternalService(t, services.AddExternalServiceBody{ NodeID: genericNodeID, @@ -81,11 +81,11 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for external exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) service := addExternalService(t, services.AddExternalServiceBody{ NodeID: nodeID, @@ -190,7 +190,7 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) res, err := client.Default.Agents.AddExternalExporter(&agents.AddExternalExporterParams{ Body: agents.AddExternalExporterBody{ @@ -202,7 +202,7 @@ func TestExternalExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Empty Service ID.") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.ExternalExporter.AgentID) + pmmapitests.UnregisterNodes(t, res.Payload.ExternalExporter.AgentID) } }) @@ -211,7 +211,7 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addExternalService(t, services.AddExternalServiceBody{ NodeID: genericNodeID, @@ -230,7 +230,7 @@ func TestExternalExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddExternalExporterRequest.ListenPort: value must be inside range (0, 65536)") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.ExternalExporter.AgentID) + pmmapitests.UnregisterNodes(t, res.Payload.ExternalExporter.AgentID) } }) @@ -239,7 +239,7 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addExternalService(t, services.AddExternalServiceBody{ NodeID: genericNodeID, @@ -268,7 +268,7 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) res, err := client.Default.Agents.AddExternalExporter(&agents.AddExternalExporterParams{ Body: agents.AddExternalExporterBody{ @@ -289,7 +289,7 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addExternalService(t, services.AddExternalServiceBody{ NodeID: genericNodeID, @@ -318,7 +318,7 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID defer pmmapitests.RemoveAgents(t, pmmAgentID) diff --git a/api-tests/inventory/agents_mongodb_exporter_test.go b/api-tests/inventory/agents_mongodb_exporter_test.go index 92e937b248..6040b81981 100644 --- a/api-tests/inventory/agents_mongodb_exporter_test.go +++ b/api-tests/inventory/agents_mongodb_exporter_test.go @@ -35,11 +35,11 @@ func TestMongoDBExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) service := addMongoDBService(t, services.AddMongoDBServiceBody{ NodeID: genericNodeID, @@ -148,7 +148,7 @@ func TestMongoDBExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -172,7 +172,7 @@ func TestMongoDBExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addMongoDBService(t, services.AddMongoDBServiceBody{ NodeID: genericNodeID, @@ -203,7 +203,7 @@ func TestMongoDBExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -229,7 +229,7 @@ func TestMongoDBExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addMongoDBService(t, services.AddMongoDBServiceBody{ NodeID: genericNodeID, @@ -260,11 +260,11 @@ func TestMongoDBExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) service := addMongoDBService(t, services.AddMongoDBServiceBody{ NodeID: genericNodeID, diff --git a/api-tests/inventory/agents_mysqld_exporter_test.go b/api-tests/inventory/agents_mysqld_exporter_test.go index 014c78d2a6..0bbc44e726 100644 --- a/api-tests/inventory/agents_mysqld_exporter_test.go +++ b/api-tests/inventory/agents_mysqld_exporter_test.go @@ -35,11 +35,11 @@ func TestMySQLdExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -149,11 +149,11 @@ func TestMySQLdExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -202,7 +202,7 @@ func TestMySQLdExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -217,7 +217,7 @@ func TestMySQLdExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddMySQLdExporterRequest.ServiceId: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.MysqldExporter.AgentID) + pmmapitests.UnregisterNodes(t, res.Payload.MysqldExporter.AgentID) } }) @@ -226,7 +226,7 @@ func TestMySQLdExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -257,7 +257,7 @@ func TestMySQLdExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -283,7 +283,7 @@ func TestMySQLdExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -314,11 +314,11 @@ func TestMySQLdExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, diff --git a/api-tests/inventory/agents_node_exporter_test.go b/api-tests/inventory/agents_node_exporter_test.go index 2cfdd8f20a..890d146261 100644 --- a/api-tests/inventory/agents_node_exporter_test.go +++ b/api-tests/inventory/agents_node_exporter_test.go @@ -34,7 +34,7 @@ func TestNodeExporter(t *testing.T) { node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) pmmAgent := pmmapitests.AddPMMAgent(t, nodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -124,7 +124,7 @@ func TestNodeExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddNodeExporterRequest.PmmAgentId: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.NodeExporter.AgentID) + pmmapitests.UnregisterNodes(t, res.Payload.NodeExporter.AgentID) } }) @@ -137,7 +137,7 @@ func TestNodeExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 404, codes.NotFound, "Agent with ID \"pmm-node-exporter-node\" not found.") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.NodeExporter.AgentID) + pmmapitests.UnregisterNodes(t, res.Payload.NodeExporter.AgentID) } }) @@ -146,7 +146,7 @@ func TestNodeExporter(t *testing.T) { node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) pmmAgent := pmmapitests.AddPMMAgent(t, nodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID diff --git a/api-tests/inventory/agents_postgres_exporter_test.go b/api-tests/inventory/agents_postgres_exporter_test.go index 218412fbd4..bbb2550f6d 100644 --- a/api-tests/inventory/agents_postgres_exporter_test.go +++ b/api-tests/inventory/agents_postgres_exporter_test.go @@ -35,11 +35,11 @@ func TestPostgresExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -148,7 +148,7 @@ func TestPostgresExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -163,7 +163,7 @@ func TestPostgresExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddPostgresExporterRequest.ServiceId: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.PostgresExporter.AgentID) + pmmapitests.UnregisterNodes(t, res.Payload.PostgresExporter.AgentID) } }) @@ -172,7 +172,7 @@ func TestPostgresExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -203,7 +203,7 @@ func TestPostgresExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -229,7 +229,7 @@ func TestPostgresExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -260,11 +260,11 @@ func TestPostgresExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, diff --git a/api-tests/inventory/agents_proxysql_exporter_test.go b/api-tests/inventory/agents_proxysql_exporter_test.go index 0e1bd10654..9a598f8999 100644 --- a/api-tests/inventory/agents_proxysql_exporter_test.go +++ b/api-tests/inventory/agents_proxysql_exporter_test.go @@ -35,11 +35,11 @@ func TestProxySQLExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) service := addProxySQLService(t, services.AddProxySQLServiceBody{ NodeID: genericNodeID, @@ -148,7 +148,7 @@ func TestProxySQLExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -163,7 +163,7 @@ func TestProxySQLExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddProxySQLExporterRequest.ServiceId: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.ProxysqlExporter.AgentID) + pmmapitests.UnregisterNodes(t, res.Payload.ProxysqlExporter.AgentID) } }) @@ -172,7 +172,7 @@ func TestProxySQLExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addProxySQLService(t, services.AddProxySQLServiceBody{ NodeID: genericNodeID, @@ -203,7 +203,7 @@ func TestProxySQLExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -229,7 +229,7 @@ func TestProxySQLExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addProxySQLService(t, services.AddProxySQLServiceBody{ NodeID: genericNodeID, @@ -257,11 +257,11 @@ func TestProxySQLExporter(t *testing.T) { t.Run("With PushMetrics", func(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) service := addProxySQLService(t, services.AddProxySQLServiceBody{ NodeID: genericNodeID, diff --git a/api-tests/inventory/agents_rds_exporter_test.go b/api-tests/inventory/agents_rds_exporter_test.go index 7b59c38938..6b52c0ce88 100644 --- a/api-tests/inventory/agents_rds_exporter_test.go +++ b/api-tests/inventory/agents_rds_exporter_test.go @@ -32,11 +32,11 @@ func TestRDSExporter(t *testing.T) { t.Run("Basic", func(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := addRemoteRDSNode(t, pmmapitests.TestString(t, "Remote node for RDS exporter")) nodeID := node.RemoteRDS.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -139,7 +139,7 @@ func TestRDSExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -154,7 +154,7 @@ func TestRDSExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddRDSExporterRequest.NodeId: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.RDSExporter.AgentID) + pmmapitests.UnregisterNodes(t, res.Payload.RDSExporter.AgentID) } }) @@ -163,7 +163,7 @@ func TestRDSExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -186,7 +186,7 @@ func TestRDSExporter(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) res, err := client.Default.Agents.AddRDSExporter(&agents.AddRDSExporterParams{ Body: agents.AddRDSExporterBody{ @@ -204,11 +204,11 @@ func TestRDSExporter(t *testing.T) { t.Run("With PushMetrics", func(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := addRemoteRDSNode(t, pmmapitests.TestString(t, "Remote node for RDS exporter")) nodeID := node.RemoteRDS.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID diff --git a/api-tests/inventory/agents_test.go b/api-tests/inventory/agents_test.go index 5c785b77e5..03bc72cd29 100644 --- a/api-tests/inventory/agents_test.go +++ b/api-tests/inventory/agents_test.go @@ -42,11 +42,11 @@ func TestAgents(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Generic node for agents list")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for agents list")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -86,11 +86,11 @@ func TestAgents(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Generic node for agents filters")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for agents filters")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -184,7 +184,7 @@ func TestAgents(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -207,7 +207,7 @@ func TestAgents(t *testing.T) { nodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, nodeID) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) pmmAgentID := pmmapitests.AddPMMAgent(t, nodeID).PMMAgent.AgentID defer pmmapitests.RemoveAgents(t, pmmAgentID) @@ -242,7 +242,7 @@ func TestPMMAgent(t *testing.T) { node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for PMM-agent")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) res := pmmapitests.AddPMMAgent(t, nodeID) require.Equal(t, nodeID, res.PMMAgent.RunsOnNodeID) @@ -282,7 +282,7 @@ func TestPMMAgent(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddPMMAgentRequest.RunsOnNodeId: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.PMMAgent.AgentID) + pmmapitests.UnregisterNodes(t, res.Payload.PMMAgent.AgentID) } }) @@ -291,7 +291,7 @@ func TestPMMAgent(t *testing.T) { node := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Generic node for PMM-agent")) nodeID := node.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: nodeID, @@ -453,7 +453,7 @@ func TestQanAgentExporter(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -566,7 +566,7 @@ func TestQanAgentExporter(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -593,7 +593,7 @@ func TestQanAgentExporter(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -625,7 +625,7 @@ func TestQanAgentExporter(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -650,7 +650,7 @@ func TestQanAgentExporter(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -683,7 +683,7 @@ func TestPGStatStatementsQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan PostgreSQL Agent pg_stat_statements")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -796,7 +796,7 @@ func TestPGStatStatementsQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -823,7 +823,7 @@ func TestPGStatStatementsQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -855,7 +855,7 @@ func TestPGStatStatementsQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -880,7 +880,7 @@ func TestPGStatStatementsQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -913,7 +913,7 @@ func TestPGStatMonitorQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan PostgreSQL Agent pg_stat_monitor")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -1027,7 +1027,7 @@ func TestPGStatMonitorQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan PostgreSQL Agent pg_stat_monitor")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -1088,7 +1088,7 @@ func TestPGStatMonitorQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -1115,7 +1115,7 @@ func TestPGStatMonitorQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -1147,7 +1147,7 @@ func TestPGStatMonitorQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -1172,7 +1172,7 @@ func TestPGStatMonitorQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, diff --git a/api-tests/inventory/nodes_test.go b/api-tests/inventory/nodes_test.go index 6cd3d5c466..d40ab43821 100644 --- a/api-tests/inventory/nodes_test.go +++ b/api-tests/inventory/nodes_test.go @@ -38,10 +38,10 @@ func TestNodesDeprecated(t *testing.T) { remoteNode := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Test Remote Node for List")) remoteNodeID := remoteNode.Remote.NodeID - defer pmmapitests.RemoveNodes(t, remoteNodeID) + defer pmmapitests.UnregisterNodes(t, remoteNodeID) genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for List")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) res, err := client.Default.Nodes.ListNodes(nil) require.NoError(t, err) @@ -103,7 +103,7 @@ func TestNodes(t *testing.T) { }, }) remoteNodeID := remoteNode.Remote.NodeID - t.Cleanup(func() { pmmapitests.RemoveNodes(t, remoteNodeID) }) + t.Cleanup(func() { pmmapitests.UnregisterNodes(t, remoteNodeID) }) genericNode := pmmapitests.AddNode(t, &nodes.AddNodeBody{ Generic: &nodes.AddNodeParamsBodyGeneric{ @@ -113,7 +113,7 @@ func TestNodes(t *testing.T) { }) genericNodeID := genericNode.Generic.NodeID require.NotEmpty(t, genericNodeID) - t.Cleanup(func() { pmmapitests.RemoveNodes(t, genericNodeID) }) + t.Cleanup(func() { pmmapitests.UnregisterNodes(t, genericNodeID) }) res, err := client.Default.Nodes.ListNodes(nil) require.NoError(t, err) @@ -171,7 +171,7 @@ func TestGetNode(t *testing.T) { nodeName := pmmapitests.TestString(t, "TestGenericNode") nodeID := pmmapitests.AddGenericNode(t, nodeName).NodeID require.NotEmpty(t, nodeID) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) expectedResponse := nodes.GetNodeOK{ Payload: &nodes.GetNodeOKBody{ @@ -235,7 +235,7 @@ func TestGenericNodeDeprecated(t *testing.T) { require.NotNil(t, res) require.NotNil(t, res.Payload.Generic) nodeID := res.Payload.Generic.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) // Check node exists in DB. getNodeRes, err := client.Default.Nodes.GetNode(&nodes.GetNodeParams{ @@ -258,7 +258,7 @@ func TestGenericNodeDeprecated(t *testing.T) { res, err = client.Default.Nodes.AddGenericNode(params) pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, "Node with name %q already exists.", nodeName) if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.Generic.NodeID) + pmmapitests.UnregisterNodes(t, res.Payload.Generic.NodeID) } }) @@ -272,7 +272,7 @@ func TestGenericNodeDeprecated(t *testing.T) { res, err := client.Default.Nodes.AddGenericNode(params) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddGenericNodeRequest.NodeName: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.Generic.NodeID) + pmmapitests.UnregisterNodes(t, res.Payload.Generic.NodeID) } }) } @@ -297,7 +297,7 @@ func TestGenericNode(t *testing.T) { require.NotNil(t, res) require.NotNil(t, res.Payload.Generic) nodeID := res.Payload.Generic.NodeID - t.Cleanup(func() { pmmapitests.RemoveNodes(t, nodeID) }) + t.Cleanup(func() { pmmapitests.UnregisterNodes(t, nodeID) }) // Check that the node exists in DB. getNodeRes, err := client.Default.Nodes.GetNode(&nodes.GetNodeParams{ @@ -320,7 +320,7 @@ func TestGenericNode(t *testing.T) { res, err = client.Default.Nodes.AddNode(params) pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, "Node with name %q already exists.", nodeName) if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.Generic.NodeID) + pmmapitests.UnregisterNodes(t, res.Payload.Generic.NodeID) } }) @@ -336,7 +336,7 @@ func TestGenericNode(t *testing.T) { res, err := client.Default.Nodes.AddNode(params) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddGenericNodeRequest.NodeName: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.Generic.NodeID) + pmmapitests.UnregisterNodes(t, res.Payload.Generic.NodeID) } }) } @@ -361,7 +361,7 @@ func TestContainerNodeDeprecated(t *testing.T) { require.NoError(t, err) require.NotNil(t, res.Payload.Container) nodeID := res.Payload.Container.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) // Check node exists in DB. getNodeRes, err := client.Default.Nodes.GetNode(&nodes.GetNodeParams{ @@ -387,7 +387,7 @@ func TestContainerNodeDeprecated(t *testing.T) { res, err = client.Default.Nodes.AddContainerNode(params) pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, "Node with name %q already exists.", nodeName) if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.Container.NodeID) + pmmapitests.UnregisterNodes(t, res.Payload.Container.NodeID) } }) @@ -401,7 +401,7 @@ func TestContainerNodeDeprecated(t *testing.T) { res, err := client.Default.Nodes.AddContainerNode(params) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddContainerNodeRequest.NodeName: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.Container.NodeID) + pmmapitests.UnregisterNodes(t, res.Payload.Container.NodeID) } }) } @@ -428,7 +428,7 @@ func TestContainerNode(t *testing.T) { require.NoError(t, err) require.NotNil(t, res.Payload.Container) nodeID := res.Payload.Container.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) // Check that the node exists in DB. getNodeRes, err := client.Default.Nodes.GetNode(&nodes.GetNodeParams{ @@ -454,7 +454,7 @@ func TestContainerNode(t *testing.T) { res, err = client.Default.Nodes.AddNode(params) pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, "Node with name %q already exists.", nodeName) if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.Container.NodeID) + pmmapitests.UnregisterNodes(t, res.Payload.Container.NodeID) } }) @@ -470,7 +470,7 @@ func TestContainerNode(t *testing.T) { res, err := client.Default.Nodes.AddNode(params) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddContainerNodeRequest.NodeName: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.Container.NodeID) + pmmapitests.UnregisterNodes(t, res.Payload.Container.NodeID) } }) } @@ -495,7 +495,7 @@ func TestRemoteNodeDeprecated(t *testing.T) { require.NoError(t, err) require.NotNil(t, res.Payload.Remote) nodeID := res.Payload.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) // Check node exists in DB. getNodeRes, err := client.Default.Nodes.GetNode(&nodes.GetNodeParams{ @@ -521,7 +521,7 @@ func TestRemoteNodeDeprecated(t *testing.T) { res, err = client.Default.Nodes.AddRemoteNode(params) pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, "Node with name %q already exists.", nodeName) if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.Remote.NodeID) + pmmapitests.UnregisterNodes(t, res.Payload.Remote.NodeID) } }) @@ -535,7 +535,7 @@ func TestRemoteNodeDeprecated(t *testing.T) { res, err := client.Default.Nodes.AddRemoteNode(params) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddRemoteNodeRequest.NodeName: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.Remote.NodeID) + pmmapitests.UnregisterNodes(t, res.Payload.Remote.NodeID) } }) } @@ -562,7 +562,7 @@ func TestRemoteNode(t *testing.T) { require.NoError(t, err) require.NotNil(t, res.Payload.Remote) nodeID := res.Payload.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) // Check node exists in DB. getNodeRes, err := client.Default.Nodes.GetNode(&nodes.GetNodeParams{ @@ -588,7 +588,7 @@ func TestRemoteNode(t *testing.T) { res, err = client.Default.Nodes.AddNode(params) pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, "Node with name %q already exists.", nodeName) if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.Remote.NodeID) + pmmapitests.UnregisterNodes(t, res.Payload.Remote.NodeID) } }) @@ -604,7 +604,7 @@ func TestRemoteNode(t *testing.T) { res, err := client.Default.Nodes.AddNode(params) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddRemoteNodeRequest.NodeName: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.RemoveNodes(t, res.Payload.Remote.NodeID) + pmmapitests.UnregisterNodes(t, res.Payload.Remote.NodeID) } }) } diff --git a/api-tests/inventory/services_test.go b/api-tests/inventory/services_test.go index ae0ae00521..d25f6f8dd8 100644 --- a/api-tests/inventory/services_test.go +++ b/api-tests/inventory/services_test.go @@ -37,11 +37,11 @@ func TestServices(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for services test")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.RemoveNodes(t, remoteNodeID) + defer pmmapitests.UnregisterNodes(t, remoteNodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -136,11 +136,11 @@ func TestServices(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node to check services filter")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.RemoveNodes(t, remoteNodeID) + defer pmmapitests.UnregisterNodes(t, remoteNodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -206,7 +206,7 @@ func TestRemoveService(t *testing.T) { node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for agents list")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: nodeID, @@ -232,7 +232,7 @@ func TestRemoveService(t *testing.T) { node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for agents list")) nodeID := node.Remote.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: nodeID, @@ -328,7 +328,7 @@ func TestMySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "Basic MySQL Service") params := &services.AddMySQLServiceParams{ @@ -417,7 +417,7 @@ func TestMySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddMySQLServiceParams{ Body: services.AddMySQLServiceBody{ @@ -439,7 +439,7 @@ func TestMySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddMySQLServiceParams{ Body: services.AddMySQLServiceBody{ @@ -463,7 +463,7 @@ func TestMySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddMySQLServiceParams{ Body: services.AddMySQLServiceBody{ @@ -486,7 +486,7 @@ func TestMySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddMySQLServiceParams{ Body: services.AddMySQLServiceBody{ @@ -507,7 +507,7 @@ func TestMySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddMySQLServiceParams{ Body: services.AddMySQLServiceBody{ @@ -531,7 +531,7 @@ func TestMongoDBService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "Basic Mongo Service") params := &services.AddMongoDBServiceParams{ @@ -618,7 +618,7 @@ func TestMongoDBService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddMongoDBServiceParams{ Body: services.AddMongoDBServiceBody{ @@ -639,7 +639,7 @@ func TestMongoDBService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddMongoDBServiceParams{ Body: services.AddMongoDBServiceBody{ @@ -663,7 +663,7 @@ func TestMongoDBService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddMongoDBServiceParams{ Body: services.AddMongoDBServiceBody{ @@ -686,7 +686,7 @@ func TestMongoDBService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddMongoDBServiceParams{ Body: services.AddMongoDBServiceBody{ @@ -706,7 +706,7 @@ func TestMongoDBService(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) require.NotEmpty(t, genericNodeID) serviceName := pmmapitests.TestString(t, "Mongo with Socket Service") @@ -745,7 +745,7 @@ func TestPostgreSQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "Basic PostgreSQL Service") params := &services.AddPostgreSQLServiceParams{ @@ -836,7 +836,7 @@ func TestPostgreSQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddPostgreSQLServiceParams{ Body: services.AddPostgreSQLServiceBody{ @@ -858,7 +858,7 @@ func TestPostgreSQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddPostgreSQLServiceParams{ Body: services.AddPostgreSQLServiceBody{ @@ -879,7 +879,7 @@ func TestPostgreSQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddPostgreSQLServiceParams{ Body: services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -902,7 +902,7 @@ func TestPostgreSQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddPostgreSQLServiceParams{ Body: services.AddPostgreSQLServiceBody{ @@ -925,7 +925,7 @@ func TestPostgreSQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddPostgreSQLServiceParams{ Body: services.AddPostgreSQLServiceBody{ @@ -949,7 +949,7 @@ func TestProxySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "Basic ProxySQL Service") params := &services.AddProxySQLServiceParams{ @@ -1038,7 +1038,7 @@ func TestProxySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddProxySQLServiceParams{ Body: services.AddProxySQLServiceBody{ @@ -1060,7 +1060,7 @@ func TestProxySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddProxySQLServiceParams{ Body: services.AddProxySQLServiceBody{ @@ -1084,7 +1084,7 @@ func TestProxySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddProxySQLServiceParams{ Body: services.AddProxySQLServiceBody{ @@ -1107,7 +1107,7 @@ func TestProxySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddProxySQLServiceParams{ Body: services.AddProxySQLServiceBody{ @@ -1128,7 +1128,7 @@ func TestProxySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddProxySQLServiceParams{ Body: services.AddProxySQLServiceBody{ @@ -1163,7 +1163,7 @@ func TestExternalService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "Basic External Service") params := &services.AddExternalServiceParams{ @@ -1293,7 +1293,7 @@ func TestExternalService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) params := &services.AddExternalServiceParams{ Body: services.AddExternalServiceBody{ @@ -1314,7 +1314,7 @@ func TestExternalService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "Basic External Service") params := &services.AddExternalServiceParams{ diff --git a/api-tests/management/annotation_test.go b/api-tests/management/annotation_test.go index e35272cb74..10709f84d1 100644 --- a/api-tests/management/annotation_test.go +++ b/api-tests/management/annotation_test.go @@ -91,7 +91,7 @@ func TestAddAnnotation(t *testing.T) { resNode, err := inventoryClient.Default.Nodes.AddGenericNode(paramsNode) assert.NoError(t, err) genericNodeID := resNode.Payload.Generic.NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "annotation-service") paramsService := &services.AddMySQLServiceParams{ @@ -131,7 +131,7 @@ func TestAddAnnotation(t *testing.T) { } res, err := inventoryClient.Default.Nodes.AddGenericNode(params) assert.NoError(t, err) - defer pmmapitests.RemoveNodes(t, res.Payload.Generic.NodeID) + defer pmmapitests.UnregisterNodes(t, res.Payload.Generic.NodeID) paramsAdd := &annotation.AddAnnotationParams{ Body: annotation.AddAnnotationBody{ diff --git a/api-tests/management/backup/backups_test.go b/api-tests/management/backup/backups_test.go index 609989133d..2a10622e14 100644 --- a/api-tests/management/backup/backups_test.go +++ b/api-tests/management/backup/backups_test.go @@ -41,7 +41,7 @@ func TestScheduleBackup(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer management.RemovePMMAgentWithSubAgents(t, pmmAgentID) mongo1Name := pmmapitests.TestString(t, "mongo") mongo2Name := pmmapitests.TestString(t, "mongo") diff --git a/api-tests/management/external_test.go b/api-tests/management/external_test.go index 289466ff0f..a7b4585aff 100644 --- a/api-tests/management/external_test.go +++ b/api-tests/management/external_test.go @@ -38,7 +38,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "genericNode-for-basic-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -105,7 +105,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-for-all-fields-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -188,7 +188,7 @@ func TestAddExternal(t *testing.T) { require.NotNil(t, addExternalOK) require.NotNil(t, addExternalOK.Payload.Service) nodeID := addExternalOK.Payload.Service.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceID := addExternalOK.Payload.Service.ServiceID defer pmmapitests.RemoveServices(t, serviceID) @@ -256,7 +256,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-for-the-same-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-for-the-same-name") @@ -299,7 +299,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) params := &external.AddExternalParams{ Context: pmmapitests.Context, @@ -319,7 +319,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -341,7 +341,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -363,7 +363,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -385,7 +385,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -438,7 +438,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -468,7 +468,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -498,7 +498,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -517,7 +517,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ diff --git a/api-tests/management/haproxy_test.go b/api-tests/management/haproxy_test.go index 7b25a0103e..5bf448ed23 100644 --- a/api-tests/management/haproxy_test.go +++ b/api-tests/management/haproxy_test.go @@ -41,7 +41,7 @@ func TestAddHAProxy(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -109,7 +109,7 @@ func TestAddHAProxy(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -188,7 +188,7 @@ func TestAddHAProxy(t *testing.T) { require.NotNil(t, addHAProxyOK) require.NotNil(t, addHAProxyOK.Payload.Service) nodeID := addHAProxyOK.Payload.Service.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceID := addHAProxyOK.Payload.Service.ServiceID defer pmmapitests.RemoveServices(t, serviceID) @@ -257,7 +257,7 @@ func TestAddHAProxy(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-the-same-name") @@ -296,7 +296,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) params := &ha_proxy.AddHAProxyParams{ Context: pmmapitests.Context, @@ -313,7 +313,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &ha_proxy.AddHAProxyParams{ @@ -332,7 +332,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &ha_proxy.AddHAProxyParams{ @@ -351,7 +351,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &ha_proxy.AddHAProxyParams{ @@ -400,7 +400,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -430,7 +430,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -460,7 +460,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -479,7 +479,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ diff --git a/api-tests/management/mongodb_test.go b/api-tests/management/mongodb_test.go index 17472529af..0499f86201 100644 --- a/api-tests/management/mongodb_test.go +++ b/api-tests/management/mongodb_test.go @@ -40,7 +40,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") @@ -113,7 +113,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-all-fields") @@ -201,7 +201,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-all-fields") @@ -260,7 +260,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-the-same-name") @@ -306,7 +306,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) nodeNameAddNode := pmmapitests.TestString(t, "node-for-add-node-name") @@ -371,7 +371,7 @@ func TestAddMongoDB(t *testing.T) { newNodeID := addMongoDBOK.Payload.Service.NodeID require.NotEqual(t, nodeID, newNodeID) - defer pmmapitests.RemoveNodes(t, newNodeID) + defer pmmapitests.UnregisterNodes(t, newNodeID) defer pmmapitests.RemoveServices(t, serviceID) defer removeServiceAgents(t, serviceID) @@ -422,12 +422,12 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.RemoveNodes(t, remoteNodeID) + defer pmmapitests.UnregisterNodes(t, remoteNodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &mongodb.AddMongoDBParams{ @@ -453,7 +453,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &mongodb.AddMongoDBParams{ @@ -471,7 +471,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -494,7 +494,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -518,7 +518,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -542,7 +542,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -570,7 +570,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-mongo-socket-name") @@ -639,7 +639,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") @@ -711,7 +711,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") @@ -782,7 +782,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") @@ -884,7 +884,7 @@ func TestRemoveMongoDB(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, pmmAgentID, serviceID := addMongoDB(t, serviceName, nodeName, true) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -915,7 +915,7 @@ func TestRemoveMongoDB(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, pmmAgentID, serviceID := addMongoDB(t, serviceName, nodeName, true) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -946,7 +946,7 @@ func TestRemoveMongoDB(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, pmmAgentID, serviceID := addMongoDB(t, serviceName, nodeName, false) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) @@ -966,7 +966,7 @@ func TestRemoveMongoDB(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, pmmAgentID, serviceID := addMongoDB(t, serviceName, nodeName, false) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) diff --git a/api-tests/management/mysql_test.go b/api-tests/management/mysql_test.go index a80f8dc3e3..03317fa5e6 100644 --- a/api-tests/management/mysql_test.go +++ b/api-tests/management/mysql_test.go @@ -26,7 +26,6 @@ import ( pmmapitests "github.com/percona/pmm/api-tests" inventoryClient "github.com/percona/pmm/api/inventorypb/json/client" "github.com/percona/pmm/api/inventorypb/json/client/agents" - "github.com/percona/pmm/api/inventorypb/json/client/services" "github.com/percona/pmm/api/managementpb/json/client" mysql "github.com/percona/pmm/api/managementpb/json/client/my_sql" "github.com/percona/pmm/api/managementpb/json/client/node" @@ -36,813 +35,813 @@ import ( func TestAddMySQL(t *testing.T) { t.Run("Basic", func(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-for-basic-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + nodeID, _ := RegisterGenericNode(t, node.RegisterNodeBody{ NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - serviceName := pmmapitests.TestString(t, "service-for-basic-name") - - params := &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - NodeID: nodeID, - PMMAgentID: pmmAgentID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - Username: "username", - - SkipConnectionCheck: true, - DisableCollectors: []string{"global_status", "perf_schema.tablelocks"}, - }, - } - addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - require.NoError(t, err) - require.NotNil(t, addMySQLOK) - require.NotNil(t, addMySQLOK.Payload.Service) - serviceID := addMySQLOK.Payload.Service.ServiceID - defer pmmapitests.RemoveServices(t, serviceID) - - // Check that service is created and its fields. - serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ - Body: services.GetServiceBody{ - ServiceID: serviceID, - }, - Context: pmmapitests.Context, - }) - assert.NoError(t, err) - require.NotNil(t, serviceOK) - assert.Equal(t, services.GetServiceOKBody{ - Mysql: &services.GetServiceOKBodyMysql{ - ServiceID: serviceID, - NodeID: nodeID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - }, - }, *serviceOK.Payload) - - // Check that mysqld exporter is added by default. - listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - Context: pmmapitests.Context, - Body: agents.ListAgentsBody{ - ServiceID: serviceID, - }, - }) - assert.NoError(t, err) - assert.Equal(t, agents.ListAgentsOKBody{ - MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ - { - AgentID: listAgents.Payload.MysqldExporter[0].AgentID, - ServiceID: serviceID, - PMMAgentID: pmmAgentID, - Username: "username", - TablestatsGroupTableLimit: 1000, - DisabledCollectors: []string{"global_status", "perf_schema.tablelocks"}, - PushMetricsEnabled: true, - Status: &AgentStatusUnknown, - }, - }, - }, *listAgents.Payload) - defer removeAllAgentsInList(t, listAgents) - }) - - t.Run("With agents", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-for-all-fields-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.RemoveNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") - - params := &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - NodeID: nodeID, - PMMAgentID: pmmAgentID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - Username: "username", - Password: "password", - QANMysqlSlowlog: true, - QANMysqlPerfschema: true, - - SkipConnectionCheck: true, - TablestatsGroupTableLimit: -1, - }, - } - addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - require.NoError(t, err) - require.NotNil(t, addMySQLOK) - require.NotNil(t, addMySQLOK.Payload.Service) - serviceID := addMySQLOK.Payload.Service.ServiceID - defer pmmapitests.RemoveServices(t, serviceID) - - // Check that service is created and its fields. - serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ - Body: services.GetServiceBody{ - ServiceID: serviceID, - }, - Context: pmmapitests.Context, - }) - assert.NoError(t, err) - assert.NotNil(t, serviceOK) - assert.Equal(t, services.GetServiceOKBody{ - Mysql: &services.GetServiceOKBodyMysql{ - ServiceID: serviceID, - NodeID: nodeID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - }, - }, *serviceOK.Payload) - - // Check that exporters are added. - listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - Context: pmmapitests.Context, - Body: agents.ListAgentsBody{ - ServiceID: serviceID, - }, - }) - assert.NoError(t, err) - require.NotNil(t, listAgents) - defer removeAllAgentsInList(t, listAgents) - require.Len(t, listAgents.Payload.MysqldExporter, 1) - require.Len(t, listAgents.Payload.QANMysqlSlowlogAgent, 1) - require.Len(t, listAgents.Payload.QANMysqlPerfschemaAgent, 1) - assert.Equal(t, agents.ListAgentsOKBody{ - MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ - { - AgentID: listAgents.Payload.MysqldExporter[0].AgentID, - ServiceID: serviceID, - PMMAgentID: pmmAgentID, - Username: "username", - TablestatsGroupTableLimit: -1, - TablestatsGroupDisabled: true, - PushMetricsEnabled: true, - Status: &AgentStatusUnknown, - }, - }, - QANMysqlSlowlogAgent: []*agents.ListAgentsOKBodyQANMysqlSlowlogAgentItems0{ - { - AgentID: listAgents.Payload.QANMysqlSlowlogAgent[0].AgentID, - ServiceID: serviceID, - PMMAgentID: pmmAgentID, - Username: "username", - MaxSlowlogFileSize: "1073741824", - Status: &AgentStatusUnknown, - }, - }, - QANMysqlPerfschemaAgent: []*agents.ListAgentsOKBodyQANMysqlPerfschemaAgentItems0{ - { - AgentID: listAgents.Payload.QANMysqlPerfschemaAgent[0].AgentID, - ServiceID: serviceID, - PMMAgentID: pmmAgentID, - Username: "username", - Status: &AgentStatusUnknown, - }, - }, - }, *listAgents.Payload) - }) - - t.Run("With labels", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-for-all-fields-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.RemoveNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") - - params := &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - NodeID: nodeID, - PMMAgentID: pmmAgentID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - Username: "username", - Password: "password", - Environment: "some-environment", - Cluster: "cluster-name", - ReplicationSet: "replication-set", - CustomLabels: map[string]string{"bar": "foo"}, - - SkipConnectionCheck: true, - }, - } - addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - require.NoError(t, err) - require.NotNil(t, addMySQLOK) - require.NotNil(t, addMySQLOK.Payload.Service) - serviceID := addMySQLOK.Payload.Service.ServiceID - defer pmmapitests.RemoveServices(t, serviceID) - defer removeServiceAgents(t, serviceID) - - // Check that service is created and its fields. - serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ - Body: services.GetServiceBody{ - ServiceID: serviceID, - }, - Context: pmmapitests.Context, - }) - assert.NoError(t, err) - assert.NotNil(t, serviceOK) - assert.Equal(t, services.GetServiceOKBody{ - Mysql: &services.GetServiceOKBodyMysql{ - ServiceID: serviceID, - NodeID: nodeID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - Environment: "some-environment", - Cluster: "cluster-name", - ReplicationSet: "replication-set", - CustomLabels: map[string]string{"bar": "foo"}, - }, - }, *serviceOK.Payload) - }) - - t.Run("With the same name", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-for-the-same-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.RemoveNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - serviceName := pmmapitests.TestString(t, "service-for-the-same-name") - - params := &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - NodeID: nodeID, - PMMAgentID: pmmAgentID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - Username: "username", - - SkipConnectionCheck: true, - }, - } - addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - require.NoError(t, err) - require.NotNil(t, addMySQLOK) - require.NotNil(t, addMySQLOK.Payload.Service) - serviceID := addMySQLOK.Payload.Service.ServiceID - defer pmmapitests.RemoveServices(t, serviceID) - defer removeServiceAgents(t, serviceID) - - params = &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - NodeID: nodeID, - PMMAgentID: pmmAgentID, - ServiceName: serviceName, - Address: "11.11.11.11", - Port: 3307, - Username: "username", - }, - } - addMySQLOK, err = client.Default.MySQL.AddMySQL(params) - require.Nil(t, addMySQLOK) - pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, `Service with name %q already exists.`, serviceName) + pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // serviceName := pmmapitests.TestString(t, "service-for-basic-name") + + // params := &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // NodeID: nodeID, + // PMMAgentID: pmmAgentID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // Username: "username", + + // SkipConnectionCheck: true, + // DisableCollectors: []string{"global_status", "perf_schema.tablelocks"}, + // }, + // } + // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + // require.NoError(t, err) + // require.NotNil(t, addMySQLOK) + // require.NotNil(t, addMySQLOK.Payload.Service) + // serviceID := addMySQLOK.Payload.Service.ServiceID + // defer pmmapitests.RemoveServices(t, serviceID) + + // // Check that service is created and its fields. + // serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ + // Body: services.GetServiceBody{ + // ServiceID: serviceID, + // }, + // Context: pmmapitests.Context, + // }) + // assert.NoError(t, err) + // require.NotNil(t, serviceOK) + // assert.Equal(t, services.GetServiceOKBody{ + // Mysql: &services.GetServiceOKBodyMysql{ + // ServiceID: serviceID, + // NodeID: nodeID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // }, + // }, *serviceOK.Payload) + + // // Check that mysqld exporter is added by default. + // listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + // Context: pmmapitests.Context, + // Body: agents.ListAgentsBody{ + // ServiceID: serviceID, + // }, + // }) + // assert.NoError(t, err) + // assert.Equal(t, agents.ListAgentsOKBody{ + // MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ + // { + // AgentID: listAgents.Payload.MysqldExporter[0].AgentID, + // ServiceID: serviceID, + // PMMAgentID: pmmAgentID, + // Username: "username", + // TablestatsGroupTableLimit: 1000, + // DisabledCollectors: []string{"global_status", "perf_schema.tablelocks"}, + // PushMetricsEnabled: true, + // Status: &AgentStatusUnknown, + // }, + // }, + // }, *listAgents.Payload) + // defer removeAllAgentsInList(t, listAgents) + // }) + + // t.Run("With agents", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-for-all-fields-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") + + // params := &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // NodeID: nodeID, + // PMMAgentID: pmmAgentID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // Username: "username", + // Password: "password", + // QANMysqlSlowlog: true, + // QANMysqlPerfschema: true, + + // SkipConnectionCheck: true, + // TablestatsGroupTableLimit: -1, + // }, + // } + // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + // require.NoError(t, err) + // require.NotNil(t, addMySQLOK) + // require.NotNil(t, addMySQLOK.Payload.Service) + // serviceID := addMySQLOK.Payload.Service.ServiceID + // defer pmmapitests.RemoveServices(t, serviceID) + + // // Check that service is created and its fields. + // serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ + // Body: services.GetServiceBody{ + // ServiceID: serviceID, + // }, + // Context: pmmapitests.Context, + // }) + // assert.NoError(t, err) + // assert.NotNil(t, serviceOK) + // assert.Equal(t, services.GetServiceOKBody{ + // Mysql: &services.GetServiceOKBodyMysql{ + // ServiceID: serviceID, + // NodeID: nodeID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // }, + // }, *serviceOK.Payload) + + // // Check that exporters are added. + // listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + // Context: pmmapitests.Context, + // Body: agents.ListAgentsBody{ + // ServiceID: serviceID, + // }, + // }) + // assert.NoError(t, err) + // require.NotNil(t, listAgents) + // defer removeAllAgentsInList(t, listAgents) + // require.Len(t, listAgents.Payload.MysqldExporter, 1) + // require.Len(t, listAgents.Payload.QANMysqlSlowlogAgent, 1) + // require.Len(t, listAgents.Payload.QANMysqlPerfschemaAgent, 1) + // assert.Equal(t, agents.ListAgentsOKBody{ + // MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ + // { + // AgentID: listAgents.Payload.MysqldExporter[0].AgentID, + // ServiceID: serviceID, + // PMMAgentID: pmmAgentID, + // Username: "username", + // TablestatsGroupTableLimit: -1, + // TablestatsGroupDisabled: true, + // PushMetricsEnabled: true, + // Status: &AgentStatusUnknown, + // }, + // }, + // QANMysqlSlowlogAgent: []*agents.ListAgentsOKBodyQANMysqlSlowlogAgentItems0{ + // { + // AgentID: listAgents.Payload.QANMysqlSlowlogAgent[0].AgentID, + // ServiceID: serviceID, + // PMMAgentID: pmmAgentID, + // Username: "username", + // MaxSlowlogFileSize: "1073741824", + // Status: &AgentStatusUnknown, + // }, + // }, + // QANMysqlPerfschemaAgent: []*agents.ListAgentsOKBodyQANMysqlPerfschemaAgentItems0{ + // { + // AgentID: listAgents.Payload.QANMysqlPerfschemaAgent[0].AgentID, + // ServiceID: serviceID, + // PMMAgentID: pmmAgentID, + // Username: "username", + // Status: &AgentStatusUnknown, + // }, + // }, + // }, *listAgents.Payload) + // }) + + // t.Run("With labels", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-for-all-fields-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") + + // params := &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // NodeID: nodeID, + // PMMAgentID: pmmAgentID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // Username: "username", + // Password: "password", + // Environment: "some-environment", + // Cluster: "cluster-name", + // ReplicationSet: "replication-set", + // CustomLabels: map[string]string{"bar": "foo"}, + + // SkipConnectionCheck: true, + // }, + // } + // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + // require.NoError(t, err) + // require.NotNil(t, addMySQLOK) + // require.NotNil(t, addMySQLOK.Payload.Service) + // serviceID := addMySQLOK.Payload.Service.ServiceID + // defer pmmapitests.RemoveServices(t, serviceID) + // defer removeServiceAgents(t, serviceID) + + // // Check that service is created and its fields. + // serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ + // Body: services.GetServiceBody{ + // ServiceID: serviceID, + // }, + // Context: pmmapitests.Context, + // }) + // assert.NoError(t, err) + // assert.NotNil(t, serviceOK) + // assert.Equal(t, services.GetServiceOKBody{ + // Mysql: &services.GetServiceOKBodyMysql{ + // ServiceID: serviceID, + // NodeID: nodeID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // Environment: "some-environment", + // Cluster: "cluster-name", + // ReplicationSet: "replication-set", + // CustomLabels: map[string]string{"bar": "foo"}, + // }, + // }, *serviceOK.Payload) + // }) + + // t.Run("With the same name", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-for-the-same-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // serviceName := pmmapitests.TestString(t, "service-for-the-same-name") + + // params := &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // NodeID: nodeID, + // PMMAgentID: pmmAgentID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // Username: "username", + + // SkipConnectionCheck: true, + // }, + // } + // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + // require.NoError(t, err) + // require.NotNil(t, addMySQLOK) + // require.NotNil(t, addMySQLOK.Payload.Service) + // serviceID := addMySQLOK.Payload.Service.ServiceID + // defer pmmapitests.RemoveServices(t, serviceID) + // defer removeServiceAgents(t, serviceID) + + // params = &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // NodeID: nodeID, + // PMMAgentID: pmmAgentID, + // ServiceName: serviceName, + // Address: "11.11.11.11", + // Port: 3307, + // Username: "username", + // }, + // } + // addMySQLOK, err = client.Default.MySQL.AddMySQL(params) + // require.Nil(t, addMySQLOK) + // pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, `Service with name %q already exists.`, serviceName) + // }) + + // t.Run("With add_node block", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-for-basic-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // nodeNameAddNode := pmmapitests.TestString(t, "node-for-add-node-name") + // serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") + + // params := &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // AddNode: &mysql.AddMySQLParamsBodyAddNode{ + // NodeType: pointer.ToString(mysql.AddMySQLParamsBodyAddNodeNodeTypeGENERICNODE), + // NodeName: nodeNameAddNode, + // }, + // PMMAgentID: pmmAgentID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 27017, + // Username: "username", + + // SkipConnectionCheck: true, + // }, + // } + // _, err := client.Default.MySQL.AddMySQL(params) + // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "add_node structure can be used only for remote nodes") + + // params = &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // AddNode: &mysql.AddMySQLParamsBodyAddNode{ + // NodeType: pointer.ToString(mysql.AddMySQLParamsBodyAddNodeNodeTypeREMOTERDSNODE), + // NodeName: nodeNameAddNode, + // }, + // PMMAgentID: pmmAgentID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 27017, + // Username: "username", + + // SkipConnectionCheck: true, + // }, + // } + // _, err = client.Default.MySQL.AddMySQL(params) + // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "add_node structure can be used only for remote nodes") + + // params = &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // AddNode: &mysql.AddMySQLParamsBodyAddNode{ + // NodeType: pointer.ToString(mysql.AddMySQLParamsBodyAddNodeNodeTypeREMOTENODE), + // NodeName: nodeNameAddNode, + // }, + // PMMAgentID: pmmAgentID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 27017, + // Username: "username", + + // SkipConnectionCheck: true, + // }, + // } + // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + // require.NoError(t, err) + // require.NotNil(t, addMySQLOK) + // require.NotNil(t, addMySQLOK.Payload.Service) + // serviceID := addMySQLOK.Payload.Service.ServiceID + + // newNodeID := addMySQLOK.Payload.Service.NodeID + // require.NotEqual(t, nodeID, newNodeID) + // defer pmmapitests.UnregisterNodes(t, newNodeID) + // defer pmmapitests.RemoveServices(t, serviceID) + // defer removeServiceAgents(t, serviceID) + + // // Check that service is created and its fields. + // serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ + // Body: services.GetServiceBody{ + // ServiceID: serviceID, + // }, + // Context: pmmapitests.Context, + // }) + // assert.NoError(t, err) + // require.NotNil(t, serviceOK) + // assert.Equal(t, services.GetServiceOKBody{ + // Mysql: &services.GetServiceOKBodyMysql{ + // ServiceID: serviceID, + // NodeID: newNodeID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 27017, + // }, + // }, *serviceOK.Payload) + + // // Check that mysql exporter is added by default. + // listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + // Context: pmmapitests.Context, + // Body: agents.ListAgentsBody{ + // ServiceID: serviceID, + // }, + // }) + // assert.NoError(t, err) + // assert.Equal(t, agents.ListAgentsOKBody{ + // MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ + // { + // AgentID: listAgents.Payload.MysqldExporter[0].AgentID, + // ServiceID: serviceID, + // PMMAgentID: pmmAgentID, + // Username: "username", + // TablestatsGroupTableLimit: 1000, + // PushMetricsEnabled: true, + // Status: &AgentStatusUnknown, + // }, + // }, + // }, *listAgents.Payload) + // defer removeAllAgentsInList(t, listAgents) }) - t.Run("With add_node block", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-for-basic-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.RemoveNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - nodeNameAddNode := pmmapitests.TestString(t, "node-for-add-node-name") - serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") - - params := &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - AddNode: &mysql.AddMySQLParamsBodyAddNode{ - NodeType: pointer.ToString(mysql.AddMySQLParamsBodyAddNodeNodeTypeGENERICNODE), - NodeName: nodeNameAddNode, - }, - PMMAgentID: pmmAgentID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 27017, - Username: "username", - - SkipConnectionCheck: true, - }, - } - _, err := client.Default.MySQL.AddMySQL(params) - pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "add_node structure can be used only for remote nodes") - - params = &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - AddNode: &mysql.AddMySQLParamsBodyAddNode{ - NodeType: pointer.ToString(mysql.AddMySQLParamsBodyAddNodeNodeTypeREMOTERDSNODE), - NodeName: nodeNameAddNode, - }, - PMMAgentID: pmmAgentID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 27017, - Username: "username", - - SkipConnectionCheck: true, - }, - } - _, err = client.Default.MySQL.AddMySQL(params) - pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "add_node structure can be used only for remote nodes") - - params = &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - AddNode: &mysql.AddMySQLParamsBodyAddNode{ - NodeType: pointer.ToString(mysql.AddMySQLParamsBodyAddNodeNodeTypeREMOTENODE), - NodeName: nodeNameAddNode, - }, - PMMAgentID: pmmAgentID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 27017, - Username: "username", - - SkipConnectionCheck: true, - }, - } - addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - require.NoError(t, err) - require.NotNil(t, addMySQLOK) - require.NotNil(t, addMySQLOK.Payload.Service) - serviceID := addMySQLOK.Payload.Service.ServiceID - - newNodeID := addMySQLOK.Payload.Service.NodeID - require.NotEqual(t, nodeID, newNodeID) - defer pmmapitests.RemoveNodes(t, newNodeID) - defer pmmapitests.RemoveServices(t, serviceID) - defer removeServiceAgents(t, serviceID) - - // Check that service is created and its fields. - serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ - Body: services.GetServiceBody{ - ServiceID: serviceID, - }, - Context: pmmapitests.Context, - }) - assert.NoError(t, err) - require.NotNil(t, serviceOK) - assert.Equal(t, services.GetServiceOKBody{ - Mysql: &services.GetServiceOKBodyMysql{ - ServiceID: serviceID, - NodeID: newNodeID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 27017, - }, - }, *serviceOK.Payload) - - // Check that mysql exporter is added by default. - listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - Context: pmmapitests.Context, - Body: agents.ListAgentsBody{ - ServiceID: serviceID, - }, - }) - assert.NoError(t, err) - assert.Equal(t, agents.ListAgentsOKBody{ - MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ - { - AgentID: listAgents.Payload.MysqldExporter[0].AgentID, - ServiceID: serviceID, - PMMAgentID: pmmAgentID, - Username: "username", - TablestatsGroupTableLimit: 1000, - PushMetricsEnabled: true, - Status: &AgentStatusUnknown, - }, - }, - }, *listAgents.Payload) - defer removeAllAgentsInList(t, listAgents) - }) - - t.Run("With Wrong Node Type", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "generic-node-for-wrong-node-type") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.RemoveNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) - remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.RemoveNodes(t, remoteNodeID) - - serviceName := pmmapitests.TestString(t, "service-name") - params := &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - NodeID: remoteNodeID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - PMMAgentID: pmmAgentID, - Username: "username", - - SkipConnectionCheck: true, - }, - } - addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "node_id or node_name can be used only for generic nodes or container nodes") - assert.Nil(t, addMySQLOK) - }) - - t.Run("Empty Service Name", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.RemoveNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - params := &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{NodeID: nodeID}, - } - addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddMySQLRequest.ServiceName: value length must be at least 1 runes") - assert.Nil(t, addMySQLOK) - }) - - t.Run("Empty Address And Socket", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.RemoveNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - serviceName := pmmapitests.TestString(t, "service-name") - params := &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - PMMAgentID: pmmAgentID, - Username: "username", - Password: "password", - NodeID: nodeID, - ServiceName: serviceName, - }, - } - addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Neither socket nor address passed.") - assert.Nil(t, addMySQLOK) - }) - - t.Run("Empty Port", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.RemoveNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - serviceName := pmmapitests.TestString(t, "service-name") - params := &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - PMMAgentID: pmmAgentID, - Username: "username", - Password: "password", - NodeID: nodeID, - ServiceName: serviceName, - Address: "10.10.10.10", - }, - } - addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Port are expected to be passed with address.") - assert.Nil(t, addMySQLOK) - }) - - t.Run("Address And Socket Conflict.", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.RemoveNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - serviceName := pmmapitests.TestString(t, "service-name") - params := &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - PMMAgentID: pmmAgentID, - Username: "username", - Password: "password", - NodeID: nodeID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - Socket: "/var/run/mysqld/mysqld.sock", - }, - } - addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Socket and address cannot be specified together.") - assert.Nil(t, addMySQLOK) - }) - - t.Run("Empty Pmm Agent ID", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.RemoveNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - serviceName := pmmapitests.TestString(t, "service-name") - params := &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - NodeID: nodeID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - }, - } - addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddMySQLRequest.PmmAgentId: value length must be at least 1 runes") - assert.Nil(t, addMySQLOK) - }) - - t.Run("Empty username", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.RemoveNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - serviceName := pmmapitests.TestString(t, "service-name") - params := &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - NodeID: nodeID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - PMMAgentID: pmmAgentID, - }, - } - addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddMySQLRequest.Username: value length must be at least 1 runes") - assert.Nil(t, addMySQLOK) - }) - - t.Run("With MetricsModePush", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-for-basic-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.RemoveNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - serviceName := pmmapitests.TestString(t, "service-for-basic-name") - - params := &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - NodeID: nodeID, - PMMAgentID: pmmAgentID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - Username: "username", - - SkipConnectionCheck: true, - MetricsMode: pointer.ToString("PUSH"), - }, - } - addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - require.NoError(t, err) - require.NotNil(t, addMySQLOK) - require.NotNil(t, addMySQLOK.Payload.Service) - serviceID := addMySQLOK.Payload.Service.ServiceID - defer pmmapitests.RemoveServices(t, serviceID) - - // Check that service is created and its fields. - serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ - Body: services.GetServiceBody{ - ServiceID: serviceID, - }, - Context: pmmapitests.Context, - }) - assert.NoError(t, err) - require.NotNil(t, serviceOK) - assert.Equal(t, services.GetServiceOKBody{ - Mysql: &services.GetServiceOKBodyMysql{ - ServiceID: serviceID, - NodeID: nodeID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - }, - }, *serviceOK.Payload) - - // Check that mysqld exporter is added by default. - listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - Context: pmmapitests.Context, - Body: agents.ListAgentsBody{ - ServiceID: serviceID, - }, - }) - assert.NoError(t, err) - assert.Equal(t, agents.ListAgentsOKBody{ - MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ - { - AgentID: listAgents.Payload.MysqldExporter[0].AgentID, - ServiceID: serviceID, - PMMAgentID: pmmAgentID, - Username: "username", - TablestatsGroupTableLimit: 1000, - PushMetricsEnabled: true, - Status: &AgentStatusUnknown, - }, - }, - }, *listAgents.Payload) - defer removeAllAgentsInList(t, listAgents) - }) - - t.Run("With MetricsModePull", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-for-basic-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.RemoveNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - serviceName := pmmapitests.TestString(t, "service-for-basic-name") - - params := &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - NodeID: nodeID, - PMMAgentID: pmmAgentID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - Username: "username", - - SkipConnectionCheck: true, - MetricsMode: pointer.ToString("PULL"), - }, - } - addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - require.NoError(t, err) - require.NotNil(t, addMySQLOK) - require.NotNil(t, addMySQLOK.Payload.Service) - serviceID := addMySQLOK.Payload.Service.ServiceID - defer pmmapitests.RemoveServices(t, serviceID) - - // Check that service is created and its fields. - serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ - Body: services.GetServiceBody{ - ServiceID: serviceID, - }, - Context: pmmapitests.Context, - }) - assert.NoError(t, err) - require.NotNil(t, serviceOK) - assert.Equal(t, services.GetServiceOKBody{ - Mysql: &services.GetServiceOKBodyMysql{ - ServiceID: serviceID, - NodeID: nodeID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - }, - }, *serviceOK.Payload) - - // Check that mysqld exporter is added by default. - listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - Context: pmmapitests.Context, - Body: agents.ListAgentsBody{ - ServiceID: serviceID, - }, - }) - assert.NoError(t, err) - assert.Equal(t, agents.ListAgentsOKBody{ - MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ - { - AgentID: listAgents.Payload.MysqldExporter[0].AgentID, - ServiceID: serviceID, - PMMAgentID: pmmAgentID, - Username: "username", - TablestatsGroupTableLimit: 1000, - Status: &AgentStatusUnknown, - }, - }, - }, *listAgents.Payload) - defer removeAllAgentsInList(t, listAgents) - }) - - t.Run("With MetricsModeAuto", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-for-basic-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.RemoveNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - serviceName := pmmapitests.TestString(t, "service-for-basic-name") - - params := &mysql.AddMySQLParams{ - Context: pmmapitests.Context, - Body: mysql.AddMySQLBody{ - NodeID: nodeID, - PMMAgentID: pmmAgentID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - Username: "username", - - SkipConnectionCheck: true, - MetricsMode: pointer.ToString("AUTO"), - }, - } - addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - require.NoError(t, err) - require.NotNil(t, addMySQLOK) - require.NotNil(t, addMySQLOK.Payload.Service) - serviceID := addMySQLOK.Payload.Service.ServiceID - defer pmmapitests.RemoveServices(t, serviceID) - - // Check that service is created and its fields. - serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ - Body: services.GetServiceBody{ - ServiceID: serviceID, - }, - Context: pmmapitests.Context, - }) - assert.NoError(t, err) - require.NotNil(t, serviceOK) - assert.Equal(t, services.GetServiceOKBody{ - Mysql: &services.GetServiceOKBodyMysql{ - ServiceID: serviceID, - NodeID: nodeID, - ServiceName: serviceName, - Address: "10.10.10.10", - Port: 3306, - }, - }, *serviceOK.Payload) - - // Check that mysqld exporter is added by default. - listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - Context: pmmapitests.Context, - Body: agents.ListAgentsBody{ - ServiceID: serviceID, - }, - }) - assert.NoError(t, err) - assert.Equal(t, agents.ListAgentsOKBody{ - MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ - { - AgentID: listAgents.Payload.MysqldExporter[0].AgentID, - ServiceID: serviceID, - PMMAgentID: pmmAgentID, - Username: "username", - TablestatsGroupTableLimit: 1000, - PushMetricsEnabled: true, - Status: &AgentStatusUnknown, - }, - }, - }, *listAgents.Payload) - defer removeAllAgentsInList(t, listAgents) - }) + // t.Run("With Wrong Node Type", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "generic-node-for-wrong-node-type") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) + // remoteNodeID := remoteNodeOKBody.Remote.NodeID + // defer pmmapitests.UnregisterNodes(t, remoteNodeID) + + // serviceName := pmmapitests.TestString(t, "service-name") + // params := &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // NodeID: remoteNodeID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // PMMAgentID: pmmAgentID, + // Username: "username", + + // SkipConnectionCheck: true, + // }, + // } + // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "node_id or node_name can be used only for generic nodes or container nodes") + // assert.Nil(t, addMySQLOK) + // }) + + // t.Run("Empty Service Name", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // params := &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{NodeID: nodeID}, + // } + // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddMySQLRequest.ServiceName: value length must be at least 1 runes") + // assert.Nil(t, addMySQLOK) + // }) + + // t.Run("Empty Address And Socket", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // serviceName := pmmapitests.TestString(t, "service-name") + // params := &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // PMMAgentID: pmmAgentID, + // Username: "username", + // Password: "password", + // NodeID: nodeID, + // ServiceName: serviceName, + // }, + // } + // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Neither socket nor address passed.") + // assert.Nil(t, addMySQLOK) + // }) + + // t.Run("Empty Port", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // serviceName := pmmapitests.TestString(t, "service-name") + // params := &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // PMMAgentID: pmmAgentID, + // Username: "username", + // Password: "password", + // NodeID: nodeID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // }, + // } + // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Port are expected to be passed with address.") + // assert.Nil(t, addMySQLOK) + // }) + + // t.Run("Address And Socket Conflict.", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // serviceName := pmmapitests.TestString(t, "service-name") + // params := &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // PMMAgentID: pmmAgentID, + // Username: "username", + // Password: "password", + // NodeID: nodeID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // Socket: "/var/run/mysqld/mysqld.sock", + // }, + // } + // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Socket and address cannot be specified together.") + // assert.Nil(t, addMySQLOK) + // }) + + // t.Run("Empty Pmm Agent ID", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // serviceName := pmmapitests.TestString(t, "service-name") + // params := &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // NodeID: nodeID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // }, + // } + // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddMySQLRequest.PmmAgentId: value length must be at least 1 runes") + // assert.Nil(t, addMySQLOK) + // }) + + // t.Run("Empty username", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // serviceName := pmmapitests.TestString(t, "service-name") + // params := &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // NodeID: nodeID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // PMMAgentID: pmmAgentID, + // }, + // } + // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddMySQLRequest.Username: value length must be at least 1 runes") + // assert.Nil(t, addMySQLOK) + // }) + + // t.Run("With MetricsModePush", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-for-basic-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // serviceName := pmmapitests.TestString(t, "service-for-basic-name") + + // params := &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // NodeID: nodeID, + // PMMAgentID: pmmAgentID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // Username: "username", + + // SkipConnectionCheck: true, + // MetricsMode: pointer.ToString("PUSH"), + // }, + // } + // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + // require.NoError(t, err) + // require.NotNil(t, addMySQLOK) + // require.NotNil(t, addMySQLOK.Payload.Service) + // serviceID := addMySQLOK.Payload.Service.ServiceID + // defer pmmapitests.RemoveServices(t, serviceID) + + // // Check that service is created and its fields. + // serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ + // Body: services.GetServiceBody{ + // ServiceID: serviceID, + // }, + // Context: pmmapitests.Context, + // }) + // assert.NoError(t, err) + // require.NotNil(t, serviceOK) + // assert.Equal(t, services.GetServiceOKBody{ + // Mysql: &services.GetServiceOKBodyMysql{ + // ServiceID: serviceID, + // NodeID: nodeID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // }, + // }, *serviceOK.Payload) + + // // Check that mysqld exporter is added by default. + // listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + // Context: pmmapitests.Context, + // Body: agents.ListAgentsBody{ + // ServiceID: serviceID, + // }, + // }) + // assert.NoError(t, err) + // assert.Equal(t, agents.ListAgentsOKBody{ + // MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ + // { + // AgentID: listAgents.Payload.MysqldExporter[0].AgentID, + // ServiceID: serviceID, + // PMMAgentID: pmmAgentID, + // Username: "username", + // TablestatsGroupTableLimit: 1000, + // PushMetricsEnabled: true, + // Status: &AgentStatusUnknown, + // }, + // }, + // }, *listAgents.Payload) + // defer removeAllAgentsInList(t, listAgents) + // }) + + // t.Run("With MetricsModePull", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-for-basic-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // serviceName := pmmapitests.TestString(t, "service-for-basic-name") + + // params := &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // NodeID: nodeID, + // PMMAgentID: pmmAgentID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // Username: "username", + + // SkipConnectionCheck: true, + // MetricsMode: pointer.ToString("PULL"), + // }, + // } + // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + // require.NoError(t, err) + // require.NotNil(t, addMySQLOK) + // require.NotNil(t, addMySQLOK.Payload.Service) + // serviceID := addMySQLOK.Payload.Service.ServiceID + // defer pmmapitests.RemoveServices(t, serviceID) + + // // Check that service is created and its fields. + // serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ + // Body: services.GetServiceBody{ + // ServiceID: serviceID, + // }, + // Context: pmmapitests.Context, + // }) + // assert.NoError(t, err) + // require.NotNil(t, serviceOK) + // assert.Equal(t, services.GetServiceOKBody{ + // Mysql: &services.GetServiceOKBodyMysql{ + // ServiceID: serviceID, + // NodeID: nodeID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // }, + // }, *serviceOK.Payload) + + // // Check that mysqld exporter is added by default. + // listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + // Context: pmmapitests.Context, + // Body: agents.ListAgentsBody{ + // ServiceID: serviceID, + // }, + // }) + // assert.NoError(t, err) + // assert.Equal(t, agents.ListAgentsOKBody{ + // MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ + // { + // AgentID: listAgents.Payload.MysqldExporter[0].AgentID, + // ServiceID: serviceID, + // PMMAgentID: pmmAgentID, + // Username: "username", + // TablestatsGroupTableLimit: 1000, + // Status: &AgentStatusUnknown, + // }, + // }, + // }, *listAgents.Payload) + // defer removeAllAgentsInList(t, listAgents) + // }) + + // t.Run("With MetricsModeAuto", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-for-basic-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // serviceName := pmmapitests.TestString(t, "service-for-basic-name") + + // params := &mysql.AddMySQLParams{ + // Context: pmmapitests.Context, + // Body: mysql.AddMySQLBody{ + // NodeID: nodeID, + // PMMAgentID: pmmAgentID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // Username: "username", + + // SkipConnectionCheck: true, + // MetricsMode: pointer.ToString("AUTO"), + // }, + // } + // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + // require.NoError(t, err) + // require.NotNil(t, addMySQLOK) + // require.NotNil(t, addMySQLOK.Payload.Service) + // serviceID := addMySQLOK.Payload.Service.ServiceID + // defer pmmapitests.RemoveServices(t, serviceID) + + // // Check that service is created and its fields. + // serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ + // Body: services.GetServiceBody{ + // ServiceID: serviceID, + // }, + // Context: pmmapitests.Context, + // }) + // assert.NoError(t, err) + // require.NotNil(t, serviceOK) + // assert.Equal(t, services.GetServiceOKBody{ + // Mysql: &services.GetServiceOKBodyMysql{ + // ServiceID: serviceID, + // NodeID: nodeID, + // ServiceName: serviceName, + // Address: "10.10.10.10", + // Port: 3306, + // }, + // }, *serviceOK.Payload) + + // // Check that mysqld exporter is added by default. + // listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + // Context: pmmapitests.Context, + // Body: agents.ListAgentsBody{ + // ServiceID: serviceID, + // }, + // }) + // assert.NoError(t, err) + // assert.Equal(t, agents.ListAgentsOKBody{ + // MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ + // { + // AgentID: listAgents.Payload.MysqldExporter[0].AgentID, + // ServiceID: serviceID, + // PMMAgentID: pmmAgentID, + // Username: "username", + // TablestatsGroupTableLimit: 1000, + // PushMetricsEnabled: true, + // Status: &AgentStatusUnknown, + // }, + // }, + // }, *listAgents.Payload) + // defer removeAllAgentsInList(t, listAgents) + // }) } func TestRemoveMySQL(t *testing.T) { @@ -881,7 +880,7 @@ func TestRemoveMySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, pmmAgentID, serviceID := addMySQL(t, serviceName, nodeName, true) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -912,7 +911,7 @@ func TestRemoveMySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, pmmAgentID, serviceID := addMySQL(t, serviceName, nodeName, true) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -943,7 +942,7 @@ func TestRemoveMySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, pmmAgentID, serviceID := addMySQL(t, serviceName, nodeName, false) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) @@ -963,7 +962,7 @@ func TestRemoveMySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, pmmAgentID, serviceID := addMySQL(t, serviceName, nodeName, false) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) diff --git a/api-tests/management/nodes_test.go b/api-tests/management/nodes_test.go index 7c417fea83..33803627a5 100644 --- a/api-tests/management/nodes_test.go +++ b/api-tests/management/nodes_test.go @@ -40,7 +40,7 @@ func TestNodeRegister(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // Check Node is created assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ @@ -65,7 +65,7 @@ func TestNodeRegister(t *testing.T) { Address: "node-address-1", Region: "region-1", }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) body := node.RegisterNodeBody{ @@ -108,7 +108,7 @@ func TestNodeRegister(t *testing.T) { node, err := client.Default.Node.RegisterNode(¶ms) assert.NoError(t, err) - defer pmmapitests.RemoveNodes(t, node.Payload.GenericNode.NodeID) + defer pmmapitests.UnregisterNodes(t, node.Payload.GenericNode.NodeID) defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) }) @@ -121,7 +121,7 @@ func TestNodeRegister(t *testing.T) { Address: "node-address-3", Region: "region-3", }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) body := node.RegisterNodeBody{ @@ -165,7 +165,7 @@ func TestNodeRegister(t *testing.T) { node, err := client.Default.Node.RegisterNode(¶ms) assert.NoError(t, err) - defer pmmapitests.RemoveNodes(t, node.Payload.GenericNode.NodeID) + defer pmmapitests.UnregisterNodes(t, node.Payload.GenericNode.NodeID) _, ok := assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) if ok { defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) @@ -189,7 +189,7 @@ func TestNodeRegister(t *testing.T) { DisableCollectors: []string{"diskstats", "filesystem", "standard.process"}, } nodeID, pmmAgentID := RegisterGenericNode(t, body) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // Check Node is created @@ -241,7 +241,7 @@ func TestNodeRegister(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // Check Node is created @@ -267,7 +267,7 @@ func TestNodeRegister(t *testing.T) { CustomLabels: map[string]string{"foo": "bar"}, }) if !assert.Equal(t, nodeID, newNodeID) { - defer pmmapitests.RemoveNodes(t, newNodeID) + defer pmmapitests.UnregisterNodes(t, newNodeID) } if !assert.Equal(t, pmmAgentID, newPMMAgentID) { defer pmmapitests.RemoveAgents(t, newPMMAgentID) @@ -297,7 +297,7 @@ func TestNodeRegister(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // Check Node is created @@ -335,7 +335,7 @@ func TestNodeRegister(t *testing.T) { CustomLabels: map[string]string{"foo": "bar"}, } nodeID, pmmAgentID := registerContainerNode(t, body) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // Check Node is created @@ -371,7 +371,7 @@ func TestNodeRegister(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // Check Node is created @@ -398,7 +398,7 @@ func TestNodeRegister(t *testing.T) { CustomLabels: map[string]string{"foo": "bar"}, }) if !assert.Equal(t, nodeID, newNodeID) { - defer pmmapitests.RemoveNodes(t, newNodeID) + defer pmmapitests.UnregisterNodes(t, newNodeID) } if !assert.Equal(t, pmmAgentID, newPMMAgentID) { defer pmmapitests.RemoveAgents(t, newPMMAgentID) diff --git a/api-tests/management/postgresql_test.go b/api-tests/management/postgresql_test.go index 4b7876cd94..b6af00ad3a 100644 --- a/api-tests/management/postgresql_test.go +++ b/api-tests/management/postgresql_test.go @@ -42,7 +42,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -118,7 +118,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -219,7 +219,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -276,7 +276,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-the-same-name") @@ -324,7 +324,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) nodeNameAddNode := pmmapitests.TestString(t, "node-for-add-node-name") @@ -392,7 +392,7 @@ func TestAddPostgreSQL(t *testing.T) { newNodeID := addPostgreSQLOK.Payload.Service.NodeID require.NotEqual(t, nodeID, newNodeID) - defer pmmapitests.RemoveNodes(t, newNodeID) + defer pmmapitests.UnregisterNodes(t, newNodeID) defer pmmapitests.RemoveServices(t, serviceID) defer removeServiceAgents(t, serviceID) @@ -445,12 +445,12 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.RemoveNodes(t, remoteNodeID) + defer pmmapitests.UnregisterNodes(t, remoteNodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &postgresql.AddPostgreSQLParams{ @@ -477,7 +477,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &postgresql.AddPostgreSQLParams{ @@ -495,7 +495,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -519,7 +519,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -544,7 +544,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -568,7 +568,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -596,7 +596,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -671,7 +671,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -745,7 +745,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -851,7 +851,7 @@ func TestRemovePostgreSQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, pmmAgentID, serviceID := addPostgreSQL(t, serviceName, nodeName, true) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -882,7 +882,7 @@ func TestRemovePostgreSQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, pmmAgentID, serviceID := addPostgreSQL(t, serviceName, nodeName, true) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -913,7 +913,7 @@ func TestRemovePostgreSQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, pmmAgentID, serviceID := addPostgreSQL(t, serviceName, nodeName, false) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) @@ -933,7 +933,7 @@ func TestRemovePostgreSQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, pmmAgentID, serviceID := addPostgreSQL(t, serviceName, nodeName, false) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) diff --git a/api-tests/management/proxysql_test.go b/api-tests/management/proxysql_test.go index e7bc9cd594..fbfd2727c0 100644 --- a/api-tests/management/proxysql_test.go +++ b/api-tests/management/proxysql_test.go @@ -40,7 +40,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -115,7 +115,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -191,7 +191,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -252,7 +252,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-the-same-name") @@ -300,7 +300,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) nodeNameAddNode := pmmapitests.TestString(t, "node-for-add-node-name") @@ -368,7 +368,7 @@ func TestAddProxySQL(t *testing.T) { newNodeID := addProxySQLOK.Payload.Service.NodeID require.NotEqual(t, nodeID, newNodeID) - defer pmmapitests.RemoveNodes(t, newNodeID) + defer pmmapitests.UnregisterNodes(t, newNodeID) defer pmmapitests.RemoveServices(t, serviceID) defer removeServiceAgents(t, serviceID) @@ -420,12 +420,12 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.RemoveNodes(t, remoteNodeID) + defer pmmapitests.UnregisterNodes(t, remoteNodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &proxysql.AddProxySQLParams{ @@ -452,7 +452,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &proxysql.AddProxySQLParams{ @@ -470,7 +470,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -494,7 +494,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -519,7 +519,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -547,7 +547,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -571,7 +571,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -625,7 +625,7 @@ func TestRemoveProxySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, pmmAgentID, serviceID := addProxySQL(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -656,7 +656,7 @@ func TestRemoveProxySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, pmmAgentID, serviceID := addProxySQL(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -687,7 +687,7 @@ func TestRemoveProxySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, pmmAgentID, serviceID := addProxySQL(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) @@ -707,7 +707,7 @@ func TestRemoveProxySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, pmmAgentID, serviceID := addProxySQL(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) diff --git a/api/managementpb/json/client/node/unregister_node_responses.go b/api/managementpb/json/client/node/unregister_node_responses.go index 1cb74a417d..54167149b3 100644 --- a/api/managementpb/json/client/node/unregister_node_responses.go +++ b/api/managementpb/json/client/node/unregister_node_responses.go @@ -125,6 +125,9 @@ swagger:model UnregisterNodeBody type UnregisterNodeBody struct { // Node_id to be unregistered. NodeID string `json:"node_id,omitempty"` + + // Force delete node, related service account, even if it has not only pmm's service token attached. + Force bool `json:"force,omitempty"` } // Validate validates this unregister node body diff --git a/api/managementpb/json/managementpb.json b/api/managementpb/json/managementpb.json index 5329b873ea..7a48a7773f 100644 --- a/api/managementpb/json/managementpb.json +++ b/api/managementpb/json/managementpb.json @@ -3953,6 +3953,11 @@ "schema": { "type": "object", "properties": { + "force": { + "description": "Force delete node, related service account, even if it has not only pmm's service token attached.", + "type": "boolean", + "x-order": 1 + }, "node_id": { "description": "Node_id to be unregistered.", "type": "string", diff --git a/api/managementpb/node.pb.go b/api/managementpb/node.pb.go index 9028ccd8e7..9724d65956 100644 --- a/api/managementpb/node.pb.go +++ b/api/managementpb/node.pb.go @@ -281,6 +281,8 @@ type UnregisterNodeRequest struct { // Node_id to be unregistered. NodeId string `protobuf:"bytes,1,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` + // Force delete node, related service account, even if it has not only pmm's service token attached. + Force bool `protobuf:"varint,2,opt,name=force,proto3" json:"force,omitempty"` } func (x *UnregisterNodeRequest) Reset() { @@ -322,6 +324,13 @@ func (x *UnregisterNodeRequest) GetNodeId() string { return "" } +func (x *UnregisterNodeRequest) GetForce() bool { + if x != nil { + return x.Force + } + return false +} + type UnregisterNodeResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -442,46 +451,47 @@ var file_managementpb_node_proto_rawDesc = []byte{ 0x32, 0x13, 0x2e, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x2e, 0x50, 0x4d, 0x4d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x70, 0x6d, 0x6d, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x30, 0x0a, 0x15, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x46, 0x0a, 0x15, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x22, 0x32, 0x0a, 0x16, 0x55, 0x6e, 0x72, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x32, 0xf4, 0x02, 0x0a, 0x04, - 0x4e, 0x6f, 0x64, 0x65, 0x12, 0xb1, 0x01, 0x0a, 0x0c, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, - 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x34, 0x12, 0x0d, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x1a, 0x23, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x4e, 0x6f, - 0x64, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6d, 0x6d, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, 0x22, 0x1c, 0x2f, 0x76, 0x31, 0x2f, - 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x2f, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0xb7, 0x01, 0x0a, 0x0e, 0x55, 0x6e, 0x72, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x21, 0x2e, 0x6d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, - 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, 0x6e, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x32, 0x12, 0x0f, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x1a, 0x1f, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x70, 0x6d, 0x6d, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, - 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x2f, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, - 0x65, 0x72, 0x42, 0x8c, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x4e, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, - 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, 0x62, 0xa2, 0x02, 0x03, 0x4d, 0x58, - 0x58, 0xaa, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xca, 0x02, - 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0xe2, 0x02, 0x16, 0x4d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x32, 0x0a, + 0x16, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, + 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, 0x6e, + 0x67, 0x32, 0xf4, 0x02, 0x0a, 0x04, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0xb1, 0x01, 0x0a, 0x0c, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1f, 0x2e, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, + 0x92, 0x41, 0x34, 0x12, 0x0d, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4e, 0x6f, + 0x64, 0x65, 0x1a, 0x23, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x73, 0x20, 0x61, 0x20, + 0x6e, 0x65, 0x77, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6d, 0x6d, + 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x21, 0x3a, 0x01, 0x2a, + 0x22, 0x1c, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x2f, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0xb7, + 0x01, 0x0a, 0x0e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, + 0x65, 0x12, 0x21, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x55, + 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x2e, 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x92, 0x41, 0x32, 0x12, 0x0f, 0x55, + 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x4e, 0x6f, 0x64, 0x65, 0x1a, 0x1f, + 0x55, 0x6e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x20, 0x61, 0x20, 0x4e, 0x6f, 0x64, + 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x70, 0x6d, 0x6d, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x23, 0x3a, 0x01, 0x2a, 0x22, 0x1e, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2f, 0x4e, 0x6f, 0x64, 0x65, 0x2f, 0x55, 0x6e, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x42, 0x8c, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, + 0x2e, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x42, 0x09, 0x4e, 0x6f, 0x64, + 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x27, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x70, 0x65, 0x72, 0x63, 0x6f, 0x6e, 0x61, 0x2f, 0x70, 0x6d, 0x6d, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x70, + 0x62, 0xa2, 0x02, 0x03, 0x4d, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x6d, 0x65, 0x6e, 0x74, 0xca, 0x02, 0x0a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0xe2, 0x02, 0x16, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5c, 0x47, + 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0a, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/managementpb/node.pb.validate.go b/api/managementpb/node.pb.validate.go index 32330522e8..3e21b84b04 100644 --- a/api/managementpb/node.pb.validate.go +++ b/api/managementpb/node.pb.validate.go @@ -393,6 +393,8 @@ func (m *UnregisterNodeRequest) validate(all bool) error { // no validation rules for NodeId + // no validation rules for Force + if len(errors) > 0 { return UnregisterNodeRequestMultiError(errors) } diff --git a/api/managementpb/node.proto b/api/managementpb/node.proto index eb1d63155b..a3a57e5d66 100644 --- a/api/managementpb/node.proto +++ b/api/managementpb/node.proto @@ -57,6 +57,8 @@ message RegisterNodeResponse { message UnregisterNodeRequest { // Node_id to be unregistered. string node_id = 1; + // Force delete node, related service account, even if it has not only pmm's service token attached. + bool force = 2; } message UnregisterNodeResponse { diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index 36f54eec57..a02554d789 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -22083,6 +22083,11 @@ "description": "Node_id to be unregistered.", "type": "string", "x-order": 0 + }, + "force": { + "description": "Force delete node, related service account, even if it has not only pmm's service token attached.", + "type": "boolean", + "x-order": 1 } } } diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index 8ed50f096b..d6b47dcf15 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -18397,6 +18397,11 @@ "description": "Node_id to be unregistered.", "type": "string", "x-order": 0 + }, + "force": { + "description": "Force delete node, related service account, even if it has not only pmm's service token attached.", + "type": "boolean", + "x-order": 1 } } } diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 4468ab3fa2..33094d0c84 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -432,7 +432,7 @@ func (c *Client) CreateServiceToken(ctx context.Context, serviceAccountID int) ( } // DeleteServiceAccount deletes service account by current service token. -func (c *Client) DeleteServiceAccount(ctx context.Context) (string, error) { +func (c *Client) DeleteServiceAccount(ctx context.Context, force bool) (string, error) { warning := "" authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { @@ -449,7 +449,7 @@ func (c *Client) DeleteServiceAccount(ctx context.Context) (string, error) { return warning, err } - if customsTokensCount > 0 { + if !force && customsTokensCount > 0 { warning = "Service account wont be deleted, because there are more not PMM agent related service tokens." err = c.deletePMMAgentRelatedServiceTokens(ctx, serviceAccountID, authHeaders) } else { diff --git a/managed/services/management/mock_auth_provider_test.go b/managed/services/management/mock_auth_provider_test.go index 279efb19cf..671125f7d9 100644 --- a/managed/services/management/mock_auth_provider_test.go +++ b/managed/services/management/mock_auth_provider_test.go @@ -1,4 +1,4 @@ -// Code generated by mockery v2.35.1. DO NOT EDIT. +// Code generated by mockery v2.36.0. DO NOT EDIT. package management @@ -68,23 +68,23 @@ func (_m *mockAuthProvider) CreateServiceToken(ctx context.Context, serviceAccou return r0, r1, r2 } -// DeleteServiceAccount provides a mock function with given fields: ctx -func (_m *mockAuthProvider) DeleteServiceAccount(ctx context.Context) (string, error) { - ret := _m.Called(ctx) +// DeleteServiceAccount provides a mock function with given fields: ctx, force +func (_m *mockAuthProvider) DeleteServiceAccount(ctx context.Context, force bool) (string, error) { + ret := _m.Called(ctx, force) var r0 string var r1 error - if rf, ok := ret.Get(0).(func(context.Context) (string, error)); ok { - return rf(ctx) + if rf, ok := ret.Get(0).(func(context.Context, bool) (string, error)); ok { + return rf(ctx, force) } - if rf, ok := ret.Get(0).(func(context.Context) string); ok { - r0 = rf(ctx) + if rf, ok := ret.Get(0).(func(context.Context, bool) string); ok { + r0 = rf(ctx, force) } else { r0 = ret.Get(0).(string) } - if rf, ok := ret.Get(1).(func(context.Context) error); ok { - r1 = rf(ctx) + if rf, ok := ret.Get(1).(func(context.Context, bool) error); ok { + r1 = rf(ctx, force) } else { r1 = ret.Error(1) } @@ -97,8 +97,7 @@ func (_m *mockAuthProvider) DeleteServiceAccount(ctx context.Context) (string, e func newMockAuthProvider(t interface { mock.TestingT Cleanup(func()) -}, -) *mockAuthProvider { +}) *mockAuthProvider { mock := &mockAuthProvider{} mock.Mock.Test(t) diff --git a/managed/services/management/node.go b/managed/services/management/node.go index 62e8830bd7..ce9f2f169f 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -35,7 +35,7 @@ import ( type authProvider interface { CreateServiceAccount(ctx context.Context) (int, error) CreateServiceToken(ctx context.Context, serviceAccountID int) (int, string, error) - DeleteServiceAccount(ctx context.Context) (string, error) + DeleteServiceAccount(ctx context.Context, force bool) (string, error) } // NodeService represents service for working with nodes. @@ -164,7 +164,7 @@ func (s *NodeService) Unregister(ctx context.Context, req *managementpb.Unregist return nil, err } - warning, err := s.ap.DeleteServiceAccount(ctx) + warning, err := s.ap.DeleteServiceAccount(ctx, req.Force) if err != nil { return &managementpb.UnregisterNodeResponse{ Warning: err.Error(), From d9e4b2f67392b7c32dc726756b9bf9dbb0484f4c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 21 Nov 2023 11:19:01 +0100 Subject: [PATCH 060/126] PMM-12251 Typo. --- managed/services/management/node.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/managed/services/management/node.go b/managed/services/management/node.go index ce9f2f169f..66374787b2 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -142,11 +142,11 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo if token != "" { res.Token = token } else { - serviceAcountID, e := s.ap.CreateServiceAccount(ctx) + serviceAccountID, e := s.ap.CreateServiceAccount(ctx) if e != nil { return nil, e } - _, res.Token, e = s.ap.CreateServiceToken(ctx, serviceAcountID) + _, res.Token, e = s.ap.CreateServiceToken(ctx, serviceAccountID) if e != nil { return nil, e } From 8b9d4920fa6db80c3558744067ff67cc9faa633b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 21 Nov 2023 11:54:13 +0100 Subject: [PATCH 061/126] PMM-12251 Start tests in parallel. --- managed/services/grafana/client_test.go | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/managed/services/grafana/client_test.go b/managed/services/grafana/client_test.go index 1a386fc7fe..427b9a10e3 100644 --- a/managed/services/grafana/client_test.go +++ b/managed/services/grafana/client_test.go @@ -104,8 +104,7 @@ func TestClient(t *testing.T) { role := role t.Run(fmt.Sprintf("Basic auth %s", role.String()), func(t *testing.T) { - // do not run this test in parallel - they lock Grafana's sqlite3 database - // t.Parallel() + t.Parallel() login := fmt.Sprintf("basic-%s-%d", role, time.Now().Nanosecond()) userID, err := c.testCreateUser(ctx, login, role, authHeaders) @@ -131,8 +130,7 @@ func TestClient(t *testing.T) { }) t.Run(fmt.Sprintf("API Key auth %s", role.String()), func(t *testing.T) { - // do not run this test in parallel - they lock Grafana's sqlite3 database - // t.Parallel() + t.Parallel() login := fmt.Sprintf("api-%s-%d", role, time.Now().Nanosecond()) apiKeyID, apiKey, err := c.createAPIKey(ctx, login, role, authHeaders) @@ -157,8 +155,7 @@ func TestClient(t *testing.T) { }) t.Run(fmt.Sprintf("Service token auth %s", role.String()), func(t *testing.T) { - // do not run this test in parallel - they lock Grafana's sqlite3 database - // t.Parallel() + t.Parallel() serviceAccountID, err := c.createServiceAccount(ctx, role, authHeaders) if err != nil { From 8720a662f7243e3f350eee5e017335e2157453a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 22 Nov 2023 10:41:05 +0100 Subject: [PATCH 062/126] PMM-12251 Force in test. --- admin/commands/management/unregister.go | 1 + .../json/client/node/unregister_node_responses.go | 2 +- api/managementpb/json/managementpb.json | 2 +- api/managementpb/node.pb.go | 2 +- api/managementpb/node.proto | 2 +- api/swagger/swagger-dev.json | 2 +- api/swagger/swagger.json | 2 +- managed/services/management/node_test.go | 4 +++- 8 files changed, 10 insertions(+), 7 deletions(-) diff --git a/admin/commands/management/unregister.go b/admin/commands/management/unregister.go index 6115b9c3fb..b1c581d978 100644 --- a/admin/commands/management/unregister.go +++ b/admin/commands/management/unregister.go @@ -83,6 +83,7 @@ func (cmd *UnregisterCommand) RunCmd() (commands.Result, error) { params := &node.UnregisterNodeParams{ Body: node.UnregisterNodeBody{ NodeID: nodeID, + Force: cmd.Force, }, Context: commands.Ctx, } diff --git a/api/managementpb/json/client/node/unregister_node_responses.go b/api/managementpb/json/client/node/unregister_node_responses.go index 54167149b3..f2bd01755a 100644 --- a/api/managementpb/json/client/node/unregister_node_responses.go +++ b/api/managementpb/json/client/node/unregister_node_responses.go @@ -126,7 +126,7 @@ type UnregisterNodeBody struct { // Node_id to be unregistered. NodeID string `json:"node_id,omitempty"` - // Force delete node, related service account, even if it has not only pmm's service token attached. + // Force delete node, related service account, even if it has more service tokens attached. Force bool `json:"force,omitempty"` } diff --git a/api/managementpb/json/managementpb.json b/api/managementpb/json/managementpb.json index bdcdc47785..baa022bec2 100644 --- a/api/managementpb/json/managementpb.json +++ b/api/managementpb/json/managementpb.json @@ -3984,7 +3984,7 @@ "type": "object", "properties": { "force": { - "description": "Force delete node, related service account, even if it has not only pmm's service token attached.", + "description": "Force delete node, related service account, even if it has more service tokens attached.", "type": "boolean", "x-order": 1 }, diff --git a/api/managementpb/node.pb.go b/api/managementpb/node.pb.go index b079d8e426..01323c40e2 100644 --- a/api/managementpb/node.pb.go +++ b/api/managementpb/node.pb.go @@ -299,7 +299,7 @@ type UnregisterNodeRequest struct { // Node_id to be unregistered. NodeId string `protobuf:"bytes,1,opt,name=node_id,json=nodeId,proto3" json:"node_id,omitempty"` - // Force delete node, related service account, even if it has not only pmm's service token attached. + // Force delete node, related service account, even if it has more service tokens attached. Force bool `protobuf:"varint,2,opt,name=force,proto3" json:"force,omitempty"` } diff --git a/api/managementpb/node.proto b/api/managementpb/node.proto index a2b6a030e1..d4dacce360 100644 --- a/api/managementpb/node.proto +++ b/api/managementpb/node.proto @@ -61,7 +61,7 @@ message RegisterNodeResponse { message UnregisterNodeRequest { // Node_id to be unregistered. string node_id = 1; - // Force delete node, related service account, even if it has not only pmm's service token attached. + // Force delete node, related service account, even if it has more service tokens attached. bool force = 2; } diff --git a/api/swagger/swagger-dev.json b/api/swagger/swagger-dev.json index 6c2a286ac1..5238c6ce72 100644 --- a/api/swagger/swagger-dev.json +++ b/api/swagger/swagger-dev.json @@ -22304,7 +22304,7 @@ "x-order": 0 }, "force": { - "description": "Force delete node, related service account, even if it has not only pmm's service token attached.", + "description": "Force delete node, related service account, even if it has more service tokens attached.", "type": "boolean", "x-order": 1 } diff --git a/api/swagger/swagger.json b/api/swagger/swagger.json index c6dc87a8e7..6510812794 100644 --- a/api/swagger/swagger.json +++ b/api/swagger/swagger.json @@ -18632,7 +18632,7 @@ "x-order": 0 }, "force": { - "description": "Force delete node, related service account, even if it has not only pmm's service token attached.", + "description": "Force delete node, related service account, even if it has more service tokens attached.", "type": "boolean", "x-order": 1 } diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index b945a823f0..5786b8e579 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -57,9 +57,10 @@ func TestNodeService(t *testing.T) { serviceAccountID := int(0) serviceTokenID := int(1) + force := true authProvider.On("CreateServiceAccount", ctx).Return(serviceAccountID, nil) authProvider.On("CreateServiceToken", ctx, serviceAccountID).Return(serviceTokenID, "test-token", nil) - authProvider.On("DeleteServiceAccount", ctx).Return("", nil) + authProvider.On("DeleteServiceAccount", ctx, force).Return("", nil) s = NewNodeService(db, &authProvider) @@ -180,6 +181,7 @@ func TestNodeService(t *testing.T) { res, err := s.Unregister(ctx, &managementpb.UnregisterNodeRequest{ NodeId: resRegister.GenericNode.NodeId, + Force: true, }) assert.NoError(t, err) assert.Equal(t, "", res.Warning) From 56fa46170129bc70b1188a4d5ffac55615429a23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 23 Nov 2023 09:51:27 +0100 Subject: [PATCH 063/126] PMM-12251 Merge CreateServiceAccount and CreateServiceToken together. --- managed/services/grafana/client.go | 14 ++------------ 1 file changed, 2 insertions(+), 12 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 33094d0c84..5688c930b3 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -402,23 +402,13 @@ func (c *Client) testDeleteUser(ctx context.Context, userID int, authHeaders htt } // CreateServiceAccount creates service account with Admin role. -func (c *Client) CreateServiceAccount(ctx context.Context) (int, error) { +func (c *Client) CreateServiceAccount(ctx context.Context) (int, string, error) { authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { - return 0, err + return 0, "", err } serviceAccountID, err := c.createServiceAccount(ctx, admin, authHeaders) - if err != nil { - return 0, err - } - - return serviceAccountID, nil -} - -// CreateServiceToken creates service token for provided service account. -func (c *Client) CreateServiceToken(ctx context.Context, serviceAccountID int) (int, string, error) { - authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { return 0, "", err } From f7fd703fa1be5c05de2ac37a12d48162db7f2c6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 23 Nov 2023 09:57:33 +0100 Subject: [PATCH 064/126] PMM-12251 Mock. --- managed/services/grafana/client.go | 6 +-- managed/services/management/deps.go | 3 +- .../management/mock_auth_provider_test.go | 38 ++++--------------- managed/services/management/node.go | 6 +-- managed/services/management/node_test.go | 4 +- 5 files changed, 13 insertions(+), 44 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 5688c930b3..7f60ae2db1 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -401,7 +401,7 @@ func (c *Client) testDeleteUser(ctx context.Context, userID int, authHeaders htt return c.do(ctx, "DELETE", "/api/admin/users/"+strconv.Itoa(userID), "", authHeaders, nil, nil) } -// CreateServiceAccount creates service account with Admin role. +// CreateServiceAccount creates service account and token with Admin role. func (c *Client) CreateServiceAccount(ctx context.Context) (int, string, error) { authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { @@ -413,12 +413,12 @@ func (c *Client) CreateServiceAccount(ctx context.Context) (int, string, error) return 0, "", err } - serviceTokenID, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, authHeaders) + _, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, authHeaders) if err != nil { return 0, "", err } - return serviceTokenID, serviceToken, nil + return serviceAccountID, serviceToken, nil } // DeleteServiceAccount deletes service account by current service token. diff --git a/managed/services/management/deps.go b/managed/services/management/deps.go index 0d72b4af3c..5b4efb41bc 100644 --- a/managed/services/management/deps.go +++ b/managed/services/management/deps.go @@ -99,7 +99,6 @@ type victoriaMetricsClient interface { } type authProvider interface { - CreateServiceAccount(ctx context.Context) (int, error) - CreateServiceToken(ctx context.Context, serviceAccountID int) (int, string, error) + CreateServiceAccount(ctx context.Context) (int, string, error) DeleteServiceAccount(ctx context.Context, force bool) (string, error) } diff --git a/managed/services/management/mock_auth_provider_test.go b/managed/services/management/mock_auth_provider_test.go index c9fe97245f..aef7495939 100644 --- a/managed/services/management/mock_auth_provider_test.go +++ b/managed/services/management/mock_auth_provider_test.go @@ -14,12 +14,13 @@ type mockAuthProvider struct { } // CreateServiceAccount provides a mock function with given fields: ctx -func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context) (int, error) { +func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context) (int, string, error) { ret := _m.Called(ctx) var r0 int - var r1 error - if rf, ok := ret.Get(0).(func(context.Context) (int, error)); ok { + var r1 string + var r2 error + if rf, ok := ret.Get(0).(func(context.Context) (int, string, error)); ok { return rf(ctx) } if rf, ok := ret.Get(0).(func(context.Context) int); ok { @@ -28,39 +29,14 @@ func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context) (int, erro r0 = ret.Get(0).(int) } - if rf, ok := ret.Get(1).(func(context.Context) error); ok { + if rf, ok := ret.Get(1).(func(context.Context) string); ok { r1 = rf(ctx) - } else { - r1 = ret.Error(1) - } - - return r0, r1 -} - -// CreateServiceToken provides a mock function with given fields: ctx, serviceAccountID -func (_m *mockAuthProvider) CreateServiceToken(ctx context.Context, serviceAccountID int) (int, string, error) { - ret := _m.Called(ctx, serviceAccountID) - - var r0 int - var r1 string - var r2 error - if rf, ok := ret.Get(0).(func(context.Context, int) (int, string, error)); ok { - return rf(ctx, serviceAccountID) - } - if rf, ok := ret.Get(0).(func(context.Context, int) int); ok { - r0 = rf(ctx, serviceAccountID) - } else { - r0 = ret.Get(0).(int) - } - - if rf, ok := ret.Get(1).(func(context.Context, int) string); ok { - r1 = rf(ctx, serviceAccountID) } else { r1 = ret.Get(1).(string) } - if rf, ok := ret.Get(2).(func(context.Context, int) error); ok { - r2 = rf(ctx, serviceAccountID) + if rf, ok := ret.Get(2).(func(context.Context) error); ok { + r2 = rf(ctx) } else { r2 = ret.Error(2) } diff --git a/managed/services/management/node.go b/managed/services/management/node.go index ce527155dd..9ce1bf15d5 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -137,11 +137,7 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo if token != "" { res.Token = token } else { - serviceAccountID, e := s.ap.CreateServiceAccount(ctx) - if e != nil { - return nil, e - } - _, res.Token, e = s.ap.CreateServiceToken(ctx, serviceAccountID) + _, res.Token, e = s.ap.CreateServiceAccount(ctx) if e != nil { return nil, e } diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index 5786b8e579..922d074eb9 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -56,10 +56,8 @@ func TestNodeService(t *testing.T) { authProvider.Test(t) serviceAccountID := int(0) - serviceTokenID := int(1) force := true - authProvider.On("CreateServiceAccount", ctx).Return(serviceAccountID, nil) - authProvider.On("CreateServiceToken", ctx, serviceAccountID).Return(serviceTokenID, "test-token", nil) + authProvider.On("CreateServiceAccount", ctx).Return(serviceAccountID, "test-token", nil) authProvider.On("DeleteServiceAccount", ctx, force).Return("", nil) s = NewNodeService(db, &authProvider) From e470641d6d420805159557a802b59ba2885f3dec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 23 Nov 2023 10:09:12 +0100 Subject: [PATCH 065/126] PMM-12251 Gen. --- managed/services/management/mock_auth_provider_test.go | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/managed/services/management/mock_auth_provider_test.go b/managed/services/management/mock_auth_provider_test.go index aef7495939..d0a8725ca3 100644 --- a/managed/services/management/mock_auth_provider_test.go +++ b/managed/services/management/mock_auth_provider_test.go @@ -17,6 +17,10 @@ type mockAuthProvider struct { func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context) (int, string, error) { ret := _m.Called(ctx) + if len(ret) == 0 { + panic("no return value specified for CreateServiceAccount") + } + var r0 int var r1 string var r2 error @@ -48,6 +52,10 @@ func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context) (int, stri func (_m *mockAuthProvider) DeleteServiceAccount(ctx context.Context, force bool) (string, error) { ret := _m.Called(ctx, force) + if len(ret) == 0 { + panic("no return value specified for DeleteServiceAccount") + } + var r0 string var r1 error if rf, ok := ret.Get(0).(func(context.Context, bool) (string, error)); ok { From f0303c60807183f521506a11f40400e4baebe715 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 23 Nov 2023 10:51:02 +0100 Subject: [PATCH 066/126] PMM-12251 Refactor, node name. --- managed/services/grafana/client.go | 70 ++++++++++++------- managed/services/grafana/client_test.go | 8 +-- managed/services/management/deps.go | 2 +- .../management/mock_auth_provider_test.go | 22 +++--- managed/services/management/node.go | 2 +- 5 files changed, 63 insertions(+), 41 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 7f60ae2db1..25c33d027c 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -324,7 +324,13 @@ func (c *Client) getRoleForServiceToken(ctx context.Context, token string) (role return c.convertRole(role), nil } -func (c *Client) getIDForServiceAccount(ctx context.Context, token string) (int, error) { +func (c *Client) getIDForServiceAccount(ctx context.Context) (int, error) { + authHeaders, err := auth.GetHeadersFromContext(ctx) + if err != nil { + return 0, err + } + + token := auth.GetTokenFromHeaders(authHeaders) header := http.Header{} header.Add("Authorization", fmt.Sprintf("Bearer %s", token)) @@ -340,8 +346,13 @@ func (c *Client) getIDForServiceAccount(ctx context.Context, token string) (int, return int(k["id"].(float64)), nil //nolint:forcetypeassert } -func (c *Client) getNotPMMAgentTokenCountForServiceAccount(ctx context.Context, authHeaders http.Header) (int, error) { - serviceAccountID, err := c.getIDForServiceAccount(ctx, auth.GetTokenFromHeaders(authHeaders)) +func (c *Client) getNotPMMAgentTokenCountForServiceAccount(ctx context.Context) (int, error) { + authHeaders, err := auth.GetHeadersFromContext(ctx) + if err != nil { + return 0, err + } + + serviceAccountID, err := c.getIDForServiceAccount(ctx) if err != nil { return 0, err } @@ -402,18 +413,13 @@ func (c *Client) testDeleteUser(ctx context.Context, userID int, authHeaders htt } // CreateServiceAccount creates service account and token with Admin role. -func (c *Client) CreateServiceAccount(ctx context.Context) (int, string, error) { - authHeaders, err := auth.GetHeadersFromContext(ctx) - if err != nil { - return 0, "", err - } - - serviceAccountID, err := c.createServiceAccount(ctx, admin, authHeaders) +func (c *Client) CreateServiceAccount(ctx context.Context, nodeName string) (int, string, error) { + serviceAccountID, err := c.createServiceAccount(ctx, admin) if err != nil { return 0, "", err } - _, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, authHeaders) + _, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, nodeName) if err != nil { return 0, "", err } @@ -424,26 +430,22 @@ func (c *Client) CreateServiceAccount(ctx context.Context) (int, string, error) // DeleteServiceAccount deletes service account by current service token. func (c *Client) DeleteServiceAccount(ctx context.Context, force bool) (string, error) { warning := "" - authHeaders, err := auth.GetHeadersFromContext(ctx) - if err != nil { - return warning, err - } - serviceAccountID, err := c.getIDForServiceAccount(ctx, auth.GetTokenFromHeaders(authHeaders)) + serviceAccountID, err := c.getIDForServiceAccount(ctx) if err != nil { return warning, err } - customsTokensCount, err := c.getNotPMMAgentTokenCountForServiceAccount(ctx, authHeaders) + customsTokensCount, err := c.getNotPMMAgentTokenCountForServiceAccount(ctx) if err != nil { return warning, err } if !force && customsTokensCount > 0 { warning = "Service account wont be deleted, because there are more not PMM agent related service tokens." - err = c.deletePMMAgentRelatedServiceTokens(ctx, serviceAccountID, authHeaders) + err = c.deleteCurrentPMMAgentServiceToken(ctx, serviceAccountID) } else { - err = c.deleteServiceAccount(ctx, serviceAccountID, authHeaders) + err = c.deleteServiceAccount(ctx, serviceAccountID) } if err != nil { return warning, err @@ -643,7 +645,7 @@ type serviceToken struct { Role string `json:"role"` } -func (c *Client) createServiceAccount(ctx context.Context, role role, authHeaders http.Header) (int, error) { +func (c *Client) createServiceAccount(ctx context.Context, role role) (int, error) { if role == none { return 0, errors.New("you cannot create service account with empty role") } @@ -654,6 +656,11 @@ func (c *Client) createServiceAccount(ctx context.Context, role role, authHeader return 0, errors.WithStack(err) } + authHeaders, err := auth.GetHeadersFromContext(ctx) + if err != nil { + return 0, err + } + var m map[string]interface{} if err = c.do(ctx, "POST", "/api/serviceaccounts", "", authHeaders, b, &m); err != nil { return 0, err @@ -670,13 +677,18 @@ func (c *Client) createServiceAccount(ctx context.Context, role role, authHeader return serviceAccountID, nil } -func (c *Client) createServiceToken(ctx context.Context, serviceAccountID int, authHeaders http.Header) (int, string, error) { - serviceTokenName := fmt.Sprintf("%s-%s-%d", pmmServiceTokenName, admin, time.Now().Nanosecond()) +func (c *Client) createServiceToken(ctx context.Context, serviceAccountID int, nodeName string) (int, string, error) { + serviceTokenName := fmt.Sprintf("%s-%s", pmmServiceTokenName, nodeName) b, err := json.Marshal(serviceToken{Name: serviceTokenName, Role: admin.String()}) if err != nil { return 0, "", errors.WithStack(err) } + authHeaders, err := auth.GetHeadersFromContext(ctx) + if err != nil { + return 0, "", err + } + var m map[string]interface{} if err = c.do(ctx, "POST", fmt.Sprintf("/api/serviceaccounts/%d/tokens", serviceAccountID), "", authHeaders, b, &m); err != nil { return 0, "", err @@ -687,7 +699,12 @@ func (c *Client) createServiceToken(ctx context.Context, serviceAccountID int, a return serviceTokenID, serviceTokenKey, nil } -func (c *Client) deletePMMAgentRelatedServiceTokens(ctx context.Context, serviceAccountID int, authHeaders http.Header) error { +func (c *Client) deleteCurrentPMMAgentServiceToken(ctx context.Context, serviceAccountID int) error { + authHeaders, err := auth.GetHeadersFromContext(ctx) + if err != nil { + return err + } + var tokens []serviceToken if err := c.do(ctx, "GET", fmt.Sprintf("/api/serviceaccounts/%d/tokens", serviceAccountID), "", authHeaders, nil, &tokens); err != nil { return err @@ -704,7 +721,12 @@ func (c *Client) deletePMMAgentRelatedServiceTokens(ctx context.Context, service return nil } -func (c *Client) deleteServiceAccount(ctx context.Context, serviceAccountID int, authHeaders http.Header) error { +func (c *Client) deleteServiceAccount(ctx context.Context, serviceAccountID int) error { + authHeaders, err := auth.GetHeadersFromContext(ctx) + if err != nil { + return err + } + return c.do(ctx, "DELETE", fmt.Sprintf("/api/serviceaccounts/%d", serviceAccountID), "", authHeaders, nil, nil) } diff --git a/managed/services/grafana/client_test.go b/managed/services/grafana/client_test.go index 427b9a10e3..79dfca9d57 100644 --- a/managed/services/grafana/client_test.go +++ b/managed/services/grafana/client_test.go @@ -157,18 +157,18 @@ func TestClient(t *testing.T) { t.Run(fmt.Sprintf("Service token auth %s", role.String()), func(t *testing.T) { t.Parallel() - serviceAccountID, err := c.createServiceAccount(ctx, role, authHeaders) + serviceAccountID, err := c.createServiceAccount(ctx, role) if err != nil { defer func() { - err = c.deleteServiceAccount(ctx, serviceAccountID, authHeaders) + err = c.deleteServiceAccount(ctx, serviceAccountID) require.NoError(t, err) }() } require.NoError(t, err) - serviceTokenID, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, authHeaders) + serviceTokenID, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, "test-node") if err != nil { defer func() { - err = c.deletePMMAgentRelatedServiceTokens(ctx, serviceAccountID, authHeaders) + err = c.deletePMMAgentCurrentNodeServiceToken(ctx, serviceAccountID) require.NoError(t, err) }() } diff --git a/managed/services/management/deps.go b/managed/services/management/deps.go index 5b4efb41bc..bab3e9861a 100644 --- a/managed/services/management/deps.go +++ b/managed/services/management/deps.go @@ -99,6 +99,6 @@ type victoriaMetricsClient interface { } type authProvider interface { - CreateServiceAccount(ctx context.Context) (int, string, error) + CreateServiceAccount(ctx context.Context, noneName string) (int, string, error) DeleteServiceAccount(ctx context.Context, force bool) (string, error) } diff --git a/managed/services/management/mock_auth_provider_test.go b/managed/services/management/mock_auth_provider_test.go index d0a8725ca3..203eb9452f 100644 --- a/managed/services/management/mock_auth_provider_test.go +++ b/managed/services/management/mock_auth_provider_test.go @@ -13,9 +13,9 @@ type mockAuthProvider struct { mock.Mock } -// CreateServiceAccount provides a mock function with given fields: ctx -func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context) (int, string, error) { - ret := _m.Called(ctx) +// CreateServiceAccount provides a mock function with given fields: ctx, noneName +func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context, noneName string) (int, string, error) { + ret := _m.Called(ctx, noneName) if len(ret) == 0 { panic("no return value specified for CreateServiceAccount") @@ -24,23 +24,23 @@ func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context) (int, stri var r0 int var r1 string var r2 error - if rf, ok := ret.Get(0).(func(context.Context) (int, string, error)); ok { - return rf(ctx) + if rf, ok := ret.Get(0).(func(context.Context, string) (int, string, error)); ok { + return rf(ctx, noneName) } - if rf, ok := ret.Get(0).(func(context.Context) int); ok { - r0 = rf(ctx) + if rf, ok := ret.Get(0).(func(context.Context, string) int); ok { + r0 = rf(ctx, noneName) } else { r0 = ret.Get(0).(int) } - if rf, ok := ret.Get(1).(func(context.Context) string); ok { - r1 = rf(ctx) + if rf, ok := ret.Get(1).(func(context.Context, string) string); ok { + r1 = rf(ctx, noneName) } else { r1 = ret.Get(1).(string) } - if rf, ok := ret.Get(2).(func(context.Context) error); ok { - r2 = rf(ctx) + if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { + r2 = rf(ctx, noneName) } else { r2 = ret.Error(2) } diff --git a/managed/services/management/node.go b/managed/services/management/node.go index 9ce1bf15d5..361a1a7acd 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -137,7 +137,7 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo if token != "" { res.Token = token } else { - _, res.Token, e = s.ap.CreateServiceAccount(ctx) + _, res.Token, e = s.ap.CreateServiceAccount(ctx, req.NodeName) if e != nil { return nil, e } From 1d43d2807366d80682c3c54af79385bea555e9e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 23 Nov 2023 12:54:34 +0100 Subject: [PATCH 067/126] PMM-12251 Delete, mock and nodeName. --- managed/services/grafana/client.go | 18 +++++++++++------- managed/services/grafana/client_test.go | 2 +- managed/services/management/deps.go | 2 +- .../management/mock_auth_provider_test.go | 18 +++++++++--------- managed/services/management/node.go | 7 ++++++- managed/services/management/node_test.go | 5 +++-- 6 files changed, 31 insertions(+), 21 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 25c33d027c..c0a2d617ad 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -346,7 +346,7 @@ func (c *Client) getIDForServiceAccount(ctx context.Context) (int, error) { return int(k["id"].(float64)), nil //nolint:forcetypeassert } -func (c *Client) getNotPMMAgentTokenCountForServiceAccount(ctx context.Context) (int, error) { +func (c *Client) getNotCurrentPMMAgentTokenCountForServiceAccount(ctx context.Context, nodeName string) (int, error) { authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { return 0, err @@ -364,7 +364,8 @@ func (c *Client) getNotPMMAgentTokenCountForServiceAccount(ctx context.Context) count := 0 for _, token := range tokens { - if !strings.HasPrefix(token.Name, pmmServiceTokenName) { + serviceTokenName := fmt.Sprintf("%s-%s", pmmServiceTokenName, nodeName) + if token.Name != serviceTokenName { count++ } } @@ -428,7 +429,7 @@ func (c *Client) CreateServiceAccount(ctx context.Context, nodeName string) (int } // DeleteServiceAccount deletes service account by current service token. -func (c *Client) DeleteServiceAccount(ctx context.Context, force bool) (string, error) { +func (c *Client) DeleteServiceAccount(ctx context.Context, nodeName string, force bool) (string, error) { warning := "" serviceAccountID, err := c.getIDForServiceAccount(ctx) @@ -436,14 +437,14 @@ func (c *Client) DeleteServiceAccount(ctx context.Context, force bool) (string, return warning, err } - customsTokensCount, err := c.getNotPMMAgentTokenCountForServiceAccount(ctx) + customsTokensCount, err := c.getNotCurrentPMMAgentTokenCountForServiceAccount(ctx, nodeName) if err != nil { return warning, err } if !force && customsTokensCount > 0 { warning = "Service account wont be deleted, because there are more not PMM agent related service tokens." - err = c.deleteCurrentPMMAgentServiceToken(ctx, serviceAccountID) + err = c.deleteCurrentPMMAgentServiceToken(ctx, serviceAccountID, nodeName) } else { err = c.deleteServiceAccount(ctx, serviceAccountID) } @@ -699,7 +700,7 @@ func (c *Client) createServiceToken(ctx context.Context, serviceAccountID int, n return serviceTokenID, serviceTokenKey, nil } -func (c *Client) deleteCurrentPMMAgentServiceToken(ctx context.Context, serviceAccountID int) error { +func (c *Client) deleteCurrentPMMAgentServiceToken(ctx context.Context, serviceAccountID int, nodeName string) error { authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { return err @@ -711,10 +712,13 @@ func (c *Client) deleteCurrentPMMAgentServiceToken(ctx context.Context, serviceA } for _, token := range tokens { - if strings.HasPrefix(token.Name, pmmServiceTokenName) { + serviceTokenName := fmt.Sprintf("%s-%s", pmmServiceTokenName, nodeName) + if token.Name != serviceTokenName { if err := c.do(ctx, "DELETE", fmt.Sprintf("/api/serviceaccounts/%d/tokens/%d", serviceAccountID, token.ID), "", authHeaders, nil, nil); err != nil { return err } + + return nil } } diff --git a/managed/services/grafana/client_test.go b/managed/services/grafana/client_test.go index 79dfca9d57..b90689de80 100644 --- a/managed/services/grafana/client_test.go +++ b/managed/services/grafana/client_test.go @@ -168,7 +168,7 @@ func TestClient(t *testing.T) { serviceTokenID, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, "test-node") if err != nil { defer func() { - err = c.deletePMMAgentCurrentNodeServiceToken(ctx, serviceAccountID) + err = c.deleteCurrentPMMAgentRelatedServiceTokens(ctx, serviceAccountID) require.NoError(t, err) }() } diff --git a/managed/services/management/deps.go b/managed/services/management/deps.go index bab3e9861a..64c109d918 100644 --- a/managed/services/management/deps.go +++ b/managed/services/management/deps.go @@ -100,5 +100,5 @@ type victoriaMetricsClient interface { type authProvider interface { CreateServiceAccount(ctx context.Context, noneName string) (int, string, error) - DeleteServiceAccount(ctx context.Context, force bool) (string, error) + DeleteServiceAccount(ctx context.Context, noneName string, force bool) (string, error) } diff --git a/managed/services/management/mock_auth_provider_test.go b/managed/services/management/mock_auth_provider_test.go index 203eb9452f..2e0e11abbe 100644 --- a/managed/services/management/mock_auth_provider_test.go +++ b/managed/services/management/mock_auth_provider_test.go @@ -48,9 +48,9 @@ func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context, noneName s return r0, r1, r2 } -// DeleteServiceAccount provides a mock function with given fields: ctx, force -func (_m *mockAuthProvider) DeleteServiceAccount(ctx context.Context, force bool) (string, error) { - ret := _m.Called(ctx, force) +// DeleteServiceAccount provides a mock function with given fields: ctx, noneName, force +func (_m *mockAuthProvider) DeleteServiceAccount(ctx context.Context, noneName string, force bool) (string, error) { + ret := _m.Called(ctx, noneName, force) if len(ret) == 0 { panic("no return value specified for DeleteServiceAccount") @@ -58,17 +58,17 @@ func (_m *mockAuthProvider) DeleteServiceAccount(ctx context.Context, force bool var r0 string var r1 error - if rf, ok := ret.Get(0).(func(context.Context, bool) (string, error)); ok { - return rf(ctx, force) + if rf, ok := ret.Get(0).(func(context.Context, string, bool) (string, error)); ok { + return rf(ctx, noneName, force) } - if rf, ok := ret.Get(0).(func(context.Context, bool) string); ok { - r0 = rf(ctx, force) + if rf, ok := ret.Get(0).(func(context.Context, string, bool) string); ok { + r0 = rf(ctx, noneName, force) } else { r0 = ret.Get(0).(string) } - if rf, ok := ret.Get(1).(func(context.Context, bool) error); ok { - r1 = rf(ctx, force) + if rf, ok := ret.Get(1).(func(context.Context, string, bool) error); ok { + r1 = rf(ctx, noneName, force) } else { r1 = ret.Error(1) } diff --git a/managed/services/management/node.go b/managed/services/management/node.go index 361a1a7acd..36da1546cf 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -155,7 +155,12 @@ func (s *NodeService) Unregister(ctx context.Context, req *managementpb.Unregist return nil, err } - warning, err := s.ap.DeleteServiceAccount(ctx, req.Force) + node, err := models.FindNodeByID(s.db.Querier, req.NodeId) + if err != nil { + return nil, err + } + + warning, err := s.ap.DeleteServiceAccount(ctx, node.NodeName, req.Force) if err != nil { return &managementpb.UnregisterNodeResponse{ Warning: err.Error(), diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index 922d074eb9..6327ae5a51 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -57,8 +57,9 @@ func TestNodeService(t *testing.T) { serviceAccountID := int(0) force := true - authProvider.On("CreateServiceAccount", ctx).Return(serviceAccountID, "test-token", nil) - authProvider.On("DeleteServiceAccount", ctx, force).Return("", nil) + nodeName := "test-node" + authProvider.On("CreateServiceAccount", ctx, nodeName).Return(serviceAccountID, "test-token", nil) + authProvider.On("DeleteServiceAccount", ctx, nodeName, force).Return("", nil) s = NewNodeService(db, &authProvider) From b1a88afe9e4d8631aecf711e727e8bdc73ab0a5f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 23 Nov 2023 13:43:59 +0100 Subject: [PATCH 068/126] PMM-12251 Fix node test after changes. --- managed/services/management/node.go | 8 ++++---- managed/services/management/node_test.go | 23 ++++++++++++----------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/managed/services/management/node.go b/managed/services/management/node.go index 36da1546cf..145ea03d5e 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -148,14 +148,14 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo // Unregister do unregistration of the node. func (s *NodeService) Unregister(ctx context.Context, req *managementpb.UnregisterNodeRequest) (*managementpb.UnregisterNodeResponse, error) { - err := s.db.InTransaction(func(tx *reform.TX) error { - return models.RemoveNode(tx.Querier, req.NodeId, models.RemoveCascade) - }) + node, err := models.FindNodeByID(s.db.Querier, req.NodeId) if err != nil { return nil, err } - node, err := models.FindNodeByID(s.db.Querier, req.NodeId) + err = s.db.InTransaction(func(tx *reform.TX) error { + return models.RemoveNode(tx.Querier, req.NodeId, models.RemoveCascade) + }) if err != nil { return nil, err } diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index 6327ae5a51..40a406e563 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -72,14 +72,14 @@ func TestNodeService(t *testing.T) { res, err := s.Register(ctx, &managementpb.RegisterNodeRequest{ NodeType: inventorypb.NodeType_GENERIC_NODE, - NodeName: "node", + NodeName: "test-node", Address: "some.address.org", Region: "region", }) expected := &managementpb.RegisterNodeResponse{ GenericNode: &inventorypb.GenericNode{ NodeId: "/node_id/00000000-0000-4000-8000-000000000005", - NodeName: "node", + NodeName: "test-node", Address: "some.address.org", Region: "region", }, @@ -96,16 +96,16 @@ func TestNodeService(t *testing.T) { t.Run("Exist", func(t *testing.T) { res, err = s.Register(ctx, &managementpb.RegisterNodeRequest{ NodeType: inventorypb.NodeType_GENERIC_NODE, - NodeName: "node", + NodeName: "test-node", }) assert.Nil(t, res) - tests.AssertGRPCError(t, status.New(codes.AlreadyExists, `Node with name "node" already exists.`), err) + tests.AssertGRPCError(t, status.New(codes.AlreadyExists, `Node with name "test-node" already exists.`), err) }) t.Run("Reregister", func(t *testing.T) { res, err = s.Register(ctx, &managementpb.RegisterNodeRequest{ NodeType: inventorypb.NodeType_GENERIC_NODE, - NodeName: "node", + NodeName: "test-node", Address: "some.address.org", Region: "region", Reregister: true, @@ -113,7 +113,7 @@ func TestNodeService(t *testing.T) { expected := &managementpb.RegisterNodeResponse{ GenericNode: &inventorypb.GenericNode{ NodeId: "/node_id/00000000-0000-4000-8000-000000000008", - NodeName: "node", + NodeName: "test-node", Address: "some.address.org", Region: "region", }, @@ -130,7 +130,7 @@ func TestNodeService(t *testing.T) { t.Run("Reregister-force", func(t *testing.T) { res, err = s.Register(ctx, &managementpb.RegisterNodeRequest{ NodeType: inventorypb.NodeType_GENERIC_NODE, - NodeName: "node-name-new", + NodeName: "test-node", Address: "some.address.org", Region: "region", Reregister: true, @@ -138,7 +138,7 @@ func TestNodeService(t *testing.T) { expected := &managementpb.RegisterNodeResponse{ GenericNode: &inventorypb.GenericNode{ NodeId: "/node_id/00000000-0000-4000-8000-00000000000b", - NodeName: "node-name-new", + NodeName: "test-node", Address: "some.address.org", Region: "region", }, @@ -156,15 +156,17 @@ func TestNodeService(t *testing.T) { t.Run("Unregister", func(t *testing.T) { resRegister, err := s.Register(ctx, &managementpb.RegisterNodeRequest{ NodeType: inventorypb.NodeType_GENERIC_NODE, - NodeName: "node", + NodeName: "test-node", Address: "some.address.org", Region: "region", Reregister: true, }) + assert.NoError(t, err) + expected := &managementpb.RegisterNodeResponse{ GenericNode: &inventorypb.GenericNode{ NodeId: "/node_id/00000000-0000-4000-8000-00000000000e", - NodeName: "node", + NodeName: "test-node", Address: "some.address.org", Region: "region", }, @@ -176,7 +178,6 @@ func TestNodeService(t *testing.T) { Token: "test-token", } assert.Equal(t, expected, resRegister) - assert.NoError(t, err) res, err := s.Unregister(ctx, &managementpb.UnregisterNodeRequest{ NodeId: resRegister.GenericNode.NodeId, From 96aa1f138959c267eeb675a7e56cf05e0180f350 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 27 Nov 2023 09:09:28 +0100 Subject: [PATCH 069/126] PMM-12251 Fix test. --- managed/services/grafana/client_test.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/managed/services/grafana/client_test.go b/managed/services/grafana/client_test.go index b90689de80..7fed284778 100644 --- a/managed/services/grafana/client_test.go +++ b/managed/services/grafana/client_test.go @@ -165,10 +165,11 @@ func TestClient(t *testing.T) { }() } require.NoError(t, err) + nodeName := "test-node" serviceTokenID, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, "test-node") if err != nil { defer func() { - err = c.deleteCurrentPMMAgentRelatedServiceTokens(ctx, serviceAccountID) + err = c.deleteCurrentPMMAgentServiceToken(ctx, serviceAccountID, nodeName) require.NoError(t, err) }() } From ad4247af78862c27a52c8e4d2dcbb7027e9bd074 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 27 Nov 2023 09:12:18 +0100 Subject: [PATCH 070/126] PMM-12251 nodeName in Service Account name. --- managed/services/grafana/client.go | 6 +++--- managed/services/grafana/client_test.go | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index c0a2d617ad..594e54db3f 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -415,7 +415,7 @@ func (c *Client) testDeleteUser(ctx context.Context, userID int, authHeaders htt // CreateServiceAccount creates service account and token with Admin role. func (c *Client) CreateServiceAccount(ctx context.Context, nodeName string) (int, string, error) { - serviceAccountID, err := c.createServiceAccount(ctx, admin) + serviceAccountID, err := c.createServiceAccount(ctx, admin, nodeName) if err != nil { return 0, "", err } @@ -646,12 +646,12 @@ type serviceToken struct { Role string `json:"role"` } -func (c *Client) createServiceAccount(ctx context.Context, role role) (int, error) { +func (c *Client) createServiceAccount(ctx context.Context, role role, nodeName string) (int, error) { if role == none { return 0, errors.New("you cannot create service account with empty role") } - name := fmt.Sprintf("serviceaccount-%s-%d", role, time.Now().Nanosecond()) + name := fmt.Sprintf("serviceaccount-%s-%s-%d", role, nodeName, time.Now().Nanosecond()) b, err := json.Marshal(serviceAccount{Name: name, Role: role.String()}) if err != nil { return 0, errors.WithStack(err) diff --git a/managed/services/grafana/client_test.go b/managed/services/grafana/client_test.go index 7fed284778..b91b23a4dc 100644 --- a/managed/services/grafana/client_test.go +++ b/managed/services/grafana/client_test.go @@ -157,7 +157,8 @@ func TestClient(t *testing.T) { t.Run(fmt.Sprintf("Service token auth %s", role.String()), func(t *testing.T) { t.Parallel() - serviceAccountID, err := c.createServiceAccount(ctx, role) + nodeName := "test-node" + serviceAccountID, err := c.createServiceAccount(ctx, role, nodeName) if err != nil { defer func() { err = c.deleteServiceAccount(ctx, serviceAccountID) @@ -165,8 +166,7 @@ func TestClient(t *testing.T) { }() } require.NoError(t, err) - nodeName := "test-node" - serviceTokenID, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, "test-node") + serviceTokenID, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, nodeName) if err != nil { defer func() { err = c.deleteCurrentPMMAgentServiceToken(ctx, serviceAccountID, nodeName) From a10c16c8bf3b0c294f137d2cac8f6b8bc9ee63ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 27 Nov 2023 11:30:10 +0100 Subject: [PATCH 071/126] PMM-12251 Change in naming. --- managed/services/grafana/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 594e54db3f..5c9574fb94 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -651,7 +651,7 @@ func (c *Client) createServiceAccount(ctx context.Context, role role, nodeName s return 0, errors.New("you cannot create service account with empty role") } - name := fmt.Sprintf("serviceaccount-%s-%s-%d", role, nodeName, time.Now().Nanosecond()) + name := fmt.Sprintf("serviceaccount-%s-%d", nodeName, time.Now().Nanosecond()) b, err := json.Marshal(serviceAccount{Name: name, Role: role.String()}) if err != nil { return 0, errors.WithStack(err) From a7af92b4a938bc7847a52dfaa3fed161e9c6a30b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 27 Nov 2023 12:10:57 +0100 Subject: [PATCH 072/126] PMM-12251 Modify API test. Data race. --- api-tests/helpers.go | 12 ++++++++++++ api-tests/management/helpers.go | 14 ++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/api-tests/helpers.go b/api-tests/helpers.go index 9960f21716..e52f66344d 100644 --- a/api-tests/helpers.go +++ b/api-tests/helpers.go @@ -19,6 +19,7 @@ import ( "context" "fmt" "math/rand" + "net/url" "reflect" "testing" @@ -26,6 +27,7 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" + httptransport "github.com/go-openapi/runtime/client" inventoryClient "github.com/percona/pmm/api/inventorypb/json/client" "github.com/percona/pmm/api/inventorypb/json/client/agents" "github.com/percona/pmm/api/inventorypb/json/client/nodes" @@ -147,6 +149,16 @@ func UnregisterNodes(t TestingT, nodeIDs ...string) { assert.NotNil(t, res) assert.NotNil(t, res.Payload) assert.Empty(t, res.Payload.Warning) + + baseURL, err := url.Parse(BaseURL.String()) + assert.NoError(t, err) + if u := baseURL.User; u != nil { + password, _ := u.Password() + current := client.DefaultTransportConfig() + transport := httptransport.New(current.Host, current.BasePath, current.Schemes) + transport.DefaultAuthentication = httptransport.BasicAuth(u.Username(), password) + client.Default.SetTransport(transport) + } } } diff --git a/api-tests/management/helpers.go b/api-tests/management/helpers.go index 9a69dd3eff..9dc5c22691 100644 --- a/api-tests/management/helpers.go +++ b/api-tests/management/helpers.go @@ -22,6 +22,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + httptransport "github.com/go-openapi/runtime/client" pmmapitests "github.com/percona/pmm/api-tests" "github.com/percona/pmm/api/inventorypb" inventoryClient "github.com/percona/pmm/api/inventorypb/json/client" @@ -40,6 +41,7 @@ func RegisterGenericNode(t pmmapitests.TestingT, body node.RegisterNodeBody) (st Context: pmmapitests.Context, Body: body, } + registerOK, err := client.Default.Node.RegisterNode(¶ms) require.NoError(t, err) require.NotNil(t, registerOK) @@ -47,6 +49,12 @@ func RegisterGenericNode(t pmmapitests.TestingT, body node.RegisterNodeBody) (st require.NotNil(t, registerOK.Payload.PMMAgent.AgentID) require.NotNil(t, registerOK.Payload.GenericNode) require.NotNil(t, registerOK.Payload.GenericNode.NodeID) + + current := client.DefaultTransportConfig() + transport := httptransport.New(current.Host, current.BasePath, current.Schemes) + transport.DefaultAuthentication = httptransport.BearerToken(registerOK.Payload.Token) + client.Default.SetTransport(transport) + return registerOK.Payload.GenericNode.NodeID, registerOK.Payload.PMMAgent.AgentID } @@ -64,6 +72,12 @@ func registerContainerNode(t pmmapitests.TestingT, body node.RegisterNodeBody) ( require.NotNil(t, registerOK.Payload.PMMAgent.AgentID) require.NotNil(t, registerOK.Payload.ContainerNode) require.NotNil(t, registerOK.Payload.ContainerNode.NodeID) + + current := client.DefaultTransportConfig() + transport := httptransport.New(current.Host, current.BasePath, current.Schemes) + transport.DefaultAuthentication = httptransport.BearerToken(registerOK.Payload.Token) + client.Default.SetTransport(transport) + return registerOK.Payload.ContainerNode.NodeID, registerOK.Payload.PMMAgent.AgentID } From a08169c669552670854e5441c7b7462ce2565083 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 28 Nov 2023 16:22:02 +0100 Subject: [PATCH 073/126] PMM-12251 Changes. --- api-tests/helpers.go | 13 -- api-tests/management/helpers.go | 7 +- api-tests/management/postgresql_test.go | 2 - api-tests/server/auth_test.go | 29 ++-- managed/services/grafana/client.go | 131 +++++++++++------- managed/services/grafana/client_test.go | 43 +++--- managed/services/management/deps.go | 2 +- .../management/mock_auth_provider_test.go | 22 +-- managed/services/management/node.go | 3 +- managed/services/management/node_test.go | 5 +- 10 files changed, 136 insertions(+), 121 deletions(-) diff --git a/api-tests/helpers.go b/api-tests/helpers.go index e52f66344d..5442f24409 100644 --- a/api-tests/helpers.go +++ b/api-tests/helpers.go @@ -19,7 +19,6 @@ import ( "context" "fmt" "math/rand" - "net/url" "reflect" "testing" @@ -27,7 +26,6 @@ import ( "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" - httptransport "github.com/go-openapi/runtime/client" inventoryClient "github.com/percona/pmm/api/inventorypb/json/client" "github.com/percona/pmm/api/inventorypb/json/client/agents" "github.com/percona/pmm/api/inventorypb/json/client/nodes" @@ -139,7 +137,6 @@ func UnregisterNodes(t TestingT, nodeIDs ...string) { params := &node.UnregisterNodeParams{ Body: node.UnregisterNodeBody{ NodeID: nodeID, - Force: true, }, Context: context.Background(), } @@ -149,16 +146,6 @@ func UnregisterNodes(t TestingT, nodeIDs ...string) { assert.NotNil(t, res) assert.NotNil(t, res.Payload) assert.Empty(t, res.Payload.Warning) - - baseURL, err := url.Parse(BaseURL.String()) - assert.NoError(t, err) - if u := baseURL.User; u != nil { - password, _ := u.Password() - current := client.DefaultTransportConfig() - transport := httptransport.New(current.Host, current.BasePath, current.Schemes) - transport.DefaultAuthentication = httptransport.BasicAuth(u.Username(), password) - client.Default.SetTransport(transport) - } } } diff --git a/api-tests/management/helpers.go b/api-tests/management/helpers.go index 9dc5c22691..4bb81a86cb 100644 --- a/api-tests/management/helpers.go +++ b/api-tests/management/helpers.go @@ -19,10 +19,10 @@ package management import ( "context" + httptransport "github.com/go-openapi/runtime/client" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" - httptransport "github.com/go-openapi/runtime/client" pmmapitests "github.com/percona/pmm/api-tests" "github.com/percona/pmm/api/inventorypb" inventoryClient "github.com/percona/pmm/api/inventorypb/json/client" @@ -50,11 +50,6 @@ func RegisterGenericNode(t pmmapitests.TestingT, body node.RegisterNodeBody) (st require.NotNil(t, registerOK.Payload.GenericNode) require.NotNil(t, registerOK.Payload.GenericNode.NodeID) - current := client.DefaultTransportConfig() - transport := httptransport.New(current.Host, current.BasePath, current.Schemes) - transport.DefaultAuthentication = httptransport.BearerToken(registerOK.Payload.Token) - client.Default.SetTransport(transport) - return registerOK.Payload.GenericNode.NodeID, registerOK.Payload.PMMAgent.AgentID } diff --git a/api-tests/management/postgresql_test.go b/api-tests/management/postgresql_test.go index 245f93ee91..7a41ceeb7c 100644 --- a/api-tests/management/postgresql_test.go +++ b/api-tests/management/postgresql_test.go @@ -399,7 +399,6 @@ func TestAddPostgreSQL(t *testing.T) { newNodeID := addPostgreSQLOK.Payload.Service.NodeID require.NotEqual(t, nodeID, newNodeID) - defer pmmapitests.UnregisterNodes(t, newNodeID) defer pmmapitests.RemoveServices(t, serviceID) defer removeServiceAgents(t, serviceID) @@ -458,7 +457,6 @@ func TestAddPostgreSQL(t *testing.T) { remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, remoteNodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &postgresql.AddPostgreSQLParams{ diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index 84d0076f68..2bb1e5bd0c 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -38,6 +38,11 @@ import ( "github.com/percona/pmm/api/serverpb/json/client/server" ) +const ( + pmmServiceTokenName = "pmm-agent-service-token" //nolint:gosec + pmmServiceAccountName = "pmm-agent-service-account" //nolint:gosec +) + func TestAuth(t *testing.T) { t.Run("AuthErrors", func(t *testing.T) { for user, code := range map[*url.Userinfo]int{ @@ -411,19 +416,23 @@ func TestServiceAccountPermissions(t *testing.T) { // service token role options: editor, admin // basic auth format is skipped, endpoint /auth/serviceaccount (to get info about token) requires Bearer authorization // service_token:token could be used in pmm-agent and pmm-admin (its transformed into Bearer authorization) + nodeName := "test-node" - viewerAccountID := createServiceAccountWithRole(t, "Viewer") - viewerTokenID, viewerToken := createServiceToken(t, viewerAccountID) + viewerNodeName := fmt.Sprintf("%s-viewer", nodeName) + viewerAccountID := createServiceAccountWithRole(t, "Viewer", viewerNodeName) + viewerTokenID, viewerToken := createServiceToken(t, viewerAccountID, viewerNodeName) defer deleteServiceAccount(t, viewerAccountID) defer deleteServiceToken(t, viewerAccountID, viewerTokenID) - editorAccountID := createServiceAccountWithRole(t, "Editor") - editorTokenID, editorToken := createServiceToken(t, editorAccountID) + editorNodeName := fmt.Sprintf("%s-editor", nodeName) + editorAccountID := createServiceAccountWithRole(t, "Editor", editorNodeName) + editorTokenID, editorToken := createServiceToken(t, editorAccountID, editorNodeName) defer deleteServiceAccount(t, editorAccountID) defer deleteServiceToken(t, editorAccountID, editorTokenID) - adminAccountID := createServiceAccountWithRole(t, "Admin") - adminTokenID, adminToken := createServiceToken(t, adminAccountID) + adminNodeName := fmt.Sprintf("%s-admin", nodeName) + adminAccountID := createServiceAccountWithRole(t, "Admin", adminNodeName) + adminTokenID, adminToken := createServiceToken(t, adminAccountID, adminNodeName) defer deleteServiceAccount(t, adminAccountID) defer deleteServiceToken(t, adminAccountID, adminTokenID) @@ -503,13 +512,13 @@ func TestServiceAccountPermissions(t *testing.T) { } } -func createServiceAccountWithRole(t *testing.T, role string) int { +func createServiceAccountWithRole(t *testing.T, role, nodeName string) int { t.Helper() u, err := url.Parse(pmmapitests.BaseURL.String()) require.NoError(t, err) u.Path = "/graph/api/serviceaccounts" - name := fmt.Sprintf("serviceaccount-%s-%d", role, time.Now().Nanosecond()) + name := fmt.Sprintf("%s-%s", pmmServiceAccountName, nodeName) data, err := json.Marshal(map[string]string{ "name": name, "role": role, @@ -565,13 +574,13 @@ func deleteServiceAccount(t *testing.T, serviceAccountID int) { require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete service account, status code: %d, response: %s", resp.StatusCode, b) } -func createServiceToken(t *testing.T, serviceAccountID int) (int, string) { +func createServiceToken(t *testing.T, serviceAccountID int, nodeName string) (int, string) { t.Helper() u, err := url.Parse(pmmapitests.BaseURL.String()) require.NoError(t, err) u.Path = fmt.Sprintf("/graph/api/serviceaccounts/%d/tokens", serviceAccountID) - name := fmt.Sprintf("servicetoken-%d-%d", serviceAccountID, time.Now().Nanosecond()) + name := fmt.Sprintf("%s-%s", pmmServiceTokenName, nodeName) data, err := json.Marshal(map[string]string{ "name": name, }) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 5c9574fb94..f08ff075f3 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -49,7 +49,8 @@ var ErrFailedToGetToken = errors.New("failed to get token") const ( defaultEvaluationInterval = time.Minute - pmmServiceTokenName = "pmm-agent-service-token" //nolint:gosec + pmmServiceTokenName = "pmm-agent-service-token" //nolint:gosec + pmmServiceAccountName = "pmm-agent-service-account" //nolint:gosec ) // Client represents a client for Grafana API. @@ -324,13 +325,7 @@ func (c *Client) getRoleForServiceToken(ctx context.Context, token string) (role return c.convertRole(role), nil } -func (c *Client) getIDForServiceAccount(ctx context.Context) (int, error) { - authHeaders, err := auth.GetHeadersFromContext(ctx) - if err != nil { - return 0, err - } - - token := auth.GetTokenFromHeaders(authHeaders) +func (c *Client) getServiceAccountIDForServiceToken(ctx context.Context, token string) (int, error) { header := http.Header{} header.Add("Authorization", fmt.Sprintf("Bearer %s", token)) @@ -339,20 +334,38 @@ func (c *Client) getIDForServiceAccount(ctx context.Context) (int, error) { return 0, err } - if id, _ := k["orgId"].(float64); id != 1 { - return 0, nil + id, _ := k["id"].(float64) + return int(id), nil +} + +type serviceAccountSearch struct { + TotalCount int `json:"totalCount"` + ServiceAccounts []serviceAccount `json:"serviceAccounts"` +} + +func (c *Client) getServiceAccountIDFromName(ctx context.Context, nodeName string, authHeaders http.Header) (int, error) { + var res serviceAccountSearch + if err := c.do(ctx, http.MethodGet, "/api/serviceaccounts/search", fmt.Sprintf("query=%s", nodeName), authHeaders, nil, &res); err != nil { + return 0, err } - return int(k["id"].(float64)), nil //nolint:forcetypeassert + switch { + case res.TotalCount < 1: + return 0, errors.Errorf("service account %s not found", nodeName) + case res.TotalCount > 1: + return 0, errors.Errorf("service account %s has more results", nodeName) + } + + return res.ServiceAccounts[0].ID, nil } -func (c *Client) getNotCurrentPMMAgentTokenCountForServiceAccount(ctx context.Context, nodeName string) (int, error) { +func (c *Client) getNotPMMAgentTokenCountForServiceAccount(ctx context.Context, nodeName string) (int, error) { authHeaders, err := auth.GetHeadersFromContext(ctx) if err != nil { return 0, err } - serviceAccountID, err := c.getIDForServiceAccount(ctx) + serviceAccountID, err := c.getServiceAccountIDFromName(ctx, nodeName, authHeaders) if err != nil { return 0, err } @@ -365,7 +378,7 @@ func (c *Client) getNotCurrentPMMAgentTokenCountForServiceAccount(ctx context.Co count := 0 for _, token := range tokens { serviceTokenName := fmt.Sprintf("%s-%s", pmmServiceTokenName, nodeName) - if token.Name != serviceTokenName { + if !strings.HasPrefix(token.Name, serviceTokenName) { count++ } } @@ -414,13 +427,18 @@ func (c *Client) testDeleteUser(ctx context.Context, userID int, authHeaders htt } // CreateServiceAccount creates service account and token with Admin role. -func (c *Client) CreateServiceAccount(ctx context.Context, nodeName string) (int, string, error) { - serviceAccountID, err := c.createServiceAccount(ctx, admin, nodeName) +func (c *Client) CreateServiceAccount(ctx context.Context, nodeName string, reregister bool) (int, string, error) { + authHeaders, err := auth.GetHeadersFromContext(ctx) + if err != nil { + return 0, "", err + } + + serviceAccountID, err := c.createServiceAccount(ctx, admin, nodeName, reregister, authHeaders) if err != nil { return 0, "", err } - _, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, nodeName) + _, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, nodeName, reregister, authHeaders) if err != nil { return 0, "", err } @@ -430,23 +448,27 @@ func (c *Client) CreateServiceAccount(ctx context.Context, nodeName string) (int // DeleteServiceAccount deletes service account by current service token. func (c *Client) DeleteServiceAccount(ctx context.Context, nodeName string, force bool) (string, error) { - warning := "" + authHeaders, err := auth.GetHeadersFromContext(ctx) + if err != nil { + return "", err + } - serviceAccountID, err := c.getIDForServiceAccount(ctx) + warning := "" + serviceAccountID, err := c.getServiceAccountIDFromName(ctx, nodeName, authHeaders) if err != nil { return warning, err } - customsTokensCount, err := c.getNotCurrentPMMAgentTokenCountForServiceAccount(ctx, nodeName) + customsTokensCount, err := c.getNotPMMAgentTokenCountForServiceAccount(ctx, nodeName) if err != nil { return warning, err } if !force && customsTokensCount > 0 { warning = "Service account wont be deleted, because there are more not PMM agent related service tokens." - err = c.deleteCurrentPMMAgentServiceToken(ctx, serviceAccountID, nodeName) + err = c.deletePMMAgentServiceToken(ctx, serviceAccountID, nodeName, authHeaders) } else { - err = c.deleteServiceAccount(ctx, serviceAccountID) + err = c.deleteServiceAccount(ctx, serviceAccountID, authHeaders) } if err != nil { return warning, err @@ -637,8 +659,10 @@ func (c *Client) deleteAPIKey(ctx context.Context, apiKeyID int64, authHeaders h } type serviceAccount struct { - Name string `json:"name"` - Role string `json:"role"` + ID int `json:"id"` + Name string `json:"name"` + Role string `json:"role"` + Force bool `json:"force"` } type serviceToken struct { ID int `json:"id"` @@ -646,22 +670,17 @@ type serviceToken struct { Role string `json:"role"` } -func (c *Client) createServiceAccount(ctx context.Context, role role, nodeName string) (int, error) { +func (c *Client) createServiceAccount(ctx context.Context, role role, nodeName string, reregister bool, authHeaders http.Header) (int, error) { if role == none { return 0, errors.New("you cannot create service account with empty role") } - name := fmt.Sprintf("serviceaccount-%s-%d", nodeName, time.Now().Nanosecond()) - b, err := json.Marshal(serviceAccount{Name: name, Role: role.String()}) + serviceAccountName := fmt.Sprintf("%s-%s", pmmServiceAccountName, nodeName) + b, err := json.Marshal(serviceAccount{Name: serviceAccountName, Role: role.String(), Force: reregister}) if err != nil { return 0, errors.WithStack(err) } - authHeaders, err := auth.GetHeadersFromContext(ctx) - if err != nil { - return 0, err - } - var m map[string]interface{} if err = c.do(ctx, "POST", "/api/serviceaccounts", "", authHeaders, b, &m); err != nil { return 0, err @@ -678,16 +697,22 @@ func (c *Client) createServiceAccount(ctx context.Context, role role, nodeName s return serviceAccountID, nil } -func (c *Client) createServiceToken(ctx context.Context, serviceAccountID int, nodeName string) (int, string, error) { +func (c *Client) createServiceToken(ctx context.Context, serviceAccountID int, nodeName string, reregister bool, authHeaders http.Header) (int, string, error) { serviceTokenName := fmt.Sprintf("%s-%s", pmmServiceTokenName, nodeName) - b, err := json.Marshal(serviceToken{Name: serviceTokenName, Role: admin.String()}) + exists, err := c.serviceTokenExists(ctx, serviceAccountID, nodeName, authHeaders) if err != nil { - return 0, "", errors.WithStack(err) + return 0, "", err + } + if exists && reregister { + err := c.deletePMMAgentServiceToken(ctx, serviceAccountID, nodeName, authHeaders) + if err != nil { + return 0, "", err + } } - authHeaders, err := auth.GetHeadersFromContext(ctx) + b, err := json.Marshal(serviceToken{Name: serviceTokenName, Role: admin.String()}) if err != nil { - return 0, "", err + return 0, "", errors.WithStack(err) } var m map[string]interface{} @@ -700,20 +725,33 @@ func (c *Client) createServiceToken(ctx context.Context, serviceAccountID int, n return serviceTokenID, serviceTokenKey, nil } -func (c *Client) deleteCurrentPMMAgentServiceToken(ctx context.Context, serviceAccountID int, nodeName string) error { - authHeaders, err := auth.GetHeadersFromContext(ctx) - if err != nil { - return err +func (c *Client) serviceTokenExists(ctx context.Context, serviceAccountID int, nodeName string, authHeaders http.Header) (bool, error) { + var tokens []serviceToken + if err := c.do(ctx, "GET", fmt.Sprintf("/api/serviceaccounts/%d/tokens", serviceAccountID), "", authHeaders, nil, &tokens); err != nil { + return false, err } + serviceTokenName := fmt.Sprintf("%s-%s", pmmServiceTokenName, nodeName) + for _, token := range tokens { + if !strings.HasPrefix(token.Name, serviceTokenName) { + continue + } + + return true, nil + } + + return false, nil +} + +func (c *Client) deletePMMAgentServiceToken(ctx context.Context, serviceAccountID int, nodeName string, authHeaders http.Header) error { var tokens []serviceToken if err := c.do(ctx, "GET", fmt.Sprintf("/api/serviceaccounts/%d/tokens", serviceAccountID), "", authHeaders, nil, &tokens); err != nil { return err } + serviceTokenName := fmt.Sprintf("%s-%s", pmmServiceTokenName, nodeName) for _, token := range tokens { - serviceTokenName := fmt.Sprintf("%s-%s", pmmServiceTokenName, nodeName) - if token.Name != serviceTokenName { + if strings.HasPrefix(token.Name, serviceTokenName) { if err := c.do(ctx, "DELETE", fmt.Sprintf("/api/serviceaccounts/%d/tokens/%d", serviceAccountID, token.ID), "", authHeaders, nil, nil); err != nil { return err } @@ -725,12 +763,7 @@ func (c *Client) deleteCurrentPMMAgentServiceToken(ctx context.Context, serviceA return nil } -func (c *Client) deleteServiceAccount(ctx context.Context, serviceAccountID int) error { - authHeaders, err := auth.GetHeadersFromContext(ctx) - if err != nil { - return err - } - +func (c *Client) deleteServiceAccount(ctx context.Context, serviceAccountID int, authHeaders http.Header) error { return c.do(ctx, "DELETE", fmt.Sprintf("/api/serviceaccounts/%d", serviceAccountID), "", authHeaders, nil, nil) } diff --git a/managed/services/grafana/client_test.go b/managed/services/grafana/client_test.go index b91b23a4dc..3ec83206b5 100644 --- a/managed/services/grafana/client_test.go +++ b/managed/services/grafana/client_test.go @@ -72,9 +72,6 @@ func TestClient(t *testing.T) { }) t.Run("NewUserViewerByDefault", func(t *testing.T) { - // do not run this test in parallel - they lock Grafana's sqlite3 database - // t.Parallel() - // See [users] in grafana.ini. login := fmt.Sprintf("%s-%d", none, time.Now().Nanosecond()) @@ -137,45 +134,41 @@ func TestClient(t *testing.T) { require.NoError(t, err) require.NotZero(t, apiKeyID) require.NotEmpty(t, apiKey) - if err != nil { - defer func() { - err = c.deleteAPIKey(ctx, apiKeyID, authHeaders) - require.NoError(t, err) - }() - } apiKeyAuthHeaders := http.Header{} apiKeyAuthHeaders.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey)) u, err := c.getAuthUser(ctx, apiKeyAuthHeaders) - actualRole := u.role assert.NoError(t, err) + actualRole := u.role assert.Equal(t, role, actualRole) assert.Equal(t, role.String(), actualRole.String()) + + serviceAccountID, err := c.getServiceAccountIDForServiceToken(ctx, apiKey) + assert.NoError(t, err) + err = c.deleteServiceAccount(ctx, serviceAccountID, authHeaders) + assert.NoError(t, err) }) t.Run(fmt.Sprintf("Service token auth %s", role.String()), func(t *testing.T) { t.Parallel() - nodeName := "test-node" - serviceAccountID, err := c.createServiceAccount(ctx, role, nodeName) - if err != nil { - defer func() { - err = c.deleteServiceAccount(ctx, serviceAccountID) - require.NoError(t, err) - }() - } + nodeName := fmt.Sprintf("test-node-%s", role) + serviceAccountID, err := c.createServiceAccount(ctx, role, nodeName, true, authHeaders) require.NoError(t, err) - serviceTokenID, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, nodeName) - if err != nil { - defer func() { - err = c.deleteCurrentPMMAgentServiceToken(ctx, serviceAccountID, nodeName) - require.NoError(t, err) - }() - } + defer func() { + err := c.deleteServiceAccount(ctx, serviceAccountID, authHeaders) + require.NoError(t, err) + }() + + serviceTokenID, serviceToken, err := c.createServiceToken(ctx, serviceAccountID, nodeName, true, authHeaders) require.NoError(t, err) require.NotZero(t, serviceTokenID) require.NotEmpty(t, serviceToken) + defer func() { + err := c.deletePMMAgentServiceToken(ctx, serviceAccountID, nodeName, authHeaders) + require.NoError(t, err) + }() serviceTokenAuthHeaders := http.Header{} serviceTokenAuthHeaders.Set("Authorization", fmt.Sprintf("Bearer %s", serviceToken)) diff --git a/managed/services/management/deps.go b/managed/services/management/deps.go index 64c109d918..500a3bf039 100644 --- a/managed/services/management/deps.go +++ b/managed/services/management/deps.go @@ -99,6 +99,6 @@ type victoriaMetricsClient interface { } type authProvider interface { - CreateServiceAccount(ctx context.Context, noneName string) (int, string, error) + CreateServiceAccount(ctx context.Context, noneName string, reregister bool) (int, string, error) DeleteServiceAccount(ctx context.Context, noneName string, force bool) (string, error) } diff --git a/managed/services/management/mock_auth_provider_test.go b/managed/services/management/mock_auth_provider_test.go index 2e0e11abbe..a00b0dd60b 100644 --- a/managed/services/management/mock_auth_provider_test.go +++ b/managed/services/management/mock_auth_provider_test.go @@ -13,9 +13,9 @@ type mockAuthProvider struct { mock.Mock } -// CreateServiceAccount provides a mock function with given fields: ctx, noneName -func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context, noneName string) (int, string, error) { - ret := _m.Called(ctx, noneName) +// CreateServiceAccount provides a mock function with given fields: ctx, noneName, reregister +func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context, noneName string, reregister bool) (int, string, error) { + ret := _m.Called(ctx, noneName, reregister) if len(ret) == 0 { panic("no return value specified for CreateServiceAccount") @@ -24,23 +24,23 @@ func (_m *mockAuthProvider) CreateServiceAccount(ctx context.Context, noneName s var r0 int var r1 string var r2 error - if rf, ok := ret.Get(0).(func(context.Context, string) (int, string, error)); ok { - return rf(ctx, noneName) + if rf, ok := ret.Get(0).(func(context.Context, string, bool) (int, string, error)); ok { + return rf(ctx, noneName, reregister) } - if rf, ok := ret.Get(0).(func(context.Context, string) int); ok { - r0 = rf(ctx, noneName) + if rf, ok := ret.Get(0).(func(context.Context, string, bool) int); ok { + r0 = rf(ctx, noneName, reregister) } else { r0 = ret.Get(0).(int) } - if rf, ok := ret.Get(1).(func(context.Context, string) string); ok { - r1 = rf(ctx, noneName) + if rf, ok := ret.Get(1).(func(context.Context, string, bool) string); ok { + r1 = rf(ctx, noneName, reregister) } else { r1 = ret.Get(1).(string) } - if rf, ok := ret.Get(2).(func(context.Context, string) error); ok { - r2 = rf(ctx, noneName) + if rf, ok := ret.Get(2).(func(context.Context, string, bool) error); ok { + r2 = rf(ctx, noneName, reregister) } else { r2 = ret.Error(2) } diff --git a/managed/services/management/node.go b/managed/services/management/node.go index 145ea03d5e..e4be97a3fc 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -50,7 +50,6 @@ func NewNodeService(db *reform.DB, ap authProvider) *NodeService { // Register do registration of the new node. func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNodeRequest) (*managementpb.RegisterNodeResponse, error) { res := &managementpb.RegisterNodeResponse{} - e := s.db.InTransaction(func(tx *reform.TX) error { node, err := models.FindNodeByName(tx.Querier, req.NodeName) switch status.Code(err) { //nolint:exhaustive @@ -137,7 +136,7 @@ func (s *NodeService) Register(ctx context.Context, req *managementpb.RegisterNo if token != "" { res.Token = token } else { - _, res.Token, e = s.ap.CreateServiceAccount(ctx, req.NodeName) + _, res.Token, e = s.ap.CreateServiceAccount(ctx, req.NodeName, req.Reregister) if e != nil { return nil, e } diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index 40a406e563..46e2ddaea7 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -56,9 +56,10 @@ func TestNodeService(t *testing.T) { authProvider.Test(t) serviceAccountID := int(0) - force := true nodeName := "test-node" - authProvider.On("CreateServiceAccount", ctx, nodeName).Return(serviceAccountID, "test-token", nil) + reregister := true + force := true + authProvider.On("CreateServiceAccount", ctx, nodeName, reregister).Return(serviceAccountID, "test-token", nil) authProvider.On("DeleteServiceAccount", ctx, nodeName, force).Return("", nil) s = NewNodeService(db, &authProvider) From d6bc927874146da660dbb9b7820fc56038b40a83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 28 Nov 2023 16:55:25 +0100 Subject: [PATCH 074/126] PMM-12251 Fix V3 failing tests. --- api-tests/inventory/helpers.go | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/api-tests/inventory/helpers.go b/api-tests/inventory/helpers.go index dbce94c22e..20a7eb837b 100644 --- a/api-tests/inventory/helpers.go +++ b/api-tests/inventory/helpers.go @@ -17,6 +17,8 @@ package inventory import ( + "fmt" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -33,8 +35,8 @@ func addRemoteRDSNode(t pmmapitests.TestingT, nodeName string) *nodes.AddRemoteR params := &nodes.AddRemoteRDSNodeParams{ Body: nodes.AddRemoteRDSNodeBody{ NodeName: nodeName, - Address: "some-address", - Region: "region", + Address: fmt.Sprintf("some-address-%s", nodeName), + Region: fmt.Sprintf("region-%s", nodeName), }, Context: pmmapitests.Context, @@ -65,8 +67,8 @@ func addRemoteAzureDatabaseNode(t pmmapitests.TestingT, nodeName string) *nodes. params := &nodes.AddRemoteAzureDatabaseNodeParams{ Body: nodes.AddRemoteAzureDatabaseNodeBody{ NodeName: nodeName, - Address: "some-address", - Region: "region", + Address: fmt.Sprintf("some-address-%s", nodeName), + Region: fmt.Sprintf("region-%s", nodeName), }, Context: pmmapitests.Context, From 4e19268a4edf1701532501c9c662c73ef639cff5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 28 Nov 2023 17:12:53 +0100 Subject: [PATCH 075/126] PMM-12251 Tests. --- .../agents_azure_database_exporter_test.go | 14 +- .../agents_external_exporter_test.go | 18 +- .../inventory/agents_mongodb_exporter_test.go | 16 +- .../inventory/agents_mysqld_exporter_test.go | 20 +- .../inventory/agents_node_exporter_test.go | 4 +- .../agents_postgres_exporter_test.go | 16 +- .../agents_proxysql_exporter_test.go | 16 +- .../inventory/agents_rds_exporter_test.go | 14 +- api-tests/inventory/agents_test.go | 48 +- api-tests/inventory/nodes_test.go | 16 +- api-tests/inventory/services_test.go | 66 +-- api-tests/management/annotation_test.go | 4 +- api-tests/management/backup/backups_test.go | 2 +- api-tests/management/external_test.go | 26 +- api-tests/management/haproxy_test.go | 24 +- api-tests/management/mongodb_test.go | 42 +- api-tests/management/mysql_test.go | 40 +- api-tests/management/nodes_test.go | 459 +++++++++--------- api-tests/management/proxysql_test.go | 36 +- 19 files changed, 439 insertions(+), 442 deletions(-) diff --git a/api-tests/inventory/agents_azure_database_exporter_test.go b/api-tests/inventory/agents_azure_database_exporter_test.go index 04b8931f85..697c2bb247 100644 --- a/api-tests/inventory/agents_azure_database_exporter_test.go +++ b/api-tests/inventory/agents_azure_database_exporter_test.go @@ -34,11 +34,11 @@ func TestAzureDatabaseExporter(t *testing.T) { //nolint:tparallel t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := addRemoteAzureDatabaseNode(t, pmmapitests.TestString(t, "Remote node for Azure database exporter")) nodeID := node.RemoteAzureDatabase.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -137,7 +137,7 @@ func TestAzureDatabaseExporter(t *testing.T) { //nolint:tparallel genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -161,7 +161,7 @@ func TestAzureDatabaseExporter(t *testing.T) { //nolint:tparallel genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -185,7 +185,7 @@ func TestAzureDatabaseExporter(t *testing.T) { //nolint:tparallel t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) res, err := client.Default.Agents.AddAzureDatabaseExporter(&agents.AddAzureDatabaseExporterParams{ Body: agents.AddAzureDatabaseExporterBody{ @@ -204,11 +204,11 @@ func TestAzureDatabaseExporter(t *testing.T) { //nolint:tparallel t.Run("With PushMetrics", func(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := addRemoteAzureDatabaseNode(t, pmmapitests.TestString(t, "Remote node for Azure database exporter")) nodeID := node.RemoteAzureDatabase.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID diff --git a/api-tests/inventory/agents_external_exporter_test.go b/api-tests/inventory/agents_external_exporter_test.go index d226bd35ce..897f7ba94e 100644 --- a/api-tests/inventory/agents_external_exporter_test.go +++ b/api-tests/inventory/agents_external_exporter_test.go @@ -35,7 +35,7 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addExternalService(t, services.AddExternalServiceBody{ NodeID: genericNodeID, @@ -81,11 +81,11 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for external exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) service := addExternalService(t, services.AddExternalServiceBody{ NodeID: nodeID, @@ -190,7 +190,7 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) res, err := client.Default.Agents.AddExternalExporter(&agents.AddExternalExporterParams{ Body: agents.AddExternalExporterBody{ @@ -211,7 +211,7 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addExternalService(t, services.AddExternalServiceBody{ NodeID: genericNodeID, @@ -239,7 +239,7 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addExternalService(t, services.AddExternalServiceBody{ NodeID: genericNodeID, @@ -268,7 +268,7 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) res, err := client.Default.Agents.AddExternalExporter(&agents.AddExternalExporterParams{ Body: agents.AddExternalExporterBody{ @@ -289,7 +289,7 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addExternalService(t, services.AddExternalServiceBody{ NodeID: genericNodeID, @@ -318,7 +318,7 @@ func TestExternalExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID defer pmmapitests.RemoveAgents(t, pmmAgentID) diff --git a/api-tests/inventory/agents_mongodb_exporter_test.go b/api-tests/inventory/agents_mongodb_exporter_test.go index 6040b81981..92e937b248 100644 --- a/api-tests/inventory/agents_mongodb_exporter_test.go +++ b/api-tests/inventory/agents_mongodb_exporter_test.go @@ -35,11 +35,11 @@ func TestMongoDBExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) service := addMongoDBService(t, services.AddMongoDBServiceBody{ NodeID: genericNodeID, @@ -148,7 +148,7 @@ func TestMongoDBExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -172,7 +172,7 @@ func TestMongoDBExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addMongoDBService(t, services.AddMongoDBServiceBody{ NodeID: genericNodeID, @@ -203,7 +203,7 @@ func TestMongoDBExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -229,7 +229,7 @@ func TestMongoDBExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addMongoDBService(t, services.AddMongoDBServiceBody{ NodeID: genericNodeID, @@ -260,11 +260,11 @@ func TestMongoDBExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) service := addMongoDBService(t, services.AddMongoDBServiceBody{ NodeID: genericNodeID, diff --git a/api-tests/inventory/agents_mysqld_exporter_test.go b/api-tests/inventory/agents_mysqld_exporter_test.go index 0bbc44e726..d89e010eb3 100644 --- a/api-tests/inventory/agents_mysqld_exporter_test.go +++ b/api-tests/inventory/agents_mysqld_exporter_test.go @@ -35,11 +35,11 @@ func TestMySQLdExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -149,11 +149,11 @@ func TestMySQLdExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -202,7 +202,7 @@ func TestMySQLdExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -226,7 +226,7 @@ func TestMySQLdExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -257,7 +257,7 @@ func TestMySQLdExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -283,7 +283,7 @@ func TestMySQLdExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -314,11 +314,11 @@ func TestMySQLdExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, diff --git a/api-tests/inventory/agents_node_exporter_test.go b/api-tests/inventory/agents_node_exporter_test.go index 890d146261..c99d07e837 100644 --- a/api-tests/inventory/agents_node_exporter_test.go +++ b/api-tests/inventory/agents_node_exporter_test.go @@ -34,7 +34,7 @@ func TestNodeExporter(t *testing.T) { node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) pmmAgent := pmmapitests.AddPMMAgent(t, nodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -146,7 +146,7 @@ func TestNodeExporter(t *testing.T) { node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) pmmAgent := pmmapitests.AddPMMAgent(t, nodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID diff --git a/api-tests/inventory/agents_postgres_exporter_test.go b/api-tests/inventory/agents_postgres_exporter_test.go index bbb2550f6d..06bb3288fb 100644 --- a/api-tests/inventory/agents_postgres_exporter_test.go +++ b/api-tests/inventory/agents_postgres_exporter_test.go @@ -35,11 +35,11 @@ func TestPostgresExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -148,7 +148,7 @@ func TestPostgresExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -172,7 +172,7 @@ func TestPostgresExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -203,7 +203,7 @@ func TestPostgresExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -229,7 +229,7 @@ func TestPostgresExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -260,11 +260,11 @@ func TestPostgresExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, diff --git a/api-tests/inventory/agents_proxysql_exporter_test.go b/api-tests/inventory/agents_proxysql_exporter_test.go index 9a598f8999..b56185c91d 100644 --- a/api-tests/inventory/agents_proxysql_exporter_test.go +++ b/api-tests/inventory/agents_proxysql_exporter_test.go @@ -35,11 +35,11 @@ func TestProxySQLExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) service := addProxySQLService(t, services.AddProxySQLServiceBody{ NodeID: genericNodeID, @@ -148,7 +148,7 @@ func TestProxySQLExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -172,7 +172,7 @@ func TestProxySQLExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addProxySQLService(t, services.AddProxySQLServiceBody{ NodeID: genericNodeID, @@ -203,7 +203,7 @@ func TestProxySQLExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -229,7 +229,7 @@ func TestProxySQLExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addProxySQLService(t, services.AddProxySQLServiceBody{ NodeID: genericNodeID, @@ -257,11 +257,11 @@ func TestProxySQLExporter(t *testing.T) { t.Run("With PushMetrics", func(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for Node exporter")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) service := addProxySQLService(t, services.AddProxySQLServiceBody{ NodeID: genericNodeID, diff --git a/api-tests/inventory/agents_rds_exporter_test.go b/api-tests/inventory/agents_rds_exporter_test.go index 6b52c0ce88..50462d5aa0 100644 --- a/api-tests/inventory/agents_rds_exporter_test.go +++ b/api-tests/inventory/agents_rds_exporter_test.go @@ -32,11 +32,11 @@ func TestRDSExporter(t *testing.T) { t.Run("Basic", func(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := addRemoteRDSNode(t, pmmapitests.TestString(t, "Remote node for RDS exporter")) nodeID := node.RemoteRDS.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -139,7 +139,7 @@ func TestRDSExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -163,7 +163,7 @@ func TestRDSExporter(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -186,7 +186,7 @@ func TestRDSExporter(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) res, err := client.Default.Agents.AddRDSExporter(&agents.AddRDSExporterParams{ Body: agents.AddRDSExporterBody{ @@ -204,11 +204,11 @@ func TestRDSExporter(t *testing.T) { t.Run("With PushMetrics", func(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := addRemoteRDSNode(t, pmmapitests.TestString(t, "Remote node for RDS exporter")) nodeID := node.RemoteRDS.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID diff --git a/api-tests/inventory/agents_test.go b/api-tests/inventory/agents_test.go index 03bc72cd29..fce3604f01 100644 --- a/api-tests/inventory/agents_test.go +++ b/api-tests/inventory/agents_test.go @@ -42,11 +42,11 @@ func TestAgents(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Generic node for agents list")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for agents list")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -86,11 +86,11 @@ func TestAgents(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Generic node for agents filters")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for agents filters")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -184,7 +184,7 @@ func TestAgents(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -207,7 +207,7 @@ func TestAgents(t *testing.T) { nodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, nodeID) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) pmmAgentID := pmmapitests.AddPMMAgent(t, nodeID).PMMAgent.AgentID defer pmmapitests.RemoveAgents(t, pmmAgentID) @@ -242,7 +242,7 @@ func TestPMMAgent(t *testing.T) { node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for PMM-agent")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) res := pmmapitests.AddPMMAgent(t, nodeID) require.Equal(t, nodeID, res.PMMAgent.RunsOnNodeID) @@ -291,7 +291,7 @@ func TestPMMAgent(t *testing.T) { node := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Generic node for PMM-agent")) nodeID := node.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: nodeID, @@ -453,7 +453,7 @@ func TestQanAgentExporter(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -566,7 +566,7 @@ func TestQanAgentExporter(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -593,7 +593,7 @@ func TestQanAgentExporter(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -625,7 +625,7 @@ func TestQanAgentExporter(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -650,7 +650,7 @@ func TestQanAgentExporter(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -683,7 +683,7 @@ func TestPGStatStatementsQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan PostgreSQL Agent pg_stat_statements")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -796,7 +796,7 @@ func TestPGStatStatementsQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -823,7 +823,7 @@ func TestPGStatStatementsQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -855,7 +855,7 @@ func TestPGStatStatementsQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -880,7 +880,7 @@ func TestPGStatStatementsQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -913,7 +913,7 @@ func TestPGStatMonitorQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan PostgreSQL Agent pg_stat_monitor")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -1027,7 +1027,7 @@ func TestPGStatMonitorQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan PostgreSQL Agent pg_stat_monitor")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -1088,7 +1088,7 @@ func TestPGStatMonitorQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -1115,7 +1115,7 @@ func TestPGStatMonitorQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -1147,7 +1147,7 @@ func TestPGStatMonitorQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) pmmAgent := pmmapitests.AddPMMAgent(t, genericNodeID) pmmAgentID := pmmAgent.PMMAgent.AgentID @@ -1172,7 +1172,7 @@ func TestPGStatMonitorQanAgent(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for Qan Agent")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) service := addPostgreSQLService(t, services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, diff --git a/api-tests/inventory/nodes_test.go b/api-tests/inventory/nodes_test.go index d40ab43821..38b1062089 100644 --- a/api-tests/inventory/nodes_test.go +++ b/api-tests/inventory/nodes_test.go @@ -38,10 +38,10 @@ func TestNodesDeprecated(t *testing.T) { remoteNode := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Test Remote Node for List")) remoteNodeID := remoteNode.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, remoteNodeID) + defer pmmapitests.RemoveNodes(t, remoteNodeID) genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "Test Generic Node for List")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) res, err := client.Default.Nodes.ListNodes(nil) require.NoError(t, err) @@ -171,7 +171,7 @@ func TestGetNode(t *testing.T) { nodeName := pmmapitests.TestString(t, "TestGenericNode") nodeID := pmmapitests.AddGenericNode(t, nodeName).NodeID require.NotEmpty(t, nodeID) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) expectedResponse := nodes.GetNodeOK{ Payload: &nodes.GetNodeOKBody{ @@ -235,7 +235,7 @@ func TestGenericNodeDeprecated(t *testing.T) { require.NotNil(t, res) require.NotNil(t, res.Payload.Generic) nodeID := res.Payload.Generic.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) // Check node exists in DB. getNodeRes, err := client.Default.Nodes.GetNode(&nodes.GetNodeParams{ @@ -361,7 +361,7 @@ func TestContainerNodeDeprecated(t *testing.T) { require.NoError(t, err) require.NotNil(t, res.Payload.Container) nodeID := res.Payload.Container.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) // Check node exists in DB. getNodeRes, err := client.Default.Nodes.GetNode(&nodes.GetNodeParams{ @@ -428,7 +428,7 @@ func TestContainerNode(t *testing.T) { require.NoError(t, err) require.NotNil(t, res.Payload.Container) nodeID := res.Payload.Container.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) // Check that the node exists in DB. getNodeRes, err := client.Default.Nodes.GetNode(&nodes.GetNodeParams{ @@ -495,7 +495,7 @@ func TestRemoteNodeDeprecated(t *testing.T) { require.NoError(t, err) require.NotNil(t, res.Payload.Remote) nodeID := res.Payload.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) // Check node exists in DB. getNodeRes, err := client.Default.Nodes.GetNode(&nodes.GetNodeParams{ @@ -562,7 +562,7 @@ func TestRemoteNode(t *testing.T) { require.NoError(t, err) require.NotNil(t, res.Payload.Remote) nodeID := res.Payload.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) // Check node exists in DB. getNodeRes, err := client.Default.Nodes.GetNode(&nodes.GetNodeParams{ diff --git a/api-tests/inventory/services_test.go b/api-tests/inventory/services_test.go index d25f6f8dd8..ae0ae00521 100644 --- a/api-tests/inventory/services_test.go +++ b/api-tests/inventory/services_test.go @@ -37,11 +37,11 @@ func TestServices(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for services test")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, remoteNodeID) + defer pmmapitests.RemoveNodes(t, remoteNodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -136,11 +136,11 @@ func TestServices(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node to check services filter")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, remoteNodeID) + defer pmmapitests.RemoveNodes(t, remoteNodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: genericNodeID, @@ -206,7 +206,7 @@ func TestRemoveService(t *testing.T) { node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for agents list")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: nodeID, @@ -232,7 +232,7 @@ func TestRemoveService(t *testing.T) { node := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote node for agents list")) nodeID := node.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) service := addMySQLService(t, services.AddMySQLServiceBody{ NodeID: nodeID, @@ -328,7 +328,7 @@ func TestMySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "Basic MySQL Service") params := &services.AddMySQLServiceParams{ @@ -417,7 +417,7 @@ func TestMySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddMySQLServiceParams{ Body: services.AddMySQLServiceBody{ @@ -439,7 +439,7 @@ func TestMySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddMySQLServiceParams{ Body: services.AddMySQLServiceBody{ @@ -463,7 +463,7 @@ func TestMySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddMySQLServiceParams{ Body: services.AddMySQLServiceBody{ @@ -486,7 +486,7 @@ func TestMySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddMySQLServiceParams{ Body: services.AddMySQLServiceBody{ @@ -507,7 +507,7 @@ func TestMySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddMySQLServiceParams{ Body: services.AddMySQLServiceBody{ @@ -531,7 +531,7 @@ func TestMongoDBService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "Basic Mongo Service") params := &services.AddMongoDBServiceParams{ @@ -618,7 +618,7 @@ func TestMongoDBService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddMongoDBServiceParams{ Body: services.AddMongoDBServiceBody{ @@ -639,7 +639,7 @@ func TestMongoDBService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddMongoDBServiceParams{ Body: services.AddMongoDBServiceBody{ @@ -663,7 +663,7 @@ func TestMongoDBService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddMongoDBServiceParams{ Body: services.AddMongoDBServiceBody{ @@ -686,7 +686,7 @@ func TestMongoDBService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddMongoDBServiceParams{ Body: services.AddMongoDBServiceBody{ @@ -706,7 +706,7 @@ func TestMongoDBService(t *testing.T) { t.Parallel() genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) require.NotEmpty(t, genericNodeID) serviceName := pmmapitests.TestString(t, "Mongo with Socket Service") @@ -745,7 +745,7 @@ func TestPostgreSQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "Basic PostgreSQL Service") params := &services.AddPostgreSQLServiceParams{ @@ -836,7 +836,7 @@ func TestPostgreSQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddPostgreSQLServiceParams{ Body: services.AddPostgreSQLServiceBody{ @@ -858,7 +858,7 @@ func TestPostgreSQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddPostgreSQLServiceParams{ Body: services.AddPostgreSQLServiceBody{ @@ -879,7 +879,7 @@ func TestPostgreSQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddPostgreSQLServiceParams{ Body: services.AddPostgreSQLServiceBody{ NodeID: genericNodeID, @@ -902,7 +902,7 @@ func TestPostgreSQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddPostgreSQLServiceParams{ Body: services.AddPostgreSQLServiceBody{ @@ -925,7 +925,7 @@ func TestPostgreSQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddPostgreSQLServiceParams{ Body: services.AddPostgreSQLServiceBody{ @@ -949,7 +949,7 @@ func TestProxySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "Basic ProxySQL Service") params := &services.AddProxySQLServiceParams{ @@ -1038,7 +1038,7 @@ func TestProxySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddProxySQLServiceParams{ Body: services.AddProxySQLServiceBody{ @@ -1060,7 +1060,7 @@ func TestProxySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddProxySQLServiceParams{ Body: services.AddProxySQLServiceBody{ @@ -1084,7 +1084,7 @@ func TestProxySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddProxySQLServiceParams{ Body: services.AddProxySQLServiceBody{ @@ -1107,7 +1107,7 @@ func TestProxySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddProxySQLServiceParams{ Body: services.AddProxySQLServiceBody{ @@ -1128,7 +1128,7 @@ func TestProxySQLService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddProxySQLServiceParams{ Body: services.AddProxySQLServiceBody{ @@ -1163,7 +1163,7 @@ func TestExternalService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "Basic External Service") params := &services.AddExternalServiceParams{ @@ -1293,7 +1293,7 @@ func TestExternalService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) params := &services.AddExternalServiceParams{ Body: services.AddExternalServiceBody{ @@ -1314,7 +1314,7 @@ func TestExternalService(t *testing.T) { genericNodeID := pmmapitests.AddGenericNode(t, pmmapitests.TestString(t, "")).NodeID require.NotEmpty(t, genericNodeID) - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "Basic External Service") params := &services.AddExternalServiceParams{ diff --git a/api-tests/management/annotation_test.go b/api-tests/management/annotation_test.go index 10709f84d1..e35272cb74 100644 --- a/api-tests/management/annotation_test.go +++ b/api-tests/management/annotation_test.go @@ -91,7 +91,7 @@ func TestAddAnnotation(t *testing.T) { resNode, err := inventoryClient.Default.Nodes.AddGenericNode(paramsNode) assert.NoError(t, err) genericNodeID := resNode.Payload.Generic.NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "annotation-service") paramsService := &services.AddMySQLServiceParams{ @@ -131,7 +131,7 @@ func TestAddAnnotation(t *testing.T) { } res, err := inventoryClient.Default.Nodes.AddGenericNode(params) assert.NoError(t, err) - defer pmmapitests.UnregisterNodes(t, res.Payload.Generic.NodeID) + defer pmmapitests.RemoveNodes(t, res.Payload.Generic.NodeID) paramsAdd := &annotation.AddAnnotationParams{ Body: annotation.AddAnnotationBody{ diff --git a/api-tests/management/backup/backups_test.go b/api-tests/management/backup/backups_test.go index 2a10622e14..609989133d 100644 --- a/api-tests/management/backup/backups_test.go +++ b/api-tests/management/backup/backups_test.go @@ -41,7 +41,7 @@ func TestScheduleBackup(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer management.RemovePMMAgentWithSubAgents(t, pmmAgentID) mongo1Name := pmmapitests.TestString(t, "mongo") mongo2Name := pmmapitests.TestString(t, "mongo") diff --git a/api-tests/management/external_test.go b/api-tests/management/external_test.go index a7b4585aff..289466ff0f 100644 --- a/api-tests/management/external_test.go +++ b/api-tests/management/external_test.go @@ -38,7 +38,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "genericNode-for-basic-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -105,7 +105,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-for-all-fields-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -188,7 +188,7 @@ func TestAddExternal(t *testing.T) { require.NotNil(t, addExternalOK) require.NotNil(t, addExternalOK.Payload.Service) nodeID := addExternalOK.Payload.Service.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceID := addExternalOK.Payload.Service.ServiceID defer pmmapitests.RemoveServices(t, serviceID) @@ -256,7 +256,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-for-the-same-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-for-the-same-name") @@ -299,7 +299,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) params := &external.AddExternalParams{ Context: pmmapitests.Context, @@ -319,7 +319,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -341,7 +341,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -363,7 +363,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -385,7 +385,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -438,7 +438,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -468,7 +468,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -498,7 +498,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -517,7 +517,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ diff --git a/api-tests/management/haproxy_test.go b/api-tests/management/haproxy_test.go index 5bf448ed23..7b25a0103e 100644 --- a/api-tests/management/haproxy_test.go +++ b/api-tests/management/haproxy_test.go @@ -41,7 +41,7 @@ func TestAddHAProxy(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -109,7 +109,7 @@ func TestAddHAProxy(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -188,7 +188,7 @@ func TestAddHAProxy(t *testing.T) { require.NotNil(t, addHAProxyOK) require.NotNil(t, addHAProxyOK.Payload.Service) nodeID := addHAProxyOK.Payload.Service.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceID := addHAProxyOK.Payload.Service.ServiceID defer pmmapitests.RemoveServices(t, serviceID) @@ -257,7 +257,7 @@ func TestAddHAProxy(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-the-same-name") @@ -296,7 +296,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) params := &ha_proxy.AddHAProxyParams{ Context: pmmapitests.Context, @@ -313,7 +313,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &ha_proxy.AddHAProxyParams{ @@ -332,7 +332,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &ha_proxy.AddHAProxyParams{ @@ -351,7 +351,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &ha_proxy.AddHAProxyParams{ @@ -400,7 +400,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -430,7 +430,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -460,7 +460,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -479,7 +479,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ diff --git a/api-tests/management/mongodb_test.go b/api-tests/management/mongodb_test.go index 0499f86201..17472529af 100644 --- a/api-tests/management/mongodb_test.go +++ b/api-tests/management/mongodb_test.go @@ -40,7 +40,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") @@ -113,7 +113,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-all-fields") @@ -201,7 +201,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-all-fields") @@ -260,7 +260,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-the-same-name") @@ -306,7 +306,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) nodeNameAddNode := pmmapitests.TestString(t, "node-for-add-node-name") @@ -371,7 +371,7 @@ func TestAddMongoDB(t *testing.T) { newNodeID := addMongoDBOK.Payload.Service.NodeID require.NotEqual(t, nodeID, newNodeID) - defer pmmapitests.UnregisterNodes(t, newNodeID) + defer pmmapitests.RemoveNodes(t, newNodeID) defer pmmapitests.RemoveServices(t, serviceID) defer removeServiceAgents(t, serviceID) @@ -422,12 +422,12 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, remoteNodeID) + defer pmmapitests.RemoveNodes(t, remoteNodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &mongodb.AddMongoDBParams{ @@ -453,7 +453,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &mongodb.AddMongoDBParams{ @@ -471,7 +471,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -494,7 +494,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -518,7 +518,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -542,7 +542,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -570,7 +570,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-mongo-socket-name") @@ -639,7 +639,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") @@ -711,7 +711,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") @@ -782,7 +782,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") @@ -884,7 +884,7 @@ func TestRemoveMongoDB(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, pmmAgentID, serviceID := addMongoDB(t, serviceName, nodeName, true) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -915,7 +915,7 @@ func TestRemoveMongoDB(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, pmmAgentID, serviceID := addMongoDB(t, serviceName, nodeName, true) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -946,7 +946,7 @@ func TestRemoveMongoDB(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, pmmAgentID, serviceID := addMongoDB(t, serviceName, nodeName, false) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) @@ -966,7 +966,7 @@ func TestRemoveMongoDB(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, pmmAgentID, serviceID := addMongoDB(t, serviceName, nodeName, false) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) diff --git a/api-tests/management/mysql_test.go b/api-tests/management/mysql_test.go index 03317fa5e6..dddda1ef45 100644 --- a/api-tests/management/mysql_test.go +++ b/api-tests/management/mysql_test.go @@ -115,7 +115,7 @@ func TestAddMySQL(t *testing.T) { // NodeName: nodeName, // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer pmmapitests.RemoveNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -217,7 +217,7 @@ func TestAddMySQL(t *testing.T) { // NodeName: nodeName, // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer pmmapitests.RemoveNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -278,7 +278,7 @@ func TestAddMySQL(t *testing.T) { // NodeName: nodeName, // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer pmmapitests.RemoveNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // serviceName := pmmapitests.TestString(t, "service-for-the-same-name") @@ -326,7 +326,7 @@ func TestAddMySQL(t *testing.T) { // NodeName: nodeName, // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer pmmapitests.RemoveNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // nodeNameAddNode := pmmapitests.TestString(t, "node-for-add-node-name") @@ -394,7 +394,7 @@ func TestAddMySQL(t *testing.T) { // newNodeID := addMySQLOK.Payload.Service.NodeID // require.NotEqual(t, nodeID, newNodeID) - // defer pmmapitests.UnregisterNodes(t, newNodeID) + // defer pmmapitests.RemoveNodes(t, newNodeID) // defer pmmapitests.RemoveServices(t, serviceID) // defer removeServiceAgents(t, serviceID) @@ -447,12 +447,12 @@ func TestAddMySQL(t *testing.T) { // NodeName: nodeName, // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer pmmapitests.RemoveNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) // remoteNodeID := remoteNodeOKBody.Remote.NodeID - // defer pmmapitests.UnregisterNodes(t, remoteNodeID) + // defer pmmapitests.RemoveNodes(t, remoteNodeID) // serviceName := pmmapitests.TestString(t, "service-name") // params := &mysql.AddMySQLParams{ @@ -479,7 +479,7 @@ func TestAddMySQL(t *testing.T) { // NodeName: nodeName, // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer pmmapitests.RemoveNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // params := &mysql.AddMySQLParams{ @@ -497,7 +497,7 @@ func TestAddMySQL(t *testing.T) { // NodeName: nodeName, // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer pmmapitests.RemoveNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // serviceName := pmmapitests.TestString(t, "service-name") @@ -522,7 +522,7 @@ func TestAddMySQL(t *testing.T) { // NodeName: nodeName, // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer pmmapitests.RemoveNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // serviceName := pmmapitests.TestString(t, "service-name") @@ -548,7 +548,7 @@ func TestAddMySQL(t *testing.T) { // NodeName: nodeName, // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer pmmapitests.RemoveNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // serviceName := pmmapitests.TestString(t, "service-name") @@ -576,7 +576,7 @@ func TestAddMySQL(t *testing.T) { // NodeName: nodeName, // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer pmmapitests.RemoveNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // serviceName := pmmapitests.TestString(t, "service-name") @@ -600,7 +600,7 @@ func TestAddMySQL(t *testing.T) { // NodeName: nodeName, // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer pmmapitests.RemoveNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // serviceName := pmmapitests.TestString(t, "service-name") @@ -625,7 +625,7 @@ func TestAddMySQL(t *testing.T) { // NodeName: nodeName, // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer pmmapitests.RemoveNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -700,7 +700,7 @@ func TestAddMySQL(t *testing.T) { // NodeName: nodeName, // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer pmmapitests.RemoveNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -774,7 +774,7 @@ func TestAddMySQL(t *testing.T) { // NodeName: nodeName, // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer pmmapitests.RemoveNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -880,7 +880,7 @@ func TestRemoveMySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, pmmAgentID, serviceID := addMySQL(t, serviceName, nodeName, true) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -911,7 +911,7 @@ func TestRemoveMySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, pmmAgentID, serviceID := addMySQL(t, serviceName, nodeName, true) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -942,7 +942,7 @@ func TestRemoveMySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, pmmAgentID, serviceID := addMySQL(t, serviceName, nodeName, false) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) @@ -962,7 +962,7 @@ func TestRemoveMySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, pmmAgentID, serviceID := addMySQL(t, serviceName, nodeName, false) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) diff --git a/api-tests/management/nodes_test.go b/api-tests/management/nodes_test.go index 33803627a5..db7f440c6b 100644 --- a/api-tests/management/nodes_test.go +++ b/api-tests/management/nodes_test.go @@ -16,7 +16,6 @@ package management import ( - "fmt" "testing" "github.com/AlekSi/pointer" @@ -25,8 +24,6 @@ import ( "google.golang.org/grpc/codes" pmmapitests "github.com/percona/pmm/api-tests" - inventoryClient "github.com/percona/pmm/api/inventorypb/json/client" - "github.com/percona/pmm/api/inventorypb/json/client/agents" "github.com/percona/pmm/api/inventorypb/json/client/nodes" "github.com/percona/pmm/api/managementpb/json/client" "github.com/percona/pmm/api/managementpb/json/client/node" @@ -34,54 +31,54 @@ import ( func TestNodeRegister(t *testing.T) { t.Run("Generic Node", func(t *testing.T) { - t.Run("Basic", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.UnregisterNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - // Check Node is created - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Generic: &nodes.GetNodeOKBodyGeneric{ - NodeID: nodeID, - NodeName: nodeName, - }, - }) - - // Check PMM Agent is created - assertPMMAgentCreated(t, nodeID, pmmAgentID) - - // Check Node Exporter is created - assertNodeExporterCreated(t, pmmAgentID) - }) - - t.Run("Reregister with same node name (no re-register - should fail)", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - Address: "node-address-1", - Region: "region-1", - }) - defer pmmapitests.UnregisterNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - body := node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - Address: "node-address-1", - Region: "region-1", - } - params := node.RegisterNodeParams{ - Context: pmmapitests.Context, - Body: body, - } - _, err := client.Default.Node.RegisterNode(¶ms) - wantErr := fmt.Sprintf("Node with name %q already exists.", nodeName) - pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, wantErr) - }) + // t.Run("Basic", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.RemoveNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + // // Check Node is created + // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + // Generic: &nodes.GetNodeOKBodyGeneric{ + // NodeID: nodeID, + // NodeName: nodeName, + // }, + // }) + + // // Check PMM Agent is created + // assertPMMAgentCreated(t, nodeID, pmmAgentID) + + // // Check Node Exporter is created + // assertNodeExporterCreated(t, pmmAgentID) + // }) + + // t.Run("Reregister with same node name (no re-register - should fail)", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // Address: "node-address-1", + // Region: "region-1", + // }) + // defer pmmapitests.RemoveNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // body := node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // Address: "node-address-1", + // Region: "region-1", + // } + // params := node.RegisterNodeParams{ + // Context: pmmapitests.Context, + // Body: body, + // } + // _, err := client.Default.Node.RegisterNode(¶ms) + // wantErr := fmt.Sprintf("Node with name %q already exists.", nodeName) + // pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, wantErr) + // }) t.Run("Reregister with same node name (re-register)", func(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") @@ -108,186 +105,186 @@ func TestNodeRegister(t *testing.T) { node, err := client.Default.Node.RegisterNode(¶ms) assert.NoError(t, err) - defer pmmapitests.UnregisterNodes(t, node.Payload.GenericNode.NodeID) + defer pmmapitests.RemoveNodes(t, node.Payload.GenericNode.NodeID) defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) }) - t.Run("Reregister with different node name (no re-register - should fail)", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - Address: "node-address-3", - Region: "region-3", - }) - defer pmmapitests.UnregisterNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - body := node.RegisterNodeBody{ - NodeName: nodeName + "_new", - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - Address: "node-address-3", - Region: "region-3", - } - params := node.RegisterNodeParams{ - Context: pmmapitests.Context, - Body: body, - } - _, err := client.Default.Node.RegisterNode(¶ms) - wantErr := fmt.Sprintf("Node with instance %q and region %q already exists.", body.Address, body.Region) - pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, wantErr) - }) - - t.Run("Reregister with different node name (re-register)", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - Address: "node-address-4", - Region: "region-4", - }) - - assert.NotEmpty(t, nodeID) - assert.NotEmpty(t, pmmAgentID) - - body := node.RegisterNodeBody{ - NodeName: nodeName + "_new", - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - Address: "node-address-4", - Region: "region-4", - Reregister: true, - } - params := node.RegisterNodeParams{ - Context: pmmapitests.Context, - Body: body, - } - node, err := client.Default.Node.RegisterNode(¶ms) - assert.NoError(t, err) - - defer pmmapitests.UnregisterNodes(t, node.Payload.GenericNode.NodeID) - _, ok := assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) - if ok { - defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) - } - }) - - t.Run("With all fields", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name") - machineID := pmmapitests.TestString(t, "machine-id") - nodeModel := pmmapitests.TestString(t, "node-model") - body := node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - MachineID: machineID, - NodeModel: nodeModel, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - Distro: "Linux", - CustomLabels: map[string]string{"foo": "bar"}, - DisableCollectors: []string{"diskstats", "filesystem", "standard.process"}, - } - nodeID, pmmAgentID := RegisterGenericNode(t, body) - defer pmmapitests.UnregisterNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // Check Node is created - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Generic: &nodes.GetNodeOKBodyGeneric{ - NodeID: nodeID, - NodeName: nodeName, - MachineID: machineID, - NodeModel: nodeModel, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - Distro: "Linux", - CustomLabels: map[string]string{"foo": "bar"}, - }, - }) - - // Check PMM Agent is created - assertPMMAgentCreated(t, nodeID, pmmAgentID) - - // Check Node Exporter is created - listAgentsOK, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - Body: agents.ListAgentsBody{ - PMMAgentID: pmmAgentID, - }, - Context: pmmapitests.Context, - }) - assert.NoError(t, err) - require.Len(t, listAgentsOK.Payload.NodeExporter, 1) - nodeExporterAgentID := listAgentsOK.Payload.NodeExporter[0].AgentID - ok := assert.Equal(t, agents.ListAgentsOKBodyNodeExporterItems0{ - PMMAgentID: pmmAgentID, - AgentID: nodeExporterAgentID, - DisabledCollectors: []string{"diskstats", "filesystem", "standard.process"}, - PushMetricsEnabled: true, - Status: &AgentStatusUnknown, - }, *listAgentsOK.Payload.NodeExporter[0]) - - if ok { - defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) - } - }) - - t.Run("Re-register", func(t *testing.T) { - t.Skip("Re-register logic is not defined yet. https://jira.percona.com/browse/PMM-3717") - - nodeName := pmmapitests.TestString(t, "node-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.UnregisterNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // Check Node is created - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Generic: &nodes.GetNodeOKBodyGeneric{ - NodeID: nodeID, - NodeName: nodeName, - }, - }) - - // Re-register node - machineID := pmmapitests.TestString(t, "machine-id") - nodeModel := pmmapitests.TestString(t, "node-model") - newNodeID, newPMMAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - MachineID: machineID, - NodeModel: nodeModel, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - Distro: "Linux", - CustomLabels: map[string]string{"foo": "bar"}, - }) - if !assert.Equal(t, nodeID, newNodeID) { - defer pmmapitests.UnregisterNodes(t, newNodeID) - } - if !assert.Equal(t, pmmAgentID, newPMMAgentID) { - defer pmmapitests.RemoveAgents(t, newPMMAgentID) - } - - // Check Node fields is updated - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Generic: &nodes.GetNodeOKBodyGeneric{ - NodeID: nodeID, - NodeName: nodeName, - MachineID: machineID, - NodeModel: nodeModel, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - Distro: "Linux", - CustomLabels: map[string]string{"foo": "bar"}, - }, - }) - }) + // t.Run("Reregister with different node name (no re-register - should fail)", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // Address: "node-address-3", + // Region: "region-3", + // }) + // defer pmmapitests.RemoveNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // body := node.RegisterNodeBody{ + // NodeName: nodeName + "_new", + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // Address: "node-address-3", + // Region: "region-3", + // } + // params := node.RegisterNodeParams{ + // Context: pmmapitests.Context, + // Body: body, + // } + // _, err := client.Default.Node.RegisterNode(¶ms) + // wantErr := fmt.Sprintf("Node with instance %q and region %q already exists.", body.Address, body.Region) + // pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, wantErr) + // }) + + // t.Run("Reregister with different node name (re-register)", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // Address: "node-address-4", + // Region: "region-4", + // }) + + // assert.NotEmpty(t, nodeID) + // assert.NotEmpty(t, pmmAgentID) + + // body := node.RegisterNodeBody{ + // NodeName: nodeName + "_new", + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // Address: "node-address-4", + // Region: "region-4", + // Reregister: true, + // } + // params := node.RegisterNodeParams{ + // Context: pmmapitests.Context, + // Body: body, + // } + // node, err := client.Default.Node.RegisterNode(¶ms) + // assert.NoError(t, err) + + // defer pmmapitests.RemoveNodes(t, node.Payload.GenericNode.NodeID) + // _, ok := assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) + // if ok { + // defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) + // } + // }) + + // t.Run("With all fields", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name") + // machineID := pmmapitests.TestString(t, "machine-id") + // nodeModel := pmmapitests.TestString(t, "node-model") + // body := node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // MachineID: machineID, + // NodeModel: nodeModel, + // Az: "eu", + // Region: "us-west", + // Address: "10.10.10.10", + // Distro: "Linux", + // CustomLabels: map[string]string{"foo": "bar"}, + // DisableCollectors: []string{"diskstats", "filesystem", "standard.process"}, + // } + // nodeID, pmmAgentID := RegisterGenericNode(t, body) + // defer pmmapitests.RemoveNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // // Check Node is created + // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + // Generic: &nodes.GetNodeOKBodyGeneric{ + // NodeID: nodeID, + // NodeName: nodeName, + // MachineID: machineID, + // NodeModel: nodeModel, + // Az: "eu", + // Region: "us-west", + // Address: "10.10.10.10", + // Distro: "Linux", + // CustomLabels: map[string]string{"foo": "bar"}, + // }, + // }) + + // // Check PMM Agent is created + // assertPMMAgentCreated(t, nodeID, pmmAgentID) + + // // Check Node Exporter is created + // listAgentsOK, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + // Body: agents.ListAgentsBody{ + // PMMAgentID: pmmAgentID, + // }, + // Context: pmmapitests.Context, + // }) + // assert.NoError(t, err) + // require.Len(t, listAgentsOK.Payload.NodeExporter, 1) + // nodeExporterAgentID := listAgentsOK.Payload.NodeExporter[0].AgentID + // ok := assert.Equal(t, agents.ListAgentsOKBodyNodeExporterItems0{ + // PMMAgentID: pmmAgentID, + // AgentID: nodeExporterAgentID, + // DisabledCollectors: []string{"diskstats", "filesystem", "standard.process"}, + // PushMetricsEnabled: true, + // Status: &AgentStatusUnknown, + // }, *listAgentsOK.Payload.NodeExporter[0]) + + // if ok { + // defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) + // } + // }) + + // t.Run("Re-register", func(t *testing.T) { + // t.Skip("Re-register logic is not defined yet. https://jira.percona.com/browse/PMM-3717") + + // nodeName := pmmapitests.TestString(t, "node-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.RemoveNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // // Check Node is created + // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + // Generic: &nodes.GetNodeOKBodyGeneric{ + // NodeID: nodeID, + // NodeName: nodeName, + // }, + // }) + + // // Re-register node + // machineID := pmmapitests.TestString(t, "machine-id") + // nodeModel := pmmapitests.TestString(t, "node-model") + // newNodeID, newPMMAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // MachineID: machineID, + // NodeModel: nodeModel, + // Az: "eu", + // Region: "us-west", + // Address: "10.10.10.10", + // Distro: "Linux", + // CustomLabels: map[string]string{"foo": "bar"}, + // }) + // if !assert.Equal(t, nodeID, newNodeID) { + // defer pmmapitests.RemoveNodes(t, newNodeID) + // } + // if !assert.Equal(t, pmmAgentID, newPMMAgentID) { + // defer pmmapitests.RemoveAgents(t, newPMMAgentID) + // } + + // // Check Node fields is updated + // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + // Generic: &nodes.GetNodeOKBodyGeneric{ + // NodeID: nodeID, + // NodeName: nodeName, + // MachineID: machineID, + // NodeModel: nodeModel, + // Az: "eu", + // Region: "us-west", + // Address: "10.10.10.10", + // Distro: "Linux", + // CustomLabels: map[string]string{"foo": "bar"}, + // }, + // }) + // }) }) t.Run("Container Node", func(t *testing.T) { @@ -297,7 +294,7 @@ func TestNodeRegister(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // Check Node is created @@ -335,7 +332,7 @@ func TestNodeRegister(t *testing.T) { CustomLabels: map[string]string{"foo": "bar"}, } nodeID, pmmAgentID := registerContainerNode(t, body) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // Check Node is created @@ -371,7 +368,7 @@ func TestNodeRegister(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // Check Node is created @@ -398,7 +395,7 @@ func TestNodeRegister(t *testing.T) { CustomLabels: map[string]string{"foo": "bar"}, }) if !assert.Equal(t, nodeID, newNodeID) { - defer pmmapitests.UnregisterNodes(t, newNodeID) + defer pmmapitests.RemoveNodes(t, newNodeID) } if !assert.Equal(t, pmmAgentID, newPMMAgentID) { defer pmmapitests.RemoveAgents(t, newPMMAgentID) diff --git a/api-tests/management/proxysql_test.go b/api-tests/management/proxysql_test.go index fbfd2727c0..e7bc9cd594 100644 --- a/api-tests/management/proxysql_test.go +++ b/api-tests/management/proxysql_test.go @@ -40,7 +40,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -115,7 +115,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -191,7 +191,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -252,7 +252,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-the-same-name") @@ -300,7 +300,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) nodeNameAddNode := pmmapitests.TestString(t, "node-for-add-node-name") @@ -368,7 +368,7 @@ func TestAddProxySQL(t *testing.T) { newNodeID := addProxySQLOK.Payload.Service.NodeID require.NotEqual(t, nodeID, newNodeID) - defer pmmapitests.UnregisterNodes(t, newNodeID) + defer pmmapitests.RemoveNodes(t, newNodeID) defer pmmapitests.RemoveServices(t, serviceID) defer removeServiceAgents(t, serviceID) @@ -420,12 +420,12 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, remoteNodeID) + defer pmmapitests.RemoveNodes(t, remoteNodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &proxysql.AddProxySQLParams{ @@ -452,7 +452,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &proxysql.AddProxySQLParams{ @@ -470,7 +470,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -494,7 +494,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -519,7 +519,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -547,7 +547,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -571,7 +571,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -625,7 +625,7 @@ func TestRemoveProxySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, pmmAgentID, serviceID := addProxySQL(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -656,7 +656,7 @@ func TestRemoveProxySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, pmmAgentID, serviceID := addProxySQL(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -687,7 +687,7 @@ func TestRemoveProxySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, pmmAgentID, serviceID := addProxySQL(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) @@ -707,7 +707,7 @@ func TestRemoveProxySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, pmmAgentID, serviceID := addProxySQL(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) From bba7d76d5be920b64a5577a5d24b4e63cb5f0a2b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 28 Nov 2023 17:21:24 +0100 Subject: [PATCH 076/126] PMM-12251 Double paralel. --- api-tests/management/alerting/alerting_test.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/api-tests/management/alerting/alerting_test.go b/api-tests/management/alerting/alerting_test.go index 9036e1b250..96e4563b0e 100644 --- a/api-tests/management/alerting/alerting_test.go +++ b/api-tests/management/alerting/alerting_test.go @@ -43,8 +43,6 @@ import ( // we don't enable or disable Alerting explicit in our tests since it is enabled by default through // DISABLE_ALERTING env var. func TestRulesAPI(t *testing.T) { - t.Parallel() - t.Parallel() client := alertingClient.Default.Alerting From 15c21540ee535c689b3f506178a0ef6607f6bce4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 28 Nov 2023 17:27:09 +0100 Subject: [PATCH 077/126] PMM-12251 Test. --- api-tests/management/mysql_test.go | 1603 ++++++++++++++-------------- 1 file changed, 802 insertions(+), 801 deletions(-) diff --git a/api-tests/management/mysql_test.go b/api-tests/management/mysql_test.go index dddda1ef45..4c23d37725 100644 --- a/api-tests/management/mysql_test.go +++ b/api-tests/management/mysql_test.go @@ -26,6 +26,7 @@ import ( pmmapitests "github.com/percona/pmm/api-tests" inventoryClient "github.com/percona/pmm/api/inventorypb/json/client" "github.com/percona/pmm/api/inventorypb/json/client/agents" + "github.com/percona/pmm/api/inventorypb/json/client/services" "github.com/percona/pmm/api/managementpb/json/client" mysql "github.com/percona/pmm/api/managementpb/json/client/my_sql" "github.com/percona/pmm/api/managementpb/json/client/node" @@ -35,813 +36,813 @@ import ( func TestAddMySQL(t *testing.T) { t.Run("Basic", func(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-for-basic-name") - nodeID, _ := RegisterGenericNode(t, node.RegisterNodeBody{ + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) pmmapitests.UnregisterNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // serviceName := pmmapitests.TestString(t, "service-for-basic-name") - - // params := &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // NodeID: nodeID, - // PMMAgentID: pmmAgentID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // Username: "username", - - // SkipConnectionCheck: true, - // DisableCollectors: []string{"global_status", "perf_schema.tablelocks"}, - // }, - // } - // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - // require.NoError(t, err) - // require.NotNil(t, addMySQLOK) - // require.NotNil(t, addMySQLOK.Payload.Service) - // serviceID := addMySQLOK.Payload.Service.ServiceID - // defer pmmapitests.RemoveServices(t, serviceID) - - // // Check that service is created and its fields. - // serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ - // Body: services.GetServiceBody{ - // ServiceID: serviceID, - // }, - // Context: pmmapitests.Context, - // }) - // assert.NoError(t, err) - // require.NotNil(t, serviceOK) - // assert.Equal(t, services.GetServiceOKBody{ - // Mysql: &services.GetServiceOKBodyMysql{ - // ServiceID: serviceID, - // NodeID: nodeID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // }, - // }, *serviceOK.Payload) - - // // Check that mysqld exporter is added by default. - // listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - // Context: pmmapitests.Context, - // Body: agents.ListAgentsBody{ - // ServiceID: serviceID, - // }, - // }) - // assert.NoError(t, err) - // assert.Equal(t, agents.ListAgentsOKBody{ - // MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ - // { - // AgentID: listAgents.Payload.MysqldExporter[0].AgentID, - // ServiceID: serviceID, - // PMMAgentID: pmmAgentID, - // Username: "username", - // TablestatsGroupTableLimit: 1000, - // DisabledCollectors: []string{"global_status", "perf_schema.tablelocks"}, - // PushMetricsEnabled: true, - // Status: &AgentStatusUnknown, - // }, - // }, - // }, *listAgents.Payload) - // defer removeAllAgentsInList(t, listAgents) - // }) - - // t.Run("With agents", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-for-all-fields-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") - - // params := &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // NodeID: nodeID, - // PMMAgentID: pmmAgentID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // Username: "username", - // Password: "password", - // QANMysqlSlowlog: true, - // QANMysqlPerfschema: true, - - // SkipConnectionCheck: true, - // TablestatsGroupTableLimit: -1, - // }, - // } - // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - // require.NoError(t, err) - // require.NotNil(t, addMySQLOK) - // require.NotNil(t, addMySQLOK.Payload.Service) - // serviceID := addMySQLOK.Payload.Service.ServiceID - // defer pmmapitests.RemoveServices(t, serviceID) - - // // Check that service is created and its fields. - // serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ - // Body: services.GetServiceBody{ - // ServiceID: serviceID, - // }, - // Context: pmmapitests.Context, - // }) - // assert.NoError(t, err) - // assert.NotNil(t, serviceOK) - // assert.Equal(t, services.GetServiceOKBody{ - // Mysql: &services.GetServiceOKBodyMysql{ - // ServiceID: serviceID, - // NodeID: nodeID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // }, - // }, *serviceOK.Payload) - - // // Check that exporters are added. - // listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - // Context: pmmapitests.Context, - // Body: agents.ListAgentsBody{ - // ServiceID: serviceID, - // }, - // }) - // assert.NoError(t, err) - // require.NotNil(t, listAgents) - // defer removeAllAgentsInList(t, listAgents) - // require.Len(t, listAgents.Payload.MysqldExporter, 1) - // require.Len(t, listAgents.Payload.QANMysqlSlowlogAgent, 1) - // require.Len(t, listAgents.Payload.QANMysqlPerfschemaAgent, 1) - // assert.Equal(t, agents.ListAgentsOKBody{ - // MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ - // { - // AgentID: listAgents.Payload.MysqldExporter[0].AgentID, - // ServiceID: serviceID, - // PMMAgentID: pmmAgentID, - // Username: "username", - // TablestatsGroupTableLimit: -1, - // TablestatsGroupDisabled: true, - // PushMetricsEnabled: true, - // Status: &AgentStatusUnknown, - // }, - // }, - // QANMysqlSlowlogAgent: []*agents.ListAgentsOKBodyQANMysqlSlowlogAgentItems0{ - // { - // AgentID: listAgents.Payload.QANMysqlSlowlogAgent[0].AgentID, - // ServiceID: serviceID, - // PMMAgentID: pmmAgentID, - // Username: "username", - // MaxSlowlogFileSize: "1073741824", - // Status: &AgentStatusUnknown, - // }, - // }, - // QANMysqlPerfschemaAgent: []*agents.ListAgentsOKBodyQANMysqlPerfschemaAgentItems0{ - // { - // AgentID: listAgents.Payload.QANMysqlPerfschemaAgent[0].AgentID, - // ServiceID: serviceID, - // PMMAgentID: pmmAgentID, - // Username: "username", - // Status: &AgentStatusUnknown, - // }, - // }, - // }, *listAgents.Payload) - // }) - - // t.Run("With labels", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-for-all-fields-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") - - // params := &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // NodeID: nodeID, - // PMMAgentID: pmmAgentID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // Username: "username", - // Password: "password", - // Environment: "some-environment", - // Cluster: "cluster-name", - // ReplicationSet: "replication-set", - // CustomLabels: map[string]string{"bar": "foo"}, - - // SkipConnectionCheck: true, - // }, - // } - // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - // require.NoError(t, err) - // require.NotNil(t, addMySQLOK) - // require.NotNil(t, addMySQLOK.Payload.Service) - // serviceID := addMySQLOK.Payload.Service.ServiceID - // defer pmmapitests.RemoveServices(t, serviceID) - // defer removeServiceAgents(t, serviceID) - - // // Check that service is created and its fields. - // serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ - // Body: services.GetServiceBody{ - // ServiceID: serviceID, - // }, - // Context: pmmapitests.Context, - // }) - // assert.NoError(t, err) - // assert.NotNil(t, serviceOK) - // assert.Equal(t, services.GetServiceOKBody{ - // Mysql: &services.GetServiceOKBodyMysql{ - // ServiceID: serviceID, - // NodeID: nodeID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // Environment: "some-environment", - // Cluster: "cluster-name", - // ReplicationSet: "replication-set", - // CustomLabels: map[string]string{"bar": "foo"}, - // }, - // }, *serviceOK.Payload) - // }) - - // t.Run("With the same name", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-for-the-same-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // serviceName := pmmapitests.TestString(t, "service-for-the-same-name") - - // params := &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // NodeID: nodeID, - // PMMAgentID: pmmAgentID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // Username: "username", - - // SkipConnectionCheck: true, - // }, - // } - // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - // require.NoError(t, err) - // require.NotNil(t, addMySQLOK) - // require.NotNil(t, addMySQLOK.Payload.Service) - // serviceID := addMySQLOK.Payload.Service.ServiceID - // defer pmmapitests.RemoveServices(t, serviceID) - // defer removeServiceAgents(t, serviceID) - - // params = &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // NodeID: nodeID, - // PMMAgentID: pmmAgentID, - // ServiceName: serviceName, - // Address: "11.11.11.11", - // Port: 3307, - // Username: "username", - // }, - // } - // addMySQLOK, err = client.Default.MySQL.AddMySQL(params) - // require.Nil(t, addMySQLOK) - // pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, `Service with name %q already exists.`, serviceName) - // }) - - // t.Run("With add_node block", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-for-basic-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // nodeNameAddNode := pmmapitests.TestString(t, "node-for-add-node-name") - // serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") - - // params := &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // AddNode: &mysql.AddMySQLParamsBodyAddNode{ - // NodeType: pointer.ToString(mysql.AddMySQLParamsBodyAddNodeNodeTypeGENERICNODE), - // NodeName: nodeNameAddNode, - // }, - // PMMAgentID: pmmAgentID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 27017, - // Username: "username", - - // SkipConnectionCheck: true, - // }, - // } - // _, err := client.Default.MySQL.AddMySQL(params) - // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "add_node structure can be used only for remote nodes") - - // params = &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // AddNode: &mysql.AddMySQLParamsBodyAddNode{ - // NodeType: pointer.ToString(mysql.AddMySQLParamsBodyAddNodeNodeTypeREMOTERDSNODE), - // NodeName: nodeNameAddNode, - // }, - // PMMAgentID: pmmAgentID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 27017, - // Username: "username", - - // SkipConnectionCheck: true, - // }, - // } - // _, err = client.Default.MySQL.AddMySQL(params) - // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "add_node structure can be used only for remote nodes") - - // params = &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // AddNode: &mysql.AddMySQLParamsBodyAddNode{ - // NodeType: pointer.ToString(mysql.AddMySQLParamsBodyAddNodeNodeTypeREMOTENODE), - // NodeName: nodeNameAddNode, - // }, - // PMMAgentID: pmmAgentID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 27017, - // Username: "username", - - // SkipConnectionCheck: true, - // }, - // } - // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - // require.NoError(t, err) - // require.NotNil(t, addMySQLOK) - // require.NotNil(t, addMySQLOK.Payload.Service) - // serviceID := addMySQLOK.Payload.Service.ServiceID - - // newNodeID := addMySQLOK.Payload.Service.NodeID - // require.NotEqual(t, nodeID, newNodeID) - // defer pmmapitests.RemoveNodes(t, newNodeID) - // defer pmmapitests.RemoveServices(t, serviceID) - // defer removeServiceAgents(t, serviceID) - - // // Check that service is created and its fields. - // serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ - // Body: services.GetServiceBody{ - // ServiceID: serviceID, - // }, - // Context: pmmapitests.Context, - // }) - // assert.NoError(t, err) - // require.NotNil(t, serviceOK) - // assert.Equal(t, services.GetServiceOKBody{ - // Mysql: &services.GetServiceOKBodyMysql{ - // ServiceID: serviceID, - // NodeID: newNodeID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 27017, - // }, - // }, *serviceOK.Payload) - - // // Check that mysql exporter is added by default. - // listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - // Context: pmmapitests.Context, - // Body: agents.ListAgentsBody{ - // ServiceID: serviceID, - // }, - // }) - // assert.NoError(t, err) - // assert.Equal(t, agents.ListAgentsOKBody{ - // MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ - // { - // AgentID: listAgents.Payload.MysqldExporter[0].AgentID, - // ServiceID: serviceID, - // PMMAgentID: pmmAgentID, - // Username: "username", - // TablestatsGroupTableLimit: 1000, - // PushMetricsEnabled: true, - // Status: &AgentStatusUnknown, - // }, - // }, - // }, *listAgents.Payload) - // defer removeAllAgentsInList(t, listAgents) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + serviceName := pmmapitests.TestString(t, "service-for-basic-name") + + params := &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + NodeID: nodeID, + PMMAgentID: pmmAgentID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + Username: "username", + + SkipConnectionCheck: true, + DisableCollectors: []string{"global_status", "perf_schema.tablelocks"}, + }, + } + addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + require.NoError(t, err) + require.NotNil(t, addMySQLOK) + require.NotNil(t, addMySQLOK.Payload.Service) + serviceID := addMySQLOK.Payload.Service.ServiceID + defer pmmapitests.RemoveServices(t, serviceID) + + // Check that service is created and its fields. + serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ + Body: services.GetServiceBody{ + ServiceID: serviceID, + }, + Context: pmmapitests.Context, + }) + assert.NoError(t, err) + require.NotNil(t, serviceOK) + assert.Equal(t, services.GetServiceOKBody{ + Mysql: &services.GetServiceOKBodyMysql{ + ServiceID: serviceID, + NodeID: nodeID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + }, + }, *serviceOK.Payload) + + // Check that mysqld exporter is added by default. + listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + Context: pmmapitests.Context, + Body: agents.ListAgentsBody{ + ServiceID: serviceID, + }, + }) + assert.NoError(t, err) + assert.Equal(t, agents.ListAgentsOKBody{ + MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ + { + AgentID: listAgents.Payload.MysqldExporter[0].AgentID, + ServiceID: serviceID, + PMMAgentID: pmmAgentID, + Username: "username", + TablestatsGroupTableLimit: 1000, + DisabledCollectors: []string{"global_status", "perf_schema.tablelocks"}, + PushMetricsEnabled: true, + Status: &AgentStatusUnknown, + }, + }, + }, *listAgents.Payload) + defer removeAllAgentsInList(t, listAgents) }) - // t.Run("With Wrong Node Type", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "generic-node-for-wrong-node-type") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) - // remoteNodeID := remoteNodeOKBody.Remote.NodeID - // defer pmmapitests.RemoveNodes(t, remoteNodeID) - - // serviceName := pmmapitests.TestString(t, "service-name") - // params := &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // NodeID: remoteNodeID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // PMMAgentID: pmmAgentID, - // Username: "username", - - // SkipConnectionCheck: true, - // }, - // } - // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "node_id or node_name can be used only for generic nodes or container nodes") - // assert.Nil(t, addMySQLOK) - // }) - - // t.Run("Empty Service Name", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // params := &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{NodeID: nodeID}, - // } - // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddMySQLRequest.ServiceName: value length must be at least 1 runes") - // assert.Nil(t, addMySQLOK) - // }) - - // t.Run("Empty Address And Socket", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // serviceName := pmmapitests.TestString(t, "service-name") - // params := &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // PMMAgentID: pmmAgentID, - // Username: "username", - // Password: "password", - // NodeID: nodeID, - // ServiceName: serviceName, - // }, - // } - // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Neither socket nor address passed.") - // assert.Nil(t, addMySQLOK) - // }) - - // t.Run("Empty Port", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // serviceName := pmmapitests.TestString(t, "service-name") - // params := &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // PMMAgentID: pmmAgentID, - // Username: "username", - // Password: "password", - // NodeID: nodeID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // }, - // } - // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Port are expected to be passed with address.") - // assert.Nil(t, addMySQLOK) - // }) - - // t.Run("Address And Socket Conflict.", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // serviceName := pmmapitests.TestString(t, "service-name") - // params := &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // PMMAgentID: pmmAgentID, - // Username: "username", - // Password: "password", - // NodeID: nodeID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // Socket: "/var/run/mysqld/mysqld.sock", - // }, - // } - // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Socket and address cannot be specified together.") - // assert.Nil(t, addMySQLOK) - // }) - - // t.Run("Empty Pmm Agent ID", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // serviceName := pmmapitests.TestString(t, "service-name") - // params := &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // NodeID: nodeID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // }, - // } - // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddMySQLRequest.PmmAgentId: value length must be at least 1 runes") - // assert.Nil(t, addMySQLOK) - // }) - - // t.Run("Empty username", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // serviceName := pmmapitests.TestString(t, "service-name") - // params := &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // NodeID: nodeID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // PMMAgentID: pmmAgentID, - // }, - // } - // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddMySQLRequest.Username: value length must be at least 1 runes") - // assert.Nil(t, addMySQLOK) - // }) - - // t.Run("With MetricsModePush", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-for-basic-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // serviceName := pmmapitests.TestString(t, "service-for-basic-name") - - // params := &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // NodeID: nodeID, - // PMMAgentID: pmmAgentID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // Username: "username", - - // SkipConnectionCheck: true, - // MetricsMode: pointer.ToString("PUSH"), - // }, - // } - // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - // require.NoError(t, err) - // require.NotNil(t, addMySQLOK) - // require.NotNil(t, addMySQLOK.Payload.Service) - // serviceID := addMySQLOK.Payload.Service.ServiceID - // defer pmmapitests.RemoveServices(t, serviceID) - - // // Check that service is created and its fields. - // serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ - // Body: services.GetServiceBody{ - // ServiceID: serviceID, - // }, - // Context: pmmapitests.Context, - // }) - // assert.NoError(t, err) - // require.NotNil(t, serviceOK) - // assert.Equal(t, services.GetServiceOKBody{ - // Mysql: &services.GetServiceOKBodyMysql{ - // ServiceID: serviceID, - // NodeID: nodeID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // }, - // }, *serviceOK.Payload) - - // // Check that mysqld exporter is added by default. - // listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - // Context: pmmapitests.Context, - // Body: agents.ListAgentsBody{ - // ServiceID: serviceID, - // }, - // }) - // assert.NoError(t, err) - // assert.Equal(t, agents.ListAgentsOKBody{ - // MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ - // { - // AgentID: listAgents.Payload.MysqldExporter[0].AgentID, - // ServiceID: serviceID, - // PMMAgentID: pmmAgentID, - // Username: "username", - // TablestatsGroupTableLimit: 1000, - // PushMetricsEnabled: true, - // Status: &AgentStatusUnknown, - // }, - // }, - // }, *listAgents.Payload) - // defer removeAllAgentsInList(t, listAgents) - // }) - - // t.Run("With MetricsModePull", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-for-basic-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // serviceName := pmmapitests.TestString(t, "service-for-basic-name") - - // params := &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // NodeID: nodeID, - // PMMAgentID: pmmAgentID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // Username: "username", - - // SkipConnectionCheck: true, - // MetricsMode: pointer.ToString("PULL"), - // }, - // } - // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - // require.NoError(t, err) - // require.NotNil(t, addMySQLOK) - // require.NotNil(t, addMySQLOK.Payload.Service) - // serviceID := addMySQLOK.Payload.Service.ServiceID - // defer pmmapitests.RemoveServices(t, serviceID) - - // // Check that service is created and its fields. - // serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ - // Body: services.GetServiceBody{ - // ServiceID: serviceID, - // }, - // Context: pmmapitests.Context, - // }) - // assert.NoError(t, err) - // require.NotNil(t, serviceOK) - // assert.Equal(t, services.GetServiceOKBody{ - // Mysql: &services.GetServiceOKBodyMysql{ - // ServiceID: serviceID, - // NodeID: nodeID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // }, - // }, *serviceOK.Payload) - - // // Check that mysqld exporter is added by default. - // listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - // Context: pmmapitests.Context, - // Body: agents.ListAgentsBody{ - // ServiceID: serviceID, - // }, - // }) - // assert.NoError(t, err) - // assert.Equal(t, agents.ListAgentsOKBody{ - // MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ - // { - // AgentID: listAgents.Payload.MysqldExporter[0].AgentID, - // ServiceID: serviceID, - // PMMAgentID: pmmAgentID, - // Username: "username", - // TablestatsGroupTableLimit: 1000, - // Status: &AgentStatusUnknown, - // }, - // }, - // }, *listAgents.Payload) - // defer removeAllAgentsInList(t, listAgents) - // }) - - // t.Run("With MetricsModeAuto", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-for-basic-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // serviceName := pmmapitests.TestString(t, "service-for-basic-name") - - // params := &mysql.AddMySQLParams{ - // Context: pmmapitests.Context, - // Body: mysql.AddMySQLBody{ - // NodeID: nodeID, - // PMMAgentID: pmmAgentID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // Username: "username", - - // SkipConnectionCheck: true, - // MetricsMode: pointer.ToString("AUTO"), - // }, - // } - // addMySQLOK, err := client.Default.MySQL.AddMySQL(params) - // require.NoError(t, err) - // require.NotNil(t, addMySQLOK) - // require.NotNil(t, addMySQLOK.Payload.Service) - // serviceID := addMySQLOK.Payload.Service.ServiceID - // defer pmmapitests.RemoveServices(t, serviceID) - - // // Check that service is created and its fields. - // serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ - // Body: services.GetServiceBody{ - // ServiceID: serviceID, - // }, - // Context: pmmapitests.Context, - // }) - // assert.NoError(t, err) - // require.NotNil(t, serviceOK) - // assert.Equal(t, services.GetServiceOKBody{ - // Mysql: &services.GetServiceOKBodyMysql{ - // ServiceID: serviceID, - // NodeID: nodeID, - // ServiceName: serviceName, - // Address: "10.10.10.10", - // Port: 3306, - // }, - // }, *serviceOK.Payload) - - // // Check that mysqld exporter is added by default. - // listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - // Context: pmmapitests.Context, - // Body: agents.ListAgentsBody{ - // ServiceID: serviceID, - // }, - // }) - // assert.NoError(t, err) - // assert.Equal(t, agents.ListAgentsOKBody{ - // MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ - // { - // AgentID: listAgents.Payload.MysqldExporter[0].AgentID, - // ServiceID: serviceID, - // PMMAgentID: pmmAgentID, - // Username: "username", - // TablestatsGroupTableLimit: 1000, - // PushMetricsEnabled: true, - // Status: &AgentStatusUnknown, - // }, - // }, - // }, *listAgents.Payload) - // defer removeAllAgentsInList(t, listAgents) - // }) + t.Run("With agents", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-for-all-fields-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.RemoveNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") + + params := &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + NodeID: nodeID, + PMMAgentID: pmmAgentID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + Username: "username", + Password: "password", + QANMysqlSlowlog: true, + QANMysqlPerfschema: true, + + SkipConnectionCheck: true, + TablestatsGroupTableLimit: -1, + }, + } + addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + require.NoError(t, err) + require.NotNil(t, addMySQLOK) + require.NotNil(t, addMySQLOK.Payload.Service) + serviceID := addMySQLOK.Payload.Service.ServiceID + defer pmmapitests.RemoveServices(t, serviceID) + + // Check that service is created and its fields. + serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ + Body: services.GetServiceBody{ + ServiceID: serviceID, + }, + Context: pmmapitests.Context, + }) + assert.NoError(t, err) + assert.NotNil(t, serviceOK) + assert.Equal(t, services.GetServiceOKBody{ + Mysql: &services.GetServiceOKBodyMysql{ + ServiceID: serviceID, + NodeID: nodeID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + }, + }, *serviceOK.Payload) + + // Check that exporters are added. + listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + Context: pmmapitests.Context, + Body: agents.ListAgentsBody{ + ServiceID: serviceID, + }, + }) + assert.NoError(t, err) + require.NotNil(t, listAgents) + defer removeAllAgentsInList(t, listAgents) + require.Len(t, listAgents.Payload.MysqldExporter, 1) + require.Len(t, listAgents.Payload.QANMysqlSlowlogAgent, 1) + require.Len(t, listAgents.Payload.QANMysqlPerfschemaAgent, 1) + assert.Equal(t, agents.ListAgentsOKBody{ + MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ + { + AgentID: listAgents.Payload.MysqldExporter[0].AgentID, + ServiceID: serviceID, + PMMAgentID: pmmAgentID, + Username: "username", + TablestatsGroupTableLimit: -1, + TablestatsGroupDisabled: true, + PushMetricsEnabled: true, + Status: &AgentStatusUnknown, + }, + }, + QANMysqlSlowlogAgent: []*agents.ListAgentsOKBodyQANMysqlSlowlogAgentItems0{ + { + AgentID: listAgents.Payload.QANMysqlSlowlogAgent[0].AgentID, + ServiceID: serviceID, + PMMAgentID: pmmAgentID, + Username: "username", + MaxSlowlogFileSize: "1073741824", + Status: &AgentStatusUnknown, + }, + }, + QANMysqlPerfschemaAgent: []*agents.ListAgentsOKBodyQANMysqlPerfschemaAgentItems0{ + { + AgentID: listAgents.Payload.QANMysqlPerfschemaAgent[0].AgentID, + ServiceID: serviceID, + PMMAgentID: pmmAgentID, + Username: "username", + Status: &AgentStatusUnknown, + }, + }, + }, *listAgents.Payload) + }) + + t.Run("With labels", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-for-all-fields-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.RemoveNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") + + params := &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + NodeID: nodeID, + PMMAgentID: pmmAgentID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + Username: "username", + Password: "password", + Environment: "some-environment", + Cluster: "cluster-name", + ReplicationSet: "replication-set", + CustomLabels: map[string]string{"bar": "foo"}, + + SkipConnectionCheck: true, + }, + } + addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + require.NoError(t, err) + require.NotNil(t, addMySQLOK) + require.NotNil(t, addMySQLOK.Payload.Service) + serviceID := addMySQLOK.Payload.Service.ServiceID + defer pmmapitests.RemoveServices(t, serviceID) + defer removeServiceAgents(t, serviceID) + + // Check that service is created and its fields. + serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ + Body: services.GetServiceBody{ + ServiceID: serviceID, + }, + Context: pmmapitests.Context, + }) + assert.NoError(t, err) + assert.NotNil(t, serviceOK) + assert.Equal(t, services.GetServiceOKBody{ + Mysql: &services.GetServiceOKBodyMysql{ + ServiceID: serviceID, + NodeID: nodeID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + Environment: "some-environment", + Cluster: "cluster-name", + ReplicationSet: "replication-set", + CustomLabels: map[string]string{"bar": "foo"}, + }, + }, *serviceOK.Payload) + }) + + t.Run("With the same name", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-for-the-same-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.RemoveNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + serviceName := pmmapitests.TestString(t, "service-for-the-same-name") + + params := &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + NodeID: nodeID, + PMMAgentID: pmmAgentID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + Username: "username", + + SkipConnectionCheck: true, + }, + } + addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + require.NoError(t, err) + require.NotNil(t, addMySQLOK) + require.NotNil(t, addMySQLOK.Payload.Service) + serviceID := addMySQLOK.Payload.Service.ServiceID + defer pmmapitests.RemoveServices(t, serviceID) + defer removeServiceAgents(t, serviceID) + + params = &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + NodeID: nodeID, + PMMAgentID: pmmAgentID, + ServiceName: serviceName, + Address: "11.11.11.11", + Port: 3307, + Username: "username", + }, + } + addMySQLOK, err = client.Default.MySQL.AddMySQL(params) + require.Nil(t, addMySQLOK) + pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, `Service with name %q already exists.`, serviceName) + }) + + t.Run("With add_node block", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-for-basic-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.RemoveNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + nodeNameAddNode := pmmapitests.TestString(t, "node-for-add-node-name") + serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") + + params := &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + AddNode: &mysql.AddMySQLParamsBodyAddNode{ + NodeType: pointer.ToString(mysql.AddMySQLParamsBodyAddNodeNodeTypeGENERICNODE), + NodeName: nodeNameAddNode, + }, + PMMAgentID: pmmAgentID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 27017, + Username: "username", + + SkipConnectionCheck: true, + }, + } + _, err := client.Default.MySQL.AddMySQL(params) + pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "add_node structure can be used only for remote nodes") + + params = &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + AddNode: &mysql.AddMySQLParamsBodyAddNode{ + NodeType: pointer.ToString(mysql.AddMySQLParamsBodyAddNodeNodeTypeREMOTERDSNODE), + NodeName: nodeNameAddNode, + }, + PMMAgentID: pmmAgentID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 27017, + Username: "username", + + SkipConnectionCheck: true, + }, + } + _, err = client.Default.MySQL.AddMySQL(params) + pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "add_node structure can be used only for remote nodes") + + params = &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + AddNode: &mysql.AddMySQLParamsBodyAddNode{ + NodeType: pointer.ToString(mysql.AddMySQLParamsBodyAddNodeNodeTypeREMOTENODE), + NodeName: nodeNameAddNode, + }, + PMMAgentID: pmmAgentID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 27017, + Username: "username", + + SkipConnectionCheck: true, + }, + } + addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + require.NoError(t, err) + require.NotNil(t, addMySQLOK) + require.NotNil(t, addMySQLOK.Payload.Service) + serviceID := addMySQLOK.Payload.Service.ServiceID + + newNodeID := addMySQLOK.Payload.Service.NodeID + require.NotEqual(t, nodeID, newNodeID) + defer pmmapitests.RemoveNodes(t, newNodeID) + defer pmmapitests.RemoveServices(t, serviceID) + defer removeServiceAgents(t, serviceID) + + // Check that service is created and its fields. + serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ + Body: services.GetServiceBody{ + ServiceID: serviceID, + }, + Context: pmmapitests.Context, + }) + assert.NoError(t, err) + require.NotNil(t, serviceOK) + assert.Equal(t, services.GetServiceOKBody{ + Mysql: &services.GetServiceOKBodyMysql{ + ServiceID: serviceID, + NodeID: newNodeID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 27017, + }, + }, *serviceOK.Payload) + + // Check that mysql exporter is added by default. + listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + Context: pmmapitests.Context, + Body: agents.ListAgentsBody{ + ServiceID: serviceID, + }, + }) + assert.NoError(t, err) + assert.Equal(t, agents.ListAgentsOKBody{ + MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ + { + AgentID: listAgents.Payload.MysqldExporter[0].AgentID, + ServiceID: serviceID, + PMMAgentID: pmmAgentID, + Username: "username", + TablestatsGroupTableLimit: 1000, + PushMetricsEnabled: true, + Status: &AgentStatusUnknown, + }, + }, + }, *listAgents.Payload) + defer removeAllAgentsInList(t, listAgents) + }) + + t.Run("With Wrong Node Type", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "generic-node-for-wrong-node-type") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.RemoveNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) + remoteNodeID := remoteNodeOKBody.Remote.NodeID + defer pmmapitests.RemoveNodes(t, remoteNodeID) + + serviceName := pmmapitests.TestString(t, "service-name") + params := &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + NodeID: remoteNodeID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + PMMAgentID: pmmAgentID, + Username: "username", + + SkipConnectionCheck: true, + }, + } + addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "node_id or node_name can be used only for generic nodes or container nodes") + assert.Nil(t, addMySQLOK) + }) + + t.Run("Empty Service Name", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.RemoveNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + params := &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{NodeID: nodeID}, + } + addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddMySQLRequest.ServiceName: value length must be at least 1 runes") + assert.Nil(t, addMySQLOK) + }) + + t.Run("Empty Address And Socket", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.RemoveNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + serviceName := pmmapitests.TestString(t, "service-name") + params := &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + PMMAgentID: pmmAgentID, + Username: "username", + Password: "password", + NodeID: nodeID, + ServiceName: serviceName, + }, + } + addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Neither socket nor address passed.") + assert.Nil(t, addMySQLOK) + }) + + t.Run("Empty Port", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.RemoveNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + serviceName := pmmapitests.TestString(t, "service-name") + params := &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + PMMAgentID: pmmAgentID, + Username: "username", + Password: "password", + NodeID: nodeID, + ServiceName: serviceName, + Address: "10.10.10.10", + }, + } + addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Port are expected to be passed with address.") + assert.Nil(t, addMySQLOK) + }) + + t.Run("Address And Socket Conflict.", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.RemoveNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + serviceName := pmmapitests.TestString(t, "service-name") + params := &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + PMMAgentID: pmmAgentID, + Username: "username", + Password: "password", + NodeID: nodeID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + Socket: "/var/run/mysqld/mysqld.sock", + }, + } + addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Socket and address cannot be specified together.") + assert.Nil(t, addMySQLOK) + }) + + t.Run("Empty Pmm Agent ID", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.RemoveNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + serviceName := pmmapitests.TestString(t, "service-name") + params := &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + NodeID: nodeID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + }, + } + addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddMySQLRequest.PmmAgentId: value length must be at least 1 runes") + assert.Nil(t, addMySQLOK) + }) + + t.Run("Empty username", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.RemoveNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + serviceName := pmmapitests.TestString(t, "service-name") + params := &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + NodeID: nodeID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + PMMAgentID: pmmAgentID, + }, + } + addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddMySQLRequest.Username: value length must be at least 1 runes") + assert.Nil(t, addMySQLOK) + }) + + t.Run("With MetricsModePush", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-for-basic-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.RemoveNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + serviceName := pmmapitests.TestString(t, "service-for-basic-name") + + params := &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + NodeID: nodeID, + PMMAgentID: pmmAgentID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + Username: "username", + + SkipConnectionCheck: true, + MetricsMode: pointer.ToString("PUSH"), + }, + } + addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + require.NoError(t, err) + require.NotNil(t, addMySQLOK) + require.NotNil(t, addMySQLOK.Payload.Service) + serviceID := addMySQLOK.Payload.Service.ServiceID + defer pmmapitests.RemoveServices(t, serviceID) + + // Check that service is created and its fields. + serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ + Body: services.GetServiceBody{ + ServiceID: serviceID, + }, + Context: pmmapitests.Context, + }) + assert.NoError(t, err) + require.NotNil(t, serviceOK) + assert.Equal(t, services.GetServiceOKBody{ + Mysql: &services.GetServiceOKBodyMysql{ + ServiceID: serviceID, + NodeID: nodeID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + }, + }, *serviceOK.Payload) + + // Check that mysqld exporter is added by default. + listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + Context: pmmapitests.Context, + Body: agents.ListAgentsBody{ + ServiceID: serviceID, + }, + }) + assert.NoError(t, err) + assert.Equal(t, agents.ListAgentsOKBody{ + MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ + { + AgentID: listAgents.Payload.MysqldExporter[0].AgentID, + ServiceID: serviceID, + PMMAgentID: pmmAgentID, + Username: "username", + TablestatsGroupTableLimit: 1000, + PushMetricsEnabled: true, + Status: &AgentStatusUnknown, + }, + }, + }, *listAgents.Payload) + defer removeAllAgentsInList(t, listAgents) + }) + + t.Run("With MetricsModePull", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-for-basic-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.RemoveNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + serviceName := pmmapitests.TestString(t, "service-for-basic-name") + + params := &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + NodeID: nodeID, + PMMAgentID: pmmAgentID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + Username: "username", + + SkipConnectionCheck: true, + MetricsMode: pointer.ToString("PULL"), + }, + } + addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + require.NoError(t, err) + require.NotNil(t, addMySQLOK) + require.NotNil(t, addMySQLOK.Payload.Service) + serviceID := addMySQLOK.Payload.Service.ServiceID + defer pmmapitests.RemoveServices(t, serviceID) + + // Check that service is created and its fields. + serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ + Body: services.GetServiceBody{ + ServiceID: serviceID, + }, + Context: pmmapitests.Context, + }) + assert.NoError(t, err) + require.NotNil(t, serviceOK) + assert.Equal(t, services.GetServiceOKBody{ + Mysql: &services.GetServiceOKBodyMysql{ + ServiceID: serviceID, + NodeID: nodeID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + }, + }, *serviceOK.Payload) + + // Check that mysqld exporter is added by default. + listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + Context: pmmapitests.Context, + Body: agents.ListAgentsBody{ + ServiceID: serviceID, + }, + }) + assert.NoError(t, err) + assert.Equal(t, agents.ListAgentsOKBody{ + MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ + { + AgentID: listAgents.Payload.MysqldExporter[0].AgentID, + ServiceID: serviceID, + PMMAgentID: pmmAgentID, + Username: "username", + TablestatsGroupTableLimit: 1000, + Status: &AgentStatusUnknown, + }, + }, + }, *listAgents.Payload) + defer removeAllAgentsInList(t, listAgents) + }) + + t.Run("With MetricsModeAuto", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-for-basic-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.RemoveNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + serviceName := pmmapitests.TestString(t, "service-for-basic-name") + + params := &mysql.AddMySQLParams{ + Context: pmmapitests.Context, + Body: mysql.AddMySQLBody{ + NodeID: nodeID, + PMMAgentID: pmmAgentID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + Username: "username", + + SkipConnectionCheck: true, + MetricsMode: pointer.ToString("AUTO"), + }, + } + addMySQLOK, err := client.Default.MySQL.AddMySQL(params) + require.NoError(t, err) + require.NotNil(t, addMySQLOK) + require.NotNil(t, addMySQLOK.Payload.Service) + serviceID := addMySQLOK.Payload.Service.ServiceID + defer pmmapitests.RemoveServices(t, serviceID) + + // Check that service is created and its fields. + serviceOK, err := inventoryClient.Default.Services.GetService(&services.GetServiceParams{ + Body: services.GetServiceBody{ + ServiceID: serviceID, + }, + Context: pmmapitests.Context, + }) + assert.NoError(t, err) + require.NotNil(t, serviceOK) + assert.Equal(t, services.GetServiceOKBody{ + Mysql: &services.GetServiceOKBodyMysql{ + ServiceID: serviceID, + NodeID: nodeID, + ServiceName: serviceName, + Address: "10.10.10.10", + Port: 3306, + }, + }, *serviceOK.Payload) + + // Check that mysqld exporter is added by default. + listAgents, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + Context: pmmapitests.Context, + Body: agents.ListAgentsBody{ + ServiceID: serviceID, + }, + }) + assert.NoError(t, err) + assert.Equal(t, agents.ListAgentsOKBody{ + MysqldExporter: []*agents.ListAgentsOKBodyMysqldExporterItems0{ + { + AgentID: listAgents.Payload.MysqldExporter[0].AgentID, + ServiceID: serviceID, + PMMAgentID: pmmAgentID, + Username: "username", + TablestatsGroupTableLimit: 1000, + PushMetricsEnabled: true, + Status: &AgentStatusUnknown, + }, + }, + }, *listAgents.Payload) + defer removeAllAgentsInList(t, listAgents) + }) } func TestRemoveMySQL(t *testing.T) { From 34d6cfdd0dba10c2b7fb576684a5afbf51402fba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 28 Nov 2023 17:30:15 +0100 Subject: [PATCH 078/126] PMM-12251 Changes. --- api-tests/inventory/helpers.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/api-tests/inventory/helpers.go b/api-tests/inventory/helpers.go index 20a7eb837b..dbce94c22e 100644 --- a/api-tests/inventory/helpers.go +++ b/api-tests/inventory/helpers.go @@ -17,8 +17,6 @@ package inventory import ( - "fmt" - "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -35,8 +33,8 @@ func addRemoteRDSNode(t pmmapitests.TestingT, nodeName string) *nodes.AddRemoteR params := &nodes.AddRemoteRDSNodeParams{ Body: nodes.AddRemoteRDSNodeBody{ NodeName: nodeName, - Address: fmt.Sprintf("some-address-%s", nodeName), - Region: fmt.Sprintf("region-%s", nodeName), + Address: "some-address", + Region: "region", }, Context: pmmapitests.Context, @@ -67,8 +65,8 @@ func addRemoteAzureDatabaseNode(t pmmapitests.TestingT, nodeName string) *nodes. params := &nodes.AddRemoteAzureDatabaseNodeParams{ Body: nodes.AddRemoteAzureDatabaseNodeBody{ NodeName: nodeName, - Address: fmt.Sprintf("some-address-%s", nodeName), - Region: fmt.Sprintf("region-%s", nodeName), + Address: "some-address", + Region: "region", }, Context: pmmapitests.Context, From 30ee6c385b792ec3ae57c2a8a41de5c14ca0566e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 28 Nov 2023 17:31:28 +0100 Subject: [PATCH 079/126] PMM-12251 Changes in API test. --- .../agents_azure_database_exporter_test.go | 2 +- .../agents_external_exporter_test.go | 4 +-- .../inventory/agents_mysqld_exporter_test.go | 2 +- .../inventory/agents_node_exporter_test.go | 4 +-- .../agents_postgres_exporter_test.go | 2 +- .../agents_proxysql_exporter_test.go | 2 +- .../inventory/agents_rds_exporter_test.go | 2 +- api-tests/inventory/agents_test.go | 2 +- api-tests/inventory/nodes_test.go | 30 +++++++++---------- 9 files changed, 25 insertions(+), 25 deletions(-) diff --git a/api-tests/inventory/agents_azure_database_exporter_test.go b/api-tests/inventory/agents_azure_database_exporter_test.go index 697c2bb247..5228a6169e 100644 --- a/api-tests/inventory/agents_azure_database_exporter_test.go +++ b/api-tests/inventory/agents_azure_database_exporter_test.go @@ -152,7 +152,7 @@ func TestAzureDatabaseExporter(t *testing.T) { //nolint:tparallel }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddAzureDatabaseExporterRequest.NodeId: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.AzureDatabaseExporter.AgentID) + pmmapitests.RemoveNodes(t, res.Payload.AzureDatabaseExporter.AgentID) } }) diff --git a/api-tests/inventory/agents_external_exporter_test.go b/api-tests/inventory/agents_external_exporter_test.go index 897f7ba94e..d1562a148e 100644 --- a/api-tests/inventory/agents_external_exporter_test.go +++ b/api-tests/inventory/agents_external_exporter_test.go @@ -202,7 +202,7 @@ func TestExternalExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "Empty Service ID.") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.ExternalExporter.AgentID) + pmmapitests.RemoveNodes(t, res.Payload.ExternalExporter.AgentID) } }) @@ -230,7 +230,7 @@ func TestExternalExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddExternalExporterRequest.ListenPort: value must be inside range (0, 65536)") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.ExternalExporter.AgentID) + pmmapitests.RemoveNodes(t, res.Payload.ExternalExporter.AgentID) } }) diff --git a/api-tests/inventory/agents_mysqld_exporter_test.go b/api-tests/inventory/agents_mysqld_exporter_test.go index d89e010eb3..014c78d2a6 100644 --- a/api-tests/inventory/agents_mysqld_exporter_test.go +++ b/api-tests/inventory/agents_mysqld_exporter_test.go @@ -217,7 +217,7 @@ func TestMySQLdExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddMySQLdExporterRequest.ServiceId: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.MysqldExporter.AgentID) + pmmapitests.RemoveNodes(t, res.Payload.MysqldExporter.AgentID) } }) diff --git a/api-tests/inventory/agents_node_exporter_test.go b/api-tests/inventory/agents_node_exporter_test.go index c99d07e837..2cfdd8f20a 100644 --- a/api-tests/inventory/agents_node_exporter_test.go +++ b/api-tests/inventory/agents_node_exporter_test.go @@ -124,7 +124,7 @@ func TestNodeExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddNodeExporterRequest.PmmAgentId: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.NodeExporter.AgentID) + pmmapitests.RemoveNodes(t, res.Payload.NodeExporter.AgentID) } }) @@ -137,7 +137,7 @@ func TestNodeExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 404, codes.NotFound, "Agent with ID \"pmm-node-exporter-node\" not found.") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.NodeExporter.AgentID) + pmmapitests.RemoveNodes(t, res.Payload.NodeExporter.AgentID) } }) diff --git a/api-tests/inventory/agents_postgres_exporter_test.go b/api-tests/inventory/agents_postgres_exporter_test.go index 06bb3288fb..218412fbd4 100644 --- a/api-tests/inventory/agents_postgres_exporter_test.go +++ b/api-tests/inventory/agents_postgres_exporter_test.go @@ -163,7 +163,7 @@ func TestPostgresExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddPostgresExporterRequest.ServiceId: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.PostgresExporter.AgentID) + pmmapitests.RemoveNodes(t, res.Payload.PostgresExporter.AgentID) } }) diff --git a/api-tests/inventory/agents_proxysql_exporter_test.go b/api-tests/inventory/agents_proxysql_exporter_test.go index b56185c91d..0e1bd10654 100644 --- a/api-tests/inventory/agents_proxysql_exporter_test.go +++ b/api-tests/inventory/agents_proxysql_exporter_test.go @@ -163,7 +163,7 @@ func TestProxySQLExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddProxySQLExporterRequest.ServiceId: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.ProxysqlExporter.AgentID) + pmmapitests.RemoveNodes(t, res.Payload.ProxysqlExporter.AgentID) } }) diff --git a/api-tests/inventory/agents_rds_exporter_test.go b/api-tests/inventory/agents_rds_exporter_test.go index 50462d5aa0..7b59c38938 100644 --- a/api-tests/inventory/agents_rds_exporter_test.go +++ b/api-tests/inventory/agents_rds_exporter_test.go @@ -154,7 +154,7 @@ func TestRDSExporter(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddRDSExporterRequest.NodeId: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.RDSExporter.AgentID) + pmmapitests.RemoveNodes(t, res.Payload.RDSExporter.AgentID) } }) diff --git a/api-tests/inventory/agents_test.go b/api-tests/inventory/agents_test.go index fce3604f01..5c785b77e5 100644 --- a/api-tests/inventory/agents_test.go +++ b/api-tests/inventory/agents_test.go @@ -282,7 +282,7 @@ func TestPMMAgent(t *testing.T) { }) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddPMMAgentRequest.RunsOnNodeId: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.PMMAgent.AgentID) + pmmapitests.RemoveNodes(t, res.Payload.PMMAgent.AgentID) } }) diff --git a/api-tests/inventory/nodes_test.go b/api-tests/inventory/nodes_test.go index 38b1062089..6cd3d5c466 100644 --- a/api-tests/inventory/nodes_test.go +++ b/api-tests/inventory/nodes_test.go @@ -103,7 +103,7 @@ func TestNodes(t *testing.T) { }, }) remoteNodeID := remoteNode.Remote.NodeID - t.Cleanup(func() { pmmapitests.UnregisterNodes(t, remoteNodeID) }) + t.Cleanup(func() { pmmapitests.RemoveNodes(t, remoteNodeID) }) genericNode := pmmapitests.AddNode(t, &nodes.AddNodeBody{ Generic: &nodes.AddNodeParamsBodyGeneric{ @@ -113,7 +113,7 @@ func TestNodes(t *testing.T) { }) genericNodeID := genericNode.Generic.NodeID require.NotEmpty(t, genericNodeID) - t.Cleanup(func() { pmmapitests.UnregisterNodes(t, genericNodeID) }) + t.Cleanup(func() { pmmapitests.RemoveNodes(t, genericNodeID) }) res, err := client.Default.Nodes.ListNodes(nil) require.NoError(t, err) @@ -258,7 +258,7 @@ func TestGenericNodeDeprecated(t *testing.T) { res, err = client.Default.Nodes.AddGenericNode(params) pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, "Node with name %q already exists.", nodeName) if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.Generic.NodeID) + pmmapitests.RemoveNodes(t, res.Payload.Generic.NodeID) } }) @@ -272,7 +272,7 @@ func TestGenericNodeDeprecated(t *testing.T) { res, err := client.Default.Nodes.AddGenericNode(params) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddGenericNodeRequest.NodeName: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.Generic.NodeID) + pmmapitests.RemoveNodes(t, res.Payload.Generic.NodeID) } }) } @@ -297,7 +297,7 @@ func TestGenericNode(t *testing.T) { require.NotNil(t, res) require.NotNil(t, res.Payload.Generic) nodeID := res.Payload.Generic.NodeID - t.Cleanup(func() { pmmapitests.UnregisterNodes(t, nodeID) }) + t.Cleanup(func() { pmmapitests.RemoveNodes(t, nodeID) }) // Check that the node exists in DB. getNodeRes, err := client.Default.Nodes.GetNode(&nodes.GetNodeParams{ @@ -320,7 +320,7 @@ func TestGenericNode(t *testing.T) { res, err = client.Default.Nodes.AddNode(params) pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, "Node with name %q already exists.", nodeName) if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.Generic.NodeID) + pmmapitests.RemoveNodes(t, res.Payload.Generic.NodeID) } }) @@ -336,7 +336,7 @@ func TestGenericNode(t *testing.T) { res, err := client.Default.Nodes.AddNode(params) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddGenericNodeRequest.NodeName: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.Generic.NodeID) + pmmapitests.RemoveNodes(t, res.Payload.Generic.NodeID) } }) } @@ -387,7 +387,7 @@ func TestContainerNodeDeprecated(t *testing.T) { res, err = client.Default.Nodes.AddContainerNode(params) pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, "Node with name %q already exists.", nodeName) if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.Container.NodeID) + pmmapitests.RemoveNodes(t, res.Payload.Container.NodeID) } }) @@ -401,7 +401,7 @@ func TestContainerNodeDeprecated(t *testing.T) { res, err := client.Default.Nodes.AddContainerNode(params) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddContainerNodeRequest.NodeName: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.Container.NodeID) + pmmapitests.RemoveNodes(t, res.Payload.Container.NodeID) } }) } @@ -454,7 +454,7 @@ func TestContainerNode(t *testing.T) { res, err = client.Default.Nodes.AddNode(params) pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, "Node with name %q already exists.", nodeName) if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.Container.NodeID) + pmmapitests.RemoveNodes(t, res.Payload.Container.NodeID) } }) @@ -470,7 +470,7 @@ func TestContainerNode(t *testing.T) { res, err := client.Default.Nodes.AddNode(params) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddContainerNodeRequest.NodeName: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.Container.NodeID) + pmmapitests.RemoveNodes(t, res.Payload.Container.NodeID) } }) } @@ -521,7 +521,7 @@ func TestRemoteNodeDeprecated(t *testing.T) { res, err = client.Default.Nodes.AddRemoteNode(params) pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, "Node with name %q already exists.", nodeName) if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.Remote.NodeID) + pmmapitests.RemoveNodes(t, res.Payload.Remote.NodeID) } }) @@ -535,7 +535,7 @@ func TestRemoteNodeDeprecated(t *testing.T) { res, err := client.Default.Nodes.AddRemoteNode(params) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddRemoteNodeRequest.NodeName: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.Remote.NodeID) + pmmapitests.RemoveNodes(t, res.Payload.Remote.NodeID) } }) } @@ -588,7 +588,7 @@ func TestRemoteNode(t *testing.T) { res, err = client.Default.Nodes.AddNode(params) pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, "Node with name %q already exists.", nodeName) if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.Remote.NodeID) + pmmapitests.RemoveNodes(t, res.Payload.Remote.NodeID) } }) @@ -604,7 +604,7 @@ func TestRemoteNode(t *testing.T) { res, err := client.Default.Nodes.AddNode(params) pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid AddRemoteNodeRequest.NodeName: value length must be at least 1 runes") if !assert.Nil(t, res) { - pmmapitests.UnregisterNodes(t, res.Payload.Remote.NodeID) + pmmapitests.RemoveNodes(t, res.Payload.Remote.NodeID) } }) } From c232311966e56976ee6f64271af5645932ce665c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 28 Nov 2023 17:36:36 +0100 Subject: [PATCH 080/126] PMM-12251 Modify test back. --- managed/services/management/node_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index 46e2ddaea7..1c586ff11b 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -131,7 +131,7 @@ func TestNodeService(t *testing.T) { t.Run("Reregister-force", func(t *testing.T) { res, err = s.Register(ctx, &managementpb.RegisterNodeRequest{ NodeType: inventorypb.NodeType_GENERIC_NODE, - NodeName: "test-node", + NodeName: "test-node-new", Address: "some.address.org", Region: "region", Reregister: true, @@ -139,7 +139,7 @@ func TestNodeService(t *testing.T) { expected := &managementpb.RegisterNodeResponse{ GenericNode: &inventorypb.GenericNode{ NodeId: "/node_id/00000000-0000-4000-8000-00000000000b", - NodeName: "test-node", + NodeName: "test-node-new", Address: "some.address.org", Region: "region", }, From 263b701a4d2d7ff3cb880e4c36eeee5710ca087f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 28 Nov 2023 17:42:42 +0100 Subject: [PATCH 081/126] PMM-12251 Fix tests. --- api-tests/management/annotation_test.go | 4 +- api-tests/management/external_test.go | 26 +- api-tests/management/haproxy_test.go | 24 +- api-tests/management/mongodb_test.go | 42 +-- api-tests/management/mysql_test.go | 40 +-- api-tests/management/nodes_test.go | 339 ++++++++++++------------ api-tests/management/proxysql_test.go | 36 +-- 7 files changed, 257 insertions(+), 254 deletions(-) diff --git a/api-tests/management/annotation_test.go b/api-tests/management/annotation_test.go index e35272cb74..10709f84d1 100644 --- a/api-tests/management/annotation_test.go +++ b/api-tests/management/annotation_test.go @@ -91,7 +91,7 @@ func TestAddAnnotation(t *testing.T) { resNode, err := inventoryClient.Default.Nodes.AddGenericNode(paramsNode) assert.NoError(t, err) genericNodeID := resNode.Payload.Generic.NodeID - defer pmmapitests.RemoveNodes(t, genericNodeID) + defer pmmapitests.UnregisterNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "annotation-service") paramsService := &services.AddMySQLServiceParams{ @@ -131,7 +131,7 @@ func TestAddAnnotation(t *testing.T) { } res, err := inventoryClient.Default.Nodes.AddGenericNode(params) assert.NoError(t, err) - defer pmmapitests.RemoveNodes(t, res.Payload.Generic.NodeID) + defer pmmapitests.UnregisterNodes(t, res.Payload.Generic.NodeID) paramsAdd := &annotation.AddAnnotationParams{ Body: annotation.AddAnnotationBody{ diff --git a/api-tests/management/external_test.go b/api-tests/management/external_test.go index 289466ff0f..a7b4585aff 100644 --- a/api-tests/management/external_test.go +++ b/api-tests/management/external_test.go @@ -38,7 +38,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "genericNode-for-basic-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -105,7 +105,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-for-all-fields-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -188,7 +188,7 @@ func TestAddExternal(t *testing.T) { require.NotNil(t, addExternalOK) require.NotNil(t, addExternalOK.Payload.Service) nodeID := addExternalOK.Payload.Service.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceID := addExternalOK.Payload.Service.ServiceID defer pmmapitests.RemoveServices(t, serviceID) @@ -256,7 +256,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-for-the-same-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-for-the-same-name") @@ -299,7 +299,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) params := &external.AddExternalParams{ Context: pmmapitests.Context, @@ -319,7 +319,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -341,7 +341,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -363,7 +363,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -385,7 +385,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -438,7 +438,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -468,7 +468,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -498,7 +498,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -517,7 +517,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ diff --git a/api-tests/management/haproxy_test.go b/api-tests/management/haproxy_test.go index 7b25a0103e..5bf448ed23 100644 --- a/api-tests/management/haproxy_test.go +++ b/api-tests/management/haproxy_test.go @@ -41,7 +41,7 @@ func TestAddHAProxy(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -109,7 +109,7 @@ func TestAddHAProxy(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -188,7 +188,7 @@ func TestAddHAProxy(t *testing.T) { require.NotNil(t, addHAProxyOK) require.NotNil(t, addHAProxyOK.Payload.Service) nodeID := addHAProxyOK.Payload.Service.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceID := addHAProxyOK.Payload.Service.ServiceID defer pmmapitests.RemoveServices(t, serviceID) @@ -257,7 +257,7 @@ func TestAddHAProxy(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-the-same-name") @@ -296,7 +296,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) params := &ha_proxy.AddHAProxyParams{ Context: pmmapitests.Context, @@ -313,7 +313,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &ha_proxy.AddHAProxyParams{ @@ -332,7 +332,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &ha_proxy.AddHAProxyParams{ @@ -351,7 +351,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &ha_proxy.AddHAProxyParams{ @@ -400,7 +400,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -430,7 +430,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -460,7 +460,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -479,7 +479,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ diff --git a/api-tests/management/mongodb_test.go b/api-tests/management/mongodb_test.go index 17472529af..0499f86201 100644 --- a/api-tests/management/mongodb_test.go +++ b/api-tests/management/mongodb_test.go @@ -40,7 +40,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") @@ -113,7 +113,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-all-fields") @@ -201,7 +201,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-all-fields") @@ -260,7 +260,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-the-same-name") @@ -306,7 +306,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) nodeNameAddNode := pmmapitests.TestString(t, "node-for-add-node-name") @@ -371,7 +371,7 @@ func TestAddMongoDB(t *testing.T) { newNodeID := addMongoDBOK.Payload.Service.NodeID require.NotEqual(t, nodeID, newNodeID) - defer pmmapitests.RemoveNodes(t, newNodeID) + defer pmmapitests.UnregisterNodes(t, newNodeID) defer pmmapitests.RemoveServices(t, serviceID) defer removeServiceAgents(t, serviceID) @@ -422,12 +422,12 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.RemoveNodes(t, remoteNodeID) + defer pmmapitests.UnregisterNodes(t, remoteNodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &mongodb.AddMongoDBParams{ @@ -453,7 +453,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &mongodb.AddMongoDBParams{ @@ -471,7 +471,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -494,7 +494,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -518,7 +518,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -542,7 +542,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -570,7 +570,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-mongo-socket-name") @@ -639,7 +639,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") @@ -711,7 +711,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") @@ -782,7 +782,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name-for-basic-name") @@ -884,7 +884,7 @@ func TestRemoveMongoDB(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, pmmAgentID, serviceID := addMongoDB(t, serviceName, nodeName, true) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -915,7 +915,7 @@ func TestRemoveMongoDB(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, pmmAgentID, serviceID := addMongoDB(t, serviceName, nodeName, true) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -946,7 +946,7 @@ func TestRemoveMongoDB(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, pmmAgentID, serviceID := addMongoDB(t, serviceName, nodeName, false) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) @@ -966,7 +966,7 @@ func TestRemoveMongoDB(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, pmmAgentID, serviceID := addMongoDB(t, serviceName, nodeName, false) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) diff --git a/api-tests/management/mysql_test.go b/api-tests/management/mysql_test.go index 4c23d37725..f6b5a009f2 100644 --- a/api-tests/management/mysql_test.go +++ b/api-tests/management/mysql_test.go @@ -116,7 +116,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -218,7 +218,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -279,7 +279,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-the-same-name") @@ -327,7 +327,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) nodeNameAddNode := pmmapitests.TestString(t, "node-for-add-node-name") @@ -395,7 +395,7 @@ func TestAddMySQL(t *testing.T) { newNodeID := addMySQLOK.Payload.Service.NodeID require.NotEqual(t, nodeID, newNodeID) - defer pmmapitests.RemoveNodes(t, newNodeID) + defer pmmapitests.UnregisterNodes(t, newNodeID) defer pmmapitests.RemoveServices(t, serviceID) defer removeServiceAgents(t, serviceID) @@ -448,12 +448,12 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.RemoveNodes(t, remoteNodeID) + defer pmmapitests.UnregisterNodes(t, remoteNodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &mysql.AddMySQLParams{ @@ -480,7 +480,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &mysql.AddMySQLParams{ @@ -498,7 +498,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -523,7 +523,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -549,7 +549,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -577,7 +577,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -601,7 +601,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -626,7 +626,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -701,7 +701,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -775,7 +775,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -881,7 +881,7 @@ func TestRemoveMySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, pmmAgentID, serviceID := addMySQL(t, serviceName, nodeName, true) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -912,7 +912,7 @@ func TestRemoveMySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, pmmAgentID, serviceID := addMySQL(t, serviceName, nodeName, true) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -943,7 +943,7 @@ func TestRemoveMySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, pmmAgentID, serviceID := addMySQL(t, serviceName, nodeName, false) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) @@ -963,7 +963,7 @@ func TestRemoveMySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, pmmAgentID, serviceID := addMySQL(t, serviceName, nodeName, false) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) diff --git a/api-tests/management/nodes_test.go b/api-tests/management/nodes_test.go index db7f440c6b..a5eccc160f 100644 --- a/api-tests/management/nodes_test.go +++ b/api-tests/management/nodes_test.go @@ -16,6 +16,7 @@ package management import ( + "fmt" "testing" "github.com/AlekSi/pointer" @@ -24,6 +25,8 @@ import ( "google.golang.org/grpc/codes" pmmapitests "github.com/percona/pmm/api-tests" + inventoryClient "github.com/percona/pmm/api/inventorypb/json/client" + "github.com/percona/pmm/api/inventorypb/json/client/agents" "github.com/percona/pmm/api/inventorypb/json/client/nodes" "github.com/percona/pmm/api/managementpb/json/client" "github.com/percona/pmm/api/managementpb/json/client/node" @@ -37,7 +40,7 @@ func TestNodeRegister(t *testing.T) { // NodeName: nodeName, // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), // }) - // defer pmmapitests.RemoveNodes(t, nodeID) + // defer pmmapitests.UnregisterNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // // Check Node is created // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ @@ -62,7 +65,7 @@ func TestNodeRegister(t *testing.T) { // Address: "node-address-1", // Region: "region-1", // }) - // defer pmmapitests.RemoveNodes(t, nodeID) + // defer pmmapitests.UnregisterNodes(t, nodeID) // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // body := node.RegisterNodeBody{ @@ -105,186 +108,186 @@ func TestNodeRegister(t *testing.T) { node, err := client.Default.Node.RegisterNode(¶ms) assert.NoError(t, err) - defer pmmapitests.RemoveNodes(t, node.Payload.GenericNode.NodeID) + defer pmmapitests.UnregisterNodes(t, node.Payload.GenericNode.NodeID) defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) }) - // t.Run("Reregister with different node name (no re-register - should fail)", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // Address: "node-address-3", - // Region: "region-3", - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + t.Run("Reregister with different node name (no re-register - should fail)", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + Address: "node-address-3", + Region: "region-3", + }) + defer pmmapitests.UnregisterNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - // body := node.RegisterNodeBody{ - // NodeName: nodeName + "_new", - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // Address: "node-address-3", - // Region: "region-3", - // } - // params := node.RegisterNodeParams{ - // Context: pmmapitests.Context, - // Body: body, - // } - // _, err := client.Default.Node.RegisterNode(¶ms) - // wantErr := fmt.Sprintf("Node with instance %q and region %q already exists.", body.Address, body.Region) - // pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, wantErr) - // }) + body := node.RegisterNodeBody{ + NodeName: nodeName + "_new", + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + Address: "node-address-3", + Region: "region-3", + } + params := node.RegisterNodeParams{ + Context: pmmapitests.Context, + Body: body, + } + _, err := client.Default.Node.RegisterNode(¶ms) + wantErr := fmt.Sprintf("Node with instance %q and region %q already exists.", body.Address, body.Region) + pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, wantErr) + }) - // t.Run("Reregister with different node name (re-register)", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // Address: "node-address-4", - // Region: "region-4", - // }) + t.Run("Reregister with different node name (re-register)", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + Address: "node-address-4", + Region: "region-4", + }) - // assert.NotEmpty(t, nodeID) - // assert.NotEmpty(t, pmmAgentID) + assert.NotEmpty(t, nodeID) + assert.NotEmpty(t, pmmAgentID) - // body := node.RegisterNodeBody{ - // NodeName: nodeName + "_new", - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // Address: "node-address-4", - // Region: "region-4", - // Reregister: true, - // } - // params := node.RegisterNodeParams{ - // Context: pmmapitests.Context, - // Body: body, - // } - // node, err := client.Default.Node.RegisterNode(¶ms) - // assert.NoError(t, err) + body := node.RegisterNodeBody{ + NodeName: nodeName + "_new", + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + Address: "node-address-4", + Region: "region-4", + Reregister: true, + } + params := node.RegisterNodeParams{ + Context: pmmapitests.Context, + Body: body, + } + node, err := client.Default.Node.RegisterNode(¶ms) + assert.NoError(t, err) - // defer pmmapitests.RemoveNodes(t, node.Payload.GenericNode.NodeID) - // _, ok := assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) - // if ok { - // defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) - // } - // }) + defer pmmapitests.UnregisterNodes(t, node.Payload.GenericNode.NodeID) + _, ok := assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) + if ok { + defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) + } + }) - // t.Run("With all fields", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name") - // machineID := pmmapitests.TestString(t, "machine-id") - // nodeModel := pmmapitests.TestString(t, "node-model") - // body := node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // MachineID: machineID, - // NodeModel: nodeModel, - // Az: "eu", - // Region: "us-west", - // Address: "10.10.10.10", - // Distro: "Linux", - // CustomLabels: map[string]string{"foo": "bar"}, - // DisableCollectors: []string{"diskstats", "filesystem", "standard.process"}, - // } - // nodeID, pmmAgentID := RegisterGenericNode(t, body) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + t.Run("With all fields", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name") + machineID := pmmapitests.TestString(t, "machine-id") + nodeModel := pmmapitests.TestString(t, "node-model") + body := node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + MachineID: machineID, + NodeModel: nodeModel, + Az: "eu", + Region: "us-west", + Address: "10.10.10.10", + Distro: "Linux", + CustomLabels: map[string]string{"foo": "bar"}, + DisableCollectors: []string{"diskstats", "filesystem", "standard.process"}, + } + nodeID, pmmAgentID := RegisterGenericNode(t, body) + defer pmmapitests.UnregisterNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - // // Check Node is created - // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - // Generic: &nodes.GetNodeOKBodyGeneric{ - // NodeID: nodeID, - // NodeName: nodeName, - // MachineID: machineID, - // NodeModel: nodeModel, - // Az: "eu", - // Region: "us-west", - // Address: "10.10.10.10", - // Distro: "Linux", - // CustomLabels: map[string]string{"foo": "bar"}, - // }, - // }) + // Check Node is created + assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + Generic: &nodes.GetNodeOKBodyGeneric{ + NodeID: nodeID, + NodeName: nodeName, + MachineID: machineID, + NodeModel: nodeModel, + Az: "eu", + Region: "us-west", + Address: "10.10.10.10", + Distro: "Linux", + CustomLabels: map[string]string{"foo": "bar"}, + }, + }) - // // Check PMM Agent is created - // assertPMMAgentCreated(t, nodeID, pmmAgentID) + // Check PMM Agent is created + assertPMMAgentCreated(t, nodeID, pmmAgentID) - // // Check Node Exporter is created - // listAgentsOK, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - // Body: agents.ListAgentsBody{ - // PMMAgentID: pmmAgentID, - // }, - // Context: pmmapitests.Context, - // }) - // assert.NoError(t, err) - // require.Len(t, listAgentsOK.Payload.NodeExporter, 1) - // nodeExporterAgentID := listAgentsOK.Payload.NodeExporter[0].AgentID - // ok := assert.Equal(t, agents.ListAgentsOKBodyNodeExporterItems0{ - // PMMAgentID: pmmAgentID, - // AgentID: nodeExporterAgentID, - // DisabledCollectors: []string{"diskstats", "filesystem", "standard.process"}, - // PushMetricsEnabled: true, - // Status: &AgentStatusUnknown, - // }, *listAgentsOK.Payload.NodeExporter[0]) - - // if ok { - // defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) - // } - // }) + // Check Node Exporter is created + listAgentsOK, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + Body: agents.ListAgentsBody{ + PMMAgentID: pmmAgentID, + }, + Context: pmmapitests.Context, + }) + assert.NoError(t, err) + require.Len(t, listAgentsOK.Payload.NodeExporter, 1) + nodeExporterAgentID := listAgentsOK.Payload.NodeExporter[0].AgentID + ok := assert.Equal(t, agents.ListAgentsOKBodyNodeExporterItems0{ + PMMAgentID: pmmAgentID, + AgentID: nodeExporterAgentID, + DisabledCollectors: []string{"diskstats", "filesystem", "standard.process"}, + PushMetricsEnabled: true, + Status: &AgentStatusUnknown, + }, *listAgentsOK.Payload.NodeExporter[0]) - // t.Run("Re-register", func(t *testing.T) { - // t.Skip("Re-register logic is not defined yet. https://jira.percona.com/browse/PMM-3717") + if ok { + defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) + } + }) - // nodeName := pmmapitests.TestString(t, "node-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.RemoveNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + t.Run("Re-register", func(t *testing.T) { + t.Skip("Re-register logic is not defined yet. https://jira.percona.com/browse/PMM-3717") - // // Check Node is created - // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - // Generic: &nodes.GetNodeOKBodyGeneric{ - // NodeID: nodeID, - // NodeName: nodeName, - // }, - // }) + nodeName := pmmapitests.TestString(t, "node-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.UnregisterNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - // // Re-register node - // machineID := pmmapitests.TestString(t, "machine-id") - // nodeModel := pmmapitests.TestString(t, "node-model") - // newNodeID, newPMMAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // MachineID: machineID, - // NodeModel: nodeModel, - // Az: "eu", - // Region: "us-west", - // Address: "10.10.10.10", - // Distro: "Linux", - // CustomLabels: map[string]string{"foo": "bar"}, - // }) - // if !assert.Equal(t, nodeID, newNodeID) { - // defer pmmapitests.RemoveNodes(t, newNodeID) - // } - // if !assert.Equal(t, pmmAgentID, newPMMAgentID) { - // defer pmmapitests.RemoveAgents(t, newPMMAgentID) - // } + // Check Node is created + assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + Generic: &nodes.GetNodeOKBodyGeneric{ + NodeID: nodeID, + NodeName: nodeName, + }, + }) - // // Check Node fields is updated - // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - // Generic: &nodes.GetNodeOKBodyGeneric{ - // NodeID: nodeID, - // NodeName: nodeName, - // MachineID: machineID, - // NodeModel: nodeModel, - // Az: "eu", - // Region: "us-west", - // Address: "10.10.10.10", - // Distro: "Linux", - // CustomLabels: map[string]string{"foo": "bar"}, - // }, - // }) - // }) + // Re-register node + machineID := pmmapitests.TestString(t, "machine-id") + nodeModel := pmmapitests.TestString(t, "node-model") + newNodeID, newPMMAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + MachineID: machineID, + NodeModel: nodeModel, + Az: "eu", + Region: "us-west", + Address: "10.10.10.10", + Distro: "Linux", + CustomLabels: map[string]string{"foo": "bar"}, + }) + if !assert.Equal(t, nodeID, newNodeID) { + defer pmmapitests.UnregisterNodes(t, newNodeID) + } + if !assert.Equal(t, pmmAgentID, newPMMAgentID) { + defer pmmapitests.RemoveAgents(t, newPMMAgentID) + } + + // Check Node fields is updated + assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + Generic: &nodes.GetNodeOKBodyGeneric{ + NodeID: nodeID, + NodeName: nodeName, + MachineID: machineID, + NodeModel: nodeModel, + Az: "eu", + Region: "us-west", + Address: "10.10.10.10", + Distro: "Linux", + CustomLabels: map[string]string{"foo": "bar"}, + }, + }) + }) }) t.Run("Container Node", func(t *testing.T) { @@ -294,7 +297,7 @@ func TestNodeRegister(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // Check Node is created @@ -332,7 +335,7 @@ func TestNodeRegister(t *testing.T) { CustomLabels: map[string]string{"foo": "bar"}, } nodeID, pmmAgentID := registerContainerNode(t, body) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // Check Node is created @@ -368,7 +371,7 @@ func TestNodeRegister(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // Check Node is created @@ -395,7 +398,7 @@ func TestNodeRegister(t *testing.T) { CustomLabels: map[string]string{"foo": "bar"}, }) if !assert.Equal(t, nodeID, newNodeID) { - defer pmmapitests.RemoveNodes(t, newNodeID) + defer pmmapitests.UnregisterNodes(t, newNodeID) } if !assert.Equal(t, pmmAgentID, newPMMAgentID) { defer pmmapitests.RemoveAgents(t, newPMMAgentID) diff --git a/api-tests/management/proxysql_test.go b/api-tests/management/proxysql_test.go index e7bc9cd594..fbfd2727c0 100644 --- a/api-tests/management/proxysql_test.go +++ b/api-tests/management/proxysql_test.go @@ -40,7 +40,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -115,7 +115,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -191,7 +191,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -252,7 +252,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-the-same-name") @@ -300,7 +300,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) nodeNameAddNode := pmmapitests.TestString(t, "node-for-add-node-name") @@ -368,7 +368,7 @@ func TestAddProxySQL(t *testing.T) { newNodeID := addProxySQLOK.Payload.Service.NodeID require.NotEqual(t, nodeID, newNodeID) - defer pmmapitests.RemoveNodes(t, newNodeID) + defer pmmapitests.UnregisterNodes(t, newNodeID) defer pmmapitests.RemoveServices(t, serviceID) defer removeServiceAgents(t, serviceID) @@ -420,12 +420,12 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.RemoveNodes(t, remoteNodeID) + defer pmmapitests.UnregisterNodes(t, remoteNodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &proxysql.AddProxySQLParams{ @@ -452,7 +452,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &proxysql.AddProxySQLParams{ @@ -470,7 +470,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -494,7 +494,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -519,7 +519,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -547,7 +547,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -571,7 +571,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -625,7 +625,7 @@ func TestRemoveProxySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, pmmAgentID, serviceID := addProxySQL(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -656,7 +656,7 @@ func TestRemoveProxySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, pmmAgentID, serviceID := addProxySQL(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -687,7 +687,7 @@ func TestRemoveProxySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, pmmAgentID, serviceID := addProxySQL(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) @@ -707,7 +707,7 @@ func TestRemoveProxySQL(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, pmmAgentID, serviceID := addProxySQL(t, serviceName, nodeName) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) From f2e07f7d1e550630b65eac202e680640a9a12ffb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 28 Nov 2023 17:43:26 +0100 Subject: [PATCH 082/126] PMM-12251 Fix version test. --- api-tests/server/version_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api-tests/server/version_test.go b/api-tests/server/version_test.go index 46dbbf9d95..d0c0052991 100644 --- a/api-tests/server/version_test.go +++ b/api-tests/server/version_test.go @@ -61,12 +61,12 @@ func TestVersion(t *testing.T) { err = json.Unmarshal(b, &res) require.NoError(t, err) - require.True(t, strings.HasPrefix(res.Version, "2."), + require.True(t, strings.HasPrefix(res.Version, "3."), "version = %q must have '2.' prefix for PMM 1.x's pmm-client compatibility checking", res.Version) require.NotEmpty(t, res.Managed) - assert.True(t, strings.HasPrefix(res.Managed.Version, "2."), - "managed.version = %q must have '2.' prefix ", res.Managed.Version) + assert.True(t, strings.HasPrefix(res.Managed.Version, "3."), + "managed.version = %q must have '3.' prefix ", res.Managed.Version) assert.NotEmpty(t, res.Managed.FullVersion) // check that timestamp is not XX:00:00 From f661d7c0acc92aef6a486afb16c626a59a9513ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 28 Nov 2023 17:48:58 +0100 Subject: [PATCH 083/126] PMM-12251 Fix another cleanup. --- api-tests/management/backup/backups_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-tests/management/backup/backups_test.go b/api-tests/management/backup/backups_test.go index 609989133d..2a10622e14 100644 --- a/api-tests/management/backup/backups_test.go +++ b/api-tests/management/backup/backups_test.go @@ -41,7 +41,7 @@ func TestScheduleBackup(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer management.RemovePMMAgentWithSubAgents(t, pmmAgentID) mongo1Name := pmmapitests.TestString(t, "mongo") mongo2Name := pmmapitests.TestString(t, "mongo") From 78783fc56bc76ca43715df436d28d30b8bd7f952 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 28 Nov 2023 17:53:35 +0100 Subject: [PATCH 084/126] PMM-12251 Fix another tests. --- api-tests/management/external_test.go | 12 ++++++------ api-tests/management/haproxy_test.go | 8 ++++---- api-tests/management/mongodb_test.go | 8 ++++---- api-tests/management/mysql_test.go | 10 +++++----- api-tests/management/postgresql_test.go | 8 ++++---- api-tests/management/proxysql_test.go | 10 +++++----- 6 files changed, 28 insertions(+), 28 deletions(-) diff --git a/api-tests/management/external_test.go b/api-tests/management/external_test.go index a7b4585aff..a2e66e78cb 100644 --- a/api-tests/management/external_test.go +++ b/api-tests/management/external_test.go @@ -299,7 +299,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) params := &external.AddExternalParams{ Context: pmmapitests.Context, @@ -319,7 +319,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -341,7 +341,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -363,7 +363,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -385,7 +385,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &external.AddExternalParams{ @@ -517,7 +517,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ diff --git a/api-tests/management/haproxy_test.go b/api-tests/management/haproxy_test.go index 5bf448ed23..290e7fc868 100644 --- a/api-tests/management/haproxy_test.go +++ b/api-tests/management/haproxy_test.go @@ -296,7 +296,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) params := &ha_proxy.AddHAProxyParams{ Context: pmmapitests.Context, @@ -313,7 +313,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &ha_proxy.AddHAProxyParams{ @@ -332,7 +332,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &ha_proxy.AddHAProxyParams{ @@ -351,7 +351,7 @@ func TestAddHAProxy(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &ha_proxy.AddHAProxyParams{ diff --git a/api-tests/management/mongodb_test.go b/api-tests/management/mongodb_test.go index 0499f86201..4285db2894 100644 --- a/api-tests/management/mongodb_test.go +++ b/api-tests/management/mongodb_test.go @@ -453,7 +453,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &mongodb.AddMongoDBParams{ @@ -471,7 +471,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -494,7 +494,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -518,7 +518,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") diff --git a/api-tests/management/mysql_test.go b/api-tests/management/mysql_test.go index f6b5a009f2..2c9e757e37 100644 --- a/api-tests/management/mysql_test.go +++ b/api-tests/management/mysql_test.go @@ -480,7 +480,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &mysql.AddMySQLParams{ @@ -498,7 +498,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -523,7 +523,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -577,7 +577,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -601,7 +601,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") diff --git a/api-tests/management/postgresql_test.go b/api-tests/management/postgresql_test.go index 7a41ceeb7c..b1658bfdd9 100644 --- a/api-tests/management/postgresql_test.go +++ b/api-tests/management/postgresql_test.go @@ -483,7 +483,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &postgresql.AddPostgreSQLParams{ @@ -501,7 +501,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -525,7 +525,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -550,7 +550,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") diff --git a/api-tests/management/proxysql_test.go b/api-tests/management/proxysql_test.go index fbfd2727c0..cb4cd8c98b 100644 --- a/api-tests/management/proxysql_test.go +++ b/api-tests/management/proxysql_test.go @@ -452,7 +452,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &proxysql.AddProxySQLParams{ @@ -470,7 +470,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -494,7 +494,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -547,7 +547,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -571,7 +571,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") From cb9d35974cc16487bddd2981f6603c5dd1adc96d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 28 Nov 2023 18:03:13 +0100 Subject: [PATCH 085/126] PMM-12251 Another fix of tests. --- api-tests/management/mongodb_test.go | 8 ++++---- api-tests/management/mysql_test.go | 10 +++++----- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/api-tests/management/mongodb_test.go b/api-tests/management/mongodb_test.go index 4285db2894..0499f86201 100644 --- a/api-tests/management/mongodb_test.go +++ b/api-tests/management/mongodb_test.go @@ -453,7 +453,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &mongodb.AddMongoDBParams{ @@ -471,7 +471,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -494,7 +494,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -518,7 +518,7 @@ func TestAddMongoDB(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") diff --git a/api-tests/management/mysql_test.go b/api-tests/management/mysql_test.go index 2c9e757e37..f6b5a009f2 100644 --- a/api-tests/management/mysql_test.go +++ b/api-tests/management/mysql_test.go @@ -480,7 +480,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &mysql.AddMySQLParams{ @@ -498,7 +498,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -523,7 +523,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -577,7 +577,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -601,7 +601,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") From d263e69f478a5491a589bae94fcf6b48c42e2573 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 29 Nov 2023 10:59:27 +0100 Subject: [PATCH 086/126] PMM-12251 URL query escape. --- managed/services/grafana/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index f08ff075f3..749527188e 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -345,7 +345,7 @@ type serviceAccountSearch struct { func (c *Client) getServiceAccountIDFromName(ctx context.Context, nodeName string, authHeaders http.Header) (int, error) { var res serviceAccountSearch - if err := c.do(ctx, http.MethodGet, "/api/serviceaccounts/search", fmt.Sprintf("query=%s", nodeName), authHeaders, nil, &res); err != nil { + if err := c.do(ctx, http.MethodGet, "/api/serviceaccounts/search", fmt.Sprintf("query=%s", url.QueryEscape(nodeName)), authHeaders, nil, &res); err != nil { return 0, err } From 36ac96a06260fa980939281b5c85fd0999fe3896 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 29 Nov 2023 11:15:53 +0100 Subject: [PATCH 087/126] PMM-12251 Fix annotation API test. --- api-tests/management/annotation_test.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api-tests/management/annotation_test.go b/api-tests/management/annotation_test.go index 10709f84d1..e35272cb74 100644 --- a/api-tests/management/annotation_test.go +++ b/api-tests/management/annotation_test.go @@ -91,7 +91,7 @@ func TestAddAnnotation(t *testing.T) { resNode, err := inventoryClient.Default.Nodes.AddGenericNode(paramsNode) assert.NoError(t, err) genericNodeID := resNode.Payload.Generic.NodeID - defer pmmapitests.UnregisterNodes(t, genericNodeID) + defer pmmapitests.RemoveNodes(t, genericNodeID) serviceName := pmmapitests.TestString(t, "annotation-service") paramsService := &services.AddMySQLServiceParams{ @@ -131,7 +131,7 @@ func TestAddAnnotation(t *testing.T) { } res, err := inventoryClient.Default.Nodes.AddGenericNode(params) assert.NoError(t, err) - defer pmmapitests.UnregisterNodes(t, res.Payload.Generic.NodeID) + defer pmmapitests.RemoveNodes(t, res.Payload.Generic.NodeID) paramsAdd := &annotation.AddAnnotationParams{ Body: annotation.AddAnnotationBody{ From 4effd2f28ab762c4a2016452f0c81dcb8fcec78e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 29 Nov 2023 11:44:14 +0100 Subject: [PATCH 088/126] PMM-12251 Fix external API test. --- api-tests/management/external_test.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/api-tests/management/external_test.go b/api-tests/management/external_test.go index a2e66e78cb..994d47252b 100644 --- a/api-tests/management/external_test.go +++ b/api-tests/management/external_test.go @@ -38,7 +38,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "genericNode-for-basic-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -105,7 +105,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-for-all-fields-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-for-all-fields-name") @@ -188,7 +188,7 @@ func TestAddExternal(t *testing.T) { require.NotNil(t, addExternalOK) require.NotNil(t, addExternalOK.Payload.Service) nodeID := addExternalOK.Payload.Service.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceID := addExternalOK.Payload.Service.ServiceID defer pmmapitests.RemoveServices(t, serviceID) @@ -256,7 +256,7 @@ func TestAddExternal(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-for-the-same-name") genericNode := pmmapitests.AddGenericNode(t, nodeName) nodeID := genericNode.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceName := pmmapitests.TestString(t, "service-for-the-same-name") From 53522fa07cfa8930696efde4feb1c7dfc807fbaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 29 Nov 2023 12:03:32 +0100 Subject: [PATCH 089/126] PMM-12251 Fix remove external API test. --- api-tests/management/external_test.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/api-tests/management/external_test.go b/api-tests/management/external_test.go index 994d47252b..289466ff0f 100644 --- a/api-tests/management/external_test.go +++ b/api-tests/management/external_test.go @@ -438,7 +438,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -468,7 +468,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -498,7 +498,7 @@ func TestRemoveExternal(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, serviceID := addExternal(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ From 7be63a0b3730a3db9cae09fda2b63e72ed03a780 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 29 Nov 2023 12:07:10 +0100 Subject: [PATCH 090/126] PMM-12251 Fix HAProxy API test. --- api-tests/management/haproxy_test.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/api-tests/management/haproxy_test.go b/api-tests/management/haproxy_test.go index 290e7fc868..2dddae47ea 100644 --- a/api-tests/management/haproxy_test.go +++ b/api-tests/management/haproxy_test.go @@ -188,7 +188,7 @@ func TestAddHAProxy(t *testing.T) { require.NotNil(t, addHAProxyOK) require.NotNil(t, addHAProxyOK.Payload.Service) nodeID := addHAProxyOK.Payload.Service.NodeID - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) serviceID := addHAProxyOK.Payload.Service.ServiceID defer pmmapitests.RemoveServices(t, serviceID) @@ -400,7 +400,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-name") nodeName := pmmapitests.TestString(t, "node-remove-by-name") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -430,7 +430,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-by-id") nodeName := pmmapitests.TestString(t, "node-remove-by-id") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ Body: service.RemoveServiceBody{ @@ -460,7 +460,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-both-params") nodeName := pmmapitests.TestString(t, "node-remove-both-params") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ @@ -479,7 +479,7 @@ func TestRemoveHAProxy(t *testing.T) { serviceName := pmmapitests.TestString(t, "service-remove-wrong-type") nodeName := pmmapitests.TestString(t, "node-remove-wrong-type") nodeID, serviceID := addHAProxy(t, serviceName, nodeName) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer pmmapitests.RemoveServices(t, serviceID) removeServiceOK, err := client.Default.Service.RemoveService(&service.RemoveServiceParams{ From f954584145fda882710c3e832bc144e10aff6a2f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 29 Nov 2023 12:47:07 +0100 Subject: [PATCH 091/126] PMM-12251 Fix another API tests. --- api-tests/management/mongodb_test.go | 4 +- api-tests/management/mysql_test.go | 6 +- api-tests/management/nodes_test.go | 96 ++++++++++++++-------------- 3 files changed, 53 insertions(+), 53 deletions(-) diff --git a/api-tests/management/mongodb_test.go b/api-tests/management/mongodb_test.go index 0499f86201..e224d9c740 100644 --- a/api-tests/management/mongodb_test.go +++ b/api-tests/management/mongodb_test.go @@ -371,7 +371,7 @@ func TestAddMongoDB(t *testing.T) { newNodeID := addMongoDBOK.Payload.Service.NodeID require.NotEqual(t, nodeID, newNodeID) - defer pmmapitests.UnregisterNodes(t, newNodeID) + defer pmmapitests.RemoveNodes(t, newNodeID) defer pmmapitests.RemoveServices(t, serviceID) defer removeServiceAgents(t, serviceID) @@ -427,7 +427,7 @@ func TestAddMongoDB(t *testing.T) { remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, remoteNodeID) + defer pmmapitests.RemoveNodes(t, remoteNodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &mongodb.AddMongoDBParams{ diff --git a/api-tests/management/mysql_test.go b/api-tests/management/mysql_test.go index f6b5a009f2..2a38338b86 100644 --- a/api-tests/management/mysql_test.go +++ b/api-tests/management/mysql_test.go @@ -40,7 +40,7 @@ func TestAddMySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-for-basic-name") @@ -395,7 +395,7 @@ func TestAddMySQL(t *testing.T) { newNodeID := addMySQLOK.Payload.Service.NodeID require.NotEqual(t, nodeID, newNodeID) - defer pmmapitests.UnregisterNodes(t, newNodeID) + defer pmmapitests.RemoveNodes(t, newNodeID) defer pmmapitests.RemoveServices(t, serviceID) defer removeServiceAgents(t, serviceID) @@ -453,7 +453,7 @@ func TestAddMySQL(t *testing.T) { remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, remoteNodeID) + defer pmmapitests.RemoveNodes(t, remoteNodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &mysql.AddMySQLParams{ diff --git a/api-tests/management/nodes_test.go b/api-tests/management/nodes_test.go index a5eccc160f..33803627a5 100644 --- a/api-tests/management/nodes_test.go +++ b/api-tests/management/nodes_test.go @@ -34,54 +34,54 @@ import ( func TestNodeRegister(t *testing.T) { t.Run("Generic Node", func(t *testing.T) { - // t.Run("Basic", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - // // Check Node is created - // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - // Generic: &nodes.GetNodeOKBodyGeneric{ - // NodeID: nodeID, - // NodeName: nodeName, - // }, - // }) - - // // Check PMM Agent is created - // assertPMMAgentCreated(t, nodeID, pmmAgentID) - - // // Check Node Exporter is created - // assertNodeExporterCreated(t, pmmAgentID) - // }) - - // t.Run("Reregister with same node name (no re-register - should fail)", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // Address: "node-address-1", - // Region: "region-1", - // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // body := node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // Address: "node-address-1", - // Region: "region-1", - // } - // params := node.RegisterNodeParams{ - // Context: pmmapitests.Context, - // Body: body, - // } - // _, err := client.Default.Node.RegisterNode(¶ms) - // wantErr := fmt.Sprintf("Node with name %q already exists.", nodeName) - // pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, wantErr) - // }) + t.Run("Basic", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.UnregisterNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + // Check Node is created + assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + Generic: &nodes.GetNodeOKBodyGeneric{ + NodeID: nodeID, + NodeName: nodeName, + }, + }) + + // Check PMM Agent is created + assertPMMAgentCreated(t, nodeID, pmmAgentID) + + // Check Node Exporter is created + assertNodeExporterCreated(t, pmmAgentID) + }) + + t.Run("Reregister with same node name (no re-register - should fail)", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + Address: "node-address-1", + Region: "region-1", + }) + defer pmmapitests.UnregisterNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + body := node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + Address: "node-address-1", + Region: "region-1", + } + params := node.RegisterNodeParams{ + Context: pmmapitests.Context, + Body: body, + } + _, err := client.Default.Node.RegisterNode(¶ms) + wantErr := fmt.Sprintf("Node with name %q already exists.", nodeName) + pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, wantErr) + }) t.Run("Reregister with same node name (re-register)", func(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") From 0dcb6b18084c2e128e108114aba85c01d00c6043 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 30 Nov 2023 14:29:04 +0100 Subject: [PATCH 092/126] PMM-12251 Node test. --- managed/services/management/node_test.go | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index 1c586ff11b..78fb1f0d0d 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -36,6 +36,14 @@ import ( ) func TestNodeService(t *testing.T) { + var authProvider mockAuthProvider + authProvider.Test(t) + + serviceAccountID := int(0) + nodeName := "test-node" + reregister := false + force := true + t.Run("Register/Unregister", func(t *testing.T) { setup := func(t *testing.T) (ctx context.Context, s *NodeService, teardown func(t *testing.T)) { t.Helper() @@ -52,13 +60,7 @@ func TestNodeService(t *testing.T) { require.NoError(t, sqlDB.Close()) } - var authProvider mockAuthProvider - authProvider.Test(t) - serviceAccountID := int(0) - nodeName := "test-node" - reregister := true - force := true authProvider.On("CreateServiceAccount", ctx, nodeName, reregister).Return(serviceAccountID, "test-token", nil) authProvider.On("DeleteServiceAccount", ctx, nodeName, force).Return("", nil) @@ -104,6 +106,9 @@ func TestNodeService(t *testing.T) { }) t.Run("Reregister", func(t *testing.T) { + reregister = true + authProvider.On("CreateServiceAccount", ctx, nodeName, reregister).Return(serviceAccountID, "test-token", nil) + res, err = s.Register(ctx, &managementpb.RegisterNodeRequest{ NodeType: inventorypb.NodeType_GENERIC_NODE, NodeName: "test-node", @@ -129,6 +134,9 @@ func TestNodeService(t *testing.T) { assert.NoError(t, err) }) t.Run("Reregister-force", func(t *testing.T) { + nodeName = "test-node-new" + authProvider.On("CreateServiceAccount", ctx, nodeName, reregister).Return(serviceAccountID, "test-token", nil) + res, err = s.Register(ctx, &managementpb.RegisterNodeRequest{ NodeType: inventorypb.NodeType_GENERIC_NODE, NodeName: "test-node-new", From e2ba1a52b64fa6d0db7b78a483578719caabf031 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 11 Jan 2024 09:56:43 +0100 Subject: [PATCH 093/126] PMM-12251 Tidy. --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 7ef1b2046a..21e8791448 100644 --- a/go.mod +++ b/go.mod @@ -91,8 +91,8 @@ require ( github.com/fatih/color v1.13.0 // indirect github.com/go-logr/logr v1.2.4 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a // indirect + github.com/golang-jwt/jwt/v5 v5.0.0 // indirect github.com/google/btree v1.0.0 // indirect github.com/hashicorp/go-hclog v1.5.0 // indirect github.com/hashicorp/go-msgpack/v2 v2.1.1 // indirect From f8c36386b4be50c1537290f2cfa1b5c17292daa3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 11 Jan 2024 10:20:50 +0100 Subject: [PATCH 094/126] PMM-12251 Comment out for now. --- agent/client/client.go | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/agent/client/client.go b/agent/client/client.go index b79eb8e261..c99d34cbb9 100644 --- a/agent/client/client.go +++ b/agent/client/client.go @@ -747,12 +747,12 @@ func dial(dialCtx context.Context, cfg *config.Config, l *logrus.Entry) (*dialRe opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))) } - if cfg.Server.Username != "" { - opts = append(opts, grpc.WithPerRPCCredentials(&basicAuth{ - username: cfg.Server.Username, - password: cfg.Server.Password, - })) - } + // if cfg.Server.Username != "" { + // opts = append(opts, grpc.WithPerRPCCredentials(&basicAuth{ + // username: cfg.Server.Username, + // password: cfg.Server.Password, + // })) + // } l.Infof("Connecting to %s ...", cfg.Server.FilteredURL()) conn, err := grpc.DialContext(dialCtx, cfg.Server.Address, opts...) From ad9ffa080bf271e1d1ca2154fd6e654f8abebdbe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 12 Jan 2024 11:04:59 +0100 Subject: [PATCH 095/126] PMM-12251 TODO. --- api-tests/management/nodes_test.go | 770 ++++++++++++++--------------- managed/services/grafana/client.go | 19 +- 2 files changed, 395 insertions(+), 394 deletions(-) diff --git a/api-tests/management/nodes_test.go b/api-tests/management/nodes_test.go index 33803627a5..01bf530a5f 100644 --- a/api-tests/management/nodes_test.go +++ b/api-tests/management/nodes_test.go @@ -20,103 +20,101 @@ import ( "testing" "github.com/AlekSi/pointer" - "github.com/stretchr/testify/assert" - "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" pmmapitests "github.com/percona/pmm/api-tests" - inventoryClient "github.com/percona/pmm/api/inventorypb/json/client" - "github.com/percona/pmm/api/inventorypb/json/client/agents" - "github.com/percona/pmm/api/inventorypb/json/client/nodes" "github.com/percona/pmm/api/managementpb/json/client" "github.com/percona/pmm/api/managementpb/json/client/node" ) func TestNodeRegister(t *testing.T) { t.Run("Generic Node", func(t *testing.T) { - t.Run("Basic", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.UnregisterNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - // Check Node is created - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Generic: &nodes.GetNodeOKBodyGeneric{ - NodeID: nodeID, - NodeName: nodeName, - }, - }) - - // Check PMM Agent is created - assertPMMAgentCreated(t, nodeID, pmmAgentID) - - // Check Node Exporter is created - assertNodeExporterCreated(t, pmmAgentID) - }) - - t.Run("Reregister with same node name (no re-register - should fail)", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - Address: "node-address-1", - Region: "region-1", - }) - defer pmmapitests.UnregisterNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - body := node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - Address: "node-address-1", - Region: "region-1", - } - params := node.RegisterNodeParams{ - Context: pmmapitests.Context, - Body: body, - } - _, err := client.Default.Node.RegisterNode(¶ms) - wantErr := fmt.Sprintf("Node with name %q already exists.", nodeName) - pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, wantErr) - }) - - t.Run("Reregister with same node name (re-register)", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - Address: "node-address-2", - Region: "region-2", - }) - assert.NotEmpty(t, nodeID) - assert.NotEmpty(t, pmmAgentID) - - body := node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - Address: "node-address-2", - Region: "region-3", - Reregister: true, - } - params := node.RegisterNodeParams{ - Context: pmmapitests.Context, - Body: body, - } - node, err := client.Default.Node.RegisterNode(¶ms) - assert.NoError(t, err) - - defer pmmapitests.UnregisterNodes(t, node.Payload.GenericNode.NodeID) - defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) - assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) - }) + // t.Run("Basic", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + // // Check Node is created + // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + // Generic: &nodes.GetNodeOKBodyGeneric{ + // NodeID: nodeID, + // NodeName: nodeName, + // }, + // }) + + // // Check PMM Agent is created + // assertPMMAgentCreated(t, nodeID, pmmAgentID) + + // // Check Node Exporter is created + // assertNodeExporterCreated(t, pmmAgentID) + // }) + + // t.Run("Reregister with same node name (no re-register - should fail)", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // Address: "node-address-1", + // Region: "region-1", + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // body := node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // Address: "node-address-1", + // Region: "region-1", + // } + // params := node.RegisterNodeParams{ + // Context: pmmapitests.Context, + // Body: body, + // } + // _, err := client.Default.Node.RegisterNode(¶ms) + // wantErr := fmt.Sprintf("Node with name %q already exists.", nodeName) + // pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, wantErr) + // }) + + // t.Run("Reregister with same node name (re-register)", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // Address: "node-address-2", + // Region: "region-2", + // }) + // assert.NotEmpty(t, nodeID) + // assert.NotEmpty(t, pmmAgentID) + + // body := node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // Address: "node-address-2", + // Region: "region-3", + // Reregister: true, + // } + // params := node.RegisterNodeParams{ + // Context: pmmapitests.Context, + // Body: body, + // } + // node, err := client.Default.Node.RegisterNode(¶ms) + // assert.NoError(t, err) + + // defer pmmapitests.UnregisterNodes(t, node.Payload.GenericNode.NodeID) + // defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) + + // assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) + // }) t.Run("Reregister with different node name (no re-register - should fail)", func(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + // TODO too long, grafana limit 190? + fmt.Println(nodeName[:50]) nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, + NodeName: nodeName[:50], NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), Address: "node-address-3", Region: "region-3", @@ -125,7 +123,7 @@ func TestNodeRegister(t *testing.T) { defer RemovePMMAgentWithSubAgents(t, pmmAgentID) body := node.RegisterNodeBody{ - NodeName: nodeName + "_new", + NodeName: nodeName[:50] + "_new", NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), Address: "node-address-3", Region: "region-3", @@ -139,307 +137,307 @@ func TestNodeRegister(t *testing.T) { pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, wantErr) }) - t.Run("Reregister with different node name (re-register)", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - Address: "node-address-4", - Region: "region-4", - }) - - assert.NotEmpty(t, nodeID) - assert.NotEmpty(t, pmmAgentID) - - body := node.RegisterNodeBody{ - NodeName: nodeName + "_new", - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - Address: "node-address-4", - Region: "region-4", - Reregister: true, - } - params := node.RegisterNodeParams{ - Context: pmmapitests.Context, - Body: body, - } - node, err := client.Default.Node.RegisterNode(¶ms) - assert.NoError(t, err) - - defer pmmapitests.UnregisterNodes(t, node.Payload.GenericNode.NodeID) - _, ok := assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) - if ok { - defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) - } - }) - - t.Run("With all fields", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name") - machineID := pmmapitests.TestString(t, "machine-id") - nodeModel := pmmapitests.TestString(t, "node-model") - body := node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - MachineID: machineID, - NodeModel: nodeModel, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - Distro: "Linux", - CustomLabels: map[string]string{"foo": "bar"}, - DisableCollectors: []string{"diskstats", "filesystem", "standard.process"}, - } - nodeID, pmmAgentID := RegisterGenericNode(t, body) - defer pmmapitests.UnregisterNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // Check Node is created - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Generic: &nodes.GetNodeOKBodyGeneric{ - NodeID: nodeID, - NodeName: nodeName, - MachineID: machineID, - NodeModel: nodeModel, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - Distro: "Linux", - CustomLabels: map[string]string{"foo": "bar"}, - }, - }) - - // Check PMM Agent is created - assertPMMAgentCreated(t, nodeID, pmmAgentID) - - // Check Node Exporter is created - listAgentsOK, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - Body: agents.ListAgentsBody{ - PMMAgentID: pmmAgentID, - }, - Context: pmmapitests.Context, - }) - assert.NoError(t, err) - require.Len(t, listAgentsOK.Payload.NodeExporter, 1) - nodeExporterAgentID := listAgentsOK.Payload.NodeExporter[0].AgentID - ok := assert.Equal(t, agents.ListAgentsOKBodyNodeExporterItems0{ - PMMAgentID: pmmAgentID, - AgentID: nodeExporterAgentID, - DisabledCollectors: []string{"diskstats", "filesystem", "standard.process"}, - PushMetricsEnabled: true, - Status: &AgentStatusUnknown, - }, *listAgentsOK.Payload.NodeExporter[0]) - - if ok { - defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) - } - }) - - t.Run("Re-register", func(t *testing.T) { - t.Skip("Re-register logic is not defined yet. https://jira.percona.com/browse/PMM-3717") - - nodeName := pmmapitests.TestString(t, "node-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.UnregisterNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // Check Node is created - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Generic: &nodes.GetNodeOKBodyGeneric{ - NodeID: nodeID, - NodeName: nodeName, - }, - }) - - // Re-register node - machineID := pmmapitests.TestString(t, "machine-id") - nodeModel := pmmapitests.TestString(t, "node-model") - newNodeID, newPMMAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - MachineID: machineID, - NodeModel: nodeModel, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - Distro: "Linux", - CustomLabels: map[string]string{"foo": "bar"}, - }) - if !assert.Equal(t, nodeID, newNodeID) { - defer pmmapitests.UnregisterNodes(t, newNodeID) - } - if !assert.Equal(t, pmmAgentID, newPMMAgentID) { - defer pmmapitests.RemoveAgents(t, newPMMAgentID) - } - - // Check Node fields is updated - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Generic: &nodes.GetNodeOKBodyGeneric{ - NodeID: nodeID, - NodeName: nodeName, - MachineID: machineID, - NodeModel: nodeModel, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - Distro: "Linux", - CustomLabels: map[string]string{"foo": "bar"}, - }, - }) - }) - }) - - t.Run("Container Node", func(t *testing.T) { - t.Run("Basic", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name") - nodeID, pmmAgentID := registerContainerNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), - }) - defer pmmapitests.UnregisterNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // Check Node is created - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Container: &nodes.GetNodeOKBodyContainer{ - NodeID: nodeID, - NodeName: nodeName, - }, - }) - - // Check PMM Agent is created - assertPMMAgentCreated(t, nodeID, pmmAgentID) - - // Check Node Exporter is created - nodeExporterAgentID, ok := assertNodeExporterCreated(t, pmmAgentID) - if ok { - defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) - } - }) - - t.Run("With all fields", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name") - nodeModel := pmmapitests.TestString(t, "node-model") - containerID := pmmapitests.TestString(t, "container-id") - containerName := pmmapitests.TestString(t, "container-name") - body := node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), - NodeModel: nodeModel, - ContainerID: containerID, - ContainerName: containerName, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - CustomLabels: map[string]string{"foo": "bar"}, - } - nodeID, pmmAgentID := registerContainerNode(t, body) - defer pmmapitests.UnregisterNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // Check Node is created - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Container: &nodes.GetNodeOKBodyContainer{ - NodeID: nodeID, - NodeName: nodeName, - NodeModel: nodeModel, - ContainerID: containerID, - ContainerName: containerName, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - CustomLabels: map[string]string{"foo": "bar"}, - }, - }) - - // Check PMM Agent is created - assertPMMAgentCreated(t, nodeID, pmmAgentID) - - // Check Node Exporter is created - nodeExporterAgentID, ok := assertNodeExporterCreated(t, pmmAgentID) - if ok { - defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) - } - }) - - t.Run("Re-register", func(t *testing.T) { - t.Skip("Re-register logic is not defined yet. https://jira.percona.com/browse/PMM-3717") - - nodeName := pmmapitests.TestString(t, "node-name") - nodeID, pmmAgentID := registerContainerNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), - }) - defer pmmapitests.UnregisterNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // Check Node is created - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Generic: &nodes.GetNodeOKBodyGeneric{ - NodeID: nodeID, - NodeName: nodeName, - }, - }) - - // Re-register node - nodeModel := pmmapitests.TestString(t, "node-model") - containerID := pmmapitests.TestString(t, "container-id") - containerName := pmmapitests.TestString(t, "container-name") - newNodeID, newPMMAgentID := registerContainerNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), - ContainerID: containerID, - ContainerName: containerName, - NodeModel: nodeModel, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - CustomLabels: map[string]string{"foo": "bar"}, - }) - if !assert.Equal(t, nodeID, newNodeID) { - defer pmmapitests.UnregisterNodes(t, newNodeID) - } - if !assert.Equal(t, pmmAgentID, newPMMAgentID) { - defer pmmapitests.RemoveAgents(t, newPMMAgentID) - } - - // Check Node fields is updated - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Container: &nodes.GetNodeOKBodyContainer{ - NodeID: nodeID, - NodeName: nodeName, - ContainerID: containerID, - ContainerName: containerName, - NodeModel: nodeModel, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - CustomLabels: map[string]string{"foo": "bar"}, - }, - }) - }) + // t.Run("Reregister with different node name (re-register)", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // Address: "node-address-4", + // Region: "region-4", + // }) + + // assert.NotEmpty(t, nodeID) + // assert.NotEmpty(t, pmmAgentID) + + // body := node.RegisterNodeBody{ + // NodeName: nodeName + "_new", + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // Address: "node-address-4", + // Region: "region-4", + // Reregister: true, + // } + // params := node.RegisterNodeParams{ + // Context: pmmapitests.Context, + // Body: body, + // } + // node, err := client.Default.Node.RegisterNode(¶ms) + // assert.NoError(t, err) + + // defer pmmapitests.UnregisterNodes(t, node.Payload.GenericNode.NodeID) + // _, ok := assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) + // if ok { + // defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) + // } + // }) + + // t.Run("With all fields", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name") + // machineID := pmmapitests.TestString(t, "machine-id") + // nodeModel := pmmapitests.TestString(t, "node-model") + // body := node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // MachineID: machineID, + // NodeModel: nodeModel, + // Az: "eu", + // Region: "us-west", + // Address: "10.10.10.10", + // Distro: "Linux", + // CustomLabels: map[string]string{"foo": "bar"}, + // DisableCollectors: []string{"diskstats", "filesystem", "standard.process"}, + // } + // nodeID, pmmAgentID := RegisterGenericNode(t, body) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // // Check Node is created + // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + // Generic: &nodes.GetNodeOKBodyGeneric{ + // NodeID: nodeID, + // NodeName: nodeName, + // MachineID: machineID, + // NodeModel: nodeModel, + // Az: "eu", + // Region: "us-west", + // Address: "10.10.10.10", + // Distro: "Linux", + // CustomLabels: map[string]string{"foo": "bar"}, + // }, + // }) + + // // Check PMM Agent is created + // assertPMMAgentCreated(t, nodeID, pmmAgentID) + + // // Check Node Exporter is created + // listAgentsOK, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + // Body: agents.ListAgentsBody{ + // PMMAgentID: pmmAgentID, + // }, + // Context: pmmapitests.Context, + // }) + // assert.NoError(t, err) + // require.Len(t, listAgentsOK.Payload.NodeExporter, 1) + // nodeExporterAgentID := listAgentsOK.Payload.NodeExporter[0].AgentID + // ok := assert.Equal(t, agents.ListAgentsOKBodyNodeExporterItems0{ + // PMMAgentID: pmmAgentID, + // AgentID: nodeExporterAgentID, + // DisabledCollectors: []string{"diskstats", "filesystem", "standard.process"}, + // PushMetricsEnabled: true, + // Status: &AgentStatusUnknown, + // }, *listAgentsOK.Payload.NodeExporter[0]) + + // if ok { + // defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) + // } + // }) + + // t.Run("Re-register", func(t *testing.T) { + // t.Skip("Re-register logic is not defined yet. https://jira.percona.com/browse/PMM-3717") + + // nodeName := pmmapitests.TestString(t, "node-name") + // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // // Check Node is created + // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + // Generic: &nodes.GetNodeOKBodyGeneric{ + // NodeID: nodeID, + // NodeName: nodeName, + // }, + // }) + + // // Re-register node + // machineID := pmmapitests.TestString(t, "machine-id") + // nodeModel := pmmapitests.TestString(t, "node-model") + // newNodeID, newPMMAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + // MachineID: machineID, + // NodeModel: nodeModel, + // Az: "eu", + // Region: "us-west", + // Address: "10.10.10.10", + // Distro: "Linux", + // CustomLabels: map[string]string{"foo": "bar"}, + // }) + // if !assert.Equal(t, nodeID, newNodeID) { + // defer pmmapitests.UnregisterNodes(t, newNodeID) + // } + // if !assert.Equal(t, pmmAgentID, newPMMAgentID) { + // defer pmmapitests.RemoveAgents(t, newPMMAgentID) + // } + + // // Check Node fields is updated + // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + // Generic: &nodes.GetNodeOKBodyGeneric{ + // NodeID: nodeID, + // NodeName: nodeName, + // MachineID: machineID, + // NodeModel: nodeModel, + // Az: "eu", + // Region: "us-west", + // Address: "10.10.10.10", + // Distro: "Linux", + // CustomLabels: map[string]string{"foo": "bar"}, + // }, + // }) + // }) }) - t.Run("Empty node name", func(t *testing.T) { - params := node.RegisterNodeParams{ - Context: pmmapitests.Context, - Body: node.RegisterNodeBody{}, - } - registerOK, err := client.Default.Node.RegisterNode(¶ms) - pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid RegisterNodeRequest.NodeName: value length must be at least 1 runes") - require.Nil(t, registerOK) - }) - - t.Run("Unsupported node type", func(t *testing.T) { - params := node.RegisterNodeParams{ - Context: pmmapitests.Context, - Body: node.RegisterNodeBody{ - NodeName: pmmapitests.TestString(t, "node-name"), - }, - } - registerOK, err := client.Default.Node.RegisterNode(¶ms) - pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, `Unsupported Node type "NODE_TYPE_INVALID".`) - require.Nil(t, registerOK) - }) + // t.Run("Container Node", func(t *testing.T) { + // t.Run("Basic", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name") + // nodeID, pmmAgentID := registerContainerNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // // Check Node is created + // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + // Container: &nodes.GetNodeOKBodyContainer{ + // NodeID: nodeID, + // NodeName: nodeName, + // }, + // }) + + // // Check PMM Agent is created + // assertPMMAgentCreated(t, nodeID, pmmAgentID) + + // // Check Node Exporter is created + // nodeExporterAgentID, ok := assertNodeExporterCreated(t, pmmAgentID) + // if ok { + // defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) + // } + // }) + + // t.Run("With all fields", func(t *testing.T) { + // nodeName := pmmapitests.TestString(t, "node-name") + // nodeModel := pmmapitests.TestString(t, "node-model") + // containerID := pmmapitests.TestString(t, "container-id") + // containerName := pmmapitests.TestString(t, "container-name") + // body := node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), + // NodeModel: nodeModel, + // ContainerID: containerID, + // ContainerName: containerName, + // Az: "eu", + // Region: "us-west", + // Address: "10.10.10.10", + // CustomLabels: map[string]string{"foo": "bar"}, + // } + // nodeID, pmmAgentID := registerContainerNode(t, body) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // // Check Node is created + // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + // Container: &nodes.GetNodeOKBodyContainer{ + // NodeID: nodeID, + // NodeName: nodeName, + // NodeModel: nodeModel, + // ContainerID: containerID, + // ContainerName: containerName, + // Az: "eu", + // Region: "us-west", + // Address: "10.10.10.10", + // CustomLabels: map[string]string{"foo": "bar"}, + // }, + // }) + + // // Check PMM Agent is created + // assertPMMAgentCreated(t, nodeID, pmmAgentID) + + // // Check Node Exporter is created + // nodeExporterAgentID, ok := assertNodeExporterCreated(t, pmmAgentID) + // if ok { + // defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) + // } + // }) + + // t.Run("Re-register", func(t *testing.T) { + // t.Skip("Re-register logic is not defined yet. https://jira.percona.com/browse/PMM-3717") + + // nodeName := pmmapitests.TestString(t, "node-name") + // nodeID, pmmAgentID := registerContainerNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), + // }) + // defer pmmapitests.UnregisterNodes(t, nodeID) + // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // // Check Node is created + // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + // Generic: &nodes.GetNodeOKBodyGeneric{ + // NodeID: nodeID, + // NodeName: nodeName, + // }, + // }) + + // // Re-register node + // nodeModel := pmmapitests.TestString(t, "node-model") + // containerID := pmmapitests.TestString(t, "container-id") + // containerName := pmmapitests.TestString(t, "container-name") + // newNodeID, newPMMAgentID := registerContainerNode(t, node.RegisterNodeBody{ + // NodeName: nodeName, + // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), + // ContainerID: containerID, + // ContainerName: containerName, + // NodeModel: nodeModel, + // Az: "eu", + // Region: "us-west", + // Address: "10.10.10.10", + // CustomLabels: map[string]string{"foo": "bar"}, + // }) + // if !assert.Equal(t, nodeID, newNodeID) { + // defer pmmapitests.UnregisterNodes(t, newNodeID) + // } + // if !assert.Equal(t, pmmAgentID, newPMMAgentID) { + // defer pmmapitests.RemoveAgents(t, newPMMAgentID) + // } + + // // Check Node fields is updated + // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + // Container: &nodes.GetNodeOKBodyContainer{ + // NodeID: nodeID, + // NodeName: nodeName, + // ContainerID: containerID, + // ContainerName: containerName, + // NodeModel: nodeModel, + // Az: "eu", + // Region: "us-west", + // Address: "10.10.10.10", + // CustomLabels: map[string]string{"foo": "bar"}, + // }, + // }) + // }) + // }) + + // t.Run("Empty node name", func(t *testing.T) { + // params := node.RegisterNodeParams{ + // Context: pmmapitests.Context, + // Body: node.RegisterNodeBody{}, + // } + // registerOK, err := client.Default.Node.RegisterNode(¶ms) + // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid RegisterNodeRequest.NodeName: value length must be at least 1 runes") + // require.Nil(t, registerOK) + // }) + + // t.Run("Unsupported node type", func(t *testing.T) { + // params := node.RegisterNodeParams{ + // Context: pmmapitests.Context, + // Body: node.RegisterNodeBody{ + // NodeName: pmmapitests.TestString(t, "node-name"), + // }, + // } + // registerOK, err := client.Default.Node.RegisterNode(¶ms) + // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, `Unsupported Node type "NODE_TYPE_INVALID".`) + // require.Nil(t, registerOK) + // }) } diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 79be606cd4..01d9f9c0a5 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -345,18 +345,21 @@ type serviceAccountSearch struct { func (c *Client) getServiceAccountIDFromName(ctx context.Context, nodeName string, authHeaders http.Header) (int, error) { var res serviceAccountSearch - if err := c.do(ctx, http.MethodGet, "/api/serviceaccounts/search", fmt.Sprintf("query=%s", url.QueryEscape(nodeName)), authHeaders, nil, &res); err != nil { + // TODO add prefix serviceTokenName := fmt.Sprintf("%s-%s", pmmServiceTokenName, nodeName)? + serviceAccountName := fmt.Sprintf("%s-%s", pmmServiceAccountName, nodeName) + if err := c.do(ctx, http.MethodGet, "/api/serviceaccounts/search", fmt.Sprintf("query=%s", serviceAccountName), authHeaders, nil, &res); err != nil { return 0, err } - - switch { - case res.TotalCount < 1: - return 0, errors.Errorf("service account %s not found", nodeName) - case res.TotalCount > 1: - return 0, errors.Errorf("service account %s has more results", nodeName) + fmt.Println(res.TotalCount) + for _, serviceAccount := range res.ServiceAccounts { + fmt.Println(serviceAccount.Name + "!=" + serviceAccountName) + if serviceAccount.Name != serviceAccountName { + continue + } + return serviceAccount.ID, nil } - return res.ServiceAccounts[0].ID, nil + return 0, errors.Errorf("service account %s not found", serviceAccountName) } func (c *Client) getNotPMMAgentTokenCountForServiceAccount(ctx context.Context, nodeName string) (int, error) { From 57749011285d3df9e518e9aac6e94462caca87c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 16 Jan 2024 15:59:20 +0100 Subject: [PATCH 096/126] PMM-12251 Temp, TODO lefts. --- api-tests/management/nodes_test.go | 767 +++++++++++++++-------------- api-tests/server/auth_test.go | 141 +++++- 2 files changed, 513 insertions(+), 395 deletions(-) diff --git a/api-tests/management/nodes_test.go b/api-tests/management/nodes_test.go index 01bf530a5f..349efc4412 100644 --- a/api-tests/management/nodes_test.go +++ b/api-tests/management/nodes_test.go @@ -20,98 +20,103 @@ import ( "testing" "github.com/AlekSi/pointer" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" pmmapitests "github.com/percona/pmm/api-tests" + inventoryClient "github.com/percona/pmm/api/inventorypb/json/client" + "github.com/percona/pmm/api/inventorypb/json/client/agents" + "github.com/percona/pmm/api/inventorypb/json/client/nodes" "github.com/percona/pmm/api/managementpb/json/client" "github.com/percona/pmm/api/managementpb/json/client/node" ) func TestNodeRegister(t *testing.T) { t.Run("Generic Node", func(t *testing.T) { - // t.Run("Basic", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - // // Check Node is created - // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - // Generic: &nodes.GetNodeOKBodyGeneric{ - // NodeID: nodeID, - // NodeName: nodeName, - // }, - // }) - - // // Check PMM Agent is created - // assertPMMAgentCreated(t, nodeID, pmmAgentID) - - // // Check Node Exporter is created - // assertNodeExporterCreated(t, pmmAgentID) - // }) - - // t.Run("Reregister with same node name (no re-register - should fail)", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // Address: "node-address-1", - // Region: "region-1", - // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // body := node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // Address: "node-address-1", - // Region: "region-1", - // } - // params := node.RegisterNodeParams{ - // Context: pmmapitests.Context, - // Body: body, - // } - // _, err := client.Default.Node.RegisterNode(¶ms) - // wantErr := fmt.Sprintf("Node with name %q already exists.", nodeName) - // pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, wantErr) - // }) - - // t.Run("Reregister with same node name (re-register)", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // Address: "node-address-2", - // Region: "region-2", - // }) - // assert.NotEmpty(t, nodeID) - // assert.NotEmpty(t, pmmAgentID) - - // body := node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // Address: "node-address-2", - // Region: "region-3", - // Reregister: true, - // } - // params := node.RegisterNodeParams{ - // Context: pmmapitests.Context, - // Body: body, - // } - // node, err := client.Default.Node.RegisterNode(¶ms) - // assert.NoError(t, err) - - // defer pmmapitests.UnregisterNodes(t, node.Payload.GenericNode.NodeID) - // defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) - - // assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) - // }) + t.Run("Basic", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.UnregisterNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + // Check Node is created + assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + Generic: &nodes.GetNodeOKBodyGeneric{ + NodeID: nodeID, + NodeName: nodeName, + }, + }) + + // Check PMM Agent is created + assertPMMAgentCreated(t, nodeID, pmmAgentID) + + // Check Node Exporter is created + assertNodeExporterCreated(t, pmmAgentID) + }) + + t.Run("Reregister with same node name (no re-register - should fail)", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + Address: "node-address-1", + Region: "region-1", + }) + defer pmmapitests.UnregisterNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + body := node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + Address: "node-address-1", + Region: "region-1", + } + params := node.RegisterNodeParams{ + Context: pmmapitests.Context, + Body: body, + } + _, err := client.Default.Node.RegisterNode(¶ms) + wantErr := fmt.Sprintf("Node with name %q already exists.", nodeName) + pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, wantErr) + }) + + t.Run("Reregister with same node name (re-register)", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + Address: "node-address-2", + Region: "region-2", + }) + assert.NotEmpty(t, nodeID) + assert.NotEmpty(t, pmmAgentID) + + body := node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + Address: "node-address-2", + Region: "region-3", + Reregister: true, + } + params := node.RegisterNodeParams{ + Context: pmmapitests.Context, + Body: body, + } + node, err := client.Default.Node.RegisterNode(¶ms) + assert.NoError(t, err) + + defer pmmapitests.UnregisterNodes(t, node.Payload.GenericNode.NodeID) + defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) + + assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) + }) t.Run("Reregister with different node name (no re-register - should fail)", func(t *testing.T) { nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") - // TODO too long, grafana limit 190? + //TODO too long, grafana limit 190? fmt.Println(nodeName[:50]) nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ NodeName: nodeName[:50], @@ -137,307 +142,307 @@ func TestNodeRegister(t *testing.T) { pmmapitests.AssertAPIErrorf(t, err, 409, codes.AlreadyExists, wantErr) }) - // t.Run("Reregister with different node name (re-register)", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // Address: "node-address-4", - // Region: "region-4", - // }) - - // assert.NotEmpty(t, nodeID) - // assert.NotEmpty(t, pmmAgentID) - - // body := node.RegisterNodeBody{ - // NodeName: nodeName + "_new", - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // Address: "node-address-4", - // Region: "region-4", - // Reregister: true, - // } - // params := node.RegisterNodeParams{ - // Context: pmmapitests.Context, - // Body: body, - // } - // node, err := client.Default.Node.RegisterNode(¶ms) - // assert.NoError(t, err) - - // defer pmmapitests.UnregisterNodes(t, node.Payload.GenericNode.NodeID) - // _, ok := assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) - // if ok { - // defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) - // } - // }) - - // t.Run("With all fields", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name") - // machineID := pmmapitests.TestString(t, "machine-id") - // nodeModel := pmmapitests.TestString(t, "node-model") - // body := node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // MachineID: machineID, - // NodeModel: nodeModel, - // Az: "eu", - // Region: "us-west", - // Address: "10.10.10.10", - // Distro: "Linux", - // CustomLabels: map[string]string{"foo": "bar"}, - // DisableCollectors: []string{"diskstats", "filesystem", "standard.process"}, - // } - // nodeID, pmmAgentID := RegisterGenericNode(t, body) - // defer pmmapitests.UnregisterNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // // Check Node is created - // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - // Generic: &nodes.GetNodeOKBodyGeneric{ - // NodeID: nodeID, - // NodeName: nodeName, - // MachineID: machineID, - // NodeModel: nodeModel, - // Az: "eu", - // Region: "us-west", - // Address: "10.10.10.10", - // Distro: "Linux", - // CustomLabels: map[string]string{"foo": "bar"}, - // }, - // }) - - // // Check PMM Agent is created - // assertPMMAgentCreated(t, nodeID, pmmAgentID) - - // // Check Node Exporter is created - // listAgentsOK, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ - // Body: agents.ListAgentsBody{ - // PMMAgentID: pmmAgentID, - // }, - // Context: pmmapitests.Context, - // }) - // assert.NoError(t, err) - // require.Len(t, listAgentsOK.Payload.NodeExporter, 1) - // nodeExporterAgentID := listAgentsOK.Payload.NodeExporter[0].AgentID - // ok := assert.Equal(t, agents.ListAgentsOKBodyNodeExporterItems0{ - // PMMAgentID: pmmAgentID, - // AgentID: nodeExporterAgentID, - // DisabledCollectors: []string{"diskstats", "filesystem", "standard.process"}, - // PushMetricsEnabled: true, - // Status: &AgentStatusUnknown, - // }, *listAgentsOK.Payload.NodeExporter[0]) - - // if ok { - // defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) - // } - // }) - - // t.Run("Re-register", func(t *testing.T) { - // t.Skip("Re-register logic is not defined yet. https://jira.percona.com/browse/PMM-3717") - - // nodeName := pmmapitests.TestString(t, "node-name") - // nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // // Check Node is created - // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - // Generic: &nodes.GetNodeOKBodyGeneric{ - // NodeID: nodeID, - // NodeName: nodeName, - // }, - // }) - - // // Re-register node - // machineID := pmmapitests.TestString(t, "machine-id") - // nodeModel := pmmapitests.TestString(t, "node-model") - // newNodeID, newPMMAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - // MachineID: machineID, - // NodeModel: nodeModel, - // Az: "eu", - // Region: "us-west", - // Address: "10.10.10.10", - // Distro: "Linux", - // CustomLabels: map[string]string{"foo": "bar"}, - // }) - // if !assert.Equal(t, nodeID, newNodeID) { - // defer pmmapitests.UnregisterNodes(t, newNodeID) - // } - // if !assert.Equal(t, pmmAgentID, newPMMAgentID) { - // defer pmmapitests.RemoveAgents(t, newPMMAgentID) - // } - - // // Check Node fields is updated - // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - // Generic: &nodes.GetNodeOKBodyGeneric{ - // NodeID: nodeID, - // NodeName: nodeName, - // MachineID: machineID, - // NodeModel: nodeModel, - // Az: "eu", - // Region: "us-west", - // Address: "10.10.10.10", - // Distro: "Linux", - // CustomLabels: map[string]string{"foo": "bar"}, - // }, - // }) - // }) + t.Run("Reregister with different node name (re-register)", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + Address: "node-address-4", + Region: "region-4", + }) + + assert.NotEmpty(t, nodeID) + assert.NotEmpty(t, pmmAgentID) + + body := node.RegisterNodeBody{ + NodeName: nodeName + "_new", + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + Address: "node-address-4", + Region: "region-4", + Reregister: true, + } + params := node.RegisterNodeParams{ + Context: pmmapitests.Context, + Body: body, + } + node, err := client.Default.Node.RegisterNode(¶ms) + assert.NoError(t, err) + + defer pmmapitests.UnregisterNodes(t, node.Payload.GenericNode.NodeID) + _, ok := assertNodeExporterCreated(t, node.Payload.PMMAgent.AgentID) + if ok { + defer RemovePMMAgentWithSubAgents(t, node.Payload.PMMAgent.AgentID) + } + }) + + t.Run("With all fields", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name") + machineID := pmmapitests.TestString(t, "machine-id") + nodeModel := pmmapitests.TestString(t, "node-model") + body := node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + MachineID: machineID, + NodeModel: nodeModel, + Az: "eu", + Region: "us-west", + Address: "10.10.10.10", + Distro: "Linux", + CustomLabels: map[string]string{"foo": "bar"}, + DisableCollectors: []string{"diskstats", "filesystem", "standard.process"}, + } + nodeID, pmmAgentID := RegisterGenericNode(t, body) + defer pmmapitests.UnregisterNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // Check Node is created + assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + Generic: &nodes.GetNodeOKBodyGeneric{ + NodeID: nodeID, + NodeName: nodeName, + MachineID: machineID, + NodeModel: nodeModel, + Az: "eu", + Region: "us-west", + Address: "10.10.10.10", + Distro: "Linux", + CustomLabels: map[string]string{"foo": "bar"}, + }, + }) + + // Check PMM Agent is created + assertPMMAgentCreated(t, nodeID, pmmAgentID) + + // Check Node Exporter is created + listAgentsOK, err := inventoryClient.Default.Agents.ListAgents(&agents.ListAgentsParams{ + Body: agents.ListAgentsBody{ + PMMAgentID: pmmAgentID, + }, + Context: pmmapitests.Context, + }) + assert.NoError(t, err) + require.Len(t, listAgentsOK.Payload.NodeExporter, 1) + nodeExporterAgentID := listAgentsOK.Payload.NodeExporter[0].AgentID + ok := assert.Equal(t, agents.ListAgentsOKBodyNodeExporterItems0{ + PMMAgentID: pmmAgentID, + AgentID: nodeExporterAgentID, + DisabledCollectors: []string{"diskstats", "filesystem", "standard.process"}, + PushMetricsEnabled: true, + Status: &AgentStatusUnknown, + }, *listAgentsOK.Payload.NodeExporter[0]) + + if ok { + defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) + } + }) + + t.Run("Re-register", func(t *testing.T) { + t.Skip("Re-register logic is not defined yet. https://jira.percona.com/browse/PMM-3717") + + nodeName := pmmapitests.TestString(t, "node-name") + nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + }) + defer pmmapitests.UnregisterNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // Check Node is created + assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + Generic: &nodes.GetNodeOKBodyGeneric{ + NodeID: nodeID, + NodeName: nodeName, + }, + }) + + // Re-register node + machineID := pmmapitests.TestString(t, "machine-id") + nodeModel := pmmapitests.TestString(t, "node-model") + newNodeID, newPMMAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), + MachineID: machineID, + NodeModel: nodeModel, + Az: "eu", + Region: "us-west", + Address: "10.10.10.10", + Distro: "Linux", + CustomLabels: map[string]string{"foo": "bar"}, + }) + if !assert.Equal(t, nodeID, newNodeID) { + defer pmmapitests.UnregisterNodes(t, newNodeID) + } + if !assert.Equal(t, pmmAgentID, newPMMAgentID) { + defer pmmapitests.RemoveAgents(t, newPMMAgentID) + } + + // Check Node fields is updated + assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + Generic: &nodes.GetNodeOKBodyGeneric{ + NodeID: nodeID, + NodeName: nodeName, + MachineID: machineID, + NodeModel: nodeModel, + Az: "eu", + Region: "us-west", + Address: "10.10.10.10", + Distro: "Linux", + CustomLabels: map[string]string{"foo": "bar"}, + }, + }) + }) + }) + + t.Run("Container Node", func(t *testing.T) { + t.Run("Basic", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name") + nodeID, pmmAgentID := registerContainerNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), + }) + defer pmmapitests.UnregisterNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // Check Node is created + assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + Container: &nodes.GetNodeOKBodyContainer{ + NodeID: nodeID, + NodeName: nodeName, + }, + }) + + // Check PMM Agent is created + assertPMMAgentCreated(t, nodeID, pmmAgentID) + + // Check Node Exporter is created + nodeExporterAgentID, ok := assertNodeExporterCreated(t, pmmAgentID) + if ok { + defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) + } + }) + + t.Run("With all fields", func(t *testing.T) { + nodeName := pmmapitests.TestString(t, "node-name") + nodeModel := pmmapitests.TestString(t, "node-model") + containerID := pmmapitests.TestString(t, "container-id") + containerName := pmmapitests.TestString(t, "container-name") + body := node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), + NodeModel: nodeModel, + ContainerID: containerID, + ContainerName: containerName, + Az: "eu", + Region: "us-west", + Address: "10.10.10.10", + CustomLabels: map[string]string{"foo": "bar"}, + } + nodeID, pmmAgentID := registerContainerNode(t, body) + defer pmmapitests.UnregisterNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // Check Node is created + assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + Container: &nodes.GetNodeOKBodyContainer{ + NodeID: nodeID, + NodeName: nodeName, + NodeModel: nodeModel, + ContainerID: containerID, + ContainerName: containerName, + Az: "eu", + Region: "us-west", + Address: "10.10.10.10", + CustomLabels: map[string]string{"foo": "bar"}, + }, + }) + + // Check PMM Agent is created + assertPMMAgentCreated(t, nodeID, pmmAgentID) + + // Check Node Exporter is created + nodeExporterAgentID, ok := assertNodeExporterCreated(t, pmmAgentID) + if ok { + defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) + } + }) + + t.Run("Re-register", func(t *testing.T) { + t.Skip("Re-register logic is not defined yet. https://jira.percona.com/browse/PMM-3717") + + nodeName := pmmapitests.TestString(t, "node-name") + nodeID, pmmAgentID := registerContainerNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), + }) + defer pmmapitests.UnregisterNodes(t, nodeID) + defer RemovePMMAgentWithSubAgents(t, pmmAgentID) + + // Check Node is created + assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + Generic: &nodes.GetNodeOKBodyGeneric{ + NodeID: nodeID, + NodeName: nodeName, + }, + }) + + // Re-register node + nodeModel := pmmapitests.TestString(t, "node-model") + containerID := pmmapitests.TestString(t, "container-id") + containerName := pmmapitests.TestString(t, "container-name") + newNodeID, newPMMAgentID := registerContainerNode(t, node.RegisterNodeBody{ + NodeName: nodeName, + NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), + ContainerID: containerID, + ContainerName: containerName, + NodeModel: nodeModel, + Az: "eu", + Region: "us-west", + Address: "10.10.10.10", + CustomLabels: map[string]string{"foo": "bar"}, + }) + if !assert.Equal(t, nodeID, newNodeID) { + defer pmmapitests.UnregisterNodes(t, newNodeID) + } + if !assert.Equal(t, pmmAgentID, newPMMAgentID) { + defer pmmapitests.RemoveAgents(t, newPMMAgentID) + } + + // Check Node fields is updated + assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ + Container: &nodes.GetNodeOKBodyContainer{ + NodeID: nodeID, + NodeName: nodeName, + ContainerID: containerID, + ContainerName: containerName, + NodeModel: nodeModel, + Az: "eu", + Region: "us-west", + Address: "10.10.10.10", + CustomLabels: map[string]string{"foo": "bar"}, + }, + }) + }) }) - // t.Run("Container Node", func(t *testing.T) { - // t.Run("Basic", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name") - // nodeID, pmmAgentID := registerContainerNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), - // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // // Check Node is created - // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - // Container: &nodes.GetNodeOKBodyContainer{ - // NodeID: nodeID, - // NodeName: nodeName, - // }, - // }) - - // // Check PMM Agent is created - // assertPMMAgentCreated(t, nodeID, pmmAgentID) - - // // Check Node Exporter is created - // nodeExporterAgentID, ok := assertNodeExporterCreated(t, pmmAgentID) - // if ok { - // defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) - // } - // }) - - // t.Run("With all fields", func(t *testing.T) { - // nodeName := pmmapitests.TestString(t, "node-name") - // nodeModel := pmmapitests.TestString(t, "node-model") - // containerID := pmmapitests.TestString(t, "container-id") - // containerName := pmmapitests.TestString(t, "container-name") - // body := node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), - // NodeModel: nodeModel, - // ContainerID: containerID, - // ContainerName: containerName, - // Az: "eu", - // Region: "us-west", - // Address: "10.10.10.10", - // CustomLabels: map[string]string{"foo": "bar"}, - // } - // nodeID, pmmAgentID := registerContainerNode(t, body) - // defer pmmapitests.UnregisterNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // // Check Node is created - // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - // Container: &nodes.GetNodeOKBodyContainer{ - // NodeID: nodeID, - // NodeName: nodeName, - // NodeModel: nodeModel, - // ContainerID: containerID, - // ContainerName: containerName, - // Az: "eu", - // Region: "us-west", - // Address: "10.10.10.10", - // CustomLabels: map[string]string{"foo": "bar"}, - // }, - // }) - - // // Check PMM Agent is created - // assertPMMAgentCreated(t, nodeID, pmmAgentID) - - // // Check Node Exporter is created - // nodeExporterAgentID, ok := assertNodeExporterCreated(t, pmmAgentID) - // if ok { - // defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) - // } - // }) - - // t.Run("Re-register", func(t *testing.T) { - // t.Skip("Re-register logic is not defined yet. https://jira.percona.com/browse/PMM-3717") - - // nodeName := pmmapitests.TestString(t, "node-name") - // nodeID, pmmAgentID := registerContainerNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), - // }) - // defer pmmapitests.UnregisterNodes(t, nodeID) - // defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // // Check Node is created - // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - // Generic: &nodes.GetNodeOKBodyGeneric{ - // NodeID: nodeID, - // NodeName: nodeName, - // }, - // }) - - // // Re-register node - // nodeModel := pmmapitests.TestString(t, "node-model") - // containerID := pmmapitests.TestString(t, "container-id") - // containerName := pmmapitests.TestString(t, "container-name") - // newNodeID, newPMMAgentID := registerContainerNode(t, node.RegisterNodeBody{ - // NodeName: nodeName, - // NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), - // ContainerID: containerID, - // ContainerName: containerName, - // NodeModel: nodeModel, - // Az: "eu", - // Region: "us-west", - // Address: "10.10.10.10", - // CustomLabels: map[string]string{"foo": "bar"}, - // }) - // if !assert.Equal(t, nodeID, newNodeID) { - // defer pmmapitests.UnregisterNodes(t, newNodeID) - // } - // if !assert.Equal(t, pmmAgentID, newPMMAgentID) { - // defer pmmapitests.RemoveAgents(t, newPMMAgentID) - // } - - // // Check Node fields is updated - // assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - // Container: &nodes.GetNodeOKBodyContainer{ - // NodeID: nodeID, - // NodeName: nodeName, - // ContainerID: containerID, - // ContainerName: containerName, - // NodeModel: nodeModel, - // Az: "eu", - // Region: "us-west", - // Address: "10.10.10.10", - // CustomLabels: map[string]string{"foo": "bar"}, - // }, - // }) - // }) - // }) - - // t.Run("Empty node name", func(t *testing.T) { - // params := node.RegisterNodeParams{ - // Context: pmmapitests.Context, - // Body: node.RegisterNodeBody{}, - // } - // registerOK, err := client.Default.Node.RegisterNode(¶ms) - // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid RegisterNodeRequest.NodeName: value length must be at least 1 runes") - // require.Nil(t, registerOK) - // }) - - // t.Run("Unsupported node type", func(t *testing.T) { - // params := node.RegisterNodeParams{ - // Context: pmmapitests.Context, - // Body: node.RegisterNodeBody{ - // NodeName: pmmapitests.TestString(t, "node-name"), - // }, - // } - // registerOK, err := client.Default.Node.RegisterNode(¶ms) - // pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, `Unsupported Node type "NODE_TYPE_INVALID".`) - // require.Nil(t, registerOK) - // }) + t.Run("Empty node name", func(t *testing.T) { + params := node.RegisterNodeParams{ + Context: pmmapitests.Context, + Body: node.RegisterNodeBody{}, + } + registerOK, err := client.Default.Node.RegisterNode(¶ms) + pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, "invalid RegisterNodeRequest.NodeName: value length must be at least 1 runes") + require.Nil(t, registerOK) + }) + + t.Run("Unsupported node type", func(t *testing.T) { + params := node.RegisterNodeParams{ + Context: pmmapitests.Context, + Body: node.RegisterNodeBody{ + NodeName: pmmapitests.TestString(t, "node-name"), + }, + } + registerOK, err := client.Default.Node.RegisterNode(¶ms) + pmmapitests.AssertAPIErrorf(t, err, 400, codes.InvalidArgument, `Unsupported Node type "NODE_TYPE_INVALID".`) + require.Nil(t, registerOK) + }) } diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index 391458fdcb..6cba70bd32 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -277,9 +277,20 @@ func TestBasicAuthPermissions(t *testing.T) { adminID := createUserWithRole(t, admin, "Admin") defer deleteUser(t, adminID) + _, viewerAPIKey := createAPIKeyWithRole(t, "api-"+viewer, "Viewer") + // TO DO after auth API key becames Service Account/Token + //defer deleteAPIKey(t, viewerAPIKeyID) + + _, editorAPIKey := createAPIKeyWithRole(t, "api-"+editor, "Editor") + //defer deleteAPIKey(t, editorAPIKeyID) + + _, adminAPIKey := createAPIKeyWithRole(t, "api-"+admin, "Admin") + //defer deleteAPIKey(t, adminAPIKeyID) + type userCase struct { userType string login string + apiKey string statusCode int } @@ -291,15 +302,15 @@ func TestBasicAuthPermissions(t *testing.T) { }{ {name: "settings", url: "/v1/Settings/Get", method: "POST", userCase: []userCase{ {userType: "default", login: none, statusCode: 401}, - {userType: "viewer", login: viewer, statusCode: 401}, - {userType: "editor", login: editor, statusCode: 401}, - {userType: "admin", login: admin, statusCode: 200}, + {userType: "viewer", login: viewer, apiKey: viewerAPIKey, statusCode: 401}, + {userType: "editor", login: editor, apiKey: editorAPIKey, statusCode: 401}, + {userType: "admin", login: admin, apiKey: adminAPIKey, statusCode: 200}, }}, {name: "platform-connect", url: "/v1/Platform/Connect", method: "POST", userCase: []userCase{ {userType: "default", login: none, statusCode: 401}, - {userType: "viewer", login: viewer, statusCode: 401}, - {userType: "editor", login: editor, statusCode: 401}, - {userType: "admin", login: admin, statusCode: 400}, // We send bad request, but have access to endpoint + {userType: "viewer", login: viewer, apiKey: viewerAPIKey, statusCode: 401}, + {userType: "editor", login: editor, apiKey: editorAPIKey, statusCode: 401}, + {userType: "admin", login: admin, apiKey: adminAPIKey, statusCode: 400}, // We send bad request, but have access to endpoint }}, } @@ -324,6 +335,48 @@ func TestBasicAuthPermissions(t *testing.T) { assert.Equal(t, user.statusCode, resp.StatusCode) }) + + t.Run(fmt.Sprintf("API Key auth %s", user.userType), func(t *testing.T) { + if user.apiKey == "" { + t.Skip("API Key is not exist") + } + // make a BaseURL without authentication + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.User = nil + u.Path = test.url + + req, err := http.NewRequestWithContext(pmmapitests.Context, test.method, u.String(), nil) + require.NoError(t, err) + + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", user.apiKey)) + + resp, err := http.DefaultClient.Do(req) + require.NoError(t, err) + defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint + + assert.Equal(t, user.statusCode, resp.StatusCode) + }) + + t.Run(fmt.Sprintf("API Key Basic auth %s", user.userType), func(t *testing.T) { + if user.apiKey == "" { + t.Skip("API Key is not exist") + } + // make a BaseURL without authentication + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.User = url.UserPassword("api_key", user.apiKey) + u.Path = test.url + + req, err := http.NewRequestWithContext(pmmapitests.Context, test.method, u.String(), nil) + require.NoError(t, err) + + resp, err := http.DefaultClient.Do(req) + require.NoError(t, err) + defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint + + assert.Equal(t, user.statusCode, resp.StatusCode) + }) } }) } @@ -408,8 +461,8 @@ func setRole(t *testing.T, userID int, role string) { func TestServiceAccountPermissions(t *testing.T) { // service account role options: viewer, editor, admin // service token role options: editor, admin - // basic auth format is skipped, endpoint /auth/serviceaccount (to get info about token) requires Bearer authorization - // service_token:token could be used in pmm-agent and pmm-admin (its transformed into Bearer authorization) + // basic auth format is skipped, endpoint /auth/serviceaccount (to get info about currently used token in request) requires Bearer authorization + // service_token:token format could be used in pmm-agent and pmm-admin (its transformed into Bearer authorization) nodeName := "test-node" viewerNodeName := fmt.Sprintf("%s-viewer", nodeName) @@ -448,12 +501,6 @@ func TestServiceAccountPermissions(t *testing.T) { {userType: "editor", serviceToken: editorToken, statusCode: 401}, {userType: "admin", serviceToken: adminToken, statusCode: 200}, }}, - {name: "alerts-default", url: "/alertmanager/api/v2/alerts", method: http.MethodGet, userCase: []userCase{ - {userType: "default", statusCode: 401}, - {userType: "viewer", serviceToken: viewerToken, statusCode: 401}, - {userType: "editor", serviceToken: editorToken, statusCode: 401}, - {userType: "admin", serviceToken: adminToken, statusCode: 200}, - }}, {name: "platform-connect", url: "/v1/Platform/Connect", method: "POST", userCase: []userCase{ {userType: "default", statusCode: 401}, {userType: "viewer", serviceToken: viewerToken, statusCode: 401}, @@ -506,6 +553,72 @@ func TestServiceAccountPermissions(t *testing.T) { } } +// XX + +func deleteAPIKey(t *testing.T, apiKeyID int) { + t.Helper() + // https://grafana.com/docs/grafana/latest/http_api/auth/#delete-api-key + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.Path = "/graph/api/auth/keys/" + strconv.Itoa(apiKeyID) + + req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodDelete, u.String(), nil) + require.NoError(t, err) + + resp, b := doRequest(t, http.DefaultClient, req) + defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint + + require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete API Key, status code: %d, response: %s", resp.StatusCode, b) +} + +func createAPIKeyWithRole(t *testing.T, name, role string) (int, string) { + t.Helper() + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.Path = "/graph/api/auth/keys" + + // https://grafana.com/docs/grafana/latest/http_api/auth/#create-api-key + data, err := json.Marshal(map[string]string{ + "name": name, + "role": role, + }) + require.NoError(t, err) + + req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodPost, u.String(), bytes.NewReader(data)) + require.NoError(t, err) + + req.Header.Set("Content-Type", "application/json; charset=utf-8") + + resp, b := doRequest(t, http.DefaultClient, req) + defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint + + require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to create API key, status code: %d, response: %s", resp.StatusCode, b) + + var m map[string]interface{} + err = json.Unmarshal(b, &m) + require.NoError(t, err) + apiKey := m["key"].(string) + + u.User = nil + u.Path = "/graph/api/auth/key" + req, err = http.NewRequestWithContext(pmmapitests.Context, http.MethodGet, u.String(), bytes.NewReader(data)) + require.NoError(t, err) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey)) + + resp1, b := doRequest(t, http.DefaultClient, req) + defer resp1.Body.Close() //nolint:gosec,errcheck,nolintlint + + require.Equalf(t, http.StatusOK, resp1.StatusCode, "failed to get API key, status code: %d, response: %s", resp1.StatusCode, b) + + var k map[string]interface{} + err = json.Unmarshal(b, &k) + require.NoError(t, err) + + apiKeyID := int(k["id"].(float64)) + + return apiKeyID, apiKey +} + func createServiceAccountWithRole(t *testing.T, role, nodeName string) int { t.Helper() u, err := url.Parse(pmmapitests.BaseURL.String()) From e02d9c73237f85cab40c7f614a296063c0929726 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 17 Jan 2024 11:17:21 +0100 Subject: [PATCH 097/126] PMM-12251 Cleanup for migrated API keys in API tests. --- api-tests/server/auth_test.go | 61 ++++++++++++++++++------------ managed/services/grafana/client.go | 3 -- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index 6cba70bd32..fc64fb95cc 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -278,14 +278,12 @@ func TestBasicAuthPermissions(t *testing.T) { defer deleteUser(t, adminID) _, viewerAPIKey := createAPIKeyWithRole(t, "api-"+viewer, "Viewer") - // TO DO after auth API key becames Service Account/Token - //defer deleteAPIKey(t, viewerAPIKeyID) - _, editorAPIKey := createAPIKeyWithRole(t, "api-"+editor, "Editor") - //defer deleteAPIKey(t, editorAPIKeyID) - _, adminAPIKey := createAPIKeyWithRole(t, "api-"+admin, "Admin") - //defer deleteAPIKey(t, adminAPIKeyID) + defer func() { + // After auth API keys becames Service Accounts/Tokens + deleteServiceAccountsMirgatedFromAPIKeys(t) + }() type userCase struct { userType string @@ -553,24 +551,6 @@ func TestServiceAccountPermissions(t *testing.T) { } } -// XX - -func deleteAPIKey(t *testing.T, apiKeyID int) { - t.Helper() - // https://grafana.com/docs/grafana/latest/http_api/auth/#delete-api-key - u, err := url.Parse(pmmapitests.BaseURL.String()) - require.NoError(t, err) - u.Path = "/graph/api/auth/keys/" + strconv.Itoa(apiKeyID) - - req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodDelete, u.String(), nil) - require.NoError(t, err) - - resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint - - require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete API Key, status code: %d, response: %s", resp.StatusCode, b) -} - func createAPIKeyWithRole(t *testing.T, name, role string) (int, string) { t.Helper() u, err := url.Parse(pmmapitests.BaseURL.String()) @@ -681,6 +661,39 @@ func deleteServiceAccount(t *testing.T, serviceAccountID int) { require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete service account, status code: %d, response: %s", resp.StatusCode, b) } +func deleteServiceAccountsMirgatedFromAPIKeys(t *testing.T) { + t.Helper() + type serviceAccount struct { + ID int `json:"id"` + Name string `json:"name"` + } + type serviceAccountSearch struct { + ServiceAccounts []serviceAccount `json:"serviceAccounts"` + } + var res serviceAccountSearch + + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.Path = "/graph/api/serviceaccounts/search" + migratedServiceAccountKeyword := "autogen" + u.RawQuery = url.QueryEscape(fmt.Sprintf("query=%s", migratedServiceAccountKeyword)) + + u.ForceQuery = true + req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodGet, u.String(), nil) + require.NoError(t, err) + + resp, b := doRequest(t, http.DefaultClient, req) + defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint + require.NoError(t, json.Unmarshal(b, &res)) + + for _, serviceAccount := range res.ServiceAccounts { + if !strings.Contains(serviceAccount.Name, migratedServiceAccountKeyword) { + continue + } + deleteServiceAccount(t, serviceAccount.ID) + } +} + func createServiceToken(t *testing.T, serviceAccountID int, nodeName string) (int, string) { t.Helper() u, err := url.Parse(pmmapitests.BaseURL.String()) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 01d9f9c0a5..8ca35908e4 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -345,14 +345,11 @@ type serviceAccountSearch struct { func (c *Client) getServiceAccountIDFromName(ctx context.Context, nodeName string, authHeaders http.Header) (int, error) { var res serviceAccountSearch - // TODO add prefix serviceTokenName := fmt.Sprintf("%s-%s", pmmServiceTokenName, nodeName)? serviceAccountName := fmt.Sprintf("%s-%s", pmmServiceAccountName, nodeName) if err := c.do(ctx, http.MethodGet, "/api/serviceaccounts/search", fmt.Sprintf("query=%s", serviceAccountName), authHeaders, nil, &res); err != nil { return 0, err } - fmt.Println(res.TotalCount) for _, serviceAccount := range res.ServiceAccounts { - fmt.Println(serviceAccount.Name + "!=" + serviceAccountName) if serviceAccount.Name != serviceAccountName { continue } From a80a68649371f2b8ef3eef8781ee3ccea04eeb09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 17 Jan 2024 12:12:12 +0100 Subject: [PATCH 098/126] PMM-12251 Cleanup for tests. --- api-tests/management/nodes_test.go | 60 +----------------------------- 1 file changed, 2 insertions(+), 58 deletions(-) diff --git a/api-tests/management/nodes_test.go b/api-tests/management/nodes_test.go index 349efc4412..141523f530 100644 --- a/api-tests/management/nodes_test.go +++ b/api-tests/management/nodes_test.go @@ -150,9 +150,9 @@ func TestNodeRegister(t *testing.T) { Address: "node-address-4", Region: "region-4", }) - assert.NotEmpty(t, nodeID) assert.NotEmpty(t, pmmAgentID) + pmmapitests.UnregisterNodes(t, nodeID) body := node.RegisterNodeBody{ NodeName: nodeName + "_new", @@ -235,62 +235,6 @@ func TestNodeRegister(t *testing.T) { defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) } }) - - t.Run("Re-register", func(t *testing.T) { - t.Skip("Re-register logic is not defined yet. https://jira.percona.com/browse/PMM-3717") - - nodeName := pmmapitests.TestString(t, "node-name") - nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - }) - defer pmmapitests.UnregisterNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // Check Node is created - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Generic: &nodes.GetNodeOKBodyGeneric{ - NodeID: nodeID, - NodeName: nodeName, - }, - }) - - // Re-register node - machineID := pmmapitests.TestString(t, "machine-id") - nodeModel := pmmapitests.TestString(t, "node-model") - newNodeID, newPMMAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), - MachineID: machineID, - NodeModel: nodeModel, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - Distro: "Linux", - CustomLabels: map[string]string{"foo": "bar"}, - }) - if !assert.Equal(t, nodeID, newNodeID) { - defer pmmapitests.UnregisterNodes(t, newNodeID) - } - if !assert.Equal(t, pmmAgentID, newPMMAgentID) { - defer pmmapitests.RemoveAgents(t, newPMMAgentID) - } - - // Check Node fields is updated - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Generic: &nodes.GetNodeOKBodyGeneric{ - NodeID: nodeID, - NodeName: nodeName, - MachineID: machineID, - NodeModel: nodeModel, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - Distro: "Linux", - CustomLabels: map[string]string{"foo": "bar"}, - }, - }) - }) }) t.Run("Container Node", func(t *testing.T) { @@ -338,7 +282,7 @@ func TestNodeRegister(t *testing.T) { CustomLabels: map[string]string{"foo": "bar"}, } nodeID, pmmAgentID := registerContainerNode(t, body) - defer pmmapitests.UnregisterNodes(t, nodeID) + defer pmmapitests.RemoveNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // Check Node is created From 1ae7ec8cde71d0129f6af1863786f0608853262b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 17 Jan 2024 12:21:49 +0100 Subject: [PATCH 099/126] PMM-12251 Add log error. --- managed/services/management/node.go | 1 + 1 file changed, 1 insertion(+) diff --git a/managed/services/management/node.go b/managed/services/management/node.go index e4be97a3fc..b685ec3939 100644 --- a/managed/services/management/node.go +++ b/managed/services/management/node.go @@ -161,6 +161,7 @@ func (s *NodeService) Unregister(ctx context.Context, req *managementpb.Unregist warning, err := s.ap.DeleteServiceAccount(ctx, node.NodeName, req.Force) if err != nil { + s.l.WithError(err).Error("deleting service account") return &managementpb.UnregisterNodeResponse{ Warning: err.Error(), }, nil From 6f1387dc555418982f61851c4248128dd9150048 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 17 Jan 2024 12:26:01 +0100 Subject: [PATCH 100/126] PMM-12251 Lint. --- api-tests/helpers.go | 2 +- api-tests/server/auth_test.go | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/api-tests/helpers.go b/api-tests/helpers.go index 5442f24409..4d2730717a 100644 --- a/api-tests/helpers.go +++ b/api-tests/helpers.go @@ -142,7 +142,7 @@ func UnregisterNodes(t TestingT, nodeIDs ...string) { } res, err := client.Default.Node.UnregisterNode(params) - assert.NoError(t, err) + require.NoError(t, err) assert.NotNil(t, res) assert.NotNil(t, res.Payload) assert.Empty(t, res.Payload.Warning) diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index fc64fb95cc..9147b2bb3f 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -250,7 +250,7 @@ func doRequest(tb testing.TB, client *http.Client, req *http.Request) (*http.Res resp, err := client.Do(req) require.NoError(tb, err) - defer resp.Body.Close() //nolint:gosec,errcheck + defer resp.Body.Close() //nolint:errcheck b, err := io.ReadAll(resp.Body) require.NoError(tb, err) @@ -526,7 +526,7 @@ func TestServiceAccountPermissions(t *testing.T) { resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec,errcheck + defer resp.Body.Close() //nolint:errcheck assert.Equal(t, user.statusCode, resp.StatusCode) }) @@ -542,7 +542,7 @@ func TestServiceAccountPermissions(t *testing.T) { resp, err := http.DefaultClient.Do(req) require.NoError(t, err) - defer resp.Body.Close() //nolint:gosec,errcheck + defer resp.Body.Close() //nolint:errcheck assert.Equal(t, user.statusCode, resp.StatusCode) }) From 63428b722131d943447e4c8447ea43f692479912 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 17 Jan 2024 12:57:05 +0100 Subject: [PATCH 101/126] PMM-12251 Another fix for very long service accounts names. --- api-tests/management/nodes_test.go | 8 +++----- managed/services/grafana/client.go | 2 ++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/api-tests/management/nodes_test.go b/api-tests/management/nodes_test.go index 141523f530..e169ade13e 100644 --- a/api-tests/management/nodes_test.go +++ b/api-tests/management/nodes_test.go @@ -115,11 +115,9 @@ func TestNodeRegister(t *testing.T) { }) t.Run("Reregister with different node name (no re-register - should fail)", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") - //TODO too long, grafana limit 190? - fmt.Println(nodeName[:50]) + nodeName := pmmapitests.TestString(t, "all-fields") nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ - NodeName: nodeName[:50], + NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), Address: "node-address-3", Region: "region-3", @@ -128,7 +126,7 @@ func TestNodeRegister(t *testing.T) { defer RemovePMMAgentWithSubAgents(t, pmmAgentID) body := node.RegisterNodeBody{ - NodeName: nodeName[:50] + "_new", + NodeName: nodeName + "_new", NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), Address: "node-address-3", Region: "region-3", diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 8ca35908e4..29be25f86a 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -675,6 +675,8 @@ func (c *Client) createServiceAccount(ctx context.Context, role role, nodeName s return 0, errors.New("you cannot create service account with empty role") } + // Max length of service account name is 190 chars (default limit in Grafana). In reality it is 187. + // Some test could fail if you will have name longer than 187 chars. serviceAccountName := fmt.Sprintf("%s-%s", pmmServiceAccountName, nodeName) b, err := json.Marshal(serviceAccount{Name: serviceAccountName, Role: role.String(), Force: reregister}) if err != nil { From 1bf2d462165f4fd0d579c1b891479fa520a96897 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 17 Jan 2024 13:07:13 +0100 Subject: [PATCH 102/126] PMM-12251 Lint. --- api-tests/server/auth_test.go | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index 9147b2bb3f..6b71954ec7 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -277,11 +277,12 @@ func TestBasicAuthPermissions(t *testing.T) { adminID := createUserWithRole(t, admin, "Admin") defer deleteUser(t, adminID) - _, viewerAPIKey := createAPIKeyWithRole(t, "api-"+viewer, "Viewer") - _, editorAPIKey := createAPIKeyWithRole(t, "api-"+editor, "Editor") - _, adminAPIKey := createAPIKeyWithRole(t, "api-"+admin, "Admin") + const apiPrefix = "api" + _, viewerAPIKey := createAPIKeyWithRole(t, fmt.Sprintf("%s-%s", apiPrefix, viewer), "Viewer") + _, editorAPIKey := createAPIKeyWithRole(t, fmt.Sprintf("%s-%s", apiPrefix, editor), "Editor") + _, adminAPIKey := createAPIKeyWithRole(t, fmt.Sprintf("%s-%s", apiPrefix, admin), "Admin") defer func() { - // After auth API keys becames Service Accounts/Tokens + // After auth API keys becomes Service Accounts/Tokens deleteServiceAccountsMirgatedFromAPIKeys(t) }() @@ -618,7 +619,7 @@ func createServiceAccountWithRole(t *testing.T, role, nodeName string) int { req.Header.Set("Content-Type", "application/json; charset=utf-8") resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec,errcheck + defer resp.Body.Close() //nolint:errcheck require.Equalf(t, http.StatusCreated, resp.StatusCode, "failed to create Service account, status code: %d, response: %s", resp.StatusCode, b) @@ -639,7 +640,7 @@ func createServiceAccountWithRole(t *testing.T, role, nodeName string) int { req.Header.Set("Content-Type", "application/json; charset=utf-8") resp1, b := doRequest(t, http.DefaultClient, req) - defer resp1.Body.Close() //nolint:gosec,errcheck + defer resp1.Body.Close() //nolint:errcheck require.Equalf(t, http.StatusCreated, resp.StatusCode, "failed to set orgId=1 to Service account, status code: %d, response: %s", resp.StatusCode, b) @@ -733,7 +734,7 @@ func deleteServiceToken(t *testing.T, serviceAccountID, serviceTokenID int) { require.NoError(t, err) resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec,errcheck + defer resp.Body.Close() //nolint:errcheck require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete service token, status code: %d, response: %s", resp.StatusCode, b) } From f4fc6c3d0a5440177a2774b969c77cdecce22b0c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 18 Jan 2024 09:36:37 +0100 Subject: [PATCH 103/126] PMM-12251 Required changes in mock. --- managed/services/management/node_test.go | 44 ++++++++++++++++++------ 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index 78fb1f0d0d..03184bf105 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -36,14 +36,6 @@ import ( ) func TestNodeService(t *testing.T) { - var authProvider mockAuthProvider - authProvider.Test(t) - - serviceAccountID := int(0) - nodeName := "test-node" - reregister := false - force := true - t.Run("Register/Unregister", func(t *testing.T) { setup := func(t *testing.T) (ctx context.Context, s *NodeService, teardown func(t *testing.T)) { t.Helper() @@ -61,9 +53,15 @@ func TestNodeService(t *testing.T) { require.NoError(t, sqlDB.Close()) } + serviceAccountID := int(0) + nodeName := "test-node" + reregister := false + force := true + + var authProvider mockAuthProvider + authProvider.Test(t) authProvider.On("CreateServiceAccount", ctx, nodeName, reregister).Return(serviceAccountID, "test-token", nil) authProvider.On("DeleteServiceAccount", ctx, nodeName, force).Return("", nil) - s = NewNodeService(db, &authProvider) return @@ -106,8 +104,14 @@ func TestNodeService(t *testing.T) { }) t.Run("Reregister", func(t *testing.T) { - reregister = true + serviceAccountID := int(0) + nodeName := "test-node" + reregister := true + + var authProvider mockAuthProvider + authProvider.Test(t) authProvider.On("CreateServiceAccount", ctx, nodeName, reregister).Return(serviceAccountID, "test-token", nil) + s.ap = &authProvider res, err = s.Register(ctx, &managementpb.RegisterNodeRequest{ NodeType: inventorypb.NodeType_GENERIC_NODE, @@ -133,9 +137,16 @@ func TestNodeService(t *testing.T) { assert.Equal(t, expected, res) assert.NoError(t, err) }) + t.Run("Reregister-force", func(t *testing.T) { - nodeName = "test-node-new" + serviceAccountID := int(0) + nodeName := "test-node-new" + reregister := true + + var authProvider mockAuthProvider + authProvider.Test(t) authProvider.On("CreateServiceAccount", ctx, nodeName, reregister).Return(serviceAccountID, "test-token", nil) + s.ap = &authProvider res, err = s.Register(ctx, &managementpb.RegisterNodeRequest{ NodeType: inventorypb.NodeType_GENERIC_NODE, @@ -163,6 +174,17 @@ func TestNodeService(t *testing.T) { }) t.Run("Unregister", func(t *testing.T) { + serviceAccountID := int(0) + nodeName := "test-node" + reregister := true + force := true + + var authProvider mockAuthProvider + authProvider.Test(t) + authProvider.On("CreateServiceAccount", ctx, nodeName, reregister).Return(serviceAccountID, "test-token", nil) + authProvider.On("DeleteServiceAccount", ctx, nodeName, force).Return("", nil) + s.ap = &authProvider + resRegister, err := s.Register(ctx, &managementpb.RegisterNodeRequest{ NodeType: inventorypb.NodeType_GENERIC_NODE, NodeName: "test-node", From f43f9f402a794694b365fea362afdbb0373599bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 18 Jan 2024 10:08:35 +0100 Subject: [PATCH 104/126] PMM-12251 Lint. --- managed/services/management/node_test.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index 03184bf105..0743763308 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -36,6 +36,9 @@ import ( ) func TestNodeService(t *testing.T) { + getTestNodeName := func() string { + return "test-node" + } t.Run("Register/Unregister", func(t *testing.T) { setup := func(t *testing.T) (ctx context.Context, s *NodeService, teardown func(t *testing.T)) { t.Helper() @@ -54,7 +57,7 @@ func TestNodeService(t *testing.T) { } serviceAccountID := int(0) - nodeName := "test-node" + nodeName := getTestNodeName() reregister := false force := true @@ -105,7 +108,7 @@ func TestNodeService(t *testing.T) { t.Run("Reregister", func(t *testing.T) { serviceAccountID := int(0) - nodeName := "test-node" + nodeName := getTestNodeName() reregister := true var authProvider mockAuthProvider @@ -175,7 +178,7 @@ func TestNodeService(t *testing.T) { t.Run("Unregister", func(t *testing.T) { serviceAccountID := int(0) - nodeName := "test-node" + nodeName := getTestNodeName() reregister := true force := true From 5309788b294660846050d9fa05b91dfa8895716a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 18 Jan 2024 10:08:44 +0100 Subject: [PATCH 105/126] PMM-12251 Remove comment. --- agent/client/client.go | 7 ------- 1 file changed, 7 deletions(-) diff --git a/agent/client/client.go b/agent/client/client.go index c99d34cbb9..7ebf822988 100644 --- a/agent/client/client.go +++ b/agent/client/client.go @@ -747,13 +747,6 @@ func dial(dialCtx context.Context, cfg *config.Config, l *logrus.Entry) (*dialRe opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))) } - // if cfg.Server.Username != "" { - // opts = append(opts, grpc.WithPerRPCCredentials(&basicAuth{ - // username: cfg.Server.Username, - // password: cfg.Server.Password, - // })) - // } - l.Infof("Connecting to %s ...", cfg.Server.FilteredURL()) conn, err := grpc.DialContext(dialCtx, cfg.Server.Address, opts...) if err != nil { From 4c3a6518cea088968fd5fe6e773ceb5a5403ea2e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 18 Jan 2024 10:24:11 +0100 Subject: [PATCH 106/126] PMM-12251 Remove another duplicate test. --- api-tests/management/nodes_test.go | 57 ------------------------------ 1 file changed, 57 deletions(-) diff --git a/api-tests/management/nodes_test.go b/api-tests/management/nodes_test.go index e169ade13e..f574f8b127 100644 --- a/api-tests/management/nodes_test.go +++ b/api-tests/management/nodes_test.go @@ -307,63 +307,6 @@ func TestNodeRegister(t *testing.T) { defer pmmapitests.RemoveAgents(t, nodeExporterAgentID) } }) - - t.Run("Re-register", func(t *testing.T) { - t.Skip("Re-register logic is not defined yet. https://jira.percona.com/browse/PMM-3717") - - nodeName := pmmapitests.TestString(t, "node-name") - nodeID, pmmAgentID := registerContainerNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), - }) - defer pmmapitests.UnregisterNodes(t, nodeID) - defer RemovePMMAgentWithSubAgents(t, pmmAgentID) - - // Check Node is created - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Generic: &nodes.GetNodeOKBodyGeneric{ - NodeID: nodeID, - NodeName: nodeName, - }, - }) - - // Re-register node - nodeModel := pmmapitests.TestString(t, "node-model") - containerID := pmmapitests.TestString(t, "container-id") - containerName := pmmapitests.TestString(t, "container-name") - newNodeID, newPMMAgentID := registerContainerNode(t, node.RegisterNodeBody{ - NodeName: nodeName, - NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeCONTAINERNODE), - ContainerID: containerID, - ContainerName: containerName, - NodeModel: nodeModel, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - CustomLabels: map[string]string{"foo": "bar"}, - }) - if !assert.Equal(t, nodeID, newNodeID) { - defer pmmapitests.UnregisterNodes(t, newNodeID) - } - if !assert.Equal(t, pmmAgentID, newPMMAgentID) { - defer pmmapitests.RemoveAgents(t, newPMMAgentID) - } - - // Check Node fields is updated - assertNodeCreated(t, nodeID, nodes.GetNodeOKBody{ - Container: &nodes.GetNodeOKBodyContainer{ - NodeID: nodeID, - NodeName: nodeName, - ContainerID: containerID, - ContainerName: containerName, - NodeModel: nodeModel, - Az: "eu", - Region: "us-west", - Address: "10.10.10.10", - CustomLabels: map[string]string{"foo": "bar"}, - }, - }) - }) }) t.Run("Empty node name", func(t *testing.T) { From 71a7bd3000f0bdd5f57e5b34bcb8545a0848048c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 18 Jan 2024 10:47:28 +0100 Subject: [PATCH 107/126] PMM-12251 Seeds in generator, ctx. --- api-tests/helpers.go | 6 +++++- managed/services/management/node_test.go | 5 +++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/api-tests/helpers.go b/api-tests/helpers.go index 4d2730717a..17d5985428 100644 --- a/api-tests/helpers.go +++ b/api-tests/helpers.go @@ -21,6 +21,7 @@ import ( "math/rand" "reflect" "testing" + "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -50,7 +51,10 @@ type TestingT interface { func TestString(t TestingT, name string) string { t.Helper() - n := rand.Int() //nolint:gosec + // Without proper seed parallel tests can generate same "random" number. + // Since 1.20 rand.Seed is deprecated. + r := rand.New(rand.NewSource(time.Now().UnixNano())) + n := r.Int() //nolint:gosec return fmt.Sprintf("pmm-api-tests/%s/%s/%s/%d", Hostname, t.Name(), name, n) } diff --git a/managed/services/management/node_test.go b/managed/services/management/node_test.go index 0743763308..3241429229 100644 --- a/managed/services/management/node_test.go +++ b/managed/services/management/node_test.go @@ -23,6 +23,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" "gopkg.in/reform.v1" "gopkg.in/reform.v1/dialects/postgresql" @@ -55,6 +56,10 @@ func TestNodeService(t *testing.T) { require.NoError(t, sqlDB.Close()) } + md := metadata.New(map[string]string{ + "Authorization": "Basic username:password", + }) + ctx = metadata.NewIncomingContext(ctx, md) serviceAccountID := int(0) nodeName := getTestNodeName() From 62ea7cbefef5a6097f6ac7e036ade2df01fb3127 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 18 Jan 2024 11:33:20 +0100 Subject: [PATCH 108/126] PMM-12251 Cleanup. --- api-tests/management/postgresql_test.go | 10 ++++++---- api-tests/management/proxysql_test.go | 14 +++++++------- 2 files changed, 13 insertions(+), 11 deletions(-) diff --git a/api-tests/management/postgresql_test.go b/api-tests/management/postgresql_test.go index b1658bfdd9..4913e074cf 100644 --- a/api-tests/management/postgresql_test.go +++ b/api-tests/management/postgresql_test.go @@ -399,6 +399,7 @@ func TestAddPostgreSQL(t *testing.T) { newNodeID := addPostgreSQLOK.Payload.Service.NodeID require.NotEqual(t, nodeID, newNodeID) + defer pmmapitests.RemoveNodes(t, newNodeID) defer pmmapitests.RemoveServices(t, serviceID) defer removeServiceAgents(t, serviceID) @@ -457,6 +458,7 @@ func TestAddPostgreSQL(t *testing.T) { remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) remoteNodeID := remoteNodeOKBody.Remote.NodeID + defer pmmapitests.RemoveNodes(t, remoteNodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &postgresql.AddPostgreSQLParams{ @@ -483,7 +485,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &postgresql.AddPostgreSQLParams{ @@ -501,7 +503,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -525,7 +527,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -550,7 +552,7 @@ func TestAddPostgreSQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") diff --git a/api-tests/management/proxysql_test.go b/api-tests/management/proxysql_test.go index cb4cd8c98b..99437ba7e0 100644 --- a/api-tests/management/proxysql_test.go +++ b/api-tests/management/proxysql_test.go @@ -368,7 +368,7 @@ func TestAddProxySQL(t *testing.T) { newNodeID := addProxySQLOK.Payload.Service.NodeID require.NotEqual(t, nodeID, newNodeID) - defer pmmapitests.UnregisterNodes(t, newNodeID) + defer pmmapitests.RemoveNodes(t, newNodeID) defer pmmapitests.RemoveServices(t, serviceID) defer removeServiceAgents(t, serviceID) @@ -425,7 +425,7 @@ func TestAddProxySQL(t *testing.T) { remoteNodeOKBody := pmmapitests.AddRemoteNode(t, pmmapitests.TestString(t, "Remote Node for wrong type test")) remoteNodeID := remoteNodeOKBody.Remote.NodeID - defer pmmapitests.UnregisterNodes(t, remoteNodeID) + defer pmmapitests.RemoveNodes(t, remoteNodeID) serviceName := pmmapitests.TestString(t, "service-name") params := &proxysql.AddProxySQLParams{ @@ -452,7 +452,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) params := &proxysql.AddProxySQLParams{ @@ -470,7 +470,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -494,7 +494,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -547,7 +547,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") @@ -571,7 +571,7 @@ func TestAddProxySQL(t *testing.T) { NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), }) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) serviceName := pmmapitests.TestString(t, "service-name") From 69c1c6d08989dbc9b27935fa2c66cbdaea4dd7fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 18 Jan 2024 11:52:01 +0100 Subject: [PATCH 109/126] PMM-12251 Make test names/SA names shorter due to limit. --- api-tests/management/mongodb_test.go | 4 ++-- api-tests/management/nodes_test.go | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/api-tests/management/mongodb_test.go b/api-tests/management/mongodb_test.go index e224d9c740..eb677c06fe 100644 --- a/api-tests/management/mongodb_test.go +++ b/api-tests/management/mongodb_test.go @@ -108,7 +108,7 @@ func TestAddMongoDB(t *testing.T) { }) t.Run("With agents", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + nodeName := pmmapitests.TestString(t, "all-fields") nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), @@ -196,7 +196,7 @@ func TestAddMongoDB(t *testing.T) { }) t.Run("With labels", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + nodeName := pmmapitests.TestString(t, "all-fields") nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), diff --git a/api-tests/management/nodes_test.go b/api-tests/management/nodes_test.go index f574f8b127..46d6b02c23 100644 --- a/api-tests/management/nodes_test.go +++ b/api-tests/management/nodes_test.go @@ -58,7 +58,7 @@ func TestNodeRegister(t *testing.T) { }) t.Run("Reregister with same node name (no re-register - should fail)", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + nodeName := pmmapitests.TestString(t, "all-fields") nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), @@ -84,7 +84,7 @@ func TestNodeRegister(t *testing.T) { }) t.Run("Reregister with same node name (re-register)", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + nodeName := pmmapitests.TestString(t, "all-fields") nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), @@ -141,7 +141,7 @@ func TestNodeRegister(t *testing.T) { }) t.Run("Reregister with different node name (re-register)", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "node-name-for-all-fields") + nodeName := pmmapitests.TestString(t, "all-fields") nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), From f5364e0c482d7e7f967530b86f6440ba5150f212 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Fri, 19 Jan 2024 08:22:18 +0100 Subject: [PATCH 110/126] PMM-12251 Lint, formatting. --- api-tests/helpers.go | 11 ++++++----- api-tests/management/helpers.go | 1 - managed/utils/auth/token.go | 1 + 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/api-tests/helpers.go b/api-tests/helpers.go index 17d5985428..88aab6d740 100644 --- a/api-tests/helpers.go +++ b/api-tests/helpers.go @@ -17,11 +17,12 @@ package apitests import ( "context" + "crypto/rand" "fmt" - "math/rand" + "math" + "math/big" "reflect" "testing" - "time" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -52,9 +53,9 @@ func TestString(t TestingT, name string) string { t.Helper() // Without proper seed parallel tests can generate same "random" number. - // Since 1.20 rand.Seed is deprecated. - r := rand.New(rand.NewSource(time.Now().UnixNano())) - n := r.Int() //nolint:gosec + n, err := rand.Int(rand.Reader, big.NewInt(math.MaxInt32)) + require.NoError(t, err) + return fmt.Sprintf("pmm-api-tests/%s/%s/%s/%d", Hostname, t.Name(), name, n) } diff --git a/api-tests/management/helpers.go b/api-tests/management/helpers.go index 4bb81a86cb..ac2aa47e1d 100644 --- a/api-tests/management/helpers.go +++ b/api-tests/management/helpers.go @@ -41,7 +41,6 @@ func RegisterGenericNode(t pmmapitests.TestingT, body node.RegisterNodeBody) (st Context: pmmapitests.Context, Body: body, } - registerOK, err := client.Default.Node.RegisterNode(¶ms) require.NoError(t, err) require.NotNil(t, registerOK) diff --git a/managed/utils/auth/token.go b/managed/utils/auth/token.go index ae9c31f3ac..9ffe9ed1a9 100644 --- a/managed/utils/auth/token.go +++ b/managed/utils/auth/token.go @@ -71,5 +71,6 @@ func GetHeadersFromContext(ctx context.Context) (http.Header, error) { authHeaders.Add("Cookie", header) } } + return authHeaders, nil } From 8d73a6e5df4b3ccdc04e048b413ae1780925e03f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 23 Jan 2024 12:08:53 +0100 Subject: [PATCH 111/126] PMM-12251 Remove leftover code, fix node tests. --- api-tests/management/helpers.go | 6 ------ api-tests/management/nodes_test.go | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/api-tests/management/helpers.go b/api-tests/management/helpers.go index ac2aa47e1d..5edeabfe11 100644 --- a/api-tests/management/helpers.go +++ b/api-tests/management/helpers.go @@ -19,7 +19,6 @@ package management import ( "context" - httptransport "github.com/go-openapi/runtime/client" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" @@ -67,11 +66,6 @@ func registerContainerNode(t pmmapitests.TestingT, body node.RegisterNodeBody) ( require.NotNil(t, registerOK.Payload.ContainerNode) require.NotNil(t, registerOK.Payload.ContainerNode.NodeID) - current := client.DefaultTransportConfig() - transport := httptransport.New(current.Host, current.BasePath, current.Schemes) - transport.DefaultAuthentication = httptransport.BearerToken(registerOK.Payload.Token) - client.Default.SetTransport(transport) - return registerOK.Payload.ContainerNode.NodeID, registerOK.Payload.PMMAgent.AgentID } diff --git a/api-tests/management/nodes_test.go b/api-tests/management/nodes_test.go index 46d6b02c23..e9d53c799a 100644 --- a/api-tests/management/nodes_test.go +++ b/api-tests/management/nodes_test.go @@ -280,7 +280,7 @@ func TestNodeRegister(t *testing.T) { CustomLabels: map[string]string{"foo": "bar"}, } nodeID, pmmAgentID := registerContainerNode(t, body) - defer pmmapitests.RemoveNodes(t, nodeID) + defer pmmapitests.UnregisterNodes(t, nodeID) defer RemovePMMAgentWithSubAgents(t, pmmAgentID) // Check Node is created From 774c67f76e3fa0d776e4a6ef45afae37d053605b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Thu, 1 Feb 2024 09:13:43 +0100 Subject: [PATCH 112/126] Update docs/api/welcome/authentication.md Co-authored-by: Alex Demidoff --- docs/api/welcome/authentication.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api/welcome/authentication.md b/docs/api/welcome/authentication.md index 2a897a9063..cec8d37873 100644 --- a/docs/api/welcome/authentication.md +++ b/docs/api/welcome/authentication.md @@ -51,7 +51,7 @@ You can use the Service Token in basic authentication as well: curl -X GET -H 'Content-Type: application/json' \ https://service_token:glsa_Fp0ggev31R58ueNJbJgYw7fIGfO3yKWH_746383ab@127.0.0.1/v1/version ``` -Service Token has usually prefix "glsa_". If you convert it from API key it will persist same. If you will use API key then it will be automatically converted into Service Account and Service Token. +Service Token usually has "glsa_" prefix. If you convert it from API key, it will not change. If you use API key, then it will be automatically converted into Service Account and Service Token. API key example: ```shell From cc63dcbd9f7473305a17971d16b6b484c5213c55 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Thu, 1 Feb 2024 09:14:01 +0100 Subject: [PATCH 113/126] Update managed/services/grafana/client.go Co-authored-by: Alex Demidoff --- managed/services/grafana/client.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 29be25f86a..0e2305dd49 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -691,7 +691,7 @@ func (c *Client) createServiceAccount(ctx context.Context, role role, nodeName s serviceAccountID := int(m["id"].(float64)) //nolint:forcetypeassert // orgId is ignored during creating service account and default is -1 - // orgId should be setup to 1 + // orgId should be set to 1 if err = c.do(ctx, "PATCH", fmt.Sprintf("/api/serviceaccounts/%d", serviceAccountID), "", authHeaders, []byte("{\"orgId\": 1}"), &m); err != nil { return 0, err } From 9c01dd62ac533f3115a1cbc628772e05c0a31780 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 1 Feb 2024 09:19:29 +0100 Subject: [PATCH 114/126] PMM-12251 Add debug error message. --- managed/utils/auth/token.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/managed/utils/auth/token.go b/managed/utils/auth/token.go index 9ffe9ed1a9..0842bfba54 100644 --- a/managed/utils/auth/token.go +++ b/managed/utils/auth/token.go @@ -24,6 +24,7 @@ import ( "strings" "github.com/gogo/status" + "github.com/sirupsen/logrus" "google.golang.org/grpc/codes" "google.golang.org/grpc/metadata" ) @@ -38,6 +39,7 @@ func GetTokenFromHeaders(authHeaders http.Header) string { h := strings.TrimPrefix(authHeader, "Basic") t, err := base64.StdEncoding.DecodeString(strings.TrimSpace(h)) if err != nil { + logrus.Debugf("cannot decode basic authorization header: %s", err) return "" } tk := string(t) From 51dd142cee02749b165e522358c7ecc8adaedf39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 8 Feb 2024 10:21:51 +0100 Subject: [PATCH 115/126] PMM-12251 Handle of non migrated API keys. --- api-tests/server/auth_test.go | 62 +++++++++++------------------- managed/services/grafana/client.go | 23 +++++++++++ 2 files changed, 45 insertions(+), 40 deletions(-) diff --git a/api-tests/server/auth_test.go b/api-tests/server/auth_test.go index 6b71954ec7..a7c17e7c3c 100644 --- a/api-tests/server/auth_test.go +++ b/api-tests/server/auth_test.go @@ -278,13 +278,12 @@ func TestBasicAuthPermissions(t *testing.T) { defer deleteUser(t, adminID) const apiPrefix = "api" - _, viewerAPIKey := createAPIKeyWithRole(t, fmt.Sprintf("%s-%s", apiPrefix, viewer), "Viewer") - _, editorAPIKey := createAPIKeyWithRole(t, fmt.Sprintf("%s-%s", apiPrefix, editor), "Editor") - _, adminAPIKey := createAPIKeyWithRole(t, fmt.Sprintf("%s-%s", apiPrefix, admin), "Admin") - defer func() { - // After auth API keys becomes Service Accounts/Tokens - deleteServiceAccountsMirgatedFromAPIKeys(t) - }() + viewerAPIKeyID, viewerAPIKey := createAPIKeyWithRole(t, fmt.Sprintf("%s-%s", apiPrefix, viewer), "Viewer") + defer deleteAPIKey(t, viewerAPIKeyID) + editorAPIKeyID, editorAPIKey := createAPIKeyWithRole(t, fmt.Sprintf("%s-%s", apiPrefix, editor), "Editor") + defer deleteAPIKey(t, editorAPIKeyID) + adminAPIKeyID, adminAPIKey := createAPIKeyWithRole(t, fmt.Sprintf("%s-%s", apiPrefix, admin), "Admin") + defer deleteAPIKey(t, adminAPIKeyID) type userCase struct { userType string @@ -600,6 +599,22 @@ func createAPIKeyWithRole(t *testing.T, name, role string) (int, string) { return apiKeyID, apiKey } +func deleteAPIKey(t *testing.T, apiKeyID int) { + t.Helper() + // https://grafana.com/docs/grafana/latest/http_api/auth/#delete-api-key + u, err := url.Parse(pmmapitests.BaseURL.String()) + require.NoError(t, err) + u.Path = "/graph/api/auth/keys/" + strconv.Itoa(apiKeyID) + + req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodDelete, u.String(), nil) + require.NoError(t, err) + + resp, b := doRequest(t, http.DefaultClient, req) + defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint + + require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete API Key, status code: %d, response: %s", resp.StatusCode, b) +} + func createServiceAccountWithRole(t *testing.T, role, nodeName string) int { t.Helper() u, err := url.Parse(pmmapitests.BaseURL.String()) @@ -662,39 +677,6 @@ func deleteServiceAccount(t *testing.T, serviceAccountID int) { require.Equalf(t, http.StatusOK, resp.StatusCode, "failed to delete service account, status code: %d, response: %s", resp.StatusCode, b) } -func deleteServiceAccountsMirgatedFromAPIKeys(t *testing.T) { - t.Helper() - type serviceAccount struct { - ID int `json:"id"` - Name string `json:"name"` - } - type serviceAccountSearch struct { - ServiceAccounts []serviceAccount `json:"serviceAccounts"` - } - var res serviceAccountSearch - - u, err := url.Parse(pmmapitests.BaseURL.String()) - require.NoError(t, err) - u.Path = "/graph/api/serviceaccounts/search" - migratedServiceAccountKeyword := "autogen" - u.RawQuery = url.QueryEscape(fmt.Sprintf("query=%s", migratedServiceAccountKeyword)) - - u.ForceQuery = true - req, err := http.NewRequestWithContext(pmmapitests.Context, http.MethodGet, u.String(), nil) - require.NoError(t, err) - - resp, b := doRequest(t, http.DefaultClient, req) - defer resp.Body.Close() //nolint:gosec,errcheck,nolintlint - require.NoError(t, json.Unmarshal(b, &res)) - - for _, serviceAccount := range res.ServiceAccounts { - if !strings.Contains(serviceAccount.Name, migratedServiceAccountKeyword) { - continue - } - deleteServiceAccount(t, serviceAccount.ID) - } -} - func createServiceToken(t *testing.T, serviceAccountID int, nodeName string) (int, string) { t.Helper() u, err := url.Parse(pmmapitests.BaseURL.String()) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 0e2305dd49..2d70dfd47a 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -232,6 +232,15 @@ func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (auth if token != "" { role, err := c.getRoleForServiceToken(ctx, token) if err != nil { + // TODO better err check + if e, ok := status.FromError(err); !ok && strings.Contains(e.Message(), "Auth method is not service account token") { + role, err := c.getRoleForAPIKey(ctx, authHeaders) + return authUser{ + role: role, + userID: 0, + }, err + } + return emptyUser, err } return authUser{ @@ -287,6 +296,20 @@ func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (auth }, nil } +func (c *Client) getRoleForAPIKey(ctx context.Context, authHeaders http.Header) (role, error) { + var k map[string]interface{} + if err := c.do(ctx, http.MethodGet, "/api/auth/key", "", authHeaders, nil, &k); err != nil { + return none, err + } + + if id, _ := k["orgId"].(float64); id != 1 { + return none, nil + } + + role, _ := k["role"].(string) + return c.convertRole(role), nil +} + func (c *Client) convertRole(role string) role { switch role { case "Viewer": From 8c12fa810b38d5b9899b12d9eeca1719dc520e59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 8 Feb 2024 11:53:10 +0100 Subject: [PATCH 116/126] PMM-12251 Fix test. --- managed/services/grafana/client_test.go | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/managed/services/grafana/client_test.go b/managed/services/grafana/client_test.go index f21a06156a..66963ded67 100644 --- a/managed/services/grafana/client_test.go +++ b/managed/services/grafana/client_test.go @@ -134,20 +134,21 @@ func TestClient(t *testing.T) { require.NoError(t, err) require.NotZero(t, apiKeyID) require.NotEmpty(t, apiKey) + if err != nil { + defer func() { + err = c.deleteAPIKey(ctx, apiKeyID, authHeaders) + require.NoError(t, err) + }() + } apiKeyAuthHeaders := http.Header{} apiKeyAuthHeaders.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey)) u, err := c.getAuthUser(ctx, apiKeyAuthHeaders) - assert.NoError(t, err) actualRole := u.role + assert.NoError(t, err) assert.Equal(t, role, actualRole) assert.Equal(t, role.String(), actualRole.String()) - - serviceAccountID, err := c.getServiceAccountIDForServiceToken(ctx, apiKey) - assert.NoError(t, err) - err = c.deleteServiceAccount(ctx, serviceAccountID, authHeaders) - assert.NoError(t, err) }) t.Run(fmt.Sprintf("Service token auth %s", role.String()), func(t *testing.T) { From 003103a689421514de5fd06908e4dcfeaa46d397 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 8 Feb 2024 12:25:25 +0100 Subject: [PATCH 117/126] PMM-12251 Small refactor. --- managed/services/grafana/client.go | 3 +-- managed/utils/auth/token.go | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 2d70dfd47a..3b4c84e7ae 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -232,8 +232,7 @@ func (c *Client) getAuthUser(ctx context.Context, authHeaders http.Header) (auth if token != "" { role, err := c.getRoleForServiceToken(ctx, token) if err != nil { - // TODO better err check - if e, ok := status.FromError(err); !ok && strings.Contains(e.Message(), "Auth method is not service account token") { + if strings.Contains(err.Error(), "Auth method is not service account token") { role, err := c.getRoleForAPIKey(ctx, authHeaders) return authUser{ role: role, diff --git a/managed/utils/auth/token.go b/managed/utils/auth/token.go index 0842bfba54..43fd2b6635 100644 --- a/managed/utils/auth/token.go +++ b/managed/utils/auth/token.go @@ -57,7 +57,7 @@ func GetHeadersFromContext(ctx context.Context) (http.Header, error) { if !ok { return nil, fmt.Errorf("cannot get headers from metadata") } - // get authorization from headers. + authorizationHeaders := headers.Get("Authorization") cookieHeaders := headers.Get("grpcgateway-cookie") if len(authorizationHeaders) == 0 && len(cookieHeaders) == 0 { From e6239391d19f7097122a1c04a9ece6dd06d539bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Thu, 8 Feb 2024 13:41:16 +0100 Subject: [PATCH 118/126] PMM-12251 Lint. --- api-tests/inventory/nodes_test.go | 10 ---------- managed/services/grafana/client.go | 13 ------------- 2 files changed, 23 deletions(-) diff --git a/api-tests/inventory/nodes_test.go b/api-tests/inventory/nodes_test.go index 6cd3d5c466..9bfbbcbce0 100644 --- a/api-tests/inventory/nodes_test.go +++ b/api-tests/inventory/nodes_test.go @@ -32,7 +32,6 @@ import ( ) func TestNodesDeprecated(t *testing.T) { - t.Parallel() t.Run("List", func(t *testing.T) { t.Parallel() @@ -92,7 +91,6 @@ func TestNodesDeprecated(t *testing.T) { } func TestNodes(t *testing.T) { - t.Parallel() t.Run("List", func(t *testing.T) { t.Parallel() @@ -164,7 +162,6 @@ func TestNodes(t *testing.T) { } func TestGetNode(t *testing.T) { - t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -218,7 +215,6 @@ func TestGetNode(t *testing.T) { } func TestGenericNodeDeprecated(t *testing.T) { - t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -278,7 +274,6 @@ func TestGenericNodeDeprecated(t *testing.T) { } func TestGenericNode(t *testing.T) { - t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -342,7 +337,6 @@ func TestGenericNode(t *testing.T) { } func TestContainerNodeDeprecated(t *testing.T) { - t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -407,7 +401,6 @@ func TestContainerNodeDeprecated(t *testing.T) { } func TestContainerNode(t *testing.T) { - t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -476,7 +469,6 @@ func TestContainerNode(t *testing.T) { } func TestRemoteNodeDeprecated(t *testing.T) { - t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -541,7 +533,6 @@ func TestRemoteNodeDeprecated(t *testing.T) { } func TestRemoteNode(t *testing.T) { - t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() @@ -610,7 +601,6 @@ func TestRemoteNode(t *testing.T) { } func TestRemoveNode(t *testing.T) { - t.Parallel() t.Run("Basic", func(t *testing.T) { t.Parallel() diff --git a/managed/services/grafana/client.go b/managed/services/grafana/client.go index 3b4c84e7ae..31f43878ec 100644 --- a/managed/services/grafana/client.go +++ b/managed/services/grafana/client.go @@ -347,19 +347,6 @@ func (c *Client) getRoleForServiceToken(ctx context.Context, token string) (role return c.convertRole(role), nil } -func (c *Client) getServiceAccountIDForServiceToken(ctx context.Context, token string) (int, error) { - header := http.Header{} - header.Add("Authorization", fmt.Sprintf("Bearer %s", token)) - - var k map[string]interface{} - if err := c.do(ctx, http.MethodGet, "/api/auth/serviceaccount", "", header, nil, &k); err != nil { - return 0, err - } - - id, _ := k["id"].(float64) - return int(id), nil -} - type serviceAccountSearch struct { TotalCount int `json:"totalCount"` ServiceAccounts []serviceAccount `json:"serviceAccounts"` From 528bc4177ef88fc9e82dec9f45d0479eeefe7168 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:28:48 +0100 Subject: [PATCH 119/126] Update api-tests/management/mongodb_test.go Co-authored-by: Nurlan Moldomurov --- api-tests/management/mongodb_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-tests/management/mongodb_test.go b/api-tests/management/mongodb_test.go index eb677c06fe..aa0a79c8ba 100644 --- a/api-tests/management/mongodb_test.go +++ b/api-tests/management/mongodb_test.go @@ -108,7 +108,7 @@ func TestAddMongoDB(t *testing.T) { }) t.Run("With agents", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "all-fields") + nodeName := pmmapitests.TestString(t, "with-agents") nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), From c7d7b9f185d42773a681e1f8cb71771bbc8cf5d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:29:00 +0100 Subject: [PATCH 120/126] Update api-tests/management/mongodb_test.go Co-authored-by: Nurlan Moldomurov --- api-tests/management/mongodb_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api-tests/management/mongodb_test.go b/api-tests/management/mongodb_test.go index aa0a79c8ba..60c411a0b0 100644 --- a/api-tests/management/mongodb_test.go +++ b/api-tests/management/mongodb_test.go @@ -196,7 +196,7 @@ func TestAddMongoDB(t *testing.T) { }) t.Run("With labels", func(t *testing.T) { - nodeName := pmmapitests.TestString(t, "all-fields") + nodeName := pmmapitests.TestString(t, "with-labels") nodeID, pmmAgentID := RegisterGenericNode(t, node.RegisterNodeBody{ NodeName: nodeName, NodeType: pointer.ToString(node.RegisterNodeBodyNodeTypeGENERICNODE), From cc64d3b35e6192c7170f948ec8d4c3676a39906e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Wed, 14 Feb 2024 14:29:08 +0100 Subject: [PATCH 121/126] Update api/managementpb/node.proto Co-authored-by: Nurlan Moldomurov --- api/managementpb/node.proto | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/managementpb/node.proto b/api/managementpb/node.proto index d4dacce360..b9e88e7ccc 100644 --- a/api/managementpb/node.proto +++ b/api/managementpb/node.proto @@ -83,7 +83,7 @@ service Node { description: "Registers a new Node and pmm-agent." }; } - // UnregisterNode unregister a Node,pmm-agent and remove service account and it's token. + // UnregisterNode unregister a Node, pmm-agent and remove service account and it's token. rpc UnregisterNode(UnregisterNodeRequest) returns (UnregisterNodeResponse) { option (google.api.http) = { post: "/v1/management/Node/Unregister" From dc3f5bb338eedf80fa566855ff949726454f6846 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Wed, 14 Feb 2024 14:37:35 +0100 Subject: [PATCH 122/126] PMM-12251 Gen after suggestions. --- api/managementpb/node_grpc.pb.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/managementpb/node_grpc.pb.go b/api/managementpb/node_grpc.pb.go index 71b511fd34..6863519d80 100644 --- a/api/managementpb/node_grpc.pb.go +++ b/api/managementpb/node_grpc.pb.go @@ -30,7 +30,7 @@ const ( type NodeClient interface { // RegisterNode registers a new Node, pmm-agent and create service account and it's token. RegisterNode(ctx context.Context, in *RegisterNodeRequest, opts ...grpc.CallOption) (*RegisterNodeResponse, error) - // UnregisterNode unregister a Node,pmm-agent and remove service account and it's token. + // UnregisterNode unregister a Node, pmm-agent and remove service account and it's token. UnregisterNode(ctx context.Context, in *UnregisterNodeRequest, opts ...grpc.CallOption) (*UnregisterNodeResponse, error) } @@ -66,7 +66,7 @@ func (c *nodeClient) UnregisterNode(ctx context.Context, in *UnregisterNodeReque type NodeServer interface { // RegisterNode registers a new Node, pmm-agent and create service account and it's token. RegisterNode(context.Context, *RegisterNodeRequest) (*RegisterNodeResponse, error) - // UnregisterNode unregister a Node,pmm-agent and remove service account and it's token. + // UnregisterNode unregister a Node, pmm-agent and remove service account and it's token. UnregisterNode(context.Context, *UnregisterNodeRequest) (*UnregisterNodeResponse, error) mustEmbedUnimplementedNodeServer() } From 4af52d4b9ef0618de231410dd2c41cdff5e15236 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 26 Feb 2024 10:06:15 +0100 Subject: [PATCH 123/126] PMM-12251 Gen after merge. --- api/managementpb/node.pb.gw.go | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/api/managementpb/node.pb.gw.go b/api/managementpb/node.pb.gw.go index c3e2defda0..450d756630 100644 --- a/api/managementpb/node.pb.gw.go +++ b/api/managementpb/node.pb.gw.go @@ -61,11 +61,7 @@ func request_Node_UnregisterNode_0(ctx context.Context, marshaler runtime.Marsha var protoReq UnregisterNodeRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -77,11 +73,7 @@ func local_request_Node_UnregisterNode_0(ctx context.Context, marshaler runtime. var protoReq UnregisterNodeRequest var metadata runtime.ServerMetadata - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { + if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && err != io.EOF { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } From 12f805eeae6da34d6aed69c375e49ced4dd45971 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Mon, 11 Mar 2024 13:28:14 +0100 Subject: [PATCH 124/126] PMM-12251 Another reverted changes. --- agent/client/basic_auth.go | 47 ++++++++++++++++++++++++++++++++++++++ agent/client/client.go | 13 +++++++++++ agent/client/token_auth.go | 43 ++++++++++++++++++++++++++++++++++ 3 files changed, 103 insertions(+) create mode 100644 agent/client/basic_auth.go create mode 100644 agent/client/token_auth.go diff --git a/agent/client/basic_auth.go b/agent/client/basic_auth.go new file mode 100644 index 0000000000..8d2676c4ac --- /dev/null +++ b/agent/client/basic_auth.go @@ -0,0 +1,47 @@ +// Copyright (C) 2024 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package client + +import ( + "context" + "encoding/base64" + "fmt" + + "google.golang.org/grpc/credentials" +) + +type basicAuth struct { + username string + password string +} + +// GetRequestMetadata implements credentials.PerRPCCredentials interface. +func (b *basicAuth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { //nolint:revive + auth := b.username + ":" + b.password + enc := base64.StdEncoding.EncodeToString([]byte(auth)) + return map[string]string{ + "Authorization": fmt.Sprintf("Basic %s", enc), + }, nil +} + +// RequireTransportSecurity implements credentials.PerRPCCredentials interface. +func (*basicAuth) RequireTransportSecurity() bool { + return false +} + +// check interfaces. +var ( + _ credentials.PerRPCCredentials = (*basicAuth)(nil) +) diff --git a/agent/client/client.go b/agent/client/client.go index 7ebf822988..8a7dfb807b 100644 --- a/agent/client/client.go +++ b/agent/client/client.go @@ -747,6 +747,19 @@ func dial(dialCtx context.Context, cfg *config.Config, l *logrus.Entry) (*dialRe opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(tlsConfig))) } + if cfg.Server.Username != "" { + if cfg.Server.Username == "service_token" || cfg.Server.Username == "api_key" { + opts = append(opts, grpc.WithPerRPCCredentials(&tokenAuth{ + token: cfg.Server.Password, + })) + } else { + opts = append(opts, grpc.WithPerRPCCredentials(&basicAuth{ + username: cfg.Server.Username, + password: cfg.Server.Password, + })) + } + } + l.Infof("Connecting to %s ...", cfg.Server.FilteredURL()) conn, err := grpc.DialContext(dialCtx, cfg.Server.Address, opts...) if err != nil { diff --git a/agent/client/token_auth.go b/agent/client/token_auth.go new file mode 100644 index 0000000000..5f2e259104 --- /dev/null +++ b/agent/client/token_auth.go @@ -0,0 +1,43 @@ +// Copyright (C) 2024 Percona LLC +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package client + +import ( + "context" + "fmt" + + "google.golang.org/grpc/credentials" +) + +type tokenAuth struct { + token string +} + +// GetRequestMetadata implements credentials.PerRPCCredentials interface. +func (t *tokenAuth) GetRequestMetadata(ctx context.Context, uri ...string) (map[string]string, error) { //nolint:revive + return map[string]string{ + "Authorization": fmt.Sprintf("Bearer %s", t.token), + }, nil +} + +// RequireTransportSecurity implements credentials.PerRPCCredentials interface. +func (*tokenAuth) RequireTransportSecurity() bool { + return false +} + +// check interfaces. +var ( + _ credentials.PerRPCCredentials = (*tokenAuth)(nil) +) From 04107725668dc80fc565bee96a9f488e787c1d1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= Date: Tue, 12 Mar 2024 05:47:29 +0100 Subject: [PATCH 125/126] PMM-12686 Years in licence. --- agent/client/basic_auth.go | 2 +- agent/client/token_auth.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/agent/client/basic_auth.go b/agent/client/basic_auth.go index 8d2676c4ac..c6716a64e7 100644 --- a/agent/client/basic_auth.go +++ b/agent/client/basic_auth.go @@ -1,4 +1,4 @@ -// Copyright (C) 2024 Percona LLC +// Copyright (C) 2023 Percona LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. diff --git a/agent/client/token_auth.go b/agent/client/token_auth.go index 5f2e259104..2204f9cab8 100644 --- a/agent/client/token_auth.go +++ b/agent/client/token_auth.go @@ -1,4 +1,4 @@ -// Copyright (C) 2024 Percona LLC +// Copyright (C) 2023 Percona LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. From 3ac6d7f7a287b3a4274e31e868cb240a9f5ee843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ji=C5=99=C3=AD=20=C4=8Ctvrtka?= <62988319+JiriCtvrtka@users.noreply.github.com> Date: Mon, 1 Apr 2024 12:30:02 +0200 Subject: [PATCH 126/126] PMM-12686 Basic/Token auth between server and client. (#2852) * PMM-12686 Authorization between server and client. * PMM-12686 Tests. * PMM-12686 Lint. * PMM-12686 Comment fix. * PMM-12686 New required permissions for Connect endpoint. * PMM-12686 Apply suggestion. * PMM-12686 Add unit test for authenticate method. * PMM-12686 Format. * PMM-12686 Part changes after review. * PMM-12686 Unit tests for auth server. * PMM-12686 Revert unnecessary changes anymore. * PMM-12686 Dynamic names in auth test. * PMM-12686 Skip check for pmm-server agent. * PMM-12686 Better local auth check. * PMM-12686 Local auth check. * PMM-12686 Refactor. * PMM-12686 Refactor. * PMM-12686 Refactor. * PMM-12686 Fix. * Update managed/services/grafana/auth_server.go Co-authored-by: Alex Demidoff * PMM-12686 Revert of some changes. * PMM-12686 Another reverted changes. * PMM-12686 Years in licence. * PMM-12686 Missed parallel in one test case. --------- Co-authored-by: Alex Demidoff --- managed/services/grafana/auth_server.go | 46 ++++++++---- managed/services/grafana/auth_server_test.go | 73 +++++++++++++++++++- 2 files changed, 105 insertions(+), 14 deletions(-) diff --git a/managed/services/grafana/auth_server.go b/managed/services/grafana/auth_server.go index e04ea1937f..2050962b73 100644 --- a/managed/services/grafana/auth_server.go +++ b/managed/services/grafana/auth_server.go @@ -38,10 +38,13 @@ import ( "github.com/percona/pmm/managed/models" ) +const ( + connectionEndpoint = "/agent.Agent/Connect" +) + // rules maps original URL prefix to minimal required role. var rules = map[string]role{ - // TODO https://jira.percona.com/browse/PMM-4420 - "/agent.Agent/Connect": none, + connectionEndpoint: admin, "/inventory.": admin, "/management.": admin, @@ -459,6 +462,17 @@ func nextPrefix(path string) string { return path[:i+1] } +func isLocalAgentConnection(req *http.Request) bool { + ip := strings.Split(req.RemoteAddr, ":")[0] + pmmAgent := req.Header.Get("Pmm-Agent-Id") + path := req.Header.Get("X-Original-Uri") + if ip == "127.0.0.1" && pmmAgent == "pmm-server" && path == connectionEndpoint { + return true + } + + return false +} + // authenticate checks if user has access to a specific path. // It returns user information retrieved during authentication. // Paths which require no Grafana role return zero value for @@ -498,22 +512,30 @@ func (s *AuthServer) authenticate(ctx context.Context, req *http.Request, l *log return nil, nil } - // Get authenticated user from Grafana - authUser, authErr := s.getAuthUser(ctx, req, l) - if authErr != nil { - return nil, authErr + var user *authUser + if isLocalAgentConnection(req) { + user = &authUser{ + role: rules[connectionEndpoint], + userID: 0, + } + } else { + var authErr *authError + // Get authenticated user from Grafana + user, authErr = s.getAuthUser(ctx, req, l) + if authErr != nil { + return nil, authErr + } } + l = l.WithField("role", user.role.String()) - l = l.WithField("role", authUser.role.String()) - - if authUser.role == grafanaAdmin { + if user.role == grafanaAdmin { l.Debugf("Grafana admin, allowing access.") - return authUser, nil + return user, nil } - if minRole <= authUser.role { + if minRole <= user.role { l.Debugf("Minimal required role is %q, granting access.", minRole) - return authUser, nil + return user, nil } l.Warnf("Minimal required role is %q.", minRole) diff --git a/managed/services/grafana/auth_server_test.go b/managed/services/grafana/auth_server_test.go index 15822094b4..0b1bbbe14c 100644 --- a/managed/services/grafana/auth_server_test.go +++ b/managed/services/grafana/auth_server_test.go @@ -31,6 +31,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" "gopkg.in/reform.v1" "gopkg.in/reform.v1/dialects/postgresql" @@ -161,7 +162,6 @@ func TestAuthServerMustSetup(t *testing.T) { func TestAuthServerAuthenticate(t *testing.T) { t.Parallel() - // logrus.SetLevel(logrus.TraceLevel) checker := &mockAwsInstanceChecker{} checker.Test(t) @@ -198,7 +198,7 @@ func TestAuthServerAuthenticate(t *testing.T) { }) for uri, minRole := range map[string]role{ - "/agent.Agent/Connect": none, + "/agent.Agent/Connect": admin, "/inventory.Nodes/ListNodes": admin, "/management.Actions/StartMySQLShowTableStatusAction": viewer, @@ -270,6 +270,75 @@ func TestAuthServerAuthenticate(t *testing.T) { } } +func TestServerClientConnection(t *testing.T) { + t.Parallel() + + checker := &mockAwsInstanceChecker{} + checker.Test(t) + t.Cleanup(func() { checker.AssertExpectations(t) }) + + ctx := context.Background() + c := NewClient("127.0.0.1:3000") + s := NewAuthServer(c, checker, nil) + + t.Run("Basic auth - success", func(t *testing.T) { + t.Parallel() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, connectionEndpoint, nil) + require.NoError(t, err) + req.SetBasicAuth("admin", "admin") + + _, authError := s.authenticate(ctx, req, logrus.WithField("test", t.Name())) + assert.Nil(t, authError) + }) + + t.Run("Basic auth - fail", func(t *testing.T) { + t.Parallel() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, connectionEndpoint, nil) + require.NoError(t, err) + req.SetBasicAuth("admin", "wrong") + + _, authError := s.authenticate(ctx, req, logrus.WithField("test", t.Name())) + assert.Equal(t, codes.Unauthenticated, authError.code) + }) + + t.Run("Token auth - success", func(t *testing.T) { + t.Parallel() + + nodeName := fmt.Sprintf("N1-%d", time.Now().UnixNano()) + headersMD := metadata.New(map[string]string{ + "Authorization": "Basic YWRtaW46YWRtaW4=", + }) + ctx := metadata.NewIncomingContext(context.Background(), headersMD) + _, serviceToken, err := c.CreateServiceAccount(ctx, nodeName, true) + require.NoError(t, err) + defer func() { + warning, err := c.DeleteServiceAccount(ctx, nodeName, true) + require.NoError(t, err) + require.Empty(t, warning) + }() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, connectionEndpoint, nil) + require.NoError(t, err) + req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", serviceToken)) + + _, authError := s.authenticate(ctx, req, logrus.WithField("test", t.Name())) + assert.Nil(t, authError) + }) + + t.Run("Token auth - fail", func(t *testing.T) { + t.Parallel() + + req, err := http.NewRequestWithContext(ctx, http.MethodGet, connectionEndpoint, nil) + require.NoError(t, err) + req.Header.Set("Authorization", "Bearer wrong") + + _, authError := s.authenticate(ctx, req, logrus.WithField("test", t.Name())) + assert.Equal(t, codes.Unauthenticated, authError.code) + }) +} + func TestAuthServerAddVMGatewayToken(t *testing.T) { ctx := logger.Set(context.Background(), t.Name()) uuid.SetRand(&tests.IDReader{})