VMware Cloud Community
jlegan
Contributor
Contributor

c# CloneVM_Task

I read the great post about cloning a VM with PowerShell here: http://communities.vmware.com/message/999650#999650.

I am creating a simple interface to clone virtual machines and I have run into an issue with the first parameter of CloneVM_Task.

It expects a ManagedObjectReference to a folder. What is not clear from the API documentation is how to obtain that MOR and whether or not I need to create the folder ahead of time or if it will be created for me automatically (based on the name of the new machine).

When I try and instantiate a new Folder object (which exposes create folder which returns a folder MOR), it expects folder MOR which I do not yet have. Also, the VimClient does not expose a Get-Folder equiv that the PowerShell example uses.

Does anyone have a code example in C# for cloning a VM?

Thanks,

Jim

Reply
0 Kudos
4 Replies
jlegan
Contributor
Contributor

This has got me stumped. Does anyone have a code snippet for simple getting a ManagedObjectReference for a folder object? That is all I need to get this to work and I have been playing with it for the last few hours.

Thanks,

Jim

Reply
0 Kudos
jlegan
Contributor
Contributor

I have been playing around with this all weekend and I still have not gotten past it. Has anyone out there besides me tried to utilize CloneVM_Task in c# with the VI Toolkit?

I know my issue is in getting the ManagedObjectReference to the folder. What I am not clear on is if I need to create that folder or if it is simply looking for the root (/) folder and it will subsequently create the folder for that VM for me. Either way, I cannot get the MOR for that folder (root). This may be related to that fact that I have two datastores on this server. However, I created a HostSystem object as well and I can see those datastores but I still cannot figure out how to get a proper folder object.

Reply
0 Kudos
ykalchev
VMware Employee
VMware Employee

Hi,

The easiest way to get a folder is using FindEntityView method of the VimClient object. The code below uses filter by name to get the default (root) VM folder named "vm"

         VimClient client = new VimClient();
 
         ...
 
         NameValueCollection filter = new NameValueCollection();
         filter.Add("Name", "vm");
 
         Folder vmFolder = (Folder) client.FindEntityView(typeof(Folder), null, filter, null)
 

Using vmFolder object and already created VirtualMachineCloneSpec you can now call CloneVM

         sourceVM.CloneVM(vmFolder.MoRef, "newVM", cloneSpec);

Regards,

Yasen

Yasen Kalchev, vSM Dev Team
Reply
0 Kudos
vichlu
Contributor
Contributor

I am attempting to move a bunch of VM's into a folder, all in one shot. In the snippet below, the string id for the Folder MOR is hardcoded and running this worked once but if I run again, it says the MOR has not been completely created or deleted. I tried the default constructor to no avail, random numbers.. same error as before.

How can I predict these numbers? Drag and drop on vSphere Client is much easier. How can I automate this??

public static void CreateFolder(VimClient client, string foldername, params string[] vmNames)
        {
            // ------- CreateFolder -------

            Folder folder = new Folder(client, new ManagedObjectReference("Folder-group-v3"));
            folder.CreateFolder(foldername);

            // ------- MoveIntoFolder_Task -------
           
            foreach (string t in vmNames)
            {
                var filter = new NameValueCollection { { "name", "^" + t + "$" } };
                var vm = (VirtualMachine)client.FindEntityView(typeof(VirtualMachine), null, filter, null);
                if (vm == null)
                {
                    Console.WriteLine(t + " is not a valid virtual Machine name.");
                }
                else
                {
                    ManagedObjectReference[] list = new ManagedObjectReference[1];
                    list[0] = new ManagedObjectReference {Type = "VirtualMachine", Value = vm.MoRef.Value};
                    Folder _this = new Folder(client, new ManagedObjectReference("Folder-group-v471"));        //************* harcoded value**********
                    ManagedObjectReference m = _this.MoveIntoFolder_Task(list);
                    AwaitTaskCompletion(client, m);
                }
            }

        }

Reply
0 Kudos