def run(self, name, template_id, datacenter_id, resourcepool_id, datastore_id, vsphere=None): self.establish_connection(vsphere) # convert ids to stubs template = inventory.get_virtualmachine(self.si_content, template_id) datacenter = inventory.get_datacenter(self.si_content, datacenter_id) resourcepool = inventory.get_resource_pool(self.si_content, resourcepool_id) datastore = inventory.get_datastore(self.si_content, datastore_id) # prep objects for consumption target_folder = datacenter.vmFolder # relocate spec relocatespec = vim.vm.RelocateSpec() relocatespec.datastore = datastore relocatespec.pool = resourcepool # clone spec clonespec = vim.vm.CloneSpec() clonespec.location = relocatespec clonespec.powerOn = False clonespec.template = False task = template.CloneVM_Task(folder=target_folder, name=name, spec=clonespec) self._wait_for_task(task) if task.info.state != vim.TaskInfo.State.success: raise Exception(task.info.error.msg) return {'task_id': task._moId, 'vm_id': task.info.result._moId}
def run(self, name, template_id, datacenter_id, resourcepool_id, datastore_id): # convert ids to stubs template = inventory.get_virtualmachine(self.service_instance, template_id) datacenter = inventory.get_datacenter(self.service_instance, datacenter_id) resourcepool = inventory.get_resource_pool(self.service_instance, resourcepool_id) datastore = inventory.get_datastore(self.service_instance, datastore_id) # prep objects for consumption target_folder = datacenter.vmFolder # relocate spec relocatespec = vim.vm.RelocateSpec() relocatespec.datastore = datastore relocatespec.pool = resourcepool # clone spec clonespec = vim.vm.CloneSpec() clonespec.location = relocatespec clonespec.powerOn = False clonespec.template = False task = template.CloneVM_Task(folder=target_folder, name=name, spec=clonespec) self._wait_for_task(task) if task.info.state != vim.TaskInfo.State.success: raise Exception(task.info.error.msg) return {'task_id': task._moId, 'vm_id': task.info.result._moId}
def run(self, vm_name, cluster, datastore_cluster, datastore, resourcepool, cpu_size, ram_size, guestos, version, description, vsphere=None): """ Create barebones VM (CPU/RAM/Graphics) Args: - vm_name: Name of Virtual Machine to create - vsphere: Pre-configured vsphere connection details (config.yaml) - description: Short Description of VM and it's purpose - cpu_size: Number of vCPUs to allocate - ram_size: Ammount of memory to assign (GB) - datastore_cluster: name of DataStore Cluster to use for VM Files - datastore: Individual datastore to put vm files within. Not needed if datastore_cluster is set - cluster: Cluster within vsphere to host virtual machine - version: VM version to set - guestos: Code for GuestOS that will be installed on this VM - resourepool: vsphere resource pool to assign new VM to Returns: - dict: vm moid of newly created vm """ # Setup Identifiers for objects self.establish_connection(vsphere) si = self.si si_content = si.RetrieveContent() # checkinputs.vm_storage(datastore_cluster, datastore) checkinputs.one_of_two_strings(datastore_cluster, datastore, "Datastore Cluster or Datastore") data_center = self.si_content.rootFolder.childEntity[0] cluster = inventory.get_cluster(self.si_content, name=cluster) data_store_cluster = inventory.get_datastore_cluster( self.si_content, name=datastore_cluster) # data_store = inventory.get_datastore(self.si_content, name=datastore) target_folder = data_center.vmFolder # If No Resource Pool issued the Default one for # the Cluster will be selected. if resourcepool: resource_pool = inventory.get_resource_pool(self.si_content, name=resourcepool) else: resource_pool = cluster.resourcePool # Config created that is required for DS selection # Config is BareBones, CPU RAM no more. config = vim.vm.ConfigSpec(name=vm_name, memoryMB=(ram_size * 1024), numCPUs=cpu_size, guestId=guestos, version=version, cpuHotAddEnabled=True, memoryHotAddEnabled=True, annotation=description) # if Datastore cluster is provided it will find the # recommended Datastore to store VM files if datastore_cluster: podsel = vim.storageDrs.PodSelectionSpec() podsel.storagePod = data_store_cluster storage_spec = vim.storageDrs.StoragePlacementSpec( type='create', configSpec=config, resourcePool=resource_pool, podSelectionSpec=podsel, folder=target_folder) # Create Instance of Storage Resource Manager - # This is used to identify a Recommended Datastore from a Cluster srm = si_content.storageResourceManager results = srm.RecommendDatastores(storageSpec=storage_spec) rec_ds = results.recommendations[0].action[0]\ .relocateSpec.datastore datastore_path = '[' + rec_ds.name + '] ' + vm_name else: # No Datastore Cluster has been offered so using the D if datastore: datastore_path = '[' + datastore + '] ' + vm_name else: raise Exception('Error No Storage Data Provided') # Now Datastore is known the remaining # of VM Config can be setup and added vmx_file = vim.vm.FileInfo(logDirectory=None, snapshotDirectory=None, suspendDirectory=None, vmPathName=datastore_path) config.files = vmx_file # Create task to Build actual Machine task = target_folder.CreateVM_Task(config=config, pool=resource_pool) self._wait_for_task(task) if task.info.state != vim.TaskInfo.State.success: raise Exception(task.info.error.msg) return {'vm_id': task.info.result._moId}
def run(self, name, template_id, datacenter_id, resourcepool_id, datastore_id, vsphere=None, networks=[]): is_success = True self.establish_connection(vsphere) # convert ids to stubs template = inventory.get_virtualmachine(self.si_content, template_id) datacenter = inventory.get_datacenter(self.si_content, datacenter_id) resourcepool = inventory.get_resource_pool(self.si_content, resourcepool_id) datastore = inventory.get_datastore(self.si_content, datastore_id) # prep objects for consumption target_folder = datacenter.vmFolder # relocate spec relocatespec = vim.vm.RelocateSpec() relocatespec.datastore = datastore relocatespec.pool = resourcepool # When the customize parameters for the network-adapters are specified, # this makes a configration to customize a deploying virtual machine. # (By default, this customizes nothing) custom_adapters = [] for network in networks: # The validator for the 'networks' parameter is needed because of # the restriction[*1] that there is no validation processing for the # array type value in the action parameter yet. # # [*1] https://github.com/StackStorm/st2/issues/3160 if not self._validate_networks_param(network): break # set customize configuration to set IP address to the network adapters. adaptermap = vim.vm.customization.AdapterMapping() adaptermap.adapter = vim.vm.customization.IPSettings() adaptermap.adapter.ip = vim.vm.customization.FixedIp() adaptermap.adapter.ip.ipAddress = network.get('ipaddr', '0.0.0.0') adaptermap.adapter.subnetMask = network.get( 'netmask', '255.255.255.0') adaptermap.adapter.gateway = network.get('gateway', '0.0.0.0') custom_adapters.append(adaptermap) # clone spec clonespec = vim.vm.CloneSpec() clonespec.location = relocatespec clonespec.powerOn = False clonespec.template = False # customize networ adapter only when the networks parameter is specified if custom_adapters: customspec = vim.vm.customization.Specification() customspec.identity = vim.vm.customization.LinuxPrep( domain=network.get('domain', 'localhost'), hostName=vim.vm.customization.FixedName(name=name)) customspec.nicSettingMap = custom_adapters customspec.globalIPSettings = vim.vm.customization.GlobalIPSettings( ) clonespec.customization = customspec task = template.CloneVM_Task(folder=target_folder, name=name, spec=clonespec) self._wait_for_task(task) if task.info.state != vim.TaskInfo.State.success: is_success = False self.logger.warning(task.info.error.msg) return (is_success, { 'task_id': task._moId, 'vm_id': task.info.result._moId })
def run(self, vm_name, cluster, datastore_cluster, datastore, resourcepool, cpu_size, ram_size, guestos, version, description): # Setup Identifiers for objects si = self.si si_content = si.RetrieveContent() # checkinputs.vm_storage(datastore_cluster, datastore) checkinputs.one_of_two_strings(datastore_cluster, datastore, "Datastore Cluster or Datastore") data_center = self.si_content.rootFolder.childEntity[0] cluster = inventory.get_cluster(self.si_content, name=cluster) data_store_cluster = inventory.get_datastore_cluster( self.si_content, name=datastore_cluster) # data_store = inventory.get_datastore(self.si_content, name=datastore) target_folder = data_center.vmFolder # If No Resource Pool issued the Default one for # the Cluster will be selected. if resourcepool: resource_pool = inventory.get_resource_pool(self.si_content, name=resourcepool) else: resource_pool = cluster.resourcePool # Config created that is required for DS selection # Config is BareBones, CPU RAM no more. config = vim.vm.ConfigSpec(name=vm_name, memoryMB=(ram_size * 1024), numCPUs=cpu_size, guestId=guestos, version=version, cpuHotAddEnabled=True, memoryHotAddEnabled=True, annotation=description) # if Datastore cluster is provided it will find the # recommended Datastore to store VM files if datastore_cluster: podsel = vim.storageDrs.PodSelectionSpec() podsel.storagePod = data_store_cluster storage_spec = vim.storageDrs.StoragePlacementSpec( type='create', configSpec=config, resourcePool=resource_pool, podSelectionSpec=podsel, folder=target_folder) # Create Instance of Storage Resource Manager - # This is used to identify a Recommended Datastore from a Cluster srm = si_content.storageResourceManager results = srm.RecommendDatastores(storageSpec=storage_spec) rec_ds = results.recommendations[0].action[0]\ .relocateSpec.datastore datastore_path = '[' + rec_ds.name + '] ' + vm_name else: # No Datastore Cluster has been offered so using the D if datastore: datastore_path = '[' + datastore + '] ' + vm_name else: raise Exception('Error No Storage Data Provided') # Now Datastore is known the remaining # of VM Config can be setup and added vmx_file = vim.vm.FileInfo(logDirectory=None, snapshotDirectory=None, suspendDirectory=None, vmPathName=datastore_path) config.files = vmx_file # Create task to Build actual Machine task = target_folder.CreateVM_Task(config=config, pool=resource_pool) self._wait_for_task(task) if task.info.state != vim.TaskInfo.State.success: raise Exception(task.info.error.msg) return {'vm_id': task.info.result._moId}