com.vmware.photon.controller.deployer.helpers.xenon.MockHelper.java Source code

Java tutorial

Introduction

Here is the source code for com.vmware.photon.controller.deployer.helpers.xenon.MockHelper.java

Source

/*
 * Copyright 2015 VMware, Inc. All Rights Reserved.
 *
 * Licensed 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 com.vmware.photon.controller.deployer.helpers.xenon;

import com.vmware.photon.controller.agent.gen.AgentControl;
import com.vmware.photon.controller.agent.gen.AgentStatusCode;
import com.vmware.photon.controller.agent.gen.AgentStatusResponse;
import com.vmware.photon.controller.agent.gen.ProvisionResponse;
import com.vmware.photon.controller.agent.gen.ProvisionResultCode;
import com.vmware.photon.controller.agent.gen.UpgradeResultCode;
import com.vmware.photon.controller.api.client.ApiClient;
import com.vmware.photon.controller.api.client.resource.FlavorApi;
import com.vmware.photon.controller.api.client.resource.ImagesApi;
import com.vmware.photon.controller.api.client.resource.ProjectApi;
import com.vmware.photon.controller.api.client.resource.TasksApi;
import com.vmware.photon.controller.api.client.resource.TenantsApi;
import com.vmware.photon.controller.api.client.resource.VmApi;
import com.vmware.photon.controller.api.model.FlavorCreateSpec;
import com.vmware.photon.controller.api.model.Image;
import com.vmware.photon.controller.api.model.ImageState;
import com.vmware.photon.controller.api.model.ProjectCreateSpec;
import com.vmware.photon.controller.api.model.ResourceTicketCreateSpec;
import com.vmware.photon.controller.api.model.Task;
import com.vmware.photon.controller.api.model.VmCreateSpec;
import com.vmware.photon.controller.api.model.VmMetadata;
import com.vmware.photon.controller.cloudstore.xenon.entity.DatastoreServiceFactory;
import com.vmware.photon.controller.cloudstore.xenon.entity.ResourceTicketService;
import com.vmware.photon.controller.cloudstore.xenon.entity.TenantService;
import com.vmware.photon.controller.common.auth.AuthClientHandler;
import com.vmware.photon.controller.common.auth.AuthException;
import com.vmware.photon.controller.common.clients.AgentControlClient;
import com.vmware.photon.controller.common.clients.AgentControlClientFactory;
import com.vmware.photon.controller.common.clients.HostClient;
import com.vmware.photon.controller.common.clients.HostClientFactory;
import com.vmware.photon.controller.common.thrift.StaticServerSet;
import com.vmware.photon.controller.common.xenon.BasicServiceHost;
import com.vmware.photon.controller.common.xenon.MultiHostEnvironment;
import com.vmware.photon.controller.common.xenon.ServiceUtils;
import com.vmware.photon.controller.deployer.configuration.ServiceConfigurator;
import com.vmware.photon.controller.deployer.configuration.ServiceConfiguratorFactory;
import com.vmware.photon.controller.deployer.deployengine.ApiClientFactory;
import com.vmware.photon.controller.deployer.deployengine.AuthHelper;
import com.vmware.photon.controller.deployer.deployengine.AuthHelperFactory;
import com.vmware.photon.controller.deployer.deployengine.DockerProvisioner;
import com.vmware.photon.controller.deployer.deployengine.DockerProvisionerFactory;
import com.vmware.photon.controller.deployer.deployengine.HttpFileServiceClient;
import com.vmware.photon.controller.deployer.deployengine.HttpFileServiceClientFactory;
import com.vmware.photon.controller.deployer.healthcheck.HealthCheckHelper;
import com.vmware.photon.controller.deployer.healthcheck.HealthCheckHelperFactory;
import com.vmware.photon.controller.deployer.healthcheck.HealthChecker;
import com.vmware.photon.controller.deployer.helpers.TestHelper;
import com.vmware.photon.controller.deployer.xenon.ContainersConfig;
import com.vmware.photon.controller.deployer.xenon.DeployerContext;
import com.vmware.photon.controller.deployer.xenon.mock.AgentControlClientMock;
import com.vmware.photon.controller.deployer.xenon.mock.HostClientMock;
import com.vmware.photon.controller.host.gen.GetConfigResponse;
import com.vmware.photon.controller.host.gen.GetConfigResultCode;
import com.vmware.photon.controller.host.gen.Host;
import com.vmware.photon.controller.host.gen.HostConfig;
import com.vmware.photon.controller.host.gen.SetHostModeResultCode;
import com.vmware.photon.controller.nsxclient.models.FabricNode;
import com.vmware.photon.controller.nsxclient.models.FabricNodeState;
import com.vmware.photon.controller.nsxclient.models.TransportNode;
import com.vmware.photon.controller.nsxclient.models.TransportNodeState;
import com.vmware.photon.controller.nsxclient.models.TransportZone;
import com.vmware.photon.controller.resource.gen.Datastore;
import com.vmware.photon.controller.resource.gen.Network;
import com.vmware.xenon.common.Service;

import com.github.dockerjava.api.DockerException;
import com.google.common.util.concurrent.FutureCallback;
import org.apache.http.entity.mime.content.FileBody;
import org.apache.thrift.async.AsyncMethodCallback;
import org.mockito.ArgumentMatcher;
import org.mockito.Matchers;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.powermock.api.mockito.PowerMockito;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyBoolean;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Matchers.anyLong;
import static org.mockito.Matchers.anyMap;
import static org.mockito.Matchers.anyString;
import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.doNothing;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.doThrow;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Callable;
import java.util.stream.Collectors;

/**
 * This class provides utility functions for Mocks.
 */
