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);
}
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());
}
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());
}
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());
}
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());
}
Aggregations