summaryrefslogtreecommitdiffstats
path: root/controller-server/src/main
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 /controller-server/src/main
parentc73c7bc7026b5ccd9b251e11de6125385a5ed958 (diff)
Assessment API accepts switch list
Diffstat (limited to 'controller-server/src/main')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandler.java38
1 files changed, 29 insertions, 9 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();
+ }
+
}