diff options
author | Jon Bratseth <bratseth@verizonmedia.com> | 2019-10-30 12:35:34 +0100 |
---|---|---|
committer | Jon Bratseth <bratseth@verizonmedia.com> | 2019-10-30 12:35:34 +0100 |
commit | e06a6964a293de546dde991a98fb8b2426ca54e1 (patch) | |
tree | 0e59cebf8b16573c79d22355e5e5fcaf35d14411 /config-provisioning | |
parent | df12f4734894f1a5e37f97f9d8457f58b1481001 (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')
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()); } } |