def get_vm_by_path(self, path, datacenter=None): """Returns an instance of VIVirtualMachine. Where its path matches @path. The VM is searched througout all the datacenters, unless the name or MOR of the datacenter the VM belongs to is provided.""" if not self.__logged: raise VIException( "Must call 'connect' before invoking this method", FaultTypes.NOT_CONNECTED) try: dc_list = [] if datacenter and VIMor.is_mor(datacenter): dc_list.append(datacenter) else: dc = self.get_datacenters() if datacenter: dc_list = [k for k, v in dc.iteritems() if v == datacenter] else: dc_list = list(dc.iterkeys()) for mor_dc in dc_list: request = VI.FindByDatastorePathRequestMsg() mor_search_index = request.new__this( self._do_service_content.SearchIndex) mor_search_index.set_attribute_type(MORTypes.SearchIndex) request.set_element__this(mor_search_index) mor_datacenter = request.new_datacenter(mor_dc) mor_datacenter.set_attribute_type(MORTypes.Datacenter) request.set_element_datacenter(mor_datacenter) request.set_element_path(path) try: vm = self._proxy.FindByDatastorePath(request)._returnval except VI.ZSI.FaultException: pass else: if vm: return VIVirtualMachine(self, vm) except (VI.ZSI.FaultException), e: raise VIApiException(e)
dc_properties = VIProperty(server, dc_mor) hostFolder_mor = dc_properties.hostFolder._obj # Get ComputeResource MOR for target host cr_mor = __get_computeresource_mor(server, hostFolder_mor, host_mor) # Get ComputeResource properties crprops = VIProperty(server, cr_mor) # Get ResourcePool MOR rp_mor = crprops.resourcePool._obj template_mor = __get_template_by_name(server, 'template2') vm = VIVirtualMachine(server, template_mor) folder = None folders = server._retrieve_properties_traversal( property_names=['name', 'childEntity'], obj_type=MORTypes.Folder) folder_mor = None for f in folders: fname = "" children = [] for prop in f.PropSet: if prop.Name == "name": fname = prop.Val elif prop.Name == "childEntity":