diff --git a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshCloudConfigSchema.java b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshCloudConfigSchema.java index f78df5883..518ccfc52 100644 --- a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshCloudConfigSchema.java +++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshCloudConfigSchema.java @@ -15,6 +15,7 @@ import java.util.Collection; import org.apache.commons.lang3.tuple.Pair; import org.springframework.ide.vscode.bosh.models.BoshModels; import org.springframework.ide.vscode.commons.util.CollectorUtil; +import org.springframework.ide.vscode.commons.util.PartialCollection; import org.springframework.ide.vscode.commons.util.ValueParsers; import org.springframework.ide.vscode.commons.yaml.reconcile.ASTTypeCache; import org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaProblems; @@ -52,8 +53,10 @@ public class BoshCloudConfigSchema extends SchemaSupport implements YamlSchema { YType t_params = f.ymap(t_ne_string, t_any); t_az_ref = t_ne_string; - t_vm_type_ref = t_ne_string; t_vm_type_def = f.yatomic("VMTypeName").parseWith(ValueParsers.NE_STRING); + t_vm_type_ref = f.yenumFromDynamicValues("VMTypeName", (dc) -> PartialCollection.compute(() -> + models.astTypes.getDefinedNames(dc, t_vm_type_def) + )); t_network_ref = t_ne_string; YBeanType t_compilation = f.ybean("Compilation"); diff --git a/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/BoshEditorTest.java b/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/BoshEditorTest.java index d9c9f59aa..6ffc81813 100644 --- a/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/BoshEditorTest.java +++ b/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/BoshEditorTest.java @@ -1945,7 +1945,8 @@ public class BoshEditorTest { editor.ignoreProblem(YamlSchemaProblems.MISSING_PROPERTY); editor.assertProblems( "not-int|NumberFormatException", - "not-bool|unknown 'boolean'" + "not-bool|unknown 'boolean'", + "default|unknown 'VMTypeName'" ); editor.assertHoverContains("workers", "The maximum number of compilation VMs"); editor.assertHoverContains("reuse_compilation_vms", "If `false`, BOSH creates a new compilation VM"); @@ -1996,4 +1997,67 @@ public class BoshEditorTest { editor.assertHoverContains("cloud_properties", "Describes any IaaS-specific properties needed to create VMs"); } + @Test public void cloudconfig_vm_types_reference() throws Exception { + Editor editor = harness.newEditor(LanguageId.BOSH_CLOUD_CONFIG, + "vm_types:\n" + + "- name: small\n" + + " cloud_properties:\n" + + " instance_type: t2.micro\n" + + " ephemeral_disk: {size: 3000, type: gp2}\n" + + "- name: medium\n" + + " cloud_properties:\n" + + " instance_type: m3.medium\n" + + " ephemeral_disk: {size: 30000, type: gp2}\n" + + "compilation:\n" + + " workers: 5\n" + + " reuse_compilation_vms: true\n" + + " az: z1\n" + + " vm_type: <*>\n" + + " network: private" + ); + editor.assertContextualCompletions("<*>", + "medium<*>", + "small<*>" + ); + editor = harness.newEditor(LanguageId.BOSH_CLOUD_CONFIG, + "vm_types:\n" + + "- name: small\n" + + " cloud_properties:\n" + + " instance_type: t2.micro\n" + + " ephemeral_disk: {size: 3000, type: gp2}\n" + + "- name: medium\n" + + " cloud_properties:\n" + + " instance_type: m3.medium\n" + + " ephemeral_disk: {size: 30000, type: gp2}\n" + + "compilation:\n" + + " workers: 5\n" + + " reuse_compilation_vms: true\n" + + " az: z1\n" + + " vm_type: medium\n" + + " network: private" + ); + editor.ignoreProblem(YamlSchemaProblems.MISSING_PROPERTY); + editor.assertProblems(/*NONE*/); + + editor = harness.newEditor(LanguageId.BOSH_CLOUD_CONFIG, + "vm_types:\n" + + "- name: small\n" + + " cloud_properties:\n" + + " instance_type: t2.micro\n" + + " ephemeral_disk: {size: 3000, type: gp2}\n" + + "- name: medium\n" + + " cloud_properties:\n" + + " instance_type: m3.medium\n" + + " ephemeral_disk: {size: 30000, type: gp2}\n" + + "compilation:\n" + + " workers: 5\n" + + " reuse_compilation_vms: true\n" + + " az: z1\n" + + " vm_type: woot-vm\n" + + " network: private" + ); + editor.ignoreProblem(YamlSchemaProblems.MISSING_PROPERTY); + editor.assertProblems("woot-vm|unknown 'VMTypeName'"); + } + }