alluxio.yarn.ClientTest.java Source code

Java tutorial

Introduction

Here is the source code for alluxio.yarn.ClientTest.java

Source

/*
 * 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();
    }
}