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 33339b823..f4ef317d1 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 @@ -11,20 +11,43 @@ package org.springframework.ide.vscode.bosh; import org.springframework.ide.vscode.bosh.models.BoshModels; +import org.springframework.ide.vscode.commons.util.ValueParsers; import org.springframework.ide.vscode.commons.yaml.schema.YType; import org.springframework.ide.vscode.commons.yaml.schema.YTypeFactory; +import org.springframework.ide.vscode.commons.yaml.schema.YTypeFactory.AbstractType; +import org.springframework.ide.vscode.commons.yaml.schema.YTypeFactory.YAtomicType; import org.springframework.ide.vscode.commons.yaml.schema.YTypeFactory.YBeanType; import org.springframework.ide.vscode.commons.yaml.schema.YTypeUtil; import org.springframework.ide.vscode.commons.yaml.schema.YamlSchema; public class BoshCloudConfigSchema extends SchemaSupport implements YamlSchema { - private YBeanType toplevelType; - private YType t_any; + private final YBeanType toplevelType; + private final YType t_az_ref; + private final YType t_vm_type_ref; + private final YType t_network_ref; public BoshCloudConfigSchema(YTypeFactory f, BoshModels models) { super(f); - t_any = f.yany("Object"); + + AbstractType t_any = f.yany("Object"); + AbstractType t_ne_string = f.yatomic("String") + .parseWith(ValueParsers.NE_STRING); + YAtomicType t_boolean = f.yenum("boolean", "true", "false"); + + t_az_ref = t_ne_string; + t_vm_type_ref = t_ne_string; + t_network_ref = t_ne_string; + + AbstractType t_pos_integer = f.yatomic("Positive Integer") + .parseWith(ValueParsers.POS_INTEGER); + + YBeanType t_compilation = f.ybean("Compilation"); + addProp(t_compilation, "workers", t_pos_integer).isRequired(true); + addProp(t_compilation, "reuse_compilation_vms", t_boolean); + addProp(t_compilation, "az", t_az_ref).isRequired(true); + addProp(t_compilation, "vm_type", t_vm_type_ref).isRequired(true); + addProp(t_compilation, "network", t_network_ref).isRequired(true); this.toplevelType = f.ybean("CloudConfig"); addProp(toplevelType, "azs", t_any).isRequired(true); @@ -32,7 +55,7 @@ public class BoshCloudConfigSchema extends SchemaSupport implements YamlSchema { addProp(toplevelType, "vm_types", t_any).isRequired(true); addProp(toplevelType, "vm_extensions", t_any); addProp(toplevelType, "disk_types", t_any).isRequired(true); - addProp(toplevelType, "compilation", t_any).isRequired(true); + addProp(toplevelType, "compilation", t_compilation).isRequired(true); } @Override diff --git a/headless-services/bosh-language-server/src/main/resources/cloud-config/Compilation/az.md b/headless-services/bosh-language-server/src/main/resources/cloud-config/Compilation/az.md new file mode 100644 index 000000000..7d829e8a3 --- /dev/null +++ b/headless-services/bosh-language-server/src/main/resources/cloud-config/Compilation/az.md @@ -0,0 +1 @@ +*Required*. Name of the AZ defined in AZs section to use for creating compilation VMs. \ No newline at end of file diff --git a/headless-services/bosh-language-server/src/main/resources/cloud-config/Compilation/network.md b/headless-services/bosh-language-server/src/main/resources/cloud-config/Compilation/network.md new file mode 100644 index 000000000..775ca041a --- /dev/null +++ b/headless-services/bosh-language-server/src/main/resources/cloud-config/Compilation/network.md @@ -0,0 +1 @@ +*Required*. References a valid network name defined in the Networks block. BOSH assigns network properties to compilation VMs according to the type and properties of the specified network. \ No newline at end of file diff --git a/headless-services/bosh-language-server/src/main/resources/cloud-config/Compilation/reuse_compilation_vms.md b/headless-services/bosh-language-server/src/main/resources/cloud-config/Compilation/reuse_compilation_vms.md new file mode 100644 index 000000000..dd55712e3 --- /dev/null +++ b/headless-services/bosh-language-server/src/main/resources/cloud-config/Compilation/reuse_compilation_vms.md @@ -0,0 +1 @@ +*Optional*. If `false`, BOSH creates a new compilation VM for each new package compilation and destroys the VM when compilation is complete. If `true`, compilation VMs are re-used when compiling packages. Defaults to `false`. \ No newline at end of file diff --git a/headless-services/bosh-language-server/src/main/resources/cloud-config/Compilation/vm_type.md b/headless-services/bosh-language-server/src/main/resources/cloud-config/Compilation/vm_type.md new file mode 100644 index 000000000..c316f8e13 --- /dev/null +++ b/headless-services/bosh-language-server/src/main/resources/cloud-config/Compilation/vm_type.md @@ -0,0 +1 @@ +*Required*. Name of the VM type defined in VM types section to use for creating compilation VMs. \ No newline at end of file diff --git a/headless-services/bosh-language-server/src/main/resources/cloud-config/Compilation/workers.md b/headless-services/bosh-language-server/src/main/resources/cloud-config/Compilation/workers.md new file mode 100644 index 000000000..9dd113cfc --- /dev/null +++ b/headless-services/bosh-language-server/src/main/resources/cloud-config/Compilation/workers.md @@ -0,0 +1 @@ +*Required*. The maximum number of compilation VMs. \ 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 7eeb1cf42..d12cf080c 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 @@ -1696,7 +1696,7 @@ public class BoshEditorTest { "- name: blah\n" + " <*>" ); - editor.assertContextualCompletions(LanguageId.BOSH_DEPLOYMENT, c -> c.getLabel().equals("jobs Snippet"), + editor.assertContextualCompletions(c -> c.getLabel().equals("jobs Snippet"), "jo<*>" , // ------ "jobs:\n" + @@ -1727,7 +1727,7 @@ public class BoshEditorTest { " - name: $1\n" + " release: $2<*>" ); - editor.assertContextualCompletions(LanguageId.BOSH_DEPLOYMENT, c -> c.getLabel().equals("→ jobs Snippet"), + editor.assertContextualCompletions(c -> c.getLabel().equals("→ jobs Snippet"), "jo<*>" , // ------ " jobs:\n" + @@ -1745,7 +1745,7 @@ public class BoshEditorTest { " type: aaa\n" + "<*>" ); - editor.assertContextualCompletions(LanguageId.BOSH_DEPLOYMENT, DEDENTED_COMPLETION.and(SNIPPET_COMPLETION), + editor.assertContextualCompletions(DEDENTED_COMPLETION.and(SNIPPET_COMPLETION), " <*>" , // ==> "instance_groups:\n" + @@ -1789,7 +1789,7 @@ public class BoshEditorTest { " type: aaa\n" + "<*>" ); - editor.assertContextualCompletions(LanguageId.BOSH_DEPLOYMENT, DEDENTED_COMPLETION.and(SNIPPET_COMPLETION.negate()), + editor.assertContextualCompletions(DEDENTED_COMPLETION.and(SNIPPET_COMPLETION.negate()), " <*>" , //==> "instance_groups:\n" + @@ -1818,7 +1818,7 @@ public class BoshEditorTest { "- name: \n" + "<*>" ); - editor.assertContextualCompletions(LanguageId.BOSH_DEPLOYMENT, c -> c.getLabel().equals("→ jobs"), + editor.assertContextualCompletions(c -> c.getLabel().equals("→ jobs"), "jo<*>" , // ==> " jobs:\n" + @@ -1910,4 +1910,48 @@ public class BoshEditorTest { editor.assertHoverContains("compilation", "A compilation definition allows to specify VM characteristics."); } + @Test public void cloudconfig_compilation_subproperties() throws Exception { + Editor editor = harness.newEditor(LanguageId.BOSH_CLOUD_CONFIG, + "compilation:\n" + + " <*>" + ); + editor.assertContextualCompletions(PLAIN_COMPLETION.or(SNIPPET_COMPLETION), + "<*>" + , // ==> + "workers: $1\n" + + " az: $2\n" + + " vm_type: $3\n" + + " network: $4<*>" + , + "az: <*>" + , + "network: <*>" + , + "reuse_compilation_vms: <*>" + , + "vm_type: <*>" + , + "workers: <*>" + ); + + editor = harness.newEditor(LanguageId.BOSH_CLOUD_CONFIG, + "compilation:\n" + + " workers: not-int\n" + + " reuse_compilation_vms: not-bool\n" + + " az: z1\n" + + " vm_type: default\n" + + " network: private\n" + ); + editor.ignoreProblem(YamlSchemaProblems.MISSING_PROPERTY); + editor.assertProblems( + "not-int|NumberFormatException", + "not-bool|unknown 'boolean'" + ); + editor.assertHoverContains("workers", "The maximum number of compilation VMs"); + editor.assertHoverContains("reuse_compilation_vms", "If `false`, BOSH creates a new compilation VM"); + editor.assertHoverContains("az", "Name of the AZ defined in AZs section"); + editor.assertHoverContains("vm_type", "Name of the VM type defined in VM types section"); + editor.assertHoverContains("network", "References a valid network name defined in the Networks block"); + } + } diff --git a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java index 641971844..ba2449220 100644 --- a/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java +++ b/headless-services/commons/language-server-test-harness/src/main/java/org/springframework/ide/vscode/languageserver/testharness/Editor.java @@ -377,7 +377,8 @@ public class Editor { } } - public void assertContextualCompletions(LanguageId language, Predicate isInteresting, String textBefore, String... textAfter) throws Exception { + public void assertContextualCompletions(Predicate isInteresting, String textBefore, String... textAfter) throws Exception { + LanguageId language = this.getLanguageId(); Editor editor = harness.newEditor(language, this.getText()); editor.reconcile(); //this ensures the conText is parsed and its AST is cached (will be used for //dynamic CA when the conText + textBefore is not parsable. @@ -391,7 +392,7 @@ public class Editor { } public void assertContextualCompletions(String textBefore, String... textAfter) throws Exception { - assertContextualCompletions(getLanguageId(), (x) -> true, textBefore, textAfter); + assertContextualCompletions((x) -> true, textBefore, textAfter); } private String replaceSelection(String replacement) {