示例#1
0
        def _get_sessions_of_target(target):
            client = WmiClient('root\\wmi')
            wql = "SELECT * from MSiSCSIInitiator_SessionClass where TargetName='%s'" % str(
                target.get_iqn())
            query = client.execute_query(wql)
            target_sessions = []
            for session in query:
                hct = None
                uid = session.Properties_.Item('SessionId').Value
                if not uid:
                    continue
                connections = session.Properties_.Item(
                    'ConnectionInformation').Value
                if not connections:
                    continue

                conn_0 = connections[0]
                source_ip = conn_0.Properties_.Item('InitiatorAddress').Value
                source_iqn = session.Properties_.Item('InitiatorName').Value
                target_address = conn_0.Properties_.Item('TargetAddress').Value
                target_port = conn_0.Properties_.Item('TargetPort').Value

                if not session.Properties_.Item('Devices').Value:
                    hct = HCT(-1, 0, -1)
                else:
                    devices = list(session.Properties_.Item('Devices').Value)
                    hct = HCT(
                        devices[0].Properties_.Item('ScsiPortNumber').Value,
                        devices[0].Properties_.Item('ScsiPathId').Value,
                        devices[0].Properties_.Item('ScsiTargetId').Value)
                target_sessions.append(
                    base.Session(target,
                                 base.Endpoint(target_address, target_port),
                                 source_ip, source_iqn, uid, hct))
            return target_sessions
示例#2
0
 def get_source_iqn(self):
     from .iscsi_exceptions import NotReadyException
     client = WmiClient('root\\wmi')
     query = list(
         client.execute_query('SELECT * FROM MSIscsiInitiator_MethodClass'))
     if not query:
         raise NotReadyException("Could not query iSCSI initiator from WMI")
     iqn = query[0].Properties_.Item("ISCSINodeName").Value
     return IQN(iqn)
示例#3
0
 def _create_initiator_obj_if_needed(self):
     if not self._initiator:
         iscsi_software = MicrosoftSoftwareInitiator()
         if not iscsi_software.is_installed():
             raise RuntimeError("iscsi sw isn't running")
         client = WmiClient('root\\wmi')
         query = client.execute_query(
             'SELECT * from MSIscsiInitiator_InitiatorClass')
         initiator_name = list(query)[0].Properties_.Item(
             'InitiatorName').Value
         iqn = self.get_source_iqn()
         self._initiator = base.Initiator(iqn, initiator_name)
示例#4
0
 def _get_discovery_endpoints(self):
     '''return all discovery endpoints currently use only for undiscover
     '''
     discovery_endpoints = []
     client = WmiClient('root\\wmi')
     query = client.execute_query(
         'SELECT * FROM  MSiSCSIInitiator_SendTargetPortalClass')
     for discovery_endpoint in query:
         endpoint = base.Endpoint(
             discovery_endpoint.Properties_.Item('PortalAddress').Value,
             discovery_endpoint.Properties_.Item('PortalPort').Value)
         if endpoint not in discovery_endpoints:
             discovery_endpoints.append(endpoint)
     return discovery_endpoints
示例#5
0
 def set_source_iqn(self, iqn):
     '''receive an iqn as a string, verify it's valid and set it.
     returns iqn type of the new IQN or None if fails
     '''
     logger.info(
         "iqn before the change is {!r} going to change to {!r}".format(
             self.get_source_iqn(), iqn))
     IQN(iqn)  # raise if iqn doesn't exist
     client = WmiClient('root\\wmi')
     query = list(
         client.execute_query(
             "SELECT * FROM MSIscsiInitiator_MethodClass"))[0]
     initiator_name = query.Methods_.Item("SetIscsiInitiatorNodeName")
     parameters = initiator_name.InParameters.SpawnInstance_()
     parameters.Properties_.Item("InitiatorNodeName").Value = iqn
     query.ExecMethod_('SetIscsiInitiatorNodeName', parameters)
     logger.info("iqn is now {!r}".format(self.get_source_iqn()))
     return self.get_source_iqn()
示例#6
0
 def _get_connectivity_using_wmi(self):
     '''returns a list of dicts which contain all available targets with it's main parameters
     '''
     availble_targets_connectivity = []
     client = WmiClient('root\\wmi')
     for target in client.execute_query(
             'SELECT * from  MSIscsiInitiator_TargetClass'):
         iqn = target.Properties_.Item('TargetName').Value
         for portal_group in target.Properties_.Item('PortalGroups').Value:
             for portal in portal_group.Properties_.Item('Portals').Value:
                 target_connectivity = {
                     'dst_ip': portal.Properties_.Item('Address').Value,
                     'dst_port': portal.Properties_.Item('Port').Value,
                     'iqn': iqn
                 }
                 if target_connectivity not in availble_targets_connectivity:
                     availble_targets_connectivity.append(
                         target_connectivity)
     return availble_targets_connectivity
示例#7
0
    def get_discovered_targets(self):
        '''return a list of discovered target objects
        '''
        logger.info("get_discovered_targets")
        discovered_targets = []
        client = WmiClient('root\\wmi')
        for query in client.execute_query(
                'SELECT * from MSIscsiInitiator_TargetClass'):
            endpoints = []
            iqn = query.Properties_.Item('TargetName').Value
            for portal_group in query.Properties_.Item('PortalGroups').Value:
                for portal in portal_group.Properties_.Item('Portals').Value:
                    endpoint = base.Endpoint(
                        portal.Properties_.Item('Address').Value,
                        portal.Properties_.Item('Port').Value)
                    if endpoint not in endpoints:
                        endpoints.append(endpoint)

            # u'SendTargets:*test 0003260 ROOT\\ISCSIPRT\\0000_0 '
            # HOSTDEV-2764: u'SendTargets:*172.16.130.9 0003260 ROOT\\ISCSIPRT\\0000_0 172.16.130.55'
            discovery_mechanism = query.Properties_.Item(
                'DiscoveryMechanism').Value
            if not discovery_mechanism:
                logger.debug(
                    "invalid discovery mechanism (empty): {!r}".format(
                        discovery_mechanism))
                continue
            discovery_mechanism = discovery_mechanism.strip().split()
            if len(discovery_mechanism) < 2:
                logger.debug("invalid discovery mechanism: {!r}".format(
                    discovery_mechanism))
                continue
            discovery_endpoint_ip = discovery_mechanism[0].split(
                ':')[-1].strip("*")
            discovery_endpoint_port = int(discovery_mechanism[1])
            discovery_endpoint = base.Endpoint(discovery_endpoint_ip,
                                               discovery_endpoint_port)
            target = base.Target(endpoints, discovery_endpoint, iqn)
            if target not in discovered_targets:
                discovered_targets.append(target)
        return discovered_targets
示例#8
0
 def _refresh_wmi_db(self):
     client = WmiClient('root\\wmi')
     for item in client.execute_query(
             "SELECT * FROM MSIscsiInitiator_MethodClass"):
         item.ExecMethod_('RefreshTargetList', None)