Skip to content

Commit d0722c0

Browse files
committed
checkConsistency must ignore disabled service if required=false
Signed-off-by: Nicolas De Loof <[email protected]>
1 parent c37fc59 commit d0722c0

File tree

4 files changed

+51
-3
lines changed

4 files changed

+51
-3
lines changed

errdefs/errors.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,9 @@ var (
3030

3131
// ErrIncompatible is returned when a compose project uses an incompatible attribute
3232
ErrIncompatible = errors.New("incompatible attribute")
33+
34+
// ErrDisabled is returned when a resource was found in model but is disabled
35+
ErrDisabled = errors.New("disabled")
3336
)
3437

3538
// IsNotFoundError returns true if the unwrapped error is ErrNotFound

loader/validate.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,11 @@ func checkConsistency(project *types.Project) error {
7070
}
7171
}
7272

73-
for dependedService := range s.DependsOn {
73+
for dependedService, cfg := range s.DependsOn {
7474
if _, err := project.GetService(dependedService); err != nil {
75+
if errors.Is(err, errdefs.ErrDisabled) && !cfg.Required {
76+
continue
77+
}
7578
return fmt.Errorf("service %q depends on undefined service %q: %w", s.Name, dependedService, errdefs.ErrInvalid)
7679
}
7780
}

loader/validate_test.go

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,4 +366,45 @@ func TestValidateWatch(t *testing.T) {
366366
err := checkConsistency(&project)
367367
assert.NilError(t, err)
368368
})
369+
370+
t.Run("depends on disabled service", func(t *testing.T) {
371+
project := types.Project{
372+
Services: types.Services{
373+
"myservice": {
374+
Name: "myservice",
375+
Image: "scratch",
376+
DependsOn: map[string]types.ServiceDependency{
377+
"other": {
378+
Required: false,
379+
},
380+
},
381+
},
382+
},
383+
DisabledServices: types.Services{
384+
"other": {
385+
Image: "scratch",
386+
},
387+
},
388+
}
389+
err := checkConsistency(&project)
390+
assert.NilError(t, err)
391+
})
392+
393+
t.Run("depends on unknown service", func(t *testing.T) {
394+
project := types.Project{
395+
Services: types.Services{
396+
"myservice": {
397+
Name: "myservice",
398+
Image: "scratch",
399+
DependsOn: map[string]types.ServiceDependency{
400+
"other": {
401+
Required: false,
402+
},
403+
},
404+
},
405+
},
406+
}
407+
err := checkConsistency(&project)
408+
assert.ErrorContains(t, err, "depends on undefined service")
409+
})
369410
}

types/project.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import (
2626
"sort"
2727

2828
"github.com/compose-spec/compose-go/v2/dotenv"
29+
"github.com/compose-spec/compose-go/v2/errdefs"
2930
"github.com/compose-spec/compose-go/v2/utils"
3031
"github.com/distribution/reference"
3132
"github.com/mitchellh/copystructure"
@@ -216,9 +217,9 @@ func (p *Project) GetService(name string) (ServiceConfig, error) {
216217
if !ok {
217218
_, ok := p.DisabledServices[name]
218219
if ok {
219-
return ServiceConfig{}, fmt.Errorf("service %s is disabled", name)
220+
return ServiceConfig{}, fmt.Errorf("no such service: %s: %w", name, errdefs.ErrDisabled)
220221
}
221-
return ServiceConfig{}, fmt.Errorf("no such service: %s", name)
222+
return ServiceConfig{}, fmt.Errorf("no such service: %s: %w", name, errdefs.ErrNotFound)
222223
}
223224
return service, nil
224225
}

0 commit comments

Comments
 (0)