From d50ad030cbec14808a253b71be5eec2c0750f89b Mon Sep 17 00:00:00 2001 From: zelahi Date: Mon, 22 Jul 2019 17:05:13 -0700 Subject: [PATCH] ADDED logic for prune command --- commands/prune.go | 79 ++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 71 insertions(+), 8 deletions(-) diff --git a/commands/prune.go b/commands/prune.go index f9dd65dd..141d7f14 100644 --- a/commands/prune.go +++ b/commands/prune.go @@ -1,28 +1,91 @@ package commands import ( + "context" "fmt" + "strings" - "github.com/docker/cli/cli" + "github.com/docker/cli/cli" "github.com/docker/cli/cli/command" + "github.com/docker/cli/opts" + "github.com/docker/docker/api/types" + units "github.com/docker/go-units" "github.com/spf13/cobra" ) -func runPrune(dockerCli command.Cli) error { - fmt.Println("ASDF run prune") - return nil +type pruneOptions struct { + force bool + all bool + filter opts.FilterOpt + keepStorage opts.MemBytes +} + +const ( + normalWarning = `WARNING! This will remove all dangling build cache. Are you sure you want to continue?` + allCacheWarning = `WARNING! This will remove all build cache. Are you sure you want to continue?` +) + +func runPrune(dockerCli command.Cli, options pruneOptions) (spaceReclaimed uint64, output string, err error) { + pruneFilters := options.filter.Value() + pruneFilters = command.PruneFilters(dockerCli, pruneFilters) + + warning := normalWarning + if options.all { + warning = allCacheWarning + } + if !options.force && !command.PromptForConfirmation(dockerCli.In(), dockerCli.Out(), warning) { + return 0, "", nil + } + + report, err := dockerCli.Client().BuildCachePrune(context.Background(), types.BuildCachePruneOptions{ + All: options.all, + KeepStorage: options.keepStorage.Value(), + Filters: pruneFilters, + }) + if err != nil { + return 0, "", err + } + + if len(report.CachesDeleted) > 0 { + var sb strings.Builder + sb.WriteString("Deleted build cache objects:\n") + for _, id := range report.CachesDeleted { + sb.WriteString(id) + sb.WriteByte('\n') + } + output = sb.String() + } + + return report.SpaceReclaimed, output, nil } func pruneCmd(dockerCli command.Cli) *cobra.Command { - fmt.Println("ASDF prune command added") + options := pruneOptions{filter: opts.NewFilterOpt()} cmd := &cobra.Command{ Use: "prune", - Short: "clear the buildx build cache ", - Args: cli.ExactArgs(0), + Short: "Remove build cache ", + Args: cli.NoArgs, RunE: func(cmd *cobra.Command, args []string) error { - return runPrune(dockerCli) + spaceReclaimed, output, err := runPrune(dockerCli, options) + if err != nil { + return err + } + if output != "" { + fmt.Fprintln(dockerCli.Out(), output) + } + fmt.Fprintln(dockerCli.Out(), "Total reclaimed space:", units.HumanSize(float64(spaceReclaimed))) + return nil }, + Annotations: map[string]string{"version":"1.00"}, + } + +flags := cmd.Flags() +flags.BoolVarP(&options.force, "force", "f", false, "Do not prompt for confirmation") +flags.BoolVarP(&options.all, "all", "a", false, "Remove all unused images, not just dangling ones") +flags.Var(&options.filter, "filter", "Provide filter values (e.g. 'unused-for=24h')") +flags.Var(&options.keepStorage, "keep-storage", "Amount of disk space to keep for cache") + return cmd }