package org.ovirt.engine.core.bll;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.List;
import org.junit.Before;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import org.ovirt.engine.core.bll.context.CommandContext;
import org.ovirt.engine.core.bll.interfaces.BackendInternal;
import org.ovirt.engine.core.bll.utils.PermissionSubject;
import org.ovirt.engine.core.common.AuditLogType;
import org.ovirt.engine.core.common.VdcObjectType;
import org.ovirt.engine.core.common.action.CpuProfileParameters;
import org.ovirt.engine.core.common.action.ManagementNetworkOnClusterOperationParameters;
import org.ovirt.engine.core.common.action.VdcActionType;
import org.ovirt.engine.core.common.action.VdcReturnValueBase;
import org.ovirt.engine.core.common.businessentities.ArchitectureType;
import org.ovirt.engine.core.common.businessentities.Cluster;
import org.ovirt.engine.core.common.businessentities.MacPool;
import org.ovirt.engine.core.common.businessentities.MigrateOnErrorOptions;
import org.ovirt.engine.core.common.businessentities.network.Network;
import org.ovirt.engine.core.compat.Guid;
import org.ovirt.engine.core.compat.Version;
import org.ovirt.engine.core.dao.ClusterDao;
import org.ovirt.engine.core.dao.MacPoolDao;
import org.ovirt.engine.core.dao.network.NetworkClusterDao;
import org.ovirt.engine.core.utils.MockConfigRule;
@RunWith(MockitoJUnitRunner.class)
public class AddClusterCommandTest extends BaseCommandTest {
private static final String CLUSTER_NAME = "clusterName";
private static final String CLUSTER_DESCRIPTION = "cluster description";
private static final Guid DATA_CENTER_ID = Guid.newGuid();
private static final String CPU_NAME = "Cpu Name";
private static final int MAX_VDS_MEMORY_OVER_COMMIT = 10;
private static final boolean COUNT_THREADS_AS_CORES = true;
private static final boolean SET_TRANSPARENT_HUGE_PAGES = true;
private static final Version SET_COMPATIBILITY_VERSION = new Version("3.5");
private static final MigrateOnErrorOptions MIGRATE_ON_ERROR = MigrateOnErrorOptions.NO;
private static final String CORRELATION_ID = "C0RR3LAT10N1D";
private static final ArchitectureType ARCHITECTURE_TYPE = ArchitectureType.x86;
@ClassRule
public static MockConfigRule mcr = new MockConfigRule();
//Mocks
@Mock
private CpuFlagsManagerHandler cpuFlagsManagerHandler;
@Mock
private ClusterDao clusterDao;
@Mock
private MacPoolDao macPoolDao;
@Mock
private Network managementNetwork;
@Mock
private NetworkClusterDao networkClusterDao;
private Cluster cluster = createCluster();
private ManagementNetworkOnClusterOperationParameters parameters = createParameters(cluster);
private CommandContext commandContext = CommandContext.createContext(parameters.getSessionId());
@InjectMocks
private AddClusterCommand<ManagementNetworkOnClusterOperationParameters> addClusterCommand =
new AddClusterCommand<>(parameters, commandContext);
@Mock
private BackendInternal backend;
@Before
public void setUp() {
mockDao();
mockBackend();
}
private static Cluster createCluster() {
Cluster cluster = new Cluster();
cluster.setName(CLUSTER_NAME);
cluster.setDescription(CLUSTER_DESCRIPTION);
cluster.setStoragePoolId(DATA_CENTER_ID);
cluster.setCpuName(CPU_NAME);
cluster.setMaxVdsMemoryOverCommit(MAX_VDS_MEMORY_OVER_COMMIT);
cluster.setCountThreadsAsCores(COUNT_THREADS_AS_CORES);
cluster.setTransparentHugepages(SET_TRANSPARENT_HUGE_PAGES);
cluster.setCompatibilityVersion(SET_COMPATIBILITY_VERSION);
cluster.setMigrateOnError(MIGRATE_ON_ERROR);
cluster.setArchitecture(ARCHITECTURE_TYPE);
return cluster;
}
private static ManagementNetworkOnClusterOperationParameters createParameters(Cluster cluster) {
ManagementNetworkOnClusterOperationParameters parameters =
new ManagementNetworkOnClusterOperationParameters(cluster);
parameters.setCorrelationId(CORRELATION_ID);
return parameters;
}
private void mockDao() {
when(macPoolDao.getDefaultPool()).thenReturn(new MacPool());
}
private void mockBackend() {
VdcReturnValueBase addClusterReturnValue = mock(VdcReturnValueBase.class);
when(backend.runAction(any(VdcActionType.class), any(CpuProfileParameters.class))).thenReturn(addClusterReturnValue);
}
@Test
public void executeCommandTest() {
addClusterCommand.executeCommand();
verify(clusterDao).save(cluster);
verify(backend).runAction(eq(VdcActionType.AddCpuProfile), any(CpuProfileParameters.class));
assertTrue(addClusterCommand.getReturnValue().getSucceeded());
}
@Test
public void getAuditLogTest() {
addClusterCommand.setSucceeded(true);
assertEquals(AuditLogType.USER_ADD_CLUSTER, addClusterCommand.getAuditLogTypeValue());
addClusterCommand.setSucceeded(false);
assertEquals(AuditLogType.USER_ADD_CLUSTER_FAILED, addClusterCommand.getAuditLogTypeValue());
}
@Test
public void getPermissionCheckSubjectsTest() {
List<PermissionSubject> permissions = addClusterCommand.getPermissionCheckSubjects();
assertEquals(2, permissions.size());
PermissionSubject permissionSubject = permissions.get(0);
assertEquals(cluster.getStoragePoolId(), permissionSubject.getObjectId());
assertEquals(VdcObjectType.StoragePool, permissionSubject.getObjectType());
/**
* @TODO : Once there is a way to get the ActionType properly from the permissionSubject add the following test:
* assertEquals(ActionGroup.CREATE_CLUSTER, permissionSubject.getActionGroup());
*
* This test doesn't work because it relies on the class's name which mockito changes.
*/
}
}