diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/ApplicationsRequestBuilderCommons.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/ApplicationsRequestBuilderCommons.java new file mode 100644 index 00000000000..a4c22e807e2 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/ApplicationsRequestBuilderCommons.java @@ -0,0 +1,210 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.yarn.server.webapp; + +import com.google.common.collect.Sets; +import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationsRequest; + +import java.util.Set; + +public class ApplicationsRequestBuilderCommons { + public enum RequestedFieldSet { + BASIC, ALL; + } + + private RequestedFieldSet requestedFieldSet; + private Set users = Sets.newHashSetWithExpectedSize(1); + private Long limit; + + // set values suitable in case both of begin/end not specified + private long startedTimeBegin; + private long startedTimeEnd = Long.MAX_VALUE; + private long finishTimeBegin; + private long finishTimeEnd = Long.MAX_VALUE; + private Set appTypes = Sets.newHashSet(); + private Set appTags = Sets.newHashSet(); + private Set appStates = Sets.newHashSet(); + private boolean startedTimeSpecified; + private boolean finishedTimeSpecified; + private boolean appStatesSpecified; + private boolean appTypesSpecified; + + private ApplicationsRequestBuilderCommons( + RequestedFieldSet requestedFieldSet) { + this.requestedFieldSet = requestedFieldSet; + } + + public static ApplicationsRequestBuilderCommons create() { + return new ApplicationsRequestBuilderCommons(RequestedFieldSet.ALL); + } + + public static ApplicationsRequestBuilderCommons create( + RequestedFieldSet requestedFieldSet) { + return new ApplicationsRequestBuilderCommons(requestedFieldSet); + } + + /** + * StateQuery is deprecated + * @param stateQuery + * @return the builder object + */ + public ApplicationsRequestBuilderCommons withStateQuery(String stateQuery) { + if (stateQuery != null && !stateQuery.isEmpty()) { + appStates.add(stateQuery); + this.appStatesSpecified = true; + } + return this; + } + + public ApplicationsRequestBuilderCommons withStatesQuery( + Set statesQuery) { + if (statesQuery != null && !statesQuery.isEmpty()) { + this.appStates.addAll(statesQuery); + this.appStatesSpecified = true; + } + return this; + } + + public ApplicationsRequestBuilderCommons withUserQuery(String userQuery) { + if (userQuery != null && !userQuery.isEmpty()) { + users.add(userQuery); + } + return this; + } + + public ApplicationsRequestBuilderCommons withLimit(String limit) { + this.limit = ApplicationsRequestValueParser.parseLimit(limit); + return this; + } + + public ApplicationsRequestBuilderCommons withStartedTimeBegin( + String time) { + this.startedTimeBegin = + ApplicationsRequestValueParser.parseStartedTimeBegin(time); + this.startedTimeSpecified = true; + return this; + } + + public ApplicationsRequestBuilderCommons withStartedTimeEnd(String time) { + this.startedTimeEnd = + ApplicationsRequestValueParser.parseStartedTimeEnd(time); + this.startedTimeSpecified = true; + return this; + } + + public ApplicationsRequestBuilderCommons withFinishTimeBegin(String time) { + this.finishTimeBegin = + ApplicationsRequestValueParser.parseFinishTimeBegin(time); + this.finishedTimeSpecified = true; + return this; + } + + public ApplicationsRequestBuilderCommons withFinishTimeEnd(String time) { + this.finishTimeEnd = + ApplicationsRequestValueParser.parseFinishTimeEnd(time); + this.finishedTimeSpecified = true; + return this; + } + + public ApplicationsRequestBuilderCommons withApplicationTypes( + Set appTypes) { + this.appTypes = + ApplicationsRequestValueParser.parseApplicationTypes(appTypes); + this.appTypesSpecified = true; + return this; + } + + public ApplicationsRequestBuilderCommons withApplicationTags( + Set appTags) { + this.appTags = ApplicationsRequestValueParser.parseApplicationTags(appTags); + return this; + } + + public boolean isStartedTimeSpecified() { + return startedTimeSpecified; + } + + public boolean isFinishedTimeSpecified() { + return finishedTimeSpecified; + } + + public boolean isAppStatesSpecified() { + return appStatesSpecified; + } + + public boolean isAppTypesSpecified() { + return appTypesSpecified; + } + + public Set getAppTypes() { + return appTypes; + } + + public Set getAppStates() { + return appStates; + } + + public GetApplicationsRequest build() { + ApplicationsRequestValueParser.validate(startedTimeBegin, startedTimeEnd, + finishTimeBegin, finishTimeEnd); + + if (requestedFieldSet == RequestedFieldSet.BASIC) { + return createRequestWithBasicFields(); + } else if (requestedFieldSet == RequestedFieldSet.ALL) { + return createRequestWithAllFields(); + } else { + throw new IllegalStateException( + "Unknown member of RequestedFieldSet: " + requestedFieldSet); + } + } + + private GetApplicationsRequest createRequestWithBasicFields() { + GetApplicationsRequest request = GetApplicationsRequest.newInstance(); + addBasicFieldsToRequest(request); + return request; + } + + private GetApplicationsRequest createRequestWithAllFields() { + GetApplicationsRequest request = GetApplicationsRequest.newInstance(); + addBasicFieldsToRequest(request); + request.setFinishRange(finishTimeBegin, finishTimeEnd); + + Set states = ApplicationsRequestValueParser + .parseApplicationStates(this.appStates); + if (!states.isEmpty()) { + request.setApplicationStates(states); + } + if (!users.isEmpty()) { + request.setUsers(users); + } + + if (!appTypes.isEmpty()) { + request.setApplicationTypes(appTypes); + } + if (!appTags.isEmpty()) { + request.setApplicationTags(appTags); + } + return request; + } + + private void addBasicFieldsToRequest(GetApplicationsRequest request) { + if (limit != null) { + request.setLimit(limit); + } + request.setStartRange(startedTimeBegin, startedTimeEnd); + } +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/ApplicationsRequestValueParser.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/ApplicationsRequestValueParser.java new file mode 100644 index 00000000000..0b60e5e6b22 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/ApplicationsRequestValueParser.java @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.yarn.server.webapp; + +import org.apache.hadoop.yarn.webapp.BadRequestException; + +import java.util.HashSet; +import java.util.Set; + +import static org.apache.hadoop.yarn.server.webapp.WebServices.parseQueries; + +public class ApplicationsRequestValueParser { + + public static long parseLimit(String limit) { + if (limit != null && !limit.isEmpty()) { + return validateLimit(limit); + } + return Long.MAX_VALUE; + } + + private static long validateLimit(String limit) { + long limitNumber = parseLongValue(limit, "limit"); + if (limitNumber <= 0) { + throw new BadRequestException("limit value must be greater than 0"); + } + return limitNumber; + } + + public static long parseStartedTimeBegin(String time) { + if (time != null && !time.isEmpty()) { + return parseLongValue(time, "startedTimeBegin"); + } + return 0L; + } + + public static long parseStartedTimeEnd(String time) { + if (time != null && !time.isEmpty()) { + return parseLongValue(time, "startedTimeEnd"); + } + return Long.MAX_VALUE; + } + + public static long parseFinishTimeBegin(String time) { + if (time != null && !time.isEmpty()) { + return parseLongValue(time, "finishedTimeBegin"); + } + return 0L; + } + + public static long parseFinishTimeEnd(String time) { + if (time != null && !time.isEmpty()) { + return parseLongValue(time, "finishedTimeEnd"); + } + return Long.MAX_VALUE; + } + + public static Set parseApplicationTypes(Set types) { + if (types != null) { + return parseQueries(types, false); + } + return new HashSet<>(); + } + + public static Set parseApplicationTags(Set tags) { + if (tags != null) { + return parseQueries(tags, false); + } + return new HashSet<>(); + } + + public static Set parseApplicationStates(Set states) { + if (states != null) { + return parseQueries(states, true); + } + return new HashSet<>(); + } + + private static long parseLongValue(String strValue, String queryName) { + try { + return Long.parseLong(strValue); + } catch (NumberFormatException e) { + throw new BadRequestException(queryName + " value must be a number!"); + } + } + + public static void validate(long startedTimeBegin, long startedTimeEnd, + long finishTimeBegin, long finishTimeEnd) { + validateStartTime(startedTimeBegin, startedTimeEnd); + validateFinishTime(finishTimeBegin, finishTimeEnd); + } + + private static void validateStartTime(long timeBegin, long timeEnd) { + if (timeBegin < 0) { + throw new BadRequestException("startedTimeBegin must be greater than 0"); + } + if (timeEnd < 0) { + throw new BadRequestException("startedTimeEnd must be greater than 0"); + } + if (timeBegin > timeEnd) { + throw new BadRequestException( + "startedTimeEnd must be greater than startTimeBegin"); + } + } + + private static void validateFinishTime(long timeBegin, long timeEnd) { + if (timeBegin < 0) { + throw new BadRequestException("finishTimeBegin must be greater than 0"); + } + if (timeEnd < 0) { + throw new BadRequestException("finishTimeEnd must be greater than 0"); + } + if (timeBegin > timeEnd) { + throw new BadRequestException( + "finishTimeEnd must be greater than finishTimeBegin"); + } + } + +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/WebServices.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/WebServices.java index 5bb5448492a..0bce43ef131 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/WebServices.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/main/java/org/apache/hadoop/yarn/server/webapp/WebServices.java @@ -54,6 +54,8 @@ import org.apache.hadoop.yarn.exceptions.ApplicationNotFoundException; import org.apache.hadoop.yarn.exceptions.ContainerNotFoundException; import org.apache.hadoop.yarn.exceptions.YarnException; +import org.apache.hadoop.yarn.server.webapp.ApplicationsRequestBuilderCommons + .RequestedFieldSet; import org.apache.hadoop.yarn.server.webapp.dao.AppAttemptInfo; import org.apache.hadoop.yarn.server.webapp.dao.AppAttemptsInfo; import org.apache.hadoop.yarn.server.webapp.dao.AppInfo; @@ -74,84 +76,26 @@ public WebServices(ApplicationBaseProtocol appBaseProt) { public AppsInfo getApps(HttpServletRequest req, HttpServletResponse res, String stateQuery, Set statesQuery, String finalStatusQuery, - String userQuery, String queueQuery, String count, String startedBegin, + String userQuery, String queueQuery, String limit, String startedBegin, String startedEnd, String finishBegin, String finishEnd, Set applicationTypes) { UserGroupInformation callerUGI = getUser(req); - boolean checkEnd = false; - boolean checkAppTypes = false; - boolean checkAppStates = false; - long countNum = Long.MAX_VALUE; - - // set values suitable in case both of begin/end not specified - long sBegin = 0; - long sEnd = Long.MAX_VALUE; - long fBegin = 0; - long fEnd = Long.MAX_VALUE; - - if (count != null && !count.isEmpty()) { - countNum = Long.parseLong(count); - if (countNum <= 0) { - throw new BadRequestException("limit value must be greater then 0"); - } - } - - if (startedBegin != null && !startedBegin.isEmpty()) { - sBegin = Long.parseLong(startedBegin); - if (sBegin < 0) { - throw new BadRequestException("startedTimeBegin must be greater than 0"); - } - } - if (startedEnd != null && !startedEnd.isEmpty()) { - sEnd = Long.parseLong(startedEnd); - if (sEnd < 0) { - throw new BadRequestException("startedTimeEnd must be greater than 0"); - } - } - if (sBegin > sEnd) { - throw new BadRequestException( - "startedTimeEnd must be greater than startTimeBegin"); - } - - if (finishBegin != null && !finishBegin.isEmpty()) { - checkEnd = true; - fBegin = Long.parseLong(finishBegin); - if (fBegin < 0) { - throw new BadRequestException("finishTimeBegin must be greater than 0"); - } - } - if (finishEnd != null && !finishEnd.isEmpty()) { - checkEnd = true; - fEnd = Long.parseLong(finishEnd); - if (fEnd < 0) { - throw new BadRequestException("finishTimeEnd must be greater than 0"); - } - } - if (fBegin > fEnd) { - throw new BadRequestException( - "finishTimeEnd must be greater than finishTimeBegin"); - } - - Set appTypes = parseQueries(applicationTypes, false); - if (!appTypes.isEmpty()) { - checkAppTypes = true; - } - - // stateQuery is deprecated. - if (stateQuery != null && !stateQuery.isEmpty()) { - statesQuery.add(stateQuery); - } - Set appStates = parseQueries(statesQuery, true); - if (!appStates.isEmpty()) { - checkAppStates = true; - } AppsInfo allApps = new AppsInfo(); Collection appReports = null; - final GetApplicationsRequest request = - GetApplicationsRequest.newInstance(); - request.setLimit(countNum); - request.setStartRange(Range.between(sBegin, sEnd)); + + ApplicationsRequestBuilderCommons requestBuilder = + ApplicationsRequestBuilderCommons.create(RequestedFieldSet.BASIC); + GetApplicationsRequest request = + requestBuilder + .withLimit(limit) + .withStartedTimeBegin(startedBegin) + .withStartedTimeEnd(startedEnd) + .withStateQuery(stateQuery) + .withStatesQuery(statesQuery) + .withApplicationTypes(applicationTypes) + .build(); + try { if (callerUGI == null) { // TODO: the request should take the params like what RMWebServices does @@ -174,8 +118,8 @@ public AppsInfo getApps(HttpServletRequest req, HttpServletResponse res, } for (ApplicationReport appReport : appReports) { - if (checkAppStates && - !appStates.contains(StringUtils.toLowerCase( + if (requestBuilder.isAppStatesSpecified() && + !requestBuilder.getAppStates().contains(StringUtils.toLowerCase( appReport.getYarnApplicationState().toString()))) { continue; } @@ -197,14 +141,16 @@ public AppsInfo getApps(HttpServletRequest req, HttpServletResponse res, continue; } } - if (checkAppTypes && - !appTypes.contains( + if (requestBuilder.isAppTypesSpecified() && + !requestBuilder.getAppTypes().contains( StringUtils.toLowerCase(appReport.getApplicationType().trim()))) { continue; } - if (checkEnd - && (appReport.getFinishTime() < fBegin || appReport.getFinishTime() > fEnd)) { + Range finishRange = request.getFinishRange(); + if (requestBuilder.isFinishedTimeSpecified() + && (appReport.getFinishTime() < finishRange.getMinimum() + || appReport.getFinishTime() > finishRange.getMaximum())) { continue; } AppInfo app = new AppInfo(appReport); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/server/webapp/TestApplicationsRequestBuilderCommons.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/server/webapp/TestApplicationsRequestBuilderCommons.java new file mode 100644 index 00000000000..aaec8d24f58 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-common/src/test/java/org/apache/hadoop/yarn/server/webapp/TestApplicationsRequestBuilderCommons.java @@ -0,0 +1,655 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * http://www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.yarn.server.webapp; + +import com.google.common.collect.Sets; +import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationsRequest; +import org.apache.hadoop.yarn.api.records.YarnApplicationState; +import org.apache.hadoop.yarn.server.webapp.ApplicationsRequestBuilderCommons + .RequestedFieldSet; +import org.apache.hadoop.yarn.webapp.BadRequestException; +import org.junit.Test; +import java.util.Set; + +import static org.apache.hadoop.yarn.server.webapp.WebServices.parseQueries; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class TestApplicationsRequestBuilderCommons { + + private GetApplicationsRequest getDefaultRequest() { + GetApplicationsRequest req = GetApplicationsRequest.newInstance(); + req.setStartRange(0, Long.MAX_VALUE); + req.setFinishRange(0, Long.MAX_VALUE); + return req; + } + + @Test + public void testDefaultRequest() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create().build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithNullStateQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withStateQuery(null) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithEmptyStateQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withStateQuery("") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test(expected = BadRequestException.class) + public void testRequestWithInvalidStateQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withStateQuery("invalidState") + .build(); + } + + @Test + public void testRequestWithValidStateQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withStateQuery(YarnApplicationState.NEW_SAVING.toString()) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + Set appStates = + Sets.newHashSet(YarnApplicationState.NEW_SAVING.toString()); + Set appStatesLowerCase = parseQueries(appStates, true); + expectedRequest.setApplicationStates(appStatesLowerCase); + + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithEmptyStateQueries() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withStatesQuery(Sets.newHashSet()) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + + assertEquals(expectedRequest, request); + } + + @Test(expected = BadRequestException.class) + public void testRequestWithInvalidStateQueries() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withStatesQuery(Sets.newHashSet("a1", "a2", "")) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithNullStateQueries() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withStatesQuery(null) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithValidStateQueries() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withStatesQuery( + Sets.newHashSet(YarnApplicationState.NEW_SAVING.toString(), + YarnApplicationState.NEW.toString())) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + Set appStates = + Sets.newHashSet(YarnApplicationState.NEW_SAVING.toString(), + YarnApplicationState.NEW.toString()); + Set appStatesLowerCase = parseQueries(appStates, true); + expectedRequest.setApplicationStates(appStatesLowerCase); + + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithNullUserQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withUserQuery(null) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithEmptyUserQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withUserQuery("") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithUserQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withUserQuery("user1") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + expectedRequest.setUsers(Sets.newHashSet("user1")); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithNullLimitQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withLimit(null) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithEmptyLimitQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withLimit("") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test(expected = BadRequestException.class) + public void testRequestWithInvalidLimitQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withLimit("bla") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test(expected = BadRequestException.class) + public void testRequestWithInvalidNegativeLimitQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withLimit("-10") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithValidLimitQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withLimit("999") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + expectedRequest.setLimit(999L); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithNullStartedTimeBeginQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withStartedTimeBegin(null) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithEmptyStartedTimeBeginQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withStartedTimeBegin("") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test(expected = BadRequestException.class) + public void testRequestWithInvalidStartedTimeBeginQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withStartedTimeBegin("bla") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test(expected = BadRequestException.class) + public void testRequestWithInvalidNegativeStartedTimeBeginQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withStartedTimeBegin("-1") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithValidStartedTimeBeginQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withStartedTimeBegin("999") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + expectedRequest.setStartRange(999L, Long.MAX_VALUE); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithNullStartedTimeEndQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withStartedTimeEnd(null) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithEmptywithStartedTimeEndQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withStartedTimeEnd("") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test(expected = BadRequestException.class) + public void testRequestWithInvalidStartedTimeEndQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withStartedTimeEnd("bla") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test(expected = BadRequestException.class) + public void testRequestWithInvalidNegativeStartedTimeEndQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withStartedTimeEnd("-1") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithValidStartedTimeEndQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withStartedTimeEnd("999") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + expectedRequest.setStartRange(0L, 999L); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithNullFinishedTimeBeginQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withFinishTimeBegin(null) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithEmptyFinishedTimeBeginQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withFinishTimeBegin("") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test(expected = BadRequestException.class) + public void testRequestWithInvalidFinishedTimeBeginQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withFinishTimeBegin("bla") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test(expected = BadRequestException.class) + public void testRequestWithInvalidNegativeFinishedTimeBeginQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withFinishTimeBegin("-1") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithValidFinishedTimeBeginQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withFinishTimeBegin("999") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + expectedRequest.setFinishRange(999L, Long.MAX_VALUE); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithNullFinishedTimeEndQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withFinishTimeEnd(null) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithEmptyFinishTimeEndQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withFinishTimeEnd("") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test(expected = BadRequestException.class) + public void testRequestWithInvalidFinishTimeEndQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withFinishTimeEnd("bla") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test(expected = BadRequestException.class) + public void testRequestWithInvalidNegativeFinishedTimeEndQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withFinishTimeEnd("-1") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithValidFinishTimeEndQuery() { + GetApplicationsRequest request = + ApplicationsRequestBuilderCommons.create() + .withFinishTimeEnd("999") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + expectedRequest.setFinishRange(0L, 999L); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithValidStartTimeRangeQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withStartedTimeBegin("1000") + .withStartedTimeEnd("2000") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + expectedRequest.setStartRange(1000L, 2000L); + assertEquals(expectedRequest, request); + } + + @Test(expected = BadRequestException.class) + public void testRequestWithInvalidStartTimeRangeQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withStartedTimeBegin("2000") + .withStartedTimeEnd("1000") + .build(); + } + + @Test + public void testRequestWithValidFinishTimeRangeQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withFinishTimeBegin("1000") + .withFinishTimeEnd("2000") + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + expectedRequest.setFinishRange(1000L, 2000L); + assertEquals(expectedRequest, request); + } + + @Test(expected = BadRequestException.class) + public void testRequestWithInvalidFinishTimeRangeQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withFinishTimeBegin("2000") + .withFinishTimeEnd("1000") + .build(); + } + + @Test + public void testRequestWithNullApplicationTypesQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withApplicationTypes(null) + .build(); + } + + @Test + public void testRequestWithEmptyApplicationTypesQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withApplicationTypes(Sets.newHashSet()) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + expectedRequest.setApplicationTypes(Sets.newHashSet()); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithValidApplicationTypesQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withApplicationTypes(Sets.newHashSet("type1")) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + expectedRequest.setApplicationTypes(Sets.newHashSet("type1")); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithNullApplicationTagsQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withApplicationTags(null) + .build(); + } + + @Test + public void testRequestWithEmptyApplicationTagsQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withApplicationTags(Sets.newHashSet()) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + expectedRequest.setApplicationTags(Sets.newHashSet()); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithValidApplicationTagsQuery() { + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withApplicationTags(Sets.newHashSet("tag1")) + .build(); + + GetApplicationsRequest expectedRequest = getDefaultRequest(); + expectedRequest.setApplicationTags(Sets.newHashSet("tag1")); + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithBasicFields() { + long now = System.currentTimeMillis(); + long startedTimeBegin = 10; + long startedTimeEnd = now - 1000; + long finishedTimeBegin = System.currentTimeMillis() - 90000; + long finishedTimeEnd = System.currentTimeMillis() - 100; + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create( + RequestedFieldSet.BASIC) + .withApplicationTypes(Sets.newHashSet("appType1", "appType2")) + .withApplicationTags(Sets.newHashSet("tag1", "tag2")) + .withStatesQuery(Sets.newHashSet("new", "new_saving")) + .withLimit("100") + .withUserQuery("user1") + .withStateQuery("submitted") + .withStartedTimeBegin(String.valueOf(startedTimeBegin)) + .withStartedTimeEnd(String.valueOf(startedTimeEnd)) + .withFinishTimeBegin(String.valueOf(finishedTimeBegin)) + .withFinishTimeEnd(String.valueOf(finishedTimeEnd)) + .build(); + + GetApplicationsRequest expectedRequest = + GetApplicationsRequest.newInstance(); + expectedRequest.setStartRange(startedTimeBegin, startedTimeEnd); + expectedRequest.setLimit(100); + + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestWithAllFields() { + long now = System.currentTimeMillis(); + long startedTimeBegin = 10; + long startedTimeEnd = now - 1000; + long finishedTimeBegin = System.currentTimeMillis() - 90000; + long finishedTimeEnd = System.currentTimeMillis() - 100; + Set appTypes = Sets.newHashSet("apptype1", "apptype2"); + Set appTags = Sets.newHashSet("tag1", "tag2"); + Set appStates = Sets.newHashSet("new", "new_saving"); + String user = "user1"; + + GetApplicationsRequest request = ApplicationsRequestBuilderCommons.create() + .withApplicationTypes(appTypes) + .withApplicationTags(appTags) + .withStateQuery("submitted") + .withStatesQuery(appStates) + .withLimit("100") + .withUserQuery(user) + .withStartedTimeBegin(String.valueOf(startedTimeBegin)) + .withStartedTimeEnd(String.valueOf(startedTimeEnd)) + .withFinishTimeBegin(String.valueOf(finishedTimeBegin)) + .withFinishTimeEnd(String.valueOf(finishedTimeEnd)) + .build(); + + GetApplicationsRequest expectedRequest = + GetApplicationsRequest.newInstance(); + expectedRequest.setApplicationTypes(appTypes); + expectedRequest.setApplicationTags(appTags); + expectedRequest.setApplicationStates( + Sets.newHashSet("new", "new_saving", "submitted")); + expectedRequest.setLimit(100); + expectedRequest.setUsers(Sets.newHashSet(user)); + expectedRequest.setStartRange(startedTimeBegin, startedTimeEnd); + expectedRequest.setFinishRange(finishedTimeBegin, finishedTimeEnd); + + assertEquals(expectedRequest, request); + } + + @Test + public void testRequestStartedTimeSpecified() { + ApplicationsRequestBuilderCommons builder = + ApplicationsRequestBuilderCommons.create() + .withStartedTimeBegin("12345"); + assertTrue(builder.isStartedTimeSpecified()); + + builder = + ApplicationsRequestBuilderCommons.create().withStartedTimeEnd("12"); + assertTrue(builder.isStartedTimeSpecified()); + } + + @Test + public void testRequestFinishedTimeSpecified() { + ApplicationsRequestBuilderCommons builder = + ApplicationsRequestBuilderCommons.create() + .withFinishTimeBegin("12345"); + assertTrue(builder.isFinishedTimeSpecified()); + + builder = + ApplicationsRequestBuilderCommons.create().withFinishTimeEnd("12"); + assertTrue(builder.isFinishedTimeSpecified()); + } + + @Test + public void testRequestAppStatesSpecified() { + ApplicationsRequestBuilderCommons builder = + ApplicationsRequestBuilderCommons.create() + .withStateQuery("new"); + assertTrue(builder.isAppStatesSpecified()); + } + + @Test + public void testRequestAppTypesSpecified() { + ApplicationsRequestBuilderCommons builder = + ApplicationsRequestBuilderCommons.create() + .withApplicationTypes(Sets.newHashSet("apptype1")); + assertTrue(builder.isAppTypesSpecified()); + } +} \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/ApplicationsRequestBuilder.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/ApplicationsRequestBuilder.java index 876d04479c0..6634260f37b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/ApplicationsRequestBuilder.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/ApplicationsRequestBuilder.java @@ -20,33 +20,21 @@ import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationsRequest; import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.ResourceScheduler; -import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity - .CapacityScheduler; +import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler; +import org.apache.hadoop.yarn.server.webapp.ApplicationsRequestBuilderCommons; import org.apache.hadoop.yarn.webapp.BadRequestException; import java.io.IOException; import java.util.Set; -import static org.apache.hadoop.yarn.server.webapp.WebServices.parseQueries; - public class ApplicationsRequestBuilder { - private Set statesQuery = Sets.newHashSet(); - private Set users = Sets.newHashSetWithExpectedSize(1); private Set queues = Sets.newHashSetWithExpectedSize(1); - private String limit = null; - private Long limitNumber; - - // set values suitable in case both of begin/end not specified - private long startedTimeBegin = 0; - private long startedTimeEnd = Long.MAX_VALUE; - private long finishTimeBegin = 0; - private long finishTimeEnd = Long.MAX_VALUE; - private Set appTypes = Sets.newHashSet(); - private Set appTags = Sets.newHashSet(); private ResourceManager rm; + private ApplicationsRequestBuilderCommons builderCommons; private ApplicationsRequestBuilder() { + builderCommons = ApplicationsRequestBuilderCommons.create(); } public static ApplicationsRequestBuilder create() { @@ -54,94 +42,80 @@ public static ApplicationsRequestBuilder create() { } public ApplicationsRequestBuilder withStateQuery(String stateQuery) { - // stateQuery is deprecated. - if (stateQuery != null && !stateQuery.isEmpty()) { - statesQuery.add(stateQuery); - } + builderCommons.withStateQuery(stateQuery); return this; } public ApplicationsRequestBuilder withStatesQuery( - Set statesQuery) { - if (statesQuery != null) { - this.statesQuery.addAll(statesQuery); - } + Set statesQuery) { + builderCommons.withStatesQuery(statesQuery); return this; } public ApplicationsRequestBuilder withUserQuery(String userQuery) { - if (userQuery != null && !userQuery.isEmpty()) { - users.add(userQuery); - } - return this; - } - - public ApplicationsRequestBuilder withQueueQuery(ResourceManager rm, - String queueQuery) { - this.rm = rm; - if (queueQuery != null && !queueQuery.isEmpty()) { - queues.add(queueQuery); - } + builderCommons.withUserQuery(userQuery); return this; } public ApplicationsRequestBuilder withLimit(String limit) { - if (limit != null && !limit.isEmpty()) { - this.limit = limit; - } + builderCommons.withLimit(limit); return this; } public ApplicationsRequestBuilder withStartedTimeBegin( - String startedBegin) { - if (startedBegin != null && !startedBegin.isEmpty()) { - startedTimeBegin = parseLongValue(startedBegin, "startedTimeBegin"); - } + String startedBegin) { + builderCommons.withStartedTimeBegin(startedBegin); return this; } public ApplicationsRequestBuilder withStartedTimeEnd(String startedEnd) { - if (startedEnd != null && !startedEnd.isEmpty()) { - startedTimeEnd = parseLongValue(startedEnd, "startedTimeEnd"); - } + builderCommons.withStartedTimeEnd(startedEnd); return this; } public ApplicationsRequestBuilder withFinishTimeBegin(String finishBegin) { - if (finishBegin != null && !finishBegin.isEmpty()) { - finishTimeBegin = parseLongValue(finishBegin, "finishedTimeBegin"); - } + builderCommons.withFinishTimeBegin(finishBegin); return this; } public ApplicationsRequestBuilder withFinishTimeEnd(String finishEnd) { - if (finishEnd != null && !finishEnd.isEmpty()) { - finishTimeEnd = parseLongValue(finishEnd, "finishedTimeEnd"); - } + builderCommons.withFinishTimeEnd(finishEnd); return this; } public ApplicationsRequestBuilder withApplicationTypes( - Set applicationTypes) { - if (applicationTypes != null) { - appTypes = parseQueries(applicationTypes, false); - } + Set applicationTypes) { + builderCommons.withApplicationTypes(applicationTypes); return this; } public ApplicationsRequestBuilder withApplicationTags( - Set applicationTags) { - if (applicationTags != null) { - appTags = parseQueries(applicationTags, false); + Set applicationTags) { + builderCommons.withApplicationTags(applicationTags); + return this; + } + + public ApplicationsRequestBuilder withQueueQuery(ResourceManager rm, + String queueQuery) { + this.rm = rm; + if (queueQuery != null && !queueQuery.isEmpty()) { + queues.add(queueQuery); } return this; } - private void validate() { + public GetApplicationsRequest build() { + GetApplicationsRequest request = builderCommons.build(); + validate(); + if (!queues.isEmpty()) { + request.setQueues(queues); + } + + return request; + } + + protected void validate() { queues.forEach(q -> validateQueueExists(rm, q)); - validateLimit(); - validateStartTime(); - validateFinishTime(); } private void validateQueueExists(ResourceManager rm, String queueQuery) { @@ -155,77 +129,4 @@ private void validateQueueExists(ResourceManager rm, String queueQuery) { } } } - - private void validateLimit() { - if (limit != null) { - limitNumber = parseLongValue(limit, "limit"); - if (limitNumber <= 0) { - throw new BadRequestException("limit value must be greater then 0"); - } - } - } - - private long parseLongValue(String strValue, String queryName) { - try { - return Long.parseLong(strValue); - } catch (NumberFormatException e) { - throw new BadRequestException(queryName + " value must be a number!"); - } - } - - private void validateStartTime() { - if (startedTimeBegin < 0) { - throw new BadRequestException("startedTimeBegin must be greater than 0"); - } - if (startedTimeEnd < 0) { - throw new BadRequestException("startedTimeEnd must be greater than 0"); - } - if (startedTimeBegin > startedTimeEnd) { - throw new BadRequestException( - "startedTimeEnd must be greater than startTimeBegin"); - } - } - - private void validateFinishTime() { - if (finishTimeBegin < 0) { - throw new BadRequestException("finishTimeBegin must be greater than 0"); - } - if (finishTimeEnd < 0) { - throw new BadRequestException("finishTimeEnd must be greater than 0"); - } - if (finishTimeBegin > finishTimeEnd) { - throw new BadRequestException( - "finishTimeEnd must be greater than finishTimeBegin"); - } - } - - public GetApplicationsRequest build() { - validate(); - GetApplicationsRequest request = GetApplicationsRequest.newInstance(); - - Set appStates = parseQueries(statesQuery, true); - if (!appStates.isEmpty()) { - request.setApplicationStates(appStates); - } - if (!users.isEmpty()) { - request.setUsers(users); - } - if (!queues.isEmpty()) { - request.setQueues(queues); - } - if (limitNumber != null) { - request.setLimit(limitNumber); - } - request.setStartRange(startedTimeBegin, startedTimeEnd); - request.setFinishRange(finishTimeBegin, finishTimeEnd); - - if (!appTypes.isEmpty()) { - request.setApplicationTypes(appTypes); - } - if (!appTags.isEmpty()) { - request.setApplicationTags(appTags); - } - - return request; - } } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestApplicationsRequestBuilder.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestApplicationsRequestBuilder.java index 7c9b7110d67..aace1d08a3e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestApplicationsRequestBuilder.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestApplicationsRequestBuilder.java @@ -18,16 +18,13 @@ import com.google.common.collect.Sets; import org.apache.hadoop.yarn.api.protocolrecords.GetApplicationsRequest; -import org.apache.hadoop.yarn.api.records.YarnApplicationState; import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler; import org.apache.hadoop.yarn.webapp.BadRequestException; import org.junit.Test; import java.io.IOException; -import java.util.Set; -import static org.apache.hadoop.yarn.server.webapp.WebServices.parseQueries; import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.anyBoolean; import static org.mockito.Matchers.eq; @@ -35,7 +32,6 @@ import static org.mockito.Mockito.when; public class TestApplicationsRequestBuilder { - private GetApplicationsRequest getDefaultRequest() { GetApplicationsRequest req = GetApplicationsRequest.newInstance(); req.setStartRange(0, Long.MAX_VALUE); @@ -43,134 +39,13 @@ private GetApplicationsRequest getDefaultRequest() { return req; } - @Test - public void testDefaultRequest() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithNullStateQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withStateQuery(null).build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithEmptyStateQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withStateQuery("").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test(expected = BadRequestException.class) - public void testRequestWithInvalidStateQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withStateQuery("invalidState").build(); - } - - @Test - public void testRequestWithValidStateQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withStateQuery(YarnApplicationState.NEW_SAVING.toString()).build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - Set appStates = - Sets.newHashSet(YarnApplicationState.NEW_SAVING.toString()); - Set appStatesLowerCase = parseQueries(appStates, true); - expectedRequest.setApplicationStates(appStatesLowerCase); - - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithEmptyStateQueries() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withStatesQuery(Sets.newHashSet()).build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - - assertEquals(expectedRequest, request); - } - - @Test(expected = BadRequestException.class) - public void testRequestWithInvalidStateQueries() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withStatesQuery(Sets.newHashSet("a1", "a2", "")).build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithNullStateQueries() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withStatesQuery(null).build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithValidStateQueries() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withStatesQuery( - Sets.newHashSet(YarnApplicationState.NEW_SAVING.toString(), - YarnApplicationState.NEW.toString())) - .build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - Set appStates = - Sets.newHashSet(YarnApplicationState.NEW_SAVING.toString(), - YarnApplicationState.NEW.toString()); - Set appStatesLowerCase = parseQueries(appStates, true); - expectedRequest.setApplicationStates(appStatesLowerCase); - - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithNullUserQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withUserQuery(null).build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithEmptyUserQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withUserQuery("").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithUserQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withUserQuery("user1").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - expectedRequest.setUsers(Sets.newHashSet("user1")); - assertEquals(expectedRequest, request); - } - @Test public void testRequestWithNullQueueQuery() { ResourceManager rm = mock(ResourceManager.class); GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withQueueQuery(rm, null).build(); + ApplicationsRequestBuilder.create() + .withQueueQuery(rm, null) + .build(); GetApplicationsRequest expectedRequest = getDefaultRequest(); assertEquals(expectedRequest, request); @@ -180,7 +55,9 @@ public void testRequestWithNullQueueQuery() { public void testRequestWithEmptyQueueQuery() { ResourceManager rm = mock(ResourceManager.class); GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withQueueQuery(rm, "").build(); + ApplicationsRequestBuilder.create() + .withQueueQuery(rm, "") + .build(); GetApplicationsRequest expectedRequest = getDefaultRequest(); assertEquals(expectedRequest, request); @@ -190,7 +67,8 @@ public void testRequestWithEmptyQueueQuery() { public void testRequestWithQueueQueryExistingQueue() { ResourceManager rm = mock(ResourceManager.class); GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withQueueQuery(rm, "queue1").build(); + .withQueueQuery(rm, "queue1") + .build(); GetApplicationsRequest expectedRequest = getDefaultRequest(); expectedRequest.setQueues(Sets.newHashSet("queue1")); @@ -201,329 +79,16 @@ public void testRequestWithQueueQueryExistingQueue() { public void testRequestWithQueueQueryNotExistingQueue() throws IOException { CapacityScheduler cs = mock(CapacityScheduler.class); when(cs.getQueueInfo(eq("queue1"), anyBoolean(), anyBoolean())) - .thenThrow(new IOException()); + .thenThrow(new IOException()); ResourceManager rm = mock(ResourceManager.class); when(rm.getResourceScheduler()).thenReturn(cs); GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withQueueQuery(rm, "queue1").build(); + .withQueueQuery(rm, "queue1") + .build(); GetApplicationsRequest expectedRequest = getDefaultRequest(); expectedRequest.setQueues(Sets.newHashSet("queue1")); assertEquals(expectedRequest, request); } - - @Test - public void testRequestWithNullLimitQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withLimit(null).build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithEmptyLimitQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withLimit("").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test(expected = BadRequestException.class) - public void testRequestWithInvalidLimitQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withLimit("bla").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test(expected = BadRequestException.class) - public void testRequestWithInvalidNegativeLimitQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withLimit("-10").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithValidLimitQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withLimit("999").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - expectedRequest.setLimit(999L); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithNullStartedTimeBeginQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withStartedTimeBegin(null).build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithEmptyStartedTimeBeginQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withStartedTimeBegin("").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test(expected = BadRequestException.class) - public void testRequestWithInvalidStartedTimeBeginQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withStartedTimeBegin("bla").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test(expected = BadRequestException.class) - public void testRequestWithInvalidNegativeStartedTimeBeginQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withStartedTimeBegin("-1").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithValidStartedTimeBeginQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withStartedTimeBegin("999").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - expectedRequest.setStartRange(999L, Long.MAX_VALUE); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithNullStartedTimeEndQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withStartedTimeEnd(null).build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithEmptywithStartedTimeEndQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withStartedTimeEnd("").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test(expected = BadRequestException.class) - public void testRequestWithInvalidStartedTimeEndQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withStartedTimeEnd("bla").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test(expected = BadRequestException.class) - public void testRequestWithInvalidNegativeStartedTimeEndQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withStartedTimeEnd("-1").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithValidStartedTimeEndQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withStartedTimeEnd("999").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - expectedRequest.setStartRange(0L, 999L); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithNullFinishedTimeBeginQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withFinishTimeBegin(null).build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithEmptyFinishedTimeBeginQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withFinishTimeBegin("").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test(expected = BadRequestException.class) - public void testRequestWithInvalidFinishedTimeBeginQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withFinishTimeBegin("bla").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test(expected = BadRequestException.class) - public void testRequestWithInvalidNegativeFinishedTimeBeginQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withFinishTimeBegin("-1").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithValidFinishedTimeBeginQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withFinishTimeBegin("999").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - expectedRequest.setFinishRange(999L, Long.MAX_VALUE); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithNullFinishedTimeEndQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withFinishTimeEnd(null).build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithEmptyFinishTimeEndQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withFinishTimeEnd("").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test(expected = BadRequestException.class) - public void testRequestWithInvalidFinishTimeEndQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withFinishTimeEnd("bla").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test(expected = BadRequestException.class) - public void testRequestWithInvalidNegativeFinishedTimeEndQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withFinishTimeEnd("-1").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithValidFinishTimeEndQuery() { - GetApplicationsRequest request = - ApplicationsRequestBuilder.create().withFinishTimeEnd("999").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - expectedRequest.setFinishRange(0L, 999L); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithValidStartTimeRangeQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withStartedTimeBegin("1000").withStartedTimeEnd("2000").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - expectedRequest.setStartRange(1000L, 2000L); - assertEquals(expectedRequest, request); - } - - @Test(expected = BadRequestException.class) - public void testRequestWithInvalidStartTimeRangeQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withStartedTimeBegin("2000").withStartedTimeEnd("1000").build(); - } - - @Test - public void testRequestWithValidFinishTimeRangeQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withFinishTimeBegin("1000").withFinishTimeEnd("2000").build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - expectedRequest.setFinishRange(1000L, 2000L); - assertEquals(expectedRequest, request); - } - - @Test(expected = BadRequestException.class) - public void testRequestWithInvalidFinishTimeRangeQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withFinishTimeBegin("2000").withFinishTimeEnd("1000").build(); - } - - @Test - public void testRequestWithNullApplicationTypesQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withApplicationTypes(null).build(); - } - - @Test - public void testRequestWithEmptyApplicationTypesQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withApplicationTypes(Sets.newHashSet()).build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - expectedRequest.setApplicationTypes(Sets.newHashSet()); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithValidApplicationTypesQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withApplicationTypes(Sets.newHashSet("type1")).build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - expectedRequest.setApplicationTypes(Sets.newHashSet("type1")); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithNullApplicationTagsQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withApplicationTags(null).build(); - } - - @Test - public void testRequestWithEmptyApplicationTagsQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withApplicationTags(Sets.newHashSet()).build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - expectedRequest.setApplicationTags(Sets.newHashSet()); - assertEquals(expectedRequest, request); - } - - @Test - public void testRequestWithValidApplicationTagsQuery() { - GetApplicationsRequest request = ApplicationsRequestBuilder.create() - .withApplicationTags(Sets.newHashSet("tag1")).build(); - - GetApplicationsRequest expectedRequest = getDefaultRequest(); - expectedRequest.setApplicationTags(Sets.newHashSet("tag1")); - assertEquals(expectedRequest, request); - } } \ No newline at end of file