diff --git a/cli/app/undeploy.go b/cli/app/undeploy.go index 469682b9..79836d24 100644 --- a/cli/app/undeploy.go +++ b/cli/app/undeploy.go @@ -3,6 +3,7 @@ package app import ( "context" "fmt" + "time" "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/pkg/autocomplete" @@ -18,7 +19,51 @@ var prune bool var pruneFlag = &cli.BoolFlag{ Name: "prune, p", Destination: &prune, - Usage: "Prunes unused containers, networks, and dangling images for stack", + Usage: "Prunes unused containers, networks, and dangling images for an app", +} + +func cleanup(c *cli.Context) error { + for { + if !prune { + return nil + } + app := internal.ValidateApp(c) + stackName := app.StackName() + cl, err := client.New(app.Server) + if err != nil { + logrus.Fatal(err) + } + ctx := context.Background() + + pruneFilters := filters.NewArgs() + stackSearch := fmt.Sprintf("%s*", stackName) + pruneFilters.Add("label", stackSearch) + cr, err := cl.ContainersPrune(ctx, pruneFilters) + if err != nil { + logrus.Errorf(err.Error()) + time.Sleep(time.Second) + continue + } + logrus.Infof("Containers deleted: %s; Space reclaimed: %v", cr.ContainersDeleted, cr.SpaceReclaimed) + + nr, err := cl.NetworksPrune(ctx, pruneFilters) + if err != nil { + logrus.Errorf(err.Error()) + time.Sleep(time.Second) + continue + } + logrus.Infof("Networks deleted %s", nr.NetworksDeleted) + + ir, err := cl.ImagesPrune(ctx, pruneFilters) + if err != nil { + logrus.Errorf(err.Error()) + time.Sleep(time.Second) + continue + } + logrus.Infof("Images deleted: %s; Space reclaimed: %v", ir.ImagesDeleted, ir.SpaceReclaimed) + break + } + return nil } var appUndeployCommand = cli.Command{ @@ -64,41 +109,7 @@ volumes as eligible for pruning once undeployed. if err := stack.RunRemove(context.Background(), cl, rmOpts); err != nil { logrus.Fatal(err) } - - return nil - }, - After: func(c *cli.Context) error { - if !prune { - return nil - } - app := internal.ValidateApp(c) - stackName := app.StackName() - cl, err := client.New(app.Server) - if err != nil { - logrus.Fatal(err) - } - ctx := context.Background() - - pruneFilters := filters.NewArgs() - stackSearch := fmt.Sprintf("%s*", stackName) - pruneFilters.Add("label", stackSearch) - cr, err := cl.ContainersPrune(ctx, pruneFilters) - if err != nil { - return err - } - logrus.Infof("Containers deleted: %s; Space reclaimed: %v", cr.ContainersDeleted, cr.SpaceReclaimed) - - nr, err := cl.NetworksPrune(ctx, pruneFilters) - if err != nil { - return err - } - logrus.Infof("Networks deleted %s", nr.NetworksDeleted) - - ir, err := cl.ImagesPrune(ctx, pruneFilters) - if err != nil { - return err - } - logrus.Infof("Images deleted: %s; Space reclaimed: %v", ir.ImagesDeleted, ir.SpaceReclaimed) + cleanup(c) return nil }, BashComplete: autocomplete.AppNameComplete, diff --git a/cli/server/prune.go b/cli/server/prune.go index 49b2084a..2d59947f 100644 --- a/cli/server/prune.go +++ b/cli/server/prune.go @@ -27,13 +27,11 @@ var volumesFilterFlag = &cli.BoolFlag{ } var serverPruneCommand = cli.Command{ - Name: "prune", - Aliases: []string{"p"}, - Usage: "Prune a managed server; Runs a docker system prune", - Description: ` - Prunes unused containers, networks, and dangling images - `, - ArgsUsage: "[]", + Name: "prune", + Aliases: []string{"p"}, + Usage: "Prune a managed server; Runs a docker system prune", + Description: "Prunes unused containers, networks, and dangling images", + ArgsUsage: "[]", Flags: []cli.Flag{ allFilterFlag, volumesFilterFlag, @@ -47,18 +45,18 @@ var serverPruneCommand = cli.Command{ cl, err := client.New(serverName) if err != nil { - return err + logrus.Fatal(err) } ctx := context.Background() cr, err := cl.ContainersPrune(ctx, args) if err != nil { - return err + logrus.Fatal(err) } logrus.Infof("Containers deleted: %s; Space reclaimed: %v", cr.ContainersDeleted, cr.SpaceReclaimed) nr, err := cl.NetworksPrune(ctx, args) if err != nil { - return err + logrus.Fatal(err) } logrus.Infof("Networks deleted %s", nr.NetworksDeleted) @@ -68,14 +66,14 @@ var serverPruneCommand = cli.Command{ } ir, err := cl.ImagesPrune(ctx, pruneFilters) if err != nil { - return err + logrus.Fatal(err) } logrus.Infof("Images deleted: %s; Space reclaimed: %v", ir.ImagesDeleted, ir.SpaceReclaimed) if volunesFilter { vr, err := cl.VolumesPrune(ctx, args) if err != nil { - return err + logrus.Fatal(err) } logrus.Infof("Volumes deleted: %s; Space reclaimed: %v", vr.VolumesDeleted, vr.SpaceReclaimed) }