def run(self, vm_id, vm_name, datastore_cluster, datastore, disk_size, provision_type): # ensure that minimal inputs are provided checkinputs.one_of_two_strings(vm_id, vm_name, "ID or Name") vm = inventory.get_virtualmachine(self.si_content, vm_id, vm_name) spec = vim.vm.ConfigSpec() hdd_unit_number = self.get_next_unit_number(vm) ctrl_key = self.get_controller_key(vm) # Prepare new Disk configuration disk_changes = [] disk_spec = vim.vm.device.VirtualDeviceSpec() disk_spec.fileOperation = "create" disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add disk_spec.device = vim.vm.device.VirtualDisk() disk_spec.device.backing =\ vim.vm.device.VirtualDisk.FlatVer2BackingInfo() disk_spec.device.backing.diskMode = "persistent" if provision_type == 'thin': disk_spec.device.backing.thinProvisioned = True disk_spec.device.unitNumber = hdd_unit_number disk_spec.device.capacityInKB = int(disk_size) * 1024 * 1024 disk_spec.device.controllerKey = ctrl_key # If Datastore Cluster is provided attach Disk via that if datastore_cluster: ds_clust_obj = inventory.get_datastore_cluster( self.si_content, name=datastore_cluster) disk_changes.append(disk_spec) spec.deviceChange = disk_changes srm = self.si_content.storageResourceManager storage_placement_spec = self.get_storage_placement_spec( ds_clust_obj, vm, spec) datastores = srm.RecommendDatastores( storageSpec=storage_placement_spec) if not datastores.recommendations: sys.stderr.write('Skipping as No datastore Recommendations') add_disk_task = srm.ApplyStorageDrsRecommendation_Task( datastores.recommendations[0].key) elif datastore: datastore_obj = inventory.get_datastore(self.si_content, name=datastore) disk_spec.device.backing.datastore = datastore_obj disk_changes.append(disk_spec) spec.deviceChange = disk_changes add_disk_task = vm.ReconfigVM_Task(spec) else: disk_changes.append(disk_spec) spec.deviceChange = disk_changes add_disk_task = vm.ReconfigVM_Task(spec) successfully_added_disk = self._wait_for_task(add_disk_task) return {'state': successfully_added_disk}
def run(self, vm_id, vm_name, datastore_cluster, datastore, disk_size, provision_type, vsphere=None): """ Add Hard Drive object to Virtual Machine Args: - vm_id: Moid of Virtual Machine to edit - vm_name: Name of Virtual Machine to edit - datastore_cluster: Datastore Cluster to store new hdd files - datastore: Datastore to put new files in - disk_size: Sze of HDD in GB - provisioning_type: Type of Provisioning to use for HDD - vsphere: Pre-configured vsphere connection details (config.yaml) Returns: - dict: Success """ # ensure that minimal inputs are provided checkinputs.one_of_two_strings(vm_id, vm_name, "ID or Name") self.establish_connection(vsphere) vm = inventory.get_virtualmachine(self.si_content, vm_id, vm_name) spec = vim.vm.ConfigSpec() hdd_unit_number = self.get_next_unit_number(vm) ctrl_key = self.get_controller_key(vm) # Prepare new Disk configuration disk_changes = [] disk_spec = vim.vm.device.VirtualDeviceSpec() disk_spec.fileOperation = "create" disk_spec.operation = vim.vm.device.VirtualDeviceSpec.Operation.add disk_spec.device = vim.vm.device.VirtualDisk() disk_spec.device.backing =\ vim.vm.device.VirtualDisk.FlatVer2BackingInfo() disk_spec.device.backing.diskMode = "persistent" if provision_type == 'thin': disk_spec.device.backing.thinProvisioned = True disk_spec.device.unitNumber = hdd_unit_number disk_spec.device.capacityInKB = int(disk_size) * 1024 * 1024 disk_spec.device.controllerKey = ctrl_key # If Datastore Cluster is provided attach Disk via that if datastore_cluster: ds_clust_obj = inventory.get_datastore_cluster( self.si_content, name=datastore_cluster) disk_changes.append(disk_spec) spec.deviceChange = disk_changes srm = self.si_content.storageResourceManager storage_placement_spec = self.get_storage_placement_spec( ds_clust_obj, vm, spec) datastores = srm.RecommendDatastores( storageSpec=storage_placement_spec) if not datastores.recommendations: sys.stderr.write('Skipping as No datastore Recommendations') add_disk_task = srm.ApplyStorageDrsRecommendation_Task( datastores.recommendations[0].key) elif datastore: datastore_obj = inventory.get_datastore(self.si_content, name=datastore) disk_spec.device.backing.datastore = datastore_obj disk_changes.append(disk_spec) spec.deviceChange = disk_changes add_disk_task = vm.ReconfigVM_Task(spec) else: disk_changes.append(disk_spec) spec.deviceChange = disk_changes add_disk_task = vm.ReconfigVM_Task(spec) successfully_added_disk = self._wait_for_task(add_disk_task) return {'state': successfully_added_disk}
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, 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}