From 048bfd7f73a8a65f24e6cbd8a942c8cfd10b4b72 Mon Sep 17 00:00:00 2001 From: andreaturli Date: Tue, 28 Dec 2010 15:02:11 +0100 Subject: [PATCH 1/2] clone operation added --- .../config/ViComputeServiceContextModule.java | 8 +- .../strategy/ViComputeServiceAdapter.java | 210 ++++++++++++++---- .../vi/compute/ViExperimentLiveTest.java | 33 +-- 3 files changed, 191 insertions(+), 60 deletions(-) diff --git a/sandbox/vsphere/src/main/java/org/jclouds/vi/compute/config/ViComputeServiceContextModule.java b/sandbox/vsphere/src/main/java/org/jclouds/vi/compute/config/ViComputeServiceContextModule.java index 3abcba9e90..16ffdc6999 100644 --- a/sandbox/vsphere/src/main/java/org/jclouds/vi/compute/config/ViComputeServiceContextModule.java +++ b/sandbox/vsphere/src/main/java/org/jclouds/vi/compute/config/ViComputeServiceContextModule.java @@ -106,10 +106,10 @@ public class ViComputeServiceContextModule protected TemplateBuilder provideTemplate(Injector injector, TemplateBuilder template) { // String domainDir = injector.getInstance(Key.get(String.class, // Names.named(PROPERTY_LIBVIRT_DOMAIN_DIR))); - String domainDir = ""; - String hardwareId = searchForHardwareIdInDomainDir(domainDir); - String image = searchForImageIdInDomainDir(domainDir); - return template.hardwareId(hardwareId).imageId(image); +// String domainDir = ""; +// String hardwareId = searchForHardwareIdInDomainDir(domainDir); +// String image = searchForImageIdInDomainDir(domainDir); + return template.hardwareId("vm-1221").imageId("winNetEnterprise64Guest"); } private String searchForImageIdInDomainDir(String domainDir) { diff --git a/sandbox/vsphere/src/main/java/org/jclouds/vi/compute/strategy/ViComputeServiceAdapter.java b/sandbox/vsphere/src/main/java/org/jclouds/vi/compute/strategy/ViComputeServiceAdapter.java index 47326098f1..27dafc3409 100644 --- a/sandbox/vsphere/src/main/java/org/jclouds/vi/compute/strategy/ViComputeServiceAdapter.java +++ b/sandbox/vsphere/src/main/java/org/jclouds/vi/compute/strategy/ViComputeServiceAdapter.java @@ -36,13 +36,35 @@ import org.jclouds.vi.Image; import com.google.common.base.Throwables; import com.google.common.collect.Lists; +import com.vmware.vim25.CustomizationAdapterMapping; +import com.vmware.vim25.CustomizationDhcpIpGenerator; +import com.vmware.vim25.CustomizationFixedName; +import com.vmware.vim25.CustomizationGlobalIPSettings; +import com.vmware.vim25.CustomizationGuiUnattended; +import com.vmware.vim25.CustomizationIPSettings; +import com.vmware.vim25.CustomizationIdentification; +import com.vmware.vim25.CustomizationIdentitySettings; +import com.vmware.vim25.CustomizationLicenseDataMode; +import com.vmware.vim25.CustomizationLicenseFilePrintData; +import com.vmware.vim25.CustomizationPassword; +import com.vmware.vim25.CustomizationSpec; +import com.vmware.vim25.CustomizationSysprep; +import com.vmware.vim25.CustomizationUserData; +import com.vmware.vim25.CustomizationWinOptions; import com.vmware.vim25.InvalidProperty; import com.vmware.vim25.RuntimeFault; +import com.vmware.vim25.VirtualMachineCloneSpec; +import com.vmware.vim25.VirtualMachineRelocateSpec; import com.vmware.vim25.mo.Datacenter; +import com.vmware.vim25.mo.Datastore; import com.vmware.vim25.mo.Folder; +import com.vmware.vim25.mo.HostDatastoreBrowser; +import com.vmware.vim25.mo.HostSystem; import com.vmware.vim25.mo.InventoryNavigator; import com.vmware.vim25.mo.ManagedEntity; +import com.vmware.vim25.mo.ResourcePool; import com.vmware.vim25.mo.ServiceInstance; +import com.vmware.vim25.mo.Task; import com.vmware.vim25.mo.VirtualMachine; /** @@ -54,6 +76,10 @@ import com.vmware.vim25.mo.VirtualMachine; public class ViComputeServiceAdapter implements ComputeServiceAdapter { private final ServiceInstance client; + private String resourcePoolName = ""; + private String vmwareHostName = ""; + private String datastoreName = ""; + private String vmClonedName = "MyWinClone"; @Inject public ViComputeServiceAdapter(ServiceInstance client) { @@ -64,59 +90,159 @@ public class ViComputeServiceAdapter implements ComputeServiceAdapter credentialStore) { - // TODO Auto-generated method stub - return null; - } - - /* - @Override - public Domain runNodeWithTagAndNameAndStoreCredentials(String tag, String name, Template template, - Map credentialStore) { try { - String domainName = tag; - Domain domain = client.domainLookupByName(domainName); - XMLBuilder builder = XMLBuilder.parse(new InputSource(new StringReader(domain.getXMLDesc(0)))); - Document doc = builder.getDocument(); - String xpathString = "//devices/disk[@device='disk']/source/@file"; - XPathExpression expr = XPathFactory.newInstance().newXPath().compile(xpathString); - NodeList nodes = (NodeList) expr.evaluate(doc, XPathConstants.NODESET); - String diskFileName = nodes.item(0).getNodeValue(); - StorageVol storageVol = client.storageVolLookupByPath(diskFileName); - - // cloning volume - String poolName = storageVol.storagePoolLookupByVolume().getName(); - StoragePool storagePool = client.storagePoolLookupByName(poolName); - StorageVol clonedVol = null; - boolean cloned = false; - int retry = 0; - while(!cloned && retry<10) { - try { - clonedVol = cloneVolume(storagePool, storageVol); - cloned = true; - } catch (LibvirtException e) { - retry++; - Thread.sleep(1000); - } + Folder rootFolder = client.getRootFolder(); + + VirtualMachine from = (VirtualMachine) new InventoryNavigator( + rootFolder).searchManagedEntity("VirtualMachine", tag); + + if (from == null) { + client.getServerConnection().logout(); + return null; } - // define Domain - String xmlFinal = generateClonedDomainXML(domain.getXMLDesc(0), clonedVol); - Domain newDomain = client.domainDefineXML(xmlFinal); - newDomain.create(); - // store the credentials so that later functions can use them - credentialStore.put(domain.getUUIDString() + "", new Credentials("identity", "credential")); - return newDomain; - } catch (LibvirtException e) { + + VirtualMachineCloneSpec cloneSpec = new VirtualMachineCloneSpec(); + VirtualMachineRelocateSpec virtualMachineRelocateSpec = new VirtualMachineRelocateSpec(); + if (!vmwareHostName.equals("") && !datastoreName.equals("") && !resourcePoolName.equals("")) { + + ResourcePool rp = (ResourcePool) new InventoryNavigator(rootFolder) + .searchManagedEntity("ResourcePool", resourcePoolName); + + if(rp == null) + throw new Exception("The resourcePool specified '" + resourcePoolName + "' doesn't exist"); + virtualMachineRelocateSpec.setPool(rp.getMOR()); + + + Datastore ds = (Datastore) new InventoryNavigator(rootFolder) + .searchManagedEntity("Datastore", datastoreName); + + HostSystem host = null; + host = (HostSystem) new InventoryNavigator(rootFolder) + .searchManagedEntity("HostSystem", vmwareHostName); + + HostDatastoreBrowser hdb = host.getDatastoreBrowser(); + + if(ds == null) + throw new Exception("Cannot relocate this cloned machine to the specified datastore '" + datastoreName + "'"); + Datastore dsFound = null; + Datastore[] dsArray = hdb.getDatastores(); + for (Datastore d : dsArray) { + if(d.getName().equalsIgnoreCase(ds.getName())) + dsFound = d; + } + if(dsFound == null) + throw new Exception("Cannot relocate this cloned machine to the specified datastore '" + datastoreName + "'"); + virtualMachineRelocateSpec.setDatastore(dsFound.getMOR()); + } + + CustomizationSpec custSpec = new CustomizationSpec(); + + CustomizationAdapterMapping cam = new CustomizationAdapterMapping(); + CustomizationIPSettings cip = new CustomizationIPSettings(); + cip.setIp(new CustomizationDhcpIpGenerator()); + cam.setAdapter(cip); + + + // IP customization +// CustomizationAdapterMapping[] custAdapMapList = new CustomizationAdapterMapping[1]; +// CustomizationAdapterMapping custAdapMap = new CustomizationAdapterMapping(); +// CustomizationIPSettings custIPSettings = new CustomizationIPSettings(); +// CustomizationFixedIp custFixedIp = new CustomizationFixedIp(); +// custFixedIp.setIpAddress(ipAddress); +// custIPSettings.setIp(custFixedIp); +// custAdapMap.setAdapter(custIPSettings); +// custAdapMapList[0] = custAdapMap; +// custSpec.setNicSettingMap(custAdapMapList); + + CustomizationGlobalIPSettings custGlobalIPSetting = new CustomizationGlobalIPSettings(); + + + CustomizationIdentitySettings custIdentitySet = new CustomizationIdentitySettings(); + + // sysprep customization + CustomizationSysprep custSysprep = new CustomizationSysprep(); + + CustomizationGuiUnattended guiUnattended = new CustomizationGuiUnattended(); + guiUnattended.setAutoLogon(false); + guiUnattended.setAutoLogonCount(0); + guiUnattended.setTimeZone(190); + + + // user data + CustomizationPassword custPasswd = new CustomizationPassword(); + custPasswd.setPlainText(true); + custPasswd.setValue("password"); + + CustomizationIdentification custIdentification = new CustomizationIdentification(); + custIdentification.setDomainAdmin("Administrator"); + custIdentification.setDomainAdminPassword(custPasswd); + custIdentification.setJoinWorkgroup("WORKGROUP"); + + CustomizationUserData custUserData = new CustomizationUserData(); + CustomizationFixedName custFixedName = new CustomizationFixedName(); + custFixedName.setName("mycomputer"); + custUserData.setComputerName(custFixedName); + custUserData.setFullName("sjain"); + custUserData.setOrgName("vmware"); + custUserData.setProductId("PDRXT-M9X8G-898BR-4K427-J2FFY"); + + /////// + CustomizationWinOptions customizationWinOptions = new CustomizationWinOptions(); + customizationWinOptions.setChangeSID(true); + customizationWinOptions.setDeleteAccounts(false); + + CustomizationLicenseFilePrintData custLPD = new CustomizationLicenseFilePrintData(); + custLPD.setAutoMode(CustomizationLicenseDataMode.perServer); + + custSysprep.setLicenseFilePrintData(custLPD); + + custSysprep.setUserData(custUserData); + custSysprep.setGuiUnattended(guiUnattended); + custSysprep.setIdentification(custIdentification); + + custSpec.setIdentity(custSysprep); + custSpec.setNicSettingMap(new CustomizationAdapterMapping[] {cam}); + custSpec.setGlobalIPSettings(custGlobalIPSetting); + custSpec.setOptions(customizationWinOptions); + + + + cloneSpec.setCustomization(custSpec); + + //location properties + cloneSpec.setLocation(virtualMachineRelocateSpec); + cloneSpec.setPowerOn(false); + cloneSpec.setTemplate(false); + + Task task = from.cloneVM_Task((Folder) from.getParent(), vmClonedName, + cloneSpec); + + String result = task.waitForTask(); + return (VirtualMachine) new InventoryNavigator( + rootFolder).searchManagedEntity("VirtualMachine", vmClonedName); + } catch (RemoteException e) { return propogate(e); } catch (Exception e) { return propogate(e); } + } - */ @Override public Iterable listHardwareProfiles() { // TODO - return null; + List hardwareProfiles = Lists.newArrayList(); + try { + + ManagedEntity[] entities = new InventoryNavigator( + client.getRootFolder()).searchManagedEntities("VirtualMachine"); + for (ManagedEntity entity : entities) { + hardwareProfiles.add((VirtualMachine) entity); + } + return hardwareProfiles; + } catch (Exception e) { + return propogate(e); + } } @Override diff --git a/sandbox/vsphere/src/test/java/org/jclouds/vi/compute/ViExperimentLiveTest.java b/sandbox/vsphere/src/test/java/org/jclouds/vi/compute/ViExperimentLiveTest.java index f4a4859cee..202957116d 100644 --- a/sandbox/vsphere/src/test/java/org/jclouds/vi/compute/ViExperimentLiveTest.java +++ b/sandbox/vsphere/src/test/java/org/jclouds/vi/compute/ViExperimentLiveTest.java @@ -25,11 +25,10 @@ import java.util.Set; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.ComputeServiceContextFactory; -import org.jclouds.compute.domain.ComputeMetadata; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.domain.Location; +import org.jclouds.compute.domain.Template; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -63,34 +62,40 @@ public class ViExperimentLiveTest { // Set locations = context.getComputeService().listAssignableLocations(); // // Set nodes = context.getComputeService().listNodes(); - - // TODO -// Set hardwares = context.getComputeService().listHardwareProfiles(); // +// Set hardwares = context.getComputeService().listHardwareProfiles(); +// for (Hardware hardware : hardwares) { +// System.out.println("hardware id: " + hardware.getId()); +// } +// // Set images = context.getComputeService().listImages(); - - NodeMetadata node = context.getComputeService().getNodeMetadata("provaVM"); - System.out.println(node); +// for (Image image : images) { +// System.out.println("id: " + image.getId() + " - name:" + image.getName()); +// } +// +// NodeMetadata node = context.getComputeService().getNodeMetadata("MyWinServer"); +// System.out.println(node); /* * We will probably make a default template out of properties at some point You can control * the default template via overriding a method in standalonecomputeservicexontextmodule */ - - /* Template defaultTemplate = context.getComputeService().templateBuilder() - .hardwareId("d106ae67-5a1b-8f91-b311-83c93bcb0a1f").imageId("1") //.locationId("") + /* + Template defaultTemplate = context.getComputeService().templateBuilder() + .hardwareId("vm-1221").imageId("winNetEnterprise64Guest") //.locationId("") .build(); - Set nodeMetadataSet = context.getComputeService().runNodesWithTag("MyServer", 1); + */ + Set nodeMetadataSet = context.getComputeService().runNodesWithTag("MyWinServer", 1); for (NodeMetadata nodeMetadata : nodeMetadataSet) { // context.getComputeService().suspendNode(nodeMetadata.getId()); // context.getComputeService().resumeNode(nodeMetadata.getId()); - context.getComputeService().destroyNode(nodeMetadata.getId()); + //context.getComputeService().destroyNode(nodeMetadata.getId()); } } catch (Exception e) { e.printStackTrace(); - */ + } finally { if (context != null) context.close(); From 132dbd9827f8f17eb86698bd1121be7e95793f1e Mon Sep 17 00:00:00 2001 From: andreaturli Date: Wed, 29 Dec 2010 10:54:01 +0100 Subject: [PATCH 2/2] update TODO; removed Datacenter class --- sandbox/vsphere/TODO | 2 +- .../main/java/org/jclouds/vi/Datacenter.java | 56 ------------------- .../strategy/ViComputeServiceAdapter.java | 2 +- .../vi/compute/ViExperimentLiveTest.java | 30 +++++----- 4 files changed, 19 insertions(+), 71 deletions(-) delete mode 100644 sandbox/vsphere/src/main/java/org/jclouds/vi/Datacenter.java diff --git a/sandbox/vsphere/TODO b/sandbox/vsphere/TODO index 81960b3b76..1ced747a3a 100644 --- a/sandbox/vsphere/TODO +++ b/sandbox/vsphere/TODO @@ -1 +1 @@ -runNodesWithTag: when ask for more than 1 node, cloning step fails cause of concurrent access to the originale virtual disk to be cloned. \ No newline at end of file +runNodesWithTag: pass VirtualMachineRelocateSpec using Template? \ No newline at end of file diff --git a/sandbox/vsphere/src/main/java/org/jclouds/vi/Datacenter.java b/sandbox/vsphere/src/main/java/org/jclouds/vi/Datacenter.java deleted file mode 100644 index b1312ab871..0000000000 --- a/sandbox/vsphere/src/main/java/org/jclouds/vi/Datacenter.java +++ /dev/null @@ -1,56 +0,0 @@ -/** - * - * Copyright (C) 2010 Cloud Conscious, LLC. - * - * ==================================================================== - * 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 org.jclouds.vi; - -import com.google.common.base.Objects; - -/** - * This would be replaced with the real java object related to the underlying data center - * - * @author Adrian Cole - */ -public class Datacenter { - - public int id; - public String name; - - public Datacenter(int id, String name) { - this.id = id; - this.name = name; - } - - @Override - public int hashCode() { - return Objects.hashCode(id, name); - } - - @Override - public boolean equals(Object that) { - if (that == null) - return false; - return Objects.equal(this.toString(), that.toString()); - } - - @Override - public String toString() { - return Objects.toStringHelper(this).add("id", id).add("name", name).toString(); - } - -} diff --git a/sandbox/vsphere/src/main/java/org/jclouds/vi/compute/strategy/ViComputeServiceAdapter.java b/sandbox/vsphere/src/main/java/org/jclouds/vi/compute/strategy/ViComputeServiceAdapter.java index 27dafc3409..642fabe0e9 100644 --- a/sandbox/vsphere/src/main/java/org/jclouds/vi/compute/strategy/ViComputeServiceAdapter.java +++ b/sandbox/vsphere/src/main/java/org/jclouds/vi/compute/strategy/ViComputeServiceAdapter.java @@ -68,7 +68,7 @@ import com.vmware.vim25.mo.Task; import com.vmware.vim25.mo.VirtualMachine; /** - * defines the connection between the {@link Libvirt} implementation and the jclouds + * defines the connection between the {@link VI} implementation and the jclouds * {@link ComputeService} * */ diff --git a/sandbox/vsphere/src/test/java/org/jclouds/vi/compute/ViExperimentLiveTest.java b/sandbox/vsphere/src/test/java/org/jclouds/vi/compute/ViExperimentLiveTest.java index 202957116d..cef750823e 100644 --- a/sandbox/vsphere/src/test/java/org/jclouds/vi/compute/ViExperimentLiveTest.java +++ b/sandbox/vsphere/src/test/java/org/jclouds/vi/compute/ViExperimentLiveTest.java @@ -25,10 +25,10 @@ import java.util.Set; import org.jclouds.compute.ComputeServiceContext; import org.jclouds.compute.ComputeServiceContextFactory; +import org.jclouds.compute.domain.ComputeMetadata; import org.jclouds.compute.domain.Hardware; import org.jclouds.compute.domain.Image; -import org.jclouds.compute.domain.NodeMetadata; -import org.jclouds.compute.domain.Template; +import org.jclouds.domain.Location; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; @@ -59,19 +59,22 @@ public class ViExperimentLiveTest { context = new ComputeServiceContextFactory().createContext(new ViComputeServiceContextSpec( endpoint, identity, credential)); -// Set locations = context.getComputeService().listAssignableLocations(); -// + Set locations = context.getComputeService().listAssignableLocations(); + for (Location location : locations) { + System.out.println("location id: " + location.getId() + " - desc: " + location.getDescription()); + } + // Set nodes = context.getComputeService().listNodes(); // -// Set hardwares = context.getComputeService().listHardwareProfiles(); -// for (Hardware hardware : hardwares) { -// System.out.println("hardware id: " + hardware.getId()); -// } + Set hardwares = context.getComputeService().listHardwareProfiles(); + for (Hardware hardware : hardwares) { + System.out.println("hardware id: " + hardware.getId() + " - name: " + hardware.getName()); + } // -// Set images = context.getComputeService().listImages(); -// for (Image image : images) { -// System.out.println("id: " + image.getId() + " - name:" + image.getName()); -// } + Set images = context.getComputeService().listImages(); + for (Image image : images) { + System.out.println("id: " + image.getId() + " - name:" + image.getName()); + } // // NodeMetadata node = context.getComputeService().getNodeMetadata("MyWinServer"); // System.out.println(node); @@ -84,7 +87,7 @@ public class ViExperimentLiveTest { Template defaultTemplate = context.getComputeService().templateBuilder() .hardwareId("vm-1221").imageId("winNetEnterprise64Guest") //.locationId("") .build(); - */ + Set nodeMetadataSet = context.getComputeService().runNodesWithTag("MyWinServer", 1); for (NodeMetadata nodeMetadata : nodeMetadataSet) { @@ -93,6 +96,7 @@ public class ViExperimentLiveTest { //context.getComputeService().destroyNode(nodeMetadata.getId()); } + */ } catch (Exception e) { e.printStackTrace();