avoid extra client for history API detection

Signed-off-by: Tonis Tiigi <tonistiigi@gmail.com>
This commit is contained in:
Tonis Tiigi 2023-06-12 17:39:09 -07:00
parent 2c02db8db4
commit 1138789f20
No known key found for this signature in database
GPG Key ID: AFA9DE5F8AB7AF39
10 changed files with 19 additions and 37 deletions

View File

@ -948,7 +948,7 @@ func BuildWithResultHandler(ctx context.Context, nodes []builder.Node, opt map[s
} else { } else {
rr, err = c.Build(ctx, so, "buildx", buildFunc, ch) rr, err = c.Build(ctx, so, "buildx", buildFunc, ch)
} }
if node.Driver.Features(ctx)[driver.HistoryAPI] && desktop.BuildBackendEnabled() { if desktop.BuildBackendEnabled() && node.Driver.HistoryAPISupported(ctx) {
buildRef := fmt.Sprintf("%s/%s/%s", node.Builder, node.Name, so.Ref) buildRef := fmt.Sprintf("%s/%s/%s", node.Builder, node.Name, so.Ref)
if err != nil { if err != nil {
return &desktop.ErrorWithBuildRef{ return &desktop.ErrorWithBuildRef{
@ -1262,7 +1262,7 @@ func createTempDockerfile(r io.Reader) (string, error) {
return dir, err return dir, err
} }
func LoadInputs(ctx context.Context, d driver.Driver, inp Inputs, pw progress.Writer, target *client.SolveOpt) (func(), error) { func LoadInputs(ctx context.Context, d *driver.DriverHandle, inp Inputs, pw progress.Writer, target *client.SolveOpt) (func(), error) {
if inp.ContextPath == "" { if inp.ContextPath == "" {
return nil, errors.New("please specify build context (e.g. \".\" for the current directory)") return nil, errors.New("please specify build context (e.g. \".\" for the current directory)")
} }

View File

@ -13,7 +13,7 @@ import (
"github.com/pkg/errors" "github.com/pkg/errors"
) )
func createTempDockerfileFromURL(ctx context.Context, d driver.Driver, url string, pw progress.Writer) (string, error) { func createTempDockerfileFromURL(ctx context.Context, d *driver.DriverHandle, url string, pw progress.Writer) (string, error) {
c, err := driver.Boot(ctx, ctx, d, pw) c, err := driver.Boot(ctx, ctx, d, pw)
if err != nil { if err != nil {
return "", err return "", err

View File

@ -22,7 +22,7 @@ import (
type Node struct { type Node struct {
store.Node store.Node
Builder string Builder string
Driver driver.Driver Driver *driver.DriverHandle
DriverInfo *driver.Info DriverInfo *driver.Info
Platforms []ocispecs.Platform Platforms []ocispecs.Platform
GCPolicy []client.PruneInfo GCPolicy []client.PruneInfo

View File

@ -388,18 +388,11 @@ func (d *Driver) Factory() driver.Factory {
} }
func (d *Driver) Features(ctx context.Context) map[driver.Feature]bool { func (d *Driver) Features(ctx context.Context) map[driver.Feature]bool {
var historyAPI bool
c, err := d.Client(ctx)
if err == nil {
historyAPI = driver.HistoryAPISupported(ctx, c)
c.Close()
}
return map[driver.Feature]bool{ return map[driver.Feature]bool{
driver.OCIExporter: true, driver.OCIExporter: true,
driver.DockerExporter: true, driver.DockerExporter: true,
driver.CacheExport: true, driver.CacheExport: true,
driver.MultiPlatform: true, driver.MultiPlatform: true,
driver.HistoryAPI: historyAPI,
} }
} }

View File

@ -60,7 +60,6 @@ func (d *Driver) Client(ctx context.Context) (*client.Client, error) {
func (d *Driver) Features(ctx context.Context) map[driver.Feature]bool { func (d *Driver) Features(ctx context.Context) map[driver.Feature]bool {
var useContainerdSnapshotter bool var useContainerdSnapshotter bool
var historyAPI bool
c, err := d.Client(ctx) c, err := d.Client(ctx)
if err == nil { if err == nil {
workers, _ := c.ListWorkers(ctx) workers, _ := c.ListWorkers(ctx)
@ -69,7 +68,6 @@ func (d *Driver) Features(ctx context.Context) map[driver.Feature]bool {
useContainerdSnapshotter = true useContainerdSnapshotter = true
} }
} }
historyAPI = driver.HistoryAPISupported(ctx, c)
c.Close() c.Close()
} }
return map[driver.Feature]bool{ return map[driver.Feature]bool{
@ -77,7 +75,6 @@ func (d *Driver) Features(ctx context.Context) map[driver.Feature]bool {
driver.DockerExporter: useContainerdSnapshotter, driver.DockerExporter: useContainerdSnapshotter,
driver.CacheExport: useContainerdSnapshotter, driver.CacheExport: useContainerdSnapshotter,
driver.MultiPlatform: useContainerdSnapshotter, driver.MultiPlatform: useContainerdSnapshotter,
driver.HistoryAPI: historyAPI,
} }
} }

View File

@ -64,7 +64,7 @@ type Driver interface {
Config() InitConfig Config() InitConfig
} }
func Boot(ctx, clientContext context.Context, d Driver, pw progress.Writer) (*client.Client, error) { func Boot(ctx, clientContext context.Context, d *DriverHandle, pw progress.Writer) (*client.Client, error) {
try := 0 try := 0
for { for {
info, err := d.Info(ctx) info, err := d.Info(ctx)
@ -92,7 +92,7 @@ func Boot(ctx, clientContext context.Context, d Driver, pw progress.Writer) (*cl
} }
} }
func HistoryAPISupported(ctx context.Context, c *client.Client) bool { func historyAPISupported(ctx context.Context, c *client.Client) bool {
cl, err := c.ControlClient().ListenBuildHistory(ctx, &controlapi.BuildHistoryRequest{ cl, err := c.ControlClient().ListenBuildHistory(ctx, &controlapi.BuildHistoryRequest{
ActiveOnly: true, ActiveOnly: true,
Ref: "buildx-test-history-api-feature", // dummy ref to check if the server supports the API Ref: "buildx-test-history-api-feature", // dummy ref to check if the server supports the API

View File

@ -7,5 +7,3 @@ const DockerExporter Feature = "Docker exporter"
const CacheExport Feature = "Cache export" const CacheExport Feature = "Cache export"
const MultiPlatform Feature = "Multiple platforms" const MultiPlatform Feature = "Multiple platforms"
const HistoryAPI Feature = "History API"

View File

@ -229,17 +229,10 @@ func (d *Driver) Factory() driver.Factory {
} }
func (d *Driver) Features(ctx context.Context) map[driver.Feature]bool { func (d *Driver) Features(ctx context.Context) map[driver.Feature]bool {
var historyAPI bool
c, err := d.Client(ctx)
if err == nil {
historyAPI = driver.HistoryAPISupported(ctx, c)
c.Close()
}
return map[driver.Feature]bool{ return map[driver.Feature]bool{
driver.OCIExporter: true, driver.OCIExporter: true,
driver.DockerExporter: d.DockerAPI != nil, driver.DockerExporter: d.DockerAPI != nil,
driver.CacheExport: true, driver.CacheExport: true,
driver.MultiPlatform: true, // Untested (needs multiple Driver instances) driver.MultiPlatform: true, // Untested (needs multiple Driver instances)
driver.HistoryAPI: historyAPI,
} }
} }

View File

@ -104,7 +104,7 @@ func GetFactory(name string, instanceRequired bool) (Factory, error) {
return nil, errors.Errorf("failed to find driver %q", name) return nil, errors.Errorf("failed to find driver %q", name)
} }
func GetDriver(ctx context.Context, name string, f Factory, endpointAddr string, api dockerclient.APIClient, auth Auth, kcc KubeClientConfig, flags []string, files map[string][]byte, do map[string]string, platforms []specs.Platform, contextPathHash string) (Driver, error) { func GetDriver(ctx context.Context, name string, f Factory, endpointAddr string, api dockerclient.APIClient, auth Auth, kcc KubeClientConfig, flags []string, files map[string][]byte, do map[string]string, platforms []specs.Platform, contextPathHash string) (*DriverHandle, error) {
ic := InitConfig{ ic := InitConfig{
EndpointAddr: endpointAddr, EndpointAddr: endpointAddr,
DockerAPI: api, DockerAPI: api,
@ -128,7 +128,7 @@ func GetDriver(ctx context.Context, name string, f Factory, endpointAddr string,
if err != nil { if err != nil {
return nil, err return nil, err
} }
return &cachedDriver{Driver: d}, nil return &DriverHandle{Driver: d}, nil
} }
func GetFactories(instanceRequired bool) []Factory { func GetFactories(instanceRequired bool) []Factory {
@ -145,7 +145,7 @@ func GetFactories(instanceRequired bool) []Factory {
return ds return ds
} }
type cachedDriver struct { type DriverHandle struct {
Driver Driver
client *client.Client client *client.Client
err error err error
@ -154,16 +154,24 @@ type cachedDriver struct {
features map[Feature]bool features map[Feature]bool
} }
func (d *cachedDriver) Client(ctx context.Context) (*client.Client, error) { func (d *DriverHandle) Client(ctx context.Context) (*client.Client, error) {
d.once.Do(func() { d.once.Do(func() {
d.client, d.err = d.Driver.Client(ctx) d.client, d.err = d.Driver.Client(ctx)
}) })
return d.client, d.err return d.client, d.err
} }
func (d *cachedDriver) Features(ctx context.Context) map[Feature]bool { func (d *DriverHandle) Features(ctx context.Context) map[Feature]bool {
d.featuresOnce.Do(func() { d.featuresOnce.Do(func() {
d.features = d.Driver.Features(ctx) d.features = d.Driver.Features(ctx)
}) })
return d.features return d.features
} }
func (d *DriverHandle) HistoryAPISupported(ctx context.Context) bool {
client, err := d.Client(ctx)
if err != nil {
return false
}
return historyAPISupported(ctx, client)
}

View File

@ -88,18 +88,11 @@ func (d *Driver) Client(ctx context.Context) (*client.Client, error) {
} }
func (d *Driver) Features(ctx context.Context) map[driver.Feature]bool { func (d *Driver) Features(ctx context.Context) map[driver.Feature]bool {
var historyAPI bool
c, err := d.Client(ctx)
if err == nil {
historyAPI = driver.HistoryAPISupported(ctx, c)
c.Close()
}
return map[driver.Feature]bool{ return map[driver.Feature]bool{
driver.OCIExporter: true, driver.OCIExporter: true,
driver.DockerExporter: true, driver.DockerExporter: true,
driver.CacheExport: true, driver.CacheExport: true,
driver.MultiPlatform: true, driver.MultiPlatform: true,
driver.HistoryAPI: historyAPI,
} }
} }