def get_by_id_or_name(self, cluster_ids=[], cluster_names=[]): results = {} for cid in cluster_ids: cluster = inventory.get_cluster(self.si_content, moid=cid) if cluster and cluster.name not in results: results[cluster.name] = self.get_cluster_dict(cluster) for cluster in cluster_names: cluster = inventory.get_cluster(self.si_content, name=cluster) if cluster and cluster.name not in results: results[cluster.name] = self.get_cluster_dict(cluster) return list(results.values())
def run(self, rule_name, cluster_name, vsphere=None): """Main entry point for the StackStorm actions to execute the operation. :returns: boolean """ # Connect to the vCenter self.establish_connection(vsphere) # Finds cluster by name cluster = inventory.get_cluster(self.si_content, name=cluster_name) # Get the associated affinity rule affinity_rule = self.find_affinity_rule(rule_name, cluster) # Find the groups from the affinity rule since it just returns the name vm_group, host_group = self.find_affinity_groups(cluster, affinity_rule.vmGroupName, affinity_rule.affineHostGroupName) # Create cluster change config to be passed to vmware config_spec = self.build_cluster_removal_spec(affinity_rule, vm_group, host_group) # Run Reconfigure task task_return = self._wait_for_task(cluster.ReconfigureEx(config_spec, modify=True)) return task_return
def run(self, vm_names, vm_wait_retry, rule_name, cluster_name, host_names=None, vsphere=None): """Main entry point for the StackStorm actions to execute the operation. :returns: boolean """ # Connect to the vCenter self.establish_connection(vsphere) # Find the vm to add to the affinity rule vms = [] for vm_name in vm_names: vms.append(self.wait_for_vm(vm_name, vm_wait_retry)) hosts = [] if host_names: for host_name in host_names: hosts.append( inventory.get_hostsystem(self.si_content, name=host_name)) else: for vm in vms: # Get the host that the vm is current on hosts.append(vm.runtime.host) # Finds cluster by name cluster = inventory.get_cluster(self.si_content, name=cluster_name) # Create Affinity groups vm_group_name, vm_group_spec = self.create_group(rule_name, vms, "vm") host_group_name, host_group_spec = self.create_group( rule_name, hosts, "host") # Create Affinity rules affinity_rule_spec = self.create_rule(rule_name, vm_group_name, host_group_name) # Create cluster change config to be passed to vmware config_spec = vim.cluster.ConfigSpecEx( groupSpec=[vm_group_spec, host_group_spec], rulesSpec=[affinity_rule_spec]) # Run Reconfigure task task_return = self._wait_for_task( cluster.ReconfigureEx(config_spec, modify=True)) return task_return
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}