/*
* The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
* (the "License"). You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/
package alluxio.yarn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.doReturn;
import alluxio.Configuration;
import alluxio.ConfigurationTestUtils;
import alluxio.Constants;
import alluxio.PropertyKey;
import alluxio.exception.ExceptionMessage;
import org.apache.hadoop.yarn.api.protocolrecords.GetNewApplicationResponse;
import org.apache.hadoop.yarn.api.records.Resource;
import org.apache.hadoop.yarn.client.api.YarnClient;
import org.apache.hadoop.yarn.client.api.YarnClientApplication;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
/**
* Unit tests for {@link Client}.
* TODO(xuan gong): ALLUXIO-1503: add more unit test for alluxio.yarn.Client
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({YarnClient.class})
public final class ClientTest {
private YarnClient mYarnClient;
@Rule
public ExpectedException mThrown = ExpectedException.none();
@Before
public void before() {
// Mock Yarn client
PowerMockito.mockStatic(YarnClient.class);
mYarnClient = (YarnClient) Mockito.mock(YarnClient.class);
Mockito.when(YarnClient.createYarnClient()).thenReturn(mYarnClient);
}
@After
public void after() {
ConfigurationTestUtils.resetConfiguration();
}
@Test
public void notEnoughMemoryForApplicationMaster() throws Exception {
int appMasterMem = 1024;
Resource resource = Resource.newInstance(appMasterMem / 2, 4);
generateMaxAllocation(resource);
mThrown.expect(RuntimeException.class);
mThrown.expectMessage(ExceptionMessage.YARN_NOT_ENOUGH_RESOURCES.getMessage(
"ApplicationMaster", "memory", appMasterMem, resource.getMemory()));
String[] args = new String[] {
"-resource_path", "test",
"-am_memory", Integer.toString(appMasterMem),
"-am_vcores", "2"
};
Client client = new Client(args);
client.run();
}
@Test
public void notEnoughVCoreForApplicationMaster() throws Exception {
int appMasterMem = 1024;
int appMasterCore = 2;
Resource resource = Resource.newInstance(appMasterMem, appMasterCore / 2);
generateMaxAllocation(resource);
mThrown.expect(RuntimeException.class);
mThrown.expectMessage(ExceptionMessage.YARN_NOT_ENOUGH_RESOURCES.getMessage(
"ApplicationMaster", "virtual cores", appMasterCore, resource.getVirtualCores()));
String[] args = new String[] {
"-resource_path", "test",
"-am_memory", Integer.toString(appMasterMem),
"-am_vcores", Integer.toString(appMasterCore)
};
Client client = new Client(args);
client.run();
}
@Test
public void notEnoughMemoryForAlluxioMaster() throws Exception {
Configuration.set(PropertyKey.INTEGRATION_MASTER_RESOURCE_MEM, "2048.00MB");
Configuration.set(PropertyKey.INTEGRATION_MASTER_RESOURCE_CPU, "4");
int masterMemInMB = (int) (Configuration.getBytes(
PropertyKey.INTEGRATION_MASTER_RESOURCE_MEM) / Constants.MB);
Resource resource = Resource.newInstance(masterMemInMB / 2, 4);
generateMaxAllocation(resource);
mThrown.expect(RuntimeException.class);
mThrown.expectMessage(ExceptionMessage.YARN_NOT_ENOUGH_RESOURCES.getMessage(
"Alluxio Master", "memory", masterMemInMB, resource.getMemory()));
Client client = new Client();
client.run();
}
@Test
public void notEnoughVCoreForAlluxioMaster() throws Exception {
Configuration.set(PropertyKey.INTEGRATION_MASTER_RESOURCE_MEM, "2048.00MB");
Configuration.set(PropertyKey.INTEGRATION_MASTER_RESOURCE_CPU, "4");
int masterMemInMB = (int) (Configuration.getBytes(
PropertyKey.INTEGRATION_MASTER_RESOURCE_MEM) / Constants.MB);
int masterVCores = Configuration.getInt(PropertyKey.INTEGRATION_MASTER_RESOURCE_CPU);
Resource resource = Resource.newInstance(masterMemInMB, 3);
generateMaxAllocation(resource);
mThrown.expect(RuntimeException.class);
mThrown.expectMessage(ExceptionMessage.YARN_NOT_ENOUGH_RESOURCES.getMessage(
"Alluxio Master", "virtual cores", masterVCores, resource.getVirtualCores()));
Client client = new Client();
client.run();
}
@Test
public void notEnoughMemoryForAlluxioWorker() throws Exception {
Configuration.set(PropertyKey.INTEGRATION_WORKER_RESOURCE_MEM, "2048.00MB");
Configuration.set(PropertyKey.WORKER_MEMORY_SIZE, "4096.00MB");
Configuration.set(PropertyKey.INTEGRATION_WORKER_RESOURCE_CPU, "8");
int workerMemInMB = (int) (Configuration.getBytes(
PropertyKey.INTEGRATION_WORKER_RESOURCE_MEM) / Constants.MB);
int ramdiskMemInMB = (int) (Configuration.getBytes(
PropertyKey.WORKER_MEMORY_SIZE) / Constants.MB);
Resource resource = Resource.newInstance((workerMemInMB + ramdiskMemInMB) / 2, 4);
generateMaxAllocation(resource);
mThrown.expect(RuntimeException.class);
mThrown.expectMessage(ExceptionMessage.YARN_NOT_ENOUGH_RESOURCES.getMessage(
"Alluxio Worker", "memory", (workerMemInMB + ramdiskMemInMB), resource.getMemory()));
Client client = new Client();
client.run();
}
@Test
public void notEnoughVCoreForAlluxioWorker() throws Exception {
Configuration.set(PropertyKey.INTEGRATION_WORKER_RESOURCE_MEM, "2048.00MB");
Configuration.set(PropertyKey.WORKER_MEMORY_SIZE, "4096.00MB");
Configuration.set(PropertyKey.INTEGRATION_WORKER_RESOURCE_CPU, "8");
int workerMemInMB = (int) (Configuration.getBytes(
PropertyKey.INTEGRATION_WORKER_RESOURCE_MEM) / Constants.MB);
int ramdiskMemInMB = (int) (Configuration.getBytes(
PropertyKey.WORKER_MEMORY_SIZE) / Constants.MB);
int workerVCore = Configuration.getInt(PropertyKey.INTEGRATION_WORKER_RESOURCE_CPU);
Resource resource = Resource.newInstance((workerMemInMB + ramdiskMemInMB), 4);
generateMaxAllocation(resource);
mThrown.expect(RuntimeException.class);
mThrown.expectMessage(ExceptionMessage.YARN_NOT_ENOUGH_RESOURCES.getMessage(
"Alluxio Worker", "virtual cores", workerVCore, resource.getVirtualCores()));
Client client = new Client();
client.run();
}
private void generateMaxAllocation(Resource resource) throws Exception {
YarnClientApplication mockYarnClientApplication = mock(YarnClientApplication.class);
doReturn(mockYarnClientApplication).when(mYarnClient).createApplication();
GetNewApplicationResponse mockNewApplicationResponse = mock(GetNewApplicationResponse.class);
doReturn(mockNewApplicationResponse).when(mockYarnClientApplication)
.getNewApplicationResponse();
doReturn(resource).when(mockNewApplicationResponse).getMaximumResourceCapability();
}
}