summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorOla Aunrønning <olaa@verizonmedia.com>2021-04-06 18:53:57 +0200
committerOla Aunrønning <olaa@verizonmedia.com>2021-04-06 18:53:57 +0200
commit661fa0197c4e762a5140780166ff8a20bf99e0c0 (patch)
tree5517a60b5e97527aa41422295b731633d169868f /controller-server
parent5199df1368c4ff2752705396818e2fa52221da1b (diff)
Infer prod zone from host list
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandler.java32
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandlerTest.java9
2 files changed, 23 insertions, 18 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandler.java
index cd9c467582c..2077278ee0c 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandler.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandler.java
@@ -68,7 +68,7 @@ public class ChangeManagementApiHandler extends AuditLoggingRequestHandler {
private HttpResponse post(HttpRequest request) {
Path path = new Path(request.getUri());
- if (path.matches("/changemanagement/v1/assessment")) return new SlimeJsonResponse(doAssessment(request));
+ if (path.matches("/changemanagement/v1/assessment")) return doAssessment(request);
return ErrorResponse.notFoundError("Nothing at " + path);
}
@@ -97,31 +97,24 @@ public class ChangeManagementApiHandler extends AuditLoggingRequestHandler {
return ErrorResponse.notFoundError("Could not find any upcoming change requests with id " + changeRequestId);
var changeRequest = optionalChangeRequest.get();
- var zone = affectedZone(changeRequest);
- if (zone.isEmpty())
- return ErrorResponse.notFoundError("Could not find prod zone affected by change request " + changeRequestId);
-
- var assessment = doAssessment(changeRequest.getImpactedHosts(), zone.get());
- return new SlimeJsonResponse(assessment);
+ return doAssessment(changeRequest.getImpactedHosts());
}
// The structure here should be
//
// {
- // zone: string
// hosts: string[]
// switches: string[]
// switchInSequence: boolean
// }
//
- // Only zone and host are supported right now
- private Slime doAssessment(HttpRequest request) {
+ // Only hosts is supported right now
+ private HttpResponse doAssessment(HttpRequest request) {
Inspector inspector = inspectorOrThrow(request);
// For now; mandatory fields
- String zoneStr = getInspectorFieldOrThrow(inspector, "zone").asString();
Inspector hostArray = getInspectorFieldOrThrow(inspector, "hosts");
// The impacted hostnames
@@ -130,11 +123,15 @@ public class ChangeManagementApiHandler extends AuditLoggingRequestHandler {
hostArray.traverse((ArrayTraverser) (i, host) -> hostNames.add(host.asString()));
}
- return doAssessment(hostNames, ZoneId.from(zoneStr));
+ return doAssessment(hostNames);
}
- private Slime doAssessment(List<String> hostNames, ZoneId zoneId) {
- ChangeManagementAssessor.Assessment assessments = assessor.assessment(hostNames, zoneId);
+ private HttpResponse doAssessment(List<String> hostNames) {
+ var zone = affectedZone(hostNames);
+ if (zone.isEmpty())
+ return ErrorResponse.notFoundError("Could not infer prod zone from host list: " + hostNames);
+
+ ChangeManagementAssessor.Assessment assessments = assessor.assessment(hostNames, zone.get());
Slime slime = new Slime();
Cursor root = slime.setObject();
@@ -171,12 +168,11 @@ public class ChangeManagementApiHandler extends AuditLoggingRequestHandler {
hostObject.setLong("numberOfProblematicChildren", assessment.numberOfProblematicChildren);
});
- return slime;
+ return new SlimeJsonResponse(slime);
}
- private Optional<ZoneId> affectedZone(ChangeRequest changeRequest) {
- var affectedHosts = changeRequest.getImpactedHosts()
- .stream()
+ private Optional<ZoneId> affectedZone(List<String> hosts) {
+ var affectedHosts = hosts.stream()
.map(HostName::from)
.collect(Collectors.toList());
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandlerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandlerTest.java
index 2f2e70e2cf6..cd815a2064b 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandlerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandlerTest.java
@@ -2,9 +2,11 @@
package com.yahoo.vespa.hosted.controller.restapi.changemanagement;
import com.yahoo.application.container.handler.Request;
+import com.yahoo.config.provision.HostName;
import com.yahoo.config.provision.zone.ZoneId;
import com.yahoo.vespa.athenz.api.AthenzIdentity;
import com.yahoo.vespa.athenz.api.AthenzUser;
+import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node;
import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeMembership;
import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeOwner;
import com.yahoo.vespa.hosted.controller.api.integration.noderepository.NodeRepositoryNode;
@@ -32,6 +34,7 @@ public class ChangeManagementApiHandlerTest extends ControllerContainerTest {
tester = new ContainerTester(container, responses);
addUserToHostedOperatorRole(operator);
tester.serviceRegistry().configServer().nodeRepository().addNodes(ZoneId.from("prod.us-east-3"), createNodes());
+ tester.serviceRegistry().configServer().nodeRepository().putNodes(ZoneId.from("prod.us-east-3"), createNode());
}
@Test
@@ -49,6 +52,12 @@ public class ChangeManagementApiHandlerTest extends ControllerContainerTest {
tester.assertResponse(request, new File(filename));
}
+ private Node createNode() {
+ return new Node.Builder()
+ .hostname(HostName.from("host1"))
+ .build();
+ }
+
private List<NodeRepositoryNode> createNodes() {
List<NodeRepositoryNode> nodes = new ArrayList<>();
nodes.add(createNode("node1", "host1", "default", 0 ));