diff options
18 files changed, 219 insertions, 194 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 f92f02f7908..edda5593e79 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 @@ -59,17 +59,14 @@ public class IdentityDocumentGeneratorTest { Node parentNode = Node.create("ostkid", new IP.Config(Set.of("127.0.0.1"), Set.of()), parentHostname, - Optional.empty(), - Optional.empty(), new MockNodeFlavors().getFlavorOrThrow("default"), - Optional.empty(), - NodeType.host, Optional.empty()); + NodeType.host).build(); Node containerNode = Node.createDockerNode(Set.of("::1"), containerHostname, parentHostname, new MockNodeFlavors().getFlavorOrThrow("default").resources(), NodeType.tenant) - .with(allocation); + .allocation(allocation).build(); NodeRepository nodeRepository = mock(NodeRepository.class); when(nodeRepository.getNode(eq(parentHostname))).thenReturn(Optional.of(parentNode)); when(nodeRepository.getNode(eq(containerHostname))).thenReturn(Optional.of(containerNode)); 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 5e965761874..c5dbd9dd7b2 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 @@ -224,14 +224,8 @@ 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, - new IP.Config(Set.of("::1" + i, "::2" + i, "::3" + i), Set.of()), - "foo" + i, - Optional.empty(), - Optional.empty(), - flavors.getFlavorOrThrow("default"), - Optional.empty(), - NodeType.tenant, Optional.empty()); + Node node = Node.create("foo" + i, new IP.Config(Set.of("::1" + i, "::2" + i, "::3" + i), Set.of()), + "foo" + i, flavors.getFlavorOrThrow("default"), NodeType.tenant).build(); nodeList.add(node); } return nodeList; 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 e288f08a681..3858e112707 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 @@ -51,19 +51,16 @@ public final class Node implements Nodelike { /** The current allocation of this node, if any */ private final Optional<Allocation> allocation; - /** 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(), Optional.empty(), - Optional.empty()); + /** Creates a node builder in the initial state (reserved) */ + public static Node.Builder createDockerNode(Set<String> ipAddresses, String hostname, String parentHostname, NodeResources resources, NodeType type) { + return new Node.Builder("fake-" + hostname, hostname, new Flavor(resources), State.reserved, type) + .ipConfig(ipAddresses, Set.of()) + .parentHostname(parentHostname); } - /** Creates a node in the initial state (provisioned) */ - public static Node create(String openStackId, IP.Config ipConfig, String hostname, Optional<String> parentHostname, - Optional<String> modelName, Flavor flavor, Optional<TenantName> reservedTo, NodeType type, Optional<String> switchHostname) { - return new Node(openStackId, ipConfig, hostname, parentHostname, flavor, Status.initial(), State.provisioned, - Optional.empty(), History.empty(), type, new Reports(), modelName, reservedTo, switchHostname); + /** Creates a node builder in the initial state (provisioned) */ + public static Node.Builder create(String openStackId, IP.Config ipConfig, String hostname, Flavor flavor, NodeType type) { + return new Node.Builder(openStackId, hostname, flavor, State.provisioned, type).ipConfig(ipConfig); } /** Creates a node. See also the {@code create} helper methods. */ @@ -484,4 +481,87 @@ public final class Node implements Nodelike { } + public static class Builder { + private final String id; + private final String hostname; + private final Flavor flavor; + private final State state; + private final NodeType type; + + private String parentHostname; + private String modelName; + private TenantName reservedTo; + private String switchHostname; + private Allocation allocation; + private IP.Config ipConfig; + private Status status; + private Reports reports; + private History history; + + private Builder(String id, String hostname, Flavor flavor, State state, NodeType type) { + this.id = id; + this.hostname = hostname; + this.flavor = flavor; + this.state = state; + this.type = type; + } + + public Builder parentHostname(String parentHostname) { + this.parentHostname = parentHostname; + return this; + } + + public Builder modelName(String modelName) { + this.modelName = modelName; + return this; + } + + public Builder reservedTo(TenantName reservedTo) { + this.reservedTo = reservedTo; + return this; + } + + public Builder switchHostname(String switchHostname) { + this.switchHostname = switchHostname; + return this; + } + + public Builder allocation(Allocation allocation) { + this.allocation = allocation; + return this; + } + + public Builder ipConfig(IP.Config ipConfig) { + this.ipConfig = ipConfig; + return this; + } + + public Builder ipConfig(Set<String> primary, Set<String> pool) { + this.ipConfig = new IP.Config(primary, pool); + return this; + } + + public Builder status(Status status) { + this.status = status; + return this; + } + + public Builder reports(Reports reports) { + this.reports = reports; + return this; + } + + public Builder history(History history) { + this.history = history; + return this; + } + + public Node build() { + return new Node(id, Optional.ofNullable(ipConfig).orElse(IP.Config.EMPTY), hostname, Optional.ofNullable(parentHostname), + flavor, Optional.ofNullable(status).orElseGet(Status::initial), state, Optional.ofNullable(allocation), + Optional.ofNullable(history).orElseGet(History::empty), type, Optional.ofNullable(reports).orElseGet(Reports::new), + Optional.ofNullable(modelName), Optional.ofNullable(reservedTo), Optional.ofNullable(switchHostname)); + } + } + } 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 3fdade27410..3cf5d77de69 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 @@ -12,8 +12,6 @@ import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.NodeType; -import com.yahoo.config.provision.ProvisionLock; -import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; import com.yahoo.config.provisioning.NodeRepositoryConfig; import com.yahoo.transaction.Mutex; @@ -388,18 +386,6 @@ public class NodeRepository extends AbstractComponent { // ----------------- Node lifecycle ----------------------------------------------------------- - /** 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, - Flavor flavor, Optional<TenantName> reservedTo, NodeType type) { - if (ipConfig.primary().isEmpty()) // TODO: Remove this. Only test code hits this path - ipConfig = ipConfig.with(nameResolver.resolveAll(hostname)); - return Node.create(openStackId, ipConfig, hostname, parentHostname, Optional.empty(), flavor, reservedTo, type, Optional.empty()); - } - - public Node createNode(String openStackId, String hostname, Optional<String> parentHostname, Flavor flavor, NodeType type) { - return createNode(openStackId, hostname, IP.Config.EMPTY, parentHostname, flavor, Optional.empty(), type); - } - /** Adds a list of newly created docker container nodes to the node repository as <i>reserved</i> nodes */ public List<Node> addDockerNodes(LockedNodeList nodes) { for (Node node : nodes) { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeCandidate.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeCandidate.java index 02086e2bace..f8231072a28 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeCandidate.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeCandidate.java @@ -375,7 +375,7 @@ abstract class NodeCandidate implements Nodelike, Comparable<NodeCandidate> { parentHostname().get(), resources.with(parent.get().resources().diskSpeed()) .with(parent.get().resources().storageType()), - NodeType.tenant); + NodeType.tenant).build(); return new ConcreteNodeCandidate(node, freeParentCapacity, parent, violatesSpares, exclusiveSwitch, isSurplus, isNew, isResizable); } 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 298404a4cb4..a5fb2694f9e 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 @@ -8,6 +8,7 @@ import com.yahoo.config.provision.NodeType; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.node.IP; import com.yahoo.vespa.hosted.provision.node.OsVersion; +import com.yahoo.vespa.hosted.provision.node.Status; import java.util.Objects; import java.util.Optional; @@ -38,13 +39,14 @@ public class ProvisionedHost { /** Generate {@link Node} instance representing the provisioned physical host */ public Node generateHost() { - var node = Node.create(id, IP.Config.EMPTY, hostHostname, Optional.empty(), Optional.empty(), hostFlavor, Optional.empty(), NodeType.host, Optional.empty()); - return node.with(node.status().withOsVersion(OsVersion.EMPTY.withCurrent(Optional.of(osVersion)))); + return Node.create(id, IP.Config.EMPTY, hostHostname, hostFlavor, NodeType.host) + .status(Status.initial().withOsVersion(OsVersion.EMPTY.withCurrent(Optional.of(osVersion)))) + .build(); } /** Generate {@link Node} instance representing the node running on this physical host */ public Node generateNode() { - return Node.createDockerNode(Set.of(), nodeHostname, hostHostname, nodeResources, NodeType.tenant); + return Node.createDockerNode(Set.of(), nodeHostname, hostHostname, nodeResources, NodeType.tenant).build(); } public String getId() { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java index 5d19271d2a7..59c31575b73 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiHandler.java @@ -24,7 +24,6 @@ import com.yahoo.slime.Cursor; import com.yahoo.slime.Inspector; import com.yahoo.slime.Slime; import com.yahoo.slime.SlimeUtils; -import com.yahoo.slime.Type; import com.yahoo.transaction.Mutex; import com.yahoo.vespa.hosted.provision.NoSuchNodeException; import com.yahoo.vespa.hosted.provision.Node; @@ -248,27 +247,21 @@ public class NodesV2ApiHandler extends LoggingRequestHandler { } private Node createNode(Inspector inspector) { - Optional<String> parentHostname = optionalString(inspector.field("parentHostname")); - Optional<String> modelName = optionalString(inspector.field("modelName")); Set<String> ipAddresses = new HashSet<>(); inspector.field("ipAddresses").traverse((ArrayTraverser) (i, item) -> ipAddresses.add(item.asString())); Set<String> ipAddressPool = new HashSet<>(); inspector.field("additionalIpAddresses").traverse((ArrayTraverser) (i, item) -> ipAddressPool.add(item.asString())); - return Node.create(inspector.field("openStackId").asString(), - new IP.Config(ipAddresses, ipAddressPool), - inspector.field("hostname").asString(), - parentHostname, - modelName, - flavorFromSlime(inspector), - reservedToFromSlime(inspector.field("reservedTo")), - nodeTypeFromSlime(inspector.field("type")), - switchHostnameFromSlime(inspector.field("switchHostname"))); - } - - private Optional<String> switchHostnameFromSlime(Inspector field) { - if (!field.valid()) return Optional.empty(); - return Optional.of(field.asString()); + Node.Builder builder = Node.create(inspector.field("openStackId").asString(), + new IP.Config(ipAddresses, ipAddressPool), + inspector.field("hostname").asString(), + flavorFromSlime(inspector), + nodeTypeFromSlime(inspector.field("type"))); + optionalString(inspector.field("parentHostname")).ifPresent(builder::parentHostname); + optionalString(inspector.field("modelName")).ifPresent(builder::modelName); + optionalString(inspector.field("reservedTo")).map(TenantName::from).ifPresent(builder::reservedTo); + optionalString(inspector.field("switchHostname")).ifPresent(builder::switchHostname); + return builder.build(); } private Flavor flavorFromSlime(Inspector inspector) { @@ -313,13 +306,6 @@ public class NodesV2ApiHandler extends LoggingRequestHandler { return NodeSerializer.typeFrom(object.asString()); } - private Optional<TenantName> reservedToFromSlime(Inspector object) { - if (! object.valid()) return Optional.empty(); - if ( object.type() != Type.STRING) - throw new IllegalArgumentException("Expected 'reservedTo' to be a string but is " + object); - return Optional.of(TenantName.from(object.asString())); - } - public static NodeFilter toNodeFilter(HttpRequest request) { NodeFilter filter = NodeHostFilter.from(HostFilter.from(request.getProperty("hostname"), request.getProperty("flavor"), 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 fed0ab6a8ee..f9bddc6f3f4 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 @@ -83,65 +83,60 @@ public class MockNodeRepository extends NodeRepository { List<Node> nodes = new ArrayList<>(); // Regular nodes - nodes.add(createNode("node1", "host1.yahoo.com", ipConfig(1), Optional.empty(), - new Flavor(new NodeResources(2, 8, 50, 1, fast, local)), Optional.empty(), NodeType.tenant)); - nodes.add(createNode("node2", "host2.yahoo.com", ipConfig(2), Optional.empty(), - new Flavor(new NodeResources(2, 8, 50, 1, fast, local)), Optional.empty(), NodeType.tenant)); - nodes.add(createNode("node3", "host3.yahoo.com", ipConfig(3), Optional.empty(), - new Flavor(new NodeResources(0.5, 48, 500, 1, fast, local)), Optional.empty(), NodeType.tenant)); - Node node4 = createNode("node4", "host4.yahoo.com", ipConfig(4), Optional.of("dockerhost1.yahoo.com"), - new Flavor(new NodeResources(1, 4, 100, 1, fast, local)), Optional.empty(), 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(Node.create("node1", ipConfig(1), "host1.yahoo.com", resources(2, 8, 50, 1, fast, local), NodeType.tenant).build()); + nodes.add(Node.create("node2", ipConfig(2), "host2.yahoo.com", resources(2, 8, 50, 1, fast, local), NodeType.tenant).build()); + nodes.add(Node.create("node3", ipConfig(3), "host3.yahoo.com", resources(0.5, 48, 500, 1, fast, local), NodeType.tenant).build()); + Node node4 = Node.create("node4", ipConfig(4), "host4.yahoo.com", resources(1, 4, 100, 1, fast, local), NodeType.tenant) + .parentHostname("dockerhost1.yahoo.com") + .status(Status.initial() + .withVespaVersion(new Version("6.41.0")) + .withDockerImage(DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa:6.41.0"))) + .build(); nodes.add(node4); - Node node5 = createNode("node5", "host5.yahoo.com", ipConfig(5), Optional.of("dockerhost2.yahoo.com"), - new Flavor(new NodeResources(1, 8, 100, 1, slow, remote)), Optional.empty(), 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")))); + Node node5 = Node.create("node5", ipConfig(5), "host5.yahoo.com", resources(1, 8, 100, 1, slow, remote), NodeType.tenant) + .parentHostname("dockerhost2.yahoo.com") + .status(Status.initial() + .withVespaVersion(new Version("1.2.3")) + .withDockerImage(DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa:1.2.3"))) + .build(); + nodes.add(node5); - nodes.add(createNode("node6", "host6.yahoo.com", ipConfig(6), Optional.empty(), - new Flavor(new NodeResources(2, 8, 50, 1, fast, local)), Optional.empty(), NodeType.tenant)); - Node node7 = createNode("node7", "host7.yahoo.com", ipConfig(7), Optional.empty(), - new Flavor(new NodeResources(2, 8, 50, 1, fast, local)), Optional.empty(), NodeType.tenant); + nodes.add(Node.create("node6", ipConfig(6), "host6.yahoo.com", resources(2, 8, 50, 1, fast, local), NodeType.tenant).build()); + Node node7 = Node.create("node7", ipConfig(7), "host7.yahoo.com", resources(2, 8, 50, 1, fast, local), NodeType.tenant).build(); 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"), - new Flavor(new NodeResources(2, 8, 50, 1, fast, local)), Optional.empty(), NodeType.tenant); - Status node10newStatus = node10.status(); - node10newStatus = node10newStatus - .withVespaVersion(Version.fromString("5.104.142")) - .withDockerImage(DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa:5.104.142")); - node10 = node10.with(node10newStatus); + Node node10 = Node.create("node10", ipConfig(10), "host10.yahoo.com", resources(2, 8, 50, 1, fast, local), NodeType.tenant) + .parentHostname("parent1.yahoo.com") + .status(Status.initial() + .withVespaVersion(Version.fromString("5.104.142")) + .withDockerImage(DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa:5.104.142"))) + .build(); nodes.add(node10); - Node node55 = createNode("node55", "host55.yahoo.com", ipConfig(55), Optional.empty(), - new Flavor(new NodeResources(2, 8, 50, 1, fast, local)), Optional.empty(), NodeType.tenant); - nodes.add(node55.with(node55.status().withWantToRetire(true, true))); + Node node55 = Node.create("node55", ipConfig(55), "host55.yahoo.com", resources(2, 8, 50, 1, fast, local), NodeType.tenant) + .status(Status.initial().withWantToRetire(true, true)).build(); + nodes.add(node55); /* Setup docker hosts (two of these will be reserved for spares */ - nodes.add(createNode("dockerhost1", "dockerhost1.yahoo.com", ipConfig(100, 1, 3), Optional.empty(), - flavors.getFlavorOrThrow("large"), Optional.empty(), NodeType.host)); - nodes.add(createNode("dockerhost2", "dockerhost2.yahoo.com", ipConfig(101, 1, 3), Optional.empty(), - flavors.getFlavorOrThrow("large"), Optional.empty(), NodeType.host)); - nodes.add(createNode("dockerhost3", "dockerhost3.yahoo.com", ipConfig(102, 1, 3), Optional.empty(), - flavors.getFlavorOrThrow("large"), Optional.empty(), NodeType.host)); - nodes.add(createNode("dockerhost4", "dockerhost4.yahoo.com", ipConfig(103, 1, 3), Optional.empty(), - flavors.getFlavorOrThrow("large"), Optional.empty(), NodeType.host)); - nodes.add(createNode("dockerhost5", "dockerhost5.yahoo.com", ipConfig(104, 1, 3), Optional.empty(), - flavors.getFlavorOrThrow("large"), Optional.empty(), NodeType.host)); - nodes.add(createNode("dockerhost6", "dockerhost6.yahoo.com", ipConfig(105, 1, 3), Optional.empty(), - flavors.getFlavorOrThrow("large"), Optional.empty(), NodeType.host)); + nodes.add(Node.create("dockerhost1", ipConfig(100, 1, 3), "dockerhost1.yahoo.com", + flavors.getFlavorOrThrow("large"), NodeType.host).build()); + nodes.add(Node.create("dockerhost2", ipConfig(101, 1, 3), "dockerhost2.yahoo.com", + flavors.getFlavorOrThrow("large"), NodeType.host).build()); + nodes.add(Node.create("dockerhost3", ipConfig(102, 1, 3), "dockerhost3.yahoo.com", + flavors.getFlavorOrThrow("large"), NodeType.host).build()); + nodes.add(Node.create("dockerhost4", ipConfig(103, 1, 3), "dockerhost4.yahoo.com", + flavors.getFlavorOrThrow("large"), NodeType.host).build()); + nodes.add(Node.create("dockerhost5", ipConfig(104, 1, 3), "dockerhost5.yahoo.com", + flavors.getFlavorOrThrow("large"), NodeType.host).build()); + nodes.add(Node.create("dockerhost6", ipConfig(105, 1, 3), "dockerhost6.yahoo.com", + flavors.getFlavorOrThrow("large"), NodeType.host).build()); // Config servers - nodes.add(createNode("cfg1", "cfg1.yahoo.com", ipConfig(201), Optional.empty(), - flavors.getFlavorOrThrow("default"), Optional.empty(), NodeType.config)); - nodes.add(createNode("cfg2", "cfg2.yahoo.com", ipConfig(202), Optional.empty(), - flavors.getFlavorOrThrow("default"), Optional.empty(), NodeType.config)); + nodes.add(Node.create("cfg1", ipConfig(201), "cfg1.yahoo.com", flavors.getFlavorOrThrow("default"), NodeType.config).build()); + nodes.add(Node.create("cfg2", ipConfig(202), "cfg2.yahoo.com", flavors.getFlavorOrThrow("default"), NodeType.config).build()); // Ready all nodes, except 7 and 55 nodes = addNodes(nodes, Agent.system); @@ -186,10 +181,8 @@ public class MockNodeRepository extends NodeRepository { activate(provisioner.prepare(app3, cluster3, Capacity.from(new ClusterResources(2, 1, new NodeResources(1, 4, 100, 1)), false, true), null), app3, provisioner); List<Node> largeNodes = new ArrayList<>(); - largeNodes.add(createNode("node13", "host13.yahoo.com", ipConfig(13), Optional.empty(), - new Flavor(new NodeResources(10, 48, 500, 1, fast, local)), Optional.empty(), NodeType.tenant)); - largeNodes.add(createNode("node14", "host14.yahoo.com", ipConfig(14), Optional.empty(), - new Flavor(new NodeResources(10, 48, 500, 1, fast, local)), Optional.empty(), NodeType.tenant)); + largeNodes.add(Node.create("node13", ipConfig(13), "host13.yahoo.com", resources(10, 48, 500, 1, fast, local), NodeType.tenant).build()); + largeNodes.add(Node.create("node14", ipConfig(14), "host14.yahoo.com", resources(10, 48, 500, 1, fast, local), NodeType.tenant).build()); addNodes(largeNodes, Agent.system); setReady(largeNodes, Agent.system, getClass().getSimpleName()); ApplicationId app4 = ApplicationId.from(TenantName.from("tenant4"), ApplicationName.from("application4"), InstanceName.from("instance4")); @@ -240,4 +233,7 @@ public class MockNodeRepository extends NodeRepository { return ipConfig(nodeIndex, 1, 0); } + private static Flavor resources(double vcpu, double memoryGb, double diskGb, double bandwidthGbps, NodeResources.DiskSpeed diskSpeed, NodeResources.StorageType storageType) { + return new Flavor(new NodeResources(vcpu, memoryGb, diskGb, bandwidthGbps, diskSpeed, storageType)); + } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java index c966fc63ab9..f6ad119b80b 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java @@ -12,13 +12,14 @@ import com.yahoo.test.ManualClock; import com.yahoo.vespa.curator.mock.MockCurator; import com.yahoo.vespa.flags.InMemoryFlagSource; import com.yahoo.vespa.hosted.provision.node.Agent; +import com.yahoo.vespa.hosted.provision.node.IP; import com.yahoo.vespa.hosted.provision.provisioning.EmptyProvisionServiceProvider; import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; import com.yahoo.vespa.hosted.provision.testutils.MockNameResolver; -import java.util.Collections; import java.util.List; import java.util.Optional; +import java.util.Set; /** * @author bratseth @@ -55,21 +56,21 @@ public class NodeRepositoryTester { } public Node addHost(String id, String hostname, String flavor, NodeType type) { - Node node = nodeRepository.createNode(id, hostname, Optional.empty(), - nodeFlavors.getFlavorOrThrow(flavor), type); - return nodeRepository.addNodes(Collections.singletonList(node), Agent.system).get(0); + return addNode(id, hostname, null, nodeFlavors.getFlavorOrThrow(flavor), type); } public Node addNode(String id, String hostname, String parentHostname, String flavor, NodeType type) { - Node node = nodeRepository.createNode(id, hostname, Optional.of(parentHostname), - nodeFlavors.getFlavorOrThrow(flavor), type); - return nodeRepository.addNodes(Collections.singletonList(node), Agent.system).get(0); + return addNode(id, hostname, parentHostname, nodeFlavors.getFlavorOrThrow(flavor), type); } public Node addNode(String id, String hostname, String parentHostname, NodeResources resources) { - Node node = nodeRepository.createNode(id, hostname, Optional.of(parentHostname), - new Flavor(resources), NodeType.tenant); - return nodeRepository.addNodes(Collections.singletonList(node), Agent.system).get(0); + return addNode(id, hostname, parentHostname, new Flavor(resources), NodeType.tenant); + } + + private Node addNode(String id, String hostname, String parentHostname, Flavor flavor, NodeType type) { + IP.Config ipConfig = new IP.Config(nodeRepository.nameResolver().resolveAll(hostname), Set.of()); + Node node = Node.create(id, ipConfig, hostname, flavor, type).parentHostname(parentHostname).build(); + return nodeRepository.addNodes(List.of(node), Agent.system).get(0); } /** 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 10626fcb7df..86507508e68 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 @@ -149,9 +149,8 @@ public class CapacityCheckerTester { .collect(Collectors.toSet()); NodeResources nr = containingNodeResources(childResources, excessCapacity); - Node node = nodeRepository.createNode(hostname, hostname, - new IP.Config(Set.of("::"), availableIps), Optional.empty(), - new Flavor(nr), Optional.empty(), NodeType.host); + Node node = Node.create(hostname, new IP.Config(Set.of("::"), availableIps), hostname, + new Flavor(nr), NodeType.host).build(); hosts.computeIfAbsent(tenantHostApp, (ignored) -> new ArrayList<>()) .add(node); } @@ -169,10 +168,8 @@ public class CapacityCheckerTester { Set<String> availableIps = IntStream.range(2000, 2000 + ips) .mapToObj(n -> String.format("%04X::%04X", hostId, n)) .collect(Collectors.toSet()); - Node node = nodeRepository.createNode(hostname, - hostname, - new IP.Config(Set.of("::" + (1000 + hostId)), availableIps), Optional.empty(), - new Flavor(capacity), Optional.empty(), NodeType.host); + Node node = Node.create(hostname, new IP.Config(Set.of("::" + (1000 + hostId)), availableIps), hostname, + new Flavor(capacity), NodeType.host).build(); hosts.add(node); } return hosts; @@ -284,9 +281,10 @@ public class CapacityCheckerTester { nodeModel.fastDisk ? NodeResources.DiskSpeed.fast : NodeResources.DiskSpeed.slow); Flavor f = new Flavor(nr); - Node node = nodeRepository.createNode(nodeModel.id, nodeModel.hostname, - new IP.Config(nodeModel.ipAddresses, nodeModel.additionalIpAddresses), - nodeModel.parentHostname, f, Optional.empty(), nodeModel.type); + Node.Builder builder = Node.create(nodeModel.id, new IP.Config(nodeModel.ipAddresses, nodeModel.additionalIpAddresses), + nodeModel.hostname, f, nodeModel.type); + nodeModel.parentHostname.ifPresent(builder::parentHostname); + Node node = builder.build(); if (membership != null) { return node.allocate(owner, membership, node.resources(), 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 a7c04636662..a5cd922300c 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 @@ -190,20 +190,20 @@ public class MetricsReporterTest { Set<String> ipAddressPool = Set.of("::2", "::3", "::4", "::5"); Node dockerHost = Node.create("openStackId1", new IP.Config(Set.of("::1"), ipAddressPool), "dockerHost", - Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("host"), Optional.empty(), NodeType.host, Optional.empty()); + nodeFlavors.getFlavorOrThrow("host"), NodeType.host).build(); nodeRepository.addNodes(List.of(dockerHost), Agent.system); nodeRepository.dirtyRecursively("dockerHost", Agent.system, getClass().getSimpleName()); nodeRepository.setReady("dockerHost", Agent.system, getClass().getSimpleName()); Node container1 = Node.createDockerNode(Set.of("::2"), "container1", - "dockerHost", new NodeResources(1, 3, 2, 1), NodeType.tenant); + "dockerHost", new NodeResources(1, 3, 2, 1), NodeType.tenant).build(); container1 = container1.with(allocation(Optional.of("app1"), container1).get()); try (Mutex lock = nodeRepository.lockUnallocated()) { nodeRepository.addDockerNodes(new LockedNodeList(List.of(container1), lock)); } Node container2 = Node.createDockerNode(Set.of("::3"), "container2", - "dockerHost", new NodeResources(2, 4, 4, 1), NodeType.tenant); + "dockerHost", new NodeResources(2, 4, 4, 1), NodeType.tenant).build(); container2 = container2.with(allocation(Optional.of("app2"), container2).get()); try (Mutex lock = nodeRepository.lockUnallocated()) { nodeRepository.addDockerNodes(new LockedNodeList(List.of(container2), lock)); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java index 824ebe40ea8..cd9296c8624 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java @@ -232,8 +232,13 @@ public class NodeFailTester { private List<Node> createReadyNodes(int count, int startIndex, Optional<String> parentHostname, Flavor flavor, NodeType nodeType) { List<Node> nodes = new ArrayList<>(count); - for (int i = startIndex; i < startIndex + count; i++) - nodes.add(nodeRepository.createNode("node" + i, "host" + i, IP.Config.EMPTY, parentHostname, flavor, Optional.empty(), nodeType)); + for (int i = startIndex; i < startIndex + count; i++) { + String hostname = "host" + i; + IP.Config ipConfig = new IP.Config(nodeRepository.nameResolver().resolveAll(hostname), Set.of()); + Node.Builder builder = Node.create("node" + i, ipConfig, hostname, flavor, nodeType); + parentHostname.ifPresent(builder::parentHostname); + nodes.add(builder.build()); + } nodes = nodeRepository.addNodes(nodes, Agent.system); nodes = nodeRepository.setDirty(nodes, Agent.system, getClass().getSimpleName()); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainerTest.java index cd1b7fdc2ce..e276ea22ea2 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/SpareCapacityMaintainerTest.java @@ -31,7 +31,6 @@ import java.time.Duration; import java.time.Instant; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.IntStream; @@ -272,13 +271,8 @@ public class SpareCapacityMaintainerTest { private void addHosts(int count, NodeResources resources) { List<Node> hosts = new ArrayList<>(); for (int i = 0; i < count; i++) { - Node host = nodeRepository.createNode("host" + hostIndex, - "host" + hostIndex + ".yahoo.com", - ipConfig(hostIndex + nodeIndex, true), - Optional.empty(), - new Flavor(resources), - Optional.empty(), - NodeType.host); + Node host = Node.create("host" + hostIndex, ipConfig(hostIndex + nodeIndex, true), + "host" + hostIndex + ".yahoo.com", new Flavor(resources), NodeType.host).build(); hosts.add(host); hostIndex++; } @@ -294,13 +288,9 @@ public class SpareCapacityMaintainerTest { private void addNodes(int id, int count, NodeResources resources, int hostOffset) { List<Node> nodes = new ArrayList<>(); for (int i = 0; i < count; i++) { - Node node = nodeRepository.createNode("node" + nodeIndex, - "node" + nodeIndex + ".yahoo.com", - ipConfig(hostIndex + nodeIndex, false), - Optional.of("host" + ( hostOffset + i) + ".yahoo.com"), - new Flavor(resources), - Optional.empty(), - NodeType.tenant); + Node node = Node.create("node" + nodeIndex, ipConfig(hostIndex + nodeIndex, false), + "node" + nodeIndex + ".yahoo.com", new Flavor(resources), NodeType.tenant) + .parentHostname("host" + ( hostOffset + i) + ".yahoo.com").build(); nodes.add(node); nodeIndex++; } 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 bf83b074387..a209ea206d3 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 @@ -183,8 +183,7 @@ public class IPTest { private static Node createNode(Set<String> ipAddresses) { return Node.create("id1", new IP.Config(Set.of("127.0.0.1"), ipAddresses), - "host1", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("default"), - Optional.empty(), NodeType.host, Optional.empty()); + "host1", nodeFlavors.getFlavorOrThrow("default"), NodeType.host).build(); } } 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 1c854068b27..4ee41110aac 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 @@ -229,7 +229,9 @@ public class NodeSerializerTest { @Test public void serialize_parentHostname() { final String parentHostname = "parent.yahoo.com"; - 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"), Optional.empty(), NodeType.tenant, Optional.empty()); + Node node = Node.create("myId", new IP.Config(Set.of("127.0.0.1"), Set.of()), "myHostname", nodeFlavors.getFlavorOrThrow("default"), NodeType.tenant) + .parentHostname(parentHostname) + .build(); Node deserializedNode = nodeSerializer.fromJson(State.provisioned, nodeSerializer.toJson(node)); assertEquals(parentHostname, deserializedNode.parentHostname().get()); @@ -447,11 +449,8 @@ public class NodeSerializerTest { return Node.create("myId", new IP.Config(Set.of("127.0.0.1"), Set.of()), "myHostname", - Optional.empty(), - Optional.empty(), nodeFlavors.getFlavorOrThrow("default"), - Optional.empty(), NodeType.tenant, - Optional.empty()); + NodeType.tenant).build(); } } 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 1517a9c1993..8edc836a090 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 @@ -510,8 +510,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", new IP.Config(Set.of("127.0.233." + index), Set.of()), hostname, - Optional.of(parentHostname), Optional.empty(), new Flavor(flavor), Optional.empty(), NodeType.tenant, Optional.empty() - ); + new Flavor(flavor), NodeType.tenant).parentHostname(parentHostname).build(); 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, node1a.resources(), Instant.now()); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacityTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacityTest.java index f831f2d501b..4891387e9e8 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacityTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacityTest.java @@ -14,7 +14,6 @@ import org.junit.Test; import java.util.ArrayList; import java.util.LinkedHashSet; import java.util.List; -import java.util.Optional; import java.util.Set; import static org.junit.Assert.assertEquals; @@ -44,20 +43,20 @@ public class HostCapacityTest { NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("host", "docker", "docker2"); // Create three docker hosts - host1 = Node.create("host1", new IP.Config(Set.of("::1"), generateIPs(2, 4)), "host1", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("host"), Optional.empty(), NodeType.host, Optional.empty()); - host2 = Node.create("host2", new IP.Config(Set.of("::11"), generateIPs(12, 3)), "host2", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("host"), Optional.empty(), NodeType.host, Optional.empty()); - host3 = Node.create("host3", new IP.Config(Set.of("::21"), generateIPs(22, 1)), "host3", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("host"), Optional.empty(), NodeType.host, Optional.empty()); + host1 = Node.create("host1", new IP.Config(Set.of("::1"), generateIPs(2, 4)), "host1", nodeFlavors.getFlavorOrThrow("host"), NodeType.host).build(); + host2 = Node.create("host2", new IP.Config(Set.of("::11"), generateIPs(12, 3)), "host2", nodeFlavors.getFlavorOrThrow("host"), NodeType.host).build(); + host3 = Node.create("host3", new IP.Config(Set.of("::21"), generateIPs(22, 1)), "host3", nodeFlavors.getFlavorOrThrow("host"), NodeType.host).build(); // Add two containers to host1 - var nodeA = Node.createDockerNode(Set.of("::2"), "nodeA", "host1", resources1, NodeType.tenant); - var nodeB = Node.createDockerNode(Set.of("::3"), "nodeB", "host1", resources1, NodeType.tenant); + var nodeA = Node.createDockerNode(Set.of("::2"), "nodeA", "host1", resources1, NodeType.tenant).build(); + var nodeB = Node.createDockerNode(Set.of("::3"), "nodeB", "host1", resources1, NodeType.tenant).build(); // Add two containers to host 2 (same as host 1) - var nodeC = Node.createDockerNode(Set.of("::12"), "nodeC", "host2", resources1, NodeType.tenant); - var nodeD = Node.createDockerNode(Set.of("::13"), "nodeD", "host2", resources1, NodeType.tenant); + var nodeC = Node.createDockerNode(Set.of("::12"), "nodeC", "host2", resources1, NodeType.tenant).build(); + var nodeD = Node.createDockerNode(Set.of("::13"), "nodeD", "host2", resources1, NodeType.tenant).build(); // Add a larger container to host3 - var nodeE = Node.createDockerNode(Set.of("::22"), "nodeE", "host3", resources2, NodeType.tenant); + var nodeE = Node.createDockerNode(Set.of("::22"), "nodeE", "host3", resources2, NodeType.tenant).build(); // init docker host capacity nodes = new ArrayList<>(List.of(host1, host2, host3, nodeA, nodeB, nodeC, nodeD, nodeE)); @@ -74,7 +73,7 @@ public class HostCapacityTest { assertFalse(capacity.hasCapacity(host3, resources2)); // No ip available // Add a new node to host1 to deplete the memory resource - Node nodeF = Node.createDockerNode(Set.of("::6"), "nodeF", "host1", resources1, NodeType.tenant); + Node nodeF = Node.createDockerNode(Set.of("::6"), "nodeF", "host1", resources1, NodeType.tenant).build(); nodes.add(nodeF); capacity = new HostCapacity(new LockedNodeList(nodes, () -> {}), hostResourcesCalculator); assertFalse(capacity.hasCapacity(host1, resources1)); @@ -111,15 +110,15 @@ public class HostCapacityTest { // Dev host can assign both configserver and tenant containers. var nodeFlavors = FlavorConfigBuilder.createDummies("devhost", "container"); - var devHost = Node.create("devhost", new IP.Config(Set.of("::1"), generateIPs(2, 10)), "devhost", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("devhost"), Optional.empty(), NodeType.devhost, Optional.empty()); + var devHost = Node.create("devhost", new IP.Config(Set.of("::1"), generateIPs(2, 10)), "devhost", nodeFlavors.getFlavorOrThrow("devhost"), NodeType.devhost).build(); - var cfg = Node.createDockerNode(Set.of("::2"), "cfg", "devhost", resources1, NodeType.config); + var cfg = Node.createDockerNode(Set.of("::2"), "cfg", "devhost", resources1, NodeType.config).build(); var nodes = new ArrayList<>(List.of(cfg)); var capacity = new HostCapacity(new LockedNodeList(nodes, () -> {}), hostResourcesCalculator); assertTrue(capacity.hasCapacity(devHost, resources1)); - var container1 = Node.createDockerNode(Set.of("::3"), "container1", "devhost", resources1, NodeType.tenant); + var container1 = Node.createDockerNode(Set.of("::3"), "container1", "devhost", resources1, NodeType.tenant).build(); nodes = new ArrayList<>(List.of(cfg, container1)); capacity = new HostCapacity(new LockedNodeList(nodes, () -> {}), hostResourcesCalculator); assertFalse(capacity.hasCapacity(devHost, resources1)); 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 8d972cc8f40..2ec03db7e9d 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 @@ -430,13 +430,9 @@ public class ProvisioningTester { nameResolver.addRecord(String.format("node-%d-of-%s", poolIp, hostname), ipv4Addr); } } - nodes.add(nodeRepository.createNode(hostname, - hostname, - new IP.Config(hostIps, ipAddressPool), - Optional.empty(), - flavor, - reservedTo, - type)); + Node.Builder builder = Node.create(hostname, new IP.Config(hostIps, ipAddressPool), hostname, flavor, type); + reservedTo.ifPresent(builder::reservedTo); + nodes.add(builder.build()); } nodes = nodeRepository.addNodes(nodes, Agent.system); return nodes; @@ -451,13 +447,8 @@ public class ProvisioningTester { String ipv4 = "127.0.1." + i; nameResolver.addRecord(hostname, ipv4); - Node node = nodeRepository.createNode(hostname, - hostname, - new IP.Config(Set.of(ipv4), Set.of()), - Optional.empty(), - nodeFlavors.getFlavorOrThrow(flavor), - Optional.empty(), - NodeType.config); + Node node = Node.create(hostname, new IP.Config(Set.of(ipv4), Set.of()), hostname, + nodeFlavors.getFlavorOrThrow(flavor), NodeType.config).build(); nodes.add(node); } @@ -522,8 +513,11 @@ public class ProvisioningTester { List<Node> nodes = new ArrayList<>(count); for (int i = startIndex; i < count + startIndex; i++) { String hostname = nodeNamer.apply(i); - nodes.add(nodeRepository.createNode("node-id", hostname, IP.Config.EMPTY, parentHostname, - new Flavor(resources), Optional.empty(), NodeType.tenant)); + IP.Config ipConfig = new IP.Config(nodeRepository.nameResolver().resolveAll(hostname), Set.of()); + + Node.Builder builder = Node.create("node-id", ipConfig, hostname, new Flavor(resources), NodeType.tenant); + parentHostname.ifPresent(builder::parentHostname); + nodes.add(builder.build()); } nodes = nodeRepository.addNodes(nodes, Agent.system); nodes = nodeRepository.setDirty(nodes, Agent.system, getClass().getSimpleName()); |