Browse Source

Merge pull request #31176 from adshmh/29662-stack-deploy-error-if-external-combined-with-other-volume-options

stack deploy exits with error if both 'external' and other options are specified for a volume
Sebastiaan van Stijn 8 năm trước cách đây
mục cha
commit
8b02a15d52

+ 15 - 3
cli/compose/loader/loader.go

@@ -435,9 +435,21 @@ func LoadVolumes(source types.Dict) (map[string]types.VolumeConfig, error) {
 		return volumes, err
 		return volumes, err
 	}
 	}
 	for name, volume := range volumes {
 	for name, volume := range volumes {
-		if volume.External.External && volume.External.Name == "" {
-			volume.External.Name = name
-			volumes[name] = volume
+		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
 	return volumes, nil

+ 44 - 0
cli/compose/loader/loader_test.go

@@ -541,6 +541,50 @@ services:
 	assert.Contains(t, forbidden, "extends")
 	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 {
 func durationPtr(value time.Duration) *time.Duration {
 	return &value
 	return &value
 }
 }