diff options
author | Ola Aunrønning <olaa@verizonmedia.com> | 2021-05-20 15:11:00 +0200 |
---|---|---|
committer | Ola Aunrønning <olaa@verizonmedia.com> | 2021-05-20 15:22:51 +0200 |
commit | c723d3178323e7b86d099ceaf80a0546df59918d (patch) | |
tree | 59d9becf81eeccb234b088911543c137b4c07b3e /controller-server | |
parent | 865814b367fed14121415dd994264f481d351ca4 (diff) |
Write VCMR reports to node repo
Diffstat (limited to 'controller-server')
3 files changed, 52 insertions, 4 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainer.java index 111a332bc81..fedf3d90760 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainer.java @@ -15,6 +15,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.vcmr.ChangeRequest.Impa import com.yahoo.vespa.hosted.controller.api.integration.vcmr.ChangeRequestClient; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.HostAction; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.HostAction.State; +import com.yahoo.vespa.hosted.controller.api.integration.vcmr.VCMRReport; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.VespaChangeRequest; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.VespaChangeRequest.Status; import com.yahoo.vespa.hosted.controller.persistence.CuratorDb; @@ -144,12 +145,15 @@ public class VCMRMaintainer extends ControllerMaintainer { if (changeRequest.getChangeRequestSource().isClosed()) { logger.fine(() -> changeRequest.getChangeRequestSource().getId() + " is closed, recycling " + node.hostname()); recycleNode(changeRequest.getZoneId(), node, hostAction); + removeReport(changeRequest, node); return hostAction.withState(State.COMPLETE); } if (isLowImpact(changeRequest)) return hostAction; + addReport(changeRequest, node); + if (isPostponed(changeRequest, hostAction)) { logger.fine(() -> changeRequest.getChangeRequestSource().getId() + " is postponed, recycling " + node.hostname()); recycleNode(changeRequest.getZoneId(), node, hostAction); @@ -285,4 +289,28 @@ public class VCMRMaintainer extends ControllerMaintainer { logger.info("Approving " + changeRequest.getChangeRequestSource().getId()); changeRequestClient.approveChangeRequest(changeRequest); } + + private void removeReport(VespaChangeRequest changeRequest, Node node) { + var report = VCMRReport.fromReports(node.reports()); + + if (report.removeVcmr(changeRequest.getChangeRequestSource().getId())) { + updateReport(changeRequest.getZoneId(), node, report); + } + } + + private void addReport(VespaChangeRequest changeRequest, Node node) { + var report = VCMRReport.fromReports(node.reports()); + + var source = changeRequest.getChangeRequestSource(); + if (report.addVcmr(source.getId(), source.getPlannedStartTime(), source.getPlannedEndTime())) { + updateReport(changeRequest.getZoneId(), node, report); + } + } + + private void updateReport(ZoneId zoneId, Node node, VCMRReport report) { + logger.info(String.format("Updating report for %s: %s", node.hostname(), report)); + var newNode = new NodeRepositoryNode(); + newNode.setReports(report.toNodeReports()); + nodeRepository.patchNode(zoneId, node.hostname().value(), newNode); + } } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/NodeRepositoryMock.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/NodeRepositoryMock.java index fe241976d13..afb56f10c38 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/NodeRepositoryMock.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/NodeRepositoryMock.java @@ -292,6 +292,8 @@ public class NodeRepositoryMock implements NodeRepository { newNode.modelName(node.getModelName()); if (node.getWantToRetire() != null) newNode.wantToRetire(node.getWantToRetire()); + if (!node.getReports().isEmpty()) + newNode.reports(node.getReports()); putNodes(zoneId, newNode.build()); } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainerTest.java index c2983b6343d..16ed6b7ef98 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/VCMRMaintainerTest.java @@ -9,6 +9,7 @@ import com.yahoo.vespa.hosted.controller.api.integration.vcmr.ChangeRequest; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.ChangeRequestSource; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.HostAction; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.HostAction.State; +import com.yahoo.vespa.hosted.controller.api.integration.vcmr.VCMRReport; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.VespaChangeRequest; import com.yahoo.vespa.hosted.controller.api.integration.vcmr.VespaChangeRequest.Status; import com.yahoo.vespa.hosted.controller.integration.NodeRepositoryMock; @@ -39,22 +40,32 @@ public class VCMRMaintainerTest { public void setup() { tester = new ControllerTester(); maintainer = new VCMRMaintainer(tester.controller(), Duration.ofMinutes(1)); - nodeRepo = tester.serviceRegistry().configServer().nodeRepository(); + nodeRepo = tester.serviceRegistry().configServer().nodeRepository().allowPatching(true); } @Test public void recycle_hosts_after_completion() { + var vcmrReport = new VCMRReport(); + vcmrReport.addVcmr("id123", ZonedDateTime.now(), ZonedDateTime.now()); var parkedNode = createNode(host1, NodeType.host, Node.State.parked, true); var failedNode = createNode(host2, NodeType.host, Node.State.failed, false); + parkedNode = new Node.Builder(parkedNode) + .reports(vcmrReport.toNodeReports()) + .build(); + nodeRepo.putNodes(zoneId, List.of(parkedNode, failedNode)); tester.curator().writeChangeRequest(canceledChangeRequest()); maintainer.maintain(); - // Only the parked node is recycled + // Only the parked node is recycled, VCMR report is cleared var nodeList = nodeRepo.list(zoneId, List.of(host1, host2)); assertEquals(Node.State.dirty, nodeList.get(0).state()); assertEquals(Node.State.failed, nodeList.get(1).state()); + + var report = nodeList.get(0).reports(); + assertNull(report.get(VCMRReport.getReportId())); + var writtenChangeRequest = tester.curator().readChangeRequest(changeRequestId).get(); assertEquals(Status.COMPLETED, writtenChangeRequest.getStatus()); } @@ -82,7 +93,7 @@ public class VCMRMaintainerTest { var activeNode = createNode(host1, NodeType.host, Node.State.active, false); var failedNode = createNode(host2, NodeType.host, Node.State.failed, false); nodeRepo.putNodes(zoneId, List.of(activeNode, failedNode)); - nodeRepo.allowPatching(true).hasSpareCapacity(true); + nodeRepo.hasSpareCapacity(true); tester.curator().writeChangeRequest(startingChangeRequest()); maintainer.maintain(); @@ -150,6 +161,13 @@ public class VCMRMaintainerTest { var approvedChangeRequests = tester.serviceRegistry().changeRequestClient().getApprovedChangeRequests(); assertEquals(1, approvedChangeRequests.size()); + + activeNode = nodeRepo.list(zoneId, List.of(host2)).get(0); + var report = VCMRReport.fromReports(activeNode.reports()); + var reportAdded = report.getVcmrs().stream() + .filter(vcmr -> vcmr.getId().equals(changeRequestId)) + .count() == 1; + assertTrue(reportAdded); } @Test @@ -157,7 +175,7 @@ public class VCMRMaintainerTest { var parkedNode = createNode(host1, NodeType.host, Node.State.parked, false); var retiringNode = createNode(host2, NodeType.host, Node.State.active, true); nodeRepo.putNodes(zoneId, List.of(parkedNode, retiringNode)); - nodeRepo.allowPatching(true).hasSpareCapacity(true); + nodeRepo.hasSpareCapacity(true); tester.curator().writeChangeRequest(postponedChangeRequest()); maintainer.maintain(); |