package jetbrains.buildServer.clouds.vmware.connector; import com.intellij.openapi.util.Pair; import com.vmware.vim25.*; import com.vmware.vim25.mo.Datacenter; import com.vmware.vim25.mo.Folder; import com.vmware.vim25.mo.ManagedEntity; import com.vmware.vim25.mo.ResourcePool; import java.net.URL; import java.rmi.RemoteException; import java.util.*; import java.util.stream.Collectors; import java.util.stream.Stream; import jetbrains.buildServer.BaseTestCase; import jetbrains.buildServer.clouds.vmware.connector.beans.ResourcePoolBean; import jetbrains.buildServer.clouds.vmware.errors.VmwareCheckedCloudException; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jmock.Expectations; import org.jmock.Mockery; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; /** * Created by sergeypak on 18/04/2017. */ @Test public class VmwareApiConnectorTest extends BaseTestCase { private Mockery m; @BeforeMethod @Override protected void setUp() throws Exception { super.setUp(); m = new Mockery(); } public void allow_same_vm_names() throws Exception { final VMWareApiConnector connector = new VMWareApiConnectorImpl(new URL("http://localhost:9999"),"username","pwd",null, null, null){ @NotNull @Override public Collection<VmwareInstance> findAllVirtualMachines() { final ArrayList<VmwareInstance> retval = new ArrayList<>(); final ManagedObjectReference parent = new ManagedObjectReference(); parent.setType("Folder"); parent.setVal("folder-40"); retval.add(new VmwareInstance("VM1", "VM1", new OptionValue[0], VirtualMachinePowerState.poweredOff, false, "changeVersion", null, null, parent, "datacenter-21")); retval.add(new VmwareInstance("VM1", "VM1", new OptionValue[0], VirtualMachinePowerState.poweredOff, false, "changeVersion", null, null, parent, "datacenter-21")); return retval; } }; final List<VmwareInstance> vms = connector.getVirtualMachines(false); assertEquals(2, vms.size()); assertEquals("VM1", vms.get(0).getPath()); assertEquals("VM1", vms.get(1).getPath()); } public void allow_same_respool_names() throws Exception{ final VMWareApiConnector connector = new VMWareApiConnectorImpl(new URL("http://localhost:9999"),"username","pwd",null, null, null){ private final Map<String, ManagedEntity> myEntitiesMap = new HashMap<>(); private final Datacenter myDc = new Datacenter(null, null){ @Override public ManagedObjectReference getMOR() { ManagedObjectReference mor = new ManagedObjectReference(); mor.setType("Datacenter"); mor.setVal("datacenter-2"); return mor; } }; { myEntitiesMap.put("datacenter-2", myDc); final Folder folder = createEntity(Folder.class, null, "group-v1", "MyFolder"); myEntitiesMap.put("group-v1", folder); final ResourcePool respool2 = createEntity(ResourcePool.class, folder, "resgroup-2", "MyRespool"); myEntitiesMap.put("resgroup-2", respool2); final ResourcePool respool3 = createEntity(ResourcePool.class, folder, "resgroup-3", "MyRespool"); myEntitiesMap.put("resgroup-3", respool3); } @Override protected <T extends ManagedEntity> Collection<T> findAllEntitiesOld(final Class<T> instanceType) throws VmwareCheckedCloudException { if (instanceType == Datacenter.class){ return Arrays.asList((T)myDc); } return null; } @Override protected <T extends ManagedEntity> T createExactManagedEntity(final ManagedObjectReference mor) { return (T)myEntitiesMap.get(mor.getVal()); } @Override protected <T extends ManagedEntity> T searchManagedEntity(@NotNull final String idName, @NotNull final Class<T> instanceType, @Nullable final Datacenter dc) { return (T)myEntitiesMap.get(idName); } @Override protected ObjectContent[] getObjectContents(final Datacenter dc, final String[][] typeinfo) throws RemoteException { assert dc == myDc; final ObjectContent[] retval = new ObjectContent[2]; //"ResourcePool", "name", "parent" ManagedObjectReference parentMOR = new ManagedObjectReference(); parentMOR.setType("Folder"); parentMOR.setVal("group-v1"); retval[0] = createObjectContent("ResourcePool", "resgroup-2", Pair.create("name", "MyRespool"), Pair.create("parent", parentMOR)); retval[1] = createObjectContent("ResourcePool", "resgroup-3", Pair.create("name", "MyRespool"), Pair.create("parent", parentMOR)); return retval; } }; final List<ResourcePoolBean> pools = connector.getResourcePools(); assertEquals(2, pools.size()); { ResourcePoolBean pool1 = pools.get(0); assertEquals("resgroup-2", pool1.getId()); assertEquals("MyFolder/MyRespool", pool1.getPath()); } { ResourcePoolBean pool2 = pools.get(1); assertEquals("resgroup-3", pool2.getId()); assertEquals("MyFolder/MyRespool", pool2.getPath()); } } private static ObjectContent createObjectContent(final String type, final String value, Pair<String, Object>... props){ final ObjectContent oc = new ObjectContent(); final ManagedObjectReference mor = new ManagedObjectReference(); mor.setType(type); mor.setVal(value); oc.setObj(mor); final List<DynamicProperty> properties = Stream .of(props) .map(p -> { DynamicProperty prop = new DynamicProperty(); prop.setName(p.getFirst()); prop.setVal(p.second); return prop; }) .collect(Collectors.toList()); oc.setPropSet(properties.toArray(new DynamicProperty[properties.size()])); return oc; } private <T extends ManagedEntity> T createEntity(Class<T> type, @Nullable ManagedEntity parent, String val, String name){ final ManagedObjectReference mor = new ManagedObjectReference(); mor.setType(type.getSimpleName()); mor.setVal(val); if (type==Folder.class){ return (T)new Folder(null, mor){ @Override public ManagedEntity getParent() { return parent; } @Override public String getName() { return name; } }; } if (type==ResourcePool.class){ return (T)new ResourcePool(null, mor){ @Override public ManagedEntity getParent() { return parent; } @Override public String getName() { return name; } }; } throw new IllegalArgumentException("can't create instance of type " + type.getSimpleName()); } }