blob: a8404fbaee79c70bdd41f672e0aa6e9f7248dd3f [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.util.resource;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.yarn.api.records.Resource;
import org.apache.hadoop.yarn.api.records.ResourceInformation;
import org.apache.hadoop.yarn.conf.YarnConfiguration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import java.io.File;
import static org.apache.hadoop.yarn.util.resource.Resources.componentwiseMin;
import static org.apache.hadoop.yarn.util.resource.Resources.componentwiseMax;
import static org.apache.hadoop.yarn.util.resource.Resources.add;
import static org.apache.hadoop.yarn.util.resource.Resources.subtract;
import static org.apache.hadoop.yarn.util.resource.Resources.multiply;
import static org.apache.hadoop.yarn.util.resource.Resources.multiplyAndAddTo;
import static org.apache.hadoop.yarn.util.resource.Resources.multiplyAndRoundDown;
import static org.apache.hadoop.yarn.util.resource.Resources.fitsIn;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
public class TestResources {
static class ExtendedResources extends Resources {
public static Resource unbounded() {
return new FixedValueResource("UNBOUNDED", Long.MAX_VALUE);
}
public static Resource none() {
return new FixedValueResource("NONE", 0L);
}
}
private static final String EXTRA_RESOURCE_TYPE = "resource2";
private String resourceTypesFile;
private void setupExtraResourceType() throws Exception {
Configuration conf = new YarnConfiguration();
resourceTypesFile =
TestResourceUtils.setupResourceTypes(conf, "resource-types-3.xml");
}
private void unsetExtraResourceType() {
deleteResourceTypesFile();
ResourceUtils.resetResourceTypes();
}
private void deleteResourceTypesFile() {
if (resourceTypesFile != null && !resourceTypesFile.isEmpty()) {
File resourceFile = new File(resourceTypesFile);
resourceFile.delete();
}
}
@Before
public void setup() throws Exception {
setupExtraResourceType();
}
@After
public void teardown() {
deleteResourceTypesFile();
}
public Resource createResource(long memory, int vCores) {
return Resource.newInstance(memory, vCores);
}
public Resource createResource(long memory, int vCores, long resource2) {
Resource ret = Resource.newInstance(memory, vCores);
ret.setResourceInformation(EXTRA_RESOURCE_TYPE,
ResourceInformation.newInstance(EXTRA_RESOURCE_TYPE, resource2));
return ret;
}
@Test(timeout = 10000)
public void testCompareToWithUnboundedResource() {
unsetExtraResourceType();
Resource unboundedClone = Resources.clone(ExtendedResources.unbounded());
assertTrue(unboundedClone
.compareTo(createResource(Long.MAX_VALUE, Integer.MAX_VALUE)) == 0);
assertTrue(unboundedClone.compareTo(createResource(Long.MAX_VALUE, 0)) > 0);
assertTrue(
unboundedClone.compareTo(createResource(0, Integer.MAX_VALUE)) > 0);
}
@Test(timeout = 10000)
public void testCompareToWithNoneResource() {
assertTrue(Resources.none().compareTo(createResource(0, 0)) == 0);
assertTrue(Resources.none().compareTo(createResource(1, 0)) < 0);
assertTrue(Resources.none().compareTo(createResource(0, 1)) < 0);
assertTrue(Resources.none().compareTo(createResource(0, 0, 0)) == 0);
assertTrue(Resources.none().compareTo(createResource(1, 0, 0)) < 0);
assertTrue(Resources.none().compareTo(createResource(0, 1, 0)) < 0);
assertTrue(Resources.none().compareTo(createResource(0, 0, 1)) < 0);
}
@Test(timeout=10000)
public void testMultipleRoundUp() {
final double by = 0.5;
final String memoryErrorMsg = "Invalid memory size.";
final String vcoreErrorMsg = "Invalid virtual core number.";
Resource resource = Resources.createResource(1, 1);
Resource result = Resources.multiplyAndRoundUp(resource, by);
assertEquals(memoryErrorMsg, result.getMemorySize(), 1);
assertEquals(vcoreErrorMsg, result.getVirtualCores(), 1);
resource = Resources.createResource(2, 2);
result = Resources.multiplyAndRoundUp(resource, by);
assertEquals(memoryErrorMsg, result.getMemorySize(), 1);
assertEquals(vcoreErrorMsg, result.getVirtualCores(), 1);
resource = Resources.createResource(0, 0);
result = Resources.multiplyAndRoundUp(resource, by);
assertEquals(memoryErrorMsg, result.getMemorySize(), 0);
assertEquals(vcoreErrorMsg, result.getVirtualCores(), 0);
}
@Test(timeout = 1000)
public void testFitsIn() {
assertTrue(fitsIn(createResource(1, 1), createResource(2, 2)));
assertTrue(fitsIn(createResource(2, 2), createResource(2, 2)));
assertFalse(fitsIn(createResource(2, 2), createResource(1, 1)));
assertFalse(fitsIn(createResource(1, 2), createResource(2, 1)));
assertFalse(fitsIn(createResource(2, 1), createResource(1, 2)));
assertTrue(fitsIn(createResource(1, 1, 1), createResource(2, 2, 2)));
assertTrue(fitsIn(createResource(1, 1, 0), createResource(2, 2, 0)));
assertTrue(fitsIn(createResource(1, 1, 1), createResource(2, 2, 2)));
}
@Test(timeout = 1000)
public void testComponentwiseMin() {
assertEquals(createResource(1, 1),
componentwiseMin(createResource(1, 1), createResource(2, 2)));
assertEquals(createResource(1, 1),
componentwiseMin(createResource(2, 2), createResource(1, 1)));
assertEquals(createResource(1, 1),
componentwiseMin(createResource(1, 2), createResource(2, 1)));
assertEquals(createResource(1, 1, 1),
componentwiseMin(createResource(1, 1, 1), createResource(2, 2, 2)));
assertEquals(createResource(1, 1, 0),
componentwiseMin(createResource(2, 2, 2), createResource(1, 1)));
assertEquals(createResource(1, 1, 2),
componentwiseMin(createResource(1, 2, 2), createResource(2, 1, 3)));
}
@Test
public void testComponentwiseMax() {
assertEquals(createResource(2, 2),
componentwiseMax(createResource(1, 1), createResource(2, 2)));
assertEquals(createResource(2, 2),
componentwiseMax(createResource(2, 2), createResource(1, 1)));
assertEquals(createResource(2, 2),
componentwiseMax(createResource(1, 2), createResource(2, 1)));
assertEquals(createResource(2, 2, 2),
componentwiseMax(createResource(1, 1, 1), createResource(2, 2, 2)));
assertEquals(createResource(2, 2, 2),
componentwiseMax(createResource(2, 2, 2), createResource(1, 1)));
assertEquals(createResource(2, 2, 3),
componentwiseMax(createResource(1, 2, 2), createResource(2, 1, 3)));
assertEquals(createResource(2, 2, 1),
componentwiseMax(createResource(2, 2, 0), createResource(2, 1, 1)));
}
@Test
public void testAdd() {
assertEquals(createResource(2, 3),
add(createResource(1, 1), createResource(1, 2)));
assertEquals(createResource(3, 2),
add(createResource(1, 1), createResource(2, 1)));
assertEquals(createResource(2, 2, 0),
add(createResource(1, 1, 0), createResource(1, 1, 0)));
assertEquals(createResource(2, 2, 3),
add(createResource(1, 1, 1), createResource(1, 1, 2)));
}
@Test
public void testSubtract() {
assertEquals(createResource(1, 0),
subtract(createResource(2, 1), createResource(1, 1)));
assertEquals(createResource(0, 1),
subtract(createResource(1, 2), createResource(1, 1)));
assertEquals(createResource(2, 2, 0),
subtract(createResource(3, 3, 0), createResource(1, 1, 0)));
assertEquals(createResource(1, 1, 2),
subtract(createResource(2, 2, 3), createResource(1, 1, 1)));
}
@Test
public void testClone() {
assertEquals(createResource(1, 1), Resources.clone(createResource(1, 1)));
assertEquals(createResource(1, 1, 0),
Resources.clone(createResource(1, 1)));
assertEquals(createResource(1, 1),
Resources.clone(createResource(1, 1, 0)));
assertEquals(createResource(1, 1, 2),
Resources.clone(createResource(1, 1, 2)));
}
@Test
public void testMultiply() {
assertEquals(createResource(4, 2), multiply(createResource(2, 1), 2));
assertEquals(createResource(4, 2, 0), multiply(createResource(2, 1), 2));
assertEquals(createResource(2, 4), multiply(createResource(1, 2), 2));
assertEquals(createResource(2, 4, 0), multiply(createResource(1, 2), 2));
assertEquals(createResource(6, 6, 0), multiply(createResource(3, 3, 0), 2));
assertEquals(createResource(4, 4, 6), multiply(createResource(2, 2, 3), 2));
}
@Test
public void testMultiplyAndRoundDown() {
assertEquals(createResource(4, 1),
multiplyAndRoundDown(createResource(3, 1), 1.5));
assertEquals(createResource(4, 1, 0),
multiplyAndRoundDown(createResource(3, 1), 1.5));
assertEquals(createResource(1, 4),
multiplyAndRoundDown(createResource(1, 3), 1.5));
assertEquals(createResource(1, 4, 0),
multiplyAndRoundDown(createResource(1, 3), 1.5));
assertEquals(createResource(7, 7, 0),
multiplyAndRoundDown(createResource(3, 3, 0), 2.5));
assertEquals(createResource(2, 2, 7),
multiplyAndRoundDown(createResource(1, 1, 3), 2.5));
}
@Test
public void testMultiplyAndAddTo() throws Exception {
unsetExtraResourceType();
setupExtraResourceType();
assertEquals(createResource(6, 4),
multiplyAndAddTo(createResource(3, 1), createResource(2, 2), 1.5));
assertEquals(createResource(6, 4, 0),
multiplyAndAddTo(createResource(3, 1), createResource(2, 2), 1.5));
assertEquals(createResource(4, 7),
multiplyAndAddTo(createResource(1, 1), createResource(2, 4), 1.5));
assertEquals(createResource(4, 7, 0),
multiplyAndAddTo(createResource(1, 1), createResource(2, 4), 1.5));
assertEquals(createResource(6, 4, 0),
multiplyAndAddTo(createResource(3, 1, 0), createResource(2, 2, 0),
1.5));
assertEquals(createResource(6, 4, 6),
multiplyAndAddTo(createResource(3, 1, 2), createResource(2, 2, 3),
1.5));
}
}