From 9b723ece461bc6bd05a59fefbf19d46173bb2f6c Mon Sep 17 00:00:00 2001 From: CrazyMax Date: Fri, 26 May 2023 10:21:48 +0200 Subject: [PATCH] driver: check history capability Signed-off-by: CrazyMax --- driver/docker-container/driver.go | 13 ++++++++++--- driver/docker/driver.go | 3 +++ driver/driver.go | 26 ++++++++++++++++++++++++++ driver/features.go | 2 ++ driver/kubernetes/driver.go | 13 ++++++++++--- driver/remote/driver.go | 8 ++++++++ 6 files changed, 59 insertions(+), 6 deletions(-) diff --git a/driver/docker-container/driver.go b/driver/docker-container/driver.go index 56f99d5a..71469f57 100644 --- a/driver/docker-container/driver.go +++ b/driver/docker-container/driver.go @@ -388,12 +388,19 @@ func (d *Driver) Factory() driver.Factory { } func (d *Driver) Features() map[driver.Feature]bool { + var historyAPI bool + ctx := context.Background() + c, err := d.Client(ctx) + if err == nil { + historyAPI = driver.HistoryAPISupported(ctx, c) + c.Close() + } return map[driver.Feature]bool{ driver.OCIExporter: true, driver.DockerExporter: true, - - driver.CacheExport: true, - driver.MultiPlatform: true, + driver.CacheExport: true, + driver.MultiPlatform: true, + driver.HistoryAPI: historyAPI, } } diff --git a/driver/docker/driver.go b/driver/docker/driver.go index 797b1e9a..599e9b51 100644 --- a/driver/docker/driver.go +++ b/driver/docker/driver.go @@ -60,6 +60,7 @@ func (d *Driver) Client(ctx context.Context) (*client.Client, error) { func (d *Driver) Features() map[driver.Feature]bool { var useContainerdSnapshotter bool + var historyAPI bool ctx := context.Background() c, err := d.Client(ctx) if err == nil { @@ -69,6 +70,7 @@ func (d *Driver) Features() map[driver.Feature]bool { useContainerdSnapshotter = true } } + historyAPI = driver.HistoryAPISupported(ctx, c) c.Close() } return map[driver.Feature]bool{ @@ -76,6 +78,7 @@ func (d *Driver) Features() map[driver.Feature]bool { driver.DockerExporter: useContainerdSnapshotter, driver.CacheExport: useContainerdSnapshotter, driver.MultiPlatform: useContainerdSnapshotter, + driver.HistoryAPI: historyAPI, } } diff --git a/driver/driver.go b/driver/driver.go index ed108031..b6ca5275 100644 --- a/driver/driver.go +++ b/driver/driver.go @@ -6,8 +6,11 @@ import ( "github.com/docker/buildx/store" "github.com/docker/buildx/util/progress" clitypes "github.com/docker/cli/cli/config/types" + controlapi "github.com/moby/buildkit/api/services/control" "github.com/moby/buildkit/client" + "github.com/moby/buildkit/util/grpcerrors" "github.com/pkg/errors" + "google.golang.org/grpc/codes" ) var ErrNotRunning = errors.Errorf("driver not running") @@ -89,3 +92,26 @@ func Boot(ctx, clientContext context.Context, d Driver, pw progress.Writer) (*cl return c, nil } } + +func HistoryAPISupported(ctx context.Context, c *client.Client) (res bool) { + res = true + checkErrF := func(err error) { + if s, ok := grpcerrors.AsGRPCStatus(err); ok { + if s.Code() == codes.Unimplemented { + res = false + } + } + } + cl, err := c.ControlClient().ListenBuildHistory(ctx, &controlapi.BuildHistoryRequest{ + ActiveOnly: true, + Ref: "buildx-dummy-ref", // dummy ref to check if the server supports the API + EarlyExit: true, + }) + if err != nil { + checkErrF(err) + return + } + _, err = cl.Recv() + checkErrF(err) + return +} diff --git a/driver/features.go b/driver/features.go index 3438f7e0..d908d750 100644 --- a/driver/features.go +++ b/driver/features.go @@ -7,3 +7,5 @@ const DockerExporter Feature = "Docker exporter" const CacheExport Feature = "cache export" const MultiPlatform Feature = "multiple platforms" + +const HistoryAPI Feature = "history api" diff --git a/driver/kubernetes/driver.go b/driver/kubernetes/driver.go index d306c60c..d8fa25b9 100644 --- a/driver/kubernetes/driver.go +++ b/driver/kubernetes/driver.go @@ -229,11 +229,18 @@ func (d *Driver) Factory() driver.Factory { } func (d *Driver) Features() map[driver.Feature]bool { + var historyAPI bool + ctx := context.Background() + c, err := d.Client(ctx) + if err == nil { + historyAPI = driver.HistoryAPISupported(ctx, c) + c.Close() + } return map[driver.Feature]bool{ driver.OCIExporter: true, driver.DockerExporter: d.DockerAPI != nil, - - driver.CacheExport: true, - driver.MultiPlatform: true, // Untested (needs multiple Driver instances) + driver.CacheExport: true, + driver.MultiPlatform: true, // Untested (needs multiple Driver instances) + driver.HistoryAPI: historyAPI, } } diff --git a/driver/remote/driver.go b/driver/remote/driver.go index d446f226..58058612 100644 --- a/driver/remote/driver.go +++ b/driver/remote/driver.go @@ -88,11 +88,19 @@ func (d *Driver) Client(ctx context.Context) (*client.Client, error) { } func (d *Driver) Features() map[driver.Feature]bool { + var historyAPI bool + ctx := context.Background() + c, err := d.Client(ctx) + if err == nil { + historyAPI = driver.HistoryAPISupported(ctx, c) + c.Close() + } return map[driver.Feature]bool{ driver.OCIExporter: true, driver.DockerExporter: true, driver.CacheExport: true, driver.MultiPlatform: true, + driver.HistoryAPI: historyAPI, } }