Skip to content

Commit 64250b0

Browse files
committed
Fix mergo merging panic for volumes
Signed-off-by: Ulysses Souza <[email protected]>
1 parent 5ed5708 commit 64250b0

8 files changed

+18
-20
lines changed

compatibility/checker.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ func Check(project *types.Project, c Checker) {
200200
}
201201

202202
for i, volume := range project.Volumes {
203-
CheckVolumeConfig(&volume, c)
203+
CheckVolumeConfig(volume, c)
204204
project.Volumes[i] = volume
205205
}
206206

loader/full-struct_test.go

+5-7
Original file line numberDiff line numberDiff line change
@@ -460,9 +460,9 @@ func networks() map[string]types.NetworkConfig {
460460
}
461461
}
462462

463-
func volumes() map[string]types.VolumeConfig {
464-
return map[string]types.VolumeConfig{
465-
"some-volume": {},
463+
func volumes() map[string]*types.VolumeConfig {
464+
return map[string]*types.VolumeConfig{
465+
"some-volume": nil,
466466
"other-volume": {
467467
Driver: "flocker",
468468
DriverOpts: map[string]string{
@@ -901,7 +901,7 @@ volumes:
901901
foo: bar
902902
labels:
903903
foo: bar
904-
some-volume: {}
904+
some-volume: null
905905
secrets:
906906
secret1:
907907
file: %s
@@ -1494,9 +1494,7 @@ func fullExampleJSON(workingDir, homeDir string) string {
14941494
"foo": "bar"
14951495
}
14961496
},
1497-
"some-volume": {
1498-
"external": false
1499-
}
1497+
"some-volume": null
15001498
},
15011499
"x-bar": "baz",
15021500
"x-foo": "bar",

loader/loader.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -621,14 +621,14 @@ func externalVolumeError(volume, key string) error {
621621

622622
// LoadVolumes produces a VolumeConfig map from a compose file Dict
623623
// the source Dict is not validated if directly used. Use Load() to enable validation
624-
func LoadVolumes(source map[string]interface{}) (map[string]types.VolumeConfig, error) {
625-
volumes := make(map[string]types.VolumeConfig)
624+
func LoadVolumes(source map[string]interface{}) (map[string]*types.VolumeConfig, error) {
625+
volumes := make(map[string]*types.VolumeConfig)
626626
if err := Transform(source, &volumes); err != nil {
627627
return volumes, err
628628
}
629629

630630
for name, volume := range volumes {
631-
if !volume.External.External {
631+
if volume == nil || !volume.External.External {
632632
continue
633633
}
634634
switch {

loader/loader_test.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@ var sampleConfig = types.Config{
234234
},
235235
},
236236
},
237-
Volumes: map[string]types.VolumeConfig{
237+
Volumes: map[string]*types.VolumeConfig{
238238
"hello": {
239239
Driver: "default",
240240
DriverOpts: map[string]string{
@@ -665,7 +665,7 @@ networks:
665665
Secrets: map[string]types.SecretConfig{
666666
"super": {External: types.External{External: true}, Name: "super"},
667667
},
668-
Volumes: map[string]types.VolumeConfig{
668+
Volumes: map[string]*types.VolumeConfig{
669669
"data": {External: types.External{External: true}, Name: "data"},
670670
},
671671
Networks: map[string]types.NetworkConfig{
@@ -1211,7 +1211,7 @@ func TestLoadVolumesWarnOnDeprecatedExternalNameVersion34(t *testing.T) {
12111211
}
12121212
volumes, err := LoadVolumes(source)
12131213
assert.NilError(t, err)
1214-
expected := map[string]types.VolumeConfig{
1214+
expected := map[string]*types.VolumeConfig{
12151215
"foo": {
12161216
Name: "oops",
12171217
External: types.External{External: true},
@@ -1242,7 +1242,7 @@ func TestLoadVolumesWarnOnDeprecatedExternalName(t *testing.T) {
12421242
}
12431243
volumes, err := LoadVolumes(source)
12441244
assert.NilError(t, err)
1245-
expected := map[string]types.VolumeConfig{
1245+
expected := map[string]*types.VolumeConfig{
12461246
"foo": {
12471247
Name: "oops",
12481248
External: types.External{External: true},

loader/merge.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -259,7 +259,7 @@ func mapByName(services []types.ServiceConfig) map[string]types.ServiceConfig {
259259
return m
260260
}
261261

262-
func mergeVolumes(base, override map[string]types.VolumeConfig) (map[string]types.VolumeConfig, error) {
262+
func mergeVolumes(base, override map[string]*types.VolumeConfig) (map[string]*types.VolumeConfig, error) {
263263
err := mergo.Map(&base, &override, mergo.WithOverride)
264264
return base, err
265265
}

loader/validate_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ func TestValidateNamedVolume(t *testing.T) {
6161
err := checkConsistency(project)
6262
assert.Error(t, err, `service "myservice" refers to undefined volume myVolume: invalid compose project`)
6363

64-
project.Volumes = types.Volumes(map[string]types.VolumeConfig{
64+
project.Volumes = types.Volumes(map[string]*types.VolumeConfig{
6565
"myVolume": {
6666
Name: "myVolume",
6767
},

loader/with-version-struct_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,8 @@ func withVersionNetworks() map[string]types.NetworkConfig {
6262
}
6363
}
6464

65-
func withVersionVolumes() map[string]types.VolumeConfig {
66-
return map[string]types.VolumeConfig{
65+
func withVersionVolumes() map[string]*types.VolumeConfig {
66+
return map[string]*types.VolumeConfig{
6767
"data": {
6868
Driver: "local",
6969
},

types/config.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ type Config struct {
5454
}
5555

5656
// Volumes is a map of VolumeConfig
57-
type Volumes map[string]VolumeConfig
57+
type Volumes map[string]*VolumeConfig
5858

5959
// Networks is a map of NetworkConfig
6060
type Networks map[string]NetworkConfig

0 commit comments

Comments
 (0)