From 64250b005aba7cce97d78c6bbd04b34916218d01 Mon Sep 17 00:00:00 2001 From: Ulysses Souza Date: Wed, 17 Feb 2021 17:36:27 -0300 Subject: [PATCH] Fix mergo merging panic for volumes Signed-off-by: Ulysses Souza --- compatibility/checker.go | 2 +- loader/full-struct_test.go | 12 +++++------- loader/loader.go | 6 +++--- loader/loader_test.go | 8 ++++---- loader/merge.go | 2 +- loader/validate_test.go | 2 +- loader/with-version-struct_test.go | 4 ++-- types/config.go | 2 +- 8 files changed, 18 insertions(+), 20 deletions(-) diff --git a/compatibility/checker.go b/compatibility/checker.go index 1d2db8552..b75cc7043 100644 --- a/compatibility/checker.go +++ b/compatibility/checker.go @@ -200,7 +200,7 @@ func Check(project *types.Project, c Checker) { } for i, volume := range project.Volumes { - CheckVolumeConfig(&volume, c) + CheckVolumeConfig(volume, c) project.Volumes[i] = volume } diff --git a/loader/full-struct_test.go b/loader/full-struct_test.go index 088b93362..36ed13511 100644 --- a/loader/full-struct_test.go +++ b/loader/full-struct_test.go @@ -460,9 +460,9 @@ func networks() map[string]types.NetworkConfig { } } -func volumes() map[string]types.VolumeConfig { - return map[string]types.VolumeConfig{ - "some-volume": {}, +func volumes() map[string]*types.VolumeConfig { + return map[string]*types.VolumeConfig{ + "some-volume": nil, "other-volume": { Driver: "flocker", DriverOpts: map[string]string{ @@ -901,7 +901,7 @@ volumes: foo: bar labels: foo: bar - some-volume: {} + some-volume: null secrets: secret1: file: %s @@ -1494,9 +1494,7 @@ func fullExampleJSON(workingDir, homeDir string) string { "foo": "bar" } }, - "some-volume": { - "external": false - } + "some-volume": null }, "x-bar": "baz", "x-foo": "bar", diff --git a/loader/loader.go b/loader/loader.go index 425474989..b8337b075 100644 --- a/loader/loader.go +++ b/loader/loader.go @@ -621,14 +621,14 @@ func externalVolumeError(volume, key string) error { // LoadVolumes produces a VolumeConfig map from a compose file Dict // the source Dict is not validated if directly used. Use Load() to enable validation -func LoadVolumes(source map[string]interface{}) (map[string]types.VolumeConfig, error) { - volumes := make(map[string]types.VolumeConfig) +func LoadVolumes(source map[string]interface{}) (map[string]*types.VolumeConfig, error) { + volumes := make(map[string]*types.VolumeConfig) if err := Transform(source, &volumes); err != nil { return volumes, err } for name, volume := range volumes { - if !volume.External.External { + if volume == nil || !volume.External.External { continue } switch { diff --git a/loader/loader_test.go b/loader/loader_test.go index 49fa36eda..f073eede5 100644 --- a/loader/loader_test.go +++ b/loader/loader_test.go @@ -234,7 +234,7 @@ var sampleConfig = types.Config{ }, }, }, - Volumes: map[string]types.VolumeConfig{ + Volumes: map[string]*types.VolumeConfig{ "hello": { Driver: "default", DriverOpts: map[string]string{ @@ -665,7 +665,7 @@ networks: Secrets: map[string]types.SecretConfig{ "super": {External: types.External{External: true}, Name: "super"}, }, - Volumes: map[string]types.VolumeConfig{ + Volumes: map[string]*types.VolumeConfig{ "data": {External: types.External{External: true}, Name: "data"}, }, Networks: map[string]types.NetworkConfig{ @@ -1211,7 +1211,7 @@ func TestLoadVolumesWarnOnDeprecatedExternalNameVersion34(t *testing.T) { } volumes, err := LoadVolumes(source) assert.NilError(t, err) - expected := map[string]types.VolumeConfig{ + expected := map[string]*types.VolumeConfig{ "foo": { Name: "oops", External: types.External{External: true}, @@ -1242,7 +1242,7 @@ func TestLoadVolumesWarnOnDeprecatedExternalName(t *testing.T) { } volumes, err := LoadVolumes(source) assert.NilError(t, err) - expected := map[string]types.VolumeConfig{ + expected := map[string]*types.VolumeConfig{ "foo": { Name: "oops", External: types.External{External: true}, diff --git a/loader/merge.go b/loader/merge.go index 9e13cd4ed..6530db7df 100644 --- a/loader/merge.go +++ b/loader/merge.go @@ -259,7 +259,7 @@ func mapByName(services []types.ServiceConfig) map[string]types.ServiceConfig { return m } -func mergeVolumes(base, override map[string]types.VolumeConfig) (map[string]types.VolumeConfig, error) { +func mergeVolumes(base, override map[string]*types.VolumeConfig) (map[string]*types.VolumeConfig, error) { err := mergo.Map(&base, &override, mergo.WithOverride) return base, err } diff --git a/loader/validate_test.go b/loader/validate_test.go index 1eed16785..3ed70466d 100644 --- a/loader/validate_test.go +++ b/loader/validate_test.go @@ -61,7 +61,7 @@ func TestValidateNamedVolume(t *testing.T) { err := checkConsistency(project) assert.Error(t, err, `service "myservice" refers to undefined volume myVolume: invalid compose project`) - project.Volumes = types.Volumes(map[string]types.VolumeConfig{ + project.Volumes = types.Volumes(map[string]*types.VolumeConfig{ "myVolume": { Name: "myVolume", }, diff --git a/loader/with-version-struct_test.go b/loader/with-version-struct_test.go index a5a20c9e2..60b14935c 100644 --- a/loader/with-version-struct_test.go +++ b/loader/with-version-struct_test.go @@ -62,8 +62,8 @@ func withVersionNetworks() map[string]types.NetworkConfig { } } -func withVersionVolumes() map[string]types.VolumeConfig { - return map[string]types.VolumeConfig{ +func withVersionVolumes() map[string]*types.VolumeConfig { + return map[string]*types.VolumeConfig{ "data": { Driver: "local", }, diff --git a/types/config.go b/types/config.go index 067f33985..8f8566520 100644 --- a/types/config.go +++ b/types/config.go @@ -54,7 +54,7 @@ type Config struct { } // Volumes is a map of VolumeConfig -type Volumes map[string]VolumeConfig +type Volumes map[string]*VolumeConfig // Networks is a map of NetworkConfig type Networks map[string]NetworkConfig