summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2019-08-22 06:26:46 +0200
committerGitHub <noreply@github.com>2019-08-22 06:26:46 +0200
commit3b9047f5113146ff578ac4eea19d1ec5796fcac8 (patch)
treedbc1eea0119b174945a31c79345503e354e38aaf
parent55e093baadde8f245dc06e5c98fd0b85e6577cd5 (diff)
parent55bc1a0dbda018c69337f33436d93124aca24e52 (diff)
Merge pull request #10360 from vespa-engine/freva/add-host-resources
Add flavor overrides
-rw-r--r--athenz-identity-provider-service/src/test/java/com/yahoo/vespa/hosted/athenz/instanceproviderservice/identitydocument/IdentityDocumentGeneratorTest.java12
-rw-r--r--athenz-identity-provider-service/src/test/java/com/yahoo/vespa/hosted/athenz/instanceproviderservice/instanceconfirmation/InstanceValidatorTest.java5
-rw-r--r--config-provisioning/abi-spec.json2
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/Flavor.java71
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/host/FlavorOverrides.java47
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/host/package-info.java5
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java10
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java6
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java13
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java4
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisionedHost.java5
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java4
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java36
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/CapacityCheckerTester.java6
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java14
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/node/IPTest.java3
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java19
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacityTest.java42
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java3
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java3
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizerTest.java9
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java2
22 files changed, 208 insertions, 113 deletions
diff --git a/athenz-identity-provider-service/src/test/java/com/yahoo/vespa/hosted/athenz/instanceproviderservice/identitydocument/IdentityDocumentGeneratorTest.java b/athenz-identity-provider-service/src/test/java/com/yahoo/vespa/hosted/athenz/instanceproviderservice/identitydocument/IdentityDocumentGeneratorTest.java
index f496b177bdd..92ba8f0edfb 100644
--- a/athenz-identity-provider-service/src/test/java/com/yahoo/vespa/hosted/athenz/instanceproviderservice/identitydocument/IdentityDocumentGeneratorTest.java
+++ b/athenz-identity-provider-service/src/test/java/com/yahoo/vespa/hosted/athenz/instanceproviderservice/identitydocument/IdentityDocumentGeneratorTest.java
@@ -1,8 +1,6 @@
// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.athenz.instanceproviderservice.identitydocument;
-
-import com.google.common.collect.ImmutableSet;
import com.yahoo.component.Version;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ApplicationName;
@@ -24,12 +22,14 @@ import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeRepository;
import com.yahoo.vespa.hosted.provision.node.Allocation;
import com.yahoo.vespa.hosted.provision.node.Generation;
+import com.yahoo.vespa.hosted.provision.node.IP;
import com.yahoo.vespa.hosted.provision.testutils.MockNodeFlavors;
import org.hamcrest.Matchers;
import org.junit.Test;
import java.util.HashSet;
import java.util.Optional;
+import java.util.Set;
import static com.yahoo.vespa.hosted.athenz.instanceproviderservice.TestUtils.getAthenzProviderConfig;
import static org.junit.Assert.assertEquals;
@@ -58,17 +58,15 @@ public class IdentityDocumentGeneratorTest {
Generation.initial(),
false);
Node parentNode = Node.create("ostkid",
- ImmutableSet.of("127.0.0.1"),
- new HashSet<>(),
+ new IP.Config(Set.of("127.0.0.1"), Set.of()),
parentHostname,
Optional.empty(),
Optional.empty(),
new MockNodeFlavors().getFlavorOrThrow("default"),
NodeType.host);
- Node containerNode = Node.createDockerNode(ImmutableSet.of("::1"),
- new HashSet<>(),
+ Node containerNode = Node.createDockerNode(Set.of("::1"),
containerHostname,
- Optional.of(parentHostname),
+ parentHostname,
new MockNodeFlavors().getFlavorOrThrow("default").resources(),
NodeType.tenant)
.with(allocation);
diff --git a/athenz-identity-provider-service/src/test/java/com/yahoo/vespa/hosted/athenz/instanceproviderservice/instanceconfirmation/InstanceValidatorTest.java b/athenz-identity-provider-service/src/test/java/com/yahoo/vespa/hosted/athenz/instanceproviderservice/instanceconfirmation/InstanceValidatorTest.java
index c1962eac97e..d5787516254 100644
--- a/athenz-identity-provider-service/src/test/java/com/yahoo/vespa/hosted/athenz/instanceproviderservice/instanceconfirmation/InstanceValidatorTest.java
+++ b/athenz-identity-provider-service/src/test/java/com/yahoo/vespa/hosted/athenz/instanceproviderservice/instanceconfirmation/InstanceValidatorTest.java
@@ -2,7 +2,6 @@
package com.yahoo.vespa.hosted.athenz.instanceproviderservice.instanceconfirmation;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableSet;
import com.yahoo.component.Version;
import com.yahoo.config.model.api.ApplicationInfo;
import com.yahoo.config.model.api.HostInfo;
@@ -22,6 +21,7 @@ import com.yahoo.vespa.athenz.identityprovider.client.IdentityDocumentSigner;
import com.yahoo.vespa.hosted.athenz.instanceproviderservice.KeyProvider;
import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeRepository;
+import com.yahoo.vespa.hosted.provision.node.IP;
import com.yahoo.vespa.hosted.provision.testutils.MockNodeFlavors;
import org.junit.Test;
@@ -32,6 +32,7 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
+import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
@@ -219,7 +220,7 @@ public class InstanceValidatorTest {
MockNodeFlavors flavors = new MockNodeFlavors();
List<Node> nodeList = new ArrayList<>();
for (int i = 0; i < num; i++) {
- Node node = Node.create("foo" + i, ImmutableSet.of("::1" + i, "::2" + i, "::3" + i), Collections.emptySet(), "foo" + i, Optional.empty(), Optional.empty(), flavors.getFlavorOrThrow("default"), NodeType.tenant);
+ Node node = Node.create("foo" + i, new IP.Config(Set.of("::1" + i, "::2" + i, "::3" + i), Set.of()), "foo" + i, Optional.empty(), Optional.empty(), flavors.getFlavorOrThrow("default"), NodeType.tenant);
nodeList.add(node);
}
return nodeList;
diff --git a/config-provisioning/abi-spec.json b/config-provisioning/abi-spec.json
index 4bf8a8b7152..ae34a75f3f4 100644
--- a/config-provisioning/abi-spec.json
+++ b/config-provisioning/abi-spec.json
@@ -389,11 +389,13 @@
"methods": [
"public void <init>(com.yahoo.config.provisioning.FlavorsConfig$Flavor)",
"public void <init>(com.yahoo.config.provision.NodeResources)",
+ "public com.yahoo.config.provision.Flavor withFlavorOverrides(com.yahoo.config.provision.host.FlavorOverrides)",
"public java.lang.String name()",
"public int cost()",
"public boolean isStock()",
"public boolean isConfigured()",
"public com.yahoo.config.provision.NodeResources resources()",
+ "public java.util.Optional flavorOverrides()",
"public double getMinMainMemoryAvailableGb()",
"public double getMinDiskAvailableGb()",
"public boolean hasFastDisk()",
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/Flavor.java b/config-provisioning/src/main/java/com/yahoo/config/provision/Flavor.java
index bf8e75ebebc..c2b2fc2cb20 100644
--- a/config-provisioning/src/main/java/com/yahoo/config/provision/Flavor.java
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/Flavor.java
@@ -1,11 +1,13 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.config.provision;
+import com.yahoo.config.provision.host.FlavorOverrides;
import com.yahoo.config.provisioning.FlavorsConfig;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
+import java.util.Optional;
/**
* A host or node flavor.
@@ -16,35 +18,59 @@ import java.util.Objects;
*/
public class Flavor {
- private boolean configured;
+ private final boolean configured;
private final String name;
private final int cost;
private final Type type;
/** The hardware resources of this flavor */
- private NodeResources resources;
+ private final NodeResources resources;
+
+ private final Optional<FlavorOverrides> flavorOverrides;
/** Creates a *host* flavor from configuration */
public Flavor(FlavorsConfig.Flavor flavorConfig) {
- this.configured = true;
- this.name = flavorConfig.name();
- this.cost = flavorConfig.cost();
- this.type = Type.valueOf(flavorConfig.environment());
- this.resources = new NodeResources(flavorConfig.minCpuCores(),
- flavorConfig.minMainMemoryAvailableGb(),
- flavorConfig.minDiskAvailableGb(),
- flavorConfig.bandwidth() / 1000,
- flavorConfig.fastDisk() ? NodeResources.DiskSpeed.fast : NodeResources.DiskSpeed.slow);
+ this(
+ flavorConfig.name(),
+ new NodeResources(flavorConfig.minCpuCores(),
+ flavorConfig.minMainMemoryAvailableGb(),
+ flavorConfig.minDiskAvailableGb(),
+ flavorConfig.bandwidth() / 1000,
+ flavorConfig.fastDisk() ? NodeResources.DiskSpeed.fast : NodeResources.DiskSpeed.slow),
+ Optional.empty(),
+ Type.valueOf(flavorConfig.environment()),
+ true,
+ flavorConfig.cost());
}
/** Creates a *node* flavor from a node resources spec */
public Flavor(NodeResources resources) {
- Objects.requireNonNull(resources, "Resources cannot be null");
- this.configured = false;
- this.name = resources.toString();
- this.cost = 0;
- this.type = Type.DOCKER_CONTAINER;
- this.resources = resources;
+ this(resources.toString(), resources, Optional.empty(), Type.DOCKER_CONTAINER, false, 0);
+ }
+
+ private Flavor(String name, NodeResources resources, Optional<FlavorOverrides> flavorOverrides, Type type, boolean configured, int cost) {
+ this.name = Objects.requireNonNull(name, "Name cannot be null");
+ this.resources = Objects.requireNonNull(resources, "Resources cannot be null");
+ this.flavorOverrides = Objects.requireNonNull(flavorOverrides, "Flavor overrides cannot be null");
+ this.type = Objects.requireNonNull(type, "Type cannot be null");
+ this.configured = configured;
+ this.cost = cost;
+ }
+
+ public Flavor withFlavorOverrides(FlavorOverrides flavorOverrides) {
+ if (type == Type.DOCKER_CONTAINER)
+ throw new IllegalArgumentException("Cannot override flavor for docker containers");
+
+ if (!configured)
+ throw new IllegalArgumentException("Cannot override non-configured flavor");
+
+ NodeResources newResources = new NodeResources(
+ resources.vcpu(),
+ resources.memoryGb(),
+ flavorOverrides.diskGb().orElseGet(resources::diskGb),
+ resources.bandwidthGbps(),
+ resources.diskSpeed());
+ return new Flavor(name, newResources, Optional.of(flavorOverrides), type, true, cost);
}
/** Returns the unique identity of this flavor if it is configured, or the resource spec string otherwise */
@@ -66,6 +92,10 @@ public class Flavor {
public NodeResources resources() { return resources; }
+ public Optional<FlavorOverrides> flavorOverrides() {
+ return flavorOverrides;
+ }
+
public double getMinMainMemoryAvailableGb() { return resources.memoryGb(); }
public double getMinDiskAvailableGb() { return resources.diskGb(); }
@@ -103,7 +133,7 @@ public class Flavor {
public void freeze() {}
@Override
- public int hashCode() { return name.hashCode(); }
+ public int hashCode() { return Objects.hash(name, flavorOverrides); }
@Override
public boolean equals(Object o) {
@@ -111,7 +141,8 @@ public class Flavor {
if ( ! (o instanceof Flavor)) return false;
Flavor other = (Flavor)o;
if (configured)
- return other.name.equals(this.name);
+ return Objects.equals(this.name, other.name) &&
+ Objects.equals(this.flavorOverrides, other.flavorOverrides);
else
return this.resources.equals(other.resources);
}
@@ -119,7 +150,7 @@ public class Flavor {
@Override
public String toString() {
if (isConfigured())
- return "flavor '" + name + "'";
+ return "flavor '" + name + "'" + flavorOverrides.map(o -> " with overrides: " + o).orElse("");
else
return name;
}
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/host/FlavorOverrides.java b/config-provisioning/src/main/java/com/yahoo/config/provision/host/FlavorOverrides.java
new file mode 100644
index 00000000000..8446c35cb0e
--- /dev/null
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/host/FlavorOverrides.java
@@ -0,0 +1,47 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.config.provision.host;
+
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * Overrides fields in a {@link com.yahoo.config.provision.Flavor}, e.g. when a flavor is not
+ * tied to a specific disk.
+ *
+ * @author freva
+ */
+public class FlavorOverrides {
+
+ private final Optional<Double> diskGb;
+
+ private FlavorOverrides(Optional<Double> diskGb) {
+ this.diskGb = diskGb;
+ }
+
+ public Optional<Double> diskGb() {
+ return diskGb;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ FlavorOverrides that = (FlavorOverrides) o;
+ return diskGb.equals(that.diskGb);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(diskGb);
+ }
+
+ @Override
+ public String toString() {
+ return "[" + diskGb.map(d -> "disk " + d + " Gb").orElse("") + "]";
+ }
+
+ public static FlavorOverrides ofDisk(double diskGb) {
+ return new FlavorOverrides(Optional.of(diskGb));
+ }
+
+}
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/host/package-info.java b/config-provisioning/src/main/java/com/yahoo/config/provision/host/package-info.java
new file mode 100644
index 00000000000..656096f865a
--- /dev/null
+++ b/config-provisioning/src/main/java/com/yahoo/config/provision/host/package-info.java
@@ -0,0 +1,5 @@
+// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+@ExportPackage
+package com.yahoo.config.provision.host;
+
+import com.yahoo.osgi.annotation.ExportPackage;
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java
index d83dea7007b..bdcb96c1861 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java
@@ -46,15 +46,15 @@ public final class Node {
/** The current allocation of this node, if any */
private final Optional<Allocation> allocation;
- /** Temporary method until we can merge it with the other create method */
- public static Node createDockerNode(Set<String> ipAddresses, Set<String> ipAddressPool, String hostname, Optional<String> parentHostname, NodeResources resources, NodeType type) {
- return new Node("fake-" + hostname, new IP.Config(ipAddresses, ipAddressPool), hostname, parentHostname, new Flavor(resources), Status.initial(), State.reserved,
+ /** Creates a node in the initial state (reserved) */
+ public static Node createDockerNode(Set<String> ipAddresses, String hostname, String parentHostname, NodeResources resources, NodeType type) {
+ return new Node("fake-" + hostname, new IP.Config(ipAddresses, Set.of()), hostname, Optional.of(parentHostname), new Flavor(resources), Status.initial(), State.reserved,
Optional.empty(), History.empty(), type, new Reports(), Optional.empty());
}
/** Creates a node in the initial state (provisioned) */
- public static Node create(String openStackId, Set<String> ipAddresses, Set<String> ipAddressPool, String hostname, Optional<String> parentHostname, Optional<String> modelName, Flavor flavor, NodeType type) {
- return new Node(openStackId, new IP.Config(ipAddresses, ipAddressPool), hostname, parentHostname, flavor, Status.initial(), State.provisioned,
+ public static Node create(String openStackId, IP.Config ipConfig, String hostname, Optional<String> parentHostname, Optional<String> modelName, Flavor flavor, NodeType type) {
+ return new Node(openStackId, ipConfig, hostname, parentHostname, flavor, Status.initial(), State.provisioned,
Optional.empty(), History.empty(), type, new Reports(), modelName);
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java
index 9b78f558a7a..fd7397168d5 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java
@@ -299,16 +299,16 @@ public class NodeRepository extends AbstractComponent {
/** Creates a new node object, without adding it to the node repo. If no IP address is given, it will be resolved */
public Node createNode(String openStackId, String hostname, IP.Config ipConfig, Optional<String> parentHostname,
- Optional<String> modelName, Flavor flavor, NodeType type) {
+ Flavor flavor, NodeType type) {
if (ipConfig.primary().isEmpty()) { // TODO: Remove this. Only test code hits this path
ipConfig = ipConfig.with(nameResolver.getAllByNameOrThrow(hostname));
}
- return Node.create(openStackId, ipConfig.primary(), ipConfig.pool().asSet(), hostname, parentHostname, modelName, flavor, type);
+ return Node.create(openStackId, ipConfig, hostname, parentHostname, Optional.empty(), flavor, type);
}
public Node createNode(String openStackId, String hostname, Optional<String> parentHostname, Flavor flavor,
NodeType type) {
- return createNode(openStackId, hostname, IP.Config.EMPTY, parentHostname, Optional.empty(), flavor, type);
+ return createNode(openStackId, hostname, IP.Config.EMPTY, parentHostname, flavor, type);
}
/** Adds a list of newly created docker container nodes to the node repository as <i>reserved</i> nodes */
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java
index 4f43b53c0e7..0346db3a4b7 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java
@@ -13,6 +13,7 @@ import com.yahoo.config.provision.NodeFlavors;
import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.NodeType;
import com.yahoo.config.provision.TenantName;
+import com.yahoo.config.provision.host.FlavorOverrides;
import com.yahoo.config.provision.serialization.NetworkPortsSerializer;
import com.yahoo.slime.ArrayTraverser;
import com.yahoo.slime.Cursor;
@@ -153,6 +154,10 @@ public class NodeSerializer {
private void toSlime(Flavor flavor, Cursor object) {
if (flavor.isConfigured()) {
object.setString(flavorKey, flavor.name());
+ if (flavor.flavorOverrides().isPresent()) {
+ Cursor resourcesObject = object.setObject(resourcesKey);
+ flavor.flavorOverrides().get().diskGb().ifPresent(diskGb -> resourcesObject.setDouble(diskKey, diskGb));
+ }
}
else {
NodeResources resources = flavor.resources();
@@ -229,12 +234,14 @@ public class NodeSerializer {
}
private Flavor flavorFromSlime(Inspector object) {
+ Inspector resources = object.field(resourcesKey);
+
if (object.field(flavorKey).valid()) {
- return flavors.getFlavorOrThrow(object.field(flavorKey).asString());
+ Flavor flavor = flavors.getFlavorOrThrow(object.field(flavorKey).asString());
+ if (!resources.valid()) return flavor;
+ return flavor.withFlavorOverrides(FlavorOverrides.ofDisk(resources.field(diskKey).asDouble()));
}
else {
- Inspector resources = object.field(resourcesKey);
-
// TODO: Simplify Sept. 2019
double bandwidth = Optional.of(resources.field(bandwidthKey))
.filter(Inspector::valid)
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java
index f6554b2dede..5e2cfab3258 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java
@@ -3,7 +3,6 @@ package com.yahoo.vespa.hosted.provision.provisioning;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ClusterSpec;
-import com.yahoo.config.provision.Flavor;
import com.yahoo.config.provision.NodeFlavors;
import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.NodeType;
@@ -169,9 +168,8 @@ class NodePrioritizer {
}
Node newNode = Node.createDockerNode(allocation.get().addresses(),
- Set.of(),
allocation.get().hostname(),
- Optional.of(host.hostname()),
+ host.hostname(),
resources(requestedNodes).withDiskSpeed(host.flavor().resources().diskSpeed()),
NodeType.tenant);
PrioritizableNode nodePri = toNodePriority(newNode, false, true);
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisionedHost.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisionedHost.java
index c2b56c757fa..451ab089a8d 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisionedHost.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisionedHost.java
@@ -5,6 +5,7 @@ import com.yahoo.config.provision.Flavor;
import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.NodeType;
import com.yahoo.vespa.hosted.provision.Node;
+import com.yahoo.vespa.hosted.provision.node.IP;
import java.util.Objects;
import java.util.Optional;
@@ -33,12 +34,12 @@ public class ProvisionedHost {
/** Generate {@link Node} instance representing the provisioned physical host */
public Node generateHost() {
- return Node.create(id, Set.of(), Set.of(), hostHostname, Optional.empty(), Optional.empty(), hostFlavor, NodeType.host);
+ return Node.create(id, IP.Config.EMPTY, hostHostname, Optional.empty(), Optional.empty(), hostFlavor, NodeType.host);
}
/** Generate {@link Node} instance representing the node running on this physical host */
public Node generateNode() {
- return Node.createDockerNode(Set.of(), Set.of(), nodeHostname, Optional.of(hostHostname), nodeResources, NodeType.tenant);
+ return Node.createDockerNode(Set.of(), nodeHostname, hostHostname, nodeResources, NodeType.tenant);
}
public String getId() {
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java
index b2f0998189d..473d9362105 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java
@@ -219,10 +219,10 @@ public class NodesApiHandler extends LoggingRequestHandler {
Set<String> ipAddressPool = new HashSet<>();
inspector.field("additionalIpAddresses").traverse((ArrayTraverser) (i, item) -> ipAddressPool.add(item.asString()));
- return nodeRepository.createNode(
+ return Node.create(
inspector.field("openStackId").asString(),
- inspector.field("hostname").asString(),
new IP.Config(ipAddresses, ipAddressPool),
+ inspector.field("hostname").asString(),
parentHostname,
modelName,
nodeFlavors.getFlavorOrThrow(inspector.field("flavor").asString()),
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java
index 2ee276e932b..99709880cbe 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java
@@ -64,34 +64,34 @@ public class MockNodeRepository extends NodeRepository {
List<Node> nodes = new ArrayList<>();
// Regular nodes
- nodes.add(createNode("node1", "host1.yahoo.com", ipConfig(1), Optional.empty(), Optional.empty(),
+ nodes.add(createNode("node1", "host1.yahoo.com", ipConfig(1), Optional.empty(),
new Flavor(new NodeResources(2, 8, 50, 1)), NodeType.tenant));
- nodes.add(createNode("node2", "host2.yahoo.com", ipConfig(2), Optional.empty(), Optional.empty(),
+ nodes.add(createNode("node2", "host2.yahoo.com", ipConfig(2), Optional.empty(),
new Flavor(new NodeResources(2, 8, 50, 1)), NodeType.tenant));
- nodes.add(createNode("node3", "host3.yahoo.com", ipConfig(3), Optional.empty(), Optional.empty(),
+ nodes.add(createNode("node3", "host3.yahoo.com", ipConfig(3), Optional.empty(),
new Flavor(new NodeResources(0.5, 48, 500, 1)), NodeType.tenant));
- Node node4 = createNode("node4", "host4.yahoo.com", ipConfig(4), Optional.of("dockerhost1.yahoo.com"), Optional.empty(),
+ Node node4 = createNode("node4", "host4.yahoo.com", ipConfig(4), Optional.of("dockerhost1.yahoo.com"),
new Flavor(new NodeResources(1, 1, 100, 1)), NodeType.tenant);
node4 = node4.with(node4.status()
.withVespaVersion(new Version("6.41.0"))
.withDockerImage(DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa:6.41.0")));
nodes.add(node4);
- Node node5 = createNode("node5", "host5.yahoo.com", ipConfig(5), Optional.of("dockerhost2.yahoo.com"), Optional.empty(),
+ Node node5 = createNode("node5", "host5.yahoo.com", ipConfig(5), Optional.of("dockerhost2.yahoo.com"),
new Flavor(new NodeResources(1, 1, 100, 1)), NodeType.tenant);
nodes.add(node5.with(node5.status()
.withVespaVersion(new Version("1.2.3"))
.withDockerImage(DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa:1.2.3"))));
- nodes.add(createNode("node6", "host6.yahoo.com", ipConfig(6), Optional.empty(), Optional.empty(),
+ nodes.add(createNode("node6", "host6.yahoo.com", ipConfig(6), Optional.empty(),
new Flavor(new NodeResources(2, 8, 50, 1)), NodeType.tenant));
- Node node7 = createNode("node7", "host7.yahoo.com", ipConfig(7), Optional.empty(), Optional.empty(),
+ Node node7 = createNode("node7", "host7.yahoo.com", ipConfig(7), Optional.empty(),
new Flavor(new NodeResources(2, 8, 50, 1)), NodeType.tenant);
nodes.add(node7);
// 8, 9, 11 and 12 are added by web service calls
- Node node10 = createNode("node10", "host10.yahoo.com", ipConfig(10), Optional.of("parent1.yahoo.com"), Optional.empty(),
+ Node node10 = createNode("node10", "host10.yahoo.com", ipConfig(10), Optional.of("parent1.yahoo.com"),
new Flavor(new NodeResources(2, 8, 50, 1)), NodeType.tenant);
Status node10newStatus = node10.status();
node10newStatus = node10newStatus
@@ -100,26 +100,26 @@ public class MockNodeRepository extends NodeRepository {
node10 = node10.with(node10newStatus);
nodes.add(node10);
- Node node55 = createNode("node55", "host55.yahoo.com", ipConfig(55), Optional.empty(), Optional.empty(),
+ Node node55 = createNode("node55", "host55.yahoo.com", ipConfig(55), Optional.empty(),
new Flavor(new NodeResources(2, 8, 50, 1)), NodeType.tenant);
nodes.add(node55.with(node55.status().withWantToRetire(true).withWantToDeprovision(true)));
/* Setup docker hosts (two of these will be reserved for spares */
- nodes.add(createNode("dockerhost1", "dockerhost1.yahoo.com", ipConfig(100, 1, 3), Optional.empty(), Optional.empty(),
+ nodes.add(createNode("dockerhost1", "dockerhost1.yahoo.com", ipConfig(100, 1, 3), Optional.empty(),
flavors.getFlavorOrThrow("large"), NodeType.host));
- nodes.add(createNode("dockerhost2", "dockerhost2.yahoo.com", ipConfig(101, 1, 3), Optional.empty(), Optional.empty(),
+ nodes.add(createNode("dockerhost2", "dockerhost2.yahoo.com", ipConfig(101, 1, 3), Optional.empty(),
flavors.getFlavorOrThrow("large"), NodeType.host));
- nodes.add(createNode("dockerhost3", "dockerhost3.yahoo.com", ipConfig(102, 1, 3), Optional.empty(), Optional.empty(),
+ nodes.add(createNode("dockerhost3", "dockerhost3.yahoo.com", ipConfig(102, 1, 3), Optional.empty(),
flavors.getFlavorOrThrow("large"), NodeType.host));
- nodes.add(createNode("dockerhost4", "dockerhost4.yahoo.com", ipConfig(103, 1, 3), Optional.empty(), Optional.empty(),
+ nodes.add(createNode("dockerhost4", "dockerhost4.yahoo.com", ipConfig(103, 1, 3), Optional.empty(),
flavors.getFlavorOrThrow("large"), NodeType.host));
- nodes.add(createNode("dockerhost5", "dockerhost5.yahoo.com", ipConfig(104, 1, 3), Optional.empty(), Optional.empty(),
+ nodes.add(createNode("dockerhost5", "dockerhost5.yahoo.com", ipConfig(104, 1, 3), Optional.empty(),
flavors.getFlavorOrThrow("large"), NodeType.host));
// Config servers
- nodes.add(createNode("cfg1", "cfg1.yahoo.com", ipConfig(201), Optional.empty(), Optional.empty(),
+ nodes.add(createNode("cfg1", "cfg1.yahoo.com", ipConfig(201), Optional.empty(),
flavors.getFlavorOrThrow("default"), NodeType.config));
- nodes.add(createNode("cfg2", "cfg2.yahoo.com", ipConfig(202), Optional.empty(), Optional.empty(),
+ nodes.add(createNode("cfg2", "cfg2.yahoo.com", ipConfig(202), Optional.empty(),
flavors.getFlavorOrThrow("default"), NodeType.config));
// Ready all nodes, except 7 and 55
@@ -161,9 +161,9 @@ public class MockNodeRepository extends NodeRepository {
activate(provisioner.prepare(app3, cluster3, Capacity.fromCount(2, new NodeResources(1, 1, 100, 1), false, true), 1, null), app3, provisioner);
List<Node> largeNodes = new ArrayList<>();
- largeNodes.add(createNode("node13", "host13.yahoo.com", ipConfig(13), Optional.empty(), Optional.empty(),
+ largeNodes.add(createNode("node13", "host13.yahoo.com", ipConfig(13), Optional.empty(),
new Flavor(new NodeResources(10, 48, 500, 1)), NodeType.tenant));
- largeNodes.add(createNode("node14", "host14.yahoo.com", ipConfig(14), Optional.empty(), Optional.empty(),
+ largeNodes.add(createNode("node14", "host14.yahoo.com", ipConfig(14), Optional.empty(),
new Flavor(new NodeResources(10, 48, 500, 1)), NodeType.tenant));
addNodes(largeNodes);
setReady(largeNodes, Agent.system, getClass().getSimpleName());
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/CapacityCheckerTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/CapacityCheckerTester.java
index 29523ff9296..f44bddc2b57 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/CapacityCheckerTester.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/CapacityCheckerTester.java
@@ -133,7 +133,7 @@ public class CapacityCheckerTester {
excessCapacity);
Node node = nodeRepository.createNode(hostname, hostname,
new IP.Config(Set.of("::"), availableIps), Optional.empty(),
- Optional.empty(), new Flavor(nr), NodeType.host);
+ new Flavor(nr), NodeType.host);
hosts.add(node);
}
return hosts;
@@ -152,7 +152,7 @@ public class CapacityCheckerTester {
.collect(Collectors.toSet());
Node node = nodeRepository.createNode(hostname, hostname,
new IP.Config(Set.of("::"), availableIps), Optional.empty(),
- Optional.empty(), new Flavor(capacity), NodeType.host);
+ new Flavor(capacity), NodeType.host);
hosts.add(node);
}
return hosts;
@@ -268,7 +268,7 @@ public class CapacityCheckerTester {
Node node = nodeRepository.createNode(nodeModel.id, nodeModel.hostname,
new IP.Config(nodeModel.ipAddresses, nodeModel.additionalIpAddresses),
- nodeModel.parentHostname, Optional.empty(), f, nodeModel.type);
+ nodeModel.parentHostname, f, nodeModel.type);
if (membership != null) {
return node.allocate(owner, membership, Instant.now());
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java
index b2825a409e1..7c30c905983 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java
@@ -1,7 +1,6 @@
// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.provision.maintenance;
-import com.google.common.collect.ImmutableSet;
import com.yahoo.component.Version;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.ClusterMembership;
@@ -19,6 +18,7 @@ import com.yahoo.vespa.hosted.provision.NodeRepository;
import com.yahoo.vespa.hosted.provision.node.Agent;
import com.yahoo.vespa.hosted.provision.node.Allocation;
import com.yahoo.vespa.hosted.provision.node.Generation;
+import com.yahoo.vespa.hosted.provision.node.IP;
import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder;
import com.yahoo.vespa.hosted.provision.testutils.MockNameResolver;
import com.yahoo.vespa.orchestrator.Orchestrator;
@@ -117,21 +117,21 @@ public class MetricsReporterTest {
true);
// Allow 4 containers
- Set<String> ipAddressPool = ImmutableSet.of("::2", "::3", "::4", "::5");
+ Set<String> ipAddressPool = Set.of("::2", "::3", "::4", "::5");
- Node dockerHost = Node.create("openStackId1", Set.of("::1"), ipAddressPool, "dockerHost",
+ Node dockerHost = Node.create("openStackId1", new IP.Config(Set.of("::1"), ipAddressPool), "dockerHost",
Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("host"), NodeType.host);
nodeRepository.addNodes(List.of(dockerHost));
nodeRepository.dirtyRecursively("dockerHost", Agent.system, getClass().getSimpleName());
nodeRepository.setReady("dockerHost", Agent.system, getClass().getSimpleName());
- Node container1 = Node.createDockerNode(Set.of("::2"), Set.of(), "container1",
- Optional.of("dockerHost"), new NodeResources(1, 3, 2, 1), NodeType.tenant);
+ Node container1 = Node.createDockerNode(Set.of("::2"), "container1",
+ "dockerHost", new NodeResources(1, 3, 2, 1), NodeType.tenant);
container1 = container1.with(allocation(Optional.of("app1")).get());
nodeRepository.addDockerNodes(new LockedNodeList(List.of(container1), nodeRepository.lockAllocation()));
- Node container2 = Node.createDockerNode(Set.of("::3"), Set.of(), "container2",
- Optional.of("dockerHost"), new NodeResources(2, 4, 4, 1), NodeType.tenant);
+ Node container2 = Node.createDockerNode(Set.of("::3"), "container2",
+ "dockerHost", new NodeResources(2, 4, 4, 1), NodeType.tenant);
container2 = container2.with(allocation(Optional.of("app2")).get());
nodeRepository.addDockerNodes(new LockedNodeList(List.of(container2), nodeRepository.lockAllocation()));
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/node/IPTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/node/IPTest.java
index 239561ac9af..37881d92796 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/node/IPTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/node/IPTest.java
@@ -15,7 +15,6 @@ import org.junit.Test;
import java.util.ArrayList;
import java.util.Arrays;
-import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.Set;
@@ -168,7 +167,7 @@ public class IPTest {
}
private static Node createNode(Set<String> ipAddresses) {
- return Node.create("id1", Collections.singleton("127.0.0.1"), ipAddresses,
+ return Node.create("id1", new IP.Config(Set.of("127.0.0.1"), ipAddresses),
"host1", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("default"),
NodeType.host);
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java
index 2094a68148e..84f707eb505 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java
@@ -12,6 +12,7 @@ import com.yahoo.config.provision.NetworkPorts;
import com.yahoo.config.provision.NodeFlavors;
import com.yahoo.config.provision.NodeType;
import com.yahoo.config.provision.TenantName;
+import com.yahoo.config.provision.host.FlavorOverrides;
import com.yahoo.slime.Cursor;
import com.yahoo.slime.Slime;
import com.yahoo.slime.Type;
@@ -34,14 +35,12 @@ import java.time.Instant;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
-import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;
import static java.time.temporal.ChronoUnit.MILLIS;
-import static java.util.Collections.singleton;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -235,7 +234,7 @@ public class SerializationTest {
@Test
public void serialize_parentHostname() {
final String parentHostname = "parent.yahoo.com";
- Node node = Node.create("myId", singleton("127.0.0.1"), Collections.emptySet(), "myHostname", Optional.of(parentHostname), Optional.empty(), nodeFlavors.getFlavorOrThrow("default"), NodeType.tenant);
+ Node node = Node.create("myId", new IP.Config(Set.of("127.0.0.1"), Set.of()), "myHostname", Optional.of(parentHostname), Optional.empty(), nodeFlavors.getFlavorOrThrow("default"), NodeType.tenant);
Node deserializedNode = nodeSerializer.fromJson(State.provisioned, nodeSerializer.toJson(node));
assertEquals(parentHostname, deserializedNode.parentHostname().get());
@@ -279,6 +278,18 @@ public class SerializationTest {
}
@Test
+ public void flavor_overrides_serialization() {
+ Node node = createNode();
+ assertEquals(2, node.flavor().getMinDiskAvailableGb(), 0);
+ node = node.with(node.flavor().withFlavorOverrides(FlavorOverrides.ofDisk(1234)));
+ assertEquals(1234, node.flavor().getMinDiskAvailableGb(), 0);
+
+ Node copy = nodeSerializer.fromJson(Node.State.provisioned, nodeSerializer.toJson(node));
+ assertEquals(1234, copy.flavor().getMinDiskAvailableGb(), 0);
+ assertEquals(node, copy);
+ }
+
+ @Test
public void want_to_deprovision_defaults_to_false() {
String nodeData =
"{\n" +
@@ -420,7 +431,7 @@ public class SerializationTest {
}
private Node createNode() {
- return Node.create("myId", singleton("127.0.0.1"), Collections.emptySet(), "myHostname", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("default"), NodeType.host);
+ return Node.create("myId", new IP.Config(Set.of("127.0.0.1"), Set.of()), "myHostname", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("default"), NodeType.host);
}
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacityTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacityTest.java
index 3ccbd257b3c..6bdde18c301 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacityTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacityTest.java
@@ -1,12 +1,12 @@
// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.provision.provisioning;
-import com.yahoo.config.provision.Flavor;
import com.yahoo.config.provision.NodeFlavors;
import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.NodeType;
import com.yahoo.vespa.hosted.provision.LockedNodeList;
import com.yahoo.vespa.hosted.provision.Node;
+import com.yahoo.vespa.hosted.provision.node.IP;
import org.junit.Before;
import org.junit.Test;
@@ -32,7 +32,8 @@ public class DockerHostCapacityTest {
private DockerHostCapacity capacity;
private List<Node> nodes;
private Node host1, host2, host3;
- private Flavor flavorDocker, flavorDocker2;
+ private final NodeResources resources1 = new NodeResources(1, 3, 2, 1.5);
+ private final NodeResources resources2 = new NodeResources(2, 4, 4, 0.5);
@Before
public void setup() {
@@ -40,24 +41,22 @@ public class DockerHostCapacityTest {
// Create flavors
NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("host", "docker", "docker2");
- flavorDocker = nodeFlavors.getFlavorOrThrow("docker");
- flavorDocker2 = nodeFlavors.getFlavorOrThrow("docker2");
// Create three docker hosts
- host1 = Node.create("host1", Set.of("::1"), generateIPs(2, 4), "host1", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("host"), NodeType.host);
- host2 = Node.create("host2", Set.of("::11"), generateIPs(12, 3), "host2", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("host"), NodeType.host);
- host3 = Node.create("host3", Set.of("::21"), generateIPs(22, 1), "host3", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("host"), NodeType.host);
+ host1 = Node.create("host1", new IP.Config(Set.of("::1"), generateIPs(2, 4)), "host1", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("host"), NodeType.host);
+ host2 = Node.create("host2", new IP.Config(Set.of("::11"), generateIPs(12, 3)), "host2", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("host"), NodeType.host);
+ host3 = Node.create("host3", new IP.Config(Set.of("::21"), generateIPs(22, 1)), "host3", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("host"), NodeType.host);
// Add two containers to host1
- var nodeA = Node.create("nodeA", Set.of("::2"), Set.of(), "nodeA", Optional.of("host1"), Optional.empty(), flavorDocker, NodeType.tenant);
- var nodeB = Node.create("nodeB", Set.of("::3"), Set.of(), "nodeB", Optional.of("host1"), Optional.empty(), flavorDocker, NodeType.tenant);
+ var nodeA = Node.createDockerNode(Set.of("::2"), "nodeA", "host1", resources1, NodeType.tenant);
+ var nodeB = Node.createDockerNode(Set.of("::3"), "nodeB", "host1", resources1, NodeType.tenant);
// Add two containers to host 2 (same as host 1)
- var nodeC = Node.create("nodeC", Set.of("::12"), Set.of(), "nodeC", Optional.of("host2"), Optional.empty(), flavorDocker, NodeType.tenant);
- var nodeD = Node.create("nodeD", Set.of("::13"), Set.of(), "nodeD", Optional.of("host2"), Optional.empty(), flavorDocker, NodeType.tenant);
+ var nodeC = Node.createDockerNode(Set.of("::12"), "nodeC", "host2", resources1, NodeType.tenant);
+ var nodeD = Node.createDockerNode(Set.of("::13"), "nodeD", "host2", resources1, NodeType.tenant);
// Add a larger container to host3
- var nodeE = Node.create("nodeE", Set.of("::22"), Set.of(), "nodeE", Optional.of("host3"), Optional.empty(), flavorDocker2, NodeType.tenant);
+ var nodeE = Node.createDockerNode(Set.of("::22"), "nodeE", "host3", resources2, NodeType.tenant);
// init docker host capacity
nodes = new ArrayList<>(List.of(host1, host2, host3, nodeA, nodeB, nodeC, nodeD, nodeE));
@@ -66,20 +65,19 @@ public class DockerHostCapacityTest {
@Test
public void hasCapacity() {
- assertTrue(capacity.hasCapacity(host1, flavorDocker.resources()));
- assertTrue(capacity.hasCapacity(host1, flavorDocker2.resources()));
- assertTrue(capacity.hasCapacity(host2, flavorDocker.resources()));
- assertTrue(capacity.hasCapacity(host2, flavorDocker2.resources()));
- assertFalse(capacity.hasCapacity(host3, flavorDocker.resources())); // No ip available
- assertFalse(capacity.hasCapacity(host3, flavorDocker2.resources())); // No ip available
+ assertTrue(capacity.hasCapacity(host1, resources1));
+ assertTrue(capacity.hasCapacity(host1, resources2));
+ assertTrue(capacity.hasCapacity(host2, resources1));
+ assertTrue(capacity.hasCapacity(host2, resources2));
+ assertFalse(capacity.hasCapacity(host3, resources1)); // No ip available
+ assertFalse(capacity.hasCapacity(host3, resources2)); // No ip available
// Add a new node to host1 to deplete the memory resource
- Node nodeF = Node.create("nodeF", Set.of("::6"), Set.of(),
- "nodeF", Optional.of("host1"), Optional.empty(), flavorDocker, NodeType.tenant);
+ Node nodeF = Node.createDockerNode(Set.of("::6"), "nodeF", "host1", resources1, NodeType.tenant);
nodes.add(nodeF);
capacity = new DockerHostCapacity(new LockedNodeList(nodes, () -> {}), hostResourcesCalculator);
- assertFalse(capacity.hasCapacity(host1, flavorDocker.resources()));
- assertFalse(capacity.hasCapacity(host1, flavorDocker2.resources()));
+ assertFalse(capacity.hasCapacity(host1, resources1));
+ assertFalse(capacity.hasCapacity(host1, resources2));
}
@Test
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java
index 670473ff238..7b868c2884b 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java
@@ -22,6 +22,7 @@ import com.yahoo.vespa.curator.transaction.CuratorTransaction;
import com.yahoo.vespa.hosted.provision.Node;
import com.yahoo.vespa.hosted.provision.NodeList;
import com.yahoo.vespa.hosted.provision.node.Agent;
+import com.yahoo.vespa.hosted.provision.node.IP;
import org.junit.Ignore;
import org.junit.Test;
@@ -386,7 +387,7 @@ public class DynamicDockerAllocationTest {
}
private void addAndAssignNode(ApplicationId id, String hostname, String parentHostname, ClusterSpec clusterSpec, NodeResources flavor, int index, ProvisioningTester tester) {
- Node node1a = Node.create("open1", Set.of("127.0.233." + index), Set.of(), hostname, Optional.of(parentHostname), Optional.empty(), new Flavor(flavor), NodeType.tenant);
+ Node node1a = Node.create("open1", new IP.Config(Set.of("127.0.233." + index), Set.of()), hostname, Optional.of(parentHostname), Optional.empty(), new Flavor(flavor), NodeType.tenant);
ClusterMembership clusterMembership1 = ClusterMembership.from(
clusterSpec.with(Optional.of(ClusterSpec.Group.from(0))), index); // Need to add group here so that group is serialized in node allocation
Node node1aAllocation = node1a.allocate(id, clusterMembership1, Instant.now());
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java
index f63fa797f2f..08112f9b055 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java
@@ -24,7 +24,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashSet;
import java.util.List;
-import java.util.Optional;
import java.util.Set;
import java.util.function.Supplier;
import java.util.stream.Collectors;
@@ -225,7 +224,7 @@ public class LoadBalancerProvisionerTest {
private void makeDynamicDockerNodes(int n, NodeType nodeType) {
List<Node> nodes = new ArrayList<>(n);
for (int i = 1; i <= n; i++) {
- var node = Node.createDockerNode(Set.of(), Set.of(), "node" + i, Optional.empty(),
+ var node = Node.createDockerNode(Set.of(), "node" + i, "parent" + i,
NodeResources.fromLegacyName("d-1-1-1"), nodeType);
nodes.add(node);
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizerTest.java
index 43a045705c8..72e3df84161 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizerTest.java
@@ -11,15 +11,15 @@ import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.NodeType;
import com.yahoo.config.provisioning.FlavorsConfig;
import com.yahoo.vespa.hosted.provision.Node;
+import com.yahoo.vespa.hosted.provision.node.IP;
import org.junit.Assert;
import org.junit.Test;
import java.time.Instant;
import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
import java.util.List;
import java.util.Optional;
+import java.util.Set;
/**
* @author smorgrav
@@ -69,12 +69,11 @@ public class NodePrioritizerTest {
}
private static Node createNode(Node parent, String hostname, NodeResources resources) {
- return Node.createDockerNode(Collections.singleton("127.0.0.1"), new HashSet<>(), hostname, Optional.of(parent.hostname()),
- resources, NodeType.tenant);
+ return Node.createDockerNode(Set.of("127.0.0.1"), hostname, parent.hostname(), resources, NodeType.tenant);
}
private static Node createParent(String hostname) {
- return Node.create("openid", Collections.singleton("127.0.0.1"), new HashSet<>(), hostname, Optional.empty(),
+ return Node.create("openid", new IP.Config(Set.of("127.0.0.1"), Set.of()), hostname, Optional.empty(),
Optional.empty(), flavors.getFlavorOrThrow("host-large"), NodeType.host);
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java
index cad3ea1cd42..50657e7eab2 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java
@@ -290,7 +290,6 @@ public class ProvisioningTester {
hostname,
new IP.Config(hostIps, ipAddressPool),
Optional.empty(),
- Optional.empty(),
flavor,
type));
}
@@ -311,7 +310,6 @@ public class ProvisioningTester {
hostname,
new IP.Config(Set.of(ipv4), Set.of()),
Optional.empty(),
- Optional.empty(),
nodeFlavors.getFlavorOrThrow(flavor),
NodeType.config);
nodes.add(node);