Compare commits
	
		
			2 Commits
		
	
	
		
			0.10.0-rc1
			...
			prune
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 0d8191bc3e | |||
| 20cdfe7a72 | 
| @ -2,15 +2,70 @@ package app | |||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
|  | 	"fmt" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
| 	"coopcloud.tech/abra/cli/internal" | 	"coopcloud.tech/abra/cli/internal" | ||||||
| 	"coopcloud.tech/abra/pkg/autocomplete" | 	"coopcloud.tech/abra/pkg/autocomplete" | ||||||
| 	"coopcloud.tech/abra/pkg/client" | 	"coopcloud.tech/abra/pkg/client" | ||||||
| 	stack "coopcloud.tech/abra/pkg/upstream/stack" | 	stack "coopcloud.tech/abra/pkg/upstream/stack" | ||||||
|  | 	"github.com/docker/docker/api/types/filters" | ||||||
| 	"github.com/sirupsen/logrus" | 	"github.com/sirupsen/logrus" | ||||||
| 	"github.com/urfave/cli" | 	"github.com/urfave/cli" | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | var prune bool | ||||||
|  |  | ||||||
|  | var pruneFlag = &cli.BoolFlag{ | ||||||
|  | 	Name:        "prune, p", | ||||||
|  | 	Destination: &prune, | ||||||
|  | 	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{ | var appUndeployCommand = cli.Command{ | ||||||
| 	Name:      "undeploy", | 	Name:      "undeploy", | ||||||
| 	Aliases:   []string{"un"}, | 	Aliases:   []string{"un"}, | ||||||
| @ -18,6 +73,7 @@ var appUndeployCommand = cli.Command{ | |||||||
| 	Flags: []cli.Flag{ | 	Flags: []cli.Flag{ | ||||||
| 		internal.DebugFlag, | 		internal.DebugFlag, | ||||||
| 		internal.NoInputFlag, | 		internal.NoInputFlag, | ||||||
|  | 		pruneFlag, | ||||||
| 	}, | 	}, | ||||||
| 	Before: internal.SubCommandBefore, | 	Before: internal.SubCommandBefore, | ||||||
| 	Usage:  "Undeploy an app", | 	Usage:  "Undeploy an app", | ||||||
| @ -29,7 +85,6 @@ volumes as eligiblef or pruning once undeployed. | |||||||
| 	Action: func(c *cli.Context) error { | 	Action: func(c *cli.Context) error { | ||||||
| 		app := internal.ValidateApp(c) | 		app := internal.ValidateApp(c) | ||||||
| 		stackName := app.StackName() | 		stackName := app.StackName() | ||||||
|  |  | ||||||
| 		cl, err := client.New(app.Server) | 		cl, err := client.New(app.Server) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			logrus.Fatal(err) | 			logrus.Fatal(err) | ||||||
| @ -54,7 +109,7 @@ volumes as eligiblef or pruning once undeployed. | |||||||
| 		if err := stack.RunRemove(context.Background(), cl, rmOpts); err != nil { | 		if err := stack.RunRemove(context.Background(), cl, rmOpts); err != nil { | ||||||
| 			logrus.Fatal(err) | 			logrus.Fatal(err) | ||||||
| 		} | 		} | ||||||
|  | 		cleanup(c) | ||||||
| 		return nil | 		return nil | ||||||
| 	}, | 	}, | ||||||
| 	BashComplete: autocomplete.AppNameComplete, | 	BashComplete: autocomplete.AppNameComplete, | ||||||
|  | |||||||
							
								
								
									
										83
									
								
								cli/server/prune.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								cli/server/prune.go
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,83 @@ | |||||||
|  | package server | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  |  | ||||||
|  | 	"coopcloud.tech/abra/cli/internal" | ||||||
|  | 	"coopcloud.tech/abra/pkg/client" | ||||||
|  | 	"github.com/docker/docker/api/types/filters" | ||||||
|  | 	"github.com/sirupsen/logrus" | ||||||
|  | 	"github.com/urfave/cli" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var allFilter bool | ||||||
|  |  | ||||||
|  | var allFilterFlag = &cli.BoolFlag{ | ||||||
|  | 	Name:        "all, a", | ||||||
|  | 	Usage:       "Remove all unused images not just dangling ones", | ||||||
|  | 	Destination: &allFilter, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | var volunesFilter bool | ||||||
|  |  | ||||||
|  | var volumesFilterFlag = &cli.BoolFlag{ | ||||||
|  | 	Name:        "volumes, v", | ||||||
|  | 	Usage:       "Prune volumes", | ||||||
|  | 	Destination: &volunesFilter, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | 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:   "[<server>]", | ||||||
|  | 	Flags: []cli.Flag{ | ||||||
|  | 		allFilterFlag, | ||||||
|  | 		volumesFilterFlag, | ||||||
|  | 		internal.DebugFlag, | ||||||
|  | 	}, | ||||||
|  | 	Before: internal.SubCommandBefore, | ||||||
|  | 	Action: func(c *cli.Context) error { | ||||||
|  | 		// Leaving filters empty for now | ||||||
|  | 		var args filters.Args | ||||||
|  | 		serverName := internal.ValidateServer(c) | ||||||
|  |  | ||||||
|  | 		cl, err := client.New(serverName) | ||||||
|  | 		if err != nil { | ||||||
|  | 			logrus.Fatal(err) | ||||||
|  | 		} | ||||||
|  | 		ctx := context.Background() | ||||||
|  | 		cr, err := cl.ContainersPrune(ctx, args) | ||||||
|  | 		if err != nil { | ||||||
|  | 			logrus.Fatal(err) | ||||||
|  | 		} | ||||||
|  | 		logrus.Infof("Containers deleted: %s; Space reclaimed: %v", cr.ContainersDeleted, cr.SpaceReclaimed) | ||||||
|  |  | ||||||
|  | 		nr, err := cl.NetworksPrune(ctx, args) | ||||||
|  | 		if err != nil { | ||||||
|  | 			logrus.Fatal(err) | ||||||
|  | 		} | ||||||
|  | 		logrus.Infof("Networks deleted %s", nr.NetworksDeleted) | ||||||
|  |  | ||||||
|  | 		pruneFilters := filters.NewArgs() | ||||||
|  | 		if allFilter { | ||||||
|  | 			pruneFilters.Add("dangling", "false") | ||||||
|  | 		} | ||||||
|  | 		ir, err := cl.ImagesPrune(ctx, pruneFilters) | ||||||
|  | 		if err != nil { | ||||||
|  | 			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 { | ||||||
|  | 				logrus.Fatal(err) | ||||||
|  | 			} | ||||||
|  | 			logrus.Infof("Volumes deleted: %s; Space reclaimed: %v", vr.VolumesDeleted, vr.SpaceReclaimed) | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		return nil | ||||||
|  | 	}, | ||||||
|  | } | ||||||
| @ -22,5 +22,6 @@ recipes, see available flags on "abra server add" for more. | |||||||
| 		serverAddCommand, | 		serverAddCommand, | ||||||
| 		serverListCommand, | 		serverListCommand, | ||||||
| 		serverRemoveCommand, | 		serverRemoveCommand, | ||||||
|  | 		serverPruneCommand, | ||||||
| 	}, | 	}, | ||||||
| } | } | ||||||
|  | |||||||
		Reference in New Issue
	
	Block a user