From da2017079792d219c89a69b82b355f1531354ff8 Mon Sep 17 00:00:00 2001 From: Kris De Volder Date: Wed, 9 Aug 2017 16:55:44 -0700 Subject: [PATCH] Bosh Cloudconfig editor: add 'vm_extensions' sub-props to schema --- .../vscode/bosh/BoshCloudConfigSchema.java | 16 +++++++++-- .../VMExtension/cloud_properties.md | 1 + .../cloud-config/VMExtension/name.md | 1 + .../ide/vscode/bosh/BoshEditorTest.java | 28 +++++++++++++++++++ 4 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 headless-services/bosh-language-server/src/main/resources/cloud-config/VMExtension/cloud_properties.md create mode 100644 headless-services/bosh-language-server/src/main/resources/cloud-config/VMExtension/name.md 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 c1b9c90d5..fad4edbe9 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 @@ -44,6 +44,8 @@ public class BoshCloudConfigSchema extends SchemaSupport implements YamlSchema { private final YType t_network_def; private final YType t_disk_type_def; private final YType t_disk_type_ref; + private final YType t_vm_extension_def; + private final YType t_vm_extension_ref; private Collection definitionTypes; private final Lazy>> defAndRefTypes = new Lazy<>(); private AbstractType t_any; @@ -87,6 +89,11 @@ public class BoshCloudConfigSchema extends SchemaSupport implements YamlSchema { models.astTypes.getDefinedNames(dc, t_disk_type_def) )); + t_vm_extension_def = f.yatomic("VMExtensionName").parseWith(ValueParsers.NE_STRING); + t_vm_extension_ref = f.yenumFromDynamicValues("VMExtensionName",(dc) -> PartialCollection.compute(() -> + models.astTypes.getDefinedNames(dc, t_vm_extension_def) + )); + YType t_network = createNetworkBlockSchema(models); YBeanType t_az = f.ybean("AZ"); @@ -109,11 +116,15 @@ public class BoshCloudConfigSchema extends SchemaSupport implements YamlSchema { addProp(t_disk_type, "disk_size", t_pos_integer).isRequired(true); addProp(t_disk_type, "cloud_properties", t_params); + YBeanType t_vm_extension = f.ybean("VMExtension"); + addProp(t_vm_extension, "name", t_vm_extension_def).isPrimary(true); + addProp(t_vm_extension, "cloud_properties", t_params); + this.toplevelType = f.ybean("CloudConfig"); addProp(toplevelType, "azs", f.yseq(t_az).notEmpty()).isRequired(true); addProp(toplevelType, "networks", f.yseq(t_network).notEmpty()).isRequired(true); addProp(toplevelType, "vm_types", f.yseq(t_vm_type).notEmpty()).isRequired(true); - addProp(toplevelType, "vm_extensions", f.yseq(t_any)); + addProp(toplevelType, "vm_extensions", f.yseq(t_vm_extension)); addProp(toplevelType, "disk_types", f.yseq(t_disk_type).notEmpty()).isRequired(true); addProp(toplevelType, "compilation", t_compilation).isRequired(true); @@ -199,7 +210,8 @@ public class BoshCloudConfigSchema extends SchemaSupport implements YamlSchema { Pair.of(t_vm_type_def, t_vm_type_ref), Pair.of(t_network_def, t_network_ref), Pair.of(t_az_def, t_az_ref), - Pair.of(t_disk_type_def, t_disk_type_ref) + Pair.of(t_disk_type_def, t_disk_type_ref), + Pair.of(t_vm_extension_def, t_vm_extension_ref) )); } diff --git a/headless-services/bosh-language-server/src/main/resources/cloud-config/VMExtension/cloud_properties.md b/headless-services/bosh-language-server/src/main/resources/cloud-config/VMExtension/cloud_properties.md new file mode 100644 index 000000000..0476156e4 --- /dev/null +++ b/headless-services/bosh-language-server/src/main/resources/cloud-config/VMExtension/cloud_properties.md @@ -0,0 +1 @@ +Describes any IaaS-specific properties needed to configure VMs. Example: `elbs: [...]`. Default is `{}` (empty Hash). \ No newline at end of file diff --git a/headless-services/bosh-language-server/src/main/resources/cloud-config/VMExtension/name.md b/headless-services/bosh-language-server/src/main/resources/cloud-config/VMExtension/name.md new file mode 100644 index 000000000..b8066eb19 --- /dev/null +++ b/headless-services/bosh-language-server/src/main/resources/cloud-config/VMExtension/name.md @@ -0,0 +1 @@ +*Required*. A unique name used to identify and reference the VM extension. \ No newline at end of file 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 eabf5422e..e87832bd1 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 @@ -2438,4 +2438,32 @@ public class BoshEditorTest { "[]|At least one 'DiskType' is required" ); } + + @Test public void cloudconfig_vm_extensions() throws Exception { + Editor editor = harness.newEditor(LanguageId.BOSH_CLOUD_CONFIG, + "vm_extensions:\n" + + "- name: pub-lbs\n" + + " cloud_properties:\n" + + " elbs: [main]\n" + ); + editor.ignoreProblem(YamlSchemaProblems.MISSING_PROPERTY); + editor.assertProblems(/*NONE*/); + editor.assertHoverContains("name", "A unique name used to identify and reference the VM extension"); + editor.assertHoverContains("cloud_properties", "Describes any IaaS-specific properties needed to configure VMs"); + + editor = harness.newEditor(LanguageId.BOSH_CLOUD_CONFIG, + "vm_extensions:\n" + + "- <*>" + ); + editor.assertContextualCompletions("<*>", "name: <*>"); + + editor = harness.newEditor(LanguageId.BOSH_CLOUD_CONFIG, + "vm_extensions:\n" + + "- name: flubbergastly-vm\n" + + " <*>" + ); + editor.assertContextualCompletions(PLAIN_COMPLETION, "<*>", + "cloud_properties:\n <*>"); + + } }