diff --git a/cli/app/undeploy.go b/cli/app/undeploy.go index 7244d47a..0aa4e72a 100644 --- a/cli/app/undeploy.go +++ b/cli/app/undeploy.go @@ -9,6 +9,7 @@ import ( "coopcloud.tech/abra/pkg/autocomplete" "coopcloud.tech/abra/pkg/client" "coopcloud.tech/abra/pkg/config" + "coopcloud.tech/abra/pkg/formatter" stack "coopcloud.tech/abra/pkg/upstream/stack" "github.com/docker/docker/api/types/filters" dockerClient "github.com/docker/docker/client" @@ -56,21 +57,23 @@ func pruneApp(c *cli.Context, cl *dockerClient.Client, app config.App) error { return err } - logrus.Infof("containers deleted: %s; space reclaimed: %v", cr.ContainersDeleted, cr.SpaceReclaimed) + cntSpaceReclaimed := formatter.ByteCountSI(cr.SpaceReclaimed) + logrus.Infof("containers pruned: %d; space reclaimed: %s", len(cr.ContainersDeleted), cntSpaceReclaimed) nr, err := cl.NetworksPrune(ctx, pruneFilters) if err != nil { return err } - logrus.Infof("networks deleted %s", nr.NetworksDeleted) + logrus.Infof("networks pruned: %d", len(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) + imgSpaceReclaimed := formatter.ByteCountSI(ir.SpaceReclaimed) + logrus.Infof("images pruned: %d; space reclaimed: %s", len(ir.ImagesDeleted), imgSpaceReclaimed) return nil } diff --git a/cli/server/prune.go b/cli/server/prune.go index a03e28bf..bbedbb3d 100644 --- a/cli/server/prune.go +++ b/cli/server/prune.go @@ -6,6 +6,7 @@ import ( "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/pkg/autocomplete" "coopcloud.tech/abra/pkg/client" + "coopcloud.tech/abra/pkg/formatter" "github.com/docker/docker/api/types/filters" "github.com/sirupsen/logrus" "github.com/urfave/cli" @@ -61,14 +62,15 @@ also be removed. This can result in unwanted data loss if not used carefully. logrus.Fatal(err) } - logrus.Infof("containers deleted: %s; space reclaimed: %v", cr.ContainersDeleted, cr.SpaceReclaimed) + cntSpaceReclaimed := formatter.ByteCountSI(cr.SpaceReclaimed) + logrus.Infof("containers pruned: %d; space reclaimed: %s", len(cr.ContainersDeleted), cntSpaceReclaimed) nr, err := cl.NetworksPrune(ctx, args) if err != nil { logrus.Fatal(err) } - logrus.Infof("networks deleted %s", nr.NetworksDeleted) + logrus.Infof("networks pruned: %d", len(nr.NetworksDeleted)) pruneFilters := filters.NewArgs() if allFilter { @@ -80,7 +82,8 @@ also be removed. This can result in unwanted data loss if not used carefully. logrus.Fatal(err) } - logrus.Infof("images deleted: %s; space reclaimed: %v", ir.ImagesDeleted, ir.SpaceReclaimed) + imgSpaceReclaimed := formatter.ByteCountSI(ir.SpaceReclaimed) + logrus.Infof("images pruned: %d; space reclaimed: %s", len(ir.ImagesDeleted), imgSpaceReclaimed) if volunesFilter { vr, err := cl.VolumesPrune(ctx, args) @@ -88,7 +91,8 @@ also be removed. This can result in unwanted data loss if not used carefully. logrus.Fatal(err) } - logrus.Infof("volumes deleted: %s; space reclaimed: %v", vr.VolumesDeleted, vr.SpaceReclaimed) + volSpaceReclaimed := formatter.ByteCountSI(vr.SpaceReclaimed) + logrus.Infof("volumes pruned: %d; space reclaimed: %s", len(vr.VolumesDeleted), volSpaceReclaimed) } return nil diff --git a/pkg/formatter/formatter.go b/pkg/formatter/formatter.go index ca6600b1..f733127d 100644 --- a/pkg/formatter/formatter.go +++ b/pkg/formatter/formatter.go @@ -1,6 +1,7 @@ package formatter import ( + "fmt" "os" "strings" "time" @@ -70,3 +71,21 @@ func StripTagMeta(image string) string { return image } + +// ByteCountSI presents a human friendly representation of a byte count. See +// https://yourbasic.org/golang/formatting-byte-size-to-human-readable-format. +func ByteCountSI(b uint64) string { + const unit = 1000 + + if b < unit { + return fmt.Sprintf("%d B", b) + } + + div, exp := uint64(unit), 0 + for n := b / unit; n >= unit; n /= unit { + div *= unit + exp++ + } + + return fmt.Sprintf("%.1f %cB", float64(b)/float64(div), "kMGTPE"[exp]) +}