From a1c2f9f4d89dec9536e45e9095bb1b4c9837ee4c Mon Sep 17 00:00:00 2001 From: Todd Date: Fri, 3 Jun 2022 11:34:52 -0700 Subject: [PATCH] Add delete service function implementation. (#2124) --- .../handlers/workers/worker_service.go | 38 ++++++++++- .../handlers/workers/worker_service_test.go | 63 +++++++++++++++++++ 2 files changed, 100 insertions(+), 1 deletion(-) diff --git a/internal/daemon/controller/handlers/workers/worker_service.go b/internal/daemon/controller/handlers/workers/worker_service.go index 4330e14e98..372781051f 100644 --- a/internal/daemon/controller/handlers/workers/worker_service.go +++ b/internal/daemon/controller/handlers/workers/worker_service.go @@ -138,7 +138,7 @@ func (s Service) ListWorkers(ctx context.Context, req *pbs.ListWorkersRequest) ( return &pbs.ListWorkersResponse{Items: finalItems}, nil } -// GetWorkers implements the interface pbs.WorkerServiceServer. +// GetWorker implements the interface pbs.WorkerServiceServer. func (s Service) GetWorker(ctx context.Context, req *pbs.GetWorkerRequest) (*pbs.GetWorkerResponse, error) { const op = "workers.(Service).GetWorker" @@ -176,6 +176,22 @@ func (s Service) GetWorker(ctx context.Context, req *pbs.GetWorkerRequest) (*pbs return &pbs.GetWorkerResponse{Item: item}, nil } +// DeleteWorker implements the interface pbs.WorkerServiceServer. +func (s Service) DeleteWorker(ctx context.Context, req *pbs.DeleteWorkerRequest) (*pbs.DeleteWorkerResponse, error) { + if err := validateDeleteRequest(req); err != nil { + return nil, err + } + authResults := s.authResult(ctx, req.GetId(), action.Delete) + if authResults.Error != nil { + return nil, authResults.Error + } + _, err := s.deleteFromRepo(ctx, req.GetId()) + if err != nil { + return nil, err + } + return nil, nil +} + func (s Service) listFromRepo(ctx context.Context, scopeIds []string) ([]*servers.Worker, error) { repo, err := s.repoFn() if err != nil { @@ -206,6 +222,22 @@ func (s Service) getFromRepo(ctx context.Context, id string) (*servers.Worker, e return w, nil } +func (s Service) deleteFromRepo(ctx context.Context, id string) (bool, error) { + const op = "workers.(Service).deleteFromRepo" + repo, err := s.repoFn() + if err != nil { + return false, err + } + rows, err := repo.DeleteWorker(ctx, id) + if err != nil { + if errors.IsNotFoundError(err) { + return false, nil + } + return false, errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete worker")) + } + return rows > 0, nil +} + func (s Service) authResult(ctx context.Context, id string, a action.Type) auth.VerifyResults { res := auth.VerifyResults{} repo, err := s.repoFn() @@ -357,3 +389,7 @@ func validateListRequest(req *pbs.ListWorkersRequest) error { } return nil } + +func validateDeleteRequest(req *pbs.DeleteWorkerRequest) error { + return handlers.ValidateDeleteRequest(handlers.NoopValidatorFn, req, servers.WorkerPrefix) +} diff --git a/internal/daemon/controller/handlers/workers/worker_service_test.go b/internal/daemon/controller/handlers/workers/worker_service_test.go index 007c8da985..98cb863a43 100644 --- a/internal/daemon/controller/handlers/workers/worker_service_test.go +++ b/internal/daemon/controller/handlers/workers/worker_service_test.go @@ -221,3 +221,66 @@ func TestList(t *testing.T) { }) } } + +func TestDelete(t *testing.T) { + conn, _ := db.TestSetup(t, "postgres") + wrap := db.TestWrapper(t) + iamRepo := iam.TestRepo(t, conn, wrap) + iamRepoFn := func() (*iam.Repository, error) { + return iamRepo, nil + } + rw := db.New(conn) + kms := kms.TestKms(t, conn, wrap) + repoFn := func() (*servers.Repository, error) { + return servers.NewRepository(rw, rw, kms) + } + ctx := context.Background() + + s, err := NewService(ctx, repoFn, iamRepoFn) + require.NoError(t, err, "Error when getting new worker service.") + + w := servers.TestWorker(t, conn, wrap) + + cases := []struct { + name string + scopeId string + req *pbs.DeleteWorkerRequest + res *pbs.DeleteWorkerResponse + err error + }{ + { + name: "Delete an Existing Worker", + scopeId: w.GetScopeId(), + req: &pbs.DeleteWorkerRequest{ + Id: w.GetPublicId(), + }, + }, + { + name: "Delete bad worker id", + scopeId: w.GetScopeId(), + req: &pbs.DeleteWorkerRequest{ + Id: servers.WorkerPrefix + "_doesntexis", + }, + err: handlers.ApiErrorWithCode(codes.NotFound), + }, + { + name: "Bad Worker Id formatting", + scopeId: w.GetScopeId(), + req: &pbs.DeleteWorkerRequest{ + Id: "bad_format", + }, + err: handlers.ApiErrorWithCode(codes.InvalidArgument), + }, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + assert, require := assert.New(t), require.New(t) + got, gErr := s.DeleteWorker(auth.DisabledAuthTestContext(iamRepoFn, tc.scopeId), tc.req) + if tc.err != nil { + require.Error(gErr) + assert.True(errors.Is(gErr, tc.err), "DeleteWorker(%+v) got error %v, wanted %v", tc.req, gErr, tc.err) + } + assert.EqualValuesf(tc.res, got, "DeleteWorker(%+v) got response %q, wanted %q", tc.req, got, tc.res) + }) + } +}