diff options
20 files changed, 92 insertions, 157 deletions
diff --git a/config-provisioning/src/main/resources/configdefinitions/node-repository.def b/config-provisioning/src/main/resources/configdefinitions/node-repository.def index 5217cba4302..8ea9265aa23 100644 --- a/config-provisioning/src/main/resources/configdefinitions/node-repository.def +++ b/config-provisioning/src/main/resources/configdefinitions/node-repository.def @@ -5,6 +5,4 @@ namespace=config.provisioning # version. Example: my-docker-registry.domain.tld:8080/dist/vespa dockerImage string default="dummyImage" -serverNodeType enum {config, controller} default=config - useCuratorClientCache bool default=false diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java index 2af89cc1191..bedfbc5bdc1 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java @@ -97,8 +97,7 @@ public class NodeRepository extends AbstractComponent { */ @Inject public NodeRepository(NodeRepositoryConfig config, NodeFlavors flavors, Curator curator, Zone zone) { - this(flavors, curator, Clock.systemUTC(), zone, new DnsNameResolver(), DockerImage.fromString(config.dockerImage()), - NodeType.valueOf(config.serverNodeType().name()), config.useCuratorClientCache()); + this(flavors, curator, Clock.systemUTC(), zone, new DnsNameResolver(), DockerImage.fromString(config.dockerImage()), config.useCuratorClientCache()); } /** @@ -106,14 +105,14 @@ public class NodeRepository extends AbstractComponent { * which will be used for time-sensitive decisions. */ public NodeRepository(NodeFlavors flavors, Curator curator, Clock clock, Zone zone, NameResolver nameResolver, - DockerImage dockerImage, NodeType serverNodeType, boolean useCuratorClientCache) { + DockerImage dockerImage, boolean useCuratorClientCache) { this.db = new CuratorDatabaseClient(flavors, curator, clock, zone, useCuratorClientCache); this.zone = zone; this.clock = clock; this.flavors = flavors; this.nameResolver = nameResolver; this.osVersions = new OsVersions(db); - this.infrastructureVersions = new InfrastructureVersions(db, serverNodeType); + this.infrastructureVersions = new InfrastructureVersions(db); this.firmwareChecks = new FirmwareChecks(db, clock); this.dockerImages = new DockerImages(db, dockerImage); this.jobControl = new JobControl(db); @@ -129,7 +128,7 @@ public class NodeRepository extends AbstractComponent { /** Returns the Docker image to use for nodes in this */ public DockerImage dockerImage(NodeType nodeType) { return dockerImages.dockerImageFor(nodeType); } - /** Returns the name resolver used to resolve hostname and ip addresses */ + /** @return The name resolver used to resolve hostname and ip addresses */ public NameResolver nameResolver() { return nameResolver; } /** Returns the OS versions to use for nodes in this */ diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureVersions.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureVersions.java index 2cfe27ee01d..7e2e729149b 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureVersions.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureVersions.java @@ -2,7 +2,6 @@ package com.yahoo.vespa.hosted.provision.maintenance; import com.yahoo.component.Version; -import com.yahoo.component.Vtag; import com.yahoo.config.provision.NodeType; import com.yahoo.vespa.curator.Lock; import com.yahoo.vespa.hosted.provision.persistence.CuratorDatabaseClient; @@ -24,30 +23,25 @@ public class InfrastructureVersions { private static final Logger logger = Logger.getLogger(InfrastructureVersions.class.getName()); private final CuratorDatabaseClient db; - private final NodeType serverNodeType; - private final Version defaultVersion; - public InfrastructureVersions(CuratorDatabaseClient db, NodeType serverNodeType) { - this(db, serverNodeType, Vtag.currentVersion); - } - - InfrastructureVersions(CuratorDatabaseClient db, NodeType serverNodeType, Version defaultVersion) { + public InfrastructureVersions(CuratorDatabaseClient db) { this.db = db; - this.serverNodeType = serverNodeType; - this.defaultVersion = defaultVersion; } public void setTargetVersion(NodeType nodeType, Version newTargetVersion, boolean force) { - if (!isNodeTypeAllowedForTargetVersion(nodeType)) - throw new IllegalArgumentException("Cannot set version for type " + nodeType); - - if (!isNodeTypeAllowedForThisServer(nodeType)) - throw new IllegalArgumentException( - "Cannot set version for " + nodeType + " on a " + serverNodeType.description()); - - if (newTargetVersion.isEmpty()) + switch (nodeType) { + case config: + case confighost: + case proxyhost: + case controller: + case controllerhost: + break; + default: + throw new IllegalArgumentException("Cannot set version for type " + nodeType); + } + if (newTargetVersion.isEmpty()) { throw new IllegalArgumentException("Invalid target version: " + newTargetVersion.toFullString()); - + } try (Lock lock = db.lockInfrastructureVersions()) { Map<NodeType, Version> infrastructureVersions = db.readInfrastructureVersions(); @@ -70,44 +64,11 @@ public class InfrastructureVersions { } } - /** - * @return the target version for a given nodeType. If the nodeType has no target version set, current version - * of this server will be set and returned - * @throws IllegalArgumentException if the given nodeType is not allowed to have a target version on this server - */ - public Version getTargetVersionFor(NodeType nodeType) { - if (!isNodeTypeAllowedForTargetVersion(nodeType) || !isNodeTypeAllowedForThisServer(nodeType)) - throw new IllegalArgumentException(nodeType + " has no target version"); - - return Optional.ofNullable(db.readInfrastructureVersions().get(nodeType)).orElseGet(() -> { - // Target version has never been set for this node type, set it to the default version of this server. - // We need to set the version (in ZK) to prevent another config server from returning a different version. - // No lock needed since this is only an issue in bootstrap case and in a potential race, all versions - // are equally valid - setTargetVersion(nodeType, defaultVersion, false); - return defaultVersion; - }); + public Optional<Version> getTargetVersionFor(NodeType nodeType) { + return Optional.ofNullable(db.readInfrastructureVersions().get(nodeType)); } - /** @return all set target versions from db */ public Map<NodeType, Version> getTargetVersions() { return Collections.unmodifiableMap(db.readInfrastructureVersions()); } - - private boolean isNodeTypeAllowedForThisServer(NodeType nodeType) { - return nodeType == NodeType.proxyhost || - nodeType == serverNodeType || (nodeType.isDockerHost() && nodeType.childNodeType() == serverNodeType); - } - - private static boolean isNodeTypeAllowedForTargetVersion(NodeType nodeType) { - switch (nodeType) { - case config: - case confighost: - case proxyhost: - case controller: - case controllerhost: - return true; - } - return false; - } } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/InfraDeployerImpl.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/InfraDeployerImpl.java index 73aadb93f2a..d002d81cc2c 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/InfraDeployerImpl.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/InfraDeployerImpl.java @@ -81,6 +81,13 @@ public class InfraDeployerImpl implements InfraDeployer { try (Mutex lock = nodeRepository.lock(application.getApplicationId())) { NodeType nodeType = application.getCapacity().type(); + Optional<Version> targetVersion = infrastructureVersions.getTargetVersionFor(nodeType); + if (targetVersion.isEmpty()) { + logger.log(LogLevel.DEBUG, "No target version set for " + nodeType + ", removing application"); + removeApplication(application.getApplicationId()); + return; + } + candidateNodes = nodeRepository .getNodes(nodeType, Node.State.ready, Node.State.reserved, Node.State.active, Node.State.inactive); if (candidateNodes.isEmpty()) { @@ -89,11 +96,10 @@ public class InfraDeployerImpl implements InfraDeployer { return; } - Version targetVersion = infrastructureVersions.getTargetVersionFor(nodeType); - if (!allActiveNodesOn(targetVersion, candidateNodes)) { + if (!allActiveNodesOn(targetVersion.get(), candidateNodes)) { hostSpecs = provisioner.prepare( application.getApplicationId(), - application.getClusterSpecWithVersion(targetVersion), + application.getClusterSpecWithVersion(targetVersion.get()), application.getCapacity(), 1, // groups logger::log); 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 de00f38ea5f..9edf368fa9c 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 @@ -52,7 +52,6 @@ public class MockNodeRepository extends NodeRepository { super(flavors, curator, Clock.fixed(Instant.ofEpochMilli(123), ZoneId.of("Z")), Zone.defaultZone(), new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - NodeType.config, true); this.flavors = flavors; diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java index 6a2e983a995..9b9e7397323 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java @@ -27,12 +27,9 @@ public class NodeRepositoryTester { private final NodeRepository nodeRepository; private final Clock clock; private final MockCurator curator; - + + public NodeRepositoryTester() { - this(NodeType.config); - } - - public NodeRepositoryTester(NodeType nodeType) { nodeFlavors = new NodeFlavors(createConfig()); clock = new ManualClock(); curator = new MockCurator(); @@ -40,7 +37,6 @@ public class NodeRepositoryTester { nodeRepository = new NodeRepository(nodeFlavors, curator, clock, Zone.defaultZone(), new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - nodeType, true); } 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 f8ad43f90fd..6fa5afd0c20 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 @@ -274,7 +274,6 @@ public class FailedExpirerTest { this.nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-image"), - NodeType.config, true); this.provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, Zone.defaultZone(), new MockProvisionServiceProvider(), new InMemoryFlagSource()); this.expirer = new FailedExpirer(nodeRepository, zone, clock, Duration.ofMinutes(30)); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainerTest.java index eb0d36475de..a70bd323b63 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainerTest.java @@ -132,8 +132,7 @@ public class HostProvisionMaintainerTest { private final ManualClock clock = new ManualClock(); private final NodeRepository nodeRepository = new NodeRepository( - nodeFlavors, new MockCurator(), clock, Zone.defaultZone(), new MockNameResolver().mockAnyLookup(), - DockerImage.fromString("docker-image"), NodeType.config, true); + nodeFlavors, new MockCurator(), clock, Zone.defaultZone(), new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-image"), true); Node addNode(String hostname, Optional<String> parentHostname, NodeType nodeType, Node.State state, Optional<ApplicationId> application) { Node node = createNode(hostname, parentHostname, nodeType, state, application); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureVersionsTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureVersionsTest.java index a28991452b6..4ee3ade351a 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureVersionsTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureVersionsTest.java @@ -6,7 +6,9 @@ import com.yahoo.config.provision.NodeType; import com.yahoo.vespa.hosted.provision.NodeRepositoryTester; import org.junit.Test; +import java.util.HashMap; import java.util.Map; +import java.util.Optional; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; @@ -17,10 +19,9 @@ import static org.junit.Assert.fail; */ public class InfrastructureVersionsTest { - private final Version defaultVersion = Version.fromString("6.13.37"); private final NodeRepositoryTester tester = new NodeRepositoryTester(); private final InfrastructureVersions infrastructureVersions = - new InfrastructureVersions(tester.nodeRepository().database(), NodeType.config, defaultVersion); + new InfrastructureVersions(tester.nodeRepository().database()); private final Version version = Version.fromString("6.123.456"); @@ -28,21 +29,23 @@ public class InfrastructureVersionsTest { public void can_only_downgrade_with_force() { assertTrue(infrastructureVersions.getTargetVersions().isEmpty()); - assertEquals(defaultVersion, infrastructureVersions.getTargetVersionFor(NodeType.config)); + assertEquals(Optional.empty(), infrastructureVersions.getTargetVersionFor(NodeType.config)); infrastructureVersions.setTargetVersion(NodeType.config, version, false); - assertEquals(version, infrastructureVersions.getTargetVersionFor(NodeType.config)); + assertEquals(Optional.of(version), infrastructureVersions.getTargetVersionFor(NodeType.config)); // Upgrading to new version without force is fine - Version newVersion = Version.fromString("6.123.457"); // version + 1 - infrastructureVersions.setTargetVersion(NodeType.config, newVersion, false); - assertEquals(newVersion, infrastructureVersions.getTargetVersionFor(NodeType.config)); + Version new_version = Version.fromString("6.123.457"); // version + 1 + infrastructureVersions.setTargetVersion(NodeType.config, new_version, false); + assertEquals(Optional.of(new_version), infrastructureVersions.getTargetVersionFor(NodeType.config)); // Downgrading to old version without force fails - assertThrows(IllegalArgumentException.class, - () -> infrastructureVersions.setTargetVersion(NodeType.config, version, false)); + try { + infrastructureVersions.setTargetVersion(NodeType.config, version, false); + fail("Should not be able to downgrade without force"); + } catch (IllegalArgumentException ignored) { } infrastructureVersions.setTargetVersion(NodeType.config, version, true); - assertEquals(version, infrastructureVersions.getTargetVersionFor(NodeType.config)); + assertEquals(Optional.of(version), infrastructureVersions.getTargetVersionFor(NodeType.config)); } @Test @@ -50,61 +53,35 @@ public class InfrastructureVersionsTest { // We can set version for config infrastructureVersions.setTargetVersion(NodeType.config, version, false); - assertThrows(IllegalArgumentException.class, - () -> infrastructureVersions.setTargetVersion(NodeType.tenant, version, false)); + try { + infrastructureVersions.setTargetVersion(NodeType.tenant, version, false); + fail("Should not be able to set version for tenant nodes"); + } catch (IllegalArgumentException ignored) { } - // Using 'force' does not help, force only applies to version downgrade - assertThrows(IllegalArgumentException.class, - () -> infrastructureVersions.setTargetVersion(NodeType.tenant, version, true)); + try { + // Using 'force' does not help, force only applies to version downgrade + infrastructureVersions.setTargetVersion(NodeType.tenant, version, true); + fail("Should not be able to set version for tenant nodes"); + } catch (IllegalArgumentException ignored) { } } @Test - public void store_all_valid_for_config() { + public void can_store_multiple_versions() { + Version version2 = Version.fromString("6.456.123"); + infrastructureVersions.setTargetVersion(NodeType.config, version, false); - infrastructureVersions.setTargetVersion(NodeType.confighost, version, false); + infrastructureVersions.setTargetVersion(NodeType.confighost, version2, false); infrastructureVersions.setTargetVersion(NodeType.proxyhost, version, false); - - assertThrows(IllegalArgumentException.class, - () -> infrastructureVersions.setTargetVersion(NodeType.controller, version, false)); - assertThrows(IllegalArgumentException.class, - () -> infrastructureVersions.setTargetVersion(NodeType.controllerhost, version, false)); - - Map<NodeType, Version> expected = Map.of( - NodeType.config, version, - NodeType.confighost, version, - NodeType.proxyhost, version); - - assertEquals(expected, infrastructureVersions.getTargetVersions()); - } - - @Test - public void store_all_valid_for_controller() { - InfrastructureVersions infrastructureVersions = - new InfrastructureVersions(tester.nodeRepository().database(), NodeType.controller, defaultVersion); - infrastructureVersions.setTargetVersion(NodeType.controller, version, false); - infrastructureVersions.setTargetVersion(NodeType.controllerhost, version, false); - infrastructureVersions.setTargetVersion(NodeType.proxyhost, version, false); + infrastructureVersions.setTargetVersion(NodeType.controllerhost, version2, false); - assertThrows(IllegalArgumentException.class, - () -> infrastructureVersions.setTargetVersion(NodeType.config, version, false)); - assertThrows(IllegalArgumentException.class, - () -> infrastructureVersions.setTargetVersion(NodeType.confighost, version, false)); - - Map<NodeType, Version> expected = Map.of( - NodeType.controller, version, - NodeType.controllerhost, version, - NodeType.proxyhost, version); + Map<NodeType, Version> expected = new HashMap<>(); + expected.put(NodeType.config, version); + expected.put(NodeType.confighost, version2); + expected.put(NodeType.proxyhost, version); + expected.put(NodeType.controller, version); + expected.put(NodeType.controllerhost, version2); assertEquals(expected, infrastructureVersions.getTargetVersions()); } - - private static void assertThrows(Class<? extends Throwable> clazz, Runnable runnable) { - try { - runnable.run(); - fail("Expected " + clazz); - } catch (Throwable e) { - if (!clazz.isInstance(e)) throw e; - } - } } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java index efb6dffb23b..798df66f6cd 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java @@ -36,7 +36,6 @@ public class MaintenanceTester { public final NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - NodeType.config, true); public NodeRepository nodeRepository() { return nodeRepository; } diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java index 435c005143e..e1a0f478b86 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java @@ -54,7 +54,6 @@ public class MetricsReporterTest { NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, Clock.systemUTC(), Zone.defaultZone(), new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - NodeType.config, true); Node node = nodeRepository.createNode("openStackId", "hostname", Optional.empty(), nodeFlavors.getFlavorOrThrow("default"), NodeType.tenant); nodeRepository.addNodes(Collections.singletonList(node)); @@ -116,7 +115,6 @@ public class MetricsReporterTest { NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, Clock.systemUTC(), Zone.defaultZone(), new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - NodeType.config, true); // Allow 4 containers 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 60ba388f78c..9e57ae6dcd6 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 @@ -88,7 +88,7 @@ public class NodeFailTester { clock = new ManualClock(); curator = new MockCurator(); nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, new MockNameResolver().mockAnyLookup(), - DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), NodeType.config, true); + DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), true); provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource()); hostLivenessTracker = new TestHostLivenessTracker(clock); orchestrator = new OrchestratorMock(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java index b4375f16c0b..832c2fc512b 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java @@ -76,7 +76,7 @@ public class NodeRetirerTester { NodeRetirerTester(NodeFlavors nodeFlavors) { Curator curator = new MockCurator(); nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, new MockNameResolver().mockAnyLookup(), - DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), NodeType.config, true); + DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), true); NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource()); deployer = new MockDeployer(provisioner, clock, apps); flavors = nodeFlavors.getFlavors().stream().sorted(Comparator.comparing(Flavor::name)).collect(Collectors.toList()); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java index 707692a69e5..cd136360b0d 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java @@ -62,7 +62,6 @@ public class OperatorChangeApplicationMaintainerTest { this.nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - NodeType.config, true); this.fixture = new Fixture(zone, nodeRepository, nodeFlavors, curator); 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 467f1864810..49a14dc3777 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 @@ -68,7 +68,6 @@ public class PeriodicApplicationMaintainerTest { this.nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - NodeType.config, true); this.fixture = new Fixture(zone, nodeRepository, nodeFlavors, curator); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java index 75d4aefbe94..491f506c3eb 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java @@ -48,7 +48,6 @@ public class ReservationExpirerTest { NodeRepository nodeRepository = new NodeRepository(flavors, curator, clock, Zone.defaultZone(), new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), - NodeType.config, true); NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, flavors, Zone.defaultZone(), new MockProvisionServiceProvider(), new InMemoryFlagSource()); 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 feee3387931..e37a139700f 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 @@ -65,7 +65,7 @@ public class RetiredExpirerTest { private final NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("default"); private final NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, new MockNameResolver().mockAnyLookup(), - DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), NodeType.config, true); + DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), true); private final NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource()); private final Orchestrator orchestrator = mock(Orchestrator.class); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InfraDeployerImplTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InfraDeployerImplTest.java index ede9c7cb378..44bdec75f51 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InfraDeployerImplTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InfraDeployerImplTest.java @@ -9,6 +9,7 @@ import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.NodeType; import com.yahoo.config.provision.Provisioner; import com.yahoo.vespa.hosted.provision.Node; +import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.NodeRepositoryTester; import com.yahoo.vespa.hosted.provision.maintenance.InfrastructureVersions; import com.yahoo.vespa.hosted.provision.node.Agent; @@ -50,9 +51,10 @@ public class InfraDeployerImplTest { ); } - private final NodeRepositoryTester tester; - private final InfrastructureVersions infrastructureVersions; + private final NodeRepositoryTester tester = new NodeRepositoryTester(); private final Provisioner provisioner = mock(Provisioner.class); + private final NodeRepository nodeRepository = tester.nodeRepository(); + private final InfrastructureVersions infrastructureVersions = nodeRepository.infrastructureVersions(); private final DuperModelInfraApi duperModelInfraApi = mock(DuperModelInfraApi.class); private final InfraDeployerImpl infraDeployer; @@ -69,9 +71,16 @@ public class InfraDeployerImplTest { when(duperModelInfraApi.getSupportedInfraApplications()).thenReturn(List.of(application)); this.application = application; this.nodeType = application.getCapacity().type(); - this.tester = new NodeRepositoryTester(nodeType); - this.infrastructureVersions = tester.nodeRepository().infrastructureVersions(); - this.infraDeployer = new InfraDeployerImpl(tester.nodeRepository(), provisioner, duperModelInfraApi); + this.infraDeployer = new InfraDeployerImpl(nodeRepository, provisioner, duperModelInfraApi); + } + + @Test + public void remove_application_if_without_target_version() { + addNode(1, Node.State.active, Optional.of(target)); + when(duperModelInfraApi.infraApplicationIsActive(eq(application.getApplicationId()))).thenReturn(true); + infraDeployer.getDeployment(application.getApplicationId()).orElseThrow().activate(); + verify(duperModelInfraApi).infraApplicationRemoved(application.getApplicationId()); + verifyRemoved(1); } @Test @@ -230,7 +239,7 @@ public class InfraDeployerImplTest { Allocation allocation = new Allocation(application.getApplicationId(), membership, new Generation(0, 0), false); return node.with(allocation); }); - return tester.nodeRepository().database().writeTo(state, nodeWithAllocation.orElse(node), Agent.system, Optional.empty()); + return nodeRepository.database().writeTo(state, nodeWithAllocation.orElse(node), Agent.system, Optional.empty()); } }
\ No newline at end of file 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 020eddbc948..c8051c3bdee 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 @@ -87,7 +87,7 @@ public class ProvisioningTester { this.nodeFlavors = nodeFlavors; this.clock = new ManualClock(); this.nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, nameResolver, - DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), NodeType.config, true); + DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), true); this.orchestrator = orchestrator; ProvisionServiceProvider provisionServiceProvider = new MockProvisionServiceProvider(loadBalancerService, hostProvisioner); this.provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone, provisionServiceProvider, flagSource); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java index 6510cb570d3..3fbfc7c2487 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java @@ -636,10 +636,15 @@ public class RestApiTest { Utf8.toBytes("{\"version\": \"6.123.456\"}"), Request.Method.PATCH), "{\"message\":\"Set version to 6.123.456 for nodes of type confighost\"}"); + assertResponse(new Request("http://localhost:8080/nodes/v2/upgrade/controller", + Utf8.toBytes("{\"version\": \"6.123.456\"}"), + Request.Method.PATCH), + "{\"message\":\"Set version to 6.123.456 for nodes of type controller\"}"); + // Verify versions are set assertResponse(new Request("http://localhost:8080/nodes/v2/upgrade/"), - "{\"versions\":{\"config\":\"6.123.456\",\"confighost\":\"6.123.456\"},\"osVersions\":{},\"dockerImages\":{}}"); + "{\"versions\":{\"config\":\"6.123.456\",\"confighost\":\"6.123.456\",\"controller\":\"6.123.456\"},\"osVersions\":{},\"dockerImages\":{}}"); // Setting empty version fails assertResponse(new Request("http://localhost:8080/nodes/v2/upgrade/confighost", @@ -655,13 +660,6 @@ public class RestApiTest { 400, "{\"error-code\":\"BAD_REQUEST\",\"message\":\"Cannot set version for type tenant\"}"); - // Setting version for controller on a config server fails - assertResponse(new Request("http://localhost:8080/nodes/v2/upgrade/controller", - Utf8.toBytes("{\"version\": \"6.123.456\"}"), - Request.Method.PATCH), - 400, - "{\"error-code\":\"BAD_REQUEST\",\"message\":\"Cannot set version for controller on a Config server\"}"); - // Omitting version field fails assertResponse(new Request("http://localhost:8080/nodes/v2/upgrade/confighost", Utf8.toBytes("{}"), @@ -685,7 +683,7 @@ public class RestApiTest { // Verify version has been updated assertResponse(new Request("http://localhost:8080/nodes/v2/upgrade/"), - "{\"versions\":{\"config\":\"6.123.456\",\"confighost\":\"6.123.1\"},\"osVersions\":{},\"dockerImages\":{}}"); + "{\"versions\":{\"config\":\"6.123.456\",\"confighost\":\"6.123.1\",\"controller\":\"6.123.456\"},\"osVersions\":{},\"dockerImages\":{}}"); // Upgrade OS for confighost and host assertResponse(new Request("http://localhost:8080/nodes/v2/upgrade/confighost", @@ -699,7 +697,7 @@ public class RestApiTest { // OS versions are set assertResponse(new Request("http://localhost:8080/nodes/v2/upgrade/"), - "{\"versions\":{\"config\":\"6.123.456\",\"confighost\":\"6.123.1\"},\"osVersions\":{\"host\":\"7.5.2\",\"confighost\":\"7.5.2\"},\"dockerImages\":{}}"); + "{\"versions\":{\"config\":\"6.123.456\",\"confighost\":\"6.123.1\",\"controller\":\"6.123.456\"},\"osVersions\":{\"host\":\"7.5.2\",\"confighost\":\"7.5.2\"},\"dockerImages\":{}}"); // Upgrade OS and Vespa together assertResponse(new Request("http://localhost:8080/nodes/v2/upgrade/confighost", @@ -745,7 +743,7 @@ public class RestApiTest { "{\"message\":\"Set docker image to my-repo.my-domain.example:1234/repo/image for nodes of type config\"}"); assertResponse(new Request("http://localhost:8080/nodes/v2/upgrade/"), - "{\"versions\":{\"config\":\"6.123.456\",\"confighost\":\"6.124.42\"},\"osVersions\":{\"host\":\"7.5.2\"},\"dockerImages\":{\"tenant\":\"my-repo.my-domain.example:1234/repo/tenant\",\"config\":\"my-repo.my-domain.example:1234/repo/image\"}}"); + "{\"versions\":{\"config\":\"6.123.456\",\"confighost\":\"6.124.42\",\"controller\":\"6.123.456\"},\"osVersions\":{\"host\":\"7.5.2\"},\"dockerImages\":{\"tenant\":\"my-repo.my-domain.example:1234/repo/tenant\",\"config\":\"my-repo.my-domain.example:1234/repo/image\"}}"); // Cannot set docker image for non docker node type assertResponse(new Request("http://localhost:8080/nodes/v2/upgrade/confighost", |