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 new file mode 100644 index 000000000..4ddb329c9 --- /dev/null +++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshCloudConfigSchema.java @@ -0,0 +1,52 @@ +/******************************************************************************* + * Copyright (c) 2017 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.bosh; + +import org.springframework.ide.vscode.bosh.models.BoshModels; +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.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; + + public BoshCloudConfigSchema(YTypeFactory f, BoshModels models) { + super(f); + this.toplevelType = f.ybean("CloudConfig"); + t_any = f.yany("Object"); + + addProp(toplevelType, "azs", t_any); + addProp(toplevelType, "networks", t_any); + addProp(toplevelType, "vm_types", t_any); + addProp(toplevelType, "vm_extensions", t_any); + addProp(toplevelType, "disk_types", t_any); + addProp(toplevelType, "compilation", t_any); + } + + @Override + public YType getTopLevelType() { + return toplevelType; + } + + @Override + public YTypeUtil getTypeUtil() { + return f.TYPE_UTIL; + } + + @Override + protected String getResourcePathPrefix() { + return "cloud-config"; + } +} diff --git a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshDefintionFinder.java b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshDefintionFinder.java index 8ab72bf88..1cbbabfad 100644 --- a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshDefintionFinder.java +++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshDefintionFinder.java @@ -38,7 +38,7 @@ public class BoshDefintionFinder extends SimpleDefinitionFinder handlers = new HashMap<>(); @@ -47,7 +47,7 @@ public class BoshDefintionFinder extends SimpleDefinitionFinder handle(Node refNode, TextDocument doc, YamlFileAST ast); } - public BoshDefintionFinder(BoshLanguageServer server, BoshDeploymentManifestSchema schema, YamlAstCache asts, ASTTypeCache astTypes) { + public BoshDefintionFinder(BoshLanguageServer server, BoshSchemas schema, YamlAstCache asts, ASTTypeCache astTypes) { super(server); this.schema = schema; this.asts = asts; diff --git a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshDeploymentManifestSchema.java b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshDeploymentManifestSchema.java index c1aeec5e1..b9451cc54 100644 --- a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshDeploymentManifestSchema.java +++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshDeploymentManifestSchema.java @@ -17,6 +17,7 @@ import java.util.UUID; import java.util.function.Predicate; import org.apache.commons.lang3.tuple.Pair; +import org.springframework.ide.vscode.bosh.models.BoshModels; import org.springframework.ide.vscode.bosh.models.CachingModelProvider; import org.springframework.ide.vscode.bosh.models.CloudConfigModel; import org.springframework.ide.vscode.bosh.models.DynamicModelProvider; @@ -58,7 +59,7 @@ import com.google.common.collect.ImmutableSet; /** * @author Kris De Volder */ -public class BoshDeploymentManifestSchema implements YamlSchema { +public class BoshDeploymentManifestSchema extends SchemaSupport implements YamlSchema { private final YBeanType V2_TOPLEVEL_TYPE; private final YBeanType V1_TOPLEVEL_TYPE; @@ -70,26 +71,19 @@ public class BoshDeploymentManifestSchema implements YamlSchema { private ImmutableList definitionTypes = null; //Note: 'director_uuid' is also deprecated. But its treated separately since it is deprecated and ignored by V2 client no matter what (i.e. deprecated in both schemas) - public final YTypeFactory f = new YTypeFactory() - .enableTieredProposals(false) - .suggestDeprecatedProperties(false); - public final YType t_string = f.yatomic("String"); - public final YType t_ne_string = f.yatomic("String") - .parseWith(ValueParsers.NE_STRING); + public final YType t_string; + public final YType t_ne_string; - public final YType t_strings = f.yseq(t_string); + public final YType t_strings; - public final YAtomicType t_boolean = f.yenum("boolean", "true", "false"); - public final YType t_any = f.yany("Object"); - public final YType t_params = f.ymap(t_string, t_any); - public final YType t_string_params = f.ymap(t_string, t_string); - public final YType t_pos_integer = f.yatomic("Positive Integer") - .parseWith(ValueParsers.POS_INTEGER); - public final YType t_strictly_pos_integer = f.yatomic("Strictly Positive Integer") - .parseWith(ValueParsers.integerAtLeast(1)); - public final YType t_uuid = f.yatomic("UUID").parseWith(UUID::fromString); - public final YType t_integer_or_range = f.yatomic("Integer or Range") - .parseWith(BoshValueParsers.INTEGER_OR_RANGE); + public final YAtomicType t_boolean; + public final YType t_any; + public final YType t_params; + public final YType t_string_params; + public final YType t_pos_integer; + public final YType t_strictly_pos_integer; + public final YType t_uuid; + public final YType t_integer_or_range; private YType t_stemcell_alias_def; private YType t_stemcell_alias_ref; private YType t_release_name_def; @@ -103,19 +97,31 @@ public class BoshDeploymentManifestSchema implements YamlSchema { private DynamicModelProvider releasesProvider; private List> defAndRefTypes; - public BoshDeploymentManifestSchema( - YamlAstCache asts, ASTTypeCache astTypes, - DynamicModelProvider cloudConfigProvider, - DynamicModelProvider stemcellsProvider, - DynamicModelProvider releasesProvider - ) { - this.asts = asts; - this.astTypes = astTypes; - this.cloudConfigProvider = new CachingModelProvider<>(cloudConfigProvider, CloudConfigModel.class); - this.stemcellsProvider = new CachingModelProvider<>(stemcellsProvider, StemcellsModel.class); - this.releasesProvider = new CachingModelProvider<>(releasesProvider, ReleasesModel.class); + public BoshDeploymentManifestSchema(YTypeFactory f, BoshModels models) { + super(f); + this.asts = models.asts; + this.astTypes = models.astTypes; + this.cloudConfigProvider = new CachingModelProvider<>(models.cloudConfigProvider, CloudConfigModel.class); + this.stemcellsProvider = new CachingModelProvider<>(models.stemcellsProvider, StemcellsModel.class); + this.releasesProvider = new CachingModelProvider<>(models.releasesProvider, ReleasesModel.class); TYPE_UTIL = f.TYPE_UTIL; + t_string = f.yatomic("String"); + t_boolean = f.yenum("boolean", "true", "false"); + t_ne_string = f.yatomic("String") + .parseWith(ValueParsers.NE_STRING); + t_strings = f.yseq(t_string); + t_any = f.yany("Object"); + t_params = f.ymap(t_string, t_any); + t_string_params = f.ymap(t_string, t_string); + t_pos_integer = f.yatomic("Positive Integer") + .parseWith(ValueParsers.POS_INTEGER); + t_strictly_pos_integer = f.yatomic("Strictly Positive Integer") + .parseWith(ValueParsers.integerAtLeast(1)); + t_uuid = f.yatomic("UUID").parseWith(UUID::fromString); + t_integer_or_range = f.yatomic("Integer or Range") + .parseWith(BoshValueParsers.INTEGER_OR_RANGE); + V2_TOPLEVEL_TYPE = createV2Schema(); V1_TOPLEVEL_TYPE = createV1Schema(V2_TOPLEVEL_TYPE); @@ -345,25 +351,9 @@ public class BoshDeploymentManifestSchema implements YamlSchema { return TYPE_UTIL; } - private YTypedPropertyImpl prop(AbstractType beanType, String name, YType type) { - YTypedPropertyImpl prop = f.yprop(name, type); - prop.setDescriptionProvider(descriptionFor(beanType, name)); - return prop; - } - - public static Renderable descriptionFor(YType owner, String propName) { - String typeName = owner.toString(); - return Renderables.fromClasspath(BoshDeploymentManifestSchema.class, "/desc/"+typeName+"/"+propName); - } - - private YTypedPropertyImpl addProp(AbstractType bean, String name, YType type) { - return addProp(bean, bean, name, type); - } - - private YTypedPropertyImpl addProp(AbstractType superType, AbstractType bean, String name, YType type) { - YTypedPropertyImpl p = prop(superType, name, type); - bean.addProperty(p); - return p; + @Override + protected String getResourcePathPrefix() { + return "/deployment-manifest/"; } public Collection getDefinitionTypes() { diff --git a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServer.java b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServer.java index b53c9e078..7256e2877 100644 --- a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServer.java +++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshLanguageServer.java @@ -10,6 +10,7 @@ *******************************************************************************/ package org.springframework.ide.vscode.bosh; +import org.springframework.ide.vscode.bosh.models.BoshModels; import org.springframework.ide.vscode.bosh.models.CloudConfigModel; import org.springframework.ide.vscode.bosh.models.DynamicModelProvider; import org.springframework.ide.vscode.bosh.models.ReleasesModel; @@ -41,7 +42,7 @@ import org.springframework.ide.vscode.commons.yaml.structure.YamlStructureProvid public class BoshLanguageServer extends SimpleLanguageServer { private final VscodeCompletionEngineAdapter completionEngine; - private BoshDeploymentManifestSchema schema; + private BoshSchemas schema; public BoshLanguageServer(BoshCliConfig cliConfig, DynamicModelProvider cloudConfigProvider, @@ -49,11 +50,12 @@ public class BoshLanguageServer extends SimpleLanguageServer { DynamicModelProvider releasesProvider ) { super("vscode-bosh"); - YamlAstCache asts = new YamlAstCache(); + BoshModels models = new BoshModels(cloudConfigProvider, stemcellsProvider, releasesProvider); SimpleTextDocumentService documents = getTextDocumentService(); - ASTTypeCache astTypeCache = new ASTTypeCache(); - schema = new BoshDeploymentManifestSchema(asts, astTypeCache, cloudConfigProvider, stemcellsProvider, releasesProvider); + schema = new BoshSchemas(models); + YamlAstCache asts = models.asts; + ASTTypeCache astTypeCache = models.astTypes; YamlStructureProvider structureProvider = YamlStructureProvider.DEFAULT; YamlAssistContextProvider contextProvider = new SchemaBasedYamlAssistContextProvider(schema); @@ -82,11 +84,7 @@ public class BoshLanguageServer extends SimpleLanguageServer { } private void validateOnDocumentChange(IReconcileEngine engine, TextDocument doc) { - if (LanguageId.BOSH_DEPLOYMENT.equals(doc.getLanguageId())) { - validateWith(doc.getId(), engine); - } else { - validateWith(doc.getId(), IReconcileEngine.NULL); - } + validateWith(doc.getId(), engine); } public void enableSnippets(boolean enable) { diff --git a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshSchemas.java b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshSchemas.java new file mode 100644 index 000000000..b5936c47a --- /dev/null +++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/BoshSchemas.java @@ -0,0 +1,67 @@ +/******************************************************************************* + * Copyright (c) 2017 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.bosh; + +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.text.LanguageId; +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.YTypeUtil; +import org.springframework.ide.vscode.commons.yaml.schema.YamlSchema; + +public class BoshSchemas implements YamlSchema { + + public final YTypeFactory f = new YTypeFactory() + .enableTieredProposals(false) + .suggestDeprecatedProperties(false); + public BoshDeploymentManifestSchema getDeploymentSchema() { + return deploymentSchema; + } + + private final BoshDeploymentManifestSchema deploymentSchema; + private YTypeUtil typeUtil; + + private final YType toplevelType; + private BoshCloudConfigSchema cloudConfigSchema; + + public BoshSchemas(BoshModels models) { + this.typeUtil = f.TYPE_UTIL; + this.deploymentSchema = new BoshDeploymentManifestSchema(f, models); + this.cloudConfigSchema = new BoshCloudConfigSchema(f, models); + toplevelType = f.contextAware("BoshSchemas", dc -> { + return LanguageId.BOSH_CLOUD_CONFIG.equals(dc.getDocument().getLanguageId()) + ? cloudConfigSchema.getTopLevelType() + : deploymentSchema.getTopLevelType(); + }); + } + + @Override + public YType getTopLevelType() { + return toplevelType; + } + + @Override + public YTypeUtil getTypeUtil() { + return f.TYPE_UTIL; + } + + public Collection> getDefAndRefTypes() { + return deploymentSchema.getDefAndRefTypes(); + } + + public Collection getDefinitionTypes() { + return deploymentSchema.getDefinitionTypes(); + } + +} diff --git a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/SchemaSupport.java b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/SchemaSupport.java new file mode 100644 index 000000000..34f409840 --- /dev/null +++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/SchemaSupport.java @@ -0,0 +1,59 @@ +/******************************************************************************* + * Copyright (c) 2017 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.bosh; + +import org.springframework.ide.vscode.commons.util.Renderable; +import org.springframework.ide.vscode.commons.util.Renderables; +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.YTypedPropertyImpl; + +/** + * Some common utility methods useful in implementing Schemas. + * + * @author Kris De Volder + */ +public class SchemaSupport { + + protected final YTypeFactory f; + + protected SchemaSupport(YTypeFactory f) { + this.f = f; + } + + protected String getResourcePathPrefix() { + return "desc"; + } + + protected YTypedPropertyImpl prop(AbstractType beanType, String name, YType type) { + YTypedPropertyImpl prop = f.yprop(name, type); + prop.setDescriptionProvider(descriptionFor(beanType, name)); + return prop; + } + + protected Renderable descriptionFor(YType owner, String propName) { + String typeName = owner.toString(); + return Renderables.fromClasspath(BoshDeploymentManifestSchema.class, getResourcePathPrefix()+typeName+"/"+propName); + } + + protected YTypedPropertyImpl addProp(AbstractType bean, String name, YType type) { + return addProp(bean, bean, name, type); + } + + protected YTypedPropertyImpl addProp(AbstractType superType, AbstractType bean, String name, YType type) { + YTypedPropertyImpl p = prop(superType, name, type); + bean.addProperty(p); + return p; + } + + +} diff --git a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/models/BoshModels.java b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/models/BoshModels.java new file mode 100644 index 000000000..ad8e5d236 --- /dev/null +++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/models/BoshModels.java @@ -0,0 +1,31 @@ +/******************************************************************************* + * Copyright (c) 2017 Pivotal, Inc. + * All rights reserved. This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v1.0 + * which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v10.html + * + * Contributors: + * Pivotal, Inc. - initial API and implementation + *******************************************************************************/ +package org.springframework.ide.vscode.bosh.models; + +import org.springframework.ide.vscode.commons.yaml.ast.YamlAstCache; +import org.springframework.ide.vscode.commons.yaml.reconcile.ASTTypeCache; + +public class BoshModels { + public final YamlAstCache asts = new YamlAstCache(); + public final ASTTypeCache astTypes = new ASTTypeCache(); + public final DynamicModelProvider cloudConfigProvider; + public final DynamicModelProvider stemcellsProvider; + public final DynamicModelProvider releasesProvider; + + public BoshModels(DynamicModelProvider cloudConfigProvider, + DynamicModelProvider stemcellsProvider, + DynamicModelProvider releasesProvider) { + this.cloudConfigProvider = cloudConfigProvider; + this.stemcellsProvider = stemcellsProvider; + this.releasesProvider = releasesProvider; + } + +} diff --git a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/models/CachingModelProvider.java b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/models/CachingModelProvider.java index c5679b43f..f3fa33203 100644 --- a/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/models/CachingModelProvider.java +++ b/headless-services/bosh-language-server/src/main/java/org/springframework/ide/vscode/bosh/models/CachingModelProvider.java @@ -15,6 +15,7 @@ import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeUnit; import java.util.function.Function; +import org.springframework.ide.vscode.commons.util.Assert; import org.springframework.ide.vscode.commons.yaml.schema.DynamicSchemaContext; import com.google.common.cache.Cache; @@ -39,6 +40,7 @@ public class CachingModelProvider implements DynamicModelProvider { private Class modelInterface; public CachingModelProvider(DynamicModelProvider delegate, Class modelInterface) { + Assert.isNotNull(delegate); this.delegate = delegate; this.modelInterface = modelInterface; } diff --git a/headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/director_uuid.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/director_uuid.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/director_uuid.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/director_uuid.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/instance_groups.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/instance_groups.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/instance_groups.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/instance_groups.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/name.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/name.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/name.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/name.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/properties.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/properties.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/properties.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/properties.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/releases.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/releases.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/releases.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/releases.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/stemcells.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/stemcells.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/stemcells.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/stemcells.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/tags.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/tags.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/tags.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/tags.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/update.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/update.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/update.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/update.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/variables.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/variables.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/BoshDeploymentManifest/variables.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/BoshDeploymentManifest/variables.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/azs.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/azs.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/azs.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/azs.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/env.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/env.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/env.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/env.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/instances.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/instances.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/instances.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/instances.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/jobs.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/jobs.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/jobs.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/jobs.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/lifecycle.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/lifecycle.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/lifecycle.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/lifecycle.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/migrated_from.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/migrated_from.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/migrated_from.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/migrated_from.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/name.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/name.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/name.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/name.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/networks.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/networks.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/networks.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/networks.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/persistent_disk_type.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/persistent_disk_type.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/persistent_disk_type.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/persistent_disk_type.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/properties.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/properties.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/properties.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/properties.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/stemcell.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/stemcell.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/stemcell.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/stemcell.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/update.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/update.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/update.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/update.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/vm_extensions.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/vm_extensions.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/vm_extensions.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/vm_extensions.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/vm_type.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/vm_type.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/InstanceGroup/vm_type.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroup/vm_type.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/InstanceGroupEnv/password.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroupEnv/password.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/InstanceGroupEnv/password.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/InstanceGroupEnv/password.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Job/consumes.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Job/consumes.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Job/consumes.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Job/consumes.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Job/name.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Job/name.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Job/name.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Job/name.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Job/properties.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Job/properties.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Job/properties.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Job/properties.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Job/provides.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Job/provides.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Job/provides.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Job/provides.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Job/release.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Job/release.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Job/release.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Job/release.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Network/default.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Network/default.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Network/default.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Network/default.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Network/name.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Network/name.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Network/name.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Network/name.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Network/static_ips.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Network/static_ips.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Network/static_ips.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Network/static_ips.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Release/name.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Release/name.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Release/name.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Release/name.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Release/sha1.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Release/sha1.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Release/sha1.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Release/sha1.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Release/url.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Release/url.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Release/url.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Release/url.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Release/version.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Release/version.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Release/version.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Release/version.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Stemcell/alias.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Stemcell/alias.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Stemcell/alias.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Stemcell/alias.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Stemcell/name.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Stemcell/name.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Stemcell/name.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Stemcell/name.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Stemcell/os.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Stemcell/os.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Stemcell/os.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Stemcell/os.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Stemcell/version.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Stemcell/version.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Stemcell/version.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Stemcell/version.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Update/canaries.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Update/canaries.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Update/canaries.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Update/canaries.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Update/canary_watch_time.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Update/canary_watch_time.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Update/canary_watch_time.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Update/canary_watch_time.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Update/max_in_flight.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Update/max_in_flight.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Update/max_in_flight.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Update/max_in_flight.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Update/serial.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Update/serial.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Update/serial.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Update/serial.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Update/update_watch_time.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Update/update_watch_time.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Update/update_watch_time.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Update/update_watch_time.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Variable/name.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Variable/name.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Variable/name.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Variable/name.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Variable/options.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Variable/options.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Variable/options.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Variable/options.md diff --git a/headless-services/bosh-language-server/src/main/resources/desc/Variable/type.md b/headless-services/bosh-language-server/src/main/resources/deployment-manifest/Variable/type.md similarity index 100% rename from headless-services/bosh-language-server/src/main/resources/desc/Variable/type.md rename to headless-services/bosh-language-server/src/main/resources/deployment-manifest/Variable/type.md 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 49f4316d8..3bbdd0bcf 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 @@ -148,7 +148,6 @@ public class BoshEditorTest { editor.assertHoverContains("tags", "Specifies key value pairs to be sent to the CPI for VM tagging"); } - //@Ignore //For now... because not passing yet. @Test public void reconcileCfManifest() throws Exception { Editor editor = harness.newEditorFromClasspath("/workspace/cf-deployment-manifest.yml"); cloudConfigProvider.executeCommandWith(() -> { @@ -254,8 +253,6 @@ public class BoshEditorTest { editor.assertHoverContains("name", "Full name of a matching stemcell. Either `name` or `os` keys can be specified."); } - - @Test public void releasesBlockCompletions() throws Exception { harness.getServer().enableSnippets(false); Editor editor = harness.newEditor( @@ -1841,4 +1838,61 @@ public class BoshEditorTest { ); } + @Test public void cloudconfigReconcile() throws Exception { + Editor editor = harness.newEditor(LanguageId.BOSH_CLOUD_CONFIG, + "bogus: bad\n" + + "azs:\n" + + "- name: z1\n" + + " cloud_properties: {availability_zone: us-east-1a}\n" + + "- name: z2\n" + + " cloud_properties: {availability_zone: us-east-1b}\n" + + "\n" + + "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" + + "\n" + + "disk_types:\n" + + "- name: small\n" + + " disk_size: 3000\n" + + " cloud_properties: {type: gp2}\n" + + "- name: large\n" + + " disk_size: 50_000\n" + + " cloud_properties: {type: gp2}\n" + + "\n" + + "networks:\n" + + "- name: private\n" + + " type: manual\n" + + " subnets:\n" + + " - range: 10.10.0.0/24\n" + + " gateway: 10.10.0.1\n" + + " az: z1\n" + + " static: [10.10.0.62]\n" + + " dns: [10.10.0.2]\n" + + " cloud_properties: {subnet: subnet-f2744a86}\n" + + " - range: 10.10.64.0/24\n" + + " gateway: 10.10.64.1\n" + + " az: z2\n" + + " static: [10.10.64.121, 10.10.64.122]\n" + + " dns: [10.10.0.2]\n" + + " cloud_properties: {subnet: subnet-eb8bd3ad}\n" + + "- name: vip\n" + + " type: vip\n" + + "\n" + + "compilation:\n" + + " workers: 5\n" + + " reuse_compilation_vms: true\n" + + " az: z1\n" + + " vm_type: medium\n" + + " network: private\n" + ); + + editor.assertProblems("bogus|Unknown property"); + } + } diff --git a/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/SchemaBasedSnippetGeneratorTest.java b/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/SchemaBasedSnippetGeneratorTest.java index 52d517aec..71647b0b7 100644 --- a/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/SchemaBasedSnippetGeneratorTest.java +++ b/headless-services/bosh-language-server/src/test/java/org/springframework/ide/vscode/bosh/SchemaBasedSnippetGeneratorTest.java @@ -13,19 +13,16 @@ package org.springframework.ide.vscode.bosh; import static org.junit.Assert.assertEquals; import org.junit.Test; +import org.springframework.ide.vscode.bosh.models.BoshModels; import org.springframework.ide.vscode.bosh.snippets.SchemaBasedSnippetGenerator; import org.springframework.ide.vscode.commons.languageserver.util.SnippetBuilder; -import org.springframework.ide.vscode.commons.yaml.ast.YamlAstCache; -import org.springframework.ide.vscode.commons.yaml.reconcile.ASTTypeCache; import org.springframework.ide.vscode.commons.yaml.schema.DynamicSchemaContext; import org.springframework.ide.vscode.commons.yaml.schema.YType; import org.springframework.ide.vscode.commons.yaml.schema.YTypeUtil; public class SchemaBasedSnippetGeneratorTest { - private ASTTypeCache astTypes = new ASTTypeCache(); - private YamlAstCache asts = new YamlAstCache(); - private BoshDeploymentManifestSchema schema = new BoshDeploymentManifestSchema(asts, astTypes, (dc) -> null, (dc) -> null, (dc) -> null); + private BoshDeploymentManifestSchema schema = new BoshSchemas(new BoshModels((dc) -> null, (dc) -> null, (dc) -> null)).getDeploymentSchema(); private YTypeUtil typeUtil = schema.getTypeUtil(); private SchemaBasedSnippetGenerator generator = new SchemaBasedSnippetGenerator(typeUtil, SnippetBuilder::new); @@ -60,7 +57,6 @@ public class SchemaBasedSnippetGeneratorTest { , generator.getSnippets(v2Schema).iterator().next().getSnippet() ); - System.out.println(); } } diff --git a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/YamlSchema.java b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/YamlSchema.java index 0e11d16e1..11a0d42e7 100644 --- a/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/YamlSchema.java +++ b/headless-services/commons/commons-yaml/src/main/java/org/springframework/ide/vscode/commons/yaml/schema/YamlSchema.java @@ -10,8 +10,6 @@ *******************************************************************************/ package org.springframework.ide.vscode.commons.yaml.schema; -import java.util.Collection; - import org.springframework.ide.vscode.commons.util.IntegerRange; /** diff --git a/vscode-extensions/vscode-bosh/README.md b/vscode-extensions/vscode-bosh/README.md index 0ba295497..885c4dddc 100644 --- a/vscode-extensions/vscode-bosh/README.md +++ b/vscode-extensions/vscode-bosh/README.md @@ -1,7 +1,8 @@ # Bosh Deployment Manifest Editor for Visual Studio Code This extension provides validation, content assist and documentation hovers -for editing [Bosh](https://bosh.io/) Deployment Manifest files. +for editing [Bosh](https://bosh.io/) Deployment Manifest files and +Cloud Configs. ## Functionality @@ -63,9 +64,10 @@ errors. The Bosh editor automatically activates when the name of the `.yml` file you are editing follows a certain pattern: - - `**/*deployment*.yml` : activates support for bosh manifest file. + - `**/*deployment*.yml` : activates support for Bosh manifest file. + - `**/*cloud-config*.yml` : activates support for Bosh cloud config. -You can also define your own patterns and map them to the language-id `bosh-deployment-manifest` +You can also define your own patterns and map them to the language-id `bosh-deployment-manifest` or `bosh-cloud-config` by defining `files.associations` in workspace settings. See [vscode documentation](https://code.visualstudio.com/Docs/languages/overview#_adding-a-file-extension-to-a-language) for details. diff --git a/vscode-extensions/vscode-bosh/package.json b/vscode-extensions/vscode-bosh/package.json index 4495cdddc..c3a56cbd6 100644 --- a/vscode-extensions/vscode-bosh/package.json +++ b/vscode-extensions/vscode-bosh/package.json @@ -27,6 +27,15 @@ ], "contributes": { "languages": [ + { + "id": "bosh-cloud-config", + "aliases": [ + "Bosh Cloud Config" + ], + "filenamePatterns": [ + "*cloud-config*.yml" + ] + }, { "id": "bosh-deployment-manifest", "aliases": [ @@ -43,6 +52,11 @@ "language": "bosh-deployment-manifest", "scopeName": "source.yaml", "path": "./yaml-support/yaml.tmLanguage" + }, + { + "language": "bosh-cloud-config", + "scopeName": "source.yaml", + "path": "./yaml-support/yaml.tmLanguage" } ], "configuration": {