create_vm_request.set_element_config(config) folder_mor = create_vm_request.new__this(vmfmor) folder_mor.set_attribute_type(vmfmor.get_attribute_type()) create_vm_request.set_element__this(folder_mor) rp_mor = create_vm_request.new_pool(rpmor) rp_mor.set_attribute_type(rpmor.get_attribute_type()) create_vm_request.set_element_pool(rp_mor) host_mor = create_vm_request.new_host(hostmor) host_mor.set_attribute_type(hostmor.get_attribute_type()) create_vm_request.set_element_host(host_mor) # CREATE THE VM taskmor = vsphere_client._proxy.CreateVM_Task(create_vm_request)._returnval task = VITask(taskmor, vsphere_client) task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR]) if task.get_state() == task.STATE_ERROR: vsphere_client.disconnect() module.fail_json(msg="Error creating vm: %s" % task.get_error_message()) else: # We always need to get the vm because we are going to gather facts vm = vsphere_client.get_vm_by_name(guest) # VM was created. If there is any extra config options specified, set # them here , disconnect from vcenter, then exit. if vm_extra_config: vm.set_extra_config(vm_extra_config) # Power on the VM if it was requested power_state(vm, state, True)
# Add a CD-ROM device to the VM. add_cdrom("iso", cd_iso_location) add_nic("vmxnet3", network_name, "dvs") #add_nic("vmxnet3", "VM Network", "standard") config.set_element_deviceChange(devices) create_vm_request.set_element_config(config) folder_mor = create_vm_request.new__this(vmfmor) folder_mor.set_attribute_type(vmfmor.get_attribute_type()) create_vm_request.set_element__this(folder_mor) rp_mor = create_vm_request.new_pool(rpmor) rp_mor.set_attribute_type(rpmor.get_attribute_type()) create_vm_request.set_element_pool(rp_mor) host_mor = create_vm_request.new_host(hostmor) host_mor.set_attribute_type(hostmor.get_attribute_type()) create_vm_request.set_element_host(host_mor) # CREATE THE VM taskmor = s._proxy.CreateVM_Task(create_vm_request)._returnval task = VITask(taskmor, s) task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR]) if task.get_state() == task.STATE_ERROR: raise Exception("Error creating vm: %s" % task.get_error_message()) # If there is any extra config options specified, set them here. if extra_config: vm = s.get_vm_by_name(vmname) vm.set_extra_config(extra_config) s.disconnect()
def create_vm(self, vm_options): """ Creates a virtual machine on ESXi server :param vm_options: dict, which contain parameters for VM 'vm_name' 'iso' 'datacenter_name' 'datastore_name' 'resource_pool_name' 'networks' 'description' 'esx_hostname' 'hard_drive' 'guestosid' 'memory_size' 'cpu_count' 'disk_size' See create_vm_old for details :raise: CreatorException, ExistenceException """ self._connect_to_esx() # VM NAME vm_name = None try: vm_name = str(vm_options["vm_name"]) vm_temp = self.esx_server.get_vm_by_name(vm_name) if vm_temp: raise ExistenceException('VM "%s" already exists' % vm_name) except KeyError: raise CreatorException("Must specify VM name") except pysphere.VIException as inst: if "[Object Not Found]" in str(inst): pass # HOSTNAME hosts = self.esx_server.get_hosts() try: esx_hostname = vm_options["esx_hostname"] if not esx_hostname: raise KeyError elif not (esx_hostname in hosts.values()): raise CreatorException("Couldn't find host '%s'" % esx_hostname) except KeyError: if len(hosts.values()) > 1: raise CreatorException("More than 1 host - must specify ESX Hostname") elif not hosts.values(): raise CreatorException("Couldn't find available host") esx_hostname = hosts[0] # MOR and PROPERTIES hostmor = [k for k, v in hosts.items() if v == esx_hostname][0] hostprop = VIProperty(self.esx_server, hostmor) # DATACENTER - FIX EXCEPTION # todo: fix self.esx_server.get_datacenters().values() dcs = self.esx_server.get_datacenters() dc_values = dcs.values() try: dc_name = vm_options["datacenter_name"] if not dc_name in dc_values: raise CreatorException("Couldn't find datacenter '%s'" + dc_name) except KeyError: if len(dc_values) > 1: raise CreatorException("More than 1 datacenter - must specify ESX Hostname") elif not dc_values: raise CreatorException("Couldn't find available datacenter") dc_name = dc_values[0] # MOR and PROPERTIES dcmor = [k for k, v in dcs.items() if v == dc_name][0] dcprops = VIProperty(self.esx_server, dcmor) # DATASTORE dcs = hostprop.datastore try: ds_name = vm_options["datastore_name"] ds_list = [] for ds in dcs: ds_list.append(ds.name) if not ds_name in ds_list: raise CreatorException("Couldn't find datastore or datastore is not available") except KeyError: if len(dcs) > 1: raise CreatorException("More than 1 datastore on ESX - must specify datastore name") elif not dcs: raise CreatorException("Couldn't find available datastore") ds_name = dcs[0].name # RESOURCE POOL resource_pool_name = "" try: resource_pool_name = vm_options["resource_pool_name"] if resource_pool_name == "/": pass elif resource_pool_name[0] != "/": resource_pool_name = "/{0}".format(resource_pool_name) except KeyError: resource_pool_name = "/" finally: rpmor = self._fetch_resource_pool(resource_pool_name, esx_hostname) if not rpmor: raise CreatorException("Couldn't find resource pool '%s'" % resource_pool_name) # NETWORKS try: networks = list(vm_options["networks"]) except Exception: networks = [] try: iso = vm_options["iso"] if iso == False: iso = None else: # todo: hide magic iso = iso[iso.find(ds_name) + len(ds_name) + 1 :] except KeyError: iso = None # Description try: description = vm_options["description"] except KeyError: description = "Description for VM %s" % vm_name try: guestosid = vm_options["guestosid"] except KeyError: guestosid = "otherGuest" try: memory_size = int(vm_options["memory_size"]) if memory_size <= 0: raise CreatorException("Disk size must be greater than 0") except Exception: memory_size = DEFAULT_MEMORY_SIZE # MB try: cpu_count = int(vm_options["cpu_count"]) except Exception: cpu_count = DEFAULT_CPU_COUNT try: disk_size = int(vm_options["disk_size"]) if disk_size < 0: raise CreatorException("Disk size must be greater than 0") except Exception: disk_size = DEFAULT_DISK_SIZE # KB crprops = self._fetch_computer_resource(dcprops, hostmor) vmfmor = dcprops.vmFolder._obj # CREATE VM CONFIGURATION # get config target request = VI.QueryConfigTargetRequestMsg() _this = request.new__this(crprops.environmentBrowser._obj) _this.set_attribute_type(crprops.environmentBrowser._obj.get_attribute_type()) request.set_element__this(_this) h = request.new_host(hostmor) h.set_attribute_type(hostmor.get_attribute_type()) request.set_element_host(h) config_target = self.esx_server._proxy.QueryConfigTarget(request)._returnval # get default devices request = VI.QueryConfigOptionRequestMsg() _this = request.new__this(crprops.environmentBrowser._obj) _this.set_attribute_type(crprops.environmentBrowser._obj.get_attribute_type()) request.set_element__this(_this) h = request.new_host(hostmor) h.set_attribute_type(hostmor.get_attribute_type()) request.set_element_host(h) config_option = self.esx_server._proxy.QueryConfigOption(request)._returnval defaul_devs = config_option.DefaultDevice # get network name avaliable_networks = 0 for net in networks: for n in config_target.Network: if n.Network.Accessible and n.Network.Name == net: avaliable_networks += 1 break if len(networks) != avaliable_networks: msg = "" for n in config_target.Network: msg = "%s %s" % (msg, str(n.Network.Name)) raise CreatorException("Couldn't find all networks; founded: %s" % msg) # raise ExistenceException("Couldn't find network") # get datastore ds = None for d in config_target.Datastore: if d.Datastore.Accessible and d.Datastore.Name == ds_name: ds = d.Datastore.Datastore ds_name = d.Datastore.Name break if not ds: raise CreatorException("Datastore is not available") volume_name = "[%s]" % ds_name # add parameters to the create vm task create_vm_request = VI.CreateVM_TaskRequestMsg() config = create_vm_request.new_config() vmfiles = config.new_files() vmfiles.set_element_vmPathName(volume_name) config.set_element_files(vmfiles) config.set_element_name(vm_name) config.set_element_annotation(description) config.set_element_memoryMB(memory_size) config.set_element_numCPUs(cpu_count) config.set_element_guestId(guestosid) devices = [] # add a scsi controller disk_ctrl_key = 1 scsi_ctrl_spec = config.new_deviceChange() scsi_ctrl_spec.set_element_operation("add") scsi_ctrl = VI.ns0.VirtualLsiLogicController_Def("scsi_ctrl").pyclass() scsi_ctrl.set_element_busNumber(0) scsi_ctrl.set_element_key(disk_ctrl_key) scsi_ctrl.set_element_sharedBus("noSharing") scsi_ctrl_spec.set_element_device(scsi_ctrl) devices.append(scsi_ctrl_spec) # find ide controller if iso: ide_ctlr = None for dev in defaul_devs: if dev.typecode.type[1] == "VirtualIDEController": ide_ctlr = dev # add a cdrom based on a physical device if ide_ctlr: cd_spec = config.new_deviceChange() cd_spec.set_element_operation("add") cd_ctrl = VI.ns0.VirtualCdrom_Def("cd_ctrl").pyclass() cd_device_backing = VI.ns0.VirtualCdromIsoBackingInfo_Def("cd_device_backing").pyclass() ds_ref = cd_device_backing.new_datastore(ds) ds_ref.set_attribute_type(ds.get_attribute_type()) cd_device_backing.set_element_datastore(ds_ref) cd_device_backing.set_element_fileName("%s %s" % (volume_name, iso)) cd_ctrl.set_element_backing(cd_device_backing) cd_ctrl.set_element_key(20) cd_ctrl.set_element_controllerKey(ide_ctlr.get_element_key()) cd_ctrl.set_element_unitNumber(0) cd_spec.set_element_device(cd_ctrl) devices.append(cd_spec) # create a new disk - file based - for the vm if disk_size != 0: disk_spec = config.new_deviceChange() disk_spec.set_element_fileOperation("create") disk_spec.set_element_operation("add") disk_ctlr = VI.ns0.VirtualDisk_Def("disk_ctlr").pyclass() disk_backing = VI.ns0.VirtualDiskFlatVer2BackingInfo_Def("disk_backing").pyclass() disk_backing.set_element_fileName(volume_name) disk_backing.set_element_diskMode("persistent") disk_ctlr.set_element_key(0) disk_ctlr.set_element_controllerKey(disk_ctrl_key) disk_ctlr.set_element_unitNumber(0) disk_ctlr.set_element_backing(disk_backing) disk_ctlr.set_element_capacityInKB(disk_size) disk_spec.set_element_device(disk_ctlr) devices.append(disk_spec) # add a NIC. the network Name must be set as the device name to create the NIC. for network_name in networks: nic_spec = config.new_deviceChange() nic_spec.set_element_operation("add") nic_ctlr = VI.ns0.VirtualPCNet32_Def("nic_ctlr").pyclass() nic_backing = VI.ns0.VirtualEthernetCardNetworkBackingInfo_Def("nic_backing").pyclass() nic_backing.set_element_deviceName(network_name) nic_ctlr.set_element_addressType("generated") nic_ctlr.set_element_backing(nic_backing) nic_ctlr.set_element_key(4) nic_spec.set_element_device(nic_ctlr) devices.append(nic_spec) config.set_element_deviceChange(devices) create_vm_request.set_element_config(config) folder_mor = create_vm_request.new__this(vmfmor) folder_mor.set_attribute_type(vmfmor.get_attribute_type()) create_vm_request.set_element__this(folder_mor) rp_mor = create_vm_request.new_pool(rpmor) rp_mor.set_attribute_type(rpmor.get_attribute_type()) create_vm_request.set_element_pool(rp_mor) host_mor = create_vm_request.new_host(hostmor) host_mor.set_attribute_type(hostmor.get_attribute_type()) create_vm_request.set_element_host(host_mor) # CREATE THE VM - add option "wait" taskmor = self.esx_server._proxy.CreateVM_Task(create_vm_request)._returnval task = VITask(taskmor, self.esx_server) task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR]) if task.get_state() == task.STATE_ERROR: self._disconnect_from_esx() raise CreatorException("Error creating vm: %s" % task.get_error_message())
def createGuest(host_con,guest_dc,guest_host,guest_name,guest_ver,guest_mem,guest_cpu,guest_iso,guest_os,guest_disk_gb,guest_ds,guest_network,guest_enterbios): #get dc MOR from list dc_list=[k for k,v in host_con.get_datacenters().items() if v==guest_dc] if dc_list: dc_mor=dc_list[0] else: host_con.disconnect() return "Cannot find dc: "+guest_dc dc_props=VIProperty(host_con, dc_mor) #get vmFolder vmf_mor = dc_props.vmFolder._obj #get hostfolder MOR hf_mor=dc_props.hostFolder._obj #get computer resources MORs cr_mors=host_con._retrieve_properties_traversal(property_names=['name','host'],from_node=hf_mor,obj_type='ComputeResource') #get host MOR try: host_mor=[k for k,v in host_con.get_hosts().items() if v==guest_host][0] except IndexError: host_con.disconnect() return "Cannot find host: "+guest_host #get computer resource MOR for host cr_mor=None for cr in cr_mors: if cr_mor: break for p in cr.PropSet: if p.Name=="host": for h in p.Val.get_element_ManagedObjectReference(): if h==host_mor: cr_mor=cr.Obj break if cr_mor: break cr_props=VIProperty(host_con,cr_mor) #get resource pool MOR rp_mor=cr_props.resourcePool._obj #build guest properties #get config target request=VI.QueryConfigTargetRequestMsg() _this=request.new__this(cr_props.environmentBrowser._obj) _this.set_attribute_type(cr_props.environmentBrowser._obj.get_attribute_type()) request.set_element__this(_this) h=request.new_host(host_mor) h.set_attribute_type(host_mor.get_attribute_type()) request.set_element_host(h) config_target=host_con._proxy.QueryConfigTarget(request)._returnval #get default devices request=VI.QueryConfigOptionRequestMsg() _this=request.new__this(cr_props.environmentBrowser._obj) _this.set_attribute_type(cr_props.environmentBrowser._obj.get_attribute_type()) request.set_element__this(_this) h=request.new_host(host_mor) h.set_attribute_type(host_mor.get_attribute_type()) request.set_element_host(h) config_option=host_con._proxy.QueryConfigOption(request)._returnval defaul_devs=config_option.DefaultDevice #get network names if guest_network: net_name=guest_network else: for net in config_target.Network: if net.Network.Accessible: net_name = net.Network.Name #get ds ds_target = None for d in config_target.Datastore: if d.Datastore.Accessible and (guest_ds and d.Datastore.Name==guest_ds) or (not guest_ds): ds_target=d.Datastore.Datastore guest_ds=d.Datastore.Name break if not ds_target: host_con.disconnect() return "Cannot find datastore: "+guest_ds ds_vol_name="[%s]" % guest_ds #create task request create_vm_request=VI.CreateVM_TaskRequestMsg() config=create_vm_request.new_config() #set location of vmx vm_files=config.new_files() vm_files.set_element_vmPathName(ds_vol_name) config.set_element_files(vm_files) if guest_enterbios: #set boot parameters vmboot=config.new_bootOptions() vmboot.set_element_enterBIOSSetup(True) config.set_element_bootOptions(vmboot) #set general parameters config.set_element_version(guest_ver) config.set_element_name(guest_name) config.set_element_memoryMB(guest_mem) config.set_element_memoryHotAddEnabled(True) config.set_element_numCPUs(guest_cpu) config.set_element_guestId(guest_os) config.set_element_cpuHotAddEnabled(True) #create devices devices = [] #add controller to devices disk_ctrl_key=1 scsi_ctrl_spec=config.new_deviceChange() scsi_ctrl_spec.set_element_operation('add') scsi_ctrl=VI.ns0.ParaVirtualSCSIController_Def("scsi_ctrl").pyclass() scsi_ctrl.set_element_busNumber(0) scsi_ctrl.set_element_key(disk_ctrl_key) scsi_ctrl.set_element_sharedBus("noSharing") scsi_ctrl_spec.set_element_device(scsi_ctrl) devices.append(scsi_ctrl_spec) #find ide controller ide_ctlr = None for dev in defaul_devs: if dev.typecode.type[1] == "VirtualIDEController": ide_ctlr = dev #add cdrom if ide_ctlr: cd_spec = config.new_deviceChange() cd_spec.set_element_operation('add') cd_ctrl = VI.ns0.VirtualCdrom_Def("cd_ctrl").pyclass() cd_device_backing =VI.ns0.VirtualCdromIsoBackingInfo_Def("cd_device_backing").pyclass() ds_ref = cd_device_backing.new_datastore(ds_target) ds_ref.set_attribute_type(ds_target.get_attribute_type()) cd_device_backing.set_element_datastore(ds_ref) cd_device_backing.set_element_fileName("%s %s" % (ds_vol_name,guest_iso)) cd_ctrl.set_element_backing(cd_device_backing) cd_ctrl.set_element_key(20) cd_ctrl.set_element_controllerKey(ide_ctlr.get_element_key()) cd_ctrl.set_element_unitNumber(0) cd_spec.set_element_device(cd_ctrl) devices.append(cd_spec) #add disk disk_spec=config.new_deviceChange() disk_spec.set_element_fileOperation("create") disk_spec.set_element_operation("add") disk_ctlr=VI.ns0.VirtualDisk_Def("disk_ctlr").pyclass() disk_backing=VI.ns0.VirtualDiskFlatVer2BackingInfo_Def("disk_backing").pyclass() disk_backing.set_element_fileName(ds_vol_name) disk_backing.set_element_diskMode("persistent") disk_ctlr.set_element_key(0) disk_ctlr.set_element_controllerKey(disk_ctrl_key) disk_ctlr.set_element_unitNumber(0) disk_ctlr.set_element_backing(disk_backing) guest_disk_size=guest_disk_gb*1024*1024 disk_ctlr.set_element_capacityInKB(guest_disk_size) disk_spec.set_element_device(disk_ctlr) devices.append(disk_spec) #add a network controller nic_spec = config.new_deviceChange() if net_name: nic_spec.set_element_operation("add") nic_ctlr = VI.ns0.VirtualVmxnet3_Def("nic_ctlr").pyclass() nic_backing = VI.ns0.VirtualEthernetCardNetworkBackingInfo_Def("nic_backing").pyclass() nic_backing.set_element_deviceName(net_name) nic_ctlr.set_element_addressType("generated") nic_ctlr.set_element_backing(nic_backing) nic_ctlr.set_element_key(4) nic_spec.set_element_device(nic_ctlr) devices.append(nic_spec) #create vm request config.set_element_deviceChange(devices) create_vm_request.set_element_config(config) new_vmf_mor=create_vm_request.new__this(vmf_mor) new_vmf_mor.set_attribute_type(vmf_mor.get_attribute_type()) new_rp_mor=create_vm_request.new_pool(rp_mor) new_rp_mor.set_attribute_type(rp_mor.get_attribute_type()) new_host_mor=create_vm_request.new_host(host_mor) new_host_mor.set_attribute_type(host_mor.get_attribute_type()) create_vm_request.set_element__this(new_vmf_mor) create_vm_request.set_element_pool(new_rp_mor) create_vm_request.set_element_host(new_host_mor) #finally actually create the guest :) task_mor=host_con._proxy.CreateVM_Task(create_vm_request)._returnval task=VITask(task_mor,host_con) task.wait_for_state([task.STATE_SUCCESS,task.STATE_ERROR]) if task.get_state()==task.STATE_ERROR: return "Cannot create guest: "+task.get_error_message() else: return "Succesfully created guest: "+guest_name
def create_vm(): opts = options() # CONNECTION PARAMTERS server = opts.esx_host user = opts.user password = opts.passwd # REQUIRED PARAMETERS vmname = opts.name # datacentername = "ha-datacenter" datacentername = opts.datacenter hostname = opts.hostname annotation = "My Product Product Virtual Machine" memorysize = opts.ram cpucount = opts.cpus # cd_iso_location = # "iso/My_Product_2013_02_26_05_15_00.iso" # # located in the ESX datastore cd_iso_location = opts.iso guestosid = "centos64Guest" # find your os in # http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.vm.GuestOsDescriptor.GuestOsIdentifier.html disksize = (1024 ** 2) * 100 # In Kb: 1024 ** 2 (power) = 1GB; 1GB * 100 = 100GB. # OPTIONAL PARAMETERS datastorename = opts.datastore # if None, will use the first datastore available # CONNECT TO THE SERVER s = VIServer() s.connect(server, user, password) # GET INITIAL PROPERTIES AND OBJECTS # get datacenter dcmor = s._get_datacenters()[datacentername] dcprops = VIProperty(s, dcmor) # get host folder hfmor = dcprops.hostFolder._obj # get computer resources crmors = s._retrieve_properties_traversal(property_names=['name', 'host'], from_node=hfmor, obj_type='ComputeResource') # get host for hosts in s.get_hosts().items(): try: if hosts.index(hostname) == 1: hostmor = hosts[0] except: pass # get computer resource of this host crmor = None for cr in crmors: if crmor: break for p in cr.PropSet: # print 'p.Name:', p.Name if p.Name == "host": for h in p.Val.get_element_ManagedObjectReference(): if h == hostmor: crmor = cr.Obj break if crmor: break crprops = VIProperty(s, crmor) # get resource pool rpmor = crprops.resourcePool._obj # get vmFolder vmfmor = dcprops.vmFolder._obj # CREATE VM CONFIGURATION # get config target request = VI.QueryConfigTargetRequestMsg() _this = request.new__this(crprops.environmentBrowser._obj) _this.set_attribute_type(crprops.environmentBrowser._obj.get_attribute_type()) request.set_element__this(_this) h = request.new_host(hostmor) h.set_attribute_type(hostmor.get_attribute_type()) request.set_element_host(h) config_target = s._proxy.QueryConfigTarget(request)._returnval # get default devices request = VI.QueryConfigOptionRequestMsg() _this = request.new__this(crprops.environmentBrowser._obj) _this.set_attribute_type(crprops.environmentBrowser._obj.get_attribute_type()) request.set_element__this(_this) h = request.new_host(hostmor) h.set_attribute_type(hostmor.get_attribute_type()) request.set_element_host(h) config_option = s._proxy.QueryConfigOption(request)._returnval defaul_devs = config_option.DefaultDevice # get network name # would be assigned to the last known working network interface. # in this case, it would be VM Network 2. network_name = None for n in config_target.Network: if n.Network.Accessible: network_name = n.Network.Name # can hard-code it as 'VM Network' # get datastore # Just verifies that the datastorename mentioned at the top matches with the # available list of datastores. ds = None for d in config_target.Datastore: if d.Datastore.Accessible and (datastorename and d.Datastore.Name == datastorename) or (not datastorename): ds = d.Datastore.Datastore datastorename = d.Datastore.Name break if not ds: raise Exception("couldn't find datastore") volume_name = "[%s]" % datastorename # add parameters to the create vm task create_vm_request = VI.CreateVM_TaskRequestMsg() config = create_vm_request.new_config() vmfiles = config.new_files() vmfiles.set_element_vmPathName(volume_name) config.set_element_files(vmfiles) config.set_element_name(vmname) config.set_element_annotation(annotation) config.set_element_memoryMB(memorysize) config.set_element_numCPUs(cpucount) config.set_element_guestId(guestosid) devices = [] # add a scsi controller disk_ctrl_key = 1 scsi_ctrl_spec = config.new_deviceChange() scsi_ctrl_spec.set_element_operation('add') scsi_ctrl = VI.ns0.VirtualLsiLogicController_Def("scsi_ctrl").pyclass() scsi_ctrl.set_element_busNumber(0) scsi_ctrl.set_element_key(disk_ctrl_key) scsi_ctrl.set_element_sharedBus("noSharing") scsi_ctrl_spec.set_element_device(scsi_ctrl) devices.append(scsi_ctrl_spec) # find ide controller ide_ctlr = None for dev in defaul_devs: if dev.typecode.type[1] == "VirtualIDEController": ide_ctlr = dev # add a cdrom based on a physical device if ide_ctlr: cd_spec = config.new_deviceChange() cd_spec.set_element_operation('add') cd_ctrl = VI.ns0.VirtualCdrom_Def("cd_ctrl").pyclass() cd_device_backing = VI.ns0.VirtualCdromIsoBackingInfo_Def("cd_device_backing").pyclass() ds_ref = cd_device_backing.new_datastore(ds) ds_ref.set_attribute_type(ds.get_attribute_type()) cd_device_backing.set_element_datastore(ds_ref) cd_device_backing.set_element_fileName("%s %s" % (volume_name, cd_iso_location)) cd_ctrl.set_element_backing(cd_device_backing) cd_ctrl.set_element_key(20) cd_ctrl.set_element_controllerKey(ide_ctlr.get_element_key()) cd_ctrl.set_element_unitNumber(0) cd_spec.set_element_device(cd_ctrl) devices.append(cd_spec) # create a new disk - file based - for the vm disk_spec = config.new_deviceChange() disk_spec.set_element_fileOperation("create") disk_spec.set_element_operation("add") disk_ctlr = VI.ns0.VirtualDisk_Def("disk_ctlr").pyclass() disk_backing = VI.ns0.VirtualDiskFlatVer2BackingInfo_Def("disk_backing").pyclass() disk_backing.set_element_fileName(volume_name) disk_backing.set_element_diskMode("persistent") disk_backing.ThinProvisioned = True disk_ctlr.set_element_key(0) disk_ctlr.set_element_controllerKey(disk_ctrl_key) disk_ctlr.set_element_unitNumber(0) disk_ctlr.set_element_backing(disk_backing) disk_ctlr.set_element_capacityInKB(disksize) disk_spec.set_element_device(disk_ctlr) devices.append(disk_spec) # add a NIC. the network Name must be set as the device name to create the NIC. nic_spec = config.new_deviceChange() if network_name: nic_spec.set_element_operation("add") nic_ctlr = VI.ns0.VirtualPCNet32_Def("nic_ctlr").pyclass() nic_backing = VI.ns0.VirtualEthernetCardNetworkBackingInfo_Def("nic_backing").pyclass() nic_backing.set_element_deviceName(network_name) nic_ctlr.set_element_addressType("generated") nic_ctlr.set_element_backing(nic_backing) nic_ctlr.set_element_key(4) nic_spec.set_element_device(nic_ctlr) devices.append(nic_spec) config.set_element_deviceChange(devices) create_vm_request.set_element_config(config) folder_mor = create_vm_request.new__this(vmfmor) folder_mor.set_attribute_type(vmfmor.get_attribute_type()) create_vm_request.set_element__this(folder_mor) rp_mor = create_vm_request.new_pool(rpmor) rp_mor.set_attribute_type(rpmor.get_attribute_type()) create_vm_request.set_element_pool(rp_mor) host_mor = create_vm_request.new_host(hostmor) host_mor.set_attribute_type(hostmor.get_attribute_type()) create_vm_request.set_element_host(host_mor) # CREATE THE VM taskmor = s._proxy.CreateVM_Task(create_vm_request)._returnval task = VITask(taskmor, s) task.wait_for_state([task.STATE_SUCCESS, task.STATE_ERROR]) if task.get_state() == task.STATE_ERROR: raise Exception("Error creating vm: %s" % task.get_error_message()) # Here you should power your VM (refer to the pysphere documentation) # So it boots from the specified ISO location try: new_vm = s.get_vm_by_name(opts.name) connect_vm_cdroms(new_vm, s) try: new_vm.power_on() except Exception as e: print "Failed to power-on the new VM using:", opts.name print "Exception:", str(e) except Exception as e: print "Failed to locate the new VM using:", opts.name print "Exception:", str(e) # disconnect from the server s.disconnect()