Skip to content

Commit b1d62b4

Browse files
authored
Merge pull request #409 from ndeloof/normalize_deps
2 parents 951cb1d + a73d66f commit b1d62b4

File tree

2 files changed

+90
-0
lines changed

2 files changed

+90
-0
lines changed

loader/normalize.go

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,8 @@ func Normalize(project *types.Project, resolvePaths bool) error {
155155
return err
156156
}
157157

158+
inferImplicitDependencies(&s)
159+
158160
project.Services[i] = s
159161
}
160162

@@ -171,6 +173,61 @@ func Normalize(project *types.Project, resolvePaths bool) error {
171173
return nil
172174
}
173175

176+
// IsServiceDependency check the relation set by ref refers to a service
177+
func IsServiceDependency(ref string) (string, bool) {
178+
if strings.HasPrefix(
179+
ref,
180+
types.ServicePrefix,
181+
) {
182+
return ref[len(types.ServicePrefix):], true
183+
}
184+
return "", false
185+
}
186+
187+
func inferImplicitDependencies(service *types.ServiceConfig) {
188+
var dependencies []string
189+
190+
maybeReferences := []string{
191+
service.NetworkMode,
192+
service.Ipc,
193+
service.Pid,
194+
service.Uts,
195+
service.Cgroup,
196+
}
197+
for _, ref := range maybeReferences {
198+
if dep, ok := IsServiceDependency(ref); ok {
199+
dependencies = append(dependencies, dep)
200+
}
201+
}
202+
203+
for _, vol := range service.VolumesFrom {
204+
spec := strings.Split(vol, ":")
205+
if len(spec) == 0 {
206+
continue
207+
}
208+
if spec[0] == "container" {
209+
continue
210+
}
211+
dependencies = append(dependencies, spec[0])
212+
}
213+
214+
for _, link := range service.Links {
215+
dependencies = append(dependencies, strings.Split(link, ":")[0])
216+
}
217+
218+
if len(dependencies) > 0 && service.DependsOn == nil {
219+
service.DependsOn = make(types.DependsOnConfig)
220+
}
221+
222+
for _, d := range dependencies {
223+
if _, ok := service.DependsOn[d]; !ok {
224+
service.DependsOn[d] = types.ServiceDependency{
225+
Condition: types.ServiceConditionStarted,
226+
}
227+
}
228+
}
229+
}
230+
174231
// setIfMissing adds a ServiceDependency for service if not already defined
175232
func setIfMissing(d types.DependsOnConfig, service string, dep types.ServiceDependency) types.DependsOnConfig {
176233
if d == nil {

loader/normalize_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -297,3 +297,36 @@ func TestNormalizeAdditionalContexts(t *testing.T) {
297297
assert.NilError(t, err)
298298
assert.DeepEqual(t, expected, project)
299299
}
300+
301+
func TestNormalizeImplicitDependencies(t *testing.T) {
302+
project := types.Project{
303+
Name: "myProject",
304+
Services: types.Services{
305+
types.ServiceConfig{
306+
Name: "test",
307+
Ipc: "service:foo",
308+
Cgroup: "service:bar",
309+
Uts: "service:baz",
310+
Pid: "service:qux",
311+
VolumesFrom: []string{"quux"},
312+
Links: []string{"corge"},
313+
DependsOn: map[string]types.ServiceDependency{
314+
// explicit dependency MUST not be overridden
315+
"foo": {Condition: types.ServiceConditionHealthy, Restart: false},
316+
},
317+
},
318+
},
319+
}
320+
321+
expected := types.DependsOnConfig{
322+
"foo": {Condition: types.ServiceConditionHealthy, Restart: false},
323+
"bar": {Condition: types.ServiceConditionStarted, Restart: true},
324+
"baz": {Condition: types.ServiceConditionStarted, Restart: true},
325+
"qux": {Condition: types.ServiceConditionStarted, Restart: true},
326+
"quux": {Condition: types.ServiceConditionStarted},
327+
"corge": {Condition: types.ServiceConditionStarted, Restart: true},
328+
}
329+
err := Normalize(&project, true)
330+
assert.NilError(t, err)
331+
assert.DeepEqual(t, expected, project.Services[0].DependsOn)
332+
}

0 commit comments

Comments
 (0)