blob: 5a4212d9a098a7e388663cec4757421eaf2b8304 [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.monitor.capacity.mockframework;
import org.apache.hadoop.yarn.api.records.NodeId;
import org.apache.hadoop.yarn.api.records.Resource;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CSQueue;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.LeafQueue;
import org.apache.hadoop.yarn.server.resourcemanager.scheduler.common.fica.FiCaSchedulerNode;
import org.apache.hadoop.yarn.util.resource.Resources;
import java.util.Map;
class MockContainers {
private MockApplication mockApp;
private Map<String, CSQueue> nameToCSQueues;
private Map<NodeId, FiCaSchedulerNode> nodeIdToSchedulerNodes;
MockContainers(MockApplication mockApp,
Map<String, CSQueue> nameToCSQueues,
Map<NodeId, FiCaSchedulerNode> nodeIdToSchedulerNodes) {
this.mockApp = mockApp;
this.nameToCSQueues = nameToCSQueues;
this.nodeIdToSchedulerNodes = nodeIdToSchedulerNodes;
init();
}
private void init() {
String containersConfig = mockApp.containersConfig;
int start = containersConfig.indexOf("=") + 1;
int end = -1;
int containerId = 1;
while (start < containersConfig.length()) {
while (start < containersConfig.length()
&& containersConfig.charAt(start) != '(') {
start++;
}
if (start >= containersConfig.length()) {
throw new IllegalArgumentException(
"Error in containers specification, line=" + containersConfig);
}
end = start + 1;
while (end < containersConfig.length()
&& containersConfig.charAt(end) != ')') {
end++;
}
if (end >= containersConfig.length()) {
throw new IllegalArgumentException(
"Error in containers specification, line=" + containersConfig);
}
// now we found start/end, get container values
String[] values = containersConfig.substring(start + 1, end).split(",");
if (values.length < 6 || values.length > 8) {
throw new IllegalArgumentException("Format to define container is:"
+ "(priority,resource,host,label expression,repeat,reserved, pending)");
}
ContainerSpecification.Builder builder = ContainerSpecification.Builder.create()
.withPriority(values[0])
.withResource(values[1])
.withHostname(values[2])
.withLabel(values[3])
.withRepeat(values[4])
.withReserved(values[5]);
if (values.length >= 7) {
builder.withPendingResource(values[6]);
}
if (values.length == 8) {
builder.withUsername(values[7]);
}
ContainerSpecification containerSpec = builder.build();
Resource usedResources = Resource.newInstance(0, 0);
for (int i = 0; i < containerSpec.repeat; i++) {
Resources.addTo(usedResources, containerSpec.resource);
MockContainer mockContainer = new MockContainer(containerSpec, containerId, mockApp);
FiCaSchedulerNode schedulerNode =
nodeIdToSchedulerNodes.get(containerSpec.nodeId);
LeafQueue queue = (LeafQueue) nameToCSQueues.get(mockApp.queueName);
mockApp.addMockContainer(mockContainer, schedulerNode, queue);
containerId++;
}
mockApp.addAggregatedContainerData(containerSpec, usedResources);
start = end + 1;
}
}
}