diff options
author | Martin Polden <mpolden@mpolden.no> | 2023-06-30 10:29:59 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-06-30 10:29:59 +0200 |
commit | b6dab7712c045d0c6c5772ee0fe5d75f6f231f19 (patch) | |
tree | 08d57b6957fc107d4d4701f5cab8b92f20e2ce10 | |
parent | 902931e48415b354c9790b41c28d40dfa6f076d5 (diff) | |
parent | d4ab68364ee14e9360fc7b17ba1100ccb934b4a1 (diff) |
Merge pull request #27594 from vespa-engine/revert-27589-freva/exclusivity
Revert "Use real InfraApplication in node-repository tests" MERGEOK
41 files changed, 335 insertions, 317 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 a1712fe4a0b..63386449f0c 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,7 +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.component.Version; import com.yahoo.component.annotation.Inject; import com.yahoo.config.provision.ActivationContext; import com.yahoo.config.provision.ApplicationId; @@ -17,7 +16,6 @@ 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; @@ -54,7 +52,7 @@ public class MockDeployer implements Deployer { @Inject @SuppressWarnings("unused") public MockDeployer() { - this(null, Clock.systemUTC(), List.of()); + this(null, Clock.systemUTC(), Map.of()); } /** @@ -76,9 +74,9 @@ public class MockDeployer implements Deployer { */ public MockDeployer(NodeRepositoryProvisioner provisioner, Clock clock, - List<ApplicationContext> applications) { + Map<ApplicationId, ApplicationContext> applications) { this.provisioner = provisioner; - this.applications = applications.stream().collect(Collectors.toMap(ApplicationContext::id, c -> c)); + this.applications = new HashMap<>(applications); this.nodeRepository = null; this.clock = clock; @@ -225,11 +223,6 @@ 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 40460e70861..714374ccb8a 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,6 +1,8 @@ // 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; @@ -8,14 +10,12 @@ 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,9 +42,6 @@ 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; @@ -192,11 +189,13 @@ public class MockNodeRepository extends NodeRepository { nodes().removeRecursively("dockerhost6.yahoo.com"); // Activate config servers - InfraApplication cfgApp = new ConfigServerApplication(); - activate(provisioner.prepare(cfgApp.getApplicationId(), cfgApp.getClusterSpecWithVersion(Version.fromString("6.42")), cfgApp.getCapacity(), null), cfgApp.getApplicationId(), provisioner); + 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 tenantHostApp = new TenantHostApplication(); - activate(provisioner.prepare(tenantHostApp.getApplicationId(), tenantHostApp.getClusterSpecWithVersion(Version.fromString("6.42")), tenantHostApp.getCapacity(), null), tenantHostApp.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); 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 1ed3c13cfff..9c843b3eb01 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,6 +46,7 @@ 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; @@ -104,7 +105,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(), List.of(new MockDeployer.ApplicationContext(app, contexts))); + MockDeployer deployer = new MockDeployer(tester.provisioner(), tester.clock(), Map.of(app, 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 ab8175cf989..95e36787219 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,15 +19,18 @@ 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 @@ -45,7 +48,9 @@ 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)); - deployer = new MockDeployer(provisioningTester.provisioner(), provisioningTester.clock(), List.of(appContexts)); + Map<ApplicationId, MockDeployer.ApplicationContext> apps = Arrays.stream(appContexts) + .collect(Collectors.toMap(c -> c.id(), c -> c)); + deployer = new MockDeployer(provisioningTester.provisioner(), provisioningTester.clock(), apps); 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 e1e2ff3db15..908598b25fb 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,7 +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.maintenance; -import com.yahoo.component.Version; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ApplicationName; import com.yahoo.config.provision.Capacity; @@ -17,11 +16,10 @@ 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.List; +import java.util.Map; import static org.junit.Assert.assertEquals; @@ -88,12 +86,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 = proxyApp.getApplicationId(); + final ApplicationId app3 = ApplicationId.from(TenantName.from("hosted-vespa"), ApplicationName.from("routing"), InstanceName.from("default")); 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; @@ -101,10 +99,10 @@ public class ExpeditedChangeApplicationMaintainerTest { Fixture() { this.tester = new ProvisioningTester.Builder().build(); this.nodeRepository = tester.nodeRepository(); - List<MockDeployer.ApplicationContext> 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"))); + Map<ApplicationId, MockDeployer.ApplicationContext> 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))) ; 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 d36ee0f0494..4978fe431dc 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,6 +38,7 @@ 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; @@ -48,6 +49,13 @@ 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) @@ -130,7 +138,9 @@ public class FailedExpirerTest { .withNode(NodeType.proxy, FailureScenario.defaultFlavor, "proxy2") .withNode(NodeType.proxy, FailureScenario.defaultFlavor, "proxy3") .setReady("proxy1", "proxy2", "proxy3") - .allocate(NodeType.proxy) + .allocate(ApplicationId.from("vespa", "zone-app", "default"), + ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("routing")).vespaVersion("6.42").build(), + Capacity.fromRequiredNodeType(NodeType.proxy)) .failNode(1, "proxy1"); for (int i = 0; i < 10; i++) { @@ -149,7 +159,7 @@ public class FailedExpirerTest { .withNode(NodeType.host, FailureScenario.defaultFlavor, "parent2") .withNode(NodeType.host, FailureScenario.defaultFlavor, "parent3") .setReady("parent1", "parent2", "parent3") - .allocate(NodeType.host) + .allocate(tenantHostApplicationId, tenantHostApplicationClusterSpec, tenantHostApplicationCapacity) .withNode(NodeType.tenant, FailureScenario.dockerFlavor, "node1", "parent1") .withNode(NodeType.tenant, FailureScenario.dockerFlavor, "node2", "parent2") .withNode(NodeType.tenant, FailureScenario.dockerFlavor, "node3", "parent3") @@ -171,7 +181,7 @@ public class FailedExpirerTest { .withNode(NodeType.host, FailureScenario.defaultFlavor, "parent2") .withNode(NodeType.host, FailureScenario.defaultFlavor, "parent3") .setReady("parent1", "parent2", "parent3") - .allocate(NodeType.host) + .allocate(tenantHostApplicationId, tenantHostApplicationClusterSpec, tenantHostApplicationCapacity) .withNode(NodeType.tenant, FailureScenario.dockerFlavor, "node1", "parent1") .withNode(NodeType.tenant, FailureScenario.dockerFlavor, "node2", "parent2") .withNode(NodeType.tenant, FailureScenario.dockerFlavor, "node3", "parent3") @@ -328,11 +338,6 @@ 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 0478e5d1486..c16ed47a216 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 InfraApplication hostApp; - final InfraApplication configSrvApp; + final ApplicationId hostApp; + final ApplicationId configSrvApp; switch (hostType) { case confighost -> { - hostApp = new ConfigServerHostApplication(); - configSrvApp = new ConfigServerApplication(); + hostApp = new ConfigServerHostApplication().getApplicationId(); + configSrvApp = new ConfigServerApplication().getApplicationId(); } case controllerhost -> { - hostApp = new ControllerHostApplication(); - configSrvApp = new ControllerApplication(); + hostApp = new ControllerHostApplication().getApplicationId(); + configSrvApp = new ControllerApplication().getApplicationId(); } default -> throw new IllegalArgumentException("Unexpected config server host like node type: " + hostType); } @@ -390,14 +390,14 @@ public class HostCapacityMaintainerTest { List<Node> provisionedHosts = tester.makeReadyNodes(3, "default", hostType, 1).stream() .sorted(Comparator.comparing(Node::hostname)) .toList(); - tester.prepareAndActivateInfraApplication(hostApp); + tester.prepareAndActivateInfraApplication(hostApp, hostType); // 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); + tester.prepareAndActivateInfraApplication(configSrvApp, hostType.childNodeType()); // 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); + tester.prepareAndActivateInfraApplication(configSrvApp, hostType.childNodeType()); 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); - tester.prepareAndActivateInfraApplication(hostApp); + tester.prepareAndActivateInfraApplication(configSrvApp, hostType.childNodeType()); + tester.prepareAndActivateInfraApplication(hostApp, hostType); 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); + tester.prepareAndActivateInfraApplication(configSrvApp, hostType.childNodeType()); 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).size()); + assertEquals(2, tester.prepareAndActivateInfraApplication(configSrvApp, hostType.childNodeType()).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<ProvisionedHost> newHosts = dynamicProvisioningTester.hostProvisioner.provisionedHosts(); assertEquals(1, newHosts.size()); tester.move(Node.State.ready, newHosts.get(0).hostHostname()); - tester.prepareAndActivateInfraApplication(hostApp); + tester.prepareAndActivateInfraApplication(hostApp, hostType); assertEquals(3, tester.nodeRepository().nodes().list(Node.State.active).nodeType(hostType).size()); // Redeployment of config server app actives new node - tester.prepareAndActivateInfraApplication(configSrvApp); + tester.prepareAndActivateInfraApplication(configSrvApp, hostType.childNodeType()); 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); + tester.prepareAndActivateInfraApplication(configSrvApp, hostType.childNodeType()); NodeList nodesAfter = tester.nodeRepository().nodes().list().nodeType(hostType.childNodeType()); assertEquals(nodesBefore, nodesAfter); } @@ -592,11 +592,9 @@ public class HostCapacityMaintainerTest { Duration.ofHours(1), Duration.ofHours(1)).maintain(); + // Host and children can now be removed. tester.provisioningTester.activateTenantHosts(); - // 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(); + tester.maintain(); assertEquals(List.of(), tester.nodeRepository.nodes().list().not().state(State.deprovisioned).asList()); } @@ -647,7 +645,7 @@ public class HostCapacityMaintainerTest { for (var hostname : provisionedHostnames) { tester.provisioningTester.move(Node.State.ready, hostname); } - tester.provisioningTester.activateTenantHosts(); + tester.provisioningTester.prepareAndActivateInfraApplication(DynamicProvisioningTester.tenantHostApp.getApplicationId(), NodeType.host); 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 9fe323201f0..6224143aabf 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.List; +import java.util.Map; 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)); - List<MockDeployer.ApplicationContext> applications = List.of(new MockDeployer.ApplicationContext(app, spec, capacity)); + Map<ApplicationId, MockDeployer.ApplicationContext> applications = Map.of(app, 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 2f239f92c3f..563b76327e6 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,7 +111,9 @@ public class InactiveAndFailedExpirerTest { MockDeployer deployer = new MockDeployer( tester.provisioner(), tester.clock(), - List.of(new MockDeployer.ApplicationContext(applicationId, cluster, + Collections.singletonMap( + applicationId, + new MockDeployer.ApplicationContext(applicationId, cluster, Capacity.from(new ClusterResources(2, 1, nodeResources), false, true)) ) @@ -159,15 +161,19 @@ public class InactiveAndFailedExpirerTest { tester.makeReadyHosts(2, nodeResources); // Activate and deallocate - TenantHostApplication tenantHostApp = new TenantHostApplication(); - tester.prepareAndActivateInfraApplication(tenantHostApp); - assertEquals(2, tester.getNodes(tenantHostApp.getApplicationId(), Node.State.active).size()); - tester.activate(tenantHostApp.getApplicationId(), List.of()); - List<Node> dirtyNodes = tester.getNodes(tenantHostApp.getApplicationId(), Node.State.dirty).asList(); - assertEquals(2, dirtyNodes.size()); + ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("test")).vespaVersion("6.42").build(); + List<HostSpec> 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<Node> inactiveNodes = tester.getNodes(applicationId, Node.State.inactive).asList(); + assertEquals(2, inactiveNodes.size()); // Nodes marked for deprovisioning are moved to dirty and then parked when readied by host-admin - tester.patchNodes(dirtyNodes, (node) -> node.withWantToRetire(true, true, Agent.system, tester.clock().instant())); + 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(); + 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 4d2816cb14f..a07a4f2c72a 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,7 +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.maintenance; -import com.yahoo.component.Version; import com.yahoo.config.provision.ActivationContext; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ApplicationTransaction; @@ -28,8 +27,6 @@ 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; @@ -38,7 +35,6 @@ 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; @@ -50,6 +46,7 @@ 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"); @@ -77,11 +74,9 @@ public class NodeFailTester { provisioner = tester.provisioner(); } - private void initializeMaintainers(List<MockDeployer.ApplicationContext> apps) { - Map<ApplicationId, MockDeployer.ApplicationContext> appsMap = apps.stream() - .collect(Collectors.toMap(MockDeployer.ApplicationContext::id, context -> context)); + private void initializeMaintainers(Map<ApplicationId, MockDeployer.ApplicationContext> apps) { deployer = new MockDeployer(provisioner, tester.clock(), apps); - serviceMonitor = new ServiceMonitorStub(appsMap, nodeRepository); + serviceMonitor = new ServiceMonitorStub(apps, nodeRepository); metric = new TestMetric(); failer = createFailer(); updater = createUpdater(); @@ -104,9 +99,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()); - List<MockDeployer.ApplicationContext> apps = List.of( - new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1), - new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); + Map<ApplicationId, MockDeployer.ApplicationContext> apps = Map.of( + app1, new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1), + app2, new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); tester.initializeMaintainers(apps); return tester; } @@ -117,24 +112,24 @@ public class NodeFailTester { tester.tester.makeReadyHosts(hostCount, new NodeResources(2, 8, 20, 10)); // Create tenant host application - 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(); + 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); 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.tester.prepareAndActivateInfraApplication(tenantHostApp, version); + tester.activate(tenantHostApp, clusterNodeAdminApp, allHosts); 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.getApplicationId()).asList())); + Set.of(tester.nodeRepository.nodes().list(Node.State.active).owner(tenantHostApp).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()); - List<MockDeployer.ApplicationContext> apps = List.of( - new MockDeployer.ApplicationContext(tenantHostApp, version), - new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1), - new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); + Map<ApplicationId, MockDeployer.ApplicationContext> apps = Map.of( + tenantHostApp, new MockDeployer.ApplicationContext(tenantHostApp, clusterNodeAdminApp, allHosts), + app1, new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1), + app2, new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); tester.initializeMaintainers(apps); return tester; } @@ -144,24 +139,24 @@ public class NodeFailTester { tester.tester.makeReadyNodes(numberOfHosts, new NodeResources(4, 16, 400, 10), NodeType.host, 8); // Create applications - 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(); + 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); 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.tester.prepareAndActivateInfraApplication(tenantHostApp, version); + tester.activate(tenantHostApp, clusterNodeAdminApp, allHosts); 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.getApplicationId()).asList())); + Set.of(tester.nodeRepository.nodes().list(Node.State.active).owner(tenantHostApp).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()); - List<MockDeployer.ApplicationContext> apps = List.of( - new MockDeployer.ApplicationContext(tenantHostApp, version), - new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1), - new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); + Map<ApplicationId, MockDeployer.ApplicationContext> apps = Map.of( + tenantHostApp, new MockDeployer.ApplicationContext(tenantHostApp, clusterNodeAdminApp, allHosts), + app1, new MockDeployer.ApplicationContext(app1, clusterApp1, capacity1), + app2, new MockDeployer.ApplicationContext(app2, clusterApp2, capacity2)); tester.initializeMaintainers(apps); return tester; } @@ -172,7 +167,7 @@ public class NodeFailTester { public static NodeFailTester withOneUndeployedApplication(Capacity capacity, ClusterSpec spec) { NodeFailTester tester = new NodeFailTester(); - List<MockDeployer.ApplicationContext> apps = List.of(new MockDeployer.ApplicationContext(app1, spec, capacity)); + Map<ApplicationId, MockDeployer.ApplicationContext> apps = Map.of(app1, new MockDeployer.ApplicationContext(app1, spec, capacity)); tester.initializeMaintainers(apps); return tester; } @@ -182,16 +177,23 @@ public class NodeFailTester { tester.createReadyNodes(count, nodeType); // Create application - InfraApplication application = ProvisioningTester.infraApplication(nodeType); - Version version = Version.fromString("6.42"); - tester.tester.prepareAndActivateInfraApplication(application, version); + 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); assertEquals(count, tester.nodeRepository.nodes().list(Node.State.active).nodeType(nodeType).size()); - List<MockDeployer.ApplicationContext> apps = List.of(new MockDeployer.ApplicationContext(application, version)); + Map<ApplicationId, MockDeployer.ApplicationContext> apps = Map.of( + app1, new MockDeployer.ApplicationContext(app1, clusterApp1, allNodes)); 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 55cb2a7baae..be43d39cdeb 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,6 +2,7 @@ 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; @@ -37,11 +38,13 @@ 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(NodeType.confighost, version0); + tester.prepareAndActivateInfraApplication(configHostApplication, NodeType.confighost, version0); + var tenantHostApplication = ApplicationId.from("hosted-vespa", "tenant-host", "default"); var tenantHostNodes = tester.makeReadyNodes(3, "default", NodeType.host, 1); - tester.prepareAndActivateInfraApplication(NodeType.host, version0); + tester.prepareAndActivateInfraApplication(tenantHostApplication, NodeType.host, version0); tester.clock().advance(Duration.ofDays(1).plusSeconds(1)); // Let grace period pass var allNodes = new ArrayList<>(configHostNodes); @@ -64,7 +67,7 @@ public class OsUpgradeActivatorTest { // Tenant hosts start upgrading to next Vespa version var version1 = Version.fromString("7.1"); - tester.prepareAndActivateInfraApplication(NodeType.host, version1); + tester.prepareAndActivateInfraApplication(tenantHostApplication, 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 cad5a87acfd..2df38a38d49 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,6 +26,7 @@ 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; @@ -220,9 +221,9 @@ public class PeriodicApplicationMaintainerTest { Fixture() { this.tester = new ProvisioningTester.Builder().build(); this.nodeRepository = tester.nodeRepository(); - List<MockDeployer.ApplicationContext> 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)))); + Map<ApplicationId, MockDeployer.ApplicationContext> 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)))); 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 bd2cc98cea7..5bdff2d3a3a 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,6 +28,7 @@ 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; @@ -138,7 +139,7 @@ public class RebalancerTest { @Test public void testRebalancingDoesNotReduceSwitchExclusivity() { Capacity capacity = Capacity.from(new ClusterResources(4, 1, RebalancerTester.cpuResources), true, false); - List<ApplicationContext> apps = List.of(new ApplicationContext(cpuApp, RebalancerTester.clusterSpec("c"), capacity)); + Map<ApplicationId, ApplicationContext> apps = Map.of(cpuApp, new ApplicationContext(cpuApp, RebalancerTester.clusterSpec("c"), capacity)); RebalancerTester tester = new RebalancerTester(4, apps); // Application is deployed and balanced across exclusive switches @@ -176,11 +177,11 @@ public class RebalancerTest { RebalancerTester() { this(3, - 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))))); + 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))))); } - RebalancerTester(int hostCount, List<ApplicationContext> apps) { + RebalancerTester(int hostCount, Map<ApplicationId, ApplicationContext> apps) { deployer = new MockDeployer(tester.provisioner(), tester.clock(), apps); rebalancer = new Rebalancer(deployer, tester.nodeRepository(), metric, Duration.ofMinutes(1)); List<Node> 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 f42044c2944..aaa4bffc000 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,6 +36,7 @@ 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; @@ -98,9 +99,9 @@ public class RetiredExpirerTest { MockDeployer deployer = new MockDeployer(provisioner, clock, - List.of(new MockDeployer.ApplicationContext(applicationId, - cluster, - Capacity.from(new ClusterResources(wantedNodes, 1, nodeResources))))); + Collections.singletonMap(applicationId, 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()); @@ -132,9 +133,11 @@ public class RetiredExpirerTest { MockDeployer deployer = new MockDeployer(provisioner, clock, - List.of(new MockDeployer.ApplicationContext(applicationId, - cluster, - Capacity.from(new ClusterResources(wantedNodes, 1, nodeResources))))); + Collections.singletonMap( + applicationId, + 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 ec49828241b..6895f5eeae7 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,7 +23,9 @@ 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; @@ -233,7 +235,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(), List.of(context)); + return new MockDeployer(tester.provisioner(), tester.clock(), Map.of(app, 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 0fa9aa610a4..ada96b3f793 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, NodeType.host); + provisionInfraApplication(hostCount, infraApplication, NodeType.host); Supplier<NodeList> 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, NodeType.host, NodeResources.StorageType.remote, NodeResources.Architecture.x86_64); + provisionInfraApplication(hostCount, infraApplication, NodeType.host, NodeResources.StorageType.remote, NodeResources.Architecture.x86_64); Supplier<NodeList> 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, NodeType.host); - provisionInfraApplication(hostCount, NodeType.confighost); + provisionInfraApplication(hostCount, infraApplication, NodeType.host); + provisionInfraApplication(hostCount, ApplicationId.from("hosted-vespa", "confighost", "default"), NodeType.confighost); Supplier<NodeList> 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, NodeType.host); + provisionInfraApplication(hostCount, infraApplication, NodeType.host); deployApplication(app1); deployApplication(app2); Supplier<NodeList> 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, NodeType.proxyhost); + provisionInfraApplication(hostCount, infraApplication, NodeType.proxyhost); Supplier<NodeList> hosts = () -> tester.nodeRepository().nodes().list().nodeType(NodeType.proxyhost); // All hosts are on initial version @@ -532,23 +532,25 @@ public class OsVersionsTest { } private List<Node> provisionInfraApplication(int nodeCount) { - return provisionInfraApplication(nodeCount, NodeType.host); + return provisionInfraApplication(nodeCount, infraApplication, NodeType.host); } - private List<Node> provisionInfraApplication(int nodeCount, NodeType nodeType) { - return provisionInfraApplication(nodeCount, nodeType, NodeResources.StorageType.local); + private List<Node> provisionInfraApplication(int nodeCount, ApplicationId application, + NodeType nodeType) { + return provisionInfraApplication(nodeCount, application, nodeType, NodeResources.StorageType.local); } - private List<Node> provisionInfraApplication(int nodeCount, NodeType nodeType, NodeResources.StorageType storageType) { - return provisionInfraApplication(nodeCount, nodeType, storageType, NodeResources.Architecture.x86_64); + private List<Node> provisionInfraApplication(int nodeCount, ApplicationId application, + NodeType nodeType, NodeResources.StorageType storageType) { + return provisionInfraApplication(nodeCount, application, nodeType, storageType, NodeResources.Architecture.x86_64); } - private List<Node> provisionInfraApplication(int nodeCount, NodeType nodeType, + private List<Node> provisionInfraApplication(int nodeCount, ApplicationId application, 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(nodeType); + tester.prepareAndActivateInfraApplication(application, nodeType); tester.clock().advance(Duration.ofDays(1).plusSeconds(1)); // Let grace period pass return nodes.stream() .map(Node::hostname) @@ -585,10 +587,11 @@ public class OsVersionsTest { tester.patchNodes(nodes, (node) -> { Optional<Version> 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, nodeType).get(0); + node = provisionInfraApplication(1, application, nodeType).get(0); } return node.with(node.status().withOsVersion(node.status().osVersion().withCurrent(wantedOsVersion))); }); @@ -599,6 +602,7 @@ public class OsVersionsTest { tester.patchNodes(nodes, (node) -> { Optional<Version> 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()); @@ -606,7 +610,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(nodeType); + tester.prepareAndActivateInfraApplication(application, 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 50eeef69448..ab99a44cbab 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,7 +44,8 @@ public class AclProvisioningTest { // Populate repo tester.makeReadyNodes(10, new NodeResources(1, 4, 10, 1)); List<Node> host = tester.makeReadyNodes(1, new NodeResources(1, 4, 10, 1), NodeType.host); - tester.activateTenantHosts(); + ApplicationId zoneApplication = ProvisioningTester.applicationId(); + tester.deploy(zoneApplication, Capacity.fromRequiredNodeType(NodeType.host)); tester.makeReadyChildren(1, new NodeResources(1, 4, 10, 1), host.get(0).hostname()); List<Node> proxyNodes = tester.makeReadyNodes(3, new NodeResources(1, 4, 10, 1), NodeType.proxy); @@ -135,10 +136,11 @@ public class AclProvisioningTest { tester.makeReadyNodes(3, "default", NodeType.proxy); // Deploy zone application - tester.prepareAndActivateInfraApplication(NodeType.proxy); + ApplicationId zoneApplication = ProvisioningTester.applicationId(); + tester.deploy(zoneApplication, Capacity.fromRequiredNodeType(NodeType.proxy)); // Get trusted nodes for first proxy node - NodeList proxyNodes = tester.nodeRepository().nodes().list().nodeType(NodeType.proxy); + NodeList proxyNodes = tester.nodeRepository().nodes().list().owner(zoneApplication); Node node = proxyNodes.first().get(); NodeAcl nodeAcl = node.acl(tester.nodeRepository().nodes().list(), tester.nodeRepository().loadBalancers(), tester.nodeRepository().zone()); @@ -178,8 +180,8 @@ public class AclProvisioningTest { tester.makeReadyNodes(3, "default", NodeType.controller); // Allocate - tester.prepareAndActivateInfraApplication(NodeType.controller); - List<Node> controllers = tester.nodeRepository().nodes().list().nodeType(NodeType.controller).asList(); + ApplicationId controllerApplication = ProvisioningTester.applicationId(); + List<Node> controllers = tester.deploy(controllerApplication, Capacity.fromRequiredNodeType(NodeType.controller)); // 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 0bb6dc61d1b..a03811778d2 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,6 +57,7 @@ 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 @@ -242,7 +243,7 @@ public class InPlaceResizeProvisionTest { private void addParentHosts(int count, NodeResources resources) { tester.makeReadyNodes(count, resources, NodeType.host, 4); - tester.activateTenantHosts(); + tester.prepareAndActivateInfraApplication(infraApp, NodeType.host); } 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 53054ba3f24..673e7610514 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,7 +3,6 @@ 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; @@ -62,6 +61,7 @@ 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,10 +212,11 @@ public class LoadBalancerProvisionerTest { @Test public void does_not_provision_load_balancers_for_non_tenant_node_type() { - var tenantHostApp = ProvisioningTester.infraApplication(NodeType.host); - tester.prepareAndActivateInfraApplication(tenantHostApp); + tester.activate(infraApp1, prepare(infraApp1, Capacity.fromRequiredNodeType(NodeType.host), + clusterRequest(ClusterSpec.Type.container, + ClusterSpec.Id.from("tenant-host")))); assertTrue("No load balancer provisioned", tester.loadBalancerService().instances().isEmpty()); - assertEquals(List.of(), tester.nodeRepository().loadBalancers().list(tenantHostApp.getApplicationId()).asList()); + assertEquals(List.of(), tester.nodeRepository().loadBalancers().list(infraApp1).asList()); } @Test @@ -241,12 +242,12 @@ public class LoadBalancerProvisionerTest { @Test public void provision_load_balancer_config_server_cluster() { - provisionInfrastructureLoadBalancer(NodeType.config); + provisionInfrastructureLoadBalancer(infraApp1, NodeType.config); } @Test public void provision_load_balancer_controller_cluster() { - provisionInfrastructureLoadBalancer(NodeType.controller); + provisionInfrastructureLoadBalancer(infraApp1, NodeType.controller); } @Test @@ -437,16 +438,16 @@ public class LoadBalancerProvisionerTest { activeNodes, reals); } - private void provisionInfrastructureLoadBalancer(NodeType nodeType) { - var infraApp = ProvisioningTester.infraApplication(nodeType); - Supplier<List<LoadBalancer>> lbs = () -> tester.nodeRepository().loadBalancers().list(infraApp.getApplicationId()).asList(); - tester.prepareAndActivateInfraApplication(infraApp); - var nodes = prepare(infraApp.getApplicationId(), infraApp.getCapacity(), infraApp.getClusterSpecWithVersion(Version.fromString("7.1"))); + private void provisionInfrastructureLoadBalancer(ApplicationId application, NodeType nodeType) { + Supplier<List<LoadBalancer>> 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)); assertEquals(1, lbs.get().size()); - tester.activate(infraApp.getApplicationId(), nodes); + tester.activate(application, 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(infraApp.getClusterSpecId(), lbs.get().get(0).id().cluster()); + assertEquals(cluster, 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 cfd7a3511de..3db8a71e4a7 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,6 +19,7 @@ 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; @@ -232,7 +233,8 @@ public class MultigroupProvisioningTest { MockDeployer deployer = new MockDeployer(tester.provisioner(), tester.clock(), - List.of(new MockDeployer.ApplicationContext(application1, cluster(), + Collections.singletonMap(application1, + 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 38e38dc319b..4af5728f167 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,7 +1,10 @@ // 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.component.Version; +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.config.provision.NodeType; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeList; @@ -9,11 +12,12 @@ 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; @@ -30,7 +34,9 @@ public class NodeTypeProvisioningTest { private final ProvisioningTester tester = new ProvisioningTester.Builder().build(); - private final InfraApplication proxyApp = ProvisioningTester.infraApplication(NodeType.proxy); + 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(); @Before public void setup() { @@ -45,20 +51,26 @@ public class NodeTypeProvisioningTest { @Test public void proxy_deployment() { { // Deploy - tester.prepareAndActivateInfraApplication(proxyApp); + List<HostSpec> hosts = deployProxies(application, tester); + assertEquals("Reserved all proxies", 11, hosts.size()); + tester.activate(application, new HashSet<>(hosts)); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals("Activated all proxies", 11, nodes.size()); } { // Redeploy with no changes - tester.prepareAndActivateInfraApplication(proxyApp); + List<HostSpec> hosts = deployProxies(application, tester); + assertEquals(11, hosts.size()); + tester.activate(application, new HashSet<>(hosts)); 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); - tester.prepareAndActivateInfraApplication(proxyApp); + List<HostSpec> hosts = deployProxies(application, tester); + assertEquals(13, hosts.size()); + tester.activate(application, new HashSet<>(hosts)); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals(13, nodes.size()); } @@ -69,7 +81,9 @@ 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"); - tester.prepareAndActivateInfraApplication(proxyApp); + List<HostSpec> hosts = deployProxies(application, tester); + assertEquals(10, hosts.size()); + tester.activate(application, new HashSet<>(hosts)); nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals(10, nodes.size()); } @@ -79,7 +93,10 @@ public class NodeTypeProvisioningTest { public void retire_proxy() { MockDeployer deployer = new MockDeployer(tester.provisioner(), tester.clock(), - List.of(new MockDeployer.ApplicationContext(proxyApp, Version.fromString("6.42")))); + Collections.singletonMap(application, + new MockDeployer.ApplicationContext(application, + clusterSpec, + capacity))); RetiredExpirer retiredExpirer = new RetiredExpirer(tester.nodeRepository(), deployer, new TestMetric(), @@ -87,7 +104,9 @@ public class NodeTypeProvisioningTest { Duration.ofMinutes(10)); { // Deploy - tester.prepareAndActivateInfraApplication(proxyApp); + List<HostSpec> hosts = deployProxies(application, tester); + assertEquals("Reserved all proxies", 11, hosts.size()); + tester.activate(application, new HashSet<>(hosts)); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals("Activated all proxies", 11, nodes.size()); } @@ -96,7 +115,9 @@ public class NodeTypeProvisioningTest { { // Pick out a node and retire it tester.nodeRepository().nodes().write(nodeToRetire.withWantToRetire(true, Agent.system, tester.clock().instant()), () -> {}); - tester.prepareAndActivateInfraApplication(proxyApp); + List<HostSpec> hosts = deployProxies(application, tester); + assertEquals(11, hosts.size()); + tester.activate(application, new HashSet<>(hosts)); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals(11, nodes.size()); @@ -108,7 +129,9 @@ public class NodeTypeProvisioningTest { } { // Redeploying while the node is still retiring has no effect - tester.prepareAndActivateInfraApplication(proxyApp); + List<HostSpec> hosts = deployProxies(application, tester); + assertEquals(11, hosts.size()); + tester.activate(application, new HashSet<>(hosts)); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals(11, nodes.size()); @@ -123,7 +146,9 @@ public class NodeTypeProvisioningTest { tester.advanceTime(Duration.ofMinutes(11)); retiredExpirer.run(); - tester.prepareAndActivateInfraApplication(proxyApp); + List<HostSpec> hosts = deployProxies(application, tester); + assertEquals(10, hosts.size()); + tester.activate(application, new HashSet<>(hosts)); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals(10, nodes.size()); @@ -137,7 +162,8 @@ public class NodeTypeProvisioningTest { public void retire_multiple_proxy_simultaneously() { MockDeployer deployer = new MockDeployer(tester.provisioner(), tester.clock(), - List.of(new MockDeployer.ApplicationContext(proxyApp, Version.fromString("6.42")))); + Collections.singletonMap(application, + new MockDeployer.ApplicationContext(application, clusterSpec, capacity))); RetiredExpirer retiredExpirer = new RetiredExpirer(tester.nodeRepository(), deployer, new TestMetric(), @@ -146,7 +172,9 @@ public class NodeTypeProvisioningTest { final int numNodesToRetire = 5; { // Deploy - tester.prepareAndActivateInfraApplication(proxyApp); + List<HostSpec> hosts = deployProxies(application, tester); + assertEquals("Reserved all proxies", 11, hosts.size()); + tester.activate(application, new HashSet<>(hosts)); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals("Activated all proxies", 11, nodes.size()); } @@ -157,7 +185,9 @@ public class NodeTypeProvisioningTest { nodesToRetire.forEach(nodeToRetire -> tester.nodeRepository().nodes().write(nodeToRetire.withWantToRetire(true, Agent.system, tester.clock().instant()), () -> {})); - tester.prepareAndActivateInfraApplication(proxyApp); + List<HostSpec> hosts = deployProxies(application, tester); + assertEquals(11, hosts.size()); + tester.activate(application, new HashSet<>(hosts)); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals(11, nodes.size()); @@ -172,7 +202,9 @@ public class NodeTypeProvisioningTest { } { // Redeploying while the nodes are still retiring has no effect - tester.prepareAndActivateInfraApplication(proxyApp); + List<HostSpec> hosts = deployProxies(application, tester); + assertEquals(11, hosts.size()); + tester.activate(application, new HashSet<>(hosts)); NodeList nodes = tester.nodeRepository().nodes().list(Node.State.active).nodeType(NodeType.proxy); assertEquals(11, nodes.size()); @@ -188,7 +220,9 @@ public class NodeTypeProvisioningTest { tester.advanceTime(Duration.ofMinutes(11)); retiredExpirer.run(); - tester.prepareAndActivateInfraApplication(proxyApp); + List<HostSpec> hosts = deployProxies(application, tester); + assertEquals(6, hosts.size()); + tester.activate(application, new HashSet<>(hosts)); // 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() @@ -203,4 +237,8 @@ public class NodeTypeProvisioningTest { } } + private List<HostSpec> 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 477101e10e2..67760d8cdf3 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.activateTenantHosts(); + tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); // 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.activateTenantHosts(); + tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); // 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.activateTenantHosts(); + tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); 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.activateTenantHosts(); + tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); 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.activateTenantHosts(); + tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); 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.activateTenantHosts(); + tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); 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.activateTenantHosts(); + tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); ApplicationId application = ProvisioningTester.applicationId(); SystemState state = prepare(application, 2, 2, 3, 3, @@ -900,7 +900,8 @@ 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(); - tester.makeReadyHosts(10, defaultResources).activateTenantHosts(); + ApplicationId tenantHostAppId = ProvisioningTester.applicationId(); + tester.makeReadyHosts(10, defaultResources).prepareAndActivateInfraApplication(tenantHostAppId, NodeType.host); NodeList list = tester.nodeRepository().nodes().list(); assertEquals(10, list.state(Node.State.active).nodeType(NodeType.host).size()); @@ -908,13 +909,13 @@ public class ProvisioningTest { // Pick out 5 random nodes and retire those Set<String> 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.activateTenantHosts(); + tester.prepareAndActivateInfraApplication(tenantHostAppId, NodeType.host); assertEquals(retiredHostnames, tester.nodeRepository().nodes().list().retired().hostnames()); Set<String> 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.activateTenantHosts(); + tester.prepareAndActivateInfraApplication(tenantHostAppId, NodeType.host); assertEquals(3, tester.nodeRepository().nodes().list().retired().size()); } @@ -1077,7 +1078,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.activateTenantHosts(); + tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); 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 7e85131eaf4..dd8f97d82de 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,8 +30,6 @@ 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; @@ -52,12 +50,6 @@ 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; @@ -86,6 +78,8 @@ 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; @@ -248,24 +242,20 @@ public class ProvisioningTester { } } - public List<HostSpec> prepareAndActivateInfraApplication(InfraApplication application, Version version) { - ClusterSpec cluster = application.getClusterSpecWithVersion(version); - Capacity capacity = application.getCapacity(); - List<HostSpec> hostSpecs = prepare(application.getApplicationId(), cluster, capacity); - activate(application.getApplicationId(), hostSpecs); + public List<HostSpec> 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<HostSpec> hostSpecs = prepare(application, cluster, capacity); + activate(application, hostSpecs); return hostSpecs; } - public List<HostSpec> prepareAndActivateInfraApplication(InfraApplication application) { - return prepareAndActivateInfraApplication(application, Version.fromString("6.42")); - } - - public List<HostSpec> prepareAndActivateInfraApplication(NodeType nodeType) { - return prepareAndActivateInfraApplication(infraApplication(nodeType)); - } - - public List<HostSpec> prepareAndActivateInfraApplication(NodeType nodeType, Version version) { - return prepareAndActivateInfraApplication(infraApplication(nodeType), version); + public List<HostSpec> prepareAndActivateInfraApplication(ApplicationId application, NodeType nodeType) { + return prepareAndActivateInfraApplication(application, nodeType, Version.fromString("6.42")); } public void deactivate(ApplicationId applicationId) { @@ -566,7 +556,7 @@ public class ProvisioningTester { } public void activateTenantHosts() { - prepareAndActivateInfraApplication(NodeType.host); + prepareAndActivateInfraApplication(tenantHostApp, NodeType.host); } public static ClusterSpec containerClusterSpec() { @@ -819,31 +809,4 @@ 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 62f42b0d035..0b4d345b8a5 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; + ProvisioningTester tester = new ProvisioningTester.Builder().build(); 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.activateTenantHosts(); + tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); List<HostSpec> containerHosts = tester.prepare(applicationId, containerClusterSpec, containerNodeCount, groups, flavor); List<HostSpec> 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.activateTenantHosts(); + tester.prepareAndActivateInfraApplication(ProvisioningTester.applicationId(), NodeType.host); List<HostSpec> containerHosts = tester.prepare(applicationId, containerClusterSpec, containerNodeCount, groups, resources1); List<HostSpec> 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 4dbf9ff85c0..7fe2d77b647 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/hosted-vespa/tenant-host/default/tenant-host/dockerhost2/\"", 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); 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 bd251567f16..30b0347f2ba 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": "hosted-vespa", - "application": "zone-config-servers", - "instance": "default" + "tenant": "cfg", + "application": "cfg", + "instance": "cfg" }, "membership": { - "clustertype": "admin", - "clusterid": "zone-config-servers", + "clustertype": "container", + "clusterid": "configservers", "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 022512359cd..f47e5d4919b 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": "hosted-vespa", - "application": "zone-config-servers", - "instance": "default" + "tenant": "cfg", + "application": "cfg", + "instance": "cfg" }, "membership": { - "clustertype": "admin", - "clusterid": "zone-config-servers", + "clustertype": "container", + "clusterid": "configservers", "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 84b34a72e78..6e166e6c5d1 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": "hosted-vespa", - "application": "tenant-host", - "instance": "default" + "tenant": "zoneapp", + "application": "zoneapp", + "instance": "zoneapp" }, "membership": { "clustertype": "container", - "clusterid": "tenant-host", + "clusterid": "node-admin", "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 bc1c11c8d06..9dad2b3df19 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": "hosted-vespa", - "application": "tenant-host", - "instance": "default" + "tenant": "zoneapp", + "application": "zoneapp", + "instance": "zoneapp" }, "membership": { "clustertype": "container", - "clusterid": "tenant-host", + "clusterid": "node-admin", "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 3b7970a9ec0..024569f344c 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": "hosted-vespa", - "application": "tenant-host", - "instance": "default" + "tenant": "zoneapp", + "application": "zoneapp", + "instance": "zoneapp" }, "membership": { "clustertype": "container", - "clusterid": "tenant-host", + "clusterid": "node-admin", "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 d99e71bab49..314a976724b 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": "hosted-vespa", - "application": "tenant-host", - "instance": "default" + "tenant": "zoneapp", + "application": "zoneapp", + "instance": "zoneapp" }, "membership": { "clustertype": "container", - "clusterid": "tenant-host", + "clusterid": "node-admin", "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 88bfd9d9418..e2050e9fc70 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": "hosted-vespa", - "application": "tenant-host", - "instance": "default" + "tenant": "zoneapp", + "application": "zoneapp", + "instance": "zoneapp" }, "membership": { "clustertype": "container", - "clusterid": "tenant-host", + "clusterid": "node-admin", "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 f70b2dc1b72..7458c189e27 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": "hosted-vespa", - "application": "tenant-host", - "instance": "default" + "tenant": "zoneapp", + "application": "zoneapp", + "instance": "zoneapp" }, "membership": { "clustertype": "container", - "clusterid": "tenant-host", + "clusterid": "node-admin", "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 c1c1ba0cae8..a86805d1a71 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": "hosted-vespa", - "application": "tenant-host", - "instance": "default" + "tenant": "zoneapp", + "application": "zoneapp", + "instance": "zoneapp" }, "membership": { "clustertype": "container", - "clusterid": "tenant-host", + "clusterid": "node-admin", "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 c597b7afa14..8d0d1649ed0 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": "hosted-vespa", - "application": "tenant-host", - "instance": "default" + "tenant": "zoneapp", + "application": "zoneapp", + "instance": "zoneapp" }, "membership": { "clustertype": "container", - "clusterid": "tenant-host", + "clusterid": "node-admin", "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 8a85d55e0df..1dd7d583bb0 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": "hosted-vespa", - "application": "tenant-host", - "instance": "default" + "tenant": "zoneapp", + "application": "zoneapp", + "instance": "zoneapp" }, "membership": { "clustertype": "container", - "clusterid": "tenant-host", + "clusterid": "node-admin", "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 70b5e465de8..080c162f7e7 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": "hosted-vespa", - "application": "tenant-host", - "instance": "default" + "tenant": "zoneapp", + "application": "zoneapp", + "instance": "zoneapp" }, "membership": { "clustertype": "container", - "clusterid": "tenant-host", + "clusterid": "node-admin", "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 85b49dd5113..362a9bfbf1c 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": "hosted-vespa", - "application": "tenant-host", - "instance": "default" + "tenant": "zoneapp", + "application": "zoneapp", + "instance": "zoneapp" }, "membership": { "clustertype": "container", - "clusterid": "tenant-host", + "clusterid": "node-admin", "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 96213dea0a7..eef381e8df7 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": "hosted-vespa:zone-config-servers:default:zone-config-servers", - "state": "active", + "id": "cfg:cfg:cfg:configservers", + "state": "reserved", "changedAt": 123, - "application": "zone-config-servers", - "tenant": "hosted-vespa", - "instance": "default", - "cluster": "zone-config-servers", - "hostname": "lb-hosted-vespa.zone-config-servers-zone-config-servers", + "application": "cfg", + "tenant": "cfg", + "instance": "cfg", + "cluster": "configservers", + "hostname": "lb-cfg.cfg.cfg-configservers", "dnsZone": "zone-id-1", "networks": [ "10.2.3.0/24", @@ -57,18 +57,7 @@ "ports": [ 4443 ], - "reals": [ - { - "hostname": "cfg1.yahoo.com", - "ipAddress": "127.0.201.1", - "port": 4443 - }, - { - "hostname": "cfg2.yahoo.com", - "ipAddress": "127.0.202.1", - "port": 4443 - } - ], + "reals": [], "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 9ea340535bc..cc3aeddff01 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,7 +21,6 @@ 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 e4181f7cb10..07f9d7bddc5 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,6 +27,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Objects; +import java.util.stream.Collectors; /** * @author freva @@ -65,7 +66,7 @@ public abstract class InfraApplication implements InfraApplicationApi { @Override public ClusterSpec getClusterSpecWithVersion(Version version) { - return ClusterSpec.request(clusterSpecType, clusterSpecId).exclusive(true).vespaVersion(version).build(); + return ClusterSpec.request(clusterSpecType, clusterSpecId).vespaVersion(version).build(); } public ClusterSpec.Type getClusterSpecType() { |