From ea4fb622c501bf5872ce916711a36402354a84b2 Mon Sep 17 00:00:00 2001 From: Valerij Fredriksen Date: Fri, 30 Jun 2023 10:50:05 +0200 Subject: Revert "Revert "Use real InfraApplication in node-repository tests"" This reverts commit d4ab68364ee14e9360fc7b17ba1100ccb934b4a1. --- .../hosted/provision/testutils/MockDeployer.java | 13 +++- .../provision/testutils/MockNodeRepository.java | 17 ++--- .../hosted/provision/RealDataScenarioTest.java | 3 +- .../maintenance/AutoscalingMaintainerTester.java | 7 +- .../ExpeditedChangeApplicationMaintainerTest.java | 16 +++-- .../provision/maintenance/FailedExpirerTest.java | 21 +++--- .../maintenance/HostCapacityMaintainerTest.java | 40 ++++++------ .../maintenance/HostFlavorUpgraderTest.java | 4 +- .../maintenance/InactiveAndFailedExpirerTest.java | 24 +++---- .../provision/maintenance/NodeFailTester.java | 74 +++++++++++----------- .../maintenance/OsUpgradeActivatorTest.java | 9 +-- .../PeriodicApplicationMaintainerTest.java | 7 +- .../provision/maintenance/RebalancerTest.java | 9 ++- .../provision/maintenance/RetiredExpirerTest.java | 15 ++--- .../maintenance/SwitchRebalancerTest.java | 4 +- .../vespa/hosted/provision/os/OsVersionsTest.java | 34 +++++----- .../provisioning/AclProvisioningTest.java | 12 ++-- .../provisioning/InPlaceResizeProvisionTest.java | 5 +- .../provisioning/LoadBalancerProvisionerTest.java | 27 ++++---- .../provisioning/MultigroupProvisioningTest.java | 4 +- .../provisioning/NodeTypeProvisioningTest.java | 72 +++++---------------- .../provision/provisioning/ProvisioningTest.java | 23 ++++--- .../provision/provisioning/ProvisioningTester.java | 65 +++++++++++++++---- .../provisioning/VirtualNodeProvisioningTest.java | 6 +- .../hosted/provision/restapi/ArchiveApiTest.java | 2 +- .../hosted/provision/restapi/responses/cfg1.json | 10 +-- .../hosted/provision/restapi/responses/cfg2.json | 10 +-- .../docker-node1-os-upgrade-complete.json | 8 +-- .../restapi/responses/docker-node1-reports-2.json | 8 +-- .../restapi/responses/docker-node1-reports-3.json | 8 +-- .../restapi/responses/docker-node1-reports-4.json | 8 +-- .../restapi/responses/docker-node1-reports.json | 8 +-- .../provision/restapi/responses/docker-node1.json | 8 +-- .../provision/restapi/responses/docker-node2.json | 8 +-- .../provision/restapi/responses/docker-node3.json | 8 +-- .../provision/restapi/responses/docker-node4.json | 8 +-- .../provision/restapi/responses/docker-node5.json | 8 +-- .../responses/dockerhost1-with-firmware-data.json | 8 +-- .../restapi/responses/load-balancers.json | 27 +++++--- .../service/duper/ConfigServerLikeApplication.java | 1 + .../vespa/service/duper/InfraApplication.java | 3 +- 41 files changed, 317 insertions(+), 335 deletions(-) diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockDeployer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockDeployer.java index 63386449f0c..a1712fe4a0b 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockDeployer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockDeployer.java @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.provision.testutils; +import com.yahoo.component.Version; import com.yahoo.component.annotation.Inject; import com.yahoo.config.provision.ActivationContext; import com.yahoo.config.provision.ApplicationId; @@ -16,6 +17,7 @@ import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeMutex; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; +import com.yahoo.vespa.service.duper.InfraApplication; import java.time.Clock; import java.time.Duration; @@ -52,7 +54,7 @@ public class MockDeployer implements Deployer { @Inject @SuppressWarnings("unused") public MockDeployer() { - this(null, Clock.systemUTC(), Map.of()); + this(null, Clock.systemUTC(), List.of()); } /** @@ -74,9 +76,9 @@ public class MockDeployer implements Deployer { */ public MockDeployer(NodeRepositoryProvisioner provisioner, Clock clock, - Map applications) { + List applications) { this.provisioner = provisioner; - this.applications = new HashMap<>(applications); + this.applications = applications.stream().collect(Collectors.toMap(ApplicationContext::id, c -> c)); this.nodeRepository = null; this.clock = clock; @@ -223,6 +225,11 @@ public class MockDeployer implements Deployer { this(id, List.of(new ClusterContext(id, cluster, capacity))); } + public ApplicationContext(InfraApplication application, Version version) { + this(application.getApplicationId(), List.of(new ClusterContext( + application.getApplicationId(), application.getClusterSpecWithVersion(version), application.getCapacity()))); + } + public ApplicationId id() { return id; } /** Returns list of cluster specs of this application. */ diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java index 714374ccb8a..40460e70861 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java @@ -1,8 +1,6 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.provision.testutils; -import com.yahoo.config.provision.ClusterInfo; -import com.yahoo.config.provision.IntRange; import com.yahoo.component.Version; import com.yahoo.config.provision.ActivationContext; import com.yahoo.config.provision.ApplicationId; @@ -10,12 +8,14 @@ import com.yahoo.config.provision.ApplicationName; import com.yahoo.config.provision.ApplicationTransaction; import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.CloudAccount; +import com.yahoo.config.provision.ClusterInfo; import com.yahoo.config.provision.ClusterResources; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.DockerImage; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.InstanceName; +import com.yahoo.config.provision.IntRange; import com.yahoo.config.provision.NodeFlavors; import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.NodeType; @@ -42,6 +42,9 @@ import com.yahoo.vespa.hosted.provision.node.IP; import com.yahoo.vespa.hosted.provision.node.Status; import com.yahoo.vespa.hosted.provision.provisioning.EmptyProvisionServiceProvider; import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; +import com.yahoo.vespa.service.duper.ConfigServerApplication; +import com.yahoo.vespa.service.duper.InfraApplication; +import com.yahoo.vespa.service.duper.TenantHostApplication; import javax.inject.Inject; import java.time.Clock; @@ -189,13 +192,11 @@ public class MockNodeRepository extends NodeRepository { nodes().removeRecursively("dockerhost6.yahoo.com"); // Activate config servers - ApplicationId cfgApp = ApplicationId.from("cfg", "cfg", "cfg"); - ClusterSpec cfgCluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("configservers")).vespaVersion("6.42").build(); - activate(provisioner.prepare(cfgApp, cfgCluster, Capacity.fromRequiredNodeType(NodeType.config), null), cfgApp, provisioner); + InfraApplication cfgApp = new ConfigServerApplication(); + activate(provisioner.prepare(cfgApp.getApplicationId(), cfgApp.getClusterSpecWithVersion(Version.fromString("6.42")), cfgApp.getCapacity(), null), cfgApp.getApplicationId(), provisioner); - ApplicationId zoneApp = ApplicationId.from(TenantName.from("zoneapp"), ApplicationName.from("zoneapp"), InstanceName.from("zoneapp")); - ClusterSpec zoneCluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("node-admin")).vespaVersion("6.42").build(); - activate(provisioner.prepare(zoneApp, zoneCluster, Capacity.fromRequiredNodeType(NodeType.host), null), zoneApp, provisioner); + InfraApplication tenantHostApp = new TenantHostApplication(); + activate(provisioner.prepare(tenantHostApp.getApplicationId(), tenantHostApp.getClusterSpecWithVersion(Version.fromString("6.42")), tenantHostApp.getCapacity(), null), tenantHostApp.getApplicationId(), provisioner); ApplicationId app1Id = ApplicationId.from(TenantName.from("tenant1"), ApplicationName.from("application1"), InstanceName.from("instance1")); ClusterSpec cluster1Id = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("id1")) diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/RealDataScenarioTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/RealDataScenarioTest.java index 9c843b3eb01..1ed3c13cfff 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/RealDataScenarioTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/RealDataScenarioTest.java @@ -46,7 +46,6 @@ import java.time.Duration; import java.util.ArrayList; import java.util.Collection; import java.util.List; -import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Consumer; import java.util.logging.Logger; @@ -105,7 +104,7 @@ public class RealDataScenarioTest { for (int i = 0; i < specs.length; i++) { contexts.add(new MockDeployer.ClusterContext(app, specs[i], capacities[i])); } - MockDeployer deployer = new MockDeployer(tester.provisioner(), tester.clock(), Map.of(app, new MockDeployer.ApplicationContext(app, contexts))); + MockDeployer deployer = new MockDeployer(tester.provisioner(), tester.clock(), List.of(new MockDeployer.ApplicationContext(app, contexts))); SwitchRebalancer rebalancer = new SwitchRebalancer(tester.nodeRepository(), Duration.ofDays(1), new MockMetric(), deployer); rebalancer.run(); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTester.java index 95e36787219..ab8175cf989 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/AutoscalingMaintainerTester.java @@ -19,18 +19,15 @@ import com.yahoo.vespa.hosted.provision.applications.Cluster; import com.yahoo.vespa.hosted.provision.autoscale.ClusterMetricSnapshot; import com.yahoo.vespa.hosted.provision.autoscale.Load; import com.yahoo.vespa.hosted.provision.autoscale.NodeMetricSnapshot; -import com.yahoo.vespa.hosted.provision.autoscale.MetricsDb; import com.yahoo.vespa.hosted.provision.provisioning.FlavorConfigBuilder; import com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; import java.time.Duration; import java.time.Instant; -import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.function.IntFunction; -import java.util.stream.Collectors; /** * @author bratseth @@ -48,9 +45,7 @@ public class AutoscalingMaintainerTester { public AutoscalingMaintainerTester(Zone zone, MockDeployer.ApplicationContext ... appContexts) { provisioningTester = new ProvisioningTester.Builder().zone(zone).flavorsConfig(flavorsConfig()).build(); provisioningTester.clock().setInstant(Instant.ofEpochMilli(0)); - Map apps = Arrays.stream(appContexts) - .collect(Collectors.toMap(c -> c.id(), c -> c)); - deployer = new MockDeployer(provisioningTester.provisioner(), provisioningTester.clock(), apps); + deployer = new MockDeployer(provisioningTester.provisioner(), provisioningTester.clock(), List.of(appContexts)); maintainer = new AutoscalingMaintainer(provisioningTester.nodeRepository(), deployer, new TestMetric(), diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ExpeditedChangeApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ExpeditedChangeApplicationMaintainerTest.java index 908598b25fb..e1e2ff3db15 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ExpeditedChangeApplicationMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ExpeditedChangeApplicationMaintainerTest.java @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.provision.maintenance; +import com.yahoo.component.Version; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ApplicationName; import com.yahoo.config.provision.Capacity; @@ -16,10 +17,11 @@ import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; +import com.yahoo.vespa.service.duper.InfraApplication; import org.junit.Test; import java.time.Duration; -import java.util.Map; +import java.util.List; import static org.junit.Assert.assertEquals; @@ -86,12 +88,12 @@ public class ExpeditedChangeApplicationMaintainerTest { final MockDeployer deployer; final NodeResources nodeResources = new NodeResources(2, 8, 50, 1); + final InfraApplication proxyApp = ProvisioningTester.infraApplication(NodeType.proxy); final ApplicationId app1 = ApplicationId.from(TenantName.from("foo1"), ApplicationName.from("bar"), InstanceName.from("fuz")); final ApplicationId app2 = ApplicationId.from(TenantName.from("foo2"), ApplicationName.from("bar"), InstanceName.from("fuz")); - final ApplicationId app3 = ApplicationId.from(TenantName.from("hosted-vespa"), ApplicationName.from("routing"), InstanceName.from("default")); + final ApplicationId app3 = proxyApp.getApplicationId(); final ClusterSpec clusterApp1 = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("test")).vespaVersion("6.42").build(); final ClusterSpec clusterApp2 = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test")).vespaVersion("6.42").build(); - final ClusterSpec clusterApp3 = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("routing")).vespaVersion("6.42").build(); final int wantedNodesApp1 = 5; final int wantedNodesApp2 = 7; final int wantedNodesApp3 = 2; @@ -99,10 +101,10 @@ public class ExpeditedChangeApplicationMaintainerTest { Fixture() { this.tester = new ProvisioningTester.Builder().build(); this.nodeRepository = tester.nodeRepository(); - Map apps = Map.of( - app1, new MockDeployer.ApplicationContext(app1, clusterApp1, Capacity.from(new ClusterResources(wantedNodesApp1, 1, nodeResources))), - app2, new MockDeployer.ApplicationContext(app2, clusterApp2, Capacity.from(new ClusterResources(wantedNodesApp2, 1, nodeResources))), - app3, new MockDeployer.ApplicationContext(app3, clusterApp3, Capacity.fromRequiredNodeType(NodeType.proxy))) ; + List apps = List.of( + new MockDeployer.ApplicationContext(app1, clusterApp1, Capacity.from(new ClusterResources(wantedNodesApp1, 1, nodeResources))), + new MockDeployer.ApplicationContext(app2, clusterApp2, Capacity.from(new ClusterResources(wantedNodesApp2, 1, nodeResources))), + new MockDeployer.ApplicationContext(proxyApp, Version.fromString("6.42"))); this.deployer = new MockDeployer(tester.provisioner(), nodeRepository.clock(), apps); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java index 4978fe431dc..d36ee0f0494 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java @@ -38,7 +38,6 @@ import java.time.Instant; import java.util.List; import java.util.Optional; import java.util.Set; -import java.util.stream.Collectors; import java.util.stream.Stream; import static org.junit.Assert.assertEquals; @@ -49,13 +48,6 @@ import static org.junit.Assert.assertEquals; */ public class FailedExpirerTest { - private static final ApplicationId tenantHostApplicationId = ApplicationId.from("vespa", "zone-app", "default"); - - private static final ClusterSpec tenantHostApplicationClusterSpec = - ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("node-admin")).vespaVersion("6.42").build(); - - private static final Capacity tenantHostApplicationCapacity = Capacity.fromRequiredNodeType(NodeType.host); - @Test public void ensure_failed_nodes_are_deallocated_in_test_quickly() { FailureScenario scenario = new FailureScenario(SystemName.main, Environment.test) @@ -138,9 +130,7 @@ public class FailedExpirerTest { .withNode(NodeType.proxy, FailureScenario.defaultFlavor, "proxy2") .withNode(NodeType.proxy, FailureScenario.defaultFlavor, "proxy3") .setReady("proxy1", "proxy2", "proxy3") - .allocate(ApplicationId.from("vespa", "zone-app", "default"), - ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("routing")).vespaVersion("6.42").build(), - Capacity.fromRequiredNodeType(NodeType.proxy)) + .allocate(NodeType.proxy) .failNode(1, "proxy1"); for (int i = 0; i < 10; i++) { @@ -159,7 +149,7 @@ public class FailedExpirerTest { .withNode(NodeType.host, FailureScenario.defaultFlavor, "parent2") .withNode(NodeType.host, FailureScenario.defaultFlavor, "parent3") .setReady("parent1", "parent2", "parent3") - .allocate(tenantHostApplicationId, tenantHostApplicationClusterSpec, tenantHostApplicationCapacity) + .allocate(NodeType.host) .withNode(NodeType.tenant, FailureScenario.dockerFlavor, "node1", "parent1") .withNode(NodeType.tenant, FailureScenario.dockerFlavor, "node2", "parent2") .withNode(NodeType.tenant, FailureScenario.dockerFlavor, "node3", "parent3") @@ -181,7 +171,7 @@ public class FailedExpirerTest { .withNode(NodeType.host, FailureScenario.defaultFlavor, "parent2") .withNode(NodeType.host, FailureScenario.defaultFlavor, "parent3") .setReady("parent1", "parent2", "parent3") - .allocate(tenantHostApplicationId, tenantHostApplicationClusterSpec, tenantHostApplicationCapacity) + .allocate(NodeType.host) .withNode(NodeType.tenant, FailureScenario.dockerFlavor, "node1", "parent1") .withNode(NodeType.tenant, FailureScenario.dockerFlavor, "node2", "parent2") .withNode(NodeType.tenant, FailureScenario.dockerFlavor, "node3", "parent3") @@ -338,6 +328,11 @@ public class FailedExpirerTest { return this; } + public FailureScenario allocate(NodeType nodeType) { + tester.prepareAndActivateInfraApplication(nodeType); + return this; + } + public void assertNodesIn(Node.State state, String... hostnames) { assertEquals(Set.of(hostnames), nodeRepository.nodes().list(state).hostnames()); } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostCapacityMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostCapacityMaintainerTest.java index c16ed47a216..0478e5d1486 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostCapacityMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostCapacityMaintainerTest.java @@ -367,16 +367,16 @@ public class HostCapacityMaintainerTest { } private void replace_config_server_like(NodeType hostType) { - final ApplicationId hostApp; - final ApplicationId configSrvApp; + final InfraApplication hostApp; + final InfraApplication configSrvApp; switch (hostType) { case confighost -> { - hostApp = new ConfigServerHostApplication().getApplicationId(); - configSrvApp = new ConfigServerApplication().getApplicationId(); + hostApp = new ConfigServerHostApplication(); + configSrvApp = new ConfigServerApplication(); } case controllerhost -> { - hostApp = new ControllerHostApplication().getApplicationId(); - configSrvApp = new ControllerApplication().getApplicationId(); + hostApp = new ControllerHostApplication(); + configSrvApp = new ControllerApplication(); } default -> throw new IllegalArgumentException("Unexpected config server host like node type: " + hostType); } @@ -390,14 +390,14 @@ public class HostCapacityMaintainerTest { List provisionedHosts = tester.makeReadyNodes(3, "default", hostType, 1).stream() .sorted(Comparator.comparing(Node::hostname)) .toList(); - tester.prepareAndActivateInfraApplication(hostApp, hostType); + tester.prepareAndActivateInfraApplication(hostApp); // Provision config servers for (int i = 0; i < provisionedHosts.size(); i++) { tester.makeReadyChildren(1, i + 1, new NodeResources(1.5, 8, 50, 0.3), hostType.childNodeType(), provisionedHosts.get(i).hostname(), (nodeIndex) -> "cfg" + nodeIndex); } - tester.prepareAndActivateInfraApplication(configSrvApp, hostType.childNodeType()); + tester.prepareAndActivateInfraApplication(configSrvApp); // Expected number of hosts and children are provisioned NodeList allNodes = tester.nodeRepository().nodes().list().not().state(State.deprovisioned); @@ -413,7 +413,7 @@ public class HostCapacityMaintainerTest { tester.nodeRepository().nodes().deprovision(hostToRemove.get().hostname(), Agent.system, tester.clock().instant()); // Redeployment of config server application retires node - tester.prepareAndActivateInfraApplication(configSrvApp, hostType.childNodeType()); + tester.prepareAndActivateInfraApplication(configSrvApp); assertTrue("Redeployment retires node", nodeToRemove.get().allocation().get().membership().retired()); // Config server becomes removable (done by RetiredExpirer in a real system) and redeployment moves it @@ -421,8 +421,8 @@ public class HostCapacityMaintainerTest { int removedIndex = nodeToRemove.get().allocation().get().membership().index(); tester.nodeRepository().nodes().setRemovable(NodeList.of(nodeToRemove.get()), true); tester.nodeRepository().nodes().setRemovable(NodeList.of(hostToRemove.get()), true); - tester.prepareAndActivateInfraApplication(configSrvApp, hostType.childNodeType()); - tester.prepareAndActivateInfraApplication(hostApp, hostType); + tester.prepareAndActivateInfraApplication(configSrvApp); + tester.prepareAndActivateInfraApplication(hostApp); tester.nodeRepository().nodes().markNodeAvailableForNewAllocation(nodeToRemove.get().hostname(), Agent.nodeAdmin, "Readied by host-admin"); tester.nodeRepository().nodes().markNodeAvailableForNewAllocation(hostToRemove.get().hostname(), Agent.nodeAdmin, "Readied by host-admin"); assertEquals(2, tester.nodeRepository().nodes().list().nodeType(hostType.childNodeType()).state(Node.State.active).size()); @@ -443,13 +443,13 @@ public class HostCapacityMaintainerTest { // Deployment by the removed host has no effect HostName.setHostNameForTestingOnly("cfg2.example.com"); - tester.prepareAndActivateInfraApplication(configSrvApp, hostType.childNodeType()); + tester.prepareAndActivateInfraApplication(configSrvApp); assertEquals(List.of(), dynamicProvisioningTester.hostProvisioner.provisionedHosts()); // Deployment on another config server starts provisioning a new host and child HostName.setHostNameForTestingOnly("cfg3.example.com"); assertEquals(0, tester.nodeRepository().nodes().list(Node.State.reserved).nodeType(hostType.childNodeType()).size()); - assertEquals(2, tester.prepareAndActivateInfraApplication(configSrvApp, hostType.childNodeType()).size()); + assertEquals(2, tester.prepareAndActivateInfraApplication(configSrvApp).size()); assertEquals(1, tester.nodeRepository().nodes().list(Node.State.reserved).nodeType(hostType.childNodeType()).size()); Node newNode = tester.nodeRepository().nodes().list(Node.State.reserved).nodeType(hostType.childNodeType()).first().get(); @@ -458,18 +458,18 @@ public class HostCapacityMaintainerTest { List newHosts = dynamicProvisioningTester.hostProvisioner.provisionedHosts(); assertEquals(1, newHosts.size()); tester.move(Node.State.ready, newHosts.get(0).hostHostname()); - tester.prepareAndActivateInfraApplication(hostApp, hostType); + tester.prepareAndActivateInfraApplication(hostApp); assertEquals(3, tester.nodeRepository().nodes().list(Node.State.active).nodeType(hostType).size()); // Redeployment of config server app actives new node - tester.prepareAndActivateInfraApplication(configSrvApp, hostType.childNodeType()); + tester.prepareAndActivateInfraApplication(configSrvApp); newNode = tester.nodeRepository().nodes().node(newNode.hostname()).get(); assertSame(Node.State.active, newNode.state()); assertEquals("Removed index is reused", removedIndex, newNode.allocation().get().membership().index()); // Next redeployment does nothing NodeList nodesBefore = tester.nodeRepository().nodes().list().nodeType(hostType.childNodeType()); - tester.prepareAndActivateInfraApplication(configSrvApp, hostType.childNodeType()); + tester.prepareAndActivateInfraApplication(configSrvApp); NodeList nodesAfter = tester.nodeRepository().nodes().list().nodeType(hostType.childNodeType()); assertEquals(nodesBefore, nodesAfter); } @@ -592,9 +592,11 @@ public class HostCapacityMaintainerTest { Duration.ofHours(1), Duration.ofHours(1)).maintain(); - // Host and children can now be removed. tester.provisioningTester.activateTenantHosts(); - tester.maintain(); + // Hosts move themselves to parked (via ready) once they've synced up their logs to archive and are then deprovisioned + tester.nodeRepository.nodes().list(State.dirty).forEach(node -> + tester.nodeRepository.nodes().markNodeAvailableForNewAllocation(node.hostname(), Agent.nodeAdmin, "Readied by host-admin")); + tester.deprovisioner.maintain(); assertEquals(List.of(), tester.nodeRepository.nodes().list().not().state(State.deprovisioned).asList()); } @@ -645,7 +647,7 @@ public class HostCapacityMaintainerTest { for (var hostname : provisionedHostnames) { tester.provisioningTester.move(Node.State.ready, hostname); } - tester.provisioningTester.prepareAndActivateInfraApplication(DynamicProvisioningTester.tenantHostApp.getApplicationId(), NodeType.host); + tester.provisioningTester.activateTenantHosts(); NodeList activeHosts = tester.provisioningTester.nodeRepository().nodes() .list(Node.State.active) .nodeType(NodeType.host) diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostFlavorUpgraderTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostFlavorUpgraderTest.java index 6224143aabf..9fe323201f0 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostFlavorUpgraderTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostFlavorUpgraderTest.java @@ -17,7 +17,7 @@ import com.yahoo.vespa.hosted.provision.testutils.MockHostProvisioner.Behaviour; import org.junit.jupiter.api.Test; import java.time.Duration; -import java.util.Map; +import java.util.List; import static org.junit.jupiter.api.Assertions.assertEquals; @@ -41,7 +41,7 @@ class HostFlavorUpgraderTest { NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote); ClusterSpec spec = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("c1")).vespaVersion("1").build(); Capacity capacity = Capacity.from(new ClusterResources(2, 1, resources)); - Map applications = Map.of(app, new MockDeployer.ApplicationContext(app, spec, capacity)); + List applications = List.of(new MockDeployer.ApplicationContext(app, spec, capacity)); MockDeployer deployer = new MockDeployer(tester.provisioner(), tester.clock(), applications); HostFlavorUpgrader upgrader = new HostFlavorUpgrader(tester.nodeRepository(), Duration.ofDays(1), new TestMetric(), deployer, hostProvisioner); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java index 563b76327e6..2f239f92c3f 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InactiveAndFailedExpirerTest.java @@ -22,10 +22,10 @@ import com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; import com.yahoo.vespa.orchestrator.OrchestrationException; import com.yahoo.vespa.orchestrator.Orchestrator; +import com.yahoo.vespa.service.duper.TenantHostApplication; import org.junit.Test; import java.time.Duration; -import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -111,9 +111,7 @@ public class InactiveAndFailedExpirerTest { MockDeployer deployer = new MockDeployer( tester.provisioner(), tester.clock(), - Collections.singletonMap( - applicationId, - new MockDeployer.ApplicationContext(applicationId, cluster, + List.of(new MockDeployer.ApplicationContext(applicationId, cluster, Capacity.from(new ClusterResources(2, 1, nodeResources), false, true)) ) @@ -161,19 +159,15 @@ public class InactiveAndFailedExpirerTest { tester.makeReadyHosts(2, nodeResources); // Activate and deallocate - ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test")).vespaVersion("6.42").build(); - List preparedNodes = tester.prepare(applicationId, cluster, Capacity.fromRequiredNodeType(NodeType.host)); - tester.activate(applicationId, new HashSet<>(preparedNodes)); - assertEquals(2, tester.getNodes(applicationId, Node.State.active).size()); - tester.activate(applicationId, List.of()); - List inactiveNodes = tester.getNodes(applicationId, Node.State.inactive).asList(); - assertEquals(2, inactiveNodes.size()); + TenantHostApplication tenantHostApp = new TenantHostApplication(); + tester.prepareAndActivateInfraApplication(tenantHostApp); + assertEquals(2, tester.getNodes(tenantHostApp.getApplicationId(), Node.State.active).size()); + tester.activate(tenantHostApp.getApplicationId(), List.of()); + List dirtyNodes = tester.getNodes(tenantHostApp.getApplicationId(), Node.State.dirty).asList(); + assertEquals(2, dirtyNodes.size()); // Nodes marked for deprovisioning are moved to dirty and then parked when readied by host-admin - tester.patchNodes(inactiveNodes, (node) -> node.withWantToRetire(true, true, Agent.system, tester.clock().instant())); - tester.advanceTime(Duration.ofMinutes(11)); - new InactiveExpirer(tester.nodeRepository(), Duration.ofMinutes(10), new TestMetric()).run(); - + tester.patchNodes(dirtyNodes, (node) -> node.withWantToRetire(true, true, Agent.system, tester.clock().instant())); NodeList expired = tester.nodeRepository().nodes().list(Node.State.dirty); assertEquals(2, expired.size()); expired.forEach(node -> tester.nodeRepository().nodes().markNodeAvailableForNewAllocation(node.hostname(), Agent.operator, "Readied by host-admin")); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java index a07a4f2c72a..4d2816cb14f 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java @@ -1,6 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.provision.maintenance; +import com.yahoo.component.Version; import com.yahoo.config.provision.ActivationContext; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ApplicationTransaction; @@ -27,6 +28,8 @@ import com.yahoo.vespa.hosted.provision.provisioning.NodeRepositoryProvisioner; import com.yahoo.vespa.hosted.provision.provisioning.ProvisioningTester; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; import com.yahoo.vespa.hosted.provision.testutils.ServiceMonitorStub; +import com.yahoo.vespa.service.duper.InfraApplication; +import com.yahoo.vespa.service.duper.TenantHostApplication; import java.time.Clock; import java.time.Duration; @@ -35,6 +38,7 @@ import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; import static org.junit.Assert.assertEquals; @@ -46,7 +50,6 @@ public class NodeFailTester { public static final NodeResources nodeResources = new NodeResources(2, 8, 500, 1); // Immutable components - public static final ApplicationId tenantHostApp = ApplicationId.from("hosted-vespa", "tenant-host", "default"); public static final ApplicationId app1 = ApplicationId.from("foo1", "bar", "fuz"); public static final ApplicationId app2 = ApplicationId.from("foo2", "bar", "fuz"); public static final ClusterSpec.Id testCluster = ClusterSpec.Id.from("test"); @@ -74,9 +77,11 @@ public class NodeFailTester { provisioner = tester.provisioner(); } - private void initializeMaintainers(Map apps) { + private void initializeMaintainers(List apps) { + Map appsMap = apps.stream() + .collect(Collectors.toMap(MockDeployer.ApplicationContext::id, context -> context)); deployer = new MockDeployer(provisioner, tester.clock(), apps); - serviceMonitor = new ServiceMonitorStub(apps, nodeRepository); + serviceMonitor = new ServiceMonitorStub(appsMap, nodeRepository); metric = new TestMetric(); failer = createFailer(); updater = createUpdater(); @@ -99,9 +104,9 @@ public class NodeFailTester { assertEquals(capacity1.minResources().nodes(), tester.nodeRepository.nodes().list(Node.State.active).owner(app1).size()); assertEquals(capacity2.minResources().nodes(), tester.nodeRepository.nodes().list(Node.State.active).owner(app2).size()); - Map apps = Map.of( - app1, new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1), - app2, new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); + List apps = List.of( + new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1), + new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); tester.initializeMaintainers(apps); return tester; } @@ -112,24 +117,24 @@ public class NodeFailTester { tester.tester.makeReadyHosts(hostCount, new NodeResources(2, 8, 20, 10)); // Create tenant host application - ClusterSpec clusterNodeAdminApp = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("node-admin")).vespaVersion("6.42").build(); - ClusterSpec clusterApp1 = ClusterSpec.request(ClusterSpec.Type.container, testCluster).vespaVersion("6.75.0").build(); - ClusterSpec clusterApp2 = ClusterSpec.request(ClusterSpec.Type.content, testCluster).vespaVersion("6.75.0").build(); - Capacity allHosts = Capacity.fromRequiredNodeType(NodeType.host); + Version version = Version.fromString("6.75.0"); + TenantHostApplication tenantHostApp = new TenantHostApplication(); + ClusterSpec clusterApp1 = ClusterSpec.request(ClusterSpec.Type.container, testCluster).vespaVersion(version).build(); + ClusterSpec clusterApp2 = ClusterSpec.request(ClusterSpec.Type.content, testCluster).vespaVersion(version).build(); Capacity capacity1 = Capacity.from(new ClusterResources(containerCount, 1, new NodeResources(1, 4, 10, 0.3)), false, true); Capacity capacity2 = Capacity.from(new ClusterResources(contentCount, 1, new NodeResources(1, 4, 10, 0.3)), false, true); - tester.activate(tenantHostApp, clusterNodeAdminApp, allHosts); + tester.tester.prepareAndActivateInfraApplication(tenantHostApp, version); tester.activate(app1, clusterApp1, capacity1); tester.activate(app2, clusterApp2, capacity2); assertEquals(Set.of(tester.nodeRepository.nodes().list().nodeType(NodeType.host).asList()), - Set.of(tester.nodeRepository.nodes().list(Node.State.active).owner(tenantHostApp).asList())); + Set.of(tester.nodeRepository.nodes().list(Node.State.active).owner(tenantHostApp.getApplicationId()).asList())); assertEquals(capacity1.minResources().nodes(), tester.nodeRepository.nodes().list(Node.State.active).owner(app1).size()); assertEquals(capacity2.minResources().nodes(), tester.nodeRepository.nodes().list(Node.State.active).owner(app2).size()); - Map apps = Map.of( - tenantHostApp, new MockDeployer.ApplicationContext(tenantHostApp, clusterNodeAdminApp, allHosts), - app1, new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1), - app2, new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); + List apps = List.of( + new MockDeployer.ApplicationContext(tenantHostApp, version), + new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1), + new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); tester.initializeMaintainers(apps); return tester; } @@ -139,24 +144,24 @@ public class NodeFailTester { tester.tester.makeReadyNodes(numberOfHosts, new NodeResources(4, 16, 400, 10), NodeType.host, 8); // Create applications - ClusterSpec clusterNodeAdminApp = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("node-admin")).vespaVersion("6.42").build(); - ClusterSpec clusterApp1 = ClusterSpec.request(ClusterSpec.Type.container, testCluster).vespaVersion("6.75.0").build(); - ClusterSpec clusterApp2 = ClusterSpec.request(ClusterSpec.Type.content, testCluster).vespaVersion("6.75.0").build(); - Capacity allHosts = Capacity.fromRequiredNodeType(NodeType.host); + Version version = Version.fromString("6.75.0"); + TenantHostApplication tenantHostApp = new TenantHostApplication(); + ClusterSpec clusterApp1 = ClusterSpec.request(ClusterSpec.Type.container, testCluster).vespaVersion(version).build(); + ClusterSpec clusterApp2 = ClusterSpec.request(ClusterSpec.Type.content, testCluster).vespaVersion(version).build(); Capacity capacity1 = Capacity.from(new ClusterResources(3, 1, new NodeResources(1, 4, 100, 0.3)), false, true); Capacity capacity2 = Capacity.from(new ClusterResources(5, 1, new NodeResources(1, 4, 100, 0.3)), false, true); - tester.activate(tenantHostApp, clusterNodeAdminApp, allHosts); + tester.tester.prepareAndActivateInfraApplication(tenantHostApp, version); tester.activate(app1, clusterApp1, capacity1); tester.activate(app2, clusterApp2, capacity2); assertEquals(Set.of(tester.nodeRepository.nodes().list().nodeType(NodeType.host).asList()), - Set.of(tester.nodeRepository.nodes().list(Node.State.active).owner(tenantHostApp).asList())); + Set.of(tester.nodeRepository.nodes().list(Node.State.active).owner(tenantHostApp.getApplicationId()).asList())); assertEquals(capacity1.minResources().nodes(), tester.nodeRepository.nodes().list(Node.State.active).owner(app1).size()); assertEquals(capacity2.minResources().nodes(), tester.nodeRepository.nodes().list(Node.State.active).owner(app2).size()); - Map apps = Map.of( - tenantHostApp, new MockDeployer.ApplicationContext(tenantHostApp, clusterNodeAdminApp, allHosts), - app1, new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1), - app2, new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); + List apps = List.of( + new MockDeployer.ApplicationContext(tenantHostApp, version), + new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1), + new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); tester.initializeMaintainers(apps); return tester; } @@ -167,7 +172,7 @@ public class NodeFailTester { public static NodeFailTester withOneUndeployedApplication(Capacity capacity, ClusterSpec spec) { NodeFailTester tester = new NodeFailTester(); - Map apps = Map.of(app1, new MockDeployer.ApplicationContext(app1, spec, capacity)); + List apps = List.of(new MockDeployer.ApplicationContext(app1, spec, capacity)); tester.initializeMaintainers(apps); return tester; } @@ -177,23 +182,16 @@ public class NodeFailTester { tester.createReadyNodes(count, nodeType); // Create application - Capacity allNodes = Capacity.fromRequiredNodeType(nodeType); - ClusterSpec clusterApp1 = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("test")).vespaVersion("6.42").build(); - tester.activate(app1, clusterApp1, allNodes); + InfraApplication application = ProvisioningTester.infraApplication(nodeType); + Version version = Version.fromString("6.42"); + tester.tester.prepareAndActivateInfraApplication(application, version); assertEquals(count, tester.nodeRepository.nodes().list(Node.State.active).nodeType(nodeType).size()); - Map apps = Map.of( - app1, new MockDeployer.ApplicationContext(app1, clusterApp1, allNodes)); + List apps = List.of(new MockDeployer.ApplicationContext(application, version)); tester.initializeMaintainers(apps); return tester; } - public static NodeFailTester withNoApplications() { - NodeFailTester tester = new NodeFailTester(); - tester.initializeMaintainers(Map.of()); - return tester; - } - public void runMaintainers() { updater.maintain(); failer.maintain(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OsUpgradeActivatorTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OsUpgradeActivatorTest.java index be43d39cdeb..55cb2a7baae 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OsUpgradeActivatorTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OsUpgradeActivatorTest.java @@ -2,7 +2,6 @@ package com.yahoo.vespa.hosted.provision.maintenance; import com.yahoo.component.Version; -import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ClusterMembership; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.NodeType; @@ -38,13 +37,11 @@ public class OsUpgradeActivatorTest { var version0 = Version.fromString("7.0"); // Create infrastructure nodes - var configHostApplication = ApplicationId.from("hosted-vespa", "configserver-host", "default"); var configHostNodes = tester.makeReadyNodes(3, "default", NodeType.confighost, 1); - tester.prepareAndActivateInfraApplication(configHostApplication, NodeType.confighost, version0); + tester.prepareAndActivateInfraApplication(NodeType.confighost, version0); - var tenantHostApplication = ApplicationId.from("hosted-vespa", "tenant-host", "default"); var tenantHostNodes = tester.makeReadyNodes(3, "default", NodeType.host, 1); - tester.prepareAndActivateInfraApplication(tenantHostApplication, NodeType.host, version0); + tester.prepareAndActivateInfraApplication(NodeType.host, version0); tester.clock().advance(Duration.ofDays(1).plusSeconds(1)); // Let grace period pass var allNodes = new ArrayList<>(configHostNodes); @@ -67,7 +64,7 @@ public class OsUpgradeActivatorTest { // Tenant hosts start upgrading to next Vespa version var version1 = Version.fromString("7.1"); - tester.prepareAndActivateInfraApplication(tenantHostApplication, NodeType.host, version1); + tester.prepareAndActivateInfraApplication(NodeType.host, version1); assertEquals("Wanted version of " + NodeType.host + " is raised", version1, minWantedVersion(tenantHostNodes)); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java index 2df38a38d49..cad5a87acfd 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java @@ -26,7 +26,6 @@ import org.junit.Test; import java.time.Duration; import java.time.Instant; import java.util.List; -import java.util.Map; import static org.junit.Assert.assertEquals; @@ -221,9 +220,9 @@ public class PeriodicApplicationMaintainerTest { Fixture() { this.tester = new ProvisioningTester.Builder().build(); this.nodeRepository = tester.nodeRepository(); - Map apps = Map.of( - app1, new MockDeployer.ApplicationContext(app1, clusterApp1, Capacity.from(new ClusterResources(wantedNodesApp1, 1, nodeResources))), - app2, new MockDeployer.ApplicationContext(app2, clusterApp2, Capacity.from(new ClusterResources(wantedNodesApp2, 1, nodeResources)))); + List apps = List.of( + new MockDeployer.ApplicationContext(app1, clusterApp1, Capacity.from(new ClusterResources(wantedNodesApp1, 1, nodeResources))), + new MockDeployer.ApplicationContext(app2, clusterApp2, Capacity.from(new ClusterResources(wantedNodesApp2, 1, nodeResources)))); this.deployer = new MockDeployer(tester.provisioner(), nodeRepository.clock(), apps); this.maintainer = new TestablePeriodicApplicationMaintainer(deployer, nodeRepository, Duration.ofDays(1), // Long duration to prevent scheduled runs during test Duration.ofMinutes(30)); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java index 5bdff2d3a3a..bd2cc98cea7 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RebalancerTest.java @@ -28,7 +28,6 @@ import org.junit.Test; import java.time.Duration; import java.util.Comparator; import java.util.List; -import java.util.Map; import java.util.Optional; import static com.yahoo.vespa.hosted.provision.maintenance.Rebalancer.waitTimeAfterPreviousDeployment; @@ -139,7 +138,7 @@ public class RebalancerTest { @Test public void testRebalancingDoesNotReduceSwitchExclusivity() { Capacity capacity = Capacity.from(new ClusterResources(4, 1, RebalancerTester.cpuResources), true, false); - Map apps = Map.of(cpuApp, new ApplicationContext(cpuApp, RebalancerTester.clusterSpec("c"), capacity)); + List apps = List.of(new ApplicationContext(cpuApp, RebalancerTester.clusterSpec("c"), capacity)); RebalancerTester tester = new RebalancerTester(4, apps); // Application is deployed and balanced across exclusive switches @@ -177,11 +176,11 @@ public class RebalancerTest { RebalancerTester() { this(3, - Map.of(cpuApp, new ApplicationContext(cpuApp, clusterSpec("c"), Capacity.from(new ClusterResources(1, 1, cpuResources))), - memoryApp, new ApplicationContext(memoryApp, clusterSpec("c"), Capacity.from(new ClusterResources(1, 1, memResources))))); + List.of(new ApplicationContext(cpuApp, clusterSpec("c"), Capacity.from(new ClusterResources(1, 1, cpuResources))), + new ApplicationContext(memoryApp, clusterSpec("c"), Capacity.from(new ClusterResources(1, 1, memResources))))); } - RebalancerTester(int hostCount, Map apps) { + RebalancerTester(int hostCount, List apps) { deployer = new MockDeployer(tester.provisioner(), tester.clock(), apps); rebalancer = new Rebalancer(deployer, tester.nodeRepository(), metric, Duration.ofMinutes(1)); List hosts = tester.makeReadyNodes(hostCount, "flat", NodeType.host, 8); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java index aaa4bffc000..f42044c2944 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java @@ -36,7 +36,6 @@ import org.junit.Test; import java.time.Duration; import java.time.Instant; -import java.util.Collections; import java.util.HashSet; import java.util.List; import java.util.Set; @@ -99,9 +98,9 @@ public class RetiredExpirerTest { MockDeployer deployer = new MockDeployer(provisioner, clock, - Collections.singletonMap(applicationId, new MockDeployer.ApplicationContext(applicationId, - cluster, - Capacity.from(new ClusterResources(wantedNodes, 1, nodeResources))))); + List.of(new MockDeployer.ApplicationContext(applicationId, + cluster, + Capacity.from(new ClusterResources(wantedNodes, 1, nodeResources))))); createRetiredExpirer(deployer).run(); assertEquals(3, nodeRepository.nodes().list(Node.State.active).owner(applicationId).size()); assertEquals(4, nodeRepository.nodes().list(Node.State.inactive).owner(applicationId).size()); @@ -133,11 +132,9 @@ public class RetiredExpirerTest { MockDeployer deployer = new MockDeployer(provisioner, clock, - Collections.singletonMap( - applicationId, - new MockDeployer.ApplicationContext(applicationId, - cluster, - Capacity.from(new ClusterResources(wantedNodes, 1, nodeResources))))); + List.of(new MockDeployer.ApplicationContext(applicationId, + cluster, + Capacity.from(new ClusterResources(wantedNodes, 1, nodeResources))))); // Allow the 1st and 3rd retired nodes permission to inactivate doNothing() diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/SwitchRebalancerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/SwitchRebalancerTest.java index 6895f5eeae7..ec49828241b 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/SwitchRebalancerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/SwitchRebalancerTest.java @@ -23,9 +23,7 @@ import org.junit.Test; import java.time.Duration; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; -import java.util.stream.Collectors; import java.util.stream.Stream; import static org.junit.Assert.assertEquals; @@ -235,7 +233,7 @@ public class SwitchRebalancerTest { .map(spec -> new ClusterContext(app, spec, capacity)) .toList(); ApplicationContext context = new ApplicationContext(app, clusterContexts); - return new MockDeployer(tester.provisioner(), tester.clock(), Map.of(app, context)); + return new MockDeployer(tester.provisioner(), tester.clock(), List.of(context)); } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java index ada96b3f793..0fa9aa610a4 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java @@ -219,7 +219,7 @@ public class OsVersionsTest { var versions = new OsVersions(tester.nodeRepository(), Cloud.builder().dynamicProvisioning(true).build()); setMaxActiveUpgrades(Integer.MAX_VALUE); int hostCount = 3; - provisionInfraApplication(hostCount, infraApplication, NodeType.host); + provisionInfraApplication(hostCount, NodeType.host); Supplier hostNodes = () -> tester.nodeRepository().nodes().list() .nodeType(NodeType.host) .not().state(Node.State.deprovisioned); @@ -326,7 +326,7 @@ public class OsVersionsTest { .account(CloudAccount.from("000000000000")) .build()); - provisionInfraApplication(hostCount, infraApplication, NodeType.host, NodeResources.StorageType.remote, NodeResources.Architecture.x86_64); + provisionInfraApplication(hostCount, NodeType.host, NodeResources.StorageType.remote, NodeResources.Architecture.x86_64); Supplier hostNodes = () -> tester.nodeRepository().nodes().list().nodeType(NodeType.host); // New target is set @@ -371,8 +371,8 @@ public class OsVersionsTest { setMaxActiveUpgrades(1); var versions = new OsVersions(tester.nodeRepository(), Cloud.defaultCloud()); int hostCount = 3; - provisionInfraApplication(hostCount, infraApplication, NodeType.host); - provisionInfraApplication(hostCount, ApplicationId.from("hosted-vespa", "confighost", "default"), NodeType.confighost); + provisionInfraApplication(hostCount, NodeType.host); + provisionInfraApplication(hostCount, NodeType.confighost); Supplier hosts = () -> tester.nodeRepository().nodes().list().nodeType(NodeType.host, NodeType.confighost); @@ -406,7 +406,7 @@ public class OsVersionsTest { int hostCount = 5; ApplicationId app1 = ApplicationId.from("t1", "a1", "i1"); ApplicationId app2 = ApplicationId.from("t2", "a2", "i2"); - provisionInfraApplication(hostCount, infraApplication, NodeType.host); + provisionInfraApplication(hostCount, NodeType.host); deployApplication(app1); deployApplication(app2); Supplier hosts = () -> tester.nodeRepository().nodes().list().nodeType(NodeType.host); @@ -481,7 +481,7 @@ public class OsVersionsTest { int hostCount = 3; setMaxActiveUpgrades(hostCount); var versions = new OsVersions(tester.nodeRepository(), Cloud.defaultCloud()); - provisionInfraApplication(hostCount, infraApplication, NodeType.proxyhost); + provisionInfraApplication(hostCount, NodeType.proxyhost); Supplier hosts = () -> tester.nodeRepository().nodes().list().nodeType(NodeType.proxyhost); // All hosts are on initial version @@ -532,25 +532,23 @@ public class OsVersionsTest { } private List provisionInfraApplication(int nodeCount) { - return provisionInfraApplication(nodeCount, infraApplication, NodeType.host); + return provisionInfraApplication(nodeCount, NodeType.host); } - private List provisionInfraApplication(int nodeCount, ApplicationId application, - NodeType nodeType) { - return provisionInfraApplication(nodeCount, application, nodeType, NodeResources.StorageType.local); + private List provisionInfraApplication(int nodeCount, NodeType nodeType) { + return provisionInfraApplication(nodeCount, nodeType, NodeResources.StorageType.local); } - private List provisionInfraApplication(int nodeCount, ApplicationId application, - NodeType nodeType, NodeResources.StorageType storageType) { - return provisionInfraApplication(nodeCount, application, nodeType, storageType, NodeResources.Architecture.x86_64); + private List provisionInfraApplication(int nodeCount, NodeType nodeType, NodeResources.StorageType storageType) { + return provisionInfraApplication(nodeCount, nodeType, storageType, NodeResources.Architecture.x86_64); } - private List provisionInfraApplication(int nodeCount, ApplicationId application, NodeType nodeType, + private List provisionInfraApplication(int nodeCount, NodeType nodeType, NodeResources.StorageType storageType, NodeResources.Architecture architecture) { var nodes = tester.makeReadyNodes(nodeCount, new NodeResources(48, 128, 2000, 10, NodeResources.DiskSpeed.fast, storageType, architecture), nodeType, 10); - tester.prepareAndActivateInfraApplication(application, nodeType); + tester.prepareAndActivateInfraApplication(nodeType); tester.clock().advance(Duration.ofDays(1).plusSeconds(1)); // Let grace period pass return nodes.stream() .map(Node::hostname) @@ -587,11 +585,10 @@ public class OsVersionsTest { tester.patchNodes(nodes, (node) -> { Optional wantedOsVersion = node.status().osVersion().wanted(); if (node.status().wantToDeprovision()) { - ApplicationId application = node.allocation().get().owner(); tester.nodeRepository().nodes().park(node.hostname(), true, Agent.system, getClass().getSimpleName()); tester.nodeRepository().nodes().removeRecursively(node.hostname()); - node = provisionInfraApplication(1, application, nodeType).get(0); + node = provisionInfraApplication(1, nodeType).get(0); } return node.with(node.status().withOsVersion(node.status().osVersion().withCurrent(wantedOsVersion))); }); @@ -602,7 +599,6 @@ public class OsVersionsTest { tester.patchNodes(nodes, (node) -> { Optional wantedOsVersion = node.status().osVersion().wanted(); if (node.status().wantToRebuild()) { - ApplicationId application = node.allocation().get().owner(); tester.nodeRepository().nodes().park(node.hostname(), true, Agent.system, getClass().getSimpleName()); tester.nodeRepository().nodes().removeRecursively(node.hostname()); @@ -610,7 +606,7 @@ public class OsVersionsTest { .build(); node = tester.nodeRepository().nodes().addNodes(List.of(newNode), Agent.system).get(0); node = tester.move(Node.State.ready, node); - tester.prepareAndActivateInfraApplication(application, nodeType); + tester.prepareAndActivateInfraApplication(nodeType); node = tester.nodeRepository().nodes().node(node.hostname()).get(); } return node.with(node.status().withOsVersion(node.status().osVersion().withCurrent(wantedOsVersion))); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java index ab99a44cbab..50eeef69448 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java @@ -44,8 +44,7 @@ public class AclProvisioningTest { // Populate repo tester.makeReadyNodes(10, new NodeResources(1, 4, 10, 1)); List host = tester.makeReadyNodes(1, new NodeResources(1, 4, 10, 1), NodeType.host); - ApplicationId zoneApplication = ProvisioningTester.applicationId(); - tester.deploy(zoneApplication, Capacity.fromRequiredNodeType(NodeType.host)); + tester.activateTenantHosts(); tester.makeReadyChildren(1, new NodeResources(1, 4, 10, 1), host.get(0).hostname()); List proxyNodes = tester.makeReadyNodes(3, new NodeResources(1, 4, 10, 1), NodeType.proxy); @@ -136,11 +135,10 @@ public class AclProvisioningTest { tester.makeReadyNodes(3, "default", NodeType.proxy); // Deploy zone application - ApplicationId zoneApplication = ProvisioningTester.applicationId(); - tester.deploy(zoneApplication, Capacity.fromRequiredNodeType(NodeType.proxy)); + tester.prepareAndActivateInfraApplication(NodeType.proxy); // Get trusted nodes for first proxy node - NodeList proxyNodes = tester.nodeRepository().nodes().list().owner(zoneApplication); + NodeList proxyNodes = tester.nodeRepository().nodes().list().nodeType(NodeType.proxy); Node node = proxyNodes.first().get(); NodeAcl nodeAcl = node.acl(tester.nodeRepository().nodes().list(), tester.nodeRepository().loadBalancers(), tester.nodeRepository().zone()); @@ -180,8 +178,8 @@ public class AclProvisioningTest { tester.makeReadyNodes(3, "default", NodeType.controller); // Allocate - ApplicationId controllerApplication = ProvisioningTester.applicationId(); - List controllers = tester.deploy(controllerApplication, Capacity.fromRequiredNodeType(NodeType.controller)); + tester.prepareAndActivateInfraApplication(NodeType.controller); + List controllers = tester.nodeRepository().nodes().list().nodeType(NodeType.controller).asList(); // Controllers and hosts all trust each other NodeAcl controllerAcl = controllers.get(0).acl(tester.nodeRepository().nodes().list(), tester.nodeRepository().loadBalancers(), tester.nodeRepository().zone()); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java index a03811778d2..0bb6dc61d1b 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InPlaceResizeProvisionTest.java @@ -5,9 +5,9 @@ import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.HostSpec; +import com.yahoo.config.provision.NodeAllocationException; import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.NodeType; -import com.yahoo.config.provision.NodeAllocationException; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.Zone; import com.yahoo.vespa.flags.InMemoryFlagSource; @@ -57,7 +57,6 @@ public class InPlaceResizeProvisionTest { private final ProvisioningTester tester = new ProvisioningTester.Builder() .flagSource(flagSource) .zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); - private final ApplicationId infraApp = ProvisioningTester.applicationId(); private final ApplicationId app = ProvisioningTester.applicationId(); @Test @@ -243,7 +242,7 @@ public class InPlaceResizeProvisionTest { private void addParentHosts(int count, NodeResources resources) { tester.makeReadyNodes(count, resources, NodeType.host, 4); - tester.prepareAndActivateInfraApplication(infraApp, NodeType.host); + tester.activateTenantHosts(); } private void assertSizeAndResources(ClusterSpec cluster, int clusterSize, NodeResources resources) { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java index 673e7610514..53054ba3f24 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java @@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.provision.provisioning; import ai.vespa.http.DomainName; import com.google.common.collect.Iterators; +import com.yahoo.component.Version; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.Cloud; @@ -61,7 +62,6 @@ public class LoadBalancerProvisionerTest { private final ApplicationId app1 = ApplicationId.from("tenant1", "application1", "default"); private final ApplicationId app2 = ApplicationId.from("tenant2", "application2", "default"); - private final ApplicationId infraApp1 = ApplicationId.from("vespa", "tenant-host", "default"); private final NodeResources nodeResources = new NodeResources(2, 4, 10, 0.3); private final InMemoryFlagSource flagSource = new InMemoryFlagSource(); @@ -212,11 +212,10 @@ public class LoadBalancerProvisionerTest { @Test public void does_not_provision_load_balancers_for_non_tenant_node_type() { - tester.activate(infraApp1, prepare(infraApp1, Capacity.fromRequiredNodeType(NodeType.host), - clusterRequest(ClusterSpec.Type.container, - ClusterSpec.Id.from("tenant-host")))); + var tenantHostApp = ProvisioningTester.infraApplication(NodeType.host); + tester.prepareAndActivateInfraApplication(tenantHostApp); assertTrue("No load balancer provisioned", tester.loadBalancerService().instances().isEmpty()); - assertEquals(List.of(), tester.nodeRepository().loadBalancers().list(infraApp1).asList()); + assertEquals(List.of(), tester.nodeRepository().loadBalancers().list(tenantHostApp.getApplicationId()).asList()); } @Test @@ -242,12 +241,12 @@ public class LoadBalancerProvisionerTest { @Test public void provision_load_balancer_config_server_cluster() { - provisionInfrastructureLoadBalancer(infraApp1, NodeType.config); + provisionInfrastructureLoadBalancer(NodeType.config); } @Test public void provision_load_balancer_controller_cluster() { - provisionInfrastructureLoadBalancer(infraApp1, NodeType.controller); + provisionInfrastructureLoadBalancer(NodeType.controller); } @Test @@ -438,16 +437,16 @@ public class LoadBalancerProvisionerTest { activeNodes, reals); } - private void provisionInfrastructureLoadBalancer(ApplicationId application, NodeType nodeType) { - Supplier> lbs = () -> tester.nodeRepository().loadBalancers().list(application).asList(); - var cluster = ClusterSpec.Id.from("infra-cluster"); - ClusterSpec.Type clusterType = nodeType == NodeType.config ? ClusterSpec.Type.admin : ClusterSpec.Type.container; - var nodes = prepare(application, Capacity.fromRequiredNodeType(nodeType), clusterRequest(clusterType, cluster)); + private void provisionInfrastructureLoadBalancer(NodeType nodeType) { + var infraApp = ProvisioningTester.infraApplication(nodeType); + Supplier> lbs = () -> tester.nodeRepository().loadBalancers().list(infraApp.getApplicationId()).asList(); + tester.prepareAndActivateInfraApplication(infraApp); + var nodes = prepare(infraApp.getApplicationId(), infraApp.getCapacity(), infraApp.getClusterSpecWithVersion(Version.fromString("7.1"))); assertEquals(1, lbs.get().size()); - tester.activate(application, nodes); + tester.activate(infraApp.getApplicationId(), nodes); assertEquals("Prepare provisions load balancer with reserved nodes", 3, lbs.get().get(0).instance().get().reals().size()); assertSame(LoadBalancer.State.active, lbs.get().get(0).state()); - assertEquals(cluster, lbs.get().get(0).id().cluster()); + assertEquals(infraApp.getClusterSpecId(), lbs.get().get(0).id().cluster()); } private void dirtyNodesOf(ApplicationId application) { diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java index 3db8a71e4a7..cfd7a3511de 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java @@ -19,7 +19,6 @@ import org.junit.Ignore; import org.junit.Test; import java.time.Duration; -import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; @@ -233,8 +232,7 @@ public class MultigroupProvisioningTest { MockDeployer deployer = new MockDeployer(tester.provisioner(), tester.clock(), - Collections.singletonMap(application1, - new MockDeployer.ApplicationContext(application1, cluster(), + List.of(new MockDeployer.ApplicationContext(application1, cluster(), Capacity.from(new ClusterResources(8, 1, large), false, true)))); new RetiredExpirer(tester.nodeRepository(), deployer, diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java index 4af5728f167..38e38dc319b 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/NodeTypeProvisioningTest.java @@ -1,10 +1,7 @@ // Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.hosted.provision.provisioning; -import com.yahoo.config.provision.ApplicationId; -import com.yahoo.config.provision.Capacity; -import com.yahoo.config.provision.ClusterSpec; -import com.yahoo.config.provision.HostSpec; +import com.yahoo.component.Version; import com.yahoo.config.provision.NodeType; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeList; @@ -12,12 +9,11 @@ import com.yahoo.vespa.hosted.provision.maintenance.RetiredExpirer; import com.yahoo.vespa.hosted.provision.maintenance.TestMetric; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.testutils.MockDeployer; +import com.yahoo.vespa.service.duper.InfraApplication; import org.junit.Before; import org.junit.Test; import java.time.Duration; -import java.util.Collections; -import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.stream.Collectors; @@ -34,9 +30,7 @@ public class NodeTypeProvisioningTest { private final ProvisioningTester tester = new ProvisioningTester.Builder().build(); - private final ApplicationId application = ProvisioningTester.applicationId(); // application using proxy nodes - private final Capacity capacity = Capacity.fromRequiredNodeType(NodeType.proxy); - private final ClusterSpec clusterSpec = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("test")).vespaVersion("6.42").build(); + private final InfraApplication proxyApp = ProvisioningTester.infraApplication(NodeType.proxy); @Before public void setup() { @@ -51,26 +45,20 @@ public class NodeTypeProvisioningTest { @Test public void proxy_deployment() { { // Deploy - List hosts = deployProxies(application, tester); - assertEquals("Reserved all proxies", 11, hosts.size()); - tester.activate(application, new HashSet<>(hosts)); + tester.prepareAndActivateInfraApplication(proxyApp); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals("Activated all proxies", 11, nodes.size()); } { // Redeploy with no changes - List hosts = deployProxies(application, tester); - assertEquals(11, hosts.size()); - tester.activate(application, new HashSet<>(hosts)); + tester.prepareAndActivateInfraApplication(proxyApp); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals(11, nodes.size()); } { // Add 2 ready proxies then redeploy tester.makeReadyNodes(2, "small", NodeType.proxy); - List hosts = deployProxies(application, tester); - assertEquals(13, hosts.size()); - tester.activate(application, new HashSet<>(hosts)); + tester.prepareAndActivateInfraApplication(proxyApp); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals(13, nodes.size()); } @@ -81,9 +69,7 @@ public class NodeTypeProvisioningTest { tester.nodeRepository().nodes().fail(nodes.asList().get(1).hostname(), Agent.system, "Failing to unit test"); tester.nodeRepository().nodes().fail(nodes.asList().get(5).hostname(), Agent.system, "Failing to unit test"); - List hosts = deployProxies(application, tester); - assertEquals(10, hosts.size()); - tester.activate(application, new HashSet<>(hosts)); + tester.prepareAndActivateInfraApplication(proxyApp); nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals(10, nodes.size()); } @@ -93,10 +79,7 @@ public class NodeTypeProvisioningTest { public void retire_proxy() { MockDeployer deployer = new MockDeployer(tester.provisioner(), tester.clock(), - Collections.singletonMap(application, - new MockDeployer.ApplicationContext(application, - clusterSpec, - capacity))); + List.of(new MockDeployer.ApplicationContext(proxyApp, Version.fromString("6.42")))); RetiredExpirer retiredExpirer = new RetiredExpirer(tester.nodeRepository(), deployer, new TestMetric(), @@ -104,9 +87,7 @@ public class NodeTypeProvisioningTest { Duration.ofMinutes(10)); { // Deploy - List hosts = deployProxies(application, tester); - assertEquals("Reserved all proxies", 11, hosts.size()); - tester.activate(application, new HashSet<>(hosts)); + tester.prepareAndActivateInfraApplication(proxyApp); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals("Activated all proxies", 11, nodes.size()); } @@ -115,9 +96,7 @@ public class NodeTypeProvisioningTest { { // Pick out a node and retire it tester.nodeRepository().nodes().write(nodeToRetire.withWantToRetire(true, Agent.system, tester.clock().instant()), () -> {}); - List hosts = deployProxies(application, tester); - assertEquals(11, hosts.size()); - tester.activate(application, new HashSet<>(hosts)); + tester.prepareAndActivateInfraApplication(proxyApp); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals(11, nodes.size()); @@ -129,9 +108,7 @@ public class NodeTypeProvisioningTest { } { // Redeploying while the node is still retiring has no effect - List hosts = deployProxies(application, tester); - assertEquals(11, hosts.size()); - tester.activate(application, new HashSet<>(hosts)); + tester.prepareAndActivateInfraApplication(proxyApp); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals(11, nodes.size()); @@ -146,9 +123,7 @@ public class NodeTypeProvisioningTest { tester.advanceTime(Duration.ofMinutes(11)); retiredExpirer.run(); - List hosts = deployProxies(application, tester); - assertEquals(10, hosts.size()); - tester.activate(application, new HashSet<>(hosts)); + tester.prepareAndActivateInfraApplication(proxyApp); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals(10, nodes.size()); @@ -162,8 +137,7 @@ public class NodeTypeProvisioningTest { public void retire_multiple_proxy_simultaneously() { MockDeployer deployer = new MockDeployer(tester.provisioner(), tester.clock(), - Collections.singletonMap(application, - new MockDeployer.ApplicationContext(application, clusterSpec, capacity))); + List.of(new MockDeployer.ApplicationContext(proxyApp, Version.fromString("6.42")))); RetiredExpirer retiredExpirer = new RetiredExpirer(tester.nodeRepository(), deployer, new TestMetric(), @@ -172,9 +146,7 @@ public class NodeTypeProvisioningTest { final int numNodesToRetire = 5; { // Deploy - List hosts = deployProxies(application, tester); - assertEquals("Reserved all proxies", 11, hosts.size()); - tester.activate(application, new HashSet<>(hosts)); + tester.prepareAndActivateInfraApplication(proxyApp); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals("Activated all proxies", 11, nodes.size()); } @@ -185,9 +157,7 @@ public class NodeTypeProvisioningTest { nodesToRetire.forEach(nodeToRetire -> tester.nodeRepository().nodes().write(nodeToRetire.withWantToRetire(true, Agent.system, tester.clock().instant()), () -> {})); - List hosts = deployProxies(application, tester); - assertEquals(11, hosts.size()); - tester.activate(application, new HashSet<>(hosts)); + tester.prepareAndActivateInfraApplication(proxyApp); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals(11, nodes.size()); @@ -202,9 +172,7 @@ public class NodeTypeProvisioningTest { } { // Redeploying while the nodes are still retiring has no effect - List hosts = deployProxies(application, tester); - assertEquals(11, hosts.size()); - tester.activate(application, new HashSet<>(hosts)); + tester.prepareAndActivateInfraApplication(proxyApp); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals(11, nodes.size()); @@ -220,9 +188,7 @@ public class NodeTypeProvisioningTest { tester.advanceTime(Duration.ofMinutes(11)); retiredExpirer.run(); - List hosts = deployProxies(application, tester); - assertEquals(6, hosts.size()); - tester.activate(application, new HashSet<>(hosts)); + tester.prepareAndActivateInfraApplication(proxyApp); // All currently active proxy nodes are not marked with wantToRetire or as retired long numRetiredActiveProxyNodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy).stream() @@ -237,8 +203,4 @@ public class NodeTypeProvisioningTest { } } - private List deployProxies(ApplicationId application, ProvisioningTester tester) { - return tester.prepare(application, clusterSpec, capacity); - } - } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java index 67760d8cdf3..477101e10e2 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java @@ -189,7 +189,7 @@ public class ProvisioningTest { ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build(); tester.makeReadyHosts(4, defaultResources); - tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); + tester.activateTenantHosts(); // deploy ApplicationId application1 = ProvisioningTester.applicationId(); @@ -214,7 +214,7 @@ public class ProvisioningTest { ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build(); tester.makeReadyHosts(4, defaultResources); - tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); + tester.activateTenantHosts(); // deploy ApplicationId application1 = ProvisioningTester.applicationId(); @@ -388,7 +388,7 @@ public class ProvisioningTest { ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build(); tester.makeReadyHosts(4, defaultResources); - tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); + tester.activateTenantHosts(); ApplicationId application = ProvisioningTester.applicationId(); SystemState state = prepare(application, 2, 2, 3, 3, defaultResources, tester); @@ -401,7 +401,7 @@ public class ProvisioningTest { ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); tester.makeReadyHosts(13, defaultResources).activateTenantHosts(); - tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); + tester.activateTenantHosts(); ApplicationId application = ProvisioningTester.applicationId(); { @@ -444,7 +444,7 @@ public class ProvisioningTest { ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build(); tester.makeReadyHosts(4, defaultResources).activateTenantHosts(); - tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); + tester.activateTenantHosts(); ApplicationId application = ProvisioningTester.applicationId(); SystemState state = prepare(application, tester, 2, 2, 3, 3, defaultResources, "6.91"); @@ -457,7 +457,7 @@ public class ProvisioningTest { ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build(); tester.makeReadyHosts(4, defaultResources).activateTenantHosts(); - tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); + tester.activateTenantHosts(); ApplicationId application = ProvisioningTester.applicationId(); String dockerImageRepo = "docker.domain.tld/my/image"; @@ -602,7 +602,7 @@ public class ProvisioningTest { ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build(); tester.makeReadyHosts(4, new NodeResources(2, 4, 10, 2)); - tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); + tester.activateTenantHosts(); ApplicationId application = ProvisioningTester.applicationId(); SystemState state = prepare(application, 2, 2, 3, 3, @@ -900,8 +900,7 @@ public class ProvisioningTest { @Test public void allow_unretire_nodes_allocated_through_type_spec() { ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); - ApplicationId tenantHostAppId = ProvisioningTester.applicationId(); - tester.makeReadyHosts(10, defaultResources).prepareAndActivateInfraApplication(tenantHostAppId, NodeType.host); + tester.makeReadyHosts(10, defaultResources).activateTenantHosts(); NodeList list = tester.nodeRepository().nodes().list(); assertEquals(10, list.state(Node.State.active).nodeType(NodeType.host).size()); @@ -909,13 +908,13 @@ public class ProvisioningTest { // Pick out 5 random nodes and retire those Set retiredHostnames = list.shuffle(new Random()).first(5).hostnames(); tester.patchNodes(node -> retiredHostnames.contains(node.hostname()), node -> node.withWantToRetire(true, Agent.system, tester.clock().instant())); - tester.prepareAndActivateInfraApplication(tenantHostAppId, NodeType.host); + tester.activateTenantHosts(); assertEquals(retiredHostnames, tester.nodeRepository().nodes().list().retired().hostnames()); Set unretiredHostnames = retiredHostnames.stream().limit(2).collect(Collectors.toSet()); tester.patchNodes(node -> unretiredHostnames.contains(node.hostname()), node -> node.withWantToRetire(false, Agent.system, tester.clock().instant())); - tester.prepareAndActivateInfraApplication(tenantHostAppId, NodeType.host); + tester.activateTenantHosts(); assertEquals(3, tester.nodeRepository().nodes().list().retired().size()); } @@ -1078,7 +1077,7 @@ public class ProvisioningTest { NodeResources nodeResources = new NodeResources(1, 4, 10, 4, NodeResources.DiskSpeed.any, NodeResources.StorageType.any, NodeResources.Architecture.arm64); tester.makeReadyHosts(4, nodeResources); - tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); + tester.activateTenantHosts(); ApplicationId application = ProvisioningTester.applicationId(); SystemState state = prepare(application, 1, 1, 1, 1, nodeResources, tester); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java index dd8f97d82de..7e85131eaf4 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java @@ -30,6 +30,8 @@ import com.yahoo.config.provision.Zone; import com.yahoo.config.provisioning.FlavorsConfig; import com.yahoo.test.ManualClock; import com.yahoo.transaction.NestedTransaction; +import com.yahoo.vespa.applicationmodel.InfrastructureApplication; +import com.yahoo.vespa.applicationmodel.ServiceType; import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.curator.mock.MockCurator; import com.yahoo.vespa.curator.transaction.CuratorTransaction; @@ -50,6 +52,12 @@ import com.yahoo.vespa.hosted.provision.testutils.MockProvisionServiceProvider; import com.yahoo.vespa.hosted.provision.testutils.OrchestratorMock; import com.yahoo.vespa.orchestrator.Orchestrator; import com.yahoo.vespa.service.duper.ConfigServerApplication; +import com.yahoo.vespa.service.duper.ConfigServerHostApplication; +import com.yahoo.vespa.service.duper.ControllerApplication; +import com.yahoo.vespa.service.duper.ControllerHostApplication; +import com.yahoo.vespa.service.duper.InfraApplication; +import com.yahoo.vespa.service.duper.ProxyHostApplication; +import com.yahoo.vespa.service.duper.TenantHostApplication; import java.time.temporal.TemporalAmount; import java.util.ArrayList; @@ -78,8 +86,6 @@ import static org.junit.Assert.assertTrue; */ public class ProvisioningTester { - public static final ApplicationId tenantHostApp = ApplicationId.from("hosted-vespa", "tenant-host", "default"); - private final Curator curator; private final NodeFlavors nodeFlavors; private final ManualClock clock; @@ -242,20 +248,24 @@ public class ProvisioningTester { } } - public List prepareAndActivateInfraApplication(ApplicationId application, NodeType nodeType, Version version) { - ClusterSpec cluster = ClusterSpec.request(nodeType.isConfigServerLike() ? ClusterSpec.Type.admin : ClusterSpec.Type.container, - ClusterSpec.Id.from(nodeType == NodeType.config ? "zone-config-servers" : nodeType.toString())) - .vespaVersion(version) - .stateful(nodeType == NodeType.config || nodeType == NodeType.controller) - .build(); - Capacity capacity = Capacity.fromRequiredNodeType(nodeType); - List hostSpecs = prepare(application, cluster, capacity); - activate(application, hostSpecs); + public List prepareAndActivateInfraApplication(InfraApplication application, Version version) { + ClusterSpec cluster = application.getClusterSpecWithVersion(version); + Capacity capacity = application.getCapacity(); + List hostSpecs = prepare(application.getApplicationId(), cluster, capacity); + activate(application.getApplicationId(), hostSpecs); return hostSpecs; } - public List prepareAndActivateInfraApplication(ApplicationId application, NodeType nodeType) { - return prepareAndActivateInfraApplication(application, nodeType, Version.fromString("6.42")); + public List prepareAndActivateInfraApplication(InfraApplication application) { + return prepareAndActivateInfraApplication(application, Version.fromString("6.42")); + } + + public List prepareAndActivateInfraApplication(NodeType nodeType) { + return prepareAndActivateInfraApplication(infraApplication(nodeType)); + } + + public List prepareAndActivateInfraApplication(NodeType nodeType, Version version) { + return prepareAndActivateInfraApplication(infraApplication(nodeType), version); } public void deactivate(ApplicationId applicationId) { @@ -556,7 +566,7 @@ public class ProvisioningTester { } public void activateTenantHosts() { - prepareAndActivateInfraApplication(tenantHostApp, NodeType.host); + prepareAndActivateInfraApplication(NodeType.host); } public static ClusterSpec containerClusterSpec() { @@ -809,4 +819,31 @@ public class ProvisioningTester { } + public static InfraApplication infraApplication(NodeType nodeType) { + return switch (nodeType) { + case controllerhost -> new ControllerHostApplication(); + case controller -> new ControllerApplication(); + case confighost -> new ConfigServerHostApplication(); + case config -> new ConfigServerApplication(); + case proxyhost -> new ProxyHostApplication(); + case proxy -> new ProxyApplication(); + case host -> new TenantHostApplication(); + default -> throw new IllegalArgumentException("Infrastructure application not defined for node type " + nodeType); + }; + } + + // This is not in service-monitor because it's not really an infrastructure application like the others + // (proxy is deployed with a real application package) + private static class ProxyApplication extends InfraApplication { + private ProxyApplication() { + super(InfrastructureApplication.PROXY, ClusterSpec.Type.container, ClusterSpec.Id.from("routing"), ServiceType.CONTAINER, 4443); + } + + @Override + public ClusterSpec getClusterSpecWithVersion(Version version) { + // Not exclusive + return ClusterSpec.request(getClusterSpecType(), getClusterSpecId()).exclusive(false).vespaVersion(version).build(); + } + } + } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java index 0b4d345b8a5..62f42b0d035 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/VirtualNodeProvisioningTest.java @@ -91,7 +91,7 @@ public class VirtualNodeProvisioningTest { @Test public void allow_same_parent_host_for_nodes_in_a_cluster_in_cd_and_non_prod() { - ProvisioningTester tester = new ProvisioningTester.Builder().build(); + ProvisioningTester tester; final int containerNodeCount = 2; final int contentNodeCount = 2; @@ -102,7 +102,7 @@ public class VirtualNodeProvisioningTest { NodeResources flavor = new NodeResources(1, 4, 10, 1); tester = new ProvisioningTester.Builder().zone(new Zone(Environment.dev, RegionName.from("us-east"))).build(); tester.makeReadyNodes(4, flavor, NodeType.host, 1); - tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); + tester.activateTenantHosts(); List containerHosts = tester.prepare(applicationId, containerClusterSpec, containerNodeCount, groups, flavor); List contentHosts = tester.prepare(applicationId, contentClusterSpec, contentNodeCount, groups, flavor); @@ -116,7 +116,7 @@ public class VirtualNodeProvisioningTest { { tester = new ProvisioningTester.Builder().zone(new Zone(SystemName.cd, Environment.prod, RegionName.from("us-east"))).build(); tester.makeReadyNodes(4, resources1, NodeType.host, 1); - tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); + tester.activateTenantHosts(); List containerHosts = tester.prepare(applicationId, containerClusterSpec, containerNodeCount, groups, resources1); List contentHosts = tester.prepare(applicationId, contentClusterSpec, contentNodeCount, groups, resources1); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/ArchiveApiTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/ArchiveApiTest.java index 7fe2d77b647..4dbf9ff85c0 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/ArchiveApiTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/ArchiveApiTest.java @@ -46,7 +46,7 @@ public class ArchiveApiTest { tester.assertPartialResponse(new Request("http://localhost:8080/nodes/v2/node/host4.yahoo.com"), "\"archiveUri\":\"ftp://host/dir/tenant3/application3/instance3/id3/host4/\"", true); - tester.assertPartialResponse(new Request("http://localhost:8080/nodes/v2/node/dockerhost2.yahoo.com"), "\"archiveUri\":\"s3://acc-bucket/zoneapp/zoneapp/zoneapp/node-admin/dockerhost2/\"", true); + tester.assertPartialResponse(new Request("http://localhost:8080/nodes/v2/node/dockerhost2.yahoo.com"), "\"archiveUri\":\"s3://acc-bucket/hosted-vespa/tenant-host/default/tenant-host/dockerhost2/\"", true); assertFile(new Request("http://localhost:8080/nodes/v2/archive"), "archives.json"); tester.assertResponse(new Request("http://localhost:8080/nodes/v2/archive/tenant/tenant3", new byte[0], Request.Method.DELETE), "{\"message\":\"Removed archive URI for tenant3\"}"); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/cfg1.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/cfg1.json index 30b0347f2ba..bd251567f16 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/cfg1.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/cfg1.json @@ -26,13 +26,13 @@ }, "environment": "BARE_METAL", "owner": { - "tenant": "cfg", - "application": "cfg", - "instance": "cfg" + "tenant": "hosted-vespa", + "application": "zone-config-servers", + "instance": "default" }, "membership": { - "clustertype": "container", - "clusterid": "configservers", + "clustertype": "admin", + "clusterid": "zone-config-servers", "group": "0", "index": 0, "retired": false diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/cfg2.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/cfg2.json index f47e5d4919b..022512359cd 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/cfg2.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/cfg2.json @@ -26,13 +26,13 @@ }, "environment": "BARE_METAL", "owner": { - "tenant": "cfg", - "application": "cfg", - "instance": "cfg" + "tenant": "hosted-vespa", + "application": "zone-config-servers", + "instance": "default" }, "membership": { - "clustertype": "container", - "clusterid": "configservers", + "clustertype": "admin", + "clusterid": "zone-config-servers", "group": "0", "index": 1, "retired": false diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-os-upgrade-complete.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-os-upgrade-complete.json index 6e166e6c5d1..84b34a72e78 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-os-upgrade-complete.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-os-upgrade-complete.json @@ -26,13 +26,13 @@ }, "environment": "BARE_METAL", "owner": { - "tenant": "zoneapp", - "application": "zoneapp", - "instance": "zoneapp" + "tenant": "hosted-vespa", + "application": "tenant-host", + "instance": "default" }, "membership": { "clustertype": "container", - "clusterid": "node-admin", + "clusterid": "tenant-host", "group": "0", "index": 0, "retired": false diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports-2.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports-2.json index 9dad2b3df19..bc1c11c8d06 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports-2.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports-2.json @@ -26,13 +26,13 @@ }, "environment": "BARE_METAL", "owner": { - "tenant": "zoneapp", - "application": "zoneapp", - "instance": "zoneapp" + "tenant": "hosted-vespa", + "application": "tenant-host", + "instance": "default" }, "membership": { "clustertype": "container", - "clusterid": "node-admin", + "clusterid": "tenant-host", "group": "0", "index": 0, "retired": false diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports-3.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports-3.json index 024569f344c..3b7970a9ec0 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports-3.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports-3.json @@ -26,13 +26,13 @@ }, "environment": "BARE_METAL", "owner": { - "tenant": "zoneapp", - "application": "zoneapp", - "instance": "zoneapp" + "tenant": "hosted-vespa", + "application": "tenant-host", + "instance": "default" }, "membership": { "clustertype": "container", - "clusterid": "node-admin", + "clusterid": "tenant-host", "group": "0", "index": 0, "retired": false diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports-4.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports-4.json index 314a976724b..d99e71bab49 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports-4.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports-4.json @@ -26,13 +26,13 @@ }, "environment": "BARE_METAL", "owner": { - "tenant": "zoneapp", - "application": "zoneapp", - "instance": "zoneapp" + "tenant": "hosted-vespa", + "application": "tenant-host", + "instance": "default" }, "membership": { "clustertype": "container", - "clusterid": "node-admin", + "clusterid": "tenant-host", "group": "0", "index": 0, "retired": false diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports.json index e2050e9fc70..88bfd9d9418 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1-reports.json @@ -26,13 +26,13 @@ }, "environment": "BARE_METAL", "owner": { - "tenant": "zoneapp", - "application": "zoneapp", - "instance": "zoneapp" + "tenant": "hosted-vespa", + "application": "tenant-host", + "instance": "default" }, "membership": { "clustertype": "container", - "clusterid": "node-admin", + "clusterid": "tenant-host", "group": "0", "index": 0, "retired": false diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1.json index 7458c189e27..f70b2dc1b72 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node1.json @@ -26,13 +26,13 @@ }, "environment": "BARE_METAL", "owner": { - "tenant": "zoneapp", - "application": "zoneapp", - "instance": "zoneapp" + "tenant": "hosted-vespa", + "application": "tenant-host", + "instance": "default" }, "membership": { "clustertype": "container", - "clusterid": "node-admin", + "clusterid": "tenant-host", "group": "0", "index": 0, "retired": false diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node2.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node2.json index a86805d1a71..c1c1ba0cae8 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node2.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node2.json @@ -26,13 +26,13 @@ }, "environment": "BARE_METAL", "owner": { - "tenant": "zoneapp", - "application": "zoneapp", - "instance": "zoneapp" + "tenant": "hosted-vespa", + "application": "tenant-host", + "instance": "default" }, "membership": { "clustertype": "container", - "clusterid": "node-admin", + "clusterid": "tenant-host", "group": "0", "index": 1, "retired": false diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node3.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node3.json index 8d0d1649ed0..c597b7afa14 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node3.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node3.json @@ -26,13 +26,13 @@ }, "environment": "BARE_METAL", "owner": { - "tenant": "zoneapp", - "application": "zoneapp", - "instance": "zoneapp" + "tenant": "hosted-vespa", + "application": "tenant-host", + "instance": "default" }, "membership": { "clustertype": "container", - "clusterid": "node-admin", + "clusterid": "tenant-host", "group": "0", "index": 2, "retired": false diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node4.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node4.json index 1dd7d583bb0..8a85d55e0df 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node4.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node4.json @@ -26,13 +26,13 @@ }, "environment": "BARE_METAL", "owner": { - "tenant": "zoneapp", - "application": "zoneapp", - "instance": "zoneapp" + "tenant": "hosted-vespa", + "application": "tenant-host", + "instance": "default" }, "membership": { "clustertype": "container", - "clusterid": "node-admin", + "clusterid": "tenant-host", "group": "0", "index": 3, "retired": false diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node5.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node5.json index 080c162f7e7..70b5e465de8 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node5.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/docker-node5.json @@ -26,13 +26,13 @@ }, "environment": "BARE_METAL", "owner": { - "tenant": "zoneapp", - "application": "zoneapp", - "instance": "zoneapp" + "tenant": "hosted-vespa", + "application": "tenant-host", + "instance": "default" }, "membership": { "clustertype": "container", - "clusterid": "node-admin", + "clusterid": "tenant-host", "group": "0", "index": 4, "retired": false diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/dockerhost1-with-firmware-data.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/dockerhost1-with-firmware-data.json index 362a9bfbf1c..85b49dd5113 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/dockerhost1-with-firmware-data.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/dockerhost1-with-firmware-data.json @@ -26,13 +26,13 @@ }, "environment": "BARE_METAL", "owner": { - "tenant": "zoneapp", - "application": "zoneapp", - "instance": "zoneapp" + "tenant": "hosted-vespa", + "application": "tenant-host", + "instance": "default" }, "membership": { "clustertype": "container", - "clusterid": "node-admin", + "clusterid": "tenant-host", "group": "0", "index": 0, "retired": false diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/load-balancers.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/load-balancers.json index eef381e8df7..96213dea0a7 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/load-balancers.json +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/load-balancers.json @@ -41,14 +41,14 @@ "public": false }, { - "id": "cfg:cfg:cfg:configservers", - "state": "reserved", + "id": "hosted-vespa:zone-config-servers:default:zone-config-servers", + "state": "active", "changedAt": 123, - "application": "cfg", - "tenant": "cfg", - "instance": "cfg", - "cluster": "configservers", - "hostname": "lb-cfg.cfg.cfg-configservers", + "application": "zone-config-servers", + "tenant": "hosted-vespa", + "instance": "default", + "cluster": "zone-config-servers", + "hostname": "lb-hosted-vespa.zone-config-servers-zone-config-servers", "dnsZone": "zone-id-1", "networks": [ "10.2.3.0/24", @@ -57,7 +57,18 @@ "ports": [ 4443 ], - "reals": [], + "reals": [ + { + "hostname": "cfg1.yahoo.com", + "ipAddress": "127.0.201.1", + "port": 4443 + }, + { + "hostname": "cfg2.yahoo.com", + "ipAddress": "127.0.202.1", + "port": 4443 + } + ], "public": true }, { diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/duper/ConfigServerLikeApplication.java b/service-monitor/src/main/java/com/yahoo/vespa/service/duper/ConfigServerLikeApplication.java index cc3aeddff01..9ea340535bc 100644 --- a/service-monitor/src/main/java/com/yahoo/vespa/service/duper/ConfigServerLikeApplication.java +++ b/service-monitor/src/main/java/com/yahoo/vespa/service/duper/ConfigServerLikeApplication.java @@ -21,6 +21,7 @@ public abstract class ConfigServerLikeApplication extends InfraApplication { return ClusterSpec.request(getClusterSpecType(), getClusterSpecId()) .vespaVersion(version) .stateful(true) + .exclusive(true) .build(); } diff --git a/service-monitor/src/main/java/com/yahoo/vespa/service/duper/InfraApplication.java b/service-monitor/src/main/java/com/yahoo/vespa/service/duper/InfraApplication.java index 07f9d7bddc5..e4181f7cb10 100644 --- a/service-monitor/src/main/java/com/yahoo/vespa/service/duper/InfraApplication.java +++ b/service-monitor/src/main/java/com/yahoo/vespa/service/duper/InfraApplication.java @@ -27,7 +27,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.stream.Collectors; /** * @author freva @@ -66,7 +65,7 @@ public abstract class InfraApplication implements InfraApplicationApi { @Override public ClusterSpec getClusterSpecWithVersion(Version version) { - return ClusterSpec.request(clusterSpecType, clusterSpecId).vespaVersion(version).build(); + return ClusterSpec.request(clusterSpecType, clusterSpecId).exclusive(true).vespaVersion(version).build(); } public ClusterSpec.Type getClusterSpecType() { -- cgit v1.2.3