diff --git a/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/ConcourseValueParsers.java b/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/ConcourseValueParsers.java index 905a2fbc1..09edf1e85 100644 --- a/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/ConcourseValueParsers.java +++ b/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/ConcourseValueParsers.java @@ -46,6 +46,10 @@ public class ConcourseValueParsers { return acceptOnlyUniqueNames(models::getJobNames, "job name"); } + public static SchemaContextAware resourceTypeNameDef(ConcourseModel models) { + return acceptOnlyUniqueNames(models::getResourceTypeNames, "resource-type name"); + } + public static SchemaContextAware acceptOnlyUniqueNames( Function> getDefinedNameCounts, String typeName @@ -70,6 +74,4 @@ public class ConcourseValueParsers { + " '2h45m'. Valid time units are 'ns', 'us' (or 'µs'), 'ms', 's', " + "'m', 'h'." ); - - } diff --git a/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java b/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java index ce65c6a14..b02fd1f29 100644 --- a/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java +++ b/vscode-extensions/vscode-concourse/src/main/java/org/springframework/ide/vscode/concourse/PipelineYmlSchema.java @@ -143,6 +143,8 @@ public class PipelineYmlSchema implements YamlSchema { resourceNameDef.parseWith(ConcourseValueParsers.resourceNameDef(models)); YAtomicType jobNameDef = f.yatomic("Job Name"); jobNameDef.parseWith(ConcourseValueParsers.jobNameDef(models)); + YAtomicType resourceTypeNameDef = f.yatomic("ResourceType Name"); + resourceTypeNameDef.parseWith(ConcourseValueParsers.resourceTypeNameDef(models)); YBeanType getStep = f.ybean("GetStep"); addProp(getStep, "get", t_resource_name); @@ -221,7 +223,7 @@ public class PipelineYmlSchema implements YamlSchema { addProp(job, "disable_manual_trigger", t_boolean); YBeanType resourceType = f.ybean("ResourceType"); - addProp(resourceType, "name", t_ne_string).isRequired(true); + addProp(resourceType, "name", resourceTypeNameDef).isRequired(true); addProp(resourceType, "type", t_image_type).isRequired(true); addProp(resourceType, "source", resourceSource); diff --git a/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/PipelineYamlEditorTest.java b/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/PipelineYamlEditorTest.java index 1da94ba6e..7d5ec1980 100644 --- a/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/PipelineYamlEditorTest.java +++ b/vscode-extensions/vscode-concourse/src/test/java/org/springframework/ide/vscode/concourse/PipelineYamlEditorTest.java @@ -520,6 +520,21 @@ public class PipelineYamlEditorTest { ); } + @Test + public void reconcileDuplicateResourceTypeNames() throws Exception { + Editor editor = harness.newEditor( + "resource_types:\n" + + "- name: slack-notification\n" + + " type: docker_image\n" + + "- name: slack-notification\n" + + " type: docker_image" + ); + editor.assertProblems( + "slack-notification|Duplicate resource-type name", + "slack-notification|Duplicate resource-type name" + ); + } + @Test public void reconcileDuplicateJobNames() throws Exception { Editor editor = harness.newEditor(