summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2020-01-26 21:20:32 +0100
committerGitHub <noreply@github.com>2020-01-26 21:20:32 +0100
commite0ce7ed6df4877721284f338f03a85750df112d1 (patch)
tree2560f270e3778a7d5d145e4fbfc3a6f5e57b58e2
parent3426e6e4f7fc1a9693959488a6364f69b1381498 (diff)
parent3dbf734cfe5ec27ddb77c9372ed5aa08a56fa62f (diff)
Merge pull request #11952 from vespa-engine/hmusum/use-config-server-for-testerReady
Use testerReady call via config server for tester containers if flag …
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java91
1 files changed, 66 insertions, 25 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java
index 100b66289bb..674ff733bb8 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java
@@ -417,7 +417,7 @@ public class InternalStepRunner implements StepRunner {
.collect(toList()));
if (nodeList.summary().converged()) {
if (endpointsAvailable(testerId, zone, logger)) {
- if (containersAreUp(testerId, zone, logger)) {
+ if (testerContainersAreUp(testerId, zone, logger)) {
logger.log("Tester container successfully installed!");
return Optional.of(running);
}
@@ -437,6 +437,7 @@ public class InternalStepRunner implements StepRunner {
}
/** Returns true iff all containers in the deployment give 100 consecutive 200 OK responses on /status.html. */
+ // TODO: Change implementation to only be used for real deployments when useConfigServerForTesterAPI() always returns true
private boolean containersAreUp(ApplicationId id, ZoneId zoneId, DualLogger logger) {
var endpoints = controller.applications().clusterEndpoints(Set.of(new DeploymentId(id, zoneId)));
if ( ! endpoints.containsKey(zoneId))
@@ -455,6 +456,22 @@ public class InternalStepRunner implements StepRunner {
return true;
}
+ /** Returns true iff all containers in the tester deployment give 100 consecutive 200 OK responses on /status.html. */
+ private boolean testerContainersAreUp(ApplicationId id, ZoneId zoneId, DualLogger logger) {
+ if (useConfigServerForTesterAPI(zoneId)) {
+ DeploymentId deploymentId = new DeploymentId(id, zoneId);
+ if (controller.jobController().cloud().testerReady(deploymentId)) {
+ return true;
+ } else {
+ logger.log("Failed to get 100 consecutive OKs from tester container for " + deploymentId);
+ return false;
+ }
+ } else {
+ return containersAreUp(id, zoneId, logger);
+ }
+ }
+
+
private boolean endpointsAvailable(ApplicationId id, ZoneId zone, DualLogger logger) {
var endpoints = controller.applications().clusterEndpoints(Set.of(new DeploymentId(id, zone)));
if ( ! endpoints.containsKey(zone)) {
@@ -525,38 +542,58 @@ public class InternalStepRunner implements StepRunner {
.productionDeployments().keySet().stream()
.map(zone -> new DeploymentId(id.application(), zone))
.collect(Collectors.toSet());
- deployments.add(new DeploymentId(id.application(), id.type().zone(controller.system())));
+ ZoneId zoneId = id.type().zone(controller.system());
+ deployments.add(new DeploymentId(id.application(), zoneId));
logger.log("Attempting to find endpoints ...");
var endpoints = controller.applications().clusterEndpoints(deployments);
- if ( ! endpoints.containsKey(id.type().zone(controller.system()))) {
+ if ( ! endpoints.containsKey(zoneId)) {
logger.log(WARNING, "Endpoints for the deployment to test vanished again, while it was still active!");
return Optional.of(error);
}
logEndpoints(endpoints, logger);
Optional<URI> testerEndpoint = controller.jobController().testerEndpoint(id);
- if (testerEndpoint.isEmpty()) {
- logger.log(WARNING, "Endpoints for the tester container vanished again, while it was still active!");
- return Optional.of(error);
- }
+ if (useConfigServerForTesterAPI(zoneId)) {
+ if ( ! controller.serviceRegistry().configServer().isTesterReady(getTesterDeploymentId(id))) {
+ logger.log(WARNING, "Tester container went bad!");
+ return Optional.of(error);
+ }
+ } else {
+ if (testerEndpoint.isEmpty()) {
+ logger.log(WARNING, "Endpoints for the tester container vanished again, while it was still active!");
+ return Optional.of(error);
+ }
- if ( ! controller.jobController().cloud().testerReady(testerEndpoint.get())) {
- logger.log(WARNING, "Tester container went bad!");
- return Optional.of(error);
+ if ( ! controller.jobController().cloud().testerReady(testerEndpoint.get())) {
+ logger.log(WARNING, "Tester container went bad!");
+ return Optional.of(error);
+ }
}
logger.log("Starting tests ...");
- controller.jobController().cloud().startTests(testerEndpoint.get(),
- TesterCloud.Suite.of(id.type(), isSetup),
- testConfigSerializer.configJson(id.application(),
- id.type(),
- true,
- endpoints,
- controller.applications().contentClustersByZone(deployments)));
+ TesterCloud.Suite suite = TesterCloud.Suite.of(id.type(), isSetup);
+ byte[] config = testConfigSerializer.configJson(id.application(),
+ id.type(),
+ true,
+ endpoints,
+ controller.applications().contentClustersByZone(deployments));
+ if (useConfigServerForTesterAPI(zoneId)) {
+ controller.serviceRegistry().configServer().startTests(getTesterDeploymentId(id), suite, config);
+ } else {
+ controller.jobController().cloud().startTests(testerEndpoint.get(), suite, config);
+ }
return Optional.of(running);
}
+ private boolean testerReady(RunId id, URI testerEndpoint) {
+ if (useConfigServerForTesterAPI(id.type().zone(controller.system()))) {
+ return controller.serviceRegistry().configServer().isTesterReady(getTesterDeploymentId(id));
+ } else {
+ return controller.jobController().cloud().testerReady(testerEndpoint);
+ }
+ }
+
private Optional<RunStatus> endTests(RunId id, DualLogger logger) {
if (deployment(id.application(), id.type()).isEmpty()) {
logger.log(INFO, "Deployment expired before tests could complete.");
@@ -576,14 +613,9 @@ public class InternalStepRunner implements StepRunner {
controller.jobController().updateTestLog(id);
- BooleanFlag useConfigServerForTesterAPI = Flags.USE_CONFIG_SERVER_FOR_TESTER_API_CALLS.bindTo(controller.flagSource());
- ZoneId zoneId = id.type().zone(controller.system());
TesterCloud.Status testStatus;
- boolean useConfigServer = useConfigServerForTesterAPI.with(FetchVector.Dimension.ZONE_ID, zoneId.value()).value();
- InternalStepRunner.logger.log(LogLevel.INFO, Flags.USE_CONFIG_SERVER_FOR_TESTER_API_CALLS.id().toString() +
- " has value " + useConfigServer + " in zone " + zoneId.value());
- if (useConfigServer) {
- testStatus = controller.serviceRegistry().configServer().getTesterStatus(getTesterDeploymentId(id, zoneId));
+ if (useConfigServerForTesterAPI(id.type().zone(controller.system()))) {
+ testStatus = controller.serviceRegistry().configServer().getTesterStatus(getTesterDeploymentId(id));
} else {
Optional<URI> testerEndpoint = controller.jobController().testerEndpoint(id);
if (testerEndpoint.isEmpty()) {
@@ -779,10 +811,19 @@ public class InternalStepRunner implements StepRunner {
zipBuilder.add("artifacts/cert", X509CertificateUtils.toPem(certificate).getBytes(UTF_8));
}
- private DeploymentId getTesterDeploymentId(RunId runId, ZoneId zoneId) {
+ private DeploymentId getTesterDeploymentId(RunId runId) {
+ ZoneId zoneId = runId.type().zone(controller.system());
return new DeploymentId(runId.tester().id(), zoneId);
}
+ private boolean useConfigServerForTesterAPI(ZoneId zoneId) {
+ BooleanFlag useConfigServerForTesterAPI = Flags.USE_CONFIG_SERVER_FOR_TESTER_API_CALLS.bindTo(controller.flagSource());
+ boolean useConfigServer = useConfigServerForTesterAPI.with(FetchVector.Dimension.ZONE_ID, zoneId.value()).value();
+ InternalStepRunner.logger.log(LogLevel.INFO, Flags.USE_CONFIG_SERVER_FOR_TESTER_API_CALLS.id().toString() +
+ " has value " + useConfigServer + " in zone " + zoneId.value());
+ return useConfigServer;
+ }
+
private static Optional<String> testerFlavorFor(RunId id, DeploymentSpec spec) {
for (DeploymentSpec.Step step : spec.steps())
if (step.concerns(id.type().environment()))