Skip to content

Commit 8263290

Browse files
committed
corner case merging override
Signed-off-by: Nicolas De Loof <[email protected]>
1 parent 3b9fc71 commit 8263290

File tree

2 files changed

+101
-5
lines changed

2 files changed

+101
-5
lines changed

loader/override_test.go

+68-1
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ services:
4747
- alias1
4848
- alias2
4949
`
50-
_, err := LoadWithContext(context.Background(), types.ConfigDetails{
50+
p, err := LoadWithContext(context.Background(), types.ConfigDetails{
5151
ConfigFiles: []types.ConfigFile{
5252
{
5353
Filename: "base",
@@ -60,4 +60,71 @@ services:
6060
},
6161
})
6262
assert.NilError(t, err)
63+
assert.DeepEqual(t, p.Services["test"].Networks["test_network"].Aliases, []string{"alias1", "alias2"})
64+
}
65+
66+
func TestOverrideBuildContext(t *testing.T) {
67+
yaml := `
68+
name: test-override-networks
69+
services:
70+
test:
71+
build: .
72+
`
73+
74+
override := `
75+
services:
76+
test:
77+
build:
78+
context: src
79+
`
80+
p, err := LoadWithContext(context.Background(), types.ConfigDetails{
81+
ConfigFiles: []types.ConfigFile{
82+
{
83+
Filename: "base",
84+
Content: []byte(yaml),
85+
},
86+
{
87+
Filename: "override",
88+
Content: []byte(override),
89+
},
90+
},
91+
})
92+
assert.NilError(t, err)
93+
assert.Equal(t, p.Services["test"].Build.Context, "src")
94+
}
95+
96+
func TestOverrideDepends_on(t *testing.T) {
97+
yaml := `
98+
name: test-override-networks
99+
services:
100+
test:
101+
image: test
102+
depends_on:
103+
- foo
104+
foo:
105+
image: foo
106+
`
107+
108+
override := `
109+
services:
110+
test:
111+
depends_on:
112+
foo:
113+
condition: service_healthy
114+
required: false
115+
`
116+
p, err := LoadWithContext(context.Background(), types.ConfigDetails{
117+
ConfigFiles: []types.ConfigFile{
118+
{
119+
Filename: "base",
120+
Content: []byte(yaml),
121+
},
122+
{
123+
Filename: "override",
124+
Content: []byte(override),
125+
},
126+
},
127+
})
128+
assert.NilError(t, err)
129+
assert.Check(t, p.Services["test"].DependsOn["foo"].Required == false)
63130
}

override/merge.go

+33-4
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ type merger func(any, any, tree.Path) (any, error)
3939
var mergeSpecials = map[tree.Path]merger{}
4040

4141
func init() {
42+
mergeSpecials["services.*.build"] = mergeBuild
43+
mergeSpecials["services.*.depends_on"] = mergeDependsOn
4244
mergeSpecials["services.*.logging"] = mergeLogging
4345
mergeSpecials["services.*.networks"] = mergeNetworks
4446
mergeSpecials["services.*.command"] = override
@@ -107,9 +109,36 @@ func mergeLogging(c any, o any, p tree.Path) (any, error) {
107109
return other, nil
108110
}
109111

112+
func mergeBuild(c any, o any, path tree.Path) (any, error) {
113+
toBuild := func(c any) map[string]any {
114+
switch v := c.(type) {
115+
case string:
116+
return map[string]any{
117+
"context": v,
118+
}
119+
case map[string]any:
120+
return v
121+
}
122+
return nil
123+
}
124+
return mergeMappings(toBuild(c), toBuild(o), path)
125+
}
126+
127+
func mergeDependsOn(c any, o any, path tree.Path) (any, error) {
128+
right := convertIntoMapping(c, map[string]any{
129+
"condition": "service_started",
130+
"required": true,
131+
})
132+
left := convertIntoMapping(o, map[string]any{
133+
"condition": "service_started",
134+
"required": true,
135+
})
136+
return mergeMappings(right, left, path)
137+
}
138+
110139
func mergeNetworks(c any, o any, path tree.Path) (any, error) {
111-
right := convertIntoMapping(c)
112-
left := convertIntoMapping(o)
140+
right := convertIntoMapping(c, nil)
141+
left := convertIntoMapping(o, nil)
113142
return mergeMappings(right, left, path)
114143
}
115144

@@ -151,14 +180,14 @@ func mergeUlimit(_ any, o any, p tree.Path) (any, error) {
151180
return o, nil
152181
}
153182

154-
func convertIntoMapping(a any) map[string]any {
183+
func convertIntoMapping(a any, defaultValue any) map[string]any {
155184
switch v := a.(type) {
156185
case map[string]any:
157186
return v
158187
case []any:
159188
converted := map[string]any{}
160189
for _, s := range v {
161-
converted[s.(string)] = nil
190+
converted[s.(string)] = defaultValue
162191
}
163192
return converted
164193
}

0 commit comments

Comments
 (0)