summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--config-provisioning/src/main/resources/configdefinitions/node-repository.def2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java9
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureVersions.java69
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/InfraDeployerImpl.java12
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java1
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTester.java8
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java1
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainerTest.java3
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/InfrastructureVersionsTest.java89
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceTester.java1
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeRetirerTester.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java1
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java1
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java1
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/InfraDeployerImplTest.java21
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/RestApiTest.java20
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",