Search in sources :

Example 96 with Node

use of com.yahoo.vespa.hosted.provision.Node in project vespa by vespa-engine.

the class NodeAgentImpl method updateNodeRepoWithCurrentAttributes.

private void updateNodeRepoWithCurrentAttributes(final ContainerNodeSpec nodeSpec) {
    final NodeAttributes currentNodeAttributes = new NodeAttributes().withRestartGeneration(nodeSpec.currentRestartGeneration.orElse(null)).withRebootGeneration(nodeSpec.currentRebootGeneration.orElse(0L)).withDockerImage(nodeSpec.currentDockerImage.orElse(new DockerImage(""))).withVespaVersion(nodeSpec.vespaVersion.orElse(""));
    final NodeAttributes wantedNodeAttributes = new NodeAttributes().withRestartGeneration(nodeSpec.wantedRestartGeneration.orElse(null)).withRebootGeneration(nodeSpec.wantedRebootGeneration.orElse(0L)).withDockerImage(nodeSpec.wantedDockerImage.filter(node -> containerState == UNKNOWN).orElse(new DockerImage(""))).withVespaVersion(nodeSpec.wantedVespaVersion.filter(node -> containerState == UNKNOWN).orElse(""));
    publishStateToNodeRepoIfChanged(currentNodeAttributes, wantedNodeAttributes);
}
Also used : DockerException(com.yahoo.vespa.hosted.dockerapi.DockerException) ContainerName(com.yahoo.vespa.hosted.dockerapi.ContainerName) Dimensions(com.yahoo.vespa.hosted.dockerapi.metrics.Dimensions) StorageMaintainer(com.yahoo.vespa.hosted.node.admin.maintenance.StorageMaintainer) Environment(com.yahoo.vespa.hosted.node.admin.component.Environment) Date(java.util.Date) PromptContainerData(com.yahoo.vespa.hosted.node.admin.containerdata.PromptContainerData) ThreadFactoryFactory(com.yahoo.concurrent.ThreadFactoryFactory) ProcessResult(com.yahoo.vespa.hosted.dockerapi.ProcessResult) SimpleDateFormat(java.text.SimpleDateFormat) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) Node(com.yahoo.vespa.hosted.provision.Node) ArrayList(java.util.ArrayList) LinkedHashMap(java.util.LinkedHashMap) MetricReceiverWrapper(com.yahoo.vespa.hosted.dockerapi.metrics.MetricReceiverWrapper) Future(java.util.concurrent.Future) Duration(java.time.Duration) Map(java.util.Map) ContainerData(com.yahoo.vespa.hosted.node.admin.containerdata.ContainerData) ScheduledExecutorService(java.util.concurrent.ScheduledExecutorService) LinkedList(java.util.LinkedList) PrefixLogger(com.yahoo.vespa.hosted.node.admin.util.PrefixLogger) ConfigServerContainerData(com.yahoo.vespa.hosted.node.admin.containerdata.ConfigServerContainerData) NodeType(com.yahoo.config.provision.NodeType) DockerOperations(com.yahoo.vespa.hosted.node.admin.docker.DockerOperations) Container(com.yahoo.vespa.hosted.dockerapi.Container) JsonProcessingException(com.fasterxml.jackson.core.JsonProcessingException) DimensionMetrics(com.yahoo.vespa.hosted.dockerapi.metrics.DimensionMetrics) NodeRepository(com.yahoo.vespa.hosted.node.admin.configserver.noderepository.NodeRepository) Instant(java.time.Instant) DockerExecTimeoutException(com.yahoo.vespa.hosted.dockerapi.DockerExecTimeoutException) Executors(java.util.concurrent.Executors) MotdContainerData(com.yahoo.vespa.hosted.node.admin.containerdata.MotdContainerData) UncheckedIOException(java.io.UncheckedIOException) TimeUnit(java.util.concurrent.TimeUnit) Consumer(java.util.function.Consumer) List(java.util.List) ContainerNodeSpec(com.yahoo.vespa.hosted.node.admin.ContainerNodeSpec) STARTING(com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentImpl.ContainerState.STARTING) DockerImage(com.yahoo.vespa.hosted.dockerapi.DockerImage) Docker(com.yahoo.vespa.hosted.dockerapi.Docker) ABSENT(com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentImpl.ContainerState.ABSENT) Orchestrator(com.yahoo.vespa.hosted.node.admin.configserver.orchestrator.Orchestrator) UNKNOWN(com.yahoo.vespa.hosted.node.admin.nodeagent.NodeAgentImpl.ContainerState.UNKNOWN) Clock(java.time.Clock) Optional(java.util.Optional) OrchestratorException(com.yahoo.vespa.hosted.node.admin.configserver.orchestrator.OrchestratorException) ContainerResources(com.yahoo.vespa.hosted.dockerapi.ContainerResources) DockerImage(com.yahoo.vespa.hosted.dockerapi.DockerImage)

Example 97 with Node

use of com.yahoo.vespa.hosted.provision.Node in project vespa by vespa-engine.

the class InactiveAndFailedExpirerTest method reboot_generation_is_increased_when_node_moves_to_dirty.

@Test
public void reboot_generation_is_increased_when_node_moves_to_dirty() {
    ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east")));
    List<Node> nodes = tester.makeReadyNodes(2, "default");
    // Allocate and deallocate a single node
    ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test"), Version.fromString("6.42"), false);
    List<HostSpec> preparedNodes = tester.prepare(applicationId, cluster, Capacity.fromNodeCount(2), 1);
    tester.activate(applicationId, new HashSet<>(preparedNodes));
    assertEquals(2, tester.getNodes(applicationId, Node.State.active).size());
    tester.deactivate(applicationId);
    List<Node> inactiveNodes = tester.getNodes(applicationId, Node.State.inactive).asList();
    assertEquals(2, inactiveNodes.size());
    // Check reboot generation before node is moved. New nodes transition from provisioned to dirty, so their
    // wanted reboot generation will always be 1.
    long wantedRebootGeneration = inactiveNodes.get(0).status().reboot().wanted();
    assertEquals(1, wantedRebootGeneration);
    // Inactive times out and node is moved to dirty
    tester.advanceTime(Duration.ofMinutes(14));
    new InactiveExpirer(tester.nodeRepository(), tester.clock(), Duration.ofMinutes(10), new JobControl(tester.nodeRepository().database())).run();
    List<Node> dirty = tester.nodeRepository().getNodes(Node.State.dirty);
    assertEquals(2, dirty.size());
    // Reboot generation is increased
    assertEquals(wantedRebootGeneration + 1, dirty.get(0).status().reboot().wanted());
}
Also used : Zone(com.yahoo.config.provision.Zone) Node(com.yahoo.vespa.hosted.provision.Node) ProvisioningTester(com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester) ClusterSpec(com.yahoo.config.provision.ClusterSpec) HostSpec(com.yahoo.config.provision.HostSpec) Test(org.junit.Test)

Example 98 with Node

use of com.yahoo.vespa.hosted.provision.Node in project vespa by vespa-engine.

the class InactiveAndFailedExpirerTest method node_that_wants_to_retire_is_moved_to_parked.

@Test
public void node_that_wants_to_retire_is_moved_to_parked() throws OrchestrationException {
    ProvisioningTester tester = new ProvisioningTester(new Zone(Environment.prod, RegionName.from("us-east")));
    ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test"), Version.fromString("6.42"), false);
    tester.makeReadyNodes(5, "default");
    // Allocate two nodes
    {
        List<HostSpec> hostSpecs = tester.prepare(applicationId, cluster, Capacity.fromNodeCount(2), 1);
        tester.activate(applicationId, new HashSet<>(hostSpecs));
        assertEquals(2, tester.getNodes(applicationId, Node.State.active).size());
    }
    // Flag one node for retirement and redeploy
    {
        Node toRetire = tester.getNodes(applicationId, Node.State.active).asList().get(0);
        tester.patchNode(toRetire.with(toRetire.status().withWantToRetire(true)));
        List<HostSpec> hostSpecs = tester.prepare(applicationId, cluster, Capacity.fromNodeCount(2), 1);
        tester.activate(applicationId, new HashSet<>(hostSpecs));
    }
    // Retire times out and one node is moved to inactive
    // Trigger RetiredExpirer
    tester.advanceTime(Duration.ofMinutes(11));
    MockDeployer deployer = new MockDeployer(tester.provisioner(), Collections.singletonMap(applicationId, new MockDeployer.ApplicationContext(applicationId, cluster, Capacity.fromNodeCount(2, Optional.of("default"), false), 1)));
    Orchestrator orchestrator = mock(Orchestrator.class);
    doThrow(new RuntimeException()).when(orchestrator).acquirePermissionToRemove(any());
    new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, tester.clock(), Duration.ofDays(30), Duration.ofMinutes(10), new JobControl(tester.nodeRepository().database())).run();
    assertEquals(1, tester.nodeRepository().getNodes(Node.State.inactive).size());
    // Inactive times out and one node is moved to parked
    // Trigger InactiveExpirer
    tester.advanceTime(Duration.ofMinutes(11));
    new InactiveExpirer(tester.nodeRepository(), tester.clock(), Duration.ofMinutes(10), new JobControl(tester.nodeRepository().database())).run();
    assertEquals(1, tester.nodeRepository().getNodes(Node.State.parked).size());
}
Also used : Zone(com.yahoo.config.provision.Zone) Node(com.yahoo.vespa.hosted.provision.Node) ClusterSpec(com.yahoo.config.provision.ClusterSpec) Orchestrator(com.yahoo.vespa.orchestrator.Orchestrator) List(java.util.List) ProvisioningTester(com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester) MockDeployer(com.yahoo.vespa.hosted.provision.testutils.MockDeployer) HashSet(java.util.HashSet) Test(org.junit.Test)

Example 99 with Node

use of com.yahoo.vespa.hosted.provision.Node in project vespa by vespa-engine.

the class NodeFailerTest method docker_host_failed_without_config_requests.

@Test
public void docker_host_failed_without_config_requests() {
    NodeFailTester tester = NodeFailTester.withTwoApplications();
    // For a day all nodes work so nothing happens
    for (int minutes = 0, interval = 30; minutes < 24 * 60; minutes += interval) {
        tester.clock.advance(Duration.ofMinutes(interval));
        tester.allNodesMakeAConfigRequestExcept();
        tester.failer.run();
        assertEquals(3, tester.nodeRepository.getNodes(NodeType.host, Node.State.ready).size());
        assertEquals(0, tester.nodeRepository.getNodes(NodeType.host, Node.State.failed).size());
    }
    // Two ready nodes and a ready docker node die, but only 2 of those are failed out
    tester.clock.advance(Duration.ofMinutes(180));
    Node dockerHost = tester.nodeRepository.getNodes(NodeType.host, Node.State.ready).iterator().next();
    tester.allNodesMakeAConfigRequestExcept(dockerHost);
    tester.failer.run();
    assertEquals(2, tester.nodeRepository.getNodes(NodeType.host, Node.State.ready).size());
    assertEquals(1, tester.nodeRepository.getNodes(NodeType.host, Node.State.failed).size());
}
Also used : Node(com.yahoo.vespa.hosted.provision.Node) Test(org.junit.Test)

Example 100 with Node

use of com.yahoo.vespa.hosted.provision.Node in project vespa by vespa-engine.

the class NodeFailerTest method failing_divergent_ready_nodes.

@Test
public void failing_divergent_ready_nodes() {
    NodeFailTester tester = NodeFailTester.withNoApplications();
    Node readyNode = tester.createReadyNodes(1).get(0);
    tester.failer.run();
    assertEquals(Node.State.ready, readyNode.state());
    tester.nodeRepository.write(readyNode.with(readyNode.status().withHardwareDivergence(Optional.of("{\"specVerificationReport\":{\"actualIpv6Connection\":false}}"))));
    tester.failer.run();
    assertEquals(1, tester.nodeRepository.getNodes(Node.State.failed).size());
}
Also used : Node(com.yahoo.vespa.hosted.provision.Node) 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