forked from toolshed/abra
		
	Closes coop-cloud/organising#389. Closes coop-cloud/organising#341. Closes coop-cloud/organising#326. Closes coop-cloud/organising#380. Closes coop-cloud/organising#360.
		
			
				
	
	
		
			144 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			144 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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: "<domain>",
 | 
						|
	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)
 | 
						|
 | 
						|
		cl, err := client.New(app.Server)
 | 
						|
		if err != nil {
 | 
						|
			logrus.Fatal(err)
 | 
						|
		}
 | 
						|
 | 
						|
		filters, err := app.Filters(false, true)
 | 
						|
		if err != nil {
 | 
						|
			logrus.Fatal(err)
 | 
						|
		}
 | 
						|
 | 
						|
		volumeList, err := client.GetVolumes(cl, 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 <domain>" 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: "<domain>",
 | 
						|
	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)
 | 
						|
 | 
						|
		cl, err := client.New(app.Server)
 | 
						|
		if err != nil {
 | 
						|
			logrus.Fatal(err)
 | 
						|
		}
 | 
						|
 | 
						|
		filters, err := app.Filters(false, true)
 | 
						|
		if err != nil {
 | 
						|
			logrus.Fatal(err)
 | 
						|
		}
 | 
						|
 | 
						|
		volumeList, err := client.GetVolumes(cl, 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(cl, 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: "<domain>",
 | 
						|
	Subcommands: []cli.Command{
 | 
						|
		appVolumeListCommand,
 | 
						|
		appVolumeRemoveCommand,
 | 
						|
	},
 | 
						|
}
 |