blob: 4d071a68038f43e733ff7d22e8b1a315a8d54d0e [file] [log] [blame]
/*
* 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.resourcemanager.webapp;
import org.apache.hadoop.thirdparty.com.google.common.collect.Sets;
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.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<String> statesQuery = Sets.newHashSet();
private Set<String> users = Sets.newHashSetWithExpectedSize(1);
private Set<String> 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<String> appTypes = Sets.newHashSet();
private Set<String> appTags = Sets.newHashSet();
private String name = null;
private ResourceManager rm;
private ApplicationsRequestBuilder() {
}
public static ApplicationsRequestBuilder create() {
return new ApplicationsRequestBuilder();
}
public ApplicationsRequestBuilder withStateQuery(String stateQuery) {
// stateQuery is deprecated.
if (stateQuery != null && !stateQuery.isEmpty()) {
statesQuery.add(stateQuery);
}
return this;
}
public ApplicationsRequestBuilder withStatesQuery(
Set<String> statesQuery) {
if (statesQuery != null) {
this.statesQuery.addAll(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);
}
return this;
}
public ApplicationsRequestBuilder withLimit(String limit) {
if (limit != null && !limit.isEmpty()) {
this.limit = limit;
}
return this;
}
public ApplicationsRequestBuilder withStartedTimeBegin(
String startedBegin) {
if (startedBegin != null && !startedBegin.isEmpty()) {
startedTimeBegin = parseLongValue(startedBegin, "startedTimeBegin");
}
return this;
}
public ApplicationsRequestBuilder withStartedTimeEnd(String startedEnd) {
if (startedEnd != null && !startedEnd.isEmpty()) {
startedTimeEnd = parseLongValue(startedEnd, "startedTimeEnd");
}
return this;
}
public ApplicationsRequestBuilder withFinishTimeBegin(String finishBegin) {
if (finishBegin != null && !finishBegin.isEmpty()) {
finishTimeBegin = parseLongValue(finishBegin, "finishedTimeBegin");
}
return this;
}
public ApplicationsRequestBuilder withFinishTimeEnd(String finishEnd) {
if (finishEnd != null && !finishEnd.isEmpty()) {
finishTimeEnd = parseLongValue(finishEnd, "finishedTimeEnd");
}
return this;
}
public ApplicationsRequestBuilder withApplicationTypes(
Set<String> applicationTypes) {
if (applicationTypes != null) {
appTypes = parseQueries(applicationTypes, false);
}
return this;
}
public ApplicationsRequestBuilder withApplicationTags(
Set<String> applicationTags) {
if (applicationTags != null) {
appTags = parseQueries(applicationTags, false);
}
return this;
}
public ApplicationsRequestBuilder withName(String applicationName) {
name = applicationName;
return this;
}
private void validate() {
queues.forEach(q -> validateQueueExists(rm, q));
validateLimit();
validateStartTime();
validateFinishTime();
}
private void validateQueueExists(ResourceManager rm, String queueQuery) {
ResourceScheduler rs = rm.getResourceScheduler();
if (rs instanceof CapacityScheduler) {
CapacityScheduler cs = (CapacityScheduler) rs;
try {
cs.getQueueInfo(queueQuery, false, false);
} catch (IOException e) {
throw new BadRequestException(e.getMessage());
}
}
}
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<String> 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);
}
if (name != null) {
request.setName(name);
}
return request;
}
}