From e39c2315b5d662429ddadbb65273042dceb77142 Mon Sep 17 00:00:00 2001 From: Dale Phurrough Date: Sun, 19 Jan 2020 08:01:05 +0100 Subject: [PATCH 1/2] fix LoadVolumes for compose schema 3.4+ Signed-off-by: Dale Phurrough --- cli/compose/loader/loader.go | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/cli/compose/loader/loader.go b/cli/compose/loader/loader.go index a89d48bedb07..33d84e01f693 100644 --- a/cli/compose/loader/loader.go +++ b/cli/compose/loader/loader.go @@ -567,13 +567,17 @@ func LoadVolumes(source map[string]interface{}, version string) (map[string]type if !volume.External.External { continue } + if versions.LessThan(version, "3.4") { + switch { + case volume.Driver != "": + return nil, externalVolumeError(name, "driver") + case len(volume.DriverOpts) > 0: + return nil, externalVolumeError(name, "driver_opts") + case len(volume.Labels) > 0: + return nil, externalVolumeError(name, "labels") + } + } switch { - case volume.Driver != "": - return nil, externalVolumeError(name, "driver") - case len(volume.DriverOpts) > 0: - return nil, externalVolumeError(name, "driver_opts") - case len(volume.Labels) > 0: - return nil, externalVolumeError(name, "labels") case volume.External.Name != "": if volume.Name != "" { return nil, errors.Errorf("volume %s: volume.external.name and volume.name conflict; only use volume.name", name) From 83338088ba62991970db23d6001ae51b5fe6f424 Mon Sep 17 00:00:00 2001 From: Dale Phurrough Date: Sun, 19 Jan 2020 20:00:46 +0100 Subject: [PATCH 2/2] Test cases vols+driver+/-external on schema 3.4+ Signed-off-by: Dale Phurrough --- cli/compose/loader/loader_test.go | 101 ++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/cli/compose/loader/loader_test.go b/cli/compose/loader/loader_test.go index 6059919c9f72..04ddbdb82a32 100644 --- a/cli/compose/loader/loader_test.go +++ b/cli/compose/loader/loader_test.go @@ -806,6 +806,107 @@ volumes: assert.ErrorContains(t, err, "external_volume") } +func TestValidNotExternalVolumeDriverOpsLabelCombination(t *testing.T) { + config, err := loadYAML(` +version: "3" +volumes: + my_volume: + driver: foobar + driver_opts: + beep: boop + click: clack + labels: + - tick=tock + - ping=pong +`) + + assert.NilError(t, err) + expected := map[string]types.VolumeConfig{ + "my_volume": { + Driver: "foobar", + DriverOpts: map[string]string{ + "beep": "boop", + "click": "clack", + }, + Labels: types.Labels{ + "tick": "tock", + "ping": "pong", + }, + }, + } + assert.Assert(t, is.Len(config.Volumes, 1)) + assert.Check(t, is.DeepEqual(expected, config.Volumes)) +} + +func TestValidExternalAndDriverCombination34(t *testing.T) { + config, err := loadYAML(` +version: "3.4" +volumes: + external_volume: + external: true + driver: foobar +`) + + assert.NilError(t, err) + expected := map[string]types.VolumeConfig{ + "external_volume": { + Name: "external_volume", + External: types.External{External: true}, + Driver: "foobar", + }, + } + assert.Assert(t, is.Len(config.Volumes, 1)) + assert.Check(t, is.DeepEqual(expected, config.Volumes)) +} + +func TestValidExternalAndDirverOptsCombination35(t *testing.T) { + config, err := loadYAML(` +version: "3.5" +volumes: + external_volume: + external: true + driver_opts: + beep: boop +`) + + assert.NilError(t, err) + expected := map[string]types.VolumeConfig{ + "external_volume": { + Name: "external_volume", + External: types.External{External: true}, + DriverOpts: map[string]string{ + "beep": "boop", + }, + }, + } + assert.Assert(t, is.Len(config.Volumes, 1)) + assert.Check(t, is.DeepEqual(expected, config.Volumes)) +} + +func TestValidExternalAndLabelsCombination36(t *testing.T) { + config, err := loadYAML(` +version: "3.6" +volumes: + external_volume: + external: true + labels: + - beep=boop +`) + + assert.NilError(t, err) + expected := map[string]types.VolumeConfig{ + "external_volume": { + Name: "external_volume", + External: types.External{External: true}, + Labels: types.Labels{ + "beep": "boop", + }, + }, + } + assert.Assert(t, is.Len(config.Volumes, 1)) + assert.Check(t, is.DeepEqual(expected, config.Volumes)) +} + func TestLoadVolumeInvalidExternalNameAndNameCombination(t *testing.T) { _, err := loadYAML(` version: "3.4"