summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorOla Aunrønning <olaa@verizonmedia.com>2021-07-19 14:48:24 +0200
committerOla Aunrønning <olaa@verizonmedia.com>2021-07-19 14:48:24 +0200
commitac85f64c439b6de14fc6f4d93723369ebfe1164e (patch)
treeeab6604234b758bff79cd17f9a5a5791be13f65b /controller-server
parentb8a1426317d81829ddb0e97f3b829fc9668a3404 (diff)
Automatically approve CMR if no hosts in prod impacted
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeRequestMaintainer.java10
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ChangeRequestMaintainerTest.java29
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)