Add sha1 and url props in releases block schema

This commit is contained in:
Kris De Volder
2017-07-14 16:15:57 -07:00
parent f3587ea919
commit 1e920da6f8
6 changed files with 54 additions and 5 deletions

View File

@@ -16,6 +16,7 @@ import java.util.UUID;
import org.springframework.ide.vscode.commons.util.Assert;
import org.springframework.ide.vscode.commons.util.Renderable;
import org.springframework.ide.vscode.commons.util.Renderables;
import org.springframework.ide.vscode.commons.util.ValueParser;
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;
@@ -27,6 +28,7 @@ import org.springframework.ide.vscode.commons.yaml.schema.YTypeFactory.YTypedPro
import org.springframework.ide.vscode.commons.yaml.schema.YTypeUtil;
import org.springframework.ide.vscode.commons.yaml.schema.YTypedProperty;
import org.springframework.ide.vscode.commons.yaml.schema.YamlSchema;
import org.springframework.ide.vscode.commons.yaml.schema.constraints.Constraints;
import com.google.common.collect.ImmutableSet;
@@ -102,6 +104,10 @@ public class BoshDeploymentManifestSchema implements YamlSchema {
YAtomicType t_ip_address = f.yatomic("IPAddress"); //TODO: some kind of checking?
t_ip_address.parseWith(ValueParsers.NE_STRING);
YAtomicType t_url = f.yatomic("URL"); //TODO: some kind of checking?
t_url.parseWith(ValueParsers.NE_STRING);
YAtomicType t_network_name = f.yatomic("NetworkName"); //TODO: resolve from 'cloud config' https://www.pivotaltracker.com/story/show/148712155
t_network_name.parseWith(ValueParsers.NE_STRING);
@@ -136,8 +142,15 @@ public class BoshDeploymentManifestSchema implements YamlSchema {
YBeanType t_release = f.ybean("Release");
addProp(t_release, "name", t_ne_string).isPrimary(true);
addProp(t_release, "version", t_version).isRequired(true);
addProp(t_release, "version", t_version).isRequired(true); //TODO: Is it really required? Maybe not id we use url + sha
//See: https://github.com/cloudfoundry/docs-bosh/issues/330
addProp(t_release, "url", t_url);
addProp(t_release, "sha1", t_ne_string);
addProp(v2Schema, "releases", f.yseq(t_release)).isRequired(true);
//TODO: these extra checks disabled because we aren't sure they are valid
// See: https://github.com/cloudfoundry/docs-bosh/issues/330
// t_release.require(Constraints.requireOneOf("url", "version"));
// t_release.require(Constraints.mutuallyExclusive("version", "sha1"));
YBeanType t_stemcell = f.ybean("Stemcell");
addProp(t_stemcell, "alias", t_ne_string).isRequired(true);

View File

@@ -0,0 +1 @@
The SHA1 of the release tarball. SHA1 is only required when using HTTP(s) URLs.

View File

@@ -0,0 +1 @@
URL of the release to use. URL may use the file protocol (`file://`) or HTTP(s) (`http(s)://`). File URLs can be absolute or relative to the current directory of `bosh-init` execution.

View File

@@ -115,7 +115,7 @@ 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.
//@Ignore //For now... because not passing yet.
@Test public void reconcileCfManifest() throws Exception {
Editor editor = harness.newEditorFromClasspath("/workspace/cf-deployment-manifest.yml");
editor.assertProblems(/*NONE*/);
@@ -219,6 +219,14 @@ public class BoshEditorTest {
" <*>"
);
editor.assertCompletions(PLAIN_COMPLETION,
"releases:\n" +
"- name: foo\n" +
" sha1: <*>"
, // ============
"releases:\n" +
"- name: foo\n" +
" url: <*>"
, // ============
"releases:\n" +
"- name: foo\n" +
" version: <*>"
@@ -230,6 +238,8 @@ public class BoshEditorTest {
"releases:\n" +
"- name: some-release\n" +
" version: some-version\n" +
" url: https://my.releases.com/funky.tar.gz\n" +
" sha1: 440248a31253296b1626ad52886e58900730f32e\n" +
" woot: dunno\n"
);
editor.ignoreProblem(YamlSchemaProblems.MISSING_PROPERTY);
@@ -239,6 +249,8 @@ public class BoshEditorTest {
editor.assertHoverContains("name", "Name of a release used in the deployment");
editor.assertHoverContains("version", "The version of the release to use");
editor.assertHoverContains("url", "URL of the release to use");
editor.assertHoverContains("sha1", "The SHA1 of the release tarball");
editor = harness.newEditor(
"releases:\n" +

View File

@@ -114,7 +114,7 @@ public class YamlSchemaProblems {
return new ReconcileProblemImpl(problemType, msg, start, end-start);
}
public static ReconcileProblemImpl missingProperty(String msg, IDocument doc, Node parent, MappingNode map) {
public static ReconcileProblemImpl missingProperty(String msg, IDocument doc, Node parent, Node map) {
DocumentRegion underline = NodeUtil.region(doc, map);
if (parent instanceof MappingNode) {
for (NodeTuple prop : ((MappingNode) parent).getValue()) {

View File

@@ -11,10 +11,12 @@
package org.springframework.ide.vscode.commons.yaml.schema.constraints;
import static org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaProblems.EXTRA_PROPERTY;
import static org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaProblems.missingProperty;
import static org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaProblems.*;
import static org.springframework.ide.vscode.commons.yaml.reconcile.YamlSchemaProblems.problem;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Function;
@@ -39,7 +41,7 @@ import com.google.common.collect.ImmutableSet;
* @author Kris De Volder
*/
public class Constraints {
public static Constraint requireOneOf(String... properties) {
return new RequireOneOf(properties);
}
@@ -122,4 +124,24 @@ public class Constraints {
dispatcher.withContext(dc).verify(dc, parent, node, type, problems);
};
}
public static Constraint mutuallyExclusive(String p1, String p2) {
return (DynamicSchemaContext dc, Node parent, Node node, YType type, IProblemCollector problems) -> {
if (node instanceof MappingNode) {
MappingNode map = (MappingNode) node;
Set<String> defined = dc.getDefinedProperties();
if (defined.contains(p1) && defined.contains(p2)) {
for (NodeTuple tup : map.getValue()) {
Node keyNode = tup.getKeyNode();
String key = NodeUtil.asScalar(keyNode);
if (p1.equals(key) || p1.equals(key)) {
problems.accept(problem(EXTRA_PROPERTY,
"Only one of '"+p1+"' and '"+p2+"' should be defined for '"+type+"'", keyNode
));
}
}
}
}
};
}
}