Skip to content

Commit c8ec455

Browse files
authored
chore: improve error wrapping (#2720)
Improve error wrapping to help detect failures in compose and wait tests.
1 parent c3b05ed commit c8ec455

File tree

5 files changed

+34
-33
lines changed

5 files changed

+34
-33
lines changed

docker.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -508,12 +508,12 @@ func (c *DockerContainer) Exec(ctx context.Context, cmd []string, options ...tce
508508

509509
response, err := cli.ContainerExecCreate(ctx, c.ID, processOptions.ExecConfig)
510510
if err != nil {
511-
return 0, nil, err
511+
return 0, nil, fmt.Errorf("container exec create: %w", err)
512512
}
513513

514514
hijack, err := cli.ContainerExecAttach(ctx, response.ID, container.ExecAttachOptions{})
515515
if err != nil {
516-
return 0, nil, err
516+
return 0, nil, fmt.Errorf("container exec attach: %w", err)
517517
}
518518

519519
processOptions.Reader = hijack.Reader
@@ -528,7 +528,7 @@ func (c *DockerContainer) Exec(ctx context.Context, cmd []string, options ...tce
528528
for {
529529
execResp, err := cli.ContainerExecInspect(ctx, response.ID)
530530
if err != nil {
531-
return 0, nil, err
531+
return 0, nil, fmt.Errorf("container exec inspect: %w", err)
532532
}
533533

534534
if !execResp.Running {
@@ -1129,7 +1129,7 @@ func (p *DockerProvider) CreateContainer(ctx context.Context, req ContainerReque
11291129

11301130
resp, err := p.client.ContainerCreate(ctx, dockerInput, hostConfig, networkingConfig, platform, req.Name)
11311131
if err != nil {
1132-
return nil, err
1132+
return nil, fmt.Errorf("container create: %w", err)
11331133
}
11341134

11351135
// #248: If there is more than one network specified in the request attach newly created container to them one by one
@@ -1144,7 +1144,7 @@ func (p *DockerProvider) CreateContainer(ctx context.Context, req ContainerReque
11441144
}
11451145
err = p.client.NetworkConnect(ctx, nw.ID, resp.ID, &endpointSetting)
11461146
if err != nil {
1147-
return nil, err
1147+
return nil, fmt.Errorf("network connect: %w", err)
11481148
}
11491149
}
11501150
}
@@ -1245,7 +1245,7 @@ func (p *DockerProvider) ReuseOrCreateContainer(ctx context.Context, req Contain
12451245
if !p.config.RyukDisabled {
12461246
r, err := reuseOrCreateReaper(context.WithValue(ctx, core.DockerHostContextKey, p.host), sessionID, p)
12471247
if err != nil {
1248-
return nil, fmt.Errorf("%w: creating reaper failed", err)
1248+
return nil, fmt.Errorf("reaper: %w", err)
12491249
}
12501250
termSignal, err = r.Connect()
12511251
if err != nil {

generic.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ func GenericContainer(ctx context.Context, req GenericContainerRequest) (Contain
5757
}
5858
provider, err := req.ProviderType.GetProvider(WithLogger(logging))
5959
if err != nil {
60-
return nil, err
60+
return nil, fmt.Errorf("get provider: %w", err)
6161
}
6262
defer provider.Close()
6363

@@ -79,7 +79,7 @@ func GenericContainer(ctx context.Context, req GenericContainerRequest) (Contain
7979

8080
if req.Started && !c.IsRunning() {
8181
if err := c.Start(ctx); err != nil {
82-
return c, fmt.Errorf("failed to start container: %w", err)
82+
return c, fmt.Errorf("start container: %w", err)
8383
}
8484
}
8585
return c, nil

modules/compose/compose.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ func NewDockerComposeWith(opts ...ComposeStackOption) (*dockerCompose, error) {
129129

130130
for i := range opts {
131131
if err := opts[i].applyToComposeStack(&composeOptions); err != nil {
132-
return nil, err
132+
return nil, fmt.Errorf("apply compose stack option: %w", err)
133133
}
134134
}
135135

@@ -139,11 +139,11 @@ func NewDockerComposeWith(opts ...ComposeStackOption) (*dockerCompose, error) {
139139

140140
dockerCli, err := command.NewDockerCli()
141141
if err != nil {
142-
return nil, err
142+
return nil, fmt.Errorf("new docker client: %w", err)
143143
}
144144

145145
if err = dockerCli.Initialize(flags.NewClientOptions(), command.WithInitializeClient(makeClient)); err != nil {
146-
return nil, err
146+
return nil, fmt.Errorf("initialize docker client: %w", err)
147147
}
148148

149149
reaperProvider, err := testcontainers.NewDockerProvider()

modules/compose/compose_api.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -120,19 +120,19 @@ func (r ComposeStackReaders) applyToComposeStack(o *composeStackOptions) error {
120120
tmp = filepath.Join(tmp, strconv.FormatInt(time.Now().UnixNano(), 10))
121121
err := os.MkdirAll(tmp, 0o755)
122122
if err != nil {
123-
return fmt.Errorf("failed to create temporary directory: %w", err)
123+
return fmt.Errorf("create temporary directory: %w", err)
124124
}
125125

126126
name := fmt.Sprintf(baseName, i)
127127

128128
bs, err := io.ReadAll(reader)
129129
if err != nil {
130-
return fmt.Errorf("failed to read from reader: %w", err)
130+
return fmt.Errorf("read from reader: %w", err)
131131
}
132132

133133
err = os.WriteFile(filepath.Join(tmp, name), bs, 0o644)
134134
if err != nil {
135-
return fmt.Errorf("failed to write to temporary file: %w", err)
135+
return fmt.Errorf("write to temporary file: %w", err)
136136
}
137137

138138
f[i] = filepath.Join(tmp, name)
@@ -311,7 +311,7 @@ func (d *dockerCompose) Up(ctx context.Context, opts ...StackUpOption) error {
311311
},
312312
})
313313
if err != nil {
314-
return err
314+
return fmt.Errorf("compose up: %w", err)
315315
}
316316

317317
err = d.lookupNetworks(ctx)
@@ -442,7 +442,7 @@ func (d *dockerCompose) lookupContainer(ctx context.Context, svcName string) (*t
442442
),
443443
})
444444
if err != nil {
445-
return nil, err
445+
return nil, fmt.Errorf("container list: %w", err)
446446
}
447447

448448
if len(containers) == 0 {
@@ -458,7 +458,7 @@ func (d *dockerCompose) lookupContainer(ctx context.Context, svcName string) (*t
458458

459459
dockerProvider, err := testcontainers.NewDockerProvider(testcontainers.WithLogger(d.logger))
460460
if err != nil {
461-
return nil, err
461+
return nil, fmt.Errorf("new docker provider: %w", err)
462462
}
463463

464464
dockerProvider.SetClient(d.dockerClient)
@@ -479,7 +479,7 @@ func (d *dockerCompose) lookupNetworks(ctx context.Context) error {
479479
),
480480
})
481481
if err != nil {
482-
return err
482+
return fmt.Errorf("network list: %w", err)
483483
}
484484

485485
for _, n := range networks {
@@ -504,12 +504,12 @@ func (d *dockerCompose) compileProject(ctx context.Context) (*types.Project, err
504504

505505
compiledOptions, err := cli.NewProjectOptions(d.configs, projectOptions...)
506506
if err != nil {
507-
return nil, err
507+
return nil, fmt.Errorf("new project options: %w", err)
508508
}
509509

510510
proj, err := compiledOptions.LoadProject(ctx)
511511
if err != nil {
512-
return nil, err
512+
return nil, fmt.Errorf("load project: %w", err)
513513
}
514514

515515
for i, s := range proj.Services {
@@ -568,7 +568,7 @@ func withEnv(env map[string]string) func(*cli.ProjectOptions) error {
568568
func makeClient(*command.DockerCli) (client.APIClient, error) {
569569
dockerClient, err := testcontainers.NewDockerClientWithOpts(context.Background())
570570
if err != nil {
571-
return nil, err
571+
return nil, fmt.Errorf("new docker client: %w", err)
572572
}
573573
return dockerClient, nil
574574
}

modules/compose/compose_local.go

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -136,7 +136,7 @@ func (dc *LocalDockerCompose) containerNameFromServiceName(service, separator st
136136
func (dc *LocalDockerCompose) applyStrategyToRunningContainer() error {
137137
cli, err := testcontainers.NewDockerClientWithOpts(context.Background())
138138
if err != nil {
139-
return err
139+
return fmt.Errorf("new docker client: %w", err)
140140
}
141141
defer cli.Close()
142142

@@ -150,22 +150,22 @@ func (dc *LocalDockerCompose) applyStrategyToRunningContainer() error {
150150
containerListOptions := container.ListOptions{Filters: f, All: true}
151151
containers, err := cli.ContainerList(context.Background(), containerListOptions)
152152
if err != nil {
153-
return fmt.Errorf("error %w occurred while filtering the service %s: %d by name and published port", err, k.service, k.publishedPort)
153+
return fmt.Errorf("container list service %q: %w", k.service, err)
154154
}
155155

156156
if len(containers) == 0 {
157-
return fmt.Errorf("service with name %s not found in list of running containers", k.service)
157+
return fmt.Errorf("service with name %q not found in list of running containers", k.service)
158158
}
159159

160160
// The length should always be a list of 1, since we are matching one service name at a time
161161
if l := len(containers); l > 1 {
162-
return fmt.Errorf("expecting only one running container for %s but got %d", k.service, l)
162+
return fmt.Errorf("expecting only one running container for %q but got %d", k.service, l)
163163
}
164164
container := containers[0]
165165
strategy := dc.WaitStrategyMap[k]
166166
dockerProvider, err := testcontainers.NewDockerProvider(testcontainers.WithLogger(dc.Logger))
167167
if err != nil {
168-
return fmt.Errorf("unable to create new Docker Provider: %w", err)
168+
return fmt.Errorf("new docker provider: %w", err)
169169
}
170170
defer dockerProvider.Close()
171171

@@ -175,7 +175,7 @@ func (dc *LocalDockerCompose) applyStrategyToRunningContainer() error {
175175

176176
err = strategy.WaitUntilReady(context.Background(), dockercontainer)
177177
if err != nil {
178-
return fmt.Errorf("unable to apply wait strategy %v to service %s due to %w", strategy, k.service, err)
178+
return fmt.Errorf("wait until ready %v to service %q due: %w", strategy, k.service, err)
179179
}
180180
}
181181
return nil
@@ -223,7 +223,6 @@ func (dc *LocalDockerCompose) WithExposedService(service string, port int, strat
223223
// depending on the version services names are composed in a different way
224224
func (dc *LocalDockerCompose) determineVersion() error {
225225
execErr := executeCompose(dc, []string{"version", "--short"})
226-
227226
if err := execErr.Error; err != nil {
228227
return err
229228
}
@@ -235,7 +234,7 @@ func (dc *LocalDockerCompose) determineVersion() error {
235234

236235
majorVersion, err := strconv.ParseInt(string(components[0]), 10, 8)
237236
if err != nil {
238-
return err
237+
return fmt.Errorf("parsing major version: %w", err)
239238
}
240239

241240
switch majorVersion {
@@ -263,11 +262,11 @@ func (dc *LocalDockerCompose) validate() error {
263262

264263
yamlFile, err := os.ReadFile(abs)
265264
if err != nil {
266-
return err
265+
return fmt.Errorf("read compose file %q: %w", abs, err)
267266
}
268267
err = yaml.Unmarshal(yamlFile, &c)
269268
if err != nil {
270-
return err
269+
return fmt.Errorf("unmarshalling file %q: %w", abs, err)
271270
}
272271

273272
if dc.Services == nil {
@@ -448,7 +447,9 @@ func (w *capturingPassThroughWriter) Bytes() []byte {
448447

449448
// Which checks if a binary is present in PATH
450449
func which(binary string) error {
451-
_, err := exec.LookPath(binary)
450+
if _, err := exec.LookPath(binary); err != nil {
451+
return fmt.Errorf("lookup: %w", err)
452+
}
452453

453-
return err
454+
return nil
454455
}

0 commit comments

Comments
 (0)