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: "[]", 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 { return err } ctx := context.Background() cr, err := cl.ContainersPrune(ctx, args) if err != nil { return 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.Infof("Networks deleted %s", nr.NetworksDeleted) pruneFilters := filters.NewArgs() if allFilter { pruneFilters.Add("dangling", "false") } ir, err := cl.ImagesPrune(ctx, pruneFilters) if err != nil { return 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.Infof("Volumes deleted: %s; Space reclaimed: %v", vr.VolumesDeleted, vr.SpaceReclaimed) } return nil }, }