diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationDefinitionPBImpl.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationDefinitionPBImpl.java index 49aef11..450f400 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationDefinitionPBImpl.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/api/records/impl/pb/ReservationDefinitionPBImpl.java @@ -226,6 +226,11 @@ public String getRecurrenceExpression() { @Override public void setRecurrenceExpression(String recurrenceExpression) { + maybeInitBuilder(); + if (recurrenceExpression == null) { + builder.clearRecurrenceExpression(); + return; + } builder.setRecurrenceExpression(recurrenceExpression); } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java index e6a0cae..77231ee 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java @@ -2018,9 +2018,10 @@ private ReservationSubmissionRequest createReservationSubmissionRequest( list.add(rr); } ReservationRequests reqs = ReservationRequests.newInstance(list, resInt); - ReservationDefinition rDef = - ReservationDefinition.newInstance(resInfo.getArrival(), - resInfo.getDeadline(), reqs, resInfo.getReservationName()); + ReservationDefinition rDef = ReservationDefinition + .newInstance(resInfo.getArrival(), resInfo.getDeadline(), reqs, + resInfo.getReservationName(), resInfo.getRecurrenceExpression(), + Priority.newInstance(resInfo.getPriority())); ReservationId reservationId = ReservationId.parseReservationId(resContext.getReservationId()); @@ -2119,9 +2120,10 @@ private ReservationUpdateRequest createReservationUpdateRequest( list.add(rr); } ReservationRequests reqs = ReservationRequests.newInstance(list, resInt); - ReservationDefinition rDef = - ReservationDefinition.newInstance(resInfo.getArrival(), - resInfo.getDeadline(), reqs, resInfo.getReservationName()); + ReservationDefinition rDef = ReservationDefinition + .newInstance(resInfo.getArrival(), resInfo.getDeadline(), reqs, + resInfo.getReservationName(), resInfo.getRecurrenceExpression(), + Priority.newInstance(resInfo.getPriority())); ReservationUpdateRequest request = ReservationUpdateRequest.newInstance( rDef, ReservationId.parseReservationId(resContext.getReservationId())); diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ReservationDefinitionInfo.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ReservationDefinitionInfo.java index 42a07af..91d5e60 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ReservationDefinitionInfo.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/ReservationDefinitionInfo.java @@ -47,6 +47,9 @@ @XmlElement(name = "priority") private int priority; + @XmlElement(name = "recurrence-expression") + private String recurrenceExpression; + public ReservationDefinitionInfo() { } @@ -57,6 +60,7 @@ public ReservationDefinitionInfo(ReservationDefinition definition) { reservationName = definition.getReservationName(); reservationRequests = new ReservationRequestsInfo(definition .getReservationRequests()); + recurrenceExpression = definition.getRecurrenceExpression(); } public long getArrival() { @@ -100,4 +104,12 @@ public void setPriority(int priority) { this.priority = priority; } + public String getRecurrenceExpression() { + return recurrenceExpression; + } + + public void setRecurrenceExpression(String recurrenceExpression) { + this.recurrenceExpression = recurrenceExpression; + } + } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesReservation.java hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesReservation.java index 657bec4..5f76b25 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesReservation.java +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesReservation.java @@ -94,6 +94,7 @@ private static final int MINIMUM_RESOURCE_DURATION = 1000000; private static final Clock clock = new UTCClock(); + private static final String MAXIMUM_PERIOD = "86400000"; private static final String TEST_DIR = new File(System.getProperty( "test.build.data", "/tmp")).getAbsolutePath(); private static final String FS_ALLOC_FILE = new File(TEST_DIR, @@ -945,6 +946,39 @@ public void testDeleteReservation() throws JSONException, Exception { rm.stop(); } + @Test + public void testRecurrenceExpressionInDefinition() throws Exception { + rm.start(); + setupCluster(100); + + ReservationId id1 = getReservationIdTestHelper(1); + + reservationSubmissionTestHelper("reservation/submit", + MediaType.APPLICATION_JSON, clock.getTime(), "res_1", id1, + MAXIMUM_PERIOD); + + WebResource resource = constructWebResource(LIST_RESERVATION_PATH) + .queryParam("reservation-id", id1.toString()) + .queryParam("queue", DEFAULT_QUEUE); + + JSONObject json = testListReservationHelper(resource); + + if (!this.isAuthenticationEnabled() && json == null) { + return; + } + + JSONObject reservations = json.getJSONObject("reservations"); + + String recurrenceExpression = reservations + .getJSONObject("reservation-definition") + .getString("recurrence-expression"); + + assertEquals(recurrenceExpression, MAXIMUM_PERIOD); + + rm.stop(); + } + + /** * This method is used when a ReservationId is required. Attempt to use REST * API. If authentication is not enabled, ensure that the response status is @@ -994,11 +1028,18 @@ private ClientResponse reservationSubmissionTestHelper(String path, private ClientResponse reservationSubmissionTestHelper(String path, String media, Long arrival, String reservationName, ReservationId reservationId) throws Exception { + return reservationSubmissionTestHelper(path, media, arrival, + reservationName, reservationId, "0"); + } + + private ClientResponse reservationSubmissionTestHelper(String path, + String media, Long arrival, String reservationName, + ReservationId reservationId, String recurrenceExp) throws Exception { String reservationJson = loadJsonFile("submit-reservation.json"); String reservationJsonRequest = String.format(reservationJson, reservationId.toString(), arrival, arrival + MINIMUM_RESOURCE_DURATION, - reservationName); + reservationName, recurrenceExp); return submitAndVerifyReservation(path, media, reservationJsonRequest); } diff --git hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/resources/submit-reservation.json hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/resources/submit-reservation.json index 580c599..60db177 100644 --- hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/resources/submit-reservation.json +++ hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/resources/submit-reservation.json @@ -5,6 +5,7 @@ "arrival" : %s, "deadline" : %s, "reservation-name" : "%s", + "recurrence-expression" : "%s", "reservation-requests" : { "reservation-request-interpreter" : 0, "reservation-request" : [