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/src/main/java/com/yahoo/config | |
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/src/main/java/com/yahoo/config')
2 files changed, 55 insertions, 44 deletions
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) { |