stack deploy exits with error if both 'external' and any other options are specified for volumes

Signed-off-by: Arash Deshmeh <adeshmeh@ca.ibm.com>
This commit is contained in:
Arash Deshmeh 2017-02-20 01:12:36 -05:00
parent 3b8ecc089b
commit 789652c41a
2 changed files with 59 additions and 3 deletions

View File

@ -427,11 +427,23 @@ func loadVolumes(source types.Dict) (map[string]types.VolumeConfig, error) {
return volumes, err
}
for name, volume := range volumes {
if volume.External.External && volume.External.Name == "" {
if volume.External.External {
template := "conflicting parameters \"external\" and %q specified for volume %q"
if volume.Driver != "" {
return nil, fmt.Errorf(template, "driver", name)
}
if len(volume.DriverOpts) > 0 {
return nil, fmt.Errorf(template, "driver_opts", name)
}
if len(volume.Labels) > 0 {
return nil, fmt.Errorf(template, "labels", name)
}
if volume.External.Name == "" {
volume.External.Name = name
volumes[name] = volume
}
}
}
return volumes, nil
}

View File

@ -541,6 +541,50 @@ services:
assert.Contains(t, forbidden, "extends")
}
func TestInvalidExternalAndDriverCombination(t *testing.T) {
_, err := loadYAML(`
version: "3"
volumes:
external_volume:
external: true
driver: foobar
`)
assert.Error(t, err)
assert.Contains(t, err.Error(), "conflicting parameters \"external\" and \"driver\" specified for volume")
assert.Contains(t, err.Error(), "external_volume")
}
func TestInvalidExternalAndDirverOptsCombination(t *testing.T) {
_, err := loadYAML(`
version: "3"
volumes:
external_volume:
external: true
driver_opts:
beep: boop
`)
assert.Error(t, err)
assert.Contains(t, err.Error(), "conflicting parameters \"external\" and \"driver_opts\" specified for volume")
assert.Contains(t, err.Error(), "external_volume")
}
func TestInvalidExternalAndLabelsCombination(t *testing.T) {
_, err := loadYAML(`
version: "3"
volumes:
external_volume:
external: true
labels:
- beep=boop
`)
assert.Error(t, err)
assert.Contains(t, err.Error(), "conflicting parameters \"external\" and \"labels\" specified for volume")
assert.Contains(t, err.Error(), "external_volume")
}
func durationPtr(value time.Duration) *time.Duration {
return &value
}