From 11c838cea45c4a02d7df7d092f81ec0b70a99bf0 Mon Sep 17 00:00:00 2001 From: Ben Pearce Date: Fri, 18 Nov 2022 15:42:51 +1000 Subject: [PATCH] feat: worker delete (#147) --- pkg/cmd/target/delete/delete.go | 8 +-- pkg/cmd/worker/delete/delete.go | 91 +++++++++++++++++++++++++++++++++ pkg/cmd/worker/shared/worker.go | 14 +++++ pkg/cmd/worker/worker.go | 2 + 4 files changed, 112 insertions(+), 3 deletions(-) create mode 100644 pkg/cmd/worker/delete/delete.go diff --git a/pkg/cmd/target/delete/delete.go b/pkg/cmd/target/delete/delete.go index 280aa3ef..4061a678 100644 --- a/pkg/cmd/target/delete/delete.go +++ b/pkg/cmd/target/delete/delete.go @@ -15,6 +15,8 @@ import ( "github.com/spf13/cobra" ) +const resourceDescription = "deployment target" + type DeleteOptions struct { *cmd.Dependencies *shared.GetTargetsOptions @@ -66,7 +68,7 @@ func NewCmdDelete(f factory.Factory) *cobra.Command { } if !skipConfirmation { // TODO NO_PROMPT env var or whatever we do there - return question.DeleteWithConfirmation(f.Ask, "deployment target", itemToDelete.Name, itemToDelete.GetID(), func() error { + return question.DeleteWithConfirmation(f.Ask, resourceDescription, itemToDelete.Name, itemToDelete.GetID(), func() error { return delete(opts.Client, itemToDelete) }) } @@ -75,7 +77,7 @@ func NewCmdDelete(f factory.Factory) *cobra.Command { }, } - question.RegisterConfirmDeletionFlag(cmd, &skipConfirmation, "deployment target") + question.RegisterConfirmDeletionFlag(cmd, &skipConfirmation, resourceDescription) return cmd } @@ -86,7 +88,7 @@ func deleteRun(opts *DeleteOptions) error { return err } - return question.DeleteWithConfirmation(opts.Ask, "deployment target", itemToDelete.Name, itemToDelete.GetID(), func() error { + return question.DeleteWithConfirmation(opts.Ask, resourceDescription, itemToDelete.Name, itemToDelete.GetID(), func() error { return delete(opts.Client, itemToDelete) }) } diff --git a/pkg/cmd/worker/delete/delete.go b/pkg/cmd/worker/delete/delete.go new file mode 100644 index 00000000..0b731c45 --- /dev/null +++ b/pkg/cmd/worker/delete/delete.go @@ -0,0 +1,91 @@ +package delete + +import ( + "fmt" + "github.com/MakeNowJust/heredoc/v2" + "github.com/OctopusDeploy/cli/pkg/cmd" + "github.com/OctopusDeploy/cli/pkg/cmd/worker/shared" + "github.com/OctopusDeploy/cli/pkg/constants" + "github.com/OctopusDeploy/cli/pkg/factory" + "github.com/OctopusDeploy/cli/pkg/question" + "github.com/OctopusDeploy/cli/pkg/question/selectors" + "github.com/OctopusDeploy/cli/pkg/util" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/client" + "github.com/OctopusDeploy/go-octopusdeploy/v2/pkg/machines" + "github.com/spf13/cobra" +) + +const resourceDescription = "worker" + +type DeleteOptions struct { + *cmd.Dependencies + *shared.GetWorkersOptions +} + +func NewDeleteOptions(dependencies *cmd.Dependencies) *DeleteOptions { + return &DeleteOptions{ + Dependencies: dependencies, + GetWorkersOptions: shared.NewGetWorkersOptions(dependencies, nil), + } +} + +func NewCmdDelete(f factory.Factory) *cobra.Command { + var skipConfirmation bool + + cmd := &cobra.Command{ + Use: "delete { | }", + Short: "Delete a worker in an instance of Octopus Deploy", + Long: "Delete a worker in an instance of Octopus Deploy", + Aliases: []string{"del", "rm", "remove"}, + Example: fmt.Sprintf(heredoc.Doc(` + $ %s worker delete + $ %s worker rm + `), constants.ExecutableName, constants.ExecutableName), + RunE: func(c *cobra.Command, args []string) error { + deps := cmd.NewDependencies(f, c) + + if util.Empty(args) { + opts := NewDeleteOptions(deps) + return deleteRun(opts) + } + + idOrName := args[0] + opts := NewDeleteOptions(deps) + worker, err := opts.GetWorkerCallback(idOrName) + if err != nil { + return err + } + + if worker == nil { + return fmt.Errorf("cannot find a worker with name or ID of '%s'", idOrName) + } + + if !skipConfirmation { // TODO NO_PROMPT env var or whatever we do there + return question.DeleteWithConfirmation(f.Ask, resourceDescription, worker.Name, worker.GetID(), func() error { + return delete(opts.Client, worker) + }) + } + + return delete(opts.Client, worker) + }, + } + + question.RegisterConfirmDeletionFlag(cmd, &skipConfirmation, resourceDescription) + + return cmd +} + +func deleteRun(opts *DeleteOptions) error { + worker, err := selectors.Select(opts.Ask, "Select the worker you wish to delete:", opts.GetWorkersCallback, func(worker *machines.Worker) string { return worker.Name }) + if err != nil { + return err + } + + return question.DeleteWithConfirmation(opts.Ask, resourceDescription, worker.Name, worker.GetID(), func() error { + return delete(opts.Client, worker) + }) +} + +func delete(client *client.Client, itemToDelete *machines.Worker) error { + return client.Workers.DeleteByID(itemToDelete.GetID()) +} diff --git a/pkg/cmd/worker/shared/worker.go b/pkg/cmd/worker/shared/worker.go index 09a76fca..c9dadbc4 100644 --- a/pkg/cmd/worker/shared/worker.go +++ b/pkg/cmd/worker/shared/worker.go @@ -7,9 +7,11 @@ import ( ) type GetWorkersCallback func() ([]*machines.Worker, error) +type GetWorkerCallback func(identifer string) (*machines.Worker, error) type GetWorkersOptions struct { GetWorkersCallback + GetWorkerCallback } func NewGetWorkersOptions(dependencies *cmd.Dependencies, filter func(*machines.Worker) bool) *GetWorkersOptions { @@ -17,6 +19,9 @@ func NewGetWorkersOptions(dependencies *cmd.Dependencies, filter func(*machines. GetWorkersCallback: func() ([]*machines.Worker, error) { return GetWorkers(*dependencies.Client, filter) }, + GetWorkerCallback: func(identifier string) (*machines.Worker, error) { + return GetWorker(*dependencies.Client, identifier) + }, } } @@ -48,3 +53,12 @@ func GetWorkers(client client.Client, filter func(*machines.Worker) bool) ([]*ma return workers, nil } + +func GetWorker(client client.Client, identifier string) (*machines.Worker, error) { + worker, err := client.Workers.GetByIdentifier(identifier) + if err != nil { + return nil, err + } + + return worker, nil +} diff --git a/pkg/cmd/worker/worker.go b/pkg/cmd/worker/worker.go index c8257cac..387e3702 100644 --- a/pkg/cmd/worker/worker.go +++ b/pkg/cmd/worker/worker.go @@ -3,6 +3,7 @@ package worker import ( "fmt" "github.com/MakeNowJust/heredoc/v2" + cmdDelete "github.com/OctopusDeploy/cli/pkg/cmd/worker/delete" cmdList "github.com/OctopusDeploy/cli/pkg/cmd/worker/list" listeningTentacle "github.com/OctopusDeploy/cli/pkg/cmd/worker/listening-tentacle" pollingTentacle "github.com/OctopusDeploy/cli/pkg/cmd/worker/polling-tentacle" @@ -32,6 +33,7 @@ func NewCmdWorker(f factory.Factory) *cobra.Command { cmd.AddCommand(pollingTentacle.NewCmdPollingTentacle(f)) cmd.AddCommand(ssh.NewCmdSsh(f)) cmd.AddCommand(cmdList.NewCmdList(f)) + cmd.AddCommand(cmdDelete.NewCmdDelete(f)) cmd.AddCommand(cmdView.NewCmdView(f)) return cmd