use of com.yahoo.vespa.hosted.provision.Node in project vespa by vespa-engine.
the class AclProvisioningTest method trusted_nodes_for_config_server.
@Test
public void trusted_nodes_for_config_server() {
List<Node> configServers = setConfigServers("cfg1:1234,cfg2:1234,cfg3:1234");
// Populate repo
tester.makeReadyNodes(10, "default");
List<Node> proxyNodes = tester.makeReadyNodes(3, "default", NodeType.proxy);
// Allocate 2 nodes
allocateNodes(4);
List<Node> tenantNodes = tester.nodeRepository().getNodes(NodeType.tenant);
// Get trusted nodes for the first config server
Node node = tester.nodeRepository().getConfigNode("cfg1").orElseThrow(() -> new RuntimeException("Failed to find cfg1"));
List<NodeAcl> nodeAcls = tester.nodeRepository().getNodeAcls(node, false);
// Trusted nodes is all tenant nodes, all proxy nodes and all config servers
assertAcls(Arrays.asList(tenantNodes, proxyNodes, configServers), nodeAcls);
}
use of com.yahoo.vespa.hosted.provision.Node in project vespa by vespa-engine.
the class AclProvisioningTest method trusted_nodes_for_child_nodes_of_docker_host.
@Test
public void trusted_nodes_for_child_nodes_of_docker_host() {
List<Node> configServers = setConfigServers("cfg1:1234,cfg2:1234,cfg3:1234");
// Populate repo
List<Node> dockerHostNodes = tester.makeReadyNodes(2, "default", NodeType.host);
Node dockerHostNodeUnderTest = dockerHostNodes.get(0);
List<Node> dockerNodes = tester.makeReadyDockerNodes(5, "dockerSmall", dockerHostNodeUnderTest.hostname());
List<NodeAcl> acls = tester.nodeRepository().getNodeAcls(dockerHostNodeUnderTest, true);
// ACLs for each container on the Docker host
assertFalse(dockerNodes.isEmpty());
assertEquals(dockerNodes.size(), acls.size());
for (Node dockerNode : dockerNodes) {
NodeAcl nodeAcl = acls.stream().filter(acl -> acl.node().equals(dockerNode)).findFirst().orElseThrow(() -> new RuntimeException("Expected to find ACL for node " + dockerNode.hostname()));
assertEquals(dockerHostNodeUnderTest.hostname(), dockerNode.parentHostname().get());
assertAcls(Arrays.asList(configServers, dockerNodes), nodeAcl);
}
}
use of com.yahoo.vespa.hosted.provision.Node in project vespa by vespa-engine.
the class DockerHostCapacityTest method hasCapacity.
@Test
public void hasCapacity() {
assertTrue(capacity.hasCapacity(host1, ResourceCapacity.of(flavorDocker)));
assertTrue(capacity.hasCapacity(host1, ResourceCapacity.of(flavorDocker2)));
assertTrue(capacity.hasCapacity(host2, ResourceCapacity.of(flavorDocker)));
assertTrue(capacity.hasCapacity(host2, ResourceCapacity.of(flavorDocker2)));
// No ip available
assertFalse(capacity.hasCapacity(host3, ResourceCapacity.of(flavorDocker)));
// No ip available
assertFalse(capacity.hasCapacity(host3, ResourceCapacity.of(flavorDocker2)));
// Add a new node to host1 to deplete the memory resource
Node nodeF = Node.create("nodeF", Collections.singleton("::6"), Collections.emptySet(), "nodeF", Optional.of("host1"), flavorDocker, NodeType.tenant);
nodes.add(nodeF);
capacity = new DockerHostCapacity(nodes);
assertFalse(capacity.hasCapacity(host1, ResourceCapacity.of(flavorDocker)));
assertFalse(capacity.hasCapacity(host1, ResourceCapacity.of(flavorDocker2)));
}
use of com.yahoo.vespa.hosted.provision.Node in project vespa by vespa-engine.
the class DynamicDockerProvisioningTest method relocate_nodes_from_headroom_hosts.
/**
* Test relocation of nodes that violate headroom.
* <p>
* Setup 4 docker hosts and allocate one container on each (from two different applications)
* No spares - only headroom (4xd-2)
* <p>
* One application is now violating headroom and need relocation
* <p>
* Initial allocation of app 1 and 2 --> final allocation (headroom marked as H):
* <p>
* | H | H | H | H | | | | | |
* | H | H | H1a | H1b | --> | | | | |
* | | | 2a | 2b | | 1a | 1b | 2a | 2b |
*/
@Test
public void relocate_nodes_from_headroom_hosts() {
ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.perf, RegionName.from("us-east")), flavorsConfig(true));
tester.makeReadyNodes(4, "host-small", NodeType.host, 32);
deployZoneApp(tester);
List<Node> dockerHosts = tester.nodeRepository().getNodes(NodeType.host, Node.State.active);
Flavor flavor = tester.nodeRepository().getAvailableFlavors().getFlavorOrThrow("d-1");
// Application 1
ApplicationId application1 = makeApplicationId("t1", "a1");
ClusterSpec clusterSpec1 = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("myContent"), Version.fromString("6.100"), false);
addAndAssignNode(application1, "1a", dockerHosts.get(2).hostname(), flavor, 0, tester);
addAndAssignNode(application1, "1b", dockerHosts.get(3).hostname(), flavor, 1, tester);
// Application 2
ApplicationId application2 = makeApplicationId("t2", "a2");
ClusterSpec clusterSpec2 = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("myContent"), Version.fromString("6.100"), false);
addAndAssignNode(application2, "2a", dockerHosts.get(2).hostname(), flavor, 0, tester);
addAndAssignNode(application2, "2b", dockerHosts.get(3).hostname(), flavor, 1, tester);
// Redeploy one of the applications
deployapp(application1, clusterSpec1, flavor, tester, 2);
// Assert that the nodes are spread across all hosts (to allow headroom)
Set<String> hostsWithChildren = new HashSet<>();
for (Node node : tester.nodeRepository().getNodes(NodeType.tenant, Node.State.active)) {
if (!isInactiveOrRetired(node)) {
hostsWithChildren.add(node.parentHostname().get());
}
}
Assert.assertEquals(4, hostsWithChildren.size());
}
use of com.yahoo.vespa.hosted.provision.Node in project vespa by vespa-engine.
the class DynamicDockerProvisioningTest method new_docker_nodes_are_marked_as_headroom_violations.
/**
* Test that new docker nodes that will result in headroom violations are
* correctly marked as this.
* <p>
* When redeploying app1 - should not do anything (as moving app1 to host 0 and 1 would violate headroom).
* Then redeploy app 2 - should cause a relocation.
* <p>
* | H | H | H2a | H2b | | H | H | H | H |
* | H | H | H1a | H1b | --> | H | H | H1a | H1b |
* | | | 1a | 1b | | 2a | 2b | 1a | 1b |
*/
@Test
public void new_docker_nodes_are_marked_as_headroom_violations() {
ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.perf, RegionName.from("us-east")), flavorsConfig(true));
tester.makeReadyNodes(4, "host-small", NodeType.host, 32);
deployZoneApp(tester);
List<Node> dockerHosts = tester.nodeRepository().getNodes(NodeType.host, Node.State.active);
Flavor flavorD2 = tester.nodeRepository().getAvailableFlavors().getFlavorOrThrow("d-2");
Flavor flavorD1 = tester.nodeRepository().getAvailableFlavors().getFlavorOrThrow("d-1");
// Application 1
ApplicationId application1 = makeApplicationId("t1", "1");
ClusterSpec clusterSpec1 = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("myContent"), Version.fromString("6.100"), false);
String hostParent2 = dockerHosts.get(2).hostname();
String hostParent3 = dockerHosts.get(3).hostname();
addAndAssignNode(application1, "1a", hostParent2, flavorD2, 0, tester);
addAndAssignNode(application1, "1b", hostParent3, flavorD2, 1, tester);
// Application 2
ApplicationId application2 = makeApplicationId("t2", "2");
ClusterSpec clusterSpec2 = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("myContent"), Version.fromString("6.100"), false);
addAndAssignNode(application2, "2a", hostParent2, flavorD1, 0, tester);
addAndAssignNode(application2, "2b", hostParent3, flavorD1, 1, tester);
// Assert allocation placement - prior to re-deployment
assertApplicationHosts(tester.nodeRepository().getNodes(application1), hostParent2, hostParent3);
assertApplicationHosts(tester.nodeRepository().getNodes(application2), hostParent2, hostParent3);
// Redeploy application 1
deployapp(application1, clusterSpec1, flavorD2, tester, 2);
// Re-assert allocation placement
assertApplicationHosts(tester.nodeRepository().getNodes(application1), hostParent2, hostParent3);
assertApplicationHosts(tester.nodeRepository().getNodes(application2), hostParent2, hostParent3);
// Redeploy application 2
deployapp(application2, clusterSpec2, flavorD1, tester, 2);
// Now app2 should have re-located
assertApplicationHosts(tester.nodeRepository().getNodes(application1), hostParent2, hostParent3);
assertApplicationHosts(tester.nodeRepository().getNodes(application2), dockerHosts.get(0).hostname(), dockerHosts.get(1).hostname());
}
Aggregations