diff options
author | Ola Aunrønning <olaa@verizonmedia.com> | 2021-03-18 15:15:13 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-03-18 15:15:13 +0100 |
commit | 42cbd6e3e7915430f00450e0c3a6ec634ce1a2ab (patch) | |
tree | caf1003168911c2161f31b459b478372870afa08 /controller-server | |
parent | 949e8235ead29dfa13d9aca8b36ef625a4fe396b (diff) | |
parent | bffb3650906633eecc56b6217a8182ad437b342c (diff) |
Merge pull request #17016 from vespa-engine/olaa/assessment-by-change-request
Get assessment of specific change request
Diffstat (limited to 'controller-server')
-rw-r--r-- | controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/changemanagement/ChangeManagementApiHandler.java | 66 |
1 files changed, 64 insertions, 2 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 ff45955ee76..ad12b7d6fa9 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 @@ -1,5 +1,7 @@ package com.yahoo.vespa.hosted.controller.restapi.changemanagement; +import com.yahoo.config.provision.Environment; +import com.yahoo.config.provision.HostName; import com.yahoo.config.provision.zone.ZoneId; import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.container.jdisc.HttpResponse; @@ -13,6 +15,8 @@ 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.auditlog.AuditLoggingRequestHandler; import com.yahoo.vespa.hosted.controller.maintenance.ChangeManagementAssessor; import com.yahoo.yolean.Exceptions; @@ -21,21 +25,27 @@ import javax.ws.rs.BadRequestException; import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.logging.Level; +import java.util.stream.Collectors; public class ChangeManagementApiHandler extends AuditLoggingRequestHandler { private final ChangeManagementAssessor assessor; + private final Controller controller; public ChangeManagementApiHandler(LoggingRequestHandler.Context ctx, Controller controller) { super(ctx, controller.auditLogger()); - assessor = new ChangeManagementAssessor(controller); + this.assessor = new ChangeManagementAssessor(controller); + this.controller = controller; } @Override public HttpResponse auditAndHandle(HttpRequest request) { try { switch (request.getMethod()) { + case GET: + return get(request); case POST: return post(request); default: @@ -49,6 +59,12 @@ public class ChangeManagementApiHandler extends AuditLoggingRequestHandler { } } + private HttpResponse get(HttpRequest request) { + Path path = new Path(request.getUri()); + if (path.matches("/changemanagement/v1/assessment/{changeRequestId}")) return changeRequestAssessment(path.get("changeRequestId")); + return ErrorResponse.notFoundError("Nothing at " + path); + } + private HttpResponse post(HttpRequest request) { Path path = new Path(request.getUri()); if (path.matches("/changemanagement/v1/assessment")) return new SlimeJsonResponse(doAssessment(request)); @@ -69,6 +85,26 @@ public class ChangeManagementApiHandler extends AuditLoggingRequestHandler { return inspector.field(field); } + private HttpResponse changeRequestAssessment(String changeRequestId) { + var optionalChangeRequest = controller.serviceRegistry().changeRequestClient() + .getUpcomingChangeRequests() + .stream() + .filter(request -> changeRequestId.equals(request.getChangeRequestSource().getId())) + .findFirst(); + + if (optionalChangeRequest.isEmpty()) + 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); + } + // The structure here should be // // { @@ -93,7 +129,11 @@ public class ChangeManagementApiHandler extends AuditLoggingRequestHandler { hostArray.traverse((ArrayTraverser) (i, host) -> hostNames.add(host.asString())); } - List<ChangeManagementAssessor.Assessment> assessments = assessor.assessment(hostNames, ZoneId.from(zoneStr)); + return doAssessment(hostNames, ZoneId.from(zoneStr)); + } + + private Slime doAssessment(List<String> hostNames, ZoneId zoneId) { + List<ChangeManagementAssessor.Assessment> assessments = assessor.assessment(hostNames, zoneId); Slime slime = new Slime(); Cursor root = slime.setObject(); @@ -126,4 +166,26 @@ public class ChangeManagementApiHandler extends AuditLoggingRequestHandler { return slime; } + + private Optional<ZoneId> affectedZone(ChangeRequest changeRequest) { + var affectedHosts = changeRequest.getImpactedHosts() + .stream() + .map(HostName::from) + .collect(Collectors.toList()); + + var potentialZones = controller.zoneRegistry() + .zones() + .reachable() + .in(Environment.prod) + .ids(); + + for (var zone : potentialZones) { + var affectedHostsInZone = controller.serviceRegistry().configServer().nodeRepository().list(zone, affectedHosts); + if (!affectedHostsInZone.isEmpty()) + return Optional.of(zone); + } + + return Optional.empty(); + } + }
\ No newline at end of file |