Hai am trying to clone vm in the esx server which takes ip of the esx and vmname as command line arguments and asks for user name and password But am not able to do the same. Below is the code am working around. I will be glad if anybody can help.
using System;
using System.Net.Security;
using System.Web.Services.Protocols;
using System.Security.Cryptography.X509Certificates;
using VimApi;
using ReadPassword;
namespace SimpleClient
{
public class SimpleClient
{
protected VimService _service;
protected ServiceContent _sic;
protected ManagedObjectReference _svcRef;
protected ManagedObjectReference _propCol;
protected ManagedObjectReference _rootFolder;
protected String datacenter;
public static bool ValidateServerCertificate(Object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
return true;
}
public void CreateServiceRef(string svcRefVal)
{
System.Net.ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(ValidateServerCertificate);
_svcRef = new ManagedObjectReference();
_svcRef.type = "ServiceInstance";
_svcRef.Value = svcRefVal;
}
public void Connect(string url)
{
if (_service != null)
{
Disconnect();
}
_service = new VimService();
_service.Url = url;
_service.CookieContainer = new System.Net.CookieContainer();
_sic = _service.RetrieveServiceContent(_svcRef);
_propCol = _sic.propertyCollector;
_rootFolder = _sic.rootFolder;
String username = String.Empty;
String password = String.Empty;
if (_sic.sessionManager != null)
{
Console.Write("Please enter user name:");
username = Console.ReadLine();
Console.WriteLine("Please enter password:");
ReadPasswordClass x = new ReadPasswordClass();
password = x.ReadPassword();
_service.Login(_sic.sessionManager, username, password, null);
}
}
public void Disconnect()
{
if (_service != null)
{
_service.Logout(_sic.sessionManager);
_service.Dispose();
_service = null;
_sic = null;
}
}
public void GetContainerContents()
{
TraversalSpec traversalSpec = new TraversalSpec();
traversalSpec.type = "Folder";
traversalSpec.name = "traverseChild";
traversalSpec.path = "childEntity";
traversalSpec.skip = false;
traversalSpec.selectSet = new SelectionSpec[] { new SelectionSpec() };
traversalSpec.selectSet[0].name = traversalSpec.name;
PropertySpec[] propspecary = new PropertySpec[] { new PropertySpec() };
propspecary[0].all = false;
propspecary[0].allSpecified = true;
propspecary[0].pathSet = new string[] { "name" };
propspecary[0].type = "ManagedEntity";
PropertyFilterSpec spec = new PropertyFilterSpec();
spec.propSet = propspecary;
spec.objectSet = new ObjectSpec[] { new ObjectSpec() };
spec.objectSet[0].obj = _rootFolder;
spec.objectSet[0].skip = false;
spec.objectSet[0].selectSet = new SelectionSpec[] { traversalSpec };
ObjectContent[] ocary =
_service.RetrieveProperties(
_propCol, new PropertyFilterSpec[] { spec }
);
if (ocary != null)
{
ObjectContent oc = null;
ManagedObjectReference mor = null;
DynamicProperty[] pcary = null;
DynamicProperty pc = null;
for (int oci = 0; oci < ocary.Length; oci++)
{
oc = ocary[oci];
mor = oc.obj;
pcary = oc.propSet;
Console.WriteLine("Object Type : " + mor.type);
Console.WriteLine("Reference Value : " + mor.Value);
if (pcary != null)
{
for (int pci = 0; pci < pcary.Length; pci++)
{
pc = pcary[pci];
Console.WriteLine(" Property Name : " + pc.name);
if (pc != null)
{
if (!pc.val.GetType().IsArray)
{
Console.WriteLine(" Property Value : " + pc.val);
if (mor.type.Contains("Datacenter"))
{
datacenter = pc.val.ToString() ;
}
}
else
{
Array ipcary = (Array)pc.val;
Console.WriteLine("Val : " + pc.val);
for (int ii = 0; ii < ipcary.Length; ii++)
{
object oval = ipcary.GetValue(ii);
if (oval.GetType().Name.IndexOf("ManagedObjectReference") >= 0)
{
ManagedObjectReference imor = (ManagedObjectReference)oval;
Console.WriteLine("Inner Object Type : " + imor.type);
Console.WriteLine("Inner Reference Value : " + imor.Value);
}
else
{
Console.WriteLine("Inner Property Value : " + oval);
}
}
}
}
}
}
}
}
else
{
Console.WriteLine("No Managed Entities retrieved!");
}
}
public Object[] getProperties(ManagedObjectReference moRef, String[] properties)
{
PropertySpec pSpec = new PropertySpec();
pSpec.type = moRef.type;
pSpec.pathSet = properties;
ObjectSpec oSpec = new ObjectSpec();
oSpec.obj = moRef;
PropertyFilterSpec pfSpec = new PropertyFilterSpec();
pfSpec.propSet = new PropertySpec[] { pSpec };
pfSpec.objectSet = new ObjectSpec[] { oSpec };
ManagedObjectReference _svcRef1 = new ManagedObjectReference();
_svcRef1.type = "ServiceInstance";
_svcRef1.Value = "ServiceInstance";
ServiceContent sic1 = _service.RetrieveServiceContent(_svcRef1);
ObjectContent[] ocs = new ObjectContent[20];
ocs = _service.RetrieveProperties(sic1.propertyCollector, new PropertyFilterSpec[] { pfSpec });
Object[] ret = new Object[properties.Length];
if (ocs != null)
{
for (int i = 0; i < ocs.Length; ++i)
{
ObjectContent oc = ocs[i];
DynamicProperty[] dps = oc.propSet;
if (dps != null)
{
for (int j = 0; j < dps.Length; ++j)
{
DynamicProperty dp = dps[j];
for (int p = 0; p < ret.Length; ++p)
{
if (properties[p].Equals(dp.name))
{
ret[p] = dp.val;
}
}
}
}
}
}
return ret;
}
public Object getObjectProperty(ManagedObjectReference moRef, String propertyName)
{
return getProperties(moRef, new String[] { propertyName })[0];
}
public void CloneVM(String Template)
{
ManagedObjectReference searchIndex = new ManagedObjectReference();
searchIndex = _sic.searchIndex;
ManagedObjectReference datacenterRef = _service.FindByInventoryPath(searchIndex, datacenter);
if (datacenterRef == null)
{
Console.WriteLine("The specified datacenter is not found");
}
ManagedObjectReference vmREf = _service.FindByIp(searchIndex,null, "172.19.194.44", true);
ManagedObjectReference vmFolderRef = (ManagedObjectReference)getObjectProperty(datacenterRef, "vmFolder");
ManagedObjectReference[] vmList = (ManagedObjectReference[])getObjectProperty(vmFolderRef, "childEntity");
ManagedObjectReference templateRef = null;
Boolean gotVmRef = false;
for (int i = 0; i < vmList.Length && gotVmRef==false ; i++)
{
if (vmList[i].type == "VirtualMachine")
{
Object[] vmProps = getProperties(vmList[i],
new String[] { "config.name", "config.guestFullName" });
if (((String)vmProps[0]).Equals(Template))
{
templateRef = vmList[i];
gotVmRef = true;
}
else
{
Console.WriteLine("VM Found:"+(String)vmProps[0]);
}
}
}
VirtualMachineConfigInfo vmConfigInfo = (VirtualMachineConfigInfo)getObjectProperty(templateRef, "config");
VirtualMachineRuntimeInfo vmRuntimeInfo = (VirtualMachineRuntimeInfo)getObjectProperty(templateRef, "runtime");
ManagedObjectReference hostRef = vmRuntimeInfo.host;
ManagedObjectReference hostFolderRef = (ManagedObjectReference)getObjectProperty(datacenterRef, "hostFolder");
ManagedObjectReference[] crList = (ManagedObjectReference[])getObjectProperty(hostFolderRef, "childEntity");
ManagedObjectReference computeResourceRef;
computeResourceRef = null;
for (int i = 0; i < crList.Length; i++)
{
if (crList[i].type == "ComputeResource")
{
computeResourceRef = crList[i];
break;
}
}
if (computeResourceRef != null)
{
ManagedObjectReference resourcePoolRootRef = (ManagedObjectReference)getObjectProperty(computeResourceRef, "resourcePool");
ManagedObjectReference resourcePoolRef = resourcePoolRootRef;
VirtualMachineCloneSpec cloneSpec = new VirtualMachineCloneSpec();
VirtualMachineRelocateSpec relocSpec = new VirtualMachineRelocateSpec();
relocSpec.host = hostRef ;
relocSpec.pool = resourcePoolRef;
cloneSpec.location = relocSpec;
cloneSpec.location.pool = resourcePoolRef;
cloneSpec.powerOn = false;
cloneSpec.template = false;
VirtualMachineConfigSpec configSpec = new VirtualMachineConfigSpec();
cloneSpec.config = configSpec;
String clonedName = "VMCLONEDTEST";
Console.WriteLine("Launching clone task to create a clone: " + clonedName);
if (cloneSpec != null)
{
ManagedObjectReference cloneTask = _service.CloneVM_Task(templateRef, vmFolderRef, clonedName, cloneSpec);
}
else
{
Console.WriteLine("Clone spec is null");
}
}
}
[STAThread]
public static void Main(string[] args)
{
if (args == null || args.Length < 2)
{
Console.WriteLine("Usage : SimpleClient <webserviceurl>");
}
SimpleClient sc = new SimpleClient();
try
{
sc.CreateServiceRef("ServiceInstance");
sc.Connect(args[0]);
sc.GetContainerContents();
sc.CloneVM(args[1]);
sc.Disconnect();
}
catch (SoapException se)
{
Console.WriteLine("Caught SoapException - " + " Actor : " + se.Actor + " Code : " + se.Code + " Detail XML : " + se.Detail.OuterXml);
}
catch (Exception e)
{
Console.WriteLine("Caught Exception : " + " Name : " + e.GetType().Name + " Message : " + e.Message + " Trace : " + e.StackTrace);
}
}
}
}