package jetbrains.buildServer.clouds.vmware; import com.vmware.vim25.mo.Datacenter; import com.vmware.vim25.mo.Task; import java.io.File; import java.rmi.RemoteException; import java.util.*; import com.intellij.util.WaitFor; import jetbrains.buildServer.BaseTestCase; import jetbrains.buildServer.clouds.CloudClientParameters; import jetbrains.buildServer.clouds.CloudImageParameters; import jetbrains.buildServer.clouds.CloudInstanceUserData; import jetbrains.buildServer.clouds.InstanceStatus; import jetbrains.buildServer.clouds.base.connector.CloudAsyncTaskExecutor; import jetbrains.buildServer.clouds.base.tasks.UpdateInstancesTask; import jetbrains.buildServer.clouds.base.types.CloneBehaviour; import jetbrains.buildServer.clouds.vmware.connector.VMWareApiConnector; import jetbrains.buildServer.clouds.vmware.stubs.FakeApiConnector; import jetbrains.buildServer.clouds.vmware.stubs.FakeModel; import jetbrains.buildServer.clouds.vmware.stubs.FakeVirtualMachine; import jetbrains.buildServer.clouds.vmware.tasks.VmwareUpdateTaskManager; import jetbrains.buildServer.util.FileUtil; import org.testng.annotations.AfterMethod; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; /** * @author Sergey.Pak * Date: 5/20/2014 * Time: 3:16 PM */ @Test public class VmwareCloudImageTest extends BaseTestCase { private CloudAsyncTaskExecutor myTaskExecutor; private VMWareApiConnector myApiConnector; private VmwareCloudImage myImage; private VmwareCloudImageDetails myImageDetails; private File myIdxStorage; private UpdateInstancesTask<VmwareCloudInstance, VmwareCloudImage, VMWareCloudClient> myUpdateTask; private VMWareCloudClient myCloudClient; @BeforeMethod public void setUp() throws Exception { super.setUp(); FakeModel.instance().clear(); myTaskExecutor = new CloudAsyncTaskExecutor("Test-vmware"); myApiConnector = new FakeApiConnector(VmwareCloudIntegrationTest.TEST_SERVER_UUID, VmwareCloudIntegrationTest.PROFILE_ID); myIdxStorage = createTempDir(); CloudImageParameters imageParameters = new CloudImageParameters(); imageParameters.setParameter("nickname", "imageNickname"); imageParameters.setParameter("sourceVmName", "srcVM"); imageParameters.setParameter("snapshot", "srcVMSnap"); imageParameters.setParameter("folder", "folderId"); imageParameters.setParameter("pool", "rpId"); imageParameters.setParameter("behaviour", CloneBehaviour.FRESH_CLONE.toString()); imageParameters.setParameter("maxInstances", "5"); myImageDetails = new VmwareCloudImageDetails(imageParameters); FakeModel.instance().addDatacenter("dc2"); FakeModel.instance().addFolder("folderId").setParent("dc2", Datacenter.class); FakeModel.instance().addVM("srcVM").setParentFolder("folderId"); FakeModel.instance().addResourcePool("rpId").setParentFolder("folderId"); FakeModel.instance().addVMSnapshot("srcVM", "srcVMSnap"); myImage = new VmwareCloudImage(myApiConnector, myImageDetails, myTaskExecutor, myIdxStorage); myCloudClient = new VMWareCloudClient(new CloudClientParameters(), myApiConnector, new VmwareUpdateTaskManager(), createTempDir()); myCloudClient.populateImagesData(Collections.singletonList(myImageDetails)); myUpdateTask = new UpdateInstancesTask<VmwareCloudInstance, VmwareCloudImage, VMWareCloudClient>( myApiConnector, myCloudClient, 10*1000, false); } public void check_clone_name_generation(){ for (int i=0; i<10; i++){ assertEquals(String.format("%s-%d", myImageDetails.getSourceId(), i + 1), myImage.generateNewVmName()); } FileUtil.delete(myIdxStorage); final String newName = myImage.generateNewVmName(); assertTrue(newName.startsWith(myImage.getName())); final int i = Integer.parseInt(newName.substring(myImage.getName().length() + 1)); assertTrue(i > 100000); } public void check_can_start_new_instance_limits() throws RemoteException, InterruptedException { final CloudInstanceUserData data = new CloudInstanceUserData("aaa", "bbbb", "localhost", 10000l, "profileDescr", Collections.<String, String>emptyMap()); assertTrue(myImage.canStartNewInstance()); myImage.startNewInstance(data); assertTrue(myImage.canStartNewInstance()); myImage.startNewInstance(data); assertTrue(myImage.canStartNewInstance()); myImage.startNewInstance(data); assertTrue(myImage.canStartNewInstance()); myImage.startNewInstance(data); assertTrue(myImage.canStartNewInstance()); final VmwareCloudInstance instance2Stop = myImage.startNewInstance(data); assertFalse(myImage.canStartNewInstance()); new WaitFor(5*1000){ @Override protected boolean condition() { return instance2Stop.getStatus() == InstanceStatus.RUNNING; } }; final FakeVirtualMachine vm2Stop = FakeModel.instance().getVirtualMachine(instance2Stop.getName()); final String result = vm2Stop.powerOffVM_Task().waitForTask(); assertEquals(Task.SUCCESS, result); instance2Stop.setStatus(InstanceStatus.STOPPED); assertTrue(myImage.canStartNewInstance()); System.setProperty(VmwareConstants.CONSIDER_STOPPED_VMS_LIMIT, "true"); assertFalse(myImage.canStartNewInstance()); System.getProperties().remove(VmwareConstants.CONSIDER_STOPPED_VMS_LIMIT); assertTrue(myImage.canStartNewInstance()); } @AfterMethod public void tearDown() throws Exception { super.tearDown(); } }