diff options
author | Harald Musum <musum@yahooinc.com> | 2022-02-28 12:19:03 +0100 |
---|---|---|
committer | Harald Musum <musum@yahooinc.com> | 2022-02-28 12:19:03 +0100 |
commit | 785bf04d460a1eee91c08c1a1866391cbec12fb5 (patch) | |
tree | edff7ff344ed05f204c50ecc4847c85c0fc02e37 | |
parent | 1af7b7470742445943fa2870fc0bd80666143f04 (diff) |
Support architecture in node repository
* Persist architecture for nodes
* Use architecture when talking to node repo
7 files changed, 65 insertions, 10 deletions
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java b/config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java index 75a8523d763..a0de085ef96 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java @@ -6,9 +6,6 @@ import com.yahoo.config.provisioning.FlavorsConfig; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Optional; @@ -63,4 +60,9 @@ public class NodeFlavors { return config.flavor().stream().map(Flavor::new).collect(Collectors.toList()); } + @Override + public String toString() { + return String.join(",", configuredFlavors.keySet()); + } + } diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java index b99a3bb84d7..a524243e2fb 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java @@ -201,7 +201,8 @@ public class RealNodeRepository implements NodeRepository { nodeResources.diskGb, nodeResources.bandwidthGbps, diskSpeedFromString(nodeResources.diskSpeed), - storageTypeFromString(nodeResources.storageType)); + storageTypeFromString(nodeResources.storageType), + architectureFromString(nodeResources.architecture)); } private static NodeResources.DiskSpeed diskSpeedFromString(String diskSpeed) { @@ -224,6 +225,16 @@ public class RealNodeRepository implements NodeRepository { } } + private static NodeResources.Architecture architectureFromString(String architecture) { + if (architecture == null) return NodeResources.Architecture.getDefault(); + switch (architecture) { + case "arm64": return NodeResources.Architecture.arm64; + case "x86_64": return NodeResources.Architecture.x86_64; + case "any": return NodeResources.Architecture.any; + default: throw new IllegalArgumentException("Unknown architecture '" + architecture + "'"); + } + } + private static String toString(NodeResources.DiskSpeed diskSpeed) { switch (diskSpeed) { case fast : return "fast"; @@ -242,6 +253,15 @@ public class RealNodeRepository implements NodeRepository { } } + private static String toString(NodeResources.Architecture architecture) { + switch (architecture) { + case arm64 : return "arm64"; + case x86_64 : return "x86_64"; + case any : return "any"; + default: throw new IllegalArgumentException("Unknown architecture '" + architecture.name() + "'"); + } + } + private static NodeRepositoryNode nodeRepositoryNodeFromAddNode(AddNode addNode) { NodeRepositoryNode node = new NodeRepositoryNode(); node.id = addNode.id; @@ -260,6 +280,7 @@ public class RealNodeRepository implements NodeRepository { node.resources.bandwidthGbps = resources.bandwidthGbps(); node.resources.diskSpeed = toString(resources.diskSpeed()); node.resources.storageType = toString(resources.storageType()); + node.resources.architecture = toString(resources.architecture()); }); node.type = addNode.nodeType.name(); node.ipAddresses = addNode.ipAddresses; diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/NodeRepositoryNode.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/NodeRepositoryNode.java index f99fb3d8b76..726ca391c8f 100644 --- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/NodeRepositoryNode.java +++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/NodeRepositoryNode.java @@ -191,6 +191,8 @@ public class NodeRepositoryNode { public String diskSpeed; @JsonProperty public String storageType; + @JsonProperty + public String architecture; @Override public String toString() { @@ -201,6 +203,7 @@ public class NodeRepositoryNode { ", bandwidthGbps=" + bandwidthGbps + ", diskSpeed='" + diskSpeed + '\'' + ", storageType='" + storageType + '\'' + + ", architecture='" + architecture + '\'' + '}'; } } diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepositoryTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepositoryTest.java index 3256b16a6c5..3f07a8f5c90 100644 --- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepositoryTest.java +++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepositoryTest.java @@ -178,6 +178,7 @@ public class RealNodeRepositoryTest { assertEquals("default", hostSpec.flavor()); assertEquals(123, hostSpec.diskGb(), 0); assertEquals(NodeType.confighost, hostSpec.type()); + assertEquals(NodeResources.Architecture.x86_64, hostSpec.resources().architecture()); NodeSpec nodeSpec = nodeRepositoryApi.getOptionalNode("host123-1.domain.tld").orElseThrow(); assertEquals(nodeResources, nodeSpec.resources()); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeResourcesSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeResourcesSerializer.java index 1c3d3f5c489..f7be2b510c7 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeResourcesSerializer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeResourcesSerializer.java @@ -18,6 +18,7 @@ public class NodeResourcesSerializer { private static final String bandwidthKey = "bandwidth"; private static final String diskSpeedKey = "diskSpeed"; private static final String storageTypeKey = "storageType"; + private static final String architectureKey = "architecture"; static void toSlime(NodeResources resources, Cursor resourcesObject) { if (resources.isUnspecified()) return; @@ -27,6 +28,7 @@ public class NodeResourcesSerializer { resourcesObject.setDouble(bandwidthKey, resources.bandwidthGbps()); resourcesObject.setString(diskSpeedKey, diskSpeedToString(resources.diskSpeed())); resourcesObject.setString(storageTypeKey, storageTypeToString(resources.storageType())); + resourcesObject.setString(architectureKey, architectureToString(resources.architecture())); } static NodeResources resourcesFromSlime(Inspector resources) { @@ -36,7 +38,8 @@ public class NodeResourcesSerializer { resources.field(diskKey).asDouble(), resources.field(bandwidthKey).asDouble(), diskSpeedFromSlime(resources.field(diskSpeedKey)), - storageTypeFromSlime(resources.field(storageTypeKey))); + storageTypeFromSlime(resources.field(storageTypeKey)), + architectureFromSlime(resources.field(architectureKey))); } static Optional<NodeResources> optionalResourcesFromSlime(Inspector resources) { @@ -62,7 +65,6 @@ public class NodeResourcesSerializer { } private static NodeResources.StorageType storageTypeFromSlime(Inspector storageType) { - if ( ! storageType.valid()) return NodeResources.StorageType.getDefault(); // TODO: Remove this line after December 2019 switch (storageType.asString()) { case "remote" : return NodeResources.StorageType.remote; case "local" : return NodeResources.StorageType.local; @@ -80,4 +82,23 @@ public class NodeResourcesSerializer { } } + private static NodeResources.Architecture architectureFromSlime(Inspector architecture) { + if ( ! architecture.valid()) return NodeResources.Architecture.getDefault(); // TODO: Remove this line after March 2022 + switch (architecture.asString()) { + case "arm64" : return NodeResources.Architecture.arm64; + case "x86_64" : return NodeResources.Architecture.x86_64; + case "any" : return NodeResources.Architecture.any; + default: throw new IllegalStateException("Illegal architecture value '" + architecture.asString() + "'"); + } + } + + private static String architectureToString(NodeResources.Architecture architecture) { + switch (architecture) { + case arm64 : return "arm64"; + case x86_64 : return "x86_64"; + case any : return "any"; + default: throw new IllegalStateException("Illegal architecture value '" + architecture + "'"); + } + } + } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java index 2994b21f56b..4567d596c35 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java @@ -82,6 +82,8 @@ public class FlavorConfigBuilder { flavorConfigBuilder.addFlavor(flavorName, 48, 128, 1000, 10, Flavor.Type.BARE_METAL); else if (flavorName.equals("devhost")) flavorConfigBuilder.addFlavor(flavorName, 4., 80., 100, 10, Flavor.Type.BARE_METAL); + else if (flavorName.equals("arm64")) + flavorConfigBuilder.addFlavor(flavorName,2., 30., 20., 3, Flavor.Type.BARE_METAL, Architecture.arm64); else flavorConfigBuilder.addFlavor(flavorName, 1., 30., 20., 3, Flavor.Type.BARE_METAL); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializerTest.java index 3de3f4139d1..cc121ba8104 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializerTest.java @@ -44,6 +44,9 @@ import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; +import static com.yahoo.config.provision.NodeResources.Architecture; +import static com.yahoo.config.provision.NodeResources.DiskSpeed; +import static com.yahoo.config.provision.NodeResources.StorageType; import static java.time.temporal.ChronoUnit.MILLIS; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -55,7 +58,7 @@ import static org.junit.Assert.assertTrue; */ public class NodeSerializerTest { - private final NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("default", "large", "ugccloud-container"); + private final NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("default", "large", "ugccloud-container", "arm64"); private final NodeSerializer nodeSerializer = new NodeSerializer(nodeFlavors, 1000); private final ManualClock clock = new ManualClock(); @@ -74,7 +77,8 @@ public class NodeSerializerTest { @Test public void reserved_node_serialization() { Node node = createNode(); - NodeResources requestedResources = new NodeResources(1.2, 3.4, 5.6, 7.8, NodeResources.DiskSpeed.any); + NodeResources requestedResources = new NodeResources(1.2, 3.4, 5.6, 7.8, + DiskSpeed.any, StorageType.any, Architecture.arm64); clock.advance(Duration.ofMinutes(3)); assertEquals(0, node.history().events().size()); @@ -87,7 +91,7 @@ public class NodeSerializerTest { assertEquals(1, node.history().events().size()); node = node.withRestart(new Generation(1, 2)); node = node.withReboot(new Generation(3, 4)); - node = node.with(FlavorConfigBuilder.createDummies("large").getFlavorOrThrow("large"), Agent.system, clock.instant()); + node = node.with(FlavorConfigBuilder.createDummies("arm64").getFlavorOrThrow("arm64"), Agent.system, clock.instant()); node = node.with(node.status().withVespaVersion(Version.fromString("1.2.3"))); node = node.with(node.status().withIncreasedFailCount().withIncreasedFailCount()); node = node.with(NodeType.tenant); @@ -100,7 +104,8 @@ public class NodeSerializerTest { assertEquals(2, copy.allocation().get().restartGeneration().current()); assertEquals(3, copy.status().reboot().wanted()); assertEquals(4, copy.status().reboot().current()); - assertEquals("large", copy.flavor().name()); + assertEquals("arm64", copy.flavor().name()); + assertEquals(Architecture.arm64.name(), copy.resources().architecture().name()); assertEquals("1.2.3", copy.status().vespaVersion().get().toString()); assertEquals(2, copy.status().failCount()); assertEquals(node.allocation().get().owner(), copy.allocation().get().owner()); |