Skip to content

Commit 1b53c92

Browse files
authored
fix: use docker cli client everywhere (#43)
Signed-off-by: Magyari Sandor Szilard <[email protected]>
1 parent 78566b8 commit 1b53c92

File tree

5 files changed

+40
-127
lines changed

5 files changed

+40
-127
lines changed

Diff for: wfsm/internal/builder/python/image_build.go

+10-10
Original file line numberDiff line numberDiff line change
@@ -81,15 +81,15 @@ func EnsureContainerImage(ctx context.Context, img string, src source.AgentSourc
8181
hashCode := calculateHash(workspacePath, baseImage)
8282
img = fmt.Sprintf("%s:%s", img, hashCode)
8383

84-
client, err := dockerclient.NewClientWithOpts(dockerclient.FromEnv, dockerclient.WithAPIVersionNegotiation())
84+
dockerCli, err := util.GetDockerCLI(ctx)
8585
if err != nil {
86-
return "", fmt.Errorf("failed to create runtime client: %w", err)
86+
return "", fmt.Errorf("failed to initialize docker client: %v", err)
8787
}
88-
defer containerclient.Close(ctx, client)
88+
defer dockerCli.Client().Close()
8989

9090
// check if image already exists unless forceBuild is set
9191
if !forceBuild {
92-
found, err := findImage(ctx, client, img)
92+
found, err := findImage(ctx, dockerCli.Client(), img)
9393
if err != nil {
9494
return "", err
9595
}
@@ -100,14 +100,14 @@ func EnsureContainerImage(ctx context.Context, img string, src source.AgentSourc
100100
}
101101

102102
// find base image and pull it if not found
103-
found, err := findImage(ctx, client, baseImage)
103+
found, err := findImage(ctx, dockerCli.Client(), baseImage)
104104
if err != nil {
105105
return "", err
106106
}
107107
if !found {
108108
log.Info().Str("image", baseImage).Msg("base image not found on container runtime host")
109109
// image not available locally, see if it can be pulled from registry
110-
err = pullImage(ctx, client, baseImage)
110+
err = pullImage(ctx, dockerCli.Client(), baseImage)
111111
if err != nil {
112112
if !errdefs.IsNotFound(err) {
113113
return "", fmt.Errorf("base image not found %s: %w", baseImage, err)
@@ -117,15 +117,15 @@ func EnsureContainerImage(ctx context.Context, img string, src source.AgentSourc
117117
}
118118

119119
// build image
120-
err = buildImage(ctx, client, img, workspacePath, inputSpec, agentSourceDir, assets.AgentBuilderDockerfile, baseImage)
120+
err = buildImage(ctx, dockerCli.Client(), img, workspacePath, inputSpec, agentSourceDir, assets.AgentBuilderDockerfile, baseImage)
121121
if err != nil {
122122
return "", fmt.Errorf("failed to build image %s: %w", img, err)
123123
}
124124

125125
return img, nil
126126
}
127127

128-
func findImage(ctx context.Context, client *dockerclient.Client, img string) (bool, error) {
128+
func findImage(ctx context.Context, client dockerclient.ImageAPIClient, img string) (bool, error) {
129129
log := zerolog.Ctx(ctx)
130130
imageList, err := client.ImageList(ctx, image.ListOptions{
131131
Filters: filters.NewArgs(filters.KeyValuePair{
@@ -148,7 +148,7 @@ func findImage(ctx context.Context, client *dockerclient.Client, img string) (bo
148148
return false, nil
149149
}
150150

151-
func buildImage(ctx context.Context, client *dockerclient.Client, img string, workspacePath string, inputSpec internal.AgentSpec, agentSourceDir string, dockerFile []byte, baseImage string) error {
151+
func buildImage(ctx context.Context, client dockerclient.ImageAPIClient, img string, workspacePath string, inputSpec internal.AgentSpec, agentSourceDir string, dockerFile []byte, baseImage string) error {
152152
log := zerolog.Ctx(ctx)
153153
log.Info().Str("image", img).Msg("building image")
154154

@@ -220,7 +220,7 @@ func buildImage(ctx context.Context, client *dockerclient.Client, img string, wo
220220
return nil
221221
}
222222

223-
func pullImage(ctx context.Context, client *dockerclient.Client, img string) error {
223+
func pullImage(ctx context.Context, client dockerclient.ImageAPIClient, img string) error {
224224
log := zerolog.Ctx(ctx)
225225
log.Info().Msgf("pulling image: %s", img)
226226

Diff for: wfsm/internal/container_client/client.go

+2-86
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
dockerclient "github.com/docker/docker/client"
1313
"github.com/docker/docker/pkg/archive"
1414
"github.com/docker/docker/pkg/idtools"
15-
imagespecv1 "github.com/opencontainers/image-spec/specs-go/v1"
1615
"github.com/rs/zerolog"
1716
)
1817

@@ -24,52 +23,16 @@ func CreateBuildContext(path string) (io.ReadCloser, error) {
2423
})
2524
}
2625

27-
func Close(ctx context.Context, client *dockerclient.Client) {
28-
log := zerolog.Ctx(ctx)
29-
30-
if err := client.Close(); err != nil {
31-
log.Error().Err(err).Msg("failed to close container_client runtime client")
32-
}
33-
log.Debug().Msg("closed container_client runtime client")
34-
}
35-
36-
func CreateContainer(
37-
ctx context.Context,
38-
client *dockerclient.Client,
39-
containerConfig *container.Config,
40-
hostConfig *container.HostConfig,
41-
platform *imagespecv1.Platform,
42-
containerName string) (string, error) {
43-
log := zerolog.Ctx(ctx).With().Str("container_name", containerName).Logger()
44-
45-
createResp, err := client.ContainerCreate(
46-
ctx, containerConfig,
47-
hostConfig,
48-
nil,
49-
platform,
50-
containerName)
51-
if err != nil {
52-
return "", fmt.Errorf("failed to create container_client: %w", err)
53-
}
54-
55-
if len(createResp.Warnings) == 0 {
56-
log.Debug().Msg("created container_client")
57-
} else {
58-
log.Warn().Strs("warnings", createResp.Warnings).Msg("created container_client with warnings")
59-
}
60-
return createResp.ID, nil
61-
}
62-
6326
// if the container is running, return the public port or 0 otherwise
6427
func IsContainerRunning(
6528
ctx context.Context,
66-
client *dockerclient.Client,
29+
cntClient dockerclient.ContainerAPIClient,
6730
image string,
6831
containerName string) (int, error) {
6932

7033
log := zerolog.Ctx(ctx).With().Str("container_name", containerName).Logger()
7134

72-
cList, err := client.ContainerList(ctx, container.ListOptions{
35+
cList, err := cntClient.ContainerList(ctx, container.ListOptions{
7336
All: true,
7437
Filters: filters.NewArgs(filters.KeyValuePair{
7538
Key: "name",
@@ -106,50 +69,3 @@ func getPublicPort(ports []container.Port) int {
10669
}
10770
return 0
10871
}
109-
110-
func RemoveContainer(ctx context.Context, client *dockerclient.Client, containerID string) error {
111-
log := zerolog.Ctx(ctx)
112-
113-
err := client.ContainerRemove(ctx, containerID, container.RemoveOptions{RemoveVolumes: true})
114-
if err != nil {
115-
return err
116-
}
117-
log.Debug().Msg("removed container_client")
118-
return nil
119-
}
120-
121-
func StartContainer(
122-
ctx context.Context,
123-
client *dockerclient.Client,
124-
containerID string) error {
125-
log := zerolog.Ctx(ctx)
126-
127-
err := client.ContainerStart(ctx, containerID, container.StartOptions{})
128-
if err != nil {
129-
return fmt.Errorf("failed to start container_client: %w", err)
130-
}
131-
log.Debug().Msg("started container_client")
132-
133-
return nil
134-
}
135-
136-
func CopyToContainer(ctx context.Context, client *dockerclient.Client, containerID, src, dst string) error {
137-
log := zerolog.Ctx(ctx)
138-
139-
appSrc, err := archive.Tar(src, archive.Uncompressed)
140-
if err != nil {
141-
return fmt.Errorf("failed to tar source dir: %w", err)
142-
}
143-
defer func() {
144-
if err = appSrc.Close(); err != nil {
145-
log.Error().Err(err).Msg("failed to close archived source reader")
146-
}
147-
}()
148-
149-
err = client.CopyToContainer(ctx, containerID, dst, appSrc, container.CopyToContainerOptions{})
150-
if err != nil {
151-
return fmt.Errorf("failed to archive to container_client: %w", err)
152-
}
153-
154-
return nil
155-
}

Diff for: wfsm/internal/platforms/docker_compose/deploy.go

+6-28
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,6 @@ import (
1414
containerClient "github.com/cisco-eti/wfsm/internal/container_client"
1515
"github.com/cisco-eti/wfsm/internal/util"
1616
"github.com/compose-spec/compose-go/v2/types"
17-
"github.com/docker/cli/cli/command"
18-
"github.com/docker/cli/cli/flags"
1917
"github.com/docker/compose/v2/cmd/formatter"
2018
"github.com/docker/compose/v2/pkg/api"
2119
dockerClient "github.com/docker/docker/client"
@@ -52,11 +50,11 @@ func (r *runner) Deploy(ctx context.Context,
5250
}
5351
}
5452

55-
cli, err := dockerClient.NewClientWithOpts(dockerClient.FromEnv, dockerClient.WithAPIVersionNegotiation())
53+
dockerCli, err := util.GetDockerCLI(ctx)
5654
if err != nil {
57-
return nil, fmt.Errorf("failed to create docker client: %v", err)
55+
return nil, fmt.Errorf("failed to initialize docker client: %v", err)
5856
}
59-
defer containerClient.Close(ctx, cli)
57+
defer dockerCli.Client().Close()
6058

6159
project := &types.Project{
6260
Name: mainAgentName,
@@ -68,7 +66,7 @@ func (r *runner) Deploy(ctx context.Context,
6866

6967
port := externalPort
7068
if port == 0 {
71-
port, err = r.getMainAgentPublicPort(ctx, cli, mainAgentName, mainAgentSpec)
69+
port, err = r.getMainAgentPublicPort(ctx, dockerCli.Client(), mainAgentName, mainAgentSpec)
7270
if err != nil {
7371
return nil, err
7472
}
@@ -97,12 +95,6 @@ func (r *runner) Deploy(ctx context.Context,
9795
project.Services[deploymentSpec.ServiceName] = *sc
9896
}
9997

100-
dockerCli, err := getDockerCLI(ctx)
101-
if err != nil {
102-
return nil, fmt.Errorf("failed to initialize docker client: %v", err)
103-
}
104-
defer dockerCli.Client().Close()
105-
10698
composeFilePath := path.Join(r.hostStorageFolder, fmt.Sprintf("compose-%s.yaml", mainAgentName))
10799
prjOpts := cmdcmp.ProjectOptions{
108100
ConfigPaths: []string{
@@ -167,11 +159,11 @@ func calculateEnvVarPrefix(agName string) string {
167159
return prefix + "_"
168160
}
169161

170-
func (r *runner) getMainAgentPublicPort(ctx context.Context, cli *dockerClient.Client, mainAgentName string, mainAgentSpec internal.AgentDeploymentBuildSpec) (int, error) {
162+
func (r *runner) getMainAgentPublicPort(ctx context.Context, cntClient dockerClient.ContainerAPIClient, mainAgentName string, mainAgentSpec internal.AgentDeploymentBuildSpec) (int, error) {
171163
log := zerolog.Ctx(ctx)
172164

173165
containerName := strings.Join([]string{mainAgentName, mainAgentSpec.DeploymentName}, "-")
174-
port, err := containerClient.IsContainerRunning(ctx, cli, mainAgentSpec.Image, containerName)
166+
port, err := containerClient.IsContainerRunning(ctx, cntClient, mainAgentSpec.Image, containerName)
175167
if err != nil {
176168
return 0, fmt.Errorf("failed to check if agent is running: %v", err)
177169
}
@@ -226,20 +218,6 @@ func (r *runner) createServiceConfig(projectName string, deploymentSpec internal
226218
return &sc, nil
227219
}
228220

229-
func getDockerCLI(ctx context.Context) (*command.DockerCli, error) {
230-
dockerCli, err := command.NewDockerCli(command.WithBaseContext(ctx))
231-
if err != nil {
232-
return nil, fmt.Errorf("failed to create docker cli: %v", err)
233-
}
234-
clientOptions := flags.ClientOptions{
235-
LogLevel: "debug",
236-
TLS: false,
237-
TLSVerify: false,
238-
}
239-
err = dockerCli.Initialize(&clientOptions)
240-
return dockerCli, err
241-
}
242-
243221
func getStringPtr(s string) *string {
244222
return &s
245223
}

Diff for: wfsm/internal/platforms/docker_compose/runner.go

+4-3
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import (
1010
"strings"
1111

1212
"github.com/cisco-eti/wfsm/internal"
13+
"github.com/cisco-eti/wfsm/internal/util"
1314
"github.com/docker/compose/v2/cmd/formatter"
1415
"github.com/docker/compose/v2/pkg/api"
1516
"github.com/docker/compose/v2/pkg/compose"
@@ -28,7 +29,7 @@ func NewDockerComposeRunner(hostStorageFolder string) internal.AgentDeploymentRu
2829
}
2930

3031
func (r *runner) Remove(ctx context.Context, deploymentName string) error {
31-
dockerCli, err := getDockerCLI(ctx)
32+
dockerCli, err := util.GetDockerCLI(ctx)
3233
if err != nil {
3334
return fmt.Errorf("failed to initialize docker client: %v", err)
3435
}
@@ -47,7 +48,7 @@ func (r *runner) Remove(ctx context.Context, deploymentName string) error {
4748
}
4849

4950
func (r *runner) Logs(ctx context.Context, deploymentName string, agentNames []string) error {
50-
dockerCli, err := getDockerCLI(ctx)
51+
dockerCli, err := util.GetDockerCLI(ctx)
5152
if err != nil {
5253
return fmt.Errorf("failed to initialize docker client: %v", err)
5354
}
@@ -71,7 +72,7 @@ func (r *runner) Logs(ctx context.Context, deploymentName string, agentNames []s
7172
func (r *runner) List(ctx context.Context, deploymentName string) error {
7273
log := zerolog.Ctx(ctx)
7374

74-
dockerCli, err := getDockerCLI(ctx)
75+
dockerCli, err := util.GetDockerCLI(ctx)
7576
if err != nil {
7677
return fmt.Errorf("failed to initialize docker client: %v", err)
7778
}

Diff for: wfsm/internal/util/util.go

+18
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@
33
package util
44

55
import (
6+
"context"
67
"fmt"
78
"net"
89
"os/user"
910
"runtime"
11+
12+
"github.com/docker/cli/cli/command"
13+
"github.com/docker/cli/cli/flags"
1014
)
1115

1216
const OwnerCanReadWrite = 0777
@@ -39,3 +43,17 @@ func GetHomeDir() (string, error) {
3943
}
4044
return usr.HomeDir, nil
4145
}
46+
47+
func GetDockerCLI(ctx context.Context) (*command.DockerCli, error) {
48+
dockerCli, err := command.NewDockerCli(command.WithBaseContext(ctx))
49+
if err != nil {
50+
return nil, fmt.Errorf("failed to create docker cli: %v", err)
51+
}
52+
clientOptions := flags.ClientOptions{
53+
LogLevel: "debug",
54+
TLS: false,
55+
TLSVerify: false,
56+
}
57+
err = dockerCli.Initialize(&clientOptions)
58+
return dockerCli, err
59+
}

0 commit comments

Comments
 (0)