summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOla Aunrønning <olaa@verizonmedia.com>2021-06-17 16:05:04 +0200
committerOla Aunrønning <olaa@verizonmedia.com>2021-06-17 16:05:04 +0200
commit9e99cc59615f4088e7e6bb8d30b4915e177cf2b5 (patch)
tree6c6c8e223c1e8b569774c37b071448749b9d6f43
parentc73c7bc7026b5ccd9b251e11de6125385a5ed958 (diff)
Assessment API accepts switch list
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandler.java38
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandlerTest.java3
2 files changed, 31 insertions, 10 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 ac9612a56c5..cffdd9fc928 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
@@ -16,7 +16,6 @@ import com.yahoo.slime.Inspector;
import com.yahoo.slime.Slime;
import com.yahoo.slime.SlimeUtils;
import com.yahoo.vespa.hosted.controller.Controller;
-import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node;
import com.yahoo.vespa.hosted.controller.api.integration.vcmr.ChangeRequest;
import com.yahoo.vespa.hosted.controller.api.integration.vcmr.VespaChangeRequest;
import com.yahoo.vespa.hosted.controller.auditlog.AuditLoggingRequestHandler;
@@ -134,7 +133,9 @@ public class ChangeManagementApiHandler extends AuditLoggingRequestHandler {
Inspector inspector = inspectorOrThrow(request);
// For now; mandatory fields
- Inspector hostArray = getInspectorFieldOrThrow(inspector, "hosts");
+ Inspector hostArray = inspector.field("hosts");
+ Inspector switchArray = inspector.field("switches");
+
// The impacted hostnames
List<String> hostNames = new ArrayList<>();
@@ -142,6 +143,15 @@ public class ChangeManagementApiHandler extends AuditLoggingRequestHandler {
hostArray.traverse((ArrayTraverser) (i, host) -> hostNames.add(host.asString()));
}
+ if (switchArray.valid()) {
+ List<String> switchNames = new ArrayList<>();
+ switchArray.traverse((ArrayTraverser) (i, switchName) -> switchNames.add(switchName.asString()));
+ hostNames.addAll(hostsOnSwitch(switchNames));
+ }
+
+ if (hostNames.isEmpty())
+ return ErrorResponse.badRequest("No prod hosts in provided host/switch list");
+
return doAssessment(hostNames);
}
@@ -272,13 +282,7 @@ public class ChangeManagementApiHandler extends AuditLoggingRequestHandler {
.map(HostName::from)
.collect(Collectors.toList());
- var potentialZones = controller.zoneRegistry()
- .zones()
- .reachable()
- .in(Environment.prod)
- .ids();
-
- for (var zone : potentialZones) {
+ for (var zone : getProdZones()) {
var affectedHostsInZone = controller.serviceRegistry().configServer().nodeRepository().list(zone, affectedHosts);
if (!affectedHostsInZone.isEmpty())
return Optional.of(zone);
@@ -287,4 +291,20 @@ public class ChangeManagementApiHandler extends AuditLoggingRequestHandler {
return Optional.empty();
}
+ private List<String> hostsOnSwitch(List<String> switches) {
+ return getProdZones().stream()
+ .flatMap(zone -> controller.serviceRegistry().configServer().nodeRepository().list(zone, false).stream())
+ .filter(node -> node.switchHostname().map(switches::contains).orElse(false))
+ .map(node -> node.hostname().value())
+ .collect(Collectors.toList());
+ }
+
+ private List<ZoneId> getProdZones() {
+ return controller.zoneRegistry()
+ .zones()
+ .reachable()
+ .in(Environment.prod)
+ .ids();
+ }
+
}
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 d87da62b8f2..80cee3af58b 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
@@ -27,7 +27,6 @@ import java.time.Instant;
import java.time.ZonedDateTime;
import java.util.ArrayList;
import java.util.List;
-import java.util.UUID;
import static org.junit.Assert.assertEquals;
@@ -52,6 +51,7 @@ public class ChangeManagementApiHandlerTest extends ControllerContainerTest {
@Test
public void test_api() {
assertFile(new Request("http://localhost:8080/changemanagement/v1/assessment", "{\"zone\":\"prod.us-east-3\", \"hosts\": [\"host1\"]}", Request.Method.POST), "initial.json");
+ assertFile(new Request("http://localhost:8080/changemanagement/v1/assessment", "{\"zone\":\"prod.us-east-3\", \"switches\": [\"switch1\"]}", Request.Method.POST), "initial.json");
assertFile(new Request("http://localhost:8080/changemanagement/v1/vcmr"), "vcmrs.json");
}
@@ -98,6 +98,7 @@ public class ChangeManagementApiHandlerTest extends ControllerContainerTest {
private Node createNode() {
return new Node.Builder()
.hostname(HostName.from("host1"))
+ .switchHostname("switch1")
.build();
}