| Conditions | 44 | 
| Total Lines | 132 | 
| Lines | 0 | 
| Ratio | 0 % | 
Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.
For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.
Commonly applied refactorings include:
If many parameters/temporary variables are present:
Complex classes like GetVMs.run() often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
| 1 | from sets import Set  | 
            ||
| 9 | def run(self, ids=None, names=None, datastores=None, datastore_clusters=None,  | 
            ||
| 10 | resource_pools=None, vapps=None, hosts=None, folders=None, clusters=None,  | 
            ||
| 11 | datacenters=None, virtual_switches=None, no_recursion=False):  | 
            ||
| 12 | # TODO: food for thought. PowerCli contains additional parameters that  | 
            ||
| 13 | # are not present here for the folliwing reason:  | 
            ||
| 14 | # <server> - we may need to bring it in if we decide to have connections  | 
            ||
| 15 | # to more than 1 VC.  | 
            ||
| 16 | # <tag> - Tags in VC are not the same as tags you see in Web Client  | 
            ||
| 17 | # for the reason, that those tags are stored in Inventory Service only.  | 
            ||
| 18 | # PowerCli somehow can access it, from vSphere SDK there is no way.  | 
            ||
| 19 | |||
| 20 | si = self.si  | 
            ||
| 21 | si_content = si.RetrieveContent()  | 
            ||
| 22 | props = ['name', 'runtime.powerState']  | 
            ||
| 23 |         moid_to_vm = {} | 
            ||
| 24 | |||
| 25 | # Getting vms by their ids  | 
            ||
| 26 | vms_from_vmids = []  | 
            ||
| 27 | if ids:  | 
            ||
| 28 |             vm_moids = [moid.strip() for moid in ids.split(',')] | 
            ||
| 29 | vms_from_vmids = [vim.VirtualMachine(moid, stub=si._stub) for moid in vm_moids]  | 
            ||
| 30 | GetVMs.__add_vm_properties_to_map_from_vm_array(moid_to_vm, vms_from_vmids)  | 
            ||
| 31 | |||
| 32 | # Getting vms by their names  | 
            ||
| 33 | vms_from_names = []  | 
            ||
| 34 | if names:  | 
            ||
| 35 |             vm_names_set = Set([name.strip() for name in names.split(',')]) | 
            ||
| 36 | container = si_content.viewManager.CreateContainerView(si_content.rootFolder,  | 
            ||
| 37 | [vim.VirtualMachine], True)  | 
            ||
| 38 | for vm in container.view:  | 
            ||
| 39 | if vm.name in vm_names_set:  | 
            ||
| 40 | vms_from_names.append(vm)  | 
            ||
| 41 | GetVMs.__add_vm_properties_to_map_from_vm_array(moid_to_vm, vms_from_names)  | 
            ||
| 42 | |||
| 43 | # Getting vms from datastore objects  | 
            ||
| 44 | vms_from_datastores = []  | 
            ||
| 45 | if datastores:  | 
            ||
| 46 |             datastore_moids = [moid.strip() for moid in datastores.split(',')] | 
            ||
| 47 | vim_datastores = [vim.Datastore(moid, stub=si._stub) for moid in datastore_moids]  | 
            ||
| 48 | for ds in vim_datastores:  | 
            ||
| 49 | vms_from_datastores.extend(ds.vm)  | 
            ||
| 50 | GetVMs.__add_vm_properties_to_map_from_vm_array(moid_to_vm, vms_from_datastores)  | 
            ||
| 51 | |||
| 52 | # Getting vms from datastore cluster objects  | 
            ||
| 53 | vms_from_datastore_clusters = []  | 
            ||
| 54 | if datastore_clusters:  | 
            ||
| 55 |             datastore_cluster_moids = [moid.strip() for moid in datastore_clusters.split(',')] | 
            ||
| 56 | vim_datastore_clusters = [vim.StoragePod(moid, stub=si._stub)  | 
            ||
| 57 | for moid in datastore_cluster_moids]  | 
            ||
| 58 | for ds_cl in vim_datastore_clusters:  | 
            ||
| 59 | for ds in ds_cl.childEntity:  | 
            ||
| 60 | vms_from_datastore_clusters.extend(ds.vm)  | 
            ||
| 61 | GetVMs.__add_vm_properties_to_map_from_vm_array(moid_to_vm, vms_from_datastore_clusters)  | 
            ||
| 62 | |||
| 63 | # Getting vms from virtual switch objects  | 
            ||
| 64 | vms_from_virtual_switches = []  | 
            ||
| 65 | if virtual_switches:  | 
            ||
| 66 |             virtual_switch_moids = [moid.strip() for moid in virtual_switches.split(',')] | 
            ||
| 67 | vim_virtual_switches = [vim.DistributedVirtualSwitch(moid, stub=si._stub)  | 
            ||
| 68 | for moid in virtual_switch_moids]  | 
            ||
| 69 | for vswitch in vim_virtual_switches:  | 
            ||
| 70 | for pg in vswitch.portgroup:  | 
            ||
| 71 | vms_from_virtual_switches.extend(pg.vm)  | 
            ||
| 72 | GetVMs.__add_vm_properties_to_map_from_vm_array(moid_to_vm, vms_from_virtual_switches)  | 
            ||
| 73 | |||
| 74 | # Getting vms from containers (location param)  | 
            ||
| 75 | vms_from_containers = []  | 
            ||
| 76 | containers = []  | 
            ||
| 77 | |||
| 78 | if resource_pools:  | 
            ||
| 79 |             container_moids = [moid.strip() for moid in resource_pools.split(',')] | 
            ||
| 80 | containers += [vim.ResourcePool(moid, stub=si._stub) for moid in container_moids]  | 
            ||
| 81 | |||
| 82 | if vapps:  | 
            ||
| 83 |             container_moids = [moid.strip() for moid in vapps.split(',')] | 
            ||
| 84 | containers += [vim.VirtualApp(moid, stub=si._stub) for moid in container_moids]  | 
            ||
| 85 | |||
| 86 | if hosts:  | 
            ||
| 87 |             container_moids = [moid.strip() for moid in hosts.split(',')] | 
            ||
| 88 | containers += [vim.HostSystem(moid, stub=si._stub) for moid in container_moids]  | 
            ||
| 89 | |||
| 90 | if folders:  | 
            ||
| 91 |             container_moids = [moid.strip() for moid in folders.split(',')] | 
            ||
| 92 | containers += [vim.Folder(moid, stub=si._stub) for moid in container_moids]  | 
            ||
| 93 | |||
| 94 | if clusters:  | 
            ||
| 95 |             container_moids = [moid.strip() for moid in clusters.split(',')] | 
            ||
| 96 | containers += [vim.ComputeResource(moid, stub=si._stub) for moid in container_moids]  | 
            ||
| 97 | |||
| 98 | if datacenters:  | 
            ||
| 99 |             container_moids = [moid.strip() for moid in datacenters.split(',')] | 
            ||
| 100 | containers += [vim.Datacenter(moid, stub=si._stub) for moid in container_moids]  | 
            ||
| 101 | |||
| 102 | for cont in containers:  | 
            ||
| 103 | |||
| 104 | objView = si_content.viewManager.CreateContainerView(cont,  | 
            ||
| 105 | [vim.VirtualMachine],  | 
            ||
| 106 | not no_recursion)  | 
            ||
| 107 | |||
| 108 | tSpec = vim.PropertyCollector.TraversalSpec(name='tSpecName', path='view',  | 
            ||
| 109 | skip=False, type=vim.view.ContainerView)  | 
            ||
| 110 | |||
| 111 | pSpec = vim.PropertyCollector.PropertySpec(all=False, pathSet=props, type=vim.VirtualMachine)  | 
            ||
| 112 | |||
| 113 | oSpec = vim.PropertyCollector.ObjectSpec(obj=objView, selectSet=[tSpec], skip=False)  | 
            ||
| 114 | |||
| 115 | pfSpec = vim.PropertyCollector.FilterSpec(objectSet=[oSpec], propSet=[pSpec],  | 
            ||
| 116 | reportMissingObjectsInResults=False)  | 
            ||
| 117 | |||
| 118 | retOptions = vim.PropertyCollector.RetrieveOptions()  | 
            ||
| 119 | |||
| 120 | retProps = si_content.propertyCollector.RetrievePropertiesEx(specSet=[pfSpec],  | 
            ||
| 121 | options=retOptions)  | 
            ||
| 122 | |||
| 123 | vms_from_containers += retProps.objects  | 
            ||
| 124 | |||
| 125 | while retProps.token:  | 
            ||
| 126 | retProps = si_content.propertyCollector.ContinueRetrievePropertiesEx(  | 
            ||
| 127 | token=retProps.token  | 
            ||
| 128 | )  | 
            ||
| 129 | vms_from_containers += retProps.objects  | 
            ||
| 130 | objView.Destroy()  | 
            ||
| 131 | |||
| 132 | for vm in vms_from_containers:  | 
            ||
| 133 | if vm.obj._GetMoId() not in moid_to_vm:  | 
            ||
| 134 |                 moid_to_vm[vm.obj._GetMoId()] = { | 
            ||
| 135 | "moid": vm.obj._GetMoId(),  | 
            ||
| 136 | "name": vm.propSet[0].val,  | 
            ||
| 137 | "runtime.powerState": vm.propSet[1].val  | 
            ||
| 138 | }  | 
            ||
| 139 | |||
| 140 | return moid_to_vm.values()  | 
            ||
| 141 | |||
| 151 |