From 6732edf8dbef56d258a0310df9951a7306206fe3 Mon Sep 17 00:00:00 2001 From: knoflook Date: Thu, 5 Aug 2021 12:02:13 +0200 Subject: [PATCH] feat: implement app remove See https://git.coopcloud.tech/coop-cloud/go-abra/pulls/43. --- cli/app/remove.go | 121 ++++++++++++++++++++++++++++++++++++++++- cli/internal/common.go | 9 +++ 2 files changed, 128 insertions(+), 2 deletions(-) diff --git a/cli/app/remove.go b/cli/app/remove.go index b211afbf..9bc4d0dd 100644 --- a/cli/app/remove.go +++ b/cli/app/remove.go @@ -1,7 +1,19 @@ package app import ( + "context" + "errors" + "fmt" + "os" + "strings" + "coopcloud.tech/abra/cli/internal" + "coopcloud.tech/abra/client" + "coopcloud.tech/abra/config" + "github.com/AlecAivazis/survey/v2" + "github.com/docker/docker/api/types" + "github.com/docker/docker/api/types/filters" + "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" ) @@ -16,9 +28,114 @@ var VolumesFlag = &cli.BoolFlag{ } var appRemoveCommand = &cli.Command{ - Name: "remove", + Name: "remove", + Aliases: []string{"rm", "delete"}, Flags: []cli.Flag{ VolumesFlag, - internal.SecretsFlag, + internal.ForceFlag, + }, + Action: func(c *cli.Context) error { + appName := c.Args().First() + if appName == "" { + internal.ShowSubcommandHelpAndError(c, errors.New("No app name provided!")) + } + if !internal.Force { + response := false + prompt := &survey.Confirm{ + Message: fmt.Sprintf("About to delete %s, are you sure", appName), + } + survey.AskOne(prompt, &response) + if !response { + return errors.New("User aborted app removal") + } + } + appFiles, err := config.LoadAppFiles("") + if err != nil { + logrus.Fatal(err) + } + appPath := appFiles[appName].Path + fmt.Println(appFiles) + host := appFiles[appName].Server + ctx := context.Background() + cl, err := client.NewClientWithContext(host) + if err != nil { + logrus.Fatal(err) + } + err = os.Remove(appPath) + if err != nil { + logrus.Fatal(err) + } else { + logrus.Info(fmt.Sprintf("File: %s removed", appPath)) + } + + fs := filters.NewArgs() + fs.Add("name", appName) + secretList, err := cl.SecretList(ctx, types.SecretListOptions{Filters: fs}) + if err != nil { + logrus.Fatal(err) + } + secrets := make(map[string]string) + secretNames := []string{} + for _, cont := range secretList { + secrets[cont.Spec.Annotations.Name] = cont.ID //we have to map the names to ID's + secretNames = append(secretNames, cont.Spec.Annotations.Name) + } + secretNamesToRemove := []string{} + + if internal.Force { + secretNamesToRemove = secretNames + } else { + secretsPrompt := &survey.MultiSelect{ + Message: "Which secrets do you want to remove?", + Options: secretNames, + Default: secretNames, + } + survey.AskOne(secretsPrompt, &secretNamesToRemove) + } + + for _, name := range secretNamesToRemove { + err := cl.SecretRemove(ctx, secrets[name]) + if err != nil { + logrus.Fatal(err) + } else { + logrus.Info(fmt.Sprintf("Secret: %s removed", name)) + } + } + + volumeListOKBody, err := cl.VolumeList(ctx, fs) + volumeList := volumeListOKBody.Volumes + if err != nil { + logrus.Fatal(err) + } + vols := []string{} + for _, vol := range volumeList { + vols = append(vols, vol.Name) + } + + if Volumes { + removeVols := []string{} + if internal.Force { + removeVols = vols + } else { + volumesPrompt := &survey.MultiSelect{ + Message: "Which volumes do you want to remove?", + Options: vols, + Default: vols, + } + survey.AskOne(volumesPrompt, &removeVols) + } + for _, vol := range removeVols { + err := cl.VolumeRemove(ctx, vol, internal.Force) // last argument is for force removing + if err != nil { + logrus.Fatal(err) + } else { + logrus.Info("Volume " + vol + " removed") + } + } + } else { + logrus.Info("No volumes were removed. Volumes left: " + strings.Join(vols, ", ")) + } + + return nil }, } diff --git a/cli/internal/common.go b/cli/internal/common.go index a0366162..a77784f9 100644 --- a/cli/internal/common.go +++ b/cli/internal/common.go @@ -42,3 +42,12 @@ var ContextFlag = &cli.StringFlag{ Aliases: []string{"c"}, Destination: &Context, } + +var Force bool + +var ForceFlag = &cli.BoolFlag{ + Name: "force", + Value: false, + Aliases: []string{"f"}, + Destination: &Force, +}