From 873aae3fad0980b583ed3dfaed724242a0d31e25 Mon Sep 17 00:00:00 2001 From: Jade McGough Date: Mon, 3 Dec 2018 04:27:27 -0800 Subject: [PATCH] Revert "feat(http): add label service" (#1667) This reverts commit 70a430c599857227f810fb3dad20e0ce613a6003. --- bolt/bbolt.go | 5 - bolt/bucket.go | 6 - bolt/dashboard.go | 6 - bolt/label.go | 173 ------------- bolt/label_test.go | 35 --- cmd/influxd/main.go | 2 - http/api_handler.go | 7 +- http/bucket_service.go | 24 +- http/bucket_test.go | 18 +- http/dashboard_service.go | 43 ++- http/dashboard_test.go | 42 +-- http/label_service.go | 345 ------------------------- http/swagger.yml | 73 ------ http/task_service.go | 10 +- http/task_service_test.go | 4 +- http/task_test.go | 3 +- http/user_resource_mapping_service.go | 12 +- label.go | 53 ---- label_test.go | 53 ---- mock/label_service.go | 43 --- testing/label_service.go | 359 -------------------------- user_resource_mapping.go | 2 - user_resource_mapping_test.go | 16 +- 23 files changed, 65 insertions(+), 1269 deletions(-) delete mode 100644 bolt/label.go delete mode 100644 bolt/label_test.go delete mode 100644 http/label_service.go delete mode 100644 label.go delete mode 100644 label_test.go delete mode 100644 mock/label_service.go delete mode 100644 testing/label_service.go diff --git a/bolt/bbolt.go b/bolt/bbolt.go index 15e696bf112..9e3ac69ee46 100644 --- a/bolt/bbolt.go +++ b/bolt/bbolt.go @@ -148,11 +148,6 @@ func (c *Client) initialize(ctx context.Context) error { return err } - // Always create labels bucket. - if err := c.initializeLabels(ctx, tx); err != nil { - return err - } - // Always create Session bucket. if err := c.initializeSessions(ctx, tx); err != nil { return err diff --git a/bolt/bucket.go b/bolt/bucket.go index 374fd86c885..111e4bea185 100644 --- a/bolt/bucket.go +++ b/bolt/bucket.go @@ -560,12 +560,6 @@ func (c *Client) deleteBucket(ctx context.Context, tx *bolt.Tx, id platform.ID) Err: err, } } - - if err := c.deleteLabels(ctx, tx, platform.LabelFilter{ResourceID: id}); err != nil { - return &platform.Error{ - Err: err, - } - } return nil } diff --git a/bolt/dashboard.go b/bolt/dashboard.go index cac16b11656..71506b5d30f 100644 --- a/bolt/dashboard.go +++ b/bolt/dashboard.go @@ -469,12 +469,6 @@ func (c *Client) deleteDashboard(ctx context.Context, tx *bolt.Tx, id platform.I if err := tx.Bucket(dashboardBucket).Delete(encodedID); err != nil { return err } - - err = c.deleteLabels(ctx, tx, platform.LabelFilter{ResourceID: id}) - if err != nil { - return err - } - // TODO(desa): add DeleteKeyValueLog method and use it here. return c.deleteUserResourceMappings(ctx, tx, platform.UserResourceMappingFilter{ ResourceID: id, diff --git a/bolt/label.go b/bolt/label.go deleted file mode 100644 index 25631b9ee9e..00000000000 --- a/bolt/label.go +++ /dev/null @@ -1,173 +0,0 @@ -package bolt - -import ( - "context" - "encoding/json" - "fmt" - - "github.com/coreos/bbolt" - "github.com/influxdata/platform" -) - -var ( - labelBucket = []byte("labelsv1") -) - -func (c *Client) initializeLabels(ctx context.Context, tx *bolt.Tx) error { - if _, err := tx.CreateBucketIfNotExists([]byte(labelBucket)); err != nil { - return err - } - return nil -} - -func filterLabelsFn(filter platform.LabelFilter) func(l *platform.Label) bool { - return func(label *platform.Label) bool { - return (filter.Name == "" || (filter.Name == label.Name)) && - (!filter.ResourceID.Valid() || (filter.ResourceID == label.ResourceID)) - } -} - -// FindLabels returns a list of labels that match a filter. -func (c *Client) FindLabels(ctx context.Context, filter platform.LabelFilter, opt ...platform.FindOptions) ([]*platform.Label, error) { - ls := []*platform.Label{} - err := c.db.View(func(tx *bolt.Tx) error { - labels, err := c.findLabels(ctx, tx, filter) - if err != nil { - return err - } - ls = labels - return nil - }) - - if err != nil { - return nil, err - } - - return ls, nil -} - -func (c *Client) findLabels(ctx context.Context, tx *bolt.Tx, filter platform.LabelFilter) ([]*platform.Label, error) { - ls := []*platform.Label{} - filterFn := filterLabelsFn(filter) - err := c.forEachLabel(ctx, tx, func(l *platform.Label) bool { - if filterFn(l) { - ls = append(ls, l) - } - return true - }) - - if err != nil { - return nil, err - } - - return ls, nil -} - -func (c *Client) CreateLabel(ctx context.Context, l *platform.Label) error { - return c.db.Update(func(tx *bolt.Tx) error { - return c.createLabel(ctx, tx, l) - }) -} - -func (c *Client) createLabel(ctx context.Context, tx *bolt.Tx, l *platform.Label) error { - unique := c.uniqueLabel(ctx, tx, l) - - if !unique { - return fmt.Errorf("label %s already exists", l.Name) - } - - v, err := json.Marshal(l) - if err != nil { - return err - } - - key, err := labelKey(l) - if err != nil { - return err - } - - if err := tx.Bucket(labelBucket).Put(key, v); err != nil { - return err - } - - return nil -} - -func labelKey(l *platform.Label) ([]byte, error) { - encodedResourceID, err := l.ResourceID.Encode() - if err != nil { - return nil, err - } - - key := make([]byte, len(encodedResourceID)+len(l.Name)) - copy(key, encodedResourceID) - copy(key[len(encodedResourceID):], l.Name) - - return key, nil -} - -func (c *Client) forEachLabel(ctx context.Context, tx *bolt.Tx, fn func(*platform.Label) bool) error { - cur := tx.Bucket(labelBucket).Cursor() - for k, v := cur.First(); k != nil; k, v = cur.Next() { - l := &platform.Label{} - if err := json.Unmarshal(v, l); err != nil { - return err - } - if !fn(l) { - break - } - } - - return nil -} - -func (c *Client) uniqueLabel(ctx context.Context, tx *bolt.Tx, l *platform.Label) bool { - key, err := labelKey(l) - if err != nil { - return false - } - - v := tx.Bucket(labelBucket).Get(key) - return len(v) == 0 -} - -// DeleteLabel deletes a label. -func (c *Client) DeleteLabel(ctx context.Context, l platform.Label) error { - return c.db.Update(func(tx *bolt.Tx) error { - return c.deleteLabel(ctx, tx, platform.LabelFilter(l)) - }) -} - -func (c *Client) deleteLabel(ctx context.Context, tx *bolt.Tx, filter platform.LabelFilter) error { - ls, err := c.findLabels(ctx, tx, filter) - if err != nil { - return err - } - if len(ls) == 0 { - return fmt.Errorf("label not found") - } - - key, err := labelKey(ls[0]) - if err != nil { - return err - } - - return tx.Bucket(labelBucket).Delete(key) -} - -func (c *Client) deleteLabels(ctx context.Context, tx *bolt.Tx, filter platform.LabelFilter) error { - ls, err := c.findLabels(ctx, tx, filter) - if err != nil { - return err - } - for _, l := range ls { - key, err := labelKey(l) - if err != nil { - return err - } - if err = tx.Bucket(labelBucket).Delete(key); err != nil { - return err - } - } - return nil -} diff --git a/bolt/label_test.go b/bolt/label_test.go deleted file mode 100644 index ad7cfd22e77..00000000000 --- a/bolt/label_test.go +++ /dev/null @@ -1,35 +0,0 @@ -package bolt_test - -import ( - "context" - "testing" - - "github.com/influxdata/platform" - platformtesting "github.com/influxdata/platform/testing" -) - -func initLabelService(f platformtesting.LabelFields, t *testing.T) (platform.LabelService, func()) { - c, closeFn, err := NewTestClient() - if err != nil { - t.Fatalf("failed to create new bolt client: %v", err) - } - ctx := context.Background() - for _, l := range f.Labels { - if err := c.CreateLabel(ctx, l); err != nil { - t.Fatalf("failed to populate labels") - } - } - - return c, func() { - defer closeFn() - for _, l := range f.Labels { - if err := c.DeleteLabel(ctx, *l); err != nil { - t.Logf("failed to remove label: %v", err) - } - } - } -} - -func TestLabelService_LabelService(t *testing.T) { - platformtesting.LabelService(initLabelService, t) -} diff --git a/cmd/influxd/main.go b/cmd/influxd/main.go index b4b9f768cf0..edc96ff7ca5 100644 --- a/cmd/influxd/main.go +++ b/cmd/influxd/main.go @@ -252,7 +252,6 @@ func (m *Main) run(ctx context.Context) (err error) { scraperTargetSvc platform.ScraperTargetStoreService = m.boltClient telegrafSvc platform.TelegrafConfigStore = m.boltClient userResourceSvc platform.UserResourceMappingService = m.boltClient - labelSvc platform.LabelService = m.boltClient ) chronografSvc, err := server.NewServiceV2(ctx, m.boltClient.DB()) @@ -371,7 +370,6 @@ func (m *Main) run(ctx context.Context) (err error) { UserService: userSvc, OrganizationService: orgSvc, UserResourceMappingService: userResourceSvc, - LabelService: labelSvc, DashboardService: dashboardSvc, DashboardOperationLogService: dashboardLogSvc, BucketOperationLogService: bucketLogSvc, diff --git a/http/api_handler.go b/http/api_handler.go index d1eab48d24a..dcb52ddad38 100644 --- a/http/api_handler.go +++ b/http/api_handler.go @@ -46,7 +46,6 @@ type APIBackend struct { UserService platform.UserService OrganizationService platform.OrganizationService UserResourceMappingService platform.UserResourceMappingService - LabelService platform.LabelService DashboardService platform.DashboardService DashboardOperationLogService platform.DashboardOperationLogService BucketOperationLogService platform.BucketOperationLogService @@ -72,7 +71,7 @@ func NewAPIHandler(b *APIBackend) *APIHandler { h.SessionHandler.SessionService = b.SessionService h.SessionHandler.Logger = b.Logger.With(zap.String("handler", "basicAuth")) - h.BucketHandler = NewBucketHandler(b.UserResourceMappingService, b.LabelService) + h.BucketHandler = NewBucketHandler(b.UserResourceMappingService) h.BucketHandler.BucketService = b.BucketService h.BucketHandler.BucketOperationLogService = b.BucketOperationLogService @@ -86,7 +85,7 @@ func NewAPIHandler(b *APIBackend) *APIHandler { h.UserHandler.BasicAuthService = b.BasicAuthService h.UserHandler.UserOperationLogService = b.UserOperationLogService - h.DashboardHandler = NewDashboardHandler(b.UserResourceMappingService, b.LabelService) + h.DashboardHandler = NewDashboardHandler(b.UserResourceMappingService) h.DashboardHandler.DashboardService = b.DashboardService h.DashboardHandler.DashboardOperationLogService = b.DashboardOperationLogService @@ -108,7 +107,7 @@ func NewAPIHandler(b *APIBackend) *APIHandler { h.SetupHandler = NewSetupHandler() h.SetupHandler.OnboardingService = b.OnboardingService - h.TaskHandler = NewTaskHandler(b.UserResourceMappingService, b.LabelService, b.Logger) + h.TaskHandler = NewTaskHandler(b.UserResourceMappingService, b.Logger) h.TaskHandler.TaskService = b.TaskService h.TaskHandler.AuthorizationService = b.AuthorizationService h.TaskHandler.UserResourceMappingService = b.UserResourceMappingService diff --git a/http/bucket_service.go b/http/bucket_service.go index 9ea4551d0e3..34ad45cc892 100644 --- a/http/bucket_service.go +++ b/http/bucket_service.go @@ -22,27 +22,23 @@ type BucketHandler struct { BucketService platform.BucketService BucketOperationLogService platform.BucketOperationLogService UserResourceMappingService platform.UserResourceMappingService - LabelService platform.LabelService } const ( - bucketsPath = "/api/v2/buckets" - bucketsIDPath = "/api/v2/buckets/:id" - bucketsIDLogPath = "/api/v2/buckets/:id/log" - bucketsIDMembersPath = "/api/v2/buckets/:id/members" - bucketsIDMembersIDPath = "/api/v2/buckets/:id/members/:userID" - bucketsIDOwnersPath = "/api/v2/buckets/:id/owners" - bucketsIDOwnersIDPath = "/api/v2/buckets/:id/owners/:userID" - bucketsIDLabelsPath = "/api/v2/buckets/:id/labels" - bucketsIDLabelsNamePath = "/api/v2/buckets/:id/labels/:name" + bucketsPath = "/api/v2/buckets" + bucketsIDPath = "/api/v2/buckets/:id" + bucketsIDLogPath = "/api/v2/buckets/:id/log" + bucketsIDMembersPath = "/api/v2/buckets/:id/members" + bucketsIDMembersIDPath = "/api/v2/buckets/:id/members/:userID" + bucketsIDOwnersPath = "/api/v2/buckets/:id/owners" + bucketsIDOwnersIDPath = "/api/v2/buckets/:id/owners/:userID" ) // NewBucketHandler returns a new instance of BucketHandler. -func NewBucketHandler(mappingService platform.UserResourceMappingService, labelService platform.LabelService) *BucketHandler { +func NewBucketHandler(mappingService platform.UserResourceMappingService) *BucketHandler { h := &BucketHandler{ Router: httprouter.New(), UserResourceMappingService: mappingService, - LabelService: labelService, } h.HandlerFunc("POST", bucketsPath, h.handlePostBucket) @@ -60,10 +56,6 @@ func NewBucketHandler(mappingService platform.UserResourceMappingService, labelS h.HandlerFunc("GET", bucketsIDOwnersPath, newGetMembersHandler(h.UserResourceMappingService, platform.Owner)) h.HandlerFunc("DELETE", bucketsIDOwnersIDPath, newDeleteMemberHandler(h.UserResourceMappingService, platform.Owner)) - h.HandlerFunc("GET", bucketsIDLabelsPath, newGetLabelsHandler(h.LabelService)) - h.HandlerFunc("POST", bucketsIDLabelsPath, newPostLabelHandler(h.LabelService)) - h.HandlerFunc("DELETE", bucketsIDLabelsNamePath, newDeleteLabelHandler(h.LabelService)) - return h } diff --git a/http/bucket_test.go b/http/bucket_test.go index ca1136ba181..75078054f9c 100644 --- a/http/bucket_test.go +++ b/http/bucket_test.go @@ -123,8 +123,7 @@ func TestService_handleGetBuckets(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mappingService := mock.NewUserResourceMappingService() - labelService := mock.NewLabelService() - h := NewBucketHandler(mappingService, labelService) + h := NewBucketHandler(mappingService) h.BucketService = tt.fields.BucketService r := httptest.NewRequest("GET", "http://any.url", nil) @@ -241,8 +240,7 @@ func TestService_handleGetBucket(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mappingService := mock.NewUserResourceMappingService() - labelService := mock.NewLabelService() - h := NewBucketHandler(mappingService, labelService) + h := NewBucketHandler(mappingService) h.BucketService = tt.fields.BucketService r := httptest.NewRequest("GET", "http://any.url", nil) @@ -337,8 +335,7 @@ func TestService_handlePostBucket(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mappingService := mock.NewUserResourceMappingService() - labelService := mock.NewLabelService() - h := NewBucketHandler(mappingService, labelService) + h := NewBucketHandler(mappingService) h.BucketService = tt.fields.BucketService b, err := json.Marshal(newBucket(tt.args.bucket)) @@ -432,8 +429,7 @@ func TestService_handleDeleteBucket(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mappingService := mock.NewUserResourceMappingService() - labelService := mock.NewLabelService() - h := NewBucketHandler(mappingService, labelService) + h := NewBucketHandler(mappingService) h.BucketService = tt.fields.BucketService r := httptest.NewRequest("GET", "http://any.url", nil) @@ -707,8 +703,7 @@ func TestService_handlePatchBucket(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mappingService := mock.NewUserResourceMappingService() - labelService := mock.NewLabelService() - h := NewBucketHandler(mappingService, labelService) + h := NewBucketHandler(mappingService) h.BucketService = tt.fields.BucketService upd := platform.BucketUpdate{} @@ -775,8 +770,7 @@ func initBucketService(f platformtesting.BucketFields, t *testing.T) (platform.B } mappingService := mock.NewUserResourceMappingService() - labelService := mock.NewLabelService() - handler := NewBucketHandler(mappingService, labelService) + handler := NewBucketHandler(mappingService) handler.BucketService = svc server := httptest.NewServer(handler) client := BucketService{ diff --git a/http/dashboard_service.go b/http/dashboard_service.go index ca81740c2aa..3a82a762c99 100644 --- a/http/dashboard_service.go +++ b/http/dashboard_service.go @@ -22,29 +22,25 @@ type DashboardHandler struct { DashboardService platform.DashboardService DashboardOperationLogService platform.DashboardOperationLogService UserResourceMappingService platform.UserResourceMappingService - LabelService platform.LabelService } const ( - dashboardsPath = "/api/v2/dashboards" - dashboardsIDPath = "/api/v2/dashboards/:id" - dashboardsIDCellsPath = "/api/v2/dashboards/:id/cells" - dashboardsIDCellsIDPath = "/api/v2/dashboards/:id/cells/:cellID" - dashboardsIDMembersPath = "/api/v2/dashboards/:id/members" - dashboardsIDLogPath = "/api/v2/dashboards/:id/log" - dashboardsIDMembersIDPath = "/api/v2/dashboards/:id/members/:userID" - dashboardsIDOwnersPath = "/api/v2/dashboards/:id/owners" - dashboardsIDOwnersIDPath = "/api/v2/dashboards/:id/owners/:userID" - dashboardsIDLabelsPath = "/api/v2/dashboards/:id/labels" - dashboardsIDLabelsNamePath = "/api/v2/dashboards/:id/labels/:name" + dashboardsPath = "/api/v2/dashboards" + dashboardsIDPath = "/api/v2/dashboards/:id" + dashboardsIDCellsPath = "/api/v2/dashboards/:id/cells" + dashboardsIDCellsIDPath = "/api/v2/dashboards/:id/cells/:cellID" + dashboardsIDMembersPath = "/api/v2/dashboards/:id/members" + dashboardsIDLogPath = "/api/v2/dashboards/:id/log" + dashboardsIDMembersIDPath = "/api/v2/dashboards/:id/members/:userID" + dashboardsIDOwnersPath = "/api/v2/dashboards/:id/owners" + dashboardsIDOwnersIDPath = "/api/v2/dashboards/:id/owners/:userID" ) // NewDashboardHandler returns a new instance of DashboardHandler. -func NewDashboardHandler(mappingService platform.UserResourceMappingService, labelService platform.LabelService) *DashboardHandler { +func NewDashboardHandler(mappingService platform.UserResourceMappingService) *DashboardHandler { h := &DashboardHandler{ Router: httprouter.New(), UserResourceMappingService: mappingService, - LabelService: labelService, } h.HandlerFunc("POST", dashboardsPath, h.handlePostDashboard) @@ -66,19 +62,13 @@ func NewDashboardHandler(mappingService platform.UserResourceMappingService, lab h.HandlerFunc("POST", dashboardsIDOwnersPath, newPostMemberHandler(h.UserResourceMappingService, platform.DashboardResourceType, platform.Owner)) h.HandlerFunc("GET", dashboardsIDOwnersPath, newGetMembersHandler(h.UserResourceMappingService, platform.Owner)) h.HandlerFunc("DELETE", dashboardsIDOwnersIDPath, newDeleteMemberHandler(h.UserResourceMappingService, platform.Owner)) - - h.HandlerFunc("GET", dashboardsIDLabelsPath, newGetLabelsHandler(h.LabelService)) - h.HandlerFunc("POST", dashboardsIDLabelsPath, newPostLabelHandler(h.LabelService)) - h.HandlerFunc("DELETE", dashboardsIDLabelsNamePath, newDeleteLabelHandler(h.LabelService)) - return h } type dashboardLinks struct { - Self string `json:"self"` - Cells string `json:"cells"` - Log string `json:"log"` - Labels string `json:"labels"` + Self string `json:"self"` + Cells string `json:"cells"` + Log string `json:"log"` } type dashboardResponse struct { @@ -103,10 +93,9 @@ func (d dashboardResponse) toPlatform() *platform.Dashboard { func newDashboardResponse(d *platform.Dashboard) dashboardResponse { res := dashboardResponse{ Links: dashboardLinks{ - Self: fmt.Sprintf("/api/v2/dashboards/%s", d.ID), - Cells: fmt.Sprintf("/api/v2/dashboards/%s/cells", d.ID), - Log: fmt.Sprintf("/api/v2/dashboards/%s/log", d.ID), - Labels: fmt.Sprintf("/api/v2/dashboards/%s/labels", d.ID), + Self: fmt.Sprintf("/api/v2/dashboards/%s", d.ID), + Cells: fmt.Sprintf("/api/v2/dashboards/%s/cells", d.ID), + Log: fmt.Sprintf("/api/v2/dashboards/%s/log", d.ID), }, Dashboard: *d, Cells: []dashboardCellResponse{}, diff --git a/http/dashboard_test.go b/http/dashboard_test.go index 996f906fc57..afe95d7f4dd 100644 --- a/http/dashboard_test.go +++ b/http/dashboard_test.go @@ -109,8 +109,7 @@ func TestService_handleGetDashboards(t *testing.T) { "links": { "self": "/api/v2/dashboards/da7aba5e5d81e550", "cells": "/api/v2/dashboards/da7aba5e5d81e550/cells", - "log": "/api/v2/dashboards/da7aba5e5d81e550/log", - "labels": "/api/v2/dashboards/da7aba5e5d81e550/labels" + "log": "/api/v2/dashboards/da7aba5e5d81e550/log" } }, { @@ -125,8 +124,7 @@ func TestService_handleGetDashboards(t *testing.T) { "links": { "self": "/api/v2/dashboards/0ca2204eca2204e0", "log": "/api/v2/dashboards/0ca2204eca2204e0/log", - "cells": "/api/v2/dashboards/0ca2204eca2204e0/cells", - "labels": "/api/v2/dashboards/0ca2204eca2204e0/labels" + "cells": "/api/v2/dashboards/0ca2204eca2204e0/cells" } } ] @@ -161,8 +159,7 @@ func TestService_handleGetDashboards(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mappingService := mock.NewUserResourceMappingService() - labelService := mock.NewLabelService() - h := NewDashboardHandler(mappingService, labelService) + h := NewDashboardHandler(mappingService) h.DashboardService = tt.fields.DashboardService r := httptest.NewRequest("GET", "http://any.url", nil) @@ -278,8 +275,7 @@ func TestService_handleGetDashboard(t *testing.T) { "links": { "self": "/api/v2/dashboards/020f755c3c082000", "log": "/api/v2/dashboards/020f755c3c082000/log", - "cells": "/api/v2/dashboards/020f755c3c082000/cells", - "labels": "/api/v2/dashboards/020f755c3c082000/labels" + "cells": "/api/v2/dashboards/020f755c3c082000/cells" } } `, @@ -306,8 +302,7 @@ func TestService_handleGetDashboard(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mappingService := mock.NewUserResourceMappingService() - labelService := mock.NewLabelService() - h := NewDashboardHandler(mappingService, labelService) + h := NewDashboardHandler(mappingService) h.DashboardService = tt.fields.DashboardService r := httptest.NewRequest("GET", "http://any.url", nil) @@ -422,8 +417,7 @@ func TestService_handlePostDashboard(t *testing.T) { "links": { "self": "/api/v2/dashboards/020f755c3c082000", "log": "/api/v2/dashboards/020f755c3c082000/log", - "cells": "/api/v2/dashboards/020f755c3c082000/cells", - "labels": "/api/v2/dashboards/020f755c3c082000/labels" + "cells": "/api/v2/dashboards/020f755c3c082000/cells" } } `, @@ -434,8 +428,7 @@ func TestService_handlePostDashboard(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mappingService := mock.NewUserResourceMappingService() - labelService := mock.NewLabelService() - h := NewDashboardHandler(mappingService, labelService) + h := NewDashboardHandler(mappingService) h.DashboardService = tt.fields.DashboardService b, err := json.Marshal(tt.args.dashboard) @@ -525,8 +518,7 @@ func TestService_handleDeleteDashboard(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mappingService := mock.NewUserResourceMappingService() - labelService := mock.NewLabelService() - h := NewDashboardHandler(mappingService, labelService) + h := NewDashboardHandler(mappingService) h.DashboardService = tt.fields.DashboardService r := httptest.NewRequest("GET", "http://any.url", nil) @@ -651,8 +643,7 @@ func TestService_handlePatchDashboard(t *testing.T) { "links": { "self": "/api/v2/dashboards/020f755c3c082000", "log": "/api/v2/dashboards/020f755c3c082000/log", - "cells": "/api/v2/dashboards/020f755c3c082000/cells", - "labels": "/api/v2/dashboards/020f755c3c082000/labels" + "cells": "/api/v2/dashboards/020f755c3c082000/cells" } } `, @@ -696,8 +687,7 @@ func TestService_handlePatchDashboard(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mappingService := mock.NewUserResourceMappingService() - labelService := mock.NewLabelService() - h := NewDashboardHandler(mappingService, labelService) + h := NewDashboardHandler(mappingService) h.DashboardService = tt.fields.DashboardService upd := platform.DashboardUpdate{} @@ -806,8 +796,7 @@ func TestService_handlePostDashboardCell(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mappingService := mock.NewUserResourceMappingService() - labelService := mock.NewLabelService() - h := NewDashboardHandler(mappingService, labelService) + h := NewDashboardHandler(mappingService) h.DashboardService = tt.fields.DashboardService b, err := json.Marshal(tt.args.cell) @@ -890,8 +879,7 @@ func TestService_handleDeleteDashboardCell(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mappingService := mock.NewUserResourceMappingService() - labelService := mock.NewLabelService() - h := NewDashboardHandler(mappingService, labelService) + h := NewDashboardHandler(mappingService) h.DashboardService = tt.fields.DashboardService r := httptest.NewRequest("GET", "http://any.url", nil) @@ -1005,8 +993,7 @@ func TestService_handlePatchDashboardCell(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { mappingService := mock.NewUserResourceMappingService() - labelService := mock.NewLabelService() - h := NewDashboardHandler(mappingService, labelService) + h := NewDashboardHandler(mappingService) h.DashboardService = tt.fields.DashboardService upd := platform.CellUpdate{} @@ -1104,8 +1091,7 @@ func initDashboardService(f platformtesting.DashboardFields, t *testing.T) (plat } mappingService := mock.NewUserResourceMappingService() - labelService := mock.NewLabelService() - handler := NewDashboardHandler(mappingService, labelService) + handler := NewDashboardHandler(mappingService) handler.DashboardService = svc server := httptest.NewServer(handler) client := DashboardService{ diff --git a/http/label_service.go b/http/label_service.go deleted file mode 100644 index cc8a4135588..00000000000 --- a/http/label_service.go +++ /dev/null @@ -1,345 +0,0 @@ -// responses from /labels should look like: -// { -// labels: [ -// "foo", -// "bar" -// ] -// } -// -// this list (under key "labels") should be returned with any labelled resource that is requested via other endpoints - -package http - -import ( - "bytes" - "context" - "encoding/json" - "fmt" - "net/http" - "path" - - plat "github.com/influxdata/platform" - kerrors "github.com/influxdata/platform/kit/errors" - "github.com/julienschmidt/httprouter" -) - -type LabelService struct { - Addr string - Token string - InsecureSkipVerify bool - BasePath string -} - -type labelResponse struct { - Links map[string]string `json:"links"` - Label string `json:"label"` -} - -// TODO: remove "dashboard" from this -func newLabelResponse(l *plat.Label) *labelResponse { - return &labelResponse{ - Links: map[string]string{ - "resource": fmt.Sprintf("/api/v2/%ss/%s", "dashboard", l.ResourceID), - }, - Label: l.Name, - } -} - -type labelsResponse struct { - Links map[string]string `json:"links"` - Labels []string `json:"labels"` -} - -func (ls labelsResponse) ToPlatform() []*plat.Label { - labels := make([]*plat.Label, len(ls.Labels)) - for i := range ls.Labels { - labels[i] = &plat.Label{ - Name: ls.Labels[i], - } - } - return labels -} - -func newLabelsResponse(opts plat.FindOptions, f plat.LabelFilter, ls []*plat.Label) *labelsResponse { - var labels []string - for _, l := range ls { - labels = append(labels, l.Name) - } - - // TODO: Remove "dashboard" from this - return &labelsResponse{ - Links: map[string]string{ - "resource": fmt.Sprintf("/api/v2/%ss/%s", "dashboard", f.ResourceID), - }, - Labels: labels, - } -} - -// newGetLabelsHandler returns a handler func for a GET to /labels endpoints -func newGetLabelsHandler(s plat.LabelService) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - req, err := decodeGetLabelsRequest(ctx, r) - if err != nil { - EncodeError(ctx, err, w) - return - } - - opts := plat.FindOptions{} - labels, err := s.FindLabels(ctx, req.filter) - if err != nil { - EncodeError(ctx, err, w) - return - } - - if err := encodeResponse(ctx, w, http.StatusOK, newLabelsResponse(opts, req.filter, labels)); err != nil { - EncodeError(ctx, err, w) - return - } - } -} - -type getLabelsRequest struct { - filter plat.LabelFilter -} - -func decodeGetLabelsRequest(ctx context.Context, r *http.Request) (*getLabelsRequest, error) { - qp := r.URL.Query() - req := &getLabelsRequest{} - - params := httprouter.ParamsFromContext(ctx) - id := params.ByName("id") - if id == "" { - return nil, kerrors.InvalidDataf("url missing id") - } - - var i plat.ID - if err := i.DecodeFromString(id); err != nil { - return nil, err - } - req.filter.ResourceID = i - - if name := qp.Get("name"); name != "" { - req.filter.Name = name - } - - return req, nil -} - -// newPostLabelHandler returns a handler func for a POST to /labels endpoints -func newPostLabelHandler(s plat.LabelService) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - req, err := decodePostLabelRequest(ctx, r) - if err != nil { - EncodeError(ctx, err, w) - return - } - - label := &plat.Label{ - ResourceID: req.ResourceID, - Name: req.Name, - } - - if err := label.Validate(); err != nil { - EncodeError(ctx, err, w) - return - } - - if err := s.CreateLabel(ctx, label); err != nil { - EncodeError(ctx, err, w) - return - } - - if err := encodeResponse(ctx, w, http.StatusCreated, newLabelResponse(label)); err != nil { - EncodeError(ctx, err, w) - return - } - } -} - -type postLabelRequest struct { - ResourceID plat.ID - Name string -} - -func decodePostLabelRequest(ctx context.Context, r *http.Request) (*postLabelRequest, error) { - params := httprouter.ParamsFromContext(ctx) - id := params.ByName("id") - if id == "" { - return nil, kerrors.InvalidDataf("url missing id") - } - - name := params.ByName("name") - if name == "" { - return nil, kerrors.InvalidDataf("url missing label name") - } - - var rid plat.ID - if err := rid.DecodeFromString(id); err != nil { - return nil, err - } - - label := &postLabelRequest{ - ResourceID: rid, - Name: name, - } - - return label, nil -} - -// newDeleteLabelHandler returns a handler func for a DELETE to /labels endpoints -func newDeleteLabelHandler(s plat.LabelService) http.HandlerFunc { - return func(w http.ResponseWriter, r *http.Request) { - ctx := r.Context() - - req, err := decodeDeleteLabelRequest(ctx, r) - if err != nil { - EncodeError(ctx, err, w) - return - } - - label := plat.Label{ - ResourceID: req.ResourceID, - Name: req.Name, - } - - if err := s.DeleteLabel(ctx, label); err != nil { - EncodeError(ctx, err, w) - return - } - - w.WriteHeader(http.StatusNoContent) - } -} - -type deleteLabelRequest struct { - ResourceID plat.ID - Name string -} - -func decodeDeleteLabelRequest(ctx context.Context, r *http.Request) (*deleteLabelRequest, error) { - params := httprouter.ParamsFromContext(ctx) - id := params.ByName("id") - if id == "" { - return nil, kerrors.InvalidDataf("url missing resource id") - } - - var rid plat.ID - if err := rid.DecodeFromString(id); err != nil { - return nil, err - } - - label := &deleteLabelRequest{} - if err := json.NewDecoder(r.Body).Decode(label); err != nil { - return nil, err - } - - if label.Name == "" { - return nil, kerrors.InvalidDataf("label name is missing") - } - label.ResourceID = rid - - return label, nil -} - -// FindLabels returns a slice of labels -func (s *LabelService) FindLabels(ctx context.Context, filter plat.LabelFilter, opt ...plat.FindOptions) ([]*plat.Label, error) { - url, err := newURL(s.Addr, resourceIDPath(s.BasePath, filter.ResourceID)) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("GET", url.String(), nil) - if err != nil { - return nil, err - } - - SetToken(s.Token, req) - - hc := newClient(url.Scheme, s.InsecureSkipVerify) - - resp, err := hc.Do(req) - if err != nil { - return nil, err - } - - if err := CheckError(resp); err != nil { - return nil, err - } - - var r labelsResponse - if err := json.NewDecoder(resp.Body).Decode(&r); err != nil { - return nil, err - } - - rs := r.ToPlatform() - return rs, nil -} - -func (s *LabelService) CreateLabel(ctx context.Context, l *plat.Label) error { - if err := l.Validate(); err != nil { - return err - } - - url, err := newURL(s.Addr, resourceIDPath(s.BasePath, l.ResourceID)) - if err != nil { - return err - } - - octets, err := json.Marshal(l) - if err != nil { - return err - } - - req, err := http.NewRequest("POST", url.String(), bytes.NewReader(octets)) - if err != nil { - return err - } - - req.Header.Set("Content-Type", "application/json") - SetToken(s.Token, req) - - hc := newClient(url.Scheme, s.InsecureSkipVerify) - - resp, err := hc.Do(req) - if err != nil { - return err - } - - if err := CheckError(resp); err != nil { - return err - } - - if err := json.NewDecoder(resp.Body).Decode(l); err != nil { - return err - } - - return nil -} - -func (s *LabelService) DeleteLabel(ctx context.Context, l plat.Label) error { - url, err := newURL(s.Addr, labelNamePath(s.BasePath, l.ResourceID, l.Name)) - if err != nil { - return err - } - - req, err := http.NewRequest("DELETE", url.String(), nil) - if err != nil { - return err - } - SetToken(s.Token, req) - - hc := newClient(url.Scheme, s.InsecureSkipVerify) - resp, err := hc.Do(req) - if err != nil { - return err - } - return CheckError(resp) -} - -func labelNamePath(basePath string, resourceID plat.ID, name string) string { - return path.Join(basePath, resourceID.String(), "labels", name) -} diff --git a/http/swagger.yml b/http/swagger.yml index 1911f32c78c..9a53dfa4261 100644 --- a/http/swagger.yml +++ b/http/swagger.yml @@ -1292,79 +1292,6 @@ paths: application/json: schema: $ref: "#/components/schemas/Error" - '/dashboards/{dashboardID}/labels': - get: - tags: - - Dashboards - summary: list all labels for a dashboard - parameters: - - in: path - name: dashboardID - schema: - type: string - required: true - description: ID of the dashboard - responses: - '200': - description: a list of all labels for a dashboard - content: - application/json: - schema: - type: object - properties: - labels: - type: array - items: - type: string - links: - $ref: "#/components/schemas/Links" - default: - description: unexpected error - content: - application/json: - schema: - $ref: "#/components/schemas/Error" - post: - tags: - - Dashboards - summary: add a label to a dashboard - parameters: - - in: path - name: dashboardID - schema: - type: string - required: true - description: ID of the dashboard - requestBody: - description: tag to add - required: true - content: - application/json: - schema: - type: object - properties: - label: - type: string - responses: - '200': - description: a list of all labels for a dashboard - content: - application/json: - schema: - type: object - properties: - labels: - type: array - items: - type: string - links: - $ref: "#/components/schemas/Links" - default: - description: unexpected error - content: - application/json: - schema: - $ref: "#/components/schemas/Error" '/dashboards/{dashboardID}/members': get: tags: diff --git a/http/task_service.go b/http/task_service.go index f9f01ffe50f..bc986d6937a 100644 --- a/http/task_service.go +++ b/http/task_service.go @@ -29,7 +29,6 @@ type TaskHandler struct { AuthorizationService platform.AuthorizationService OrganizationService platform.OrganizationService UserResourceMappingService platform.UserResourceMappingService - LabelService platform.LabelService } const ( @@ -44,18 +43,15 @@ const ( tasksIDRunsIDPath = "/api/v2/tasks/:tid/runs/:rid" tasksIDRunsIDLogsPath = "/api/v2/tasks/:tid/runs/:rid/logs" tasksIDRunsIDRetryPath = "/api/v2/tasks/:tid/runs/:rid/retry" - tasksIDLabelsPath = "/api/v2/tasks/:tid/labels" - tasksIDLabelsNamePath = "/api/v2/tasks/:tid/labels/:name" ) // NewTaskHandler returns a new instance of TaskHandler. -func NewTaskHandler(mappingService platform.UserResourceMappingService, labelService platform.LabelService, logger *zap.Logger) *TaskHandler { +func NewTaskHandler(mappingService platform.UserResourceMappingService, logger *zap.Logger) *TaskHandler { h := &TaskHandler{ logger: logger, Router: httprouter.New(), UserResourceMappingService: mappingService, - LabelService: labelService, } h.HandlerFunc("GET", tasksPath, h.handleGetTasks) @@ -81,10 +77,6 @@ func NewTaskHandler(mappingService platform.UserResourceMappingService, labelSer h.HandlerFunc("POST", tasksIDRunsIDRetryPath, h.handleRetryRun) h.HandlerFunc("DELETE", tasksIDRunsIDPath, h.handleCancelRun) - h.HandlerFunc("GET", tasksIDLabelsPath, newGetLabelsHandler(h.LabelService)) - h.HandlerFunc("POST", tasksIDLabelsPath, newPostLabelHandler(h.LabelService)) - h.HandlerFunc("DELETE", tasksIDLabelsNamePath, newDeleteLabelHandler(h.LabelService)) - return h } diff --git a/http/task_service_test.go b/http/task_service_test.go index 645ec600c6e..f43d293a3c4 100644 --- a/http/task_service_test.go +++ b/http/task_service_test.go @@ -111,7 +111,7 @@ func TestTaskHandler_handleGetTasks(t *testing.T) { r := httptest.NewRequest("GET", "http://any.url", nil) w := httptest.NewRecorder() - h := NewTaskHandler(mock.NewUserResourceMappingService(), mock.NewLabelService(), logger.New(os.Stdout)) + h := NewTaskHandler(mock.NewUserResourceMappingService(), logger.New(os.Stdout)) h.TaskService = tt.fields.taskService h.handleGetTasks(w, r) @@ -211,7 +211,7 @@ func TestTaskHandler_handlePostTasks(t *testing.T) { w := httptest.NewRecorder() - h := NewTaskHandler(mock.NewUserResourceMappingService(), mock.NewLabelService(), logger.New(os.Stdout)) + h := NewTaskHandler(mock.NewUserResourceMappingService(), logger.New(os.Stdout)) h.TaskService = tt.fields.taskService h.handlePostTask(w, r) diff --git a/http/task_test.go b/http/task_test.go index 2fa448be8f9..980000ebb36 100644 --- a/http/task_test.go +++ b/http/task_test.go @@ -28,9 +28,10 @@ func httpTaskServiceFactory(t *testing.T) (*servicetest.System, context.CancelFu i := inmem.NewService() + mappingService := mock.NewUserResourceMappingService() h := http.NewAuthenticationHandler() h.AuthorizationService = i - th := http.NewTaskHandler(mock.NewUserResourceMappingService(), mock.NewLabelService(), zaptest.NewLogger(t)) + th := http.NewTaskHandler(mappingService, zaptest.NewLogger(t)) th.TaskService = backingTS th.AuthorizationService = i h.Handler = th diff --git a/http/user_resource_mapping_service.go b/http/user_resource_mapping_service.go index 14383896e64..bd94684aa26 100644 --- a/http/user_resource_mapping_service.go +++ b/http/user_resource_mapping_service.go @@ -261,8 +261,16 @@ func (s *UserResourceMappingService) FindUserResourceMappings(ctx context.Contex } func (s *UserResourceMappingService) CreateUserResourceMapping(ctx context.Context, m *platform.UserResourceMapping) error { - if err := m.Validate(); err != nil { - return err + if !m.ResourceID.Valid() { + return kerrors.InvalidDataf("resource ID is required") + } + + if !m.UserID.Valid() { + return kerrors.InvalidDataf("user ID is required") + } + + if m.UserType == "" { + return kerrors.InvalidDataf("user type is required") } url, err := newURL(s.Addr, resourceIDPath(s.BasePath, m.ResourceID)) diff --git a/label.go b/label.go deleted file mode 100644 index a26b50f4cd5..00000000000 --- a/label.go +++ /dev/null @@ -1,53 +0,0 @@ -// Resource types that can have labels: -// Dashboards, Users, Tokens, Buckets - -// Other implementation thoughts: -// - check for duplicate values for a resource when creating new ones -// - should it do nothing and return success, or is it better to return a failure? -// - a failure is probably more semantically correct, because it doesn't actually create the resource; the frontend can handle it how it wants to -// - should we swallow deletion if a key doesn't exist? -// - ensure that proper bucket cleanup happens if a resource is deleted, or if a single label is removed -// -// Say we want to filter on all dashboards that match a tag. What would the interface look like? -// probably something like /dashboards?tag=baz - -package platform - -import ( - "context" - "errors" -) - -type LabelService interface { - // FindLabels returns a list of labels that match a filter - FindLabels(ctx context.Context, filter LabelFilter, opt ...FindOptions) ([]*Label, error) - - // CreateLabel creates a new label - CreateLabel(ctx context.Context, l *Label) error - - // DeleteLabel deletes a label - DeleteLabel(ctx context.Context, l Label) error -} - -type Label struct { - ResourceID ID `json:"resource_id"` - Name string `json:"name"` -} - -// Validate returns an error if the label is invalid. -func (l *Label) Validate() error { - if !l.ResourceID.Valid() { - return errors.New("resourceID is required") - } - - if l.Name == "" { - return errors.New("label name is required") - } - - return nil -} - -type LabelFilter struct { - ResourceID ID - Name string -} diff --git a/label_test.go b/label_test.go deleted file mode 100644 index 0d93514446d..00000000000 --- a/label_test.go +++ /dev/null @@ -1,53 +0,0 @@ -package platform_test - -import ( - "testing" - - "github.com/influxdata/platform" - platformtesting "github.com/influxdata/platform/testing" -) - -func TestLabelValidate(t *testing.T) { - type fields struct { - ResourceID platform.ID - Name string - } - tests := []struct { - name string - fields fields - wantErr bool - }{ - { - name: "valid label", - fields: fields{ - ResourceID: platformtesting.MustIDBase16("020f755c3c082000"), - Name: "iot", - }, - }, - { - name: "label requires a resourceid", - fields: fields{ - Name: "iot", - }, - wantErr: true, - }, - { - name: "label requires a name", - fields: fields{ - ResourceID: platformtesting.MustIDBase16("020f755c3c082000"), - }, - wantErr: true, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - m := platform.Label{ - ResourceID: tt.fields.ResourceID, - Name: tt.fields.Name, - } - if err := m.Validate(); (err != nil) != tt.wantErr { - t.Errorf("Label.Validate() error = %v, wantErr %v", err, tt.wantErr) - } - }) - } -} diff --git a/mock/label_service.go b/mock/label_service.go deleted file mode 100644 index c158f8f10e8..00000000000 --- a/mock/label_service.go +++ /dev/null @@ -1,43 +0,0 @@ -package mock - -import ( - "context" - - "github.com/influxdata/platform" -) - -var _ platform.LabelService = &LabelService{} - -// LabelService is a mock implementation of platform.LabelService -type LabelService struct { - FindLabelsFn func(context.Context, platform.LabelFilter) ([]*platform.Label, error) - CreateLabelFn func(context.Context, *platform.Label) error - DeleteLabelFn func(context.Context, platform.Label) error -} - -// NewLabelService returns a mock of LabelService -// where its methods will return zero values. -func NewLabelService() *LabelService { - return &LabelService{ - FindLabelsFn: func(context.Context, platform.LabelFilter) ([]*platform.Label, error) { - return nil, nil - }, - CreateLabelFn: func(context.Context, *platform.Label) error { return nil }, - DeleteLabelFn: func(context.Context, platform.Label) error { return nil }, - } -} - -// FindLabels finds mappings that match a given filter. -func (s *LabelService) FindLabels(ctx context.Context, filter platform.LabelFilter, opt ...platform.FindOptions) ([]*platform.Label, error) { - return s.FindLabelsFn(ctx, filter) -} - -// CreateLabel creates a new Label. -func (s *LabelService) CreateLabel(ctx context.Context, m *platform.Label) error { - return s.CreateLabelFn(ctx, m) -} - -// DeleteLabel removes a Label. -func (s *LabelService) DeleteLabel(ctx context.Context, l platform.Label) error { - return s.DeleteLabelFn(ctx, l) -} diff --git a/testing/label_service.go b/testing/label_service.go deleted file mode 100644 index b31c1098706..00000000000 --- a/testing/label_service.go +++ /dev/null @@ -1,359 +0,0 @@ -package testing - -import ( - "context" - "fmt" - "testing" - - "github.com/google/go-cmp/cmp" - "github.com/influxdata/platform" -) - -type LabelFields struct { - Labels []*platform.Label -} - -type labelServiceF func( - init func(LabelFields, *testing.T) (platform.LabelService, func()), - t *testing.T, -) - -// LabelService tests all the service functions. -func LabelService( - init func(LabelFields, *testing.T) (platform.LabelService, func()), - t *testing.T, -) { - tests := []struct { - name string - fn labelServiceF - }{ - { - name: "CreateLabel", - fn: CreateLabel, - }, - { - name: "FindLabels", - fn: FindLabels, - }, - { - name: "DeleteLabel", - fn: DeleteLabel, - }, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - tt.fn(init, t) - }) - } -} - -func CreateLabel( - init func(LabelFields, *testing.T) (platform.LabelService, func()), - t *testing.T, -) { - type args struct { - label *platform.Label - } - type wants struct { - err error - labels []*platform.Label - } - - tests := []struct { - name string - fields LabelFields - args args - wants wants - }{ - { - name: "basic create label", - fields: LabelFields{ - Labels: []*platform.Label{ - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag1", - }, - }, - }, - args: args{ - label: &platform.Label{ - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag2", - }, - }, - wants: wants{ - labels: []*platform.Label{ - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag1", - }, - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag2", - }, - }, - }, - }, - { - name: "duplicate labels fail", - fields: LabelFields{ - Labels: []*platform.Label{ - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag1", - }, - }, - }, - args: args{ - label: &platform.Label{ - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag1", - }, - }, - wants: wants{ - labels: []*platform.Label{ - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag1", - }, - }, - err: fmt.Errorf("label Tag1 already exists"), - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - s, done := init(tt.fields, t) - defer done() - ctx := context.Background() - err := s.CreateLabel(ctx, tt.args.label) - if (err != nil) != (tt.wants.err != nil) { - t.Fatalf("expected error '%v' got '%v'", tt.wants.err, err) - } - - if err != nil && tt.wants.err != nil { - if err.Error() != tt.wants.err.Error() { - t.Fatalf("expected error messages to match '%v' got '%v'", tt.wants.err, err.Error()) - } - } - defer s.DeleteLabel(ctx, *tt.args.label) - - labels, err := s.FindLabels(ctx, platform.LabelFilter{}) - if err != nil { - t.Fatalf("failed to retrieve labels: %v", err) - } - if diff := cmp.Diff(labels, tt.wants.labels, mappingCmpOptions...); diff != "" { - t.Errorf("labels are different -got/+want\ndiff %s", diff) - } - }) - } -} - -func FindLabels( - init func(LabelFields, *testing.T) (platform.LabelService, func()), - t *testing.T, -) { - type args struct { - filter platform.LabelFilter - } - type wants struct { - err error - labels []*platform.Label - } - - tests := []struct { - name string - fields LabelFields - args args - wants wants - }{ - { - name: "basic find labels", - fields: LabelFields{ - Labels: []*platform.Label{ - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag1", - }, - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag2", - }, - }, - }, - args: args{ - filter: platform.LabelFilter{}, - }, - wants: wants{ - labels: []*platform.Label{ - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag1", - }, - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag2", - }, - }, - }, - }, - { - name: "find labels filtering", - fields: LabelFields{ - Labels: []*platform.Label{ - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag1", - }, - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag2", - }, - { - ResourceID: MustIDBase16(bucketTwoID), - Name: "Tag1", - }, - }, - }, - args: args{ - filter: platform.LabelFilter{ - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag1", - }, - }, - wants: wants{ - labels: []*platform.Label{ - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag1", - }, - }, - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - s, done := init(tt.fields, t) - defer done() - ctx := context.TODO() - labels, err := s.FindLabels(ctx, tt.args.filter) - if (err != nil) != (tt.wants.err != nil) { - t.Fatalf("expected error '%v' got '%v'", tt.wants.err, err) - } - - if err != nil && tt.wants.err != nil { - if err.Error() != tt.wants.err.Error() { - t.Fatalf("expected error messages to match '%v' got '%v'", tt.wants.err, err.Error()) - } - } - - if diff := cmp.Diff(labels, tt.wants.labels, mappingCmpOptions...); diff != "" { - t.Errorf("labels are different -got/+want\ndiff %s", diff) - } - }) - } -} - -func DeleteLabel( - init func(LabelFields, *testing.T) (platform.LabelService, func()), - t *testing.T, -) { - type args struct { - label platform.Label - } - type wants struct { - err error - labels []*platform.Label - } - - tests := []struct { - name string - fields LabelFields - args args - wants wants - }{ - { - name: "basic delete label", - fields: LabelFields{ - Labels: []*platform.Label{ - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag1", - }, - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag2", - }, - }, - }, - args: args{ - label: platform.Label{ - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag1", - }, - }, - wants: wants{ - labels: []*platform.Label{ - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag2", - }, - }, - }, - }, - { - name: "deleting a non-existant label", - fields: LabelFields{ - Labels: []*platform.Label{ - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag1", - }, - }, - }, - args: args{ - label: platform.Label{ - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag2", - }, - }, - wants: wants{ - labels: []*platform.Label{ - { - ResourceID: MustIDBase16(bucketOneID), - Name: "Tag1", - }, - }, - err: fmt.Errorf("label not found"), - }, - }, - } - - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - s, done := init(tt.fields, t) - defer done() - ctx := context.TODO() - err := s.DeleteLabel(ctx, tt.args.label) - if (err != nil) != (tt.wants.err != nil) { - t.Fatalf("expected error '%v' got '%v'", tt.wants.err, err) - } - - if err != nil && tt.wants.err != nil { - if err.Error() != tt.wants.err.Error() { - t.Fatalf("expected error messages to match '%v' got '%v'", tt.wants.err, err.Error()) - } - } - - labels, err := s.FindLabels(ctx, platform.LabelFilter{}) - if err != nil { - t.Fatalf("failed to retrieve labels: %v", err) - } - if diff := cmp.Diff(labels, tt.wants.labels, mappingCmpOptions...); diff != "" { - t.Errorf("labels are different -got/+want\ndiff %s", diff) - } - }) - } -} diff --git a/user_resource_mapping.go b/user_resource_mapping.go index 46c862ad7f1..f721e038c37 100644 --- a/user_resource_mapping.go +++ b/user_resource_mapping.go @@ -19,8 +19,6 @@ const ( OrgResourceType ResourceType = "org" ViewResourceType ResourceType = "view" TelegrafResourceType ResourceType = "telegraf" - TokenResourceType ResourceType = "token" - UserResourceType ResourceType = "user" ) // UserResourceMappingService maps the relationships between users and resources diff --git a/user_resource_mapping_test.go b/user_resource_mapping_test.go index d2bc3fc170c..ab85f1635f8 100644 --- a/user_resource_mapping_test.go +++ b/user_resource_mapping_test.go @@ -19,15 +19,6 @@ func TestOwnerMappingValidate(t *testing.T) { fields fields wantErr bool }{ - { - name: "valid mapping", - fields: fields{ - UserID: platformtesting.MustIDBase16("debac1e0deadbeef"), - UserType: platform.Owner, - ResourceType: platform.DashboardResourceType, - ResourceID: platformtesting.MustIDBase16("020f755c3c082000"), - }, - }, { name: "mapping requires a resourceid", fields: fields{ @@ -88,10 +79,9 @@ func TestOwnerMappingValidate(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { m := platform.UserResourceMapping{ - ResourceID: tt.fields.ResourceID, - ResourceType: tt.fields.ResourceType, - UserID: tt.fields.UserID, - UserType: tt.fields.UserType, + ResourceID: tt.fields.ResourceID, + UserID: tt.fields.UserID, + UserType: tt.fields.UserType, } if err := m.Validate(); (err != nil) != tt.wantErr { t.Errorf("OwnerMapping.Validate() error = %v, wantErr %v", err, tt.wantErr)