summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@yahooinc.com>2022-02-28 12:19:03 +0100
committerHarald Musum <musum@yahooinc.com>2022-02-28 12:19:03 +0100
commit785bf04d460a1eee91c08c1a1866391cbec12fb5 (patch)
treeedff7ff344ed05f204c50ecc4847c85c0fc02e37
parent1af7b7470742445943fa2870fc0bd80666143f04 (diff)
Support architecture in node repository
* Persist architecture for nodes * Use architecture when talking to node repo
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/NodeFlavors.java8
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java23
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/NodeRepositoryNode.java3
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepositoryTest.java1
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeResourcesSerializer.java25
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializerTest.java13
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());