summaryrefslogtreecommitdiffstats
path: root/config-provisioning
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@verizonmedia.com>2019-10-30 12:35:34 +0100
committerJon Bratseth <bratseth@verizonmedia.com>2019-10-30 12:35:34 +0100
commite06a6964a293de546dde991a98fb8b2426ca54e1 (patch)
tree0e59cebf8b16573c79d22355e5e5fcaf35d14411 /config-provisioning
parentdf12f4734894f1a5e37f97f9d8457f58b1481001 (diff)
Remember requested resources on nodes
This may be different from assigned resources e.g in that requested resources may specify DiskSpeed.any while assigned resources always have a definite disk speed.
Diffstat (limited to 'config-provisioning')
-rw-r--r--config-provisioning/abi-spec.json2
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/HostSpec.java20
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializer.java79
-rw-r--r--config-provisioning/src/test/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializerTest.java8
4 files changed, 64 insertions, 45 deletions
diff --git a/config-provisioning/abi-spec.json b/config-provisioning/abi-spec.json
index 4e50d31d74a..d8b17009b65 100644
--- a/config-provisioning/abi-spec.json
+++ b/config-provisioning/abi-spec.json
@@ -477,12 +477,14 @@
"public void <init>(java.lang.String, java.util.List, java.util.Optional, java.util.Optional)",
"public void <init>(java.lang.String, java.util.List, java.util.Optional, java.util.Optional, java.util.Optional)",
"public void <init>(java.lang.String, java.util.List, java.util.Optional, java.util.Optional, java.util.Optional, java.util.Optional)",
+ "public void <init>(java.lang.String, java.util.List, java.util.Optional, java.util.Optional, java.util.Optional, java.util.Optional, java.util.Optional)",
"public java.lang.String hostname()",
"public java.util.List aliases()",
"public java.util.Optional flavor()",
"public java.util.Optional version()",
"public java.util.Optional membership()",
"public java.util.Optional networkPorts()",
+ "public java.util.Optional requestedResources()",
"public java.lang.String toString()",
"public boolean equals(java.lang.Object)",
"public int hashCode()",
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/HostSpec.java b/config-provisioning/src/main/java/com/yahoo/config/provision/HostSpec.java
index ba7a3c2f06b..a046df1ac9a 100644
--- a/config-provisioning/src/main/java/com/yahoo/config/provision/HostSpec.java
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/HostSpec.java
@@ -29,6 +29,8 @@ public class HostSpec implements Comparable<HostSpec> {
private final Optional<NetworkPorts> networkPorts;
+ private Optional<NodeResources> requestedResources;
+
public HostSpec(String hostname, Optional<ClusterMembership> membership) {
this(hostname, new ArrayList<>(), Optional.empty(), membership);
}
@@ -61,15 +63,22 @@ public class HostSpec implements Comparable<HostSpec> {
public HostSpec(String hostname, List<String> aliases, Optional<Flavor> flavor,
Optional<ClusterMembership> membership, Optional<com.yahoo.component.Version> version,
Optional<NetworkPorts> networkPorts) {
+ this(hostname, aliases, flavor, membership, version, networkPorts, Optional.empty());
+ }
+
+ public HostSpec(String hostname, List<String> aliases, Optional<Flavor> flavor,
+ Optional<ClusterMembership> membership, Optional<com.yahoo.component.Version> version,
+ Optional<NetworkPorts> networkPorts, Optional<NodeResources> requestedResources) {
if (hostname == null || hostname.isEmpty()) throw new IllegalArgumentException("Hostname must be specified");
- Objects.requireNonNull(version, "Version cannot be null but can be empty");
- Objects.requireNonNull(networkPorts, "Network ports cannot be null but can be empty");
+
+
this.hostname = hostname;
this.aliases = List.copyOf(aliases);
this.flavor = flavor;
this.membership = membership;
- this.version = version;
- this.networkPorts = networkPorts;
+ this.version = Objects.requireNonNull(version, "Version cannot be null but can be empty");;
+ this.networkPorts = Objects.requireNonNull(networkPorts, "Network ports cannot be null but can be empty");;
+ this.requestedResources = Objects.requireNonNull(requestedResources, "RequestedResources cannot be null");
}
/** Returns the name identifying this host */
@@ -89,6 +98,9 @@ public class HostSpec implements Comparable<HostSpec> {
/** Returns the network port allocations on this host, or empty if not present */
public Optional<NetworkPorts> networkPorts() { return networkPorts; }
+ /** Returns the requested resources leading to this host being provisioned, or empty if not known */
+ public Optional<NodeResources> requestedResources() { return requestedResources; }
+
@Override
public String toString() {
return hostname +
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializer.java b/config-provisioning/src/main/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializer.java
index a7ba286baa7..4a060fb5143 100644
--- a/config-provisioning/src/main/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializer.java
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializer.java
@@ -49,6 +49,7 @@ public class AllocatedHostsSerializer {
private static final String flavorKey = "flavor";
private static final String resourcesKey = "resources";
+ private static final String requestedResourcesKey = "requestedResources";
private static final String vcpuKey = "vcpu";
private static final String memoryKey = "memory";
private static final String diskKey = "disk";
@@ -75,16 +76,17 @@ public class AllocatedHostsSerializer {
toSlime(host, array.addObject().setObject(hostSpecKey));
}
- private static void toSlime(HostSpec host, Cursor cursor) {
- cursor.setString(hostSpecHostNameKey, host.hostname());
- aliasesToSlime(host, cursor);
+ private static void toSlime(HostSpec host, Cursor object) {
+ object.setString(hostSpecHostNameKey, host.hostname());
+ aliasesToSlime(host, object);
host.membership().ifPresent(membership -> {
- cursor.setString(hostSpecMembershipKey, membership.stringValue());
- cursor.setString(hostSpecVespaVersionKey, membership.cluster().vespaVersion().toFullString());
+ object.setString(hostSpecMembershipKey, membership.stringValue());
+ object.setString(hostSpecVespaVersionKey, membership.cluster().vespaVersion().toFullString());
});
- host.flavor().ifPresent(flavor -> toSlime(flavor, cursor));
- host.version().ifPresent(version -> cursor.setString(hostSpecCurrentVespaVersionKey, version.toFullString()));
- host.networkPorts().ifPresent(ports -> NetworkPortsSerializer.toSlime(ports, cursor.setArray(hostSpecNetworkPortsKey)));
+ host.flavor().ifPresent(flavor -> toSlime(flavor, object));
+ host.requestedResources().ifPresent(resources -> toSlime(resources, object.setObject(requestedResourcesKey)));
+ host.version().ifPresent(version -> object.setString(hostSpecCurrentVespaVersionKey, version.toFullString()));
+ host.networkPorts().ifPresent(ports -> NetworkPortsSerializer.toSlime(ports, object.setArray(hostSpecNetworkPortsKey)));
}
private static void aliasesToSlime(HostSpec spec, Cursor cursor) {
@@ -95,20 +97,19 @@ public class AllocatedHostsSerializer {
}
private static void toSlime(Flavor flavor, Cursor object) {
- if (flavor.isConfigured()) {
+ if (flavor.isConfigured())
object.setString(flavorKey, flavor.name());
- }
- else {
- NodeResources resources = flavor.resources();
- Cursor resourcesObject = object.setObject(resourcesKey);
- resourcesObject.setDouble(vcpuKey, resources.vcpu());
- resourcesObject.setDouble(memoryKey, resources.memoryGb());
- resourcesObject.setDouble(diskKey, resources.diskGb());
- resourcesObject.setDouble(bandwidthKey, resources.bandwidthGbps());
- resourcesObject.setString(diskSpeedKey, diskSpeedToString(resources.diskSpeed()));
- }
+ else
+ toSlime(flavor.resources(), object.setObject(resourcesKey));
}
+ private static void toSlime(NodeResources resources, Cursor resourcesObject) {
+ resourcesObject.setDouble(vcpuKey, resources.vcpu());
+ resourcesObject.setDouble(memoryKey, resources.memoryGb());
+ resourcesObject.setDouble(diskKey, resources.diskGb());
+ resourcesObject.setDouble(bandwidthKey, resources.bandwidthGbps());
+ resourcesObject.setString(diskSpeedKey, diskSpeedToString(resources.diskSpeed()));
+ }
public static AllocatedHosts fromJson(byte[] json, Optional<NodeFlavors> nodeFlavors) {
return fromSlime(SlimeUtils.jsonToSlime(json).get(), nodeFlavors);
@@ -122,14 +123,13 @@ public class AllocatedHostsSerializer {
}
private static HostSpec hostFromSlime(Inspector object, Optional<NodeFlavors> nodeFlavors) {
- Optional<ClusterMembership> membership =
- object.field(hostSpecMembershipKey).valid() ? Optional.of(membershipFromSlime(object)) : Optional.empty();
- Optional<Flavor> flavor = flavorFromSlime(object, nodeFlavors);
- Optional<com.yahoo.component.Version> version =
- optionalString(object.field(hostSpecCurrentVespaVersionKey)).map(com.yahoo.component.Version::new);
- Optional<NetworkPorts> networkPorts =
- NetworkPortsSerializer.fromSlime(object.field(hostSpecNetworkPortsKey));
- return new HostSpec(object.field(hostSpecHostNameKey).asString(), aliasesFromSlime(object), flavor, membership, version, networkPorts);
+ return new HostSpec(object.field(hostSpecHostNameKey).asString(),
+ aliasesFromSlime(object),
+ flavorFromSlime(object, nodeFlavors),
+ object.field(hostSpecMembershipKey).valid() ? Optional.of(membershipFromSlime(object)) : Optional.empty(),
+ optionalString(object.field(hostSpecCurrentVespaVersionKey)).map(com.yahoo.component.Version::new),
+ NetworkPortsSerializer.fromSlime(object.field(hostSpecNetworkPortsKey)),
+ nodeResourcesFromSlime(object.field(requestedResourcesKey)));
}
private static List<String> aliasesFromSlime(Inspector object) {
@@ -140,20 +140,19 @@ public class AllocatedHostsSerializer {
}
private static Optional<Flavor> flavorFromSlime(Inspector object, Optional<NodeFlavors> nodeFlavors) {
- if (object.field(flavorKey).valid() && nodeFlavors.isPresent() && nodeFlavors.get().exists(object.field(flavorKey).asString())) {
+ if (object.field(flavorKey).valid() && nodeFlavors.isPresent() && nodeFlavors.get().exists(object.field(flavorKey).asString()))
return nodeFlavors.get().getFlavor(object.field(flavorKey).asString());
- }
- else if (object.field(resourcesKey).valid()) {
- Inspector resources = object.field(resourcesKey);
- return Optional.of(new Flavor(new NodeResources(resources.field(vcpuKey).asDouble(),
- resources.field(memoryKey).asDouble(),
- resources.field(diskKey).asDouble(),
- resources.field(bandwidthKey).asDouble(),
- diskSpeedFromSlime(resources.field(diskSpeedKey)))));
- }
- else {
- return Optional.empty();
- }
+ else
+ return nodeResourcesFromSlime(object.field(resourcesKey)).map(resources -> new Flavor(resources));
+ }
+
+ private static Optional<NodeResources> nodeResourcesFromSlime(Inspector resources) {
+ if ( ! resources.valid()) return Optional.empty();
+ return Optional.of(new NodeResources(resources.field(vcpuKey).asDouble(),
+ resources.field(memoryKey).asDouble(),
+ resources.field(diskKey).asDouble(),
+ resources.field(bandwidthKey).asDouble(),
+ diskSpeedFromSlime(resources.field(diskSpeedKey))));
}
private static NodeResources.DiskSpeed diskSpeedFromSlime(Inspector diskSpeed) {
diff --git a/config-provisioning/src/test/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializerTest.java b/config-provisioning/src/test/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializerTest.java
index a5af9aa0cb5..afec242de0b 100644
--- a/config-provisioning/src/test/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializerTest.java
+++ b/config-provisioning/src/test/java/com/yahoo/config/provision/serialization/AllocatedHostsSerializerTest.java
@@ -42,7 +42,12 @@ public class AllocatedHostsSerializerTest {
hosts.add(new HostSpec("flavor-from-resources-1",
Collections.emptyList(), new Flavor(new NodeResources(0.5, 3.1, 4, 1))));
hosts.add(new HostSpec("flavor-from-resources-2",
- Collections.emptyList(), new Flavor(new NodeResources(0.5, 3.1, 4, 1, NodeResources.DiskSpeed.any))));
+ Collections.emptyList(),
+ Optional.of(new Flavor(new NodeResources(0.5, 3.1, 4, 1, NodeResources.DiskSpeed.slow))),
+ Optional.empty(),
+ Optional.empty(),
+ Optional.empty(),
+ Optional.of(new NodeResources(0.5, 3.1, 4, 1, NodeResources.DiskSpeed.any))));
hosts.add(new HostSpec("configured-flavor",
Collections.emptyList(), configuredFlavors.getFlavorOrThrow("C/12/45/100")));
hosts.add(new HostSpec("with-version",
@@ -67,6 +72,7 @@ public class AllocatedHostsSerializerTest {
assertEquals(expectedHost.version(), deserializedHost.version());
assertEquals(expectedHost.networkPorts(), deserializedHost.networkPorts());
assertEquals(expectedHost.aliases(), deserializedHost.aliases());
+ assertEquals(expectedHost.requestedResources(), deserializedHost.requestedResources());
}
}