diff options
author | Jon Bratseth <bratseth@verizonmedia.com> | 2019-05-06 15:01:01 +0200 |
---|---|---|
committer | Jon Bratseth <bratseth@verizonmedia.com> | 2019-05-06 15:01:01 +0200 |
commit | 8811deacab3f0e7504fdcbf2607566622afee26c (patch) | |
tree | e8ad5a5b96c03402c6a3a9e5de1428af68c3e416 /node-repository | |
parent | 3e4376f962d2c4d4291a1dc49c745e12e75b93fb (diff) |
Create nodes by resources
Diffstat (limited to 'node-repository')
11 files changed, 42 insertions, 63 deletions
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 18ff2700b21..67f1b5e948f 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 @@ -5,6 +5,7 @@ import com.google.common.collect.ImmutableSet; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ClusterMembership; 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.Agent; import com.yahoo.vespa.hosted.provision.node.Allocation; @@ -48,9 +49,9 @@ public final class Node { private 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, Flavor flavor, NodeType type) { - return new Node("fake-" + hostname, ipAddresses, ipAddressPool, hostname, parentHostname, flavor, Status.initial(), State.reserved, - Optional.empty(), History.empty(), type, new Reports(), Optional.empty()); + public static Node createDockerNode(Set<String> ipAddresses, Set<String> ipAddressPool, String hostname, Optional<String> parentHostname, NodeResources resources, NodeType type) { + return new Node("fake-" + hostname, ipAddresses, ipAddressPool, hostname, 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) */ diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java index cff62508ec6..77872fc1435 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java @@ -31,19 +31,6 @@ public class FlavorConfigBuilder { return flavor; } - public FlavorsConfig.Flavor.Builder addNonStockFlavor(String flavorName, double cpu, double mem, double disk, Flavor.Type type) { - FlavorsConfig.Flavor.Builder flavor = new FlavorsConfig.Flavor.Builder(); - flavor.name(flavorName); - flavor.description("Flavor-name-is-" + flavorName); - flavor.minDiskAvailableGb(disk); - flavor.minCpuCores(cpu); - flavor.minMainMemoryAvailableGb(mem); - flavor.stock(false); - flavor.environment(type.name()); - builder.flavor(flavor); - return flavor; - } - public void addReplaces(String replaces, FlavorsConfig.Flavor.Builder flavor) { FlavorsConfig.Flavor.Replaces.Builder flavorReplaces = new FlavorsConfig.Flavor.Replaces.Builder(); flavorReplaces.name(replaces); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostProvisioner.java index d2ea0a1f3c8..af933d0a8f0 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostProvisioner.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostProvisioner.java @@ -17,13 +17,12 @@ public interface HostProvisioner { /** * Schedule provisioning of a given number of hosts. * - * @param provisionIndexes List of unique provision indexes which will be used to generate the host hostnames + * @param provisionIndexes List of unique provision indexes which will be used to generate the node hostnames * on the form of <code>[prefix][index].[domain]</code> - * @param flavor the spec of the flavor (capacity) to provision. The resulting provisioned host - * will be of a flavor that is at least as big or bigger than this. - * @return list of {@link ProvisionedHost} describing the provisioned hosts and nodes on them. + * @param resources the resources needed per node + * @return list of {@link ProvisionedHost} describing the provisioned nodes */ - List<ProvisionedHost> provisionHosts(List<Integer> provisionIndexes, NodeResources flavor); + List<ProvisionedHost> provisionHosts(List<Integer> provisionIndexes, NodeResources resources); /** * Continue provisioning of given list of Nodes. diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java index 22242cf8963..d4527452e9c 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java @@ -286,7 +286,7 @@ class NodeAllocation { return Optional.of(requestedNodes) .filter(NodeSpec.CountNodeSpec.class::isInstance) .map(NodeSpec.CountNodeSpec.class::cast) - .map(spec -> new FlavorCount(spec.getFlavor(), spec.fulfilledDeficitCount(acceptedOfRequestedFlavor))) + .map(spec -> new FlavorCount(spec.resources(), spec.fulfilledDeficitCount(acceptedOfRequestedFlavor))) .filter(flavorCount -> ! flavorCount.getFlavor().allocateByLegacyName()) .filter(flavorCount -> flavorCount.getCount() > 0); } 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 3cac1d843ad..288a24a0d89 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 @@ -147,7 +147,7 @@ class NodePrioritizer { void addNewDockerNodesOn(Mutex allocationLock, NodeList candidates) { if ( ! isDocker) return; - ResourceCapacity wantedResourceCapacity = ResourceCapacity.of(getFlavor(requestedNodes)); + ResourceCapacity wantedResourceCapacity = ResourceCapacity.of(resources(requestedNodes)); for (Node node : candidates) { if (node.type() != NodeType.host) continue; @@ -174,7 +174,7 @@ class NodePrioritizer { Collections.emptySet(), allocation.get().hostname(), Optional.of(node.hostname()), - new Flavor(getFlavor(requestedNodes)), + resources(requestedNodes), NodeType.tenant); PrioritizableNode nodePri = toNodePriority(newNode, false, true); if ( ! nodePri.violatesSpares || isAllocatingForReplacement) { @@ -234,7 +234,7 @@ class NodePrioritizer { /** Needed to handle requests for legacy non-docker nodes only */ private boolean preferredOnLegacyFlavor(Node node) { if (requestedNodes instanceof NodeSpec.CountNodeSpec) { - NodeResources requestedNodeResources = ((NodeSpec.CountNodeSpec)requestedNodes).getFlavor(); + NodeResources requestedNodeResources = ((NodeSpec.CountNodeSpec)requestedNodes).resources(); if (requestedNodeResources.allocateByLegacyName()) { Flavor requestedFlavor = flavors.getFlavorOrThrow(requestedNodeResources.legacyName().get()); return ! requestedFlavor.isStock() && node.flavor().equals(requestedFlavor); @@ -257,16 +257,16 @@ class NodePrioritizer { return requestedNodes.fulfilledBy(nofNodesInCluster - nodeFailedNodes); } - private static NodeResources getFlavor(NodeSpec requestedNodes) { + private static NodeResources resources(NodeSpec requestedNodes) { if (requestedNodes instanceof NodeSpec.CountNodeSpec) { NodeSpec.CountNodeSpec countSpec = (NodeSpec.CountNodeSpec) requestedNodes; - return countSpec.getFlavor(); + return countSpec.resources(); } return null; } private boolean isDocker() { - NodeResources flavor = getFlavor(requestedNodes); + NodeResources flavor = resources(requestedNodes); return (flavor != null) && ! flavor.allocateByLegacyName(); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java index 4cc7ed7898b..ab48e82fbed 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java @@ -80,7 +80,7 @@ public interface NodeSpec { this.canFail = canFail; } - public NodeResources getFlavor() { + public NodeResources resources() { return requestedNodeResources; } 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 4f729bdd03b..401cbb0c654 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 @@ -2,6 +2,7 @@ package com.yahoo.vespa.hosted.provision.provisioning; 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; @@ -20,14 +21,14 @@ public class ProvisionedHost { private final String hostHostname; private final Flavor hostFlavor; private final String nodeHostname; - private final Flavor nodeFlavor; + private final NodeResources nodeResources; - public ProvisionedHost(String id, String hostHostname, Flavor hostFlavor, String nodeHostname, Flavor nodeFlavor) { + public ProvisionedHost(String id, String hostHostname, Flavor hostFlavor, String nodeHostname, NodeResources nodeResources) { this.id = Objects.requireNonNull(id, "Host id must be set"); this.hostHostname = Objects.requireNonNull(hostHostname, "Host hostname must be set"); this.hostFlavor = Objects.requireNonNull(hostFlavor, "Host flavor must be set"); this.nodeHostname = Objects.requireNonNull(nodeHostname, "Node hostname must be set"); - this.nodeFlavor = Objects.requireNonNull(nodeFlavor, "Node flavor must be set"); + this.nodeResources = Objects.requireNonNull(nodeResources, "Node resources must be set"); } /** Generate {@link Node} instance representing the provisioned physical host */ @@ -37,7 +38,7 @@ public class ProvisionedHost { /** 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), nodeFlavor, NodeType.tenant); + return Node.createDockerNode(Set.of(), Set.of(), nodeHostname, Optional.of(hostHostname), nodeResources, NodeType.tenant); } public String getId() { @@ -56,10 +57,6 @@ public class ProvisionedHost { return nodeHostname; } - public Flavor getNodeFlavor() { - return nodeFlavor; - } - @Override public boolean equals(Object o) { if (this == o) return true; @@ -69,12 +66,12 @@ public class ProvisionedHost { hostHostname.equals(that.hostHostname) && hostFlavor.equals(that.hostFlavor) && nodeHostname.equals(that.nodeHostname) && - nodeFlavor.equals(that.nodeFlavor); + nodeResources.equals(that.nodeResources); } @Override public int hashCode() { - return Objects.hash(id, hostHostname, hostFlavor, nodeHostname, nodeFlavor); + return Objects.hash(id, hostHostname, hostFlavor, nodeHostname, nodeResources); } @Override @@ -84,7 +81,7 @@ public class ProvisionedHost { ", hostHostname='" + hostHostname + '\'' + ", hostFlavor=" + hostFlavor + ", nodeHostname='" + nodeHostname + '\'' + - ", nodeFlavor=" + nodeFlavor + + ", nodeResources=" + nodeResources + '}'; } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/monitoring/MetricsReporterTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/monitoring/MetricsReporterTest.java index 14a870270a4..48fbce64a4b 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/monitoring/MetricsReporterTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/monitoring/MetricsReporterTest.java @@ -7,6 +7,7 @@ import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ClusterMembership; import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.NodeFlavors; +import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.Zone; import com.yahoo.jdisc.Metric; @@ -121,16 +122,19 @@ public class MetricsReporterTest { // Allow 4 containers Set<String> ipAddressPool = ImmutableSet.of("::2", "::3", "::4", "::5"); - Node dockerHost = Node.create("openStackId1", Collections.singleton("::1"), ipAddressPool, "dockerHost", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("host"), NodeType.host); + Node dockerHost = Node.create("openStackId1", Collections.singleton("::1"), ipAddressPool, "dockerHost", + Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("host"), NodeType.host); nodeRepository.addNodes(Collections.singletonList(dockerHost)); nodeRepository.dirtyRecursively("dockerHost", Agent.system, getClass().getSimpleName()); nodeRepository.setReady("dockerHost", Agent.system, getClass().getSimpleName()); - Node container1 = Node.createDockerNode(Collections.singleton("::2"), Collections.emptySet(), "container1", Optional.of("dockerHost"), nodeFlavors.getFlavorOrThrow("docker"), NodeType.tenant); + Node container1 = Node.createDockerNode(Collections.singleton("::2"), Collections.emptySet(), "container1", + Optional.of("dockerHost"), new NodeResources(1, 3, 2), NodeType.tenant); container1 = container1.with(allocation(Optional.of("app1")).get()); nodeRepository.addDockerNodes(Collections.singletonList(container1), nodeRepository.lockAllocation()); - Node container2 = Node.createDockerNode(Collections.singleton("::3"), Collections.emptySet(), "container2", Optional.of("dockerHost"), nodeFlavors.getFlavorOrThrow("docker2"), NodeType.tenant); + Node container2 = Node.createDockerNode(Collections.singleton("::3"), Collections.emptySet(), "container2", + Optional.of("dockerHost"), new NodeResources(2, 4, 4), NodeType.tenant); container2 = container2.with(allocation(Optional.of("app2")).get()); nodeRepository.addDockerNodes(Collections.singletonList(container2), nodeRepository.lockAllocation()); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java index 5877de7913f..121819700ea 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java @@ -125,9 +125,9 @@ public class DynamicDockerProvisionTest { private static void mockHostProvisioner(HostProvisioner hostProvisioner, Flavor hostFlavor) { doAnswer(invocation -> { List<Integer> provisionIndexes = (List<Integer>) invocation.getArguments()[0]; - NodeResources nodeFlavor = (NodeResources) invocation.getArguments()[1]; + NodeResources nodeResources = (NodeResources) invocation.getArguments()[1]; return provisionIndexes.stream() - .map(i -> new ProvisionedHost("id-" + i, "host-" + i, hostFlavor, "host-" + i + "-1", new Flavor(nodeFlavor))) + .map(i -> new ProvisionedHost("id-" + i, "host-" + i, hostFlavor, "host-" + i + "-1", nodeResources)) .collect(Collectors.toList()); }).when(hostProvisioner).provisionHosts(any(), any()); } 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 f7caea060ad..b2b80c6f4e4 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 @@ -7,6 +7,7 @@ import com.yahoo.config.provision.ClusterMembership; 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; import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.vespa.hosted.provision.Node; @@ -31,20 +32,20 @@ public class NodePrioritizerTest { public void relocated_nodes_are_preferred() { List<Node> nodes = new ArrayList<>(); Node parent = createParent("parent"); - Node b = createNode(parent, "b", "d2"); + Node b = createNode(parent, "b", new NodeResources(2, 2, 2)); nodes.add(b); // Only one node - should be obvious what to prefer Assert.assertTrue(NodePrioritizer.isPreferredNodeToBeRelocated(nodes, b, parent)); // Two equal nodes - choose lexically - Node a = createNode(parent, "a", "d2"); + Node a = createNode(parent, "a", new NodeResources(2, 2, 2)); nodes.add(a); Assert.assertTrue(NodePrioritizer.isPreferredNodeToBeRelocated(nodes, a, parent)); Assert.assertFalse(NodePrioritizer.isPreferredNodeToBeRelocated(nodes, b, parent)); // Smallest node should be preferred - Node c = createNode(parent, "c", "d1"); + Node c = createNode(parent, "c", new NodeResources(1, 1, 1)); nodes.add(c); Assert.assertTrue(NodePrioritizer.isPreferredNodeToBeRelocated(nodes, c, parent)); @@ -53,7 +54,7 @@ public class NodePrioritizerTest { c = c.allocate(ApplicationId.defaultId(), ClusterMembership.from(spec, 0), Instant.now()); nodes.remove(c); nodes.add(c); - Node d = createNode(parent, "d", "d1"); + Node d = createNode(parent, "d", new NodeResources(1, 1, 1)); nodes.add(d); Assert.assertTrue(NodePrioritizer.isPreferredNodeToBeRelocated(nodes, d, parent)); Assert.assertFalse(NodePrioritizer.isPreferredNodeToBeRelocated(nodes, c, parent)); @@ -67,9 +68,9 @@ public class NodePrioritizerTest { Assert.assertTrue(NodePrioritizer.isPreferredNodeToBeRelocated(nodes, d, parent)); } - private static Node createNode(Node parent, String hostname, String flavor) { + 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()), - flavors.getFlavorOrThrow(flavor), NodeType.tenant); + resources, NodeType.tenant); } private static Node createParent(String hostname) { @@ -80,8 +81,6 @@ public class NodePrioritizerTest { private static FlavorsConfig flavorsConfig() { FlavorConfigBuilder b = new FlavorConfigBuilder(); b.addFlavor("host-large", 6., 6., 6, Flavor.Type.BARE_METAL); - b.addFlavor("d1", 1, 1., 1, Flavor.Type.DOCKER_CONTAINER); - b.addFlavor("d2", 2, 2., 2, Flavor.Type.DOCKER_CONTAINER); return b.build(); } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/filter/NodeIdentifierTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/filter/NodeIdentifierTest.java index 2a9a1c4fa3b..914a2e62164 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/filter/NodeIdentifierTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/filter/NodeIdentifierTest.java @@ -6,13 +6,12 @@ import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ClusterMembership; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.Environment; -import com.yahoo.config.provision.Flavor; +import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.Zone; import com.yahoo.config.provisioning.ConfigServerSecurityConfig; -import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.security.KeyUtils; import com.yahoo.security.Pkcs10Csr; import com.yahoo.security.Pkcs10CsrBuilder; @@ -22,7 +21,6 @@ import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeRepositoryTester; import com.yahoo.vespa.hosted.provision.node.Allocation; import com.yahoo.vespa.hosted.provision.node.Generation; -import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -243,7 +241,7 @@ public class NodeIdentifierTest { emptySet(), HOSTNAME, Optional.of("parenthost"), - new Flavor(createFlavourConfig().flavor(0)), + new NodeResources(1, 2, 50), NodeType.tenant) .with( new Allocation( @@ -271,10 +269,4 @@ public class NodeIdentifierTest { } - private static FlavorsConfig createFlavourConfig() { - FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor("docker", 1., 2., 50, Flavor.Type.DOCKER_CONTAINER).cost(1); - return b.build(); - } - } |