Search in sources :

Example 31 with Node

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);
}
Also used : Node(com.yahoo.vespa.hosted.provision.Node) NodeAcl(com.yahoo.vespa.hosted.provision.node.NodeAcl) Test(org.junit.Test)

Example 32 with Node

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);
    }
}
Also used : Node(com.yahoo.vespa.hosted.provision.Node) NodeAcl(com.yahoo.vespa.hosted.provision.node.NodeAcl) Test(org.junit.Test)

Example 33 with Node

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)));
}
Also used : Node(com.yahoo.vespa.hosted.provision.Node) Test(org.junit.Test)

Example 34 with Node

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());
}
Also used : Zone(com.yahoo.config.provision.Zone) Node(com.yahoo.vespa.hosted.provision.Node) ClusterSpec(com.yahoo.config.provision.ClusterSpec) ApplicationId(com.yahoo.config.provision.ApplicationId) Flavor(com.yahoo.config.provision.Flavor) HashSet(java.util.HashSet) Test(org.junit.Test)

Example 35 with Node

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());
}
Also used : Zone(com.yahoo.config.provision.Zone) Node(com.yahoo.vespa.hosted.provision.Node) ClusterSpec(com.yahoo.config.provision.ClusterSpec) ApplicationId(com.yahoo.config.provision.ApplicationId) Flavor(com.yahoo.config.provision.Flavor) Test(org.junit.Test)

Aggregations

Node (com.yahoo.vespa.hosted.provision.Node)121 Test (org.junit.Test)67 ApplicationId (com.yahoo.config.provision.ApplicationId)40 ClusterSpec (com.yahoo.config.provision.ClusterSpec)33 List (java.util.List)26 ArrayList (java.util.ArrayList)23 Zone (com.yahoo.config.provision.Zone)22 Flavor (com.yahoo.config.provision.Flavor)21 HashSet (java.util.HashSet)19 Collectors (java.util.stream.Collectors)19 Optional (java.util.Optional)18 NodeRepository (com.yahoo.vespa.hosted.provision.NodeRepository)16 Duration (java.time.Duration)16 HostSpec (com.yahoo.config.provision.HostSpec)15 NodeType (com.yahoo.config.provision.NodeType)15 Agent (com.yahoo.vespa.hosted.provision.node.Agent)13 Map (java.util.Map)13 HashMap (java.util.HashMap)12 Collections (java.util.Collections)11 Set (java.util.Set)11