diff options
author | Ola Aunrønning <olaa@verizonmedia.com> | 2021-07-19 14:48:24 +0200 |
---|---|---|
committer | Ola Aunrønning <olaa@verizonmedia.com> | 2021-07-19 14:48:24 +0200 |
commit | ac85f64c439b6de14fc6f4d93723369ebfe1164e (patch) | |
tree | eab6604234b758bff79cd17f9a5a5791be13f65b /controller-server | |
parent | b8a1426317d81829ddb0e97f3b829fc9668a3404 (diff) |
Automatically approve CMR if no hosts in prod impacted
Diffstat (limited to 'controller-server')
2 files changed, 34 insertions, 5 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeRequestMaintainer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeRequestMaintainer.java index f491c87f2a0..59156b62b96 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeRequestMaintainer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeRequestMaintainer.java @@ -64,14 +64,15 @@ public class ChangeRequestMaintainer extends ControllerMaintainer { try (var lock = curator.lockChangeRequests()) { changeRequests.forEach(changeRequest -> { var optionalZone = inferZone(changeRequest, hostsByZone); - optionalZone.ifPresent(zone -> { + optionalZone.ifPresentOrElse(zone -> { var vcmr = existingChangeRequests .getOrDefault(changeRequest.getId(), new VespaChangeRequest(changeRequest, zone)) .withSource(changeRequest.getChangeRequestSource()) .withApproval(changeRequest.getApproval()); logger.fine(() -> "Storing " + vcmr); curator.writeChangeRequest(vcmr); - }); + }, + () -> approveChangeRequest(changeRequest)); }); } } @@ -121,4 +122,9 @@ public class ChangeRequestMaintainer extends ControllerMaintainer { .plus(Duration.ofDays(7)) .isBefore(ZonedDateTime.now()); } + + private void approveChangeRequest(ChangeRequest changeRequest) { + if (changeRequest.getApproval() == ChangeRequest.Approval.REQUESTED) + changeRequestClient.approveChangeRequest(changeRequest); + } } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeRequestMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeRequestMaintainerTest.java index 15a2cf3063d..fc3ea981a81 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeRequestMaintainerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeRequestMaintainerTest.java @@ -39,6 +39,7 @@ public class ChangeRequestMaintainerTest { assertEquals(Status.CANCELED, persistedChangeRequest.getChangeRequestSource().getStatus()); assertEquals(ChangeRequest.Approval.APPROVED, persistedChangeRequest.getApproval()); assertEquals(time, persistedChangeRequest.getChangeRequestSource().getPlannedStartTime()); + assertEquals(0, changeRequestClient.getApprovedChangeRequests().size()); } @Test @@ -58,17 +59,39 @@ public class ChangeRequestMaintainerTest { assertEquals(newChangeRequest, persistedChangeRequests.get(0)); } - private ChangeRequest newChangeRequest(String id, ChangeRequest.Approval approval) { - return newChangeRequest(id, approval, ZonedDateTime.now(), Status.CLOSED); + @Test + public void approves_change_request_if_non_prod() { + var time = ZonedDateTime.now(); + var prodChangeRequest = newChangeRequest("id1", ChangeRequest.Approval.REQUESTED, time, Status.WAITING_FOR_APPROVAL); + var nonProdApprovalRequested = newChangeRequest("id2", "unknown-node", ChangeRequest.Approval.REQUESTED, time, Status.WAITING_FOR_APPROVAL); + var nonProdApproved = newChangeRequest("id3", "unknown-node", ChangeRequest.Approval.APPROVED, time, Status.WAITING_FOR_APPROVAL); + + changeRequestClient.setUpcomingChangeRequests(List.of( + prodChangeRequest, + nonProdApprovalRequested, + nonProdApproved + )); + changeRequestMaintainer.maintain(); + + var persistedChangeRequests = tester.curator().readChangeRequests(); + assertEquals(1, persistedChangeRequests.size()); + assertEquals(prodChangeRequest.getId(), persistedChangeRequests.get(0).getId()); + + assertEquals(1, changeRequestClient.getApprovedChangeRequests().size()); + assertEquals(nonProdApprovalRequested.getId(), changeRequestClient.getApprovedChangeRequests().get(0).getId()); } private ChangeRequest newChangeRequest(String id, ChangeRequest.Approval approval, ZonedDateTime time, Status status) { + return newChangeRequest(id, "node-1-tenant-host-prod.us-east-3", approval, time, status); + } + + private ChangeRequest newChangeRequest(String id, String hostname, ChangeRequest.Approval approval, ZonedDateTime time, Status status) { return new ChangeRequest.Builder() .id(id) .approval(approval) .impact(ChangeRequest.Impact.VERY_HIGH) .impactedSwitches(List.of()) - .impactedHosts(List.of("node-1-tenant-host-prod.us-east-3")) + .impactedHosts(List.of(hostname)) .changeRequestSource(new ChangeRequestSource.Builder() .plannedStartTime(time) .plannedEndTime(time) |