package client import ( "context" "sort" "time" controlapi "github.com/moby/buildkit/api/services/control" "github.com/pkg/errors" ) type UsageInfo struct { ID string Mutable bool InUse bool Size int64 CreatedAt time.Time LastUsedAt *time.Time UsageCount int Parent string Description string RecordType UsageRecordType Shared bool } func (c *Client) DiskUsage(ctx context.Context, opts ...DiskUsageOption) ([]*UsageInfo, error) { info := &DiskUsageInfo{} for _, o := range opts { o.SetDiskUsageOption(info) } req := &controlapi.DiskUsageRequest{Filter: info.Filter} resp, err := c.controlClient().DiskUsage(ctx, req) if err != nil { return nil, errors.Wrap(err, "failed to call diskusage") } var du []*UsageInfo for _, d := range resp.Record { du = append(du, &UsageInfo{ ID: d.ID, Mutable: d.Mutable, InUse: d.InUse, Size: d.Size_, Parent: d.Parent, CreatedAt: d.CreatedAt, Description: d.Description, UsageCount: int(d.UsageCount), LastUsedAt: d.LastUsedAt, RecordType: UsageRecordType(d.RecordType), Shared: d.Shared, }) } sort.Slice(du, func(i, j int) bool { if du[i].Size == du[j].Size { return du[i].ID > du[j].ID } return du[i].Size > du[j].Size }) return du, nil } type DiskUsageOption interface { SetDiskUsageOption(*DiskUsageInfo) } type DiskUsageInfo struct { Filter []string } type UsageRecordType string const ( UsageRecordTypeInternal UsageRecordType = "internal" UsageRecordTypeFrontend UsageRecordType = "frontend" UsageRecordTypeLocalSource UsageRecordType = "source.local" UsageRecordTypeGitCheckout UsageRecordType = "source.git.checkout" UsageRecordTypeCacheMount UsageRecordType = "exec.cachemount" UsageRecordTypeRegular UsageRecordType = "regular" )