From 98fc36c83063fe7537f3eab6d7d9c451a68316aa Mon Sep 17 00:00:00 2001 From: decentral1se Date: Fri, 17 Feb 2023 10:59:06 +0100 Subject: [PATCH] refactor: hopefully more robust prune logic, docs --- cli/app/undeploy.go | 79 +++++++++++++++++++++++---------------------- 1 file changed, 41 insertions(+), 38 deletions(-) diff --git a/cli/app/undeploy.go b/cli/app/undeploy.go index 3abf5304..e5861994 100644 --- a/cli/app/undeploy.go +++ b/cli/app/undeploy.go @@ -24,52 +24,53 @@ var pruneFlag = &cli.BoolFlag{ Usage: "Prunes unused containers, networks, and dangling images for an app", } -// pruneSystem runs the equivalent of a "docker system prune" after undeploying -// in order to clean up left over state related to the deployment. We must run -// this logic inside a loop as it may take some time for the undeployed to come -// down. +// pruneSystem runs the equivalent of a "docker system prune" after an undeploy +// in order to clean up left over state related to the deployment. Volumes are +// not pruned to avoid unwated data loss. func pruneSystem(c *cli.Context, cl *dockerClient.Client, app config.App) error { + stackName := app.StackName() + ctx := context.Background() + for { - if !prune { - return nil - } + logrus.Debugf("polling for %s stack, waiting to be undeployed...", stackName) - stackName := app.StackName() - - ctx := context.Background() - pruneFilters := filters.NewArgs() - stackSearch := fmt.Sprintf("%s*", stackName) - pruneFilters.Add("label", stackSearch) - cr, err := cl.ContainersPrune(ctx, pruneFilters) + services, err := stack.GetStackServices(ctx, cl, stackName) if err != nil { - logrus.Errorf(err.Error()) - time.Sleep(time.Second) - continue + return err } - 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 + if len(services) == 0 { + logrus.Debugf("%s undeployed, moving on with pruning logic", stackName) + break } - 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 + time.Sleep(time.Second) } + 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) + return nil } @@ -118,8 +119,10 @@ volumes as eligible for pruning once undeployed. logrus.Fatal(err) } - if err := pruneSystem(c, cl, app); err != nil { - logrus.Fatal(err) + if prune { + if err := pruneSystem(c, cl, app); err != nil { + logrus.Fatal(err) + } } return nil