Skip to content

Commit 0d41ecb

Browse files
committed
feat!: replace direct client usage with apiclient base interface, add option to pass in custom docker client
1 parent 31130f9 commit 0d41ecb

11 files changed

Lines changed: 58 additions & 47 deletions

File tree

examples/pull/main.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,19 @@ import (
99
"github.com/docker/docker/api/types/registry"
1010
client2 "github.com/docker/docker/client"
1111
"github.com/silenium-dev/docker-wrapper/pkg/client"
12-
"github.com/silenium-dev/docker-wrapper/pkg/client/auth"
12+
"github.com/silenium-dev/docker-wrapper/pkg/client/provider"
1313
"go.uber.org/zap"
1414
)
1515

1616
func main() {
1717
logger := zap.Must(zap.NewDevelopment()).Sugar()
18-
authProvider, err := auth.NewDefaultAuthProvider()
18+
authProvider, err := provider.NewDefaultAuthProvider()
1919
if err != nil {
2020
panic(err)
2121
}
22-
override := auth.NewOverridingAuthProvider(
22+
override := provider.NewOverridingAuthProvider(
2323
authProvider, map[string]registry.AuthConfig{},
24-
auth.WithSugaredLogger(logger.With(zap.String("component", "auth-provider"))),
24+
provider.WithSugaredLogger(logger.With(zap.String("component", "auth-provider"))),
2525
).WithOverride("quay.io", registry.AuthConfig{})
2626
cli, err := client.NewWithOpts(
2727
client.WithAuthProvider(override),

pkg/client/base.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
)
77

88
func (c *Client) Close() error {
9-
return c.Client.Close()
9+
return c.APIClient.Close()
1010
}
1111

1212
func (c *Client) AuthProvider() provider.AuthProvider {

pkg/client/build.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,5 +15,5 @@ func (c *Client) ImageBuild(
1515
maps.Copy(authConfigs, opts.AuthConfigs)
1616
opts.AuthConfigs = authConfigs
1717

18-
return c.Client.ImageBuild(ctx, buildContext, opts)
18+
return c.APIClient.ImageBuild(ctx, buildContext, opts)
1919
}

pkg/client/client.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
)
1111

1212
type Client struct {
13-
*client.Client
13+
client.APIClient
1414
dockerOpts []client.Opt
1515
authProvider provider.AuthProvider
1616
imageProvider provider.ImageProvider
@@ -34,11 +34,12 @@ func NewWithOpts(opts ...Opt) (*Client, error) {
3434
if c.imageProvider == nil {
3535
c.imageProvider = provider.DefaultImageProvider()
3636
}
37-
38-
cli, err := client.NewClientWithOpts(c.dockerOpts...)
39-
if err != nil {
40-
return nil, err
37+
if c.APIClient == nil {
38+
cli, err := client.NewClientWithOpts(c.dockerOpts...)
39+
if err != nil {
40+
return nil, err
41+
}
42+
c.APIClient = cli
4143
}
42-
c.Client = cli
4344
return c, nil
4445
}

pkg/client/client_opts.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,13 @@ import (
1111

1212
type Opt func(*Client) error
1313

14+
func WithAPIClient(apiClient client.APIClient) Opt {
15+
return func(c *Client) error {
16+
c.APIClient = apiClient
17+
return nil
18+
}
19+
}
20+
1421
func WithVersionNegotiation(c *Client) error {
1522
c.dockerOpts = append(c.dockerOpts, client.WithAPIVersionNegotiation())
1623
return nil

pkg/client/image_pull.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ func (c *Client) ImagePullWithEvents(ctx context.Context, ref reference.Named, o
3838
return v1.Hash{}, nil, nil, err
3939
}
4040

41-
reader, err := c.Client.ImagePull(ctx, ref.String(), options)
41+
reader, err := c.APIClient.ImagePull(ctx, ref.String(), options)
4242
if err != nil {
4343
return v1.Hash{}, nil, nil, err
4444
}

pkg/client/podman/client/client.go

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,48 +5,39 @@ import (
55
"fmt"
66

77
"github.com/blang/semver/v4"
8-
"github.com/silenium-dev/docker-wrapper/pkg/client"
9-
"github.com/silenium-dev/docker-wrapper/pkg/client/auth"
8+
"github.com/silenium-dev/docker-wrapper/pkg/api"
109
"github.com/silenium-dev/docker-wrapper/pkg/client/podman/containers/bindings"
10+
"github.com/silenium-dev/docker-wrapper/pkg/client/provider"
1111
"go.uber.org/zap"
1212
)
1313

1414
type Podman struct {
15-
cli *client.Client
15+
cli api.ClientWrapper
1616
conn *bindings.Connection
1717
ver *semver.Version
1818
logger *zap.SugaredLogger
19-
authProvider auth.AuthProvider
19+
authProvider provider.AuthProvider
2020
}
2121

2222
// FromDocker derives a podman connection from the docker remote. Fails if remote is not a podman engine
2323
func FromDocker(
2424
ctx context.Context,
25-
cli *client.Client,
26-
authProvider auth.AuthProvider,
27-
logger *zap.SugaredLogger,
25+
cli api.ClientWrapper,
2826
) (*Podman, error) {
29-
if logger == nil {
30-
_logger, err := zap.NewDevelopment()
31-
if err != nil {
32-
panic(err)
33-
}
34-
logger = _logger.Sugar()
35-
}
36-
conn, ver, err := getPodmanConnection(cli, ctx, logger)
27+
conn, ver, err := getPodmanConnection(cli, ctx, cli.Logger())
3728
if err != nil {
3829
return nil, fmt.Errorf("failed to retrieve podman connection: %w", err)
3930
}
4031
return &Podman{
4132
cli: cli,
4233
conn: conn,
4334
ver: ver,
44-
logger: logger,
45-
authProvider: authProvider,
35+
logger: cli.Logger(),
36+
authProvider: cli.AuthProvider(),
4637
}, nil
4738
}
4839

49-
func (p *Podman) AuthProvider() auth.AuthProvider {
40+
func (p *Podman) AuthProvider() provider.AuthProvider {
5041
return p.authProvider
5142
}
5243

pkg/client/podman/client/derive.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,14 +5,14 @@ import (
55
"fmt"
66

77
"github.com/blang/semver/v4"
8-
"github.com/silenium-dev/docker-wrapper/pkg/client"
8+
"github.com/silenium-dev/docker-wrapper/pkg/api"
99
"github.com/silenium-dev/docker-wrapper/pkg/client/podman/containers/bindings"
1010
"go.uber.org/zap"
1111
)
1212

1313
var ErrNotPodman = fmt.Errorf("not a podman server")
1414

15-
func getPodmanConnection(cli *client.Client, ctx context.Context, logger *zap.SugaredLogger) (
15+
func getPodmanConnection(cli api.ClientWrapper, ctx context.Context, logger *zap.SugaredLogger) (
1616
*bindings.Connection, *semver.Version, error,
1717
) {
1818
if ok, err := cli.SystemIsPodman(ctx); err != nil {

pkg/client/podman/containers/bindings/connection.go

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ var connectionFactories = map[string]func(_url *url.URL, uri string, identity st
9898
// For example tcp://localhost:<port>
9999
// or unix:///run/podman/podman.sock
100100
// or ssh://<user>@<host>[:port]/run/podman/podman.sock
101-
func NewConnectionWithIdentity(ctx context.Context, uri string, identity string, machine bool) (context.Context, error) {
101+
func NewConnectionWithIdentity(ctx context.Context, uri string, identity string, machine bool) (
102+
context.Context, error,
103+
) {
102104
var err error
103105
if v, found := os.LookupEnv("CONTAINER_HOST"); found && uri == "" {
104106
uri = v
@@ -228,13 +230,15 @@ func sshClient(_url *url.URL, uri string, identity string, machine bool) (Connec
228230
logrus.Debugf(" IdentityFile: %q", identity)
229231
}
230232
}
231-
conn, err := ssh.Dial(&ssh.ConnectionDialOptions{
232-
Host: uri,
233-
Identity: identity,
234-
User: userinfo,
235-
Port: port,
236-
InsecureIsMachineConnection: machine,
237-
}, ssh.GolangMode)
233+
conn, err := ssh.Dial(
234+
&ssh.ConnectionDialOptions{
235+
Host: uri,
236+
Identity: identity,
237+
User: userinfo,
238+
Port: port,
239+
InsecureIsMachineConnection: machine,
240+
}, ssh.GolangMode,
241+
)
238242
if err != nil {
239243
return connection, newConnectError(err)
240244
}
@@ -248,7 +252,8 @@ func sshClient(_url *url.URL, uri string, identity string, machine bool) (Connec
248252
var b bytes.Buffer
249253
session.Stdout = &b
250254
if err := session.Run(
251-
"podman info --format '{{.Host.RemoteSocket.Path}}'"); err != nil {
255+
"podman info --format '{{.Host.RemoteSocket.Path}}'",
256+
); err != nil {
252257
return connection, err
253258
}
254259
val := strings.TrimSuffix(b.String(), "\n")
@@ -339,8 +344,10 @@ func pingNewConnection(ctx context.Context) (*semver.Version, error) {
339344
// Server's job when Client version is equal or older
340345
return &versionSrv, nil
341346
case 1:
342-
return nil, fmt.Errorf("server API version is too old. Client %q server %q",
343-
version.APIVersion[version.Libpod][version.MinimalAPI].String(), versionSrv.String())
347+
return nil, fmt.Errorf(
348+
"server API version is too old. Client %q server %q",
349+
version.APIVersion[version.Libpod][version.MinimalAPI].String(), versionSrv.String(),
350+
)
344351
}
345352
}
346353
return nil, fmt.Errorf("ping response was %d", response.StatusCode)
@@ -366,7 +373,10 @@ func unixClient(_url *url.URL, uri string, _ string, _ bool) (Connection, error)
366373

367374
// DoRequest assembles the http request and returns the response.
368375
// The caller must close the response body.
369-
func (c *Connection) DoRequest(ctx context.Context, httpBody io.Reader, httpMethod, endpoint string, queryParams url.Values, headers http.Header, pathValues ...string) (*APIResponse, error) {
376+
func (c *Connection) DoRequest(
377+
ctx context.Context, httpBody io.Reader, httpMethod, endpoint string, queryParams url.Values, headers http.Header,
378+
pathValues ...string,
379+
) (*APIResponse, error) {
370380
var (
371381
err error
372382
response *http.Response

pkg/client/system.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ func (c *Client) SystemIsPodman(ctx context.Context) (bool, error) {
2222
}
2323

2424
func (c *Client) SystemDefaultPlatform(ctx context.Context) (*v1.Platform, error) {
25-
info, err := c.Client.Info(ctx)
25+
info, err := c.APIClient.Info(ctx)
2626
if err != nil {
2727
return nil, err
2828
}

0 commit comments

Comments
 (0)