diff options
8 files changed, 51 insertions, 32 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java index 8eab3b0082d..c29990b02e6 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/NodesSpecification.java @@ -1,6 +1,7 @@ // Copyright 2016 Yahoo Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.model.builder.xml.dom; +import com.yahoo.component.Version; import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.ClusterMembership; import com.yahoo.config.provision.ClusterSpec; @@ -25,31 +26,37 @@ public class NodesSpecification { private final int groups; + /** The Vespa version we want the nodes to run */ + private Version version; + /** * Whether the capacity amount specified is required or can it be relaxed * at the discretion of the component fulfilling it */ private final boolean required; - + + /** The flavor the nodes should have, or empty to use the default */ private final Optional<String> flavor; /** The identifier of the custom docker image layer to use (not supported yet) */ private final Optional<String> dockerImage; - private NodesSpecification(boolean dedicated, int count, int groups, boolean required, + private NodesSpecification(boolean dedicated, int count, int groups, Version version, boolean required, Optional<String> flavor, Optional<String> dockerImage) { this.dedicated = dedicated; this.count = count; this.groups = groups; + this.version = version; this.required = required; this.flavor = flavor; this.dockerImage = dockerImage; } - private NodesSpecification(boolean dedicated, ModelElement nodesElement) { + private NodesSpecification(boolean dedicated, Version version, ModelElement nodesElement) { this(dedicated, nodesElement.requiredIntegerAttribute("count"), nodesElement.getIntegerAttribute("groups", 1), + version, nodesElement.getBooleanAttribute("required", false), Optional.ofNullable(nodesElement.getStringAttribute("flavor")), Optional.ofNullable(nodesElement.getStringAttribute("docker-image"))); @@ -58,8 +65,8 @@ public class NodesSpecification { /** * Returns a requirement for dedicated nodes taken from the given <code>nodes</code> element */ - public static NodesSpecification from(ModelElement nodesElement) { - return new NodesSpecification(true, nodesElement); + public static NodesSpecification from(ModelElement nodesElement, Version version) { + return new NodesSpecification(true, version, nodesElement); } /** @@ -67,11 +74,11 @@ public class NodesSpecification { * contained in the given parent element, or empty if the parent element is null, or the nodes elements * is not present. */ - public static Optional<NodesSpecification> fromParent(ModelElement parentElement) { + public static Optional<NodesSpecification> fromParent(ModelElement parentElement, Version version) { if (parentElement == null) return Optional.empty(); ModelElement nodesElement = parentElement.getChild("nodes"); if (nodesElement == null) return Optional.empty(); - return Optional.of(from(nodesElement)); + return Optional.of(from(nodesElement, version)); } /** @@ -79,16 +86,16 @@ public class NodesSpecification { * contained in the given parent element, or empty if the parent element is null, or the nodes elements * is not present. */ - public static Optional<NodesSpecification> optionalDedicatedFromParent(ModelElement parentElement) { + public static Optional<NodesSpecification> optionalDedicatedFromParent(ModelElement parentElement, Version version) { if (parentElement == null) return Optional.empty(); ModelElement nodesElement = parentElement.getChild("nodes"); if (nodesElement == null) return Optional.empty(); - return Optional.of(new NodesSpecification(nodesElement.getBooleanAttribute("dedicated", false), nodesElement)); + return Optional.of(new NodesSpecification(nodesElement.getBooleanAttribute("dedicated", false), version, nodesElement)); } /** Returns a requirement from <code>count</code> nondedicated nodes in one group */ - public static NodesSpecification nonDedicated(int count) { - return new NodesSpecification(false, count, 1, false, Optional.empty(), Optional.empty()); + public static NodesSpecification nonDedicated(int count, Version version) { + return new NodesSpecification(false, count, 1, version, false, Optional.empty(), Optional.empty()); } /** @@ -104,7 +111,7 @@ public class NodesSpecification { public int groups() { return groups; } public Map<HostResource, ClusterMembership> provision(HostSystem hostSystem, ClusterSpec.Type clusterType, ClusterSpec.Id clusterId, DeployLogger logger) { - ClusterSpec cluster = ClusterSpec.request(clusterType, clusterId, dockerImage); + ClusterSpec cluster = ClusterSpec.request(clusterType, clusterId, version, dockerImage); return hostSystem.allocateHosts(cluster, Capacity.fromNodeCount(count, flavor, required), groups, logger); } diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterSpec.java b/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterSpec.java index 07b120bed73..ec655f0eee2 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterSpec.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/ClusterSpec.java @@ -19,9 +19,9 @@ public final class ClusterSpec { /** The group id of these hosts, or empty if this is represents a request for hosts */ private final Optional<Group> groupId; - private final Optional<Version> vespaVersion; + private final Version vespaVersion; - private ClusterSpec(Type type, Id id, Optional<Group> groupId, Optional<Version> vespaVersion) { + private ClusterSpec(Type type, Id id, Optional<Group> groupId, Version vespaVersion) { this.type = type; this.id = id; this.groupId = groupId; @@ -34,10 +34,10 @@ public final class ClusterSpec { /** Returns the cluster id */ public Id id() { return id; } - public Optional<Version> vespaVersion() { return vespaVersion; } + public Version vespaVersion() { return vespaVersion; } - public Optional<String> dockerImage() { - return vespaVersion.map(DockerImage.defaultImage::withTag).map(DockerImage::toString); + public String dockerImage() { + return DockerImage.defaultImage.withTag(vespaVersion).toString(); } /** Returns the group within the cluster this specifies, or empty to specify the whole cluster */ @@ -53,20 +53,35 @@ public final class ClusterSpec { } /** Create a specification <b>requesting</b> a cluster with these attributes */ + // TODO: April 2017 - Remove this when no version older than 6.97 is used anywhere public static ClusterSpec requestVersion(Type type, Id id, Optional<Version> vespaVersion) { + return new ClusterSpec(type, id, Optional.empty(), vespaVersion.get()); + } + + public static ClusterSpec request(Type type, Id id, Version vespaVersion) { return new ClusterSpec(type, id, Optional.empty(), vespaVersion); } /** Create a specification <b>specifying</b> an existing cluster group having these attributes */ + // TODO: April 2017 - Remove this when no version older than 6.97 is used anywhere public static ClusterSpec from(Type type, Id id, Group groupId, Optional<Version> vespaVersion) { + return new ClusterSpec(type, id, Optional.of(groupId), vespaVersion.get()); + } + + /** Create a specification <b>specifying</b> an existing cluster group having these attributes */ + // TODO: April 2017 - Remove this when no version older than 6.97 is used anywhere + public static ClusterSpec from(Type type, Id id, Group groupId, Version vespaVersion) { return new ClusterSpec(type, id, Optional.of(groupId), vespaVersion); } + neste: - sørg for at ingen bruker deprecateds over + - gå tilbake til NodeSpecification og sørg for at version sendes inn der fra ModelContext + @Override public String toString() { return String.join(" ", type.toString(), id.toString(), groupId.map(Group::toString).orElse(""), - vespaVersion.orElse(Version.emptyVersion).toString()); + vespaVersion.toString()); } @Override diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java b/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java index c5ccb7d2f58..cc7d871d23f 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/ProvisionInfo.java @@ -9,7 +9,6 @@ import com.yahoo.vespa.config.SlimeUtils; import java.io.IOException; import java.util.*; -import java.util.logging.Logger; /** * Information about provisioned hosts, and (de)serialization (from)to JSON. @@ -48,8 +47,7 @@ public class ProvisionInfo { cursor.setString(hostSpecHostName, host.hostname()); if (host.membership().isPresent()) { cursor.setString(hostSpecMembership, host.membership().get().stringValue()); - if (host.membership().get().cluster().dockerImage().isPresent()) - cursor.setString(dockerImage, host.membership().get().cluster().dockerImage().get()); + cursor.setString(dockerImage, host.membership().get().cluster().dockerImage()); } if (host.flavor().isPresent()) cursor.setString(hostSpecFlavor, host.flavor().get().name()); diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/ProvisionInfoTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/ProvisionInfoTest.java index a6ccdb8536f..2538d687c1d 100644 --- a/config-provisioning/src/test/java/com/yahoo/config/provision/ProvisionInfoTest.java +++ b/config-provisioning/src/test/java/com/yahoo/config/provision/ProvisionInfoTest.java @@ -57,7 +57,7 @@ public class ProvisionInfoTest { assertTrue(serializedInfo.getHosts().contains(h4)); assertTrue(!getHost(h1.hostname(), serializedInfo.getHosts()).membership().isPresent()); assertEquals("container/test/0", getHost(h3.hostname(), serializedInfo.getHosts()).membership().get().stringValue()); - assertEquals("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.1", getHost(h4.hostname(), serializedInfo.getHosts()).membership().get().cluster().dockerImage().get()); + assertEquals("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.1", getHost(h4.hostname(), serializedInfo.getHosts()).membership().get().cluster().dockerImage()); } private HostSpec getHost(String hostname, Set<HostSpec> hosts) { diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/HostedDeployTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/HostedDeployTest.java index a6ad3aff6a2..22db3a6e1c2 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/HostedDeployTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/HostedDeployTest.java @@ -97,7 +97,7 @@ public class HostedDeployTest { private void assertProvisionInfo(String vespaVersion, DeployTester tester, ApplicationId applicationId) { tester.getProvisionInfoFromDeployedApp(applicationId).getHosts().stream() .forEach(h -> assertEquals(dockerRegistry + dockerVespaBaseImage + ":" + vespaVersion, - h.membership().get().cluster().dockerImage().get())); + h.membership().get().cluster().dockerImage())); } private static ConfigserverConfig createConfigserverConfig() { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java index 7f13ff1a13c..c91548f9ca7 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java @@ -125,8 +125,7 @@ public class NodeSerializer { object.setLong(restartGenerationKey, allocation.restartGeneration().wanted()); object.setLong(currentRestartGenerationKey, allocation.restartGeneration().current()); object.setBool(removableKey, allocation.isRemovable()); - allocation.membership().cluster().vespaVersion() - .ifPresent(version -> object.setString(wantedVespaVersionKey, version.toString())); + object.setString(wantedVespaVersionKey, allocation.membership().cluster().vespaVersion().toString()); } private void toSlime(History history, Cursor array) { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java index 2766a219931..0ac82f1dbd8 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java @@ -156,8 +156,8 @@ class NodesResponse extends HttpResponse { toSlime(node.allocation().get().membership(), object.setObject("membership")); object.setLong("restartGeneration", node.allocation().get().restartGeneration().wanted()); object.setLong("currentRestartGeneration", node.allocation().get().restartGeneration().current()); - node.allocation().get().membership().cluster().dockerImage().ifPresent(image -> object.setString("wantedDockerImage", image)); - node.allocation().get().membership().cluster().vespaVersion().ifPresent(version -> object.setString("wantedVespaVersion", version.toFullString())); + object.setString("wantedDockerImage", node.allocation().get().membership().cluster().dockerImage()); + object.setString("wantedVespaVersion", node.allocation().get().membership().cluster().vespaVersion().toFullString()); } object.setLong("rebootGeneration", node.status().reboot().wanted()); object.setLong("currentRebootGeneration", node.status().reboot().current()); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java index 97610e17b45..3d38adca4d3 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java @@ -230,7 +230,7 @@ public class SerializationTest { false)); Node deserializedNode = nodeSerializer.fromJson(State.provisioned, nodeSerializer.toJson(nodeWithAllocation)); - assertEquals("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.0", deserializedNode.allocation().get().membership().cluster().dockerImage().get()); + assertEquals("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.0", deserializedNode.allocation().get().membership().cluster().dockerImage()); } @Test @@ -279,8 +279,8 @@ public class SerializationTest { " }\n" + "}"; Node node = nodeSerializer.fromJson(State.active, Utf8.toBytes(nodeWithDockerImage)); - assertEquals("6.42.1", node.allocation().get().membership().cluster().vespaVersion().get().toString()); - assertEquals("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.1", node.allocation().get().membership().cluster().dockerImage().get()); + assertEquals("6.42.1", node.allocation().get().membership().cluster().vespaVersion().toString()); + assertEquals("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.1", node.allocation().get().membership().cluster().dockerImage()); String nodeWithWantedVespaVersion = "{\n" + @@ -295,8 +295,8 @@ public class SerializationTest { " }\n" + "}"; node = nodeSerializer.fromJson(State.active, Utf8.toBytes(nodeWithWantedVespaVersion)); - assertEquals("6.42.2", node.allocation().get().membership().cluster().vespaVersion().get().toString()); - assertEquals("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.2", node.allocation().get().membership().cluster().dockerImage().get()); + assertEquals("6.42.2", node.allocation().get().membership().cluster().vespaVersion().toString()); + assertEquals("docker-registry.ops.yahoo.com:4443/vespa/ci:6.42.2", node.allocation().get().membership().cluster().dockerImage()); } @Test |