public class MockHelper {

    public static void mockHostClient(AgentControlClientFactory agentControlClientFactory,
            HostClientFactory hostClientFactory, boolean isSuccess) throws Throwable {

        AgentControlClient agentControlClient;
        HostClient hostClient;
        if (isSuccess) {
            HostConfig hostConfig = new HostConfig();
            hostConfig.setCpu_count(2);
            hostConfig.setMemory_mb(4096);
            hostConfig.setEsx_version("ESX Version");

            agentControlClient = new AgentControlClientMock.Builder().provisionResultCode(ProvisionResultCode.OK)
                    .agentStatusCode(AgentStatusCode.OK).upgradeResultCode(UpgradeResultCode.OK).build();

            hostClient = new HostClientMock.Builder().getConfigResultCode(GetConfigResultCode.OK)
                    .setHostModeResultCode(SetHostModeResultCode.OK).hostConfig(hostConfig).build();
        } else {
            agentControlClient = new AgentControlClientMock.Builder()
                    .provisionResultCode(ProvisionResultCode.SYSTEM_ERROR)
                    .provisionFailure(new Exception("ProvisionHost throws exception"))
                    .upgradeResultCode(UpgradeResultCode.SYSTEM_ERROR)
                    .upgradeFailure(new Exception("UpgradeHost throws exception"))
                    .agentStatusCode(AgentStatusCode.UPGRADING)
                    .getAgentStatusFailure(new Exception("GetAgentStatus throws Exception")).build();

            hostClient = new HostClientMock.Builder().getConfigResultCode(GetConfigResultCode.SYSTEM_ERROR)
                    .getConfigFailure(new Exception("GetHost throws exception"))
                    .setHostModeResultCode(SetHostModeResultCode.SYSTEM_ERROR)
                    .setHostModeFailure(new Exception("SetHostMode throws exception")).build();
        }

        doReturn(agentControlClient).when(agentControlClientFactory).create();
        doReturn(hostClient).when(hostClientFactory).create();
    }

    public static void mockHttpFileServiceClient(HttpFileServiceClientFactory httpFileServiceClientFactory,
            boolean isSuccess) throws Throwable {
        HttpFileServiceClient httpFileServiceClient = mock(HttpFileServiceClient.class);
        if (isSuccess) {
            when(httpFileServiceClient.uploadFile(anyString(), anyString(), anyBoolean())).thenReturn(() -> 201);
            when(httpFileServiceClient.uploadFileToDatastore(anyString(), anyString(), anyString()))
                    .thenReturn(() -> 201);
            when(httpFileServiceClient.deleteFileFromDatastore(anyString(), anyString())).thenReturn(() -> 204);
            when(httpFileServiceClient.getDirectoryListingOfDatastores()).thenReturn(() -> 200);
        } else {
            when(httpFileServiceClient.uploadFile(anyString(), anyString(), anyBoolean()))
                    .thenThrow(new RuntimeException(new IOException("Copy failed")));
            when(httpFileServiceClient.uploadFileToDatastore(anyString(), anyString(), anyString()))
                    .thenThrow(new RuntimeException(new IOException("Copy failed")));
            when(httpFileServiceClient.deleteFileFromDatastore(anyString(), anyString()))
                    .thenThrow(new RuntimeException("Delete failed"));
            when(httpFileServiceClient.getDirectoryListingOfDatastores())
                    .thenThrow(new RuntimeException("Login failed"));
        }

        doReturn(httpFileServiceClient).when(httpFileServiceClientFactory).create(anyString(), anyString(),
                anyString());
    }

    public static Callable<Integer> mockUploadFile(int returnCode) {
        return () -> returnCode;
    }

    public static void mockCreateContainer(DockerProvisionerFactory dockerProvisionerFactory, boolean isSuccess)
            throws Throwable {
        DockerProvisioner dockerProvisioner = mock(DockerProvisioner.class);
        when(dockerProvisionerFactory.create(anyString())).thenReturn(dockerProvisioner);
        if (isSuccess) {
            when(dockerProvisioner.launchContainer(anyString(), anyString(), anyInt(), anyLong(), anyMap(),
                    anyMap(), anyString(), anyBoolean(), anyMap(), anyBoolean(), anyBoolean(),
                    Matchers.<String>anyVararg())).thenReturn("id");
        } else {
            when(dockerProvisioner.launchContainer(anyString(), anyString(), anyInt(), anyLong(), anyMap(),
                    anyMap(), anyString(), anyBoolean(), anyMap(), anyBoolean(), anyBoolean(),
                    Matchers.<String>anyVararg()))
                            .thenThrow(new DockerException("Start container " + "failed", 500));
        }
    }

    public static void mockAuthHelper(AuthClientHandler.ImplicitClient implicitClient,
            AuthHelperFactory authHelperFactory, boolean isSuccess) throws Throwable {
        AuthHelper authHelper = mock(AuthHelper.class);
        doReturn(authHelper).when(authHelperFactory).create();

        if (isSuccess) {
            doReturn(implicitClient).when(authHelper).getResourceLoginUri(anyString(), anyString(), anyString(),
                    anyString(), anyInt(), anyString(), anyString());
        } else {
            doThrow(new AuthException("Failed to obtain the resource login url")).when(authHelper)
                    .getResourceLoginUri(anyString(), anyString(), anyString(), anyString(), anyInt(), anyString(),
                            anyString());
        }
    }

    public static void mockHealthChecker(HealthCheckHelperFactory healthCheckHelperFactory, final boolean isSuccess)
            throws Throwable {
        HealthChecker healthChecker = new HealthChecker() {
            @Override
            public boolean isReady() {
                return isSuccess;
            }
        };
        HealthCheckHelper healthCheckHelper = mock(HealthCheckHelper.class);
        PowerMockito.when(healthCheckHelper.getHealthChecker()).thenReturn(healthChecker);

        when(healthCheckHelperFactory.create(any(Service.class), any(ContainersConfig.ContainerType.class),
                anyString())).thenReturn(healthCheckHelper);
    }

    public static void mockCreateScriptFile(DeployerContext deployerContext, String scriptName, boolean isSuccess)
            throws Throwable {

        if (isSuccess) {
            TestHelper.createSuccessScriptFile(deployerContext, scriptName);
        } else {
            TestHelper.createFailScriptFile(deployerContext, scriptName);
        }
    }

    public static HostClient mockProvisionAgent(AgentControlClientFactory agentControlClientFactory,
            HostClientFactory hostClientFactory, boolean isSuccess) {
        AgentControlClient agentControlClient;
        HostClient hostClient;
        if (isSuccess) {
            agentControlClient = new AgentControlClientMock.Builder().provisionResultCode(ProvisionResultCode.OK)
                    .agentStatusCode(AgentStatusCode.OK).build();
            hostClient = new HostClientMock.Builder().getConfigResultCode(GetConfigResultCode.OK).build();
        } else {
            agentControlClient = new AgentControlClientMock.Builder()
                    .provisionResultCode(ProvisionResultCode.SYSTEM_ERROR)
                    .agentStatusCode(AgentStatusCode.UPGRADING).build();
            hostClient = new HostClientMock.Builder().getConfigResultCode(GetConfigResultCode.SYSTEM_ERROR).build();
        }
        doReturn(agentControlClient).when(agentControlClientFactory).create();
        doReturn(hostClient).when(hostClientFactory).create();
        return hostClient;
    }

    @SuppressWarnings("unchecked")
    public static Answer<AsyncMethodCallback<AgentControl.AsyncClient.provision_call>> mockProvisionAgent(
            ProvisionResultCode resultCode) {

        return (invocation) -> {
            AsyncMethodCallback<AgentControl.AsyncClient.provision_call> callback = ((AsyncMethodCallback<AgentControl.AsyncClient.provision_call>) invocation
                    .getArguments()[13]);
            AgentControl.AsyncClient.provision_call provisionCall = mock(
                    AgentControl.AsyncClient.provision_call.class);
            ProvisionResponse provisionResponse = new ProvisionResponse(resultCode);
            doReturn(provisionResponse).when(provisionCall).getResult();
            callback.onComplete(provisionCall);
            return null;
        };
    }

    @SuppressWarnings("unchecked")
    public static Answer<AsyncMethodCallback<AgentControl.AsyncClient.get_agent_status_call>> mockGetAgentStatus(
            AgentStatusCode agentStatusCode) {

        return (invocation) -> {
            AsyncMethodCallback<AgentControl.AsyncClient.get_agent_status_call> callback = ((AsyncMethodCallback<AgentControl.AsyncClient.get_agent_status_call>) invocation
                    .getArguments()[0]);
            AgentControl.AsyncClient.get_agent_status_call getAgentStatusCall = mock(
                    AgentControl.AsyncClient.get_agent_status_call.class);
            AgentStatusResponse agentStatusResponse = new AgentStatusResponse(agentStatusCode);
            doReturn(agentStatusResponse).when(getAgentStatusCall).getResult();
            callback.onComplete(getAgentStatusCall);
            return null;
        };
    }

    @SuppressWarnings("unchecked")
    public static Answer<FutureCallback<FabricNode>> mockRegisterFabricNode(String fabricNodeId) {
        return (invocation) -> {
            FutureCallback<FabricNode> callback = ((FutureCallback<FabricNode>) invocation.getArguments()[1]);
            FabricNode fabricNode = new FabricNode();
            fabricNode.setId(fabricNodeId);
            callback.onSuccess(fabricNode);
            return null;
        };
    }

    @SuppressWarnings("unchecked")
    public static Answer<FutureCallback<FabricNodeState>> mockGetFabricNodeState(
            com.vmware.photon.controller.nsxclient.datatypes.FabricNodeState state) {

        return (invocation) -> {
            FutureCallback<FabricNodeState> callback = ((FutureCallback<FabricNodeState>) invocation
                    .getArguments()[1]);
            FabricNodeState fabricNodeState = new FabricNodeState();
            fabricNodeState.setState(state);
            callback.onSuccess(fabricNodeState);
            return null;
        };
    }

    @SuppressWarnings("unchecked")
    public static Answer<FutureCallback<TransportZone>> mockGetTransportZone(String transportZoneId) {
        return (invocation) -> {
            TransportZone transportZone = new TransportZone();
            transportZone.setId(transportZoneId);

            FutureCallback<TransportZone> callback = (FutureCallback<TransportZone>) invocation.getArguments()[1];
            callback.onSuccess(transportZone);

            return null;
        };
    }

    @SuppressWarnings("unchecked")
    public static Answer<FutureCallback<TransportNode>> mockCreateTransportNode(String transportNodeId) {
        return (invocation) -> {
            FutureCallback<TransportNode> callback = ((FutureCallback<TransportNode>) invocation.getArguments()[1]);
            TransportNode transportNode = new TransportNode();
            transportNode.setId(transportNodeId);
            callback.onSuccess(transportNode);
            return null;
        };
    }

    @SuppressWarnings("unchecked")
    public static Answer<FutureCallback<TransportNodeState>> mockGetTransportNodeState(
            com.vmware.photon.controller.nsxclient.datatypes.TransportNodeState state) {

        return (invocation) -> {
            FutureCallback<TransportNodeState> callback = ((FutureCallback<TransportNodeState>) invocation
                    .getArguments()[1]);
            TransportNodeState transportNodeState = new TransportNodeState();
            transportNodeState.setState(state);
            callback.onSuccess(transportNodeState);
            return null;
        };
    }

    @SuppressWarnings("unchecked")
    public static Answer<AsyncMethodCallback<Host.AsyncClient.get_host_config_call>> mockGetHostConfig(
            List<String> datastoreList, List<String> networkList, String esxVersion) {

        return (invocation) -> {
            AsyncMethodCallback<Host.AsyncClient.get_host_config_call> callback = ((AsyncMethodCallback<Host.AsyncClient.get_host_config_call>) invocation
                    .getArguments()[0]);

            HostConfig hostConfig = new HostConfig();
            hostConfig.setDatastores(datastoreList.stream().map(Datastore::new).collect(Collectors.toList()));
            hostConfig.setNetworks(networkList.stream().map(Network::new).collect(Collectors.toList()));
            hostConfig.setEsx_version(esxVersion);

            GetConfigResponse getConfigResponse = new GetConfigResponse(GetConfigResultCode.OK);
            getConfigResponse.setHostConfig(hostConfig);
            Host.AsyncClient.get_host_config_call getHostConfigCall = mock(
                    Host.AsyncClient.get_host_config_call.class);
            doReturn(getConfigResponse).when(getHostConfigCall).getResult();
            callback.onComplete(getHostConfigCall);
            return null;
        };
    }

    @SuppressWarnings("unchecked")
    public static Answer<AsyncMethodCallback<Host.AsyncClient.get_host_config_call>> mockGetHostConfig(
            GetConfigResultCode resultCode) {

        return (invocation) -> {
            AsyncMethodCallback<Host.AsyncClient.get_host_config_call> callback = ((AsyncMethodCallback<Host.AsyncClient.get_host_config_call>) invocation
                    .getArguments()[0]);

            GetConfigResponse getConfigResponse = new GetConfigResponse(resultCode);
            Host.AsyncClient.get_host_config_call getHostConfigCall = mock(
                    Host.AsyncClient.get_host_config_call.class);
            doReturn(getConfigResponse).when(getHostConfigCall).getResult();
            callback.onComplete(getHostConfigCall);
            return null;
        };
    }

    public static StaticServerSet mockCloudStoreServerSet() throws Throwable {
        BasicServiceHost host = BasicServiceHost.create(null, DatastoreServiceFactory.SELF_LINK, 10, 10);

        host.startServiceSynchronously(new DatastoreServiceFactory(), null);

        StaticServerSet serverSet = new StaticServerSet(
                new InetSocketAddress(host.getPreferredAddress(), host.getPort()));
        return serverSet;
    }

    public static Answer<Task> mockCreateFlavorAsync(String taskId, String entityId, String state) {
        return mockCreateFlavorAsync(TestHelper.createTask(taskId, entityId, state));
    }

    public static Answer<Task> mockCreateFlavorAsync(Task returnValue) {
        return (invocation) -> {
            ((FutureCallback<Task>) invocation.getArguments()[1]).onSuccess(returnValue);
            return null;
        };
    }

    public static Answer<Task> mockCreateProjectAsync(String taskId, String entityId, String state) {
        return mockCreateProjectAsync(TestHelper.createTask(taskId, entityId, state));
    }

    public static Answer<Task> mockCreateProjectAsync(Task returnValue) {
        return (invocation) -> {
            ((FutureCallback<Task>) invocation.getArguments()[2]).onSuccess(returnValue);
            return null;
        };
    }

    public static Answer<Task> mockCreateResourceTicketAsync(String taskId, String entityId, String state) {
        return mockCreateResourceTicketAsync(TestHelper.createTask(taskId, entityId, state));
    }

    public static Answer<Task> mockCreateResourceTicketAsync(Task returnValue) {
        return (invocation) -> {
            ((FutureCallback<Task>) invocation.getArguments()[2]).onSuccess(returnValue);
            return null;
        };
    }

    public static Answer<Task> mockCreateTenantAsync(String taskId, String entityId, String state) {
        return mockCreateTenantAsync(TestHelper.createTask(taskId, entityId, state));
    }

    public static Answer<Task> mockCreateTenantAsync(Task returnValue) {
        return (invocation) -> {
            ((FutureCallback<Task>) invocation.getArguments()[1]).onSuccess(returnValue);
            return null;
        };
    }

    public static Answer<Task> mockCreateVmAsync(String taskId, String entityId, String state) {
        return mockCreateVmAsync(TestHelper.createTask(taskId, entityId, state));
    }

    @SuppressWarnings("unchecked")
    public static Answer<Task> mockCreateVmAsync(Task returnValue) {
        return (invocation) -> {
            ((FutureCallback<Task>) invocation.getArguments()[2]).onSuccess(returnValue);
            return null;
        };
    }

    public static Answer<Image> mockGetImageAsync(String imageId, String imageSeedingProgress) {
        return mockGetImageAsync(TestHelper.createImage(imageId, imageSeedingProgress));
    }

    public static Answer<Image> mockGetImageAsync(String imageId, ImageState imageState) {
        return mockGetImageAsync(TestHelper.createImage(imageId, imageState));
    }

    @SuppressWarnings("unchecked")
    public static Answer<Image> mockGetImageAsync(Image returnValue) {
        return (invocation) -> {
            ((FutureCallback<Image>) invocation.getArguments()[1]).onSuccess(returnValue);
            return null;
        };
    }

    public static Answer<Task> mockPerformStartOperationAsync(String taskId, String entityId, String state) {
        return mockPerformStartOperationAsync(TestHelper.createTask(taskId, entityId, state));
    }

    @SuppressWarnings("unchecked")
    public static Answer<Task> mockPerformStartOperationAsync(Task returnValue) {
        return (invocation) -> {
            ((FutureCallback<Task>) invocation.getArguments()[1]).onSuccess(returnValue);
            return null;
        };
    }

    public static Answer<Task> mockGetTaskAsync(String taskId, String entityId, String state) {
        return mockGetTaskAsync(TestHelper.createTask(taskId, entityId, state));
    }

    public static Answer<Task> mockGetTaskAsync(Task returnValue) {
        return (invocation) -> {
            ((FutureCallback<Task>) invocation.getArguments()[1]).onSuccess(returnValue);
            return null;
        };
    }

    public static Answer<Task> mockSetMetadataAsync(String taskId, String entityId, String state) {
        return mockSetMetadataAsync(TestHelper.createTask(taskId, entityId, state));
    }

    @SuppressWarnings("unchecked")
    public static Answer<Task> mockSetMetadataAsync(Task returnValue) {
        return (invocation) -> {
            ((FutureCallback<Task>) invocation.getArguments()[2]).onSuccess(returnValue);
            return null;
        };
    }

    public static void mockApiClient(ApiClientFactory apiClientFactory, MultiHostEnvironment<?> machine,
            boolean isSuccess) throws Throwable {
        ApiClient apiClient = mock(ApiClient.class);
        ProjectApi projectApi = mock(ProjectApi.class);
        TasksApi tasksApi = mock(TasksApi.class);
        VmApi vmApi = mock(VmApi.class);
        FlavorApi flavorApi = mock(FlavorApi.class);
        ImagesApi imagesApi = mock(ImagesApi.class);
        TenantsApi tenantsApi = mock(TenantsApi.class);

        final Task taskReturnedByCreateVm = TestHelper.createCompletedApifeTask("CREATE_VM");
        final Task taskReturnedBySetMetadata = TestHelper.createCompletedApifeTask("SET_METADATA");
        final Task taskReturnedByAttachIso = TestHelper.createCompletedApifeTask("ATTACH_ISO");
        final Task taskReturnedByCreateManagementVmFlavor = TestHelper
                .createCompletedApifeTask("CREATE_MANAGEMENT_VM_FLAVOR");
        Task.Entity taskEntity = new Task.Entity();
        taskEntity.setId("VM_FLAVOR_ID");
        taskReturnedByCreateManagementVmFlavor.setEntity(taskEntity);

        final Task taskReturnedByCreateManagementVmDiskFlavor = TestHelper
                .createCompletedApifeTask("CREATE_MANAGEMENT_VM_DISK_FLAVOR");
        Task.Entity diskTaskEntity = new Task.Entity();
        diskTaskEntity.setId("DISK_FLAVOR_ID");
        taskReturnedByCreateManagementVmDiskFlavor.setEntity(diskTaskEntity);

        final Task taskReturnedByCreateClusterMasterVmFlavor = TestHelper
                .createCompletedApifeTask("CREATE_CLUSTER_MASTER_VM_FLAVOR");
        Task.Entity clusterVmTaskEntity = new Task.Entity();
        clusterVmTaskEntity.setId("CLUSTER_VM_FLAVOR_ID");
        taskReturnedByCreateClusterMasterVmFlavor.setEntity(clusterVmTaskEntity);
        final Task taskReturnedByCreateClusterVmDiskFlavor = TestHelper
                .createCompletedApifeTask("CREATE_CLUSTER_VM_DISK_FLAVOR");

        Task.Entity taskEntityImage = new Task.Entity();
        taskEntityImage.setId("IMAGE_ID");
        Task taskReturnedByUploadManagementImage = new Task();
        taskReturnedByUploadManagementImage.setId("taskId");
        taskReturnedByUploadManagementImage.setState("COMPLETED");
        taskReturnedByUploadManagementImage.setEntity(taskEntityImage);

        Task.Entity clusterVmDiskTaskEntity = new Task.Entity();
        clusterVmDiskTaskEntity.setId("CLUSTER_DISK_FLAVOR_ID");
        taskReturnedByCreateClusterVmDiskFlavor.setEntity(clusterVmDiskTaskEntity);

        TenantService.State tenantState = TestHelper.createTenant(machine);
        String tenantId = ServiceUtils.getIDFromDocumentSelfLink(tenantState.documentSelfLink);
        ResourceTicketService.State resourceTicketState = TestHelper.createResourceTicket(tenantId, machine);
        final Task taskReturnedByCreateTenant = TestHelper.createCompletedApifeTask("CREATE_TENANT", tenantId);
        final Task taskReturnedByCreateResourceTicket = TestHelper.createCompletedApifeTask(
                "CREATE_RESOURCE_TICKET",
                ServiceUtils.getIDFromDocumentSelfLink(resourceTicketState.documentSelfLink));
        final Task taskReturnedByCreateProject = TestHelper.createCompletedApifeTask("CREATE_PROJECT",
                "PROJECT_ID");
        final Task taskReturnedByPerformVmOperation = TestHelper.createCompletedApifeTask("PERFORM_VM_OPERATION");
        final Image imageReturnedByGetImageAsync = TestHelper.createImage("IMAGE_ID", "100.0%");

        if (isSuccess) {
            // Create project
            doAnswer(new Answer() {
                @Override
                public Object answer(InvocationOnMock invocation) throws Throwable {
                    ((FutureCallback<Task>) invocation.getArguments()[2]).onSuccess(taskReturnedByCreateProject);
                    return null;
                }
            }).when(tenantsApi).createProjectAsync(any(String.class), any(ProjectCreateSpec.class),
                    any(FutureCallback.class));

            // Create resource ticket
            doAnswer(new Answer() {
                @Override
                public Object answer(InvocationOnMock invocation) throws Throwable {
                    ((FutureCallback<Task>) invocation.getArguments()[2])
                            .onSuccess(taskReturnedByCreateResourceTicket);
                    return null;
                }
            }).when(tenantsApi).createResourceTicketAsync(any(String.class), any(ResourceTicketCreateSpec.class),
                    any(FutureCallback.class));

            // Create tenant
            doAnswer(new Answer() {
                @Override
                public Object answer(InvocationOnMock invocation) throws Throwable {
                    ((FutureCallback<Task>) invocation.getArguments()[1]).onSuccess(taskReturnedByCreateTenant);
                    return null;
                }
            }).when(tenantsApi).createAsync(any(String.class), any(FutureCallback.class));

            // Create management VM flavor
            ArgumentMatcher<FlavorCreateSpec> managementVmFlavorSpecMatcher = new ArgumentMatcher<FlavorCreateSpec>() {
                @Override
                public boolean matches(Object o) {
                    FlavorCreateSpec spec = (FlavorCreateSpec) o;
                    return spec.getName().startsWith("mgmt-vm-ec-mgmt");
                }
            };

            doAnswer(new Answer() {
                @Override
                public Object answer(InvocationOnMock invocation) throws Throwable {
                    ((FutureCallback<Task>) invocation.getArguments()[1])
                            .onSuccess(taskReturnedByCreateManagementVmFlavor);
                    return null;
                }
            }).when(flavorApi).createAsync(argThat(managementVmFlavorSpecMatcher), any(FutureCallback.class));

            // Create cluster VM flavor
            ArgumentMatcher<FlavorCreateSpec> clusterMasterVmFlavorSpecMatcher = new ArgumentMatcher<FlavorCreateSpec>() {
                @Override
                public boolean matches(Object o) {
                    FlavorCreateSpec spec = (FlavorCreateSpec) o;
                    return spec.getName().startsWith("cluster-master-vm");
                }
            };

            doAnswer(new Answer() {
                @Override
                public Object answer(InvocationOnMock invocation) throws Throwable {
                    ((FutureCallback<Task>) invocation.getArguments()[1])
                            .onSuccess(taskReturnedByCreateClusterMasterVmFlavor);
                    return null;
                }
            }).when(flavorApi).createAsync(argThat(clusterMasterVmFlavorSpecMatcher), any(FutureCallback.class));

            ArgumentMatcher<FlavorCreateSpec> clusterOtherVmFlavorSpecMatcher = new ArgumentMatcher<FlavorCreateSpec>() {
                @Override
                public boolean matches(Object o) {
                    FlavorCreateSpec spec = (FlavorCreateSpec) o;
                    return spec.getName().startsWith("cluster-other-vm");
                }
            };

            doAnswer(new Answer() {
                @Override
                public Object answer(InvocationOnMock invocation) throws Throwable {
                    ((FutureCallback<Task>) invocation.getArguments()[1])
                            .onSuccess(taskReturnedByCreateClusterMasterVmFlavor);
                    return null;
                }
            }).when(flavorApi).createAsync(argThat(clusterOtherVmFlavorSpecMatcher), any(FutureCallback.class));

            // Create management VM disk flavor
            ArgumentMatcher<FlavorCreateSpec> managementVmDiskFlavorSpecMatcher = new ArgumentMatcher<FlavorCreateSpec>() {
                @Override
                public boolean matches(Object o) {
                    FlavorCreateSpec spec = (FlavorCreateSpec) o;
                    return spec.getName().startsWith("mgmt-vm-disk-ec-mgmt");
                }
            };

            doAnswer(new Answer() {
                @Override
                public Object answer(InvocationOnMock invocation) throws Throwable {
                    ((FutureCallback<Task>) invocation.getArguments()[1])
                            .onSuccess(taskReturnedByCreateManagementVmDiskFlavor);
                    return null;
                }
            }).when(flavorApi).createAsync(argThat(managementVmDiskFlavorSpecMatcher), any(FutureCallback.class));

            // Create cluster VM disk flavor
            ArgumentMatcher<FlavorCreateSpec> clusterVmDiskFlavorSpecMatcher = new ArgumentMatcher<FlavorCreateSpec>() {
                @Override
                public boolean matches(Object o) {
                    FlavorCreateSpec spec = (FlavorCreateSpec) o;
                    return spec.getName().startsWith("cluster-vm-disk");
                }
            };

            doAnswer(new Answer() {
                @Override
                public Object answer(InvocationOnMock invocation) throws Throwable {
                    ((FutureCallback<Task>) invocation.getArguments()[1])
                            .onSuccess(taskReturnedByCreateClusterVmDiskFlavor);
                    return null;
                }
            }).when(flavorApi).createAsync(argThat(clusterVmDiskFlavorSpecMatcher), any(FutureCallback.class));

            doAnswer(new Answer() {
                @Override
                public Object answer(InvocationOnMock invocation) throws Throwable {
                    ((FutureCallback<Task>) invocation.getArguments()[1])
                            .onSuccess(taskReturnedByPerformVmOperation);
                    return null;
                }
            }).when(vmApi).performStartOperationAsync(anyString(), any(FutureCallback.class));

            // Upload and attach ISO
            doReturn(taskReturnedByAttachIso).when(vmApi).uploadAndAttachIso(anyString(), anyString());

            // Upload image
            doReturn(taskReturnedByUploadManagementImage).when(imagesApi).uploadImage(any(FileBody.class),
                    anyString());
            doAnswer(new Answer() {
                @Override
                public Object answer(InvocationOnMock invocation) throws Throwable {
                    ((FutureCallback<Image>) invocation.getArguments()[1]).onSuccess(imageReturnedByGetImageAsync);
                    return null;
                }
            }).when(imagesApi).getImageAsync(anyString(), any(FutureCallback.class));

            // Create VM
            doAnswer(new Answer() {
                @Override
                public Object answer(InvocationOnMock invocation) throws Throwable {
                    ((FutureCallback<Task>) invocation.getArguments()[2]).onSuccess(taskReturnedByCreateVm);
                    return null;
                }
            }).when(projectApi).createVmAsync(any(String.class), any(VmCreateSpec.class),
                    any(FutureCallback.class));

            // Set metadata
            doAnswer(new Answer() {
                @Override
                public Object answer(InvocationOnMock invocation) throws Throwable {
                    ((FutureCallback<Task>) invocation.getArguments()[2]).onSuccess(taskReturnedBySetMetadata);
                    return null;
                }
            }).when(vmApi).setMetadataAsync(any(String.class), any(VmMetadata.class), any(FutureCallback.class));
        }

        doReturn(projectApi).when(apiClient).getProjectApi();
        doReturn(tasksApi).when(apiClient).getTasksApi();
        doReturn(vmApi).when(apiClient).getVmApi();
        doReturn(flavorApi).when(apiClient).getFlavorApi();
        doReturn(imagesApi).when(apiClient).getImagesApi();
        doReturn(tenantsApi).when(apiClient).getTenantsApi();
        doReturn(apiClient).when(apiClientFactory).create();
        doReturn(apiClient).when(apiClientFactory).create(any(String.class));
    }

    public static void mockServiceConfigurator(ServiceConfiguratorFactory serviceConfiguratorFactory,
            boolean isSuccess) throws Throwable {
        ServiceConfigurator serviceConfigurator = mock(ServiceConfigurator.class);
        doReturn(serviceConfigurator).when(serviceConfiguratorFactory).create();
        doNothing().when(serviceConfigurator).copyDirectory(any(String.class), any(String.class));
        if (isSuccess) {
            doNothing().when(serviceConfigurator).applyDynamicParameters(any(String.class),
                    any(ContainersConfig.ContainerType.class), any(Map.class));
        } else {
            doNothing().doThrow(new RuntimeException("Config not available")).when(serviceConfigurator)
                    .applyDynamicParameters(any(String.class), any(ContainersConfig.ContainerType.class),
                            any(Map.class));
        }
    }
}