Browse code

builder: export build cache records

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>

Tonis Tiigi authored on 2018/05/16 02:02:16
Showing 5 changed files
... ...
@@ -2,6 +2,7 @@ package system // import "github.com/docker/docker/api/server/router/system"
2 2
 
3 3
 import (
4 4
 	"github.com/docker/docker/api/server/router"
5
+	buildkit "github.com/docker/docker/builder/builder-next"
5 6
 	"github.com/docker/docker/builder/fscache"
6 7
 )
7 8
 
... ...
@@ -11,15 +12,17 @@ type systemRouter struct {
11 11
 	backend Backend
12 12
 	cluster ClusterBackend
13 13
 	routes  []router.Route
14
-	builder *fscache.FSCache
14
+	fscache *fscache.FSCache // legacy
15
+	builder *buildkit.Builder
15 16
 }
16 17
 
17 18
 // NewRouter initializes a new system router
18
-func NewRouter(b Backend, c ClusterBackend, fscache *fscache.FSCache) router.Router {
19
+func NewRouter(b Backend, c ClusterBackend, fscache *fscache.FSCache, builder *buildkit.Builder) router.Router {
19 20
 	r := &systemRouter{
20 21
 		backend: b,
21 22
 		cluster: c,
22
-		builder: fscache,
23
+		fscache: fscache,
24
+		builder: builder,
23 25
 	}
24 26
 
25 27
 	r.routes = []router.Route{
... ...
@@ -17,6 +17,7 @@ import (
17 17
 	"github.com/docker/docker/pkg/ioutils"
18 18
 	pkgerrors "github.com/pkg/errors"
19 19
 	"github.com/sirupsen/logrus"
20
+	"golang.org/x/sync/errgroup"
20 21
 )
21 22
 
22 23
 func optionsHandler(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
... ...
@@ -69,15 +70,48 @@ func (s *systemRouter) getVersion(ctx context.Context, w http.ResponseWriter, r
69 69
 }
70 70
 
71 71
 func (s *systemRouter) getDiskUsage(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
72
-	du, err := s.backend.SystemDiskUsage(ctx)
73
-	if err != nil {
72
+	eg, ctx := errgroup.WithContext(ctx)
73
+
74
+	var du *types.DiskUsage
75
+	eg.Go(func() error {
76
+		var err error
77
+		du, err = s.backend.SystemDiskUsage(ctx)
78
+		if err != nil {
79
+			return err
80
+		}
81
+		return nil
82
+	})
83
+
84
+	var builderSize int64 // legacy
85
+	eg.Go(func() error {
86
+		var err error
87
+		builderSize, err = s.fscache.DiskUsage(ctx)
88
+		if err != nil {
89
+			return pkgerrors.Wrap(err, "error getting fscache build cache usage")
90
+		}
91
+		return nil
92
+	})
93
+
94
+	var buildCache []*types.BuildCache
95
+	eg.Go(func() error {
96
+		var err error
97
+		buildCache, err = s.builder.DiskUsage(ctx)
98
+		if err != nil {
99
+			return pkgerrors.Wrap(err, "error getting fscache build cache usage")
100
+		}
101
+		return nil
102
+	})
103
+
104
+	if err := eg.Wait(); err != nil {
74 105
 		return err
75 106
 	}
76
-	builderSize, err := s.builder.DiskUsage(ctx)
77
-	if err != nil {
78
-		return pkgerrors.Wrap(err, "error getting build cache usage")
107
+
108
+	for _, b := range buildCache {
109
+		builderSize += b.Size
79 110
 	}
111
+
80 112
 	du.BuilderSize = builderSize
113
+	du.BuildCache = buildCache
81 114
 
82 115
 	return httputils.WriteJSON(w, http.StatusOK, du)
83 116
 }
... ...
@@ -512,7 +512,8 @@ type DiskUsage struct {
512 512
 	Images      []*ImageSummary
513 513
 	Containers  []*Container
514 514
 	Volumes     []*Volume
515
-	BuilderSize int64
515
+	BuildCache  []*BuildCache
516
+	BuilderSize int64 // deprecated
516 517
 }
517 518
 
518 519
 // ContainersPruneReport contains the response for Engine API:
... ...
@@ -585,3 +586,17 @@ type PushResult struct {
585 585
 type BuildResult struct {
586 586
 	ID string
587 587
 }
588
+
589
+// BuildCache contains information about a build cache record
590
+type BuildCache struct {
591
+	ID      string
592
+	Mutable bool
593
+	InUse   bool
594
+	Size    int64
595
+
596
+	CreatedAt   time.Time
597
+	LastUsedAt  *time.Time
598
+	UsageCount  int
599
+	Parent      string
600
+	Description string
601
+}
... ...
@@ -8,6 +8,7 @@ import (
8 8
 	"sync"
9 9
 
10 10
 	"github.com/containerd/containerd/content"
11
+	"github.com/docker/docker/api/types"
11 12
 	"github.com/docker/docker/api/types/backend"
12 13
 	"github.com/docker/docker/builder"
13 14
 	"github.com/docker/docker/daemon/images"
... ...
@@ -55,6 +56,30 @@ func (b *Builder) Cancel(ctx context.Context, id string) error {
55 55
 	return nil
56 56
 }
57 57
 
58
+func (b *Builder) DiskUsage(ctx context.Context) ([]*types.BuildCache, error) {
59
+	duResp, err := b.controller.DiskUsage(ctx, &controlapi.DiskUsageRequest{})
60
+	if err != nil {
61
+		return nil, err
62
+	}
63
+
64
+	var items []*types.BuildCache
65
+	for _, r := range duResp.Record {
66
+		items = append(items, &types.BuildCache{
67
+			ID:      r.ID,
68
+			Mutable: r.Mutable,
69
+			InUse:   r.InUse,
70
+			Size:    r.Size_,
71
+
72
+			CreatedAt:   r.CreatedAt,
73
+			LastUsedAt:  r.LastUsedAt,
74
+			UsageCount:  int(r.UsageCount),
75
+			Parent:      r.Parent,
76
+			Description: r.Description,
77
+		})
78
+	}
79
+	return items, nil
80
+}
81
+
58 82
 func (b *Builder) Build(ctx context.Context, opt backend.BuildConfig) (*builder.Result, error) {
59 83
 	var out builder.Result
60 84
 
... ...
@@ -239,7 +239,8 @@ func (cli *DaemonCli) start(opts *daemonOptions) (err error) {
239 239
 type routerOptions struct {
240 240
 	sessionManager *session.Manager
241 241
 	buildBackend   *buildbackend.Backend
242
-	buildCache     *fscache.FSCache
242
+	buildCache     *fscache.FSCache // legacy
243
+	buildkit       *buildkit.Builder
243 244
 	daemon         *daemon.Daemon
244 245
 	api            *apiserver.Server
245 246
 	cluster        *cluster.Cluster
... ...
@@ -289,6 +290,7 @@ func newRouterOptions(config *config.Config, daemon *daemon.Daemon) (routerOptio
289 289
 		sessionManager: sm,
290 290
 		buildBackend:   bb,
291 291
 		buildCache:     buildCache,
292
+		buildkit:       buildkit,
292 293
 		daemon:         daemon,
293 294
 	}, nil
294 295
 }
... ...
@@ -462,7 +464,7 @@ func initRouter(opts routerOptions) {
462 462
 		checkpointrouter.NewRouter(opts.daemon, decoder),
463 463
 		container.NewRouter(opts.daemon, decoder),
464 464
 		image.NewRouter(opts.daemon.ImageService()),
465
-		systemrouter.NewRouter(opts.daemon, opts.cluster, opts.buildCache),
465
+		systemrouter.NewRouter(opts.daemon, opts.cluster, opts.buildCache, opts.buildkit),
466 466
 		volume.NewRouter(opts.daemon.VolumesService()),
467 467
 		build.NewRouter(opts.buildBackend, opts.daemon),
468 468
 		sessionrouter.NewRouter(opts.sessionManager),