package app import ( "context" "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/pkg/autocomplete" "coopcloud.tech/abra/pkg/client" "coopcloud.tech/abra/pkg/formatter" "github.com/AlecAivazis/survey/v2" "github.com/sirupsen/logrus" "github.com/urfave/cli" ) var appVolumeListCommand = cli.Command{ Name: "list", Aliases: []string{"ls"}, ArgsUsage: "", Flags: []cli.Flag{ internal.DebugFlag, internal.NoInputFlag, }, Before: internal.SubCommandBefore, Usage: "List volumes associated with an app", BashComplete: autocomplete.AppNameComplete, Action: func(c *cli.Context) error { app := internal.ValidateApp(c) filters, err := app.Filters(false, true) if err != nil { logrus.Fatal(err) } volumeList, err := client.GetVolumes(context.Background(), app.Server, filters) if err != nil { logrus.Fatal(err) } table := formatter.CreateTable([]string{"name", "created", "mounted"}) var volTable [][]string for _, volume := range volumeList { volRow := []string{volume.Name, volume.CreatedAt, volume.Mountpoint} volTable = append(volTable, volRow) } table.AppendBulk(volTable) if table.NumLines() > 0 { table.Render() } else { logrus.Warnf("no volumes created for %s", app.Name) } return nil }, } var appVolumeRemoveCommand = cli.Command{ Name: "remove", Usage: "Remove volume(s) associated with an app", Description: ` This command supports removing volumes associated with an app. The app in question must be undeployed before you try to remove volumes. See "abra app undeploy " for more. The command is interactive and will show a multiple select input which allows you to make a seclection. Use the "?" key to see more help on navigating this interface. Passing "--force/-f" will select all volumes for removal. Be careful. `, ArgsUsage: "", Aliases: []string{"rm"}, Flags: []cli.Flag{ internal.DebugFlag, internal.NoInputFlag, internal.ForceFlag, }, Before: internal.SubCommandBefore, Action: func(c *cli.Context) error { app := internal.ValidateApp(c) filters, err := app.Filters(false, true) if err != nil { logrus.Fatal(err) } volumeList, err := client.GetVolumes(context.Background(), app.Server, filters) if err != nil { logrus.Fatal(err) } volumeNames := client.GetVolumeNames(volumeList) var volumesToRemove []string if !internal.Force && !internal.NoInput { volumesPrompt := &survey.MultiSelect{ Message: "which volumes do you want to remove?", Help: "'x' indicates selected, enter / return to confirm, ctrl-c to exit, vim mode is enabled", VimMode: true, Options: volumeNames, Default: volumeNames, } if err := survey.AskOne(volumesPrompt, &volumesToRemove); err != nil { logrus.Fatal(err) } } if internal.Force || internal.NoInput { volumesToRemove = volumeNames } err = client.RemoveVolumes(context.Background(), app.Server, volumesToRemove, internal.Force) if err != nil { logrus.Fatal(err) } logrus.Info("volumes removed successfully") return nil }, BashComplete: autocomplete.AppNameComplete, } var appVolumeCommand = cli.Command{ Name: "volume", Aliases: []string{"vl"}, Usage: "Manage app volumes", ArgsUsage: "", Subcommands: []cli.Command{ appVolumeListCommand, appVolumeRemoveCommand, }, }