예제 #1
0
    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":