Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
?
Solved

Deploying from Template using VMWare Infrastructure Java API

Posted on 2014-10-01
6
Medium Priority
?
1,852 Views
Last Modified: 2014-10-14
I'm using the VI Java API for VMWare and the vCenter 5.0.0.  I can successfully clone a running VM but would like to clone/deploy a VM from template.  However, when I specify a template to clone instead of a VM I get this:

Clone virtual machine
chefDemo232_Template

A specified parameter was not correct.  
spec.location.pool


Not sure how to specify or if I even have a resource pool.  Here's my code:

public void cloneVM() throws Exception{
		
		 
			System.out.println("inClon<wbr ></wbr>eVM");

		    String vmname = "chefDemo232_Template";
		    String cloneName = "template clone test";
		
		    ServiceInstance si = new ServiceInstance(
		        new URL("my URL"), "my name", "my password", true);

		    System.out.println("afterU<wbr ></wbr>rl");
		    
		    Folder rootFolder = si.getRootFolder();
		    VirtualMachine vm = (VirtualMachine) new InventoryNavigator(
		        rootFolder).searchManagedE<wbr ></wbr>ntity(
		            "VirtualMachine", vmname);
		    
		 //   Datacenter dc = (Datacenter) new InventoryNavigator(
		        //    rootFolder).searchManagedE<wbr ></wbr>ntity("Dat<wbr ></wbr>acenter", dcName);
		 //   ResourcePool rp = (ResourcePool) new InventoryNavigator(
		           // dc).searchManagedEntities(<wbr ></wbr>"ResourceP<wbr ></wbr>ool")[0];


		    if(vm==null)
		    {
		      System.out.println("No VM " + vmname + " found");
		      si.getServerConnection().l<wbr ></wbr>ogout();
		      return;
		    }

		    VirtualMachineCloneSpec cloneSpec = 
		      new VirtualMachineCloneSpec();<wbr ></wbr>
		    
		    
		   
		    cloneSpec.setLocation(new VirtualMachineRelocateSpec<wbr ></wbr>());
		    cloneSpec.setPowerOn(false<wbr ></wbr>);
		    cloneSpec.setTemplate(fals<wbr ></wbr>e);
		   
		  

		    Task task = vm.cloneVM_Task((Folder) vm.getParent(), 
		        cloneName, cloneSpec);
		    System.out.println("Launch<wbr ></wbr>ing the VM clone task. " +
		    		"Please wait ...");

		    String status = task.waitForMe();
		    if(status==Task.SUCCESS)
		    {
		      System.out.println("VM got cloned successfully.");
		    }
		    else
		    {
		      System.out.println("Failur<wbr ></wbr>e -: VM cannot be cloned");
		    }
		}

Open in new window

0
Comment
Question by:HyperBPP
  • 3
  • 2
5 Comments
 
LVL 5

Assisted Solution

by:Uni Kitty
Uni Kitty earned 2000 total points
ID: 40355627
Hi Hyper,

I'm not a programmer but I have some VMware resources that may help you troubleshoot this problem.

First have a look at the vSphere 5.0 SDK guides if you haven't already, the location.pool is only required for templates, which is probably why it works for a running VM if you're not specifying it.

Check out:
http://pubs.vmware.com/vsphere-50/index.jsp?topic=%2Fcom.vmware.wssdk.apiref.doc_50%2Fvim.VirtualMachine.html&path=5_0_2_5_3_21

Check out this fling tool from VMware, called Onyx, you can use this on the vCenter Server and have Onyx launch the vSphere client, then it will output the XML of whatever tasks you're doing. you might find this useful. It will tell you what things should look like.

Good luck!
Melly
0
 
LVL 5

Expert Comment

by:Uni Kitty
ID: 40359858
Hi There! Just checking back to see if you were able to figure it out?
0
 
LVL 6

Accepted Solution

by:
HyperBPP earned 0 total points
ID: 40370910
Yeah, sorry for the delay.  This is for work so my job dictates my schedule on when I can work on stuff.  I figured it out:

 VirtualMachine vm = (VirtualMachine) new InventoryNavigator(
                     rootFolder).searchManagedEntity(
                         "VirtualMachine", vmname);
                 
                 Datacenter dc = (Datacenter) new InventoryNavigator(
                         rootFolder).searchManagedEntity("Datacenter", dcName);
                 ResourcePool rp = (ResourcePool) new InventoryNavigator(
                         dc).searchManagedEntities("ResourcePool")[0];

 locateSpec.setPool(rp.getMOR());
            
              cloneSpec.setLocation(locateSpec);

Thanks!
0
 
LVL 5

Expert Comment

by:Uni Kitty
ID: 40370955
Great! I'm glad you got it working!
0
 
LVL 6

Author Closing Comment

by:HyperBPP
ID: 40379415
The actual solution which the expert comment led me too is shown in my answer.
0

Featured Post

2017 Webroot Threat Report

MSPs: Get the facts you need to protect your clients.
The 2017 Webroot Threat Report provides a uniquely insightful global view into the analysis and discoveries made by the Webroot® Threat Intelligence Platform to provide insights on key trends and risks as seen by our users.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The following article is comprised of the pearls we have garnered deploying virtualization solutions since Virtual Server 2005 and subsequent 2008 RTM+ Hyper-V in standalone and clustered environments.
Herein one will find an aggregate of some of my experience building and deploying virtualization stacks both in standalone, clustered Hyper-V, clustered Hyper-V with a Scale-Out File Server (SOFS) backend, and Storage Spaces Direct (S2D).
This video teaches viewers about errors in exception handling.
This video shows you how to use a vSphere client to connect to your ESX host as the root user. Demonstrates the basic connection of bypassing certification set up. Demonstrates how to access the traditional view to begin managing your virtual mac…
Suggested Courses

581 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question