美文网首页存储
cinder 初始化卷连接逻辑

cinder 初始化卷连接逻辑

作者: 笨手笨脚越 | 来源:发表于2017-06-28 20:36 被阅读151次

    rest_api os-initialize_connection 逻辑分析

    1. 收到nova请求,POST /volumes/{volume_id}/action 初始化连接请求。body:
    {
        u'os-initialize_connection': {
            u'connector': {
                u'initiator': u'iqn.1994-05.com.redhat: cce2fc0a8a',
                u'ip': u'172.24.2.218',
                u'platform': u'x86_64',
                u'host': u'localhost.localdomain',
                u'do_local_attach': False,
                u'os_type': u'linux2',
                u'multipath': False
            }
        }
    }
    
    1. 通过volume_id获得volume信息。volume:
    Volume(_name_id=None,
    admin_metadata={
        huawei_lun_wwn='6a4c64f1001db63307a4e1700000001e'
    },
    attach_status='detached',
    availability_zone='nova',
    bootable=False,
    cluster=<?>,
    cluster_name=None,
    consistencygroup=<?>,
    consistencygroup_id=None,
    created_at=2017-06-28T05: 14: 04Z,
    deleted=False,
    deleted_at=None,
    display_description='',
    display_name='wy_iscsi_volume3',
    ec2_id=None,
    encryption_key_id=None,
    glance_metadata=<?>,
    group=<?>,
    group_id=None,
    host='localhost.localdomain@huawei-iscsi-20170628104137#StoragePool_Ou',
    id=eac3c181-b02b-4982-9d7e-d273ee2738e0,
    launched_at=2017-06-28T05: 14: 05Z,
    metadata={
        
    },
    migration_status=None,
    multiattach=False,
    previous_status=None,
    project_id='65cc87fa19d74acf97bf8f9b76e2e6ea',
    provider_auth=None,
    provider_geometry=None,
    provider_id=None,
    provider_location='30',
    replication_driver_data=None,
    replication_extended_status=None,
    replication_status=None,
    scheduled_at=2017-06-28T05: 14: 05Z,
    size=1,
    snapshot_id=None,
    snapshots=<?>,
    source_volid=None,
    status='attaching',
    terminated_at=None,
    updated_at=2017-06-28T05: 14: 31Z,
    user_id='246152716574416897f936aa058b861b',
    volume_attachment=<?>,
    volume_type=VolumeType(6c766d2a-9638-4c3c-ad27-42be7940a8ba),
    volume_type_id=6c766d2a-9638-4c3c-ad27-42be7940a8ba)
    

    3.通过rpc api cinder.volume.manager.VolumeManager#initialize_connection做初始化连接。

    cinder.volume.manager.VolumeManager#initialize_connection 逻辑分析

         def initialize_connection(self, context, volume, connector):
            utils.require_driver_initialized(self.driver)
            try:
                self.driver.validate_connector(connector)
            <!--省略-->
            try:
                model_update = self.driver.create_export(context.elevated(),
                                                         volume, connector)
            <!--省略-->
    
            try:
                if model_update:
                    volume.update(model_update)
                    volume.save()
            <!--省略-->
            try:
                conn_info = self.driver.initialize_connection(volume, connector)
            <!--省略-->
    
            conn_info = self._parse_connection_options(context, volume, conn_info)
            LOG.info(_LI("Initialize volume connection completed successfully."),
                     resource=volume)
            return conn_info
    
    1. utils.require_driver_initialized(self.driver) 初始化driver。==type(driver)待确定==
    2. self.driver.validate_connector(connector) 判断connector里是否包含键值对'initiator='。
    3. model_update = self.driver.create_export(context.elevated(),
      volume, connector) ==检查cinder.volume.drivers.huawei.huawei_driver.HuaweiBaseDriver#create_export内容是pass,不知道具体实现。待确定==
    4. conn_info = self.driver.initialize_connection(volume, connector) 调用cinder.volume.drivers.huawei.huawei_driver.HuaweiISCSIDriver#initialize_connection获得连接信息。逻辑见下文。
    5. conn_info = self._parse_connection_options(context, volume, conn_info) 把之前获得的conn_info作进一步解析封装。

    cinder.volume.drivers.huawei.huawei_driver.HuaweiISCSIDriver#initialize_connection 逻辑:

    1. lun_id, lun_type = self.get_lun_id_and_type(volume) 从上文volume信息里解析出lun_id和lun_type:
    lun_id = volume.provider_location # provider_location='30',
    lun_type = constants.SNAPSHOT_TYPE # SNAPSHOT_TYPE = '27'
    
    1. (iscsi_iqns,target_ips,portgroup_id) = self.client.get_iscsi_params(connector) 获取iscsi_iqns,target_ips,portgroup_id。逻辑见下文分析。
    2. 获取host_name和host_id。 client.add_host_with_check逻辑见下文分析。
            original_host_name = connector['host']
            host_name = huawei_utils.encode_host_name(original_host_name)
            host_id = self.client.add_host_with_check(host_name,
                                                      original_host_name)
    
    1. 确认initiator已经在华为存储管理端添加。self.client.ensure_initiator_added(initiator_name, host_id)逻辑见下文分析。
    2. 去华为存储管理端创建一个名为 'OpenStack_HostGroup_'+host_id 的主机组,hostgroup_id = self.client.add_host_to_hostgroup(host_id)。逻辑见下文分析。
    3. 创建名为 'OpenStack_LunGroup_'+host_id 的lungroup,并对lungroup和hostgroup建立名为 'OpenStack_Mapping_View_'+host_id 的映射关系。client.do_mapping(lun_id, hostgroup_id host_id, portgroup_id, lun_type),逻辑见下文分析。
    4. 通过Request url='/lun/associate?TYPE=11&ASSOCIATEOBJTYPE=21&ASSOCIATEOBJID=1' 获取 host lun id= Data['ASSOCIATEMETADATA']['HostLUNID']。
    5. 从华为xml配置文件获得 CHAPinfo。我们没配。
    6. 返回结果,例如:
    {
        'driver_volume_type': 'iscsi',
        'data': {
            'target_lun': 1,
            'volume_id': '95528f43-24e3-4dec-89d3-3eb631ea90c1',
            'target_iqn': u'iqn.2006-08.com.huawei: oceanstor: 210048fd8e94f16a: : 1022006: 172.24.3.191',
            'target_portal': '172.24.3.191: 3260',
            'target_discovered': False
        }
    }
    

    cinder.volume.drivers.huawei.rest_client.RestClient#get_iscsi_params 逻辑:

    1. 判断connector['multipath'] is True or False, 这是nova那边设置的值,逻辑里判断nova.conf配置里volume_use_multipath的值,因为我们环境里没有配置,所以走默认false。此处不分析connector['multipath'] is True的情况。
    2. 如果connector['multipath'] is False,
      (1) target_ips = self._get_target_ip(initiator)
      检查huawei配置文件里有没有设置TargetIP,有则把TargetIP拼成数组存target_ips;没有的话就用iscsi_default_target_ip。
      (2) portgroup_id = None
      (3)for ip in target_ips: target_iqn = self._get_tgt_iqn_from_rest(ip) 或者target_iqn = self._get_tgt_iqn(ip)
      遍历target_ips,过滤解析出target_iqn。
        def _get_tgt_iqn_from_rest(self, target_ip):
            url = "/iscsi_tgt_port"
            result = self.call(url, None, "GET")
    
            target_iqn = None
            if result['error']['code'] != 0:
                LOG.warning(_LW("Can't find target iqn from rest."))
                return target_iqn
            ip_pattern = re.compile(r'\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}')
            if 'data' in result:
                for item in result['data']:
                    ips = re.findall(ip_pattern, item['ID'])
                    for ip in ips:
                        if target_ip == ip:
                            target_iqn = item['ID']
                            break
    
            if not target_iqn:
                LOG.warning(_LW("Can't find target iqn from rest."))
                return target_iqn
    
            split_list = target_iqn.split(",")
            target_iqn_before = split_list[0]
    
            split_list_new = target_iqn_before.split("+")
            target_iqn = split_list_new[1]
    
            return target_iqn
            
        def _get_tgt_iqn(self, iscsi_ip):
            """Get target iSCSI iqn."""
            ip_info = self._get_iscsi_port_info(iscsi_ip)
            iqn_prefix = self._get_iscsi_tgt_port()
            if not ip_info:
                err_msg = (_(
                    'Get iSCSI port info error, please check the target IP '
                    'configured in huawei conf file.'))
                LOG.error(err_msg)
                raise exception.VolumeBackendAPIException(data=err_msg)
    
            LOG.debug('Request ip info is: %s.', ip_info)
            split_list = ip_info.split(".")
            newstr = split_list[1] + split_list[2]
            LOG.info(_LI('New str info is: %s.'), newstr)
    
            if ip_info:
                if newstr[0] == 'A':
                    ctr = "0"
                elif newstr[0] == 'B':
                    ctr = "1"
                interface = '0' + newstr[1]
                port = '0' + newstr[3]
                iqn_suffix = ctr + '02' + interface + port
                for i in range(0, len(iqn_suffix)):
                    if iqn_suffix[i] != '0':
                        iqn_suffix = iqn_suffix[i:]
                        break
                iqn = iqn_prefix + ':' + iqn_suffix + ':' + iscsi_ip
                LOG.info(_LI('_get_tgt_iqn: iSCSI target iqn is: %s.'), iqn)
                return iqn
     
     /iscsi_tgt_port 例:
        https://172.24.1.33:8088/deviceManager/rest/2102350BVB10H2000009/iscsi_tgt_port
        Response Data:{"data":[{"ETHPORTID":"549772722179","ID":"1+iqn.2006-08.com.huawei:oceanstor:2100a4c64f1db633::1020003:172.24.3.35,t,0x0004","TPGT":"4","TYPE":249},{"ETHPORTID":"549772722178","ID":
        "1+iqn.2006-08.com.huawei:oceanstor:2100a4c64f1db633::1020002:172.24.3.33,t,0x0003","TPGT":"3","TYPE":249}],"error":{"code":0,"description":"0"}}
    

    cinder.volume.drivers.huawei.rest_client.RestClient#add_host_with_check 逻辑:

    1. host_id = self.get_host_id_by_name(host_name)
      访问华为api url = "/host?range=[0-65535]",得到类似如下结果。遍历Data列表,如果item['NAME']和host_name匹配,则返回item['ID']
    Response Data:{"data":[{"DESCRIPTION":"","HEALTHSTATUS":"1","ID":"0","INITIATORNUM":"1","IP":"172.24.9.21","ISADD2HOSTGROUP":"true","LOCATION":"","MODEL":"","NAME":"node11","NETWORKNAME":"","OPERA
    TIONSYSTEM":"0","PARENTID":"0","PARENTNAME":"0","PARENTTYPE":14,"RUNNINGSTATUS":"1","TYPE":21},{"DESCRIPTION":"","HEALTHSTATUS":"1","ID":"1","INITIATORNUM":"1","IP":"172.24.3.207","ISADD2HOSTGROUP
    ":"true","LOCATION":"","MODEL":"","NAME":"songteng_host","NETWORKNAME":"","OPERATIONSYSTEM":"0","PARENTID":"1","PARENTNAME":"1","PARENTTYPE":14,"RUNNINGSTATUS":"1","TYPE":21}],"error":{"code":0,"d
    escription":"0"}}
    
    1. 如果get_host_id_by_name没得到host_id,说明是初次连接存储设备,则传递host_name给华为api url= "/host" 去建一个新的host。url返回结果取出data['ID']存为host_id。
      host_id = self._add_host(host_name, host_name_before_hash)
      如下:
    Request URL: https://172.24.1.33:8088/deviceManager/rest/2102350BVB10H2000009/host
    Call Method: None
    Request Data: {"DESCRIPTION": "localhost.localdomain", "TYPE": "21", "NAME": "localhost.localdomain", "OPERATIONSYSTEM": "0"}
    Response Data:{"data":{"DESCRIPTION":"localhost.localdomain","HEALTHSTATUS":"1","ID":"2","INITIATORNUM":"0","IP":"","ISADD2HOSTGROUP":"false","LOCATION":"","MODEL":"","NAME":"localhost.localdomain
    ","NETWORKNAME":"","OPERATIONSYSTEM":"0","PARENTID":"","PARENTNAME":"","PARENTTYPE":14,"RUNNINGSTATUS":"1","TYPE":21},"error":{"code":0,"description":"0"}}
    

    cinder.volume.drivers.huawei.rest_client.RestClient#ensure_initiator_added 逻辑:

    1. 查找存储管理端是否已经存在initiator。_initiator_is_added_to_array(initiator_name) 访问url = "/iscsi_initiator?range=[0-256]",通过connector['initiator']遍历匹配data['ID'],如果匹配成功返回True。如:
    Request URL: https://172.24.1.33:8088/deviceManager/rest/2102350BVB10H2000009/iscsi_initiator?range=[0-256]
    Call Method: GET
    Request Data: None
    Response Data:{"data":[{"HEALTHSTATUS":"1","ID":"iqn.1993-08.org.debian:01:47414e5341ea","ISFREE":"true","MULTIPATHTYPE":"0","OPERATIONSYSTEM":"255","RUNNINGSTATUS":"28","TYPE":222,"USECHAP":"fals
    e"},{"HEALTHSTATUS":"1","ID":"iqn.1994-05.com.redhat:4153902a6cca","ISFREE":"true","MULTIPATHTYPE":"0","OPERATIONSYSTEM":"255","RUNNINGSTATUS":"28","TYPE":222,"USECHAP":"false"},{"HEALTHSTATUS":"1
    ","ID":"iqn.1994-05.com.redhat:5c4e2fa14484","ISFREE":"false","MULTIPATHTYPE":"0","OPERATIONSYSTEM":"255","PARENTID":"1","PARENTNAME":"songteng_host","PARENTTYPE":21,"RUNNINGSTATUS":"27","TYPE":22
    2,"USECHAP":"false"},{"HEALTHSTATUS":"1","ID":"iqn.1994-05.com.redhat:60d84d1e10ef","ISFREE":"true","MULTIPATHTYPE":"0","OPERATIONSYSTEM":"255","RUNNINGSTATUS":"28","TYPE":222,"USECHAP":"false"},{
    "HEALTHSTATUS":"1","ID":"iqn.1994-05.com.redhat:83feeda2b41d","ISFREE":"true","MULTIPATHTYPE":"0","OPERATIONSYSTEM":"255","RUNNINGSTATUS":"28","TYPE":222,"USECHAP":"false"},{"HEALTHSTATUS":"1","ID
    ":"iqn.1994-05.com.redhat:c1b24eb3a28","ISFREE":"true","MULTIPATHTYPE":"0","OPERATIONSYSTEM":"255","RUNNINGSTATUS":"28","TYPE":222,"USECHAP":"false"},{"HEALTHSTATUS":"1","ID":"iqn.1994-05.com.redh
    at:cce2fc0a8a","ISFREE":"true","MULTIPATHTYPE":"0","OPERATIONSYSTEM":"255","RUNNINGSTATUS":"28","TYPE":222,"USECHAP":"false"},{"HEALTHSTATUS":"1","ID":"iqn.2010-10.org.openstack","ISFREE":"true","
    MULTIPATHTYPE":"0","OPERATIONSYSTEM":"255","RUNNINGSTATUS":"28","TYPE":222,"USECHAP":"false"}],"error":{"code":0,"description":"0"}}
    
    1. 如果步骤1得到False,则_add_initiator_to_array(initiator_name)调用url = "/iscsi_initiator" data = {"TYPE": "222","ID": initiator_name,"USECHAP": "false"}去在存储管理端建立一个新的initiator。==没有例子==
    2. is_initiator_associated_to_host(initiator_name) 再一次访问访问url = "/iscsi_initiator?range=[0-256]", if item['ID'] == initiator_name and item['ISFREE'] == "true": return False
    3. 如果第三步得到False,执行_associate_initiator_to_host(initiator_name, host_id),给initiator和host做关联。程序里 cinder.volume.drivers.huawei.rest_client.RestClient#_add_initiator_to_host 调用url = "/iscsi_initiator/" + initiator_name data = {"TYPE": "222", "ID": initiator_name, "USECHAP": "false", "PARENTTYPE": "21", "PARENTID": host_id} result = self.call(url, data, "PUT")。如:
    Request URL: https://172.24.2.32:8088/deviceManager/rest/2102351CAK10GB000007/iscsi_initiator/iqn.1994-05.com.redhat:9aaffb4dfd4f
    
    Call Method: PUT
    
    Request Data: {"USECHAP": "false", "PARENTTYPE": "21", "TYPE": "222", "ID": "iqn.1994-05.com.redhat:9aaffb4dfd4f", "PARENTID": "1"}
    
    Response Data:{"data":{},"error":{"code":0,"description":"0"}}
    

    cinder.volume.drivers.huawei.rest_client.RestClient#add_host_to_hostgroup 逻辑:

    1. 通过url = "/hostgroup?range=[0-8191]"查询是否已经有主机组,有则返回hostgroup_id。例如:
    Request URL: https://172.24.2.32:8088/deviceManager/rest/2102351CAK10GB000007/hostgroup?range=[0-8191]
    Call Method: GET
    Request Data: None
    Response Data:{"data":[{"DESCRIPTION":"","ID":"0","ISADD2MAPPINGVIEW":"true","NAME":"OpenStack_HostGroup_0","TYPE":14}],"error":{"code":0,"description":"0"}}
    
    1. 没查到hostgroup_id,就通过url = "/hostgroup" data = {"TYPE": "14", "NAME": hostgroup_name}去创建一个主机组。返回hostgroup_id = result['data']['ID']。例如:
    Request URL: https://172.24.2.32:8088/deviceManager/rest/2102351CAK10GB000007/hostgroup
    Call Method: None
    Request Data: {"TYPE": "14", "NAME": "OpenStack_HostGroup_1"}
    Response Data:{"data":{"DESCRIPTION":"","ID":"1","ISADD2MAPPINGVIEW":"false","NAME":"OpenStack_HostGroup_1","TYPE":14},"error":{"code":0,"description":"0"}}
    
    1. 通过url = ("/host/associate?TYPE=21&ASSOCIATEOBJTYPE=14&ASSOCIATEOBJID=%s" % hostgroup_id)检查hostgroup和host是否已关联。有则返回True。例如:
    Request URL: https://172.24.2.32:8088/deviceManager/rest/2102351CAK10GB000007/host/associate?TYPE=21&ASSOCIATEOBJTYPE=14&ASSOCIATEOBJID=1
    Call Method: GET
    Request Data: None
    Response Data:{"error":{"code":0,"description":"0"}}
    
    1. 第3步False,则通过url = "/hostgroup/associate" data = {"TYPE": "14", "ID": hostgroup_id, "ASSOCIATEOBJTYPE": "21", "ASSOCIATEOBJID": host_id} 给hostgroup和host建立关联。例如:
    Request URL: https://172.24.2.32:8088/deviceManager/rest/2102351CAK10GB000007/hostgroup/associate
    Call Method: None
    Request Data: {"ASSOCIATEOBJID": "1", "TYPE": "14", "ID": "1", "ASSOCIATEOBJTYPE": "21"}
    Response Data:{"data":{},"error":{"code":0,"description":"0"}}
    

    cinder.volume.drivers.huawei.rest_client.RestClient#do_mapping 逻辑分析:

    1. 通过url = "/lungroup?range=[0-8191]" 查找名为 'OpenStack_LunGroup_'+host_id 的lungroup,有则返回lungroup_id。例如:
    Request URL: https://172.24.2.32:8088/deviceManager/rest/2102351CAK10GB000007/lungroup?range=[0-8191]
    Call Method: GET
    Request Data: None
    Response Data:{"data":[{"APPTYPE":"0","CAPCITY":"2097152","CONFIGDATA":"","DESCRIPTION":"","GROUPTYPE":"0","ID":"0","ISADD2MAPPINGVIEW":"false","NAME":"LUNGroup001","TYPE":256},{"APPTYPE":"0","CAP
    CITY":"2097152","CONFIGDATA":"","DESCRIPTION":"OpenStack_LunGroup_0","GROUPTYPE":"0","ID":"1","ISADD2MAPPINGVIEW":"true","NAME":"OpenStack_LunGroup_0","TYPE":256}],"error":{"code":0,"description":
    "0"}}
    
    1. 通过url = "/mappingview?range=[0-8191]" 查找名为 'OpenStack_Mapping_View_'+host_id 的映射关系,有则返回view_id。例如:
    Request URL: https://172.24.2.32:8088/deviceManager/rest/2102351CAK10GB000007/mappingview?range=[0-8191]
    Call Method: GET
    Request Data: None
    Response Data:{"data":[{"DESCRIPTION":"","ENABLEINBANDCOMMAND":"false","ID":"1","INBANDLUNWWN":"","NAME":"OpenStack_Mapping_View_0","TYPE":245}],"error":{"code":0,"description":"0"}}
    
    1. 如果没有找到lungroup,则通过 url = "/lungroup" data = {"DESCRIPTION": lungroup_name, "APPTYPE": '0', "GROUPTYPE": '0', "NAME": lungroup_name} 创建一个新的lungroup,并返回lungroup_id。例如:
    Request URL: https://172.24.2.32:8088/deviceManager/rest/2102351CAK10GB000007/lungroup
    Call Method: None
    Request Data: {"GROUPTYPE": "0", "DESCRIPTION": "OpenStack_LunGroup_1", "APPTYPE": "0", "NAME": "OpenStack_LunGroup_1"}
    Response Data:{"data":{"APPTYPE":"0","CONFIGDATA":"","DESCRIPTION":"OpenStack_LunGroup_1","GROUPTYPE":"0","HEALTHSTATUS":"1","ID":"2","ISADD2MAPPINGVIEW":"false","NAME":"OpenStack_LunGroup_1","RUN
    NINGSTATUS":"53","TYPE":256},"error":{"code":0,"description":"0"}}
    
    1. 通过url = ("/%s/associate?TYPE=%s&ASSOCIATEOBJTYPE=256&ASSOCIATEOBJID=%s" % (cmd_type, lun_type, lungroup_id)) 检查lun和lungroup已关联。例如:
    Request URL: https://172.24.2.32:8088/deviceManager/rest/2102351CAK10GB000007/lun/associate?TYPE=11&ASSOCIATEOBJTYPE=256&ASSOCIATEOBJID=2
    Call Method: GET
    Request Data: None
    Response Data:{"error":{"code":0,"description":"0"}}
    
    1. 第4步检查出无关联,则通过 url = "/lungroup/associate" data = {"ID": lungroup_id, "ASSOCIATEOBJTYPE": lun_type, "ASSOCIATEOBJID": lun_id} 将lun 关联至 lungroup。例如:
    Request URL: https://172.24.2.32:8088/deviceManager/rest/2102351CAK10GB000007/lungroup/associate
    Call Method: None
    Request Data: {"ASSOCIATEOBJID": "4", "ID": "2", "ASSOCIATEOBJTYPE": "11"}
    Response Data:{"data":{},"error":{"code":0,"description":"0"}}
    
    1. 如果lungourp和hostgroup没有映射,则通过 url = "/mappingview" data = {"NAME": name, "TYPE": "245"} 建立映射,并返回view_id。例如:
    Request URL: https://172.24.2.32:8088/deviceManager/rest/2102351CAK10GB000007/mappingview
    Call Method: None
    Request Data: {"TYPE": "245", "NAME": "OpenStack_Mapping_View_1"}
    Response Data:{"data":{"AVAILABLEHOSTLUNIDLIST":"[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,
    52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,
    113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,
    162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,
    211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255]","DESCRIPTION":
    "","ENABLEINBANDCOMMAND":"false","ID":"2","INBANDLUNWWN":"","NAME":"OpenStack_Mapping_View_1","TYPE":245},"error":{"code":0,"description":"0"}}
    
    1. 把 hostgroup 关联至 view。例如:
    Request URL: https://172.24.2.32:8088/deviceManager/rest/2102351CAK10GB000007/MAPPINGVIEW/CREATE_ASSOCIATE
    Call Method: PUT
    Request Data: {"ASSOCIATEOBJID": "1", "TYPE": "245", "ASSOCIATEOBJTYPE": "14", "ID": "2"}
    Response Data:{"data":{},"error":{"code":0,"description":"0"}}
    
    1. 把 lungroup 关联至 view。例如:
    Request URL: https://172.24.2.32:8088/deviceManager/rest/2102351CAK10GB000007/MAPPINGVIEW/CREATE_ASSOCIATE
    Call Method: PUT
    Request Data: {"ASSOCIATEOBJID": "2", "TYPE": "245", "ASSOCIATEOBJTYPE": "256", "ID": "2"}
    Response Data:{"data":{},"error":{"code":0,"description":"0"}}
    
    1. 如果之前有获得 portgroup_id,通过url = "/MAPPINGVIEW/CREATE_ASSOCIATE" data = {"ASSOCIATEOBJTYPE": "257", "ASSOCIATEOBJID": portgroup_id, "TYPE": "245", "ID": view_id} 将portgroup关联至view。由于我们没有配置multipath,之前获得portgroup_id为空,此处无例子。
    2. 通过url = "/system/" 获得version。如果version大于等于'V300R003C00',通过url = "/MAPPINGVIEW/" + view_id获得data["AVAILABLEHOSTLUNIDLIST"]存给aval_luns。例如:
    Request URL: https://172.24.2.32:8088/deviceManager/rest/2102351CAK10GB000007/MAPPINGVIEW/2
    /MAPPINGVIEW
    Response Data:{"data":[{"HEALTHSTATUS":"1","ID":"iqn.1994-05.com.redhat:83feeda2b41d","ISFREE":"false","MULTIPATHTYPE":"0","OPERATIONSYSTEM":"255","PARENTID":"0","PARENTNAME":"localhost.localdomai
    n","PARENTTYPE":21,"RUNNINGSTATUS":"28","TYPE":222,"USECHAP":"false"},{"HEALTHSTATUS":"1","ID":"iqn.1994-05.com.redhat:8a94ece3946e","ISFREE":"true","MULTIPATHTYPE":"0","OPERATIONSYSTEM":"255","RU
    NNINGSTATUS":"28","TYPE":222,"USECHAP":"false"},{"HEALTHSTATUS":"1","ID":"iqn.1994-05.com.redhat:9aaffb4dfd4f","ISFREE":"false","MULTIPATHTYPE":"0","OPERATIONSYSTEM":"255","PARENTID":"1","PARENTNA
    ME":"node16","PARENTTYPE":21,"RUNNINGSTATUS":"27","TYPE":222,"USECHAP":"false"},{"HEALTHSTATUS":"1","ID":"iqn.1994-05.com.redhat:c1de51f7e4f","ISFREE":"true","MULTIPATHTYPE":"0","OPERATIONSYSTEM":
    "255","RUNNINGSTATUS":"27","TYPE":222,"USECHAP":"false"},{"HEALTHSTATUS":"1","ID":"iqn.1994-05.com.redhat:e08ae3b9ff2","ISFREE":"true","MULTIPATHTYPE":"0","OPERATIONSYSTEM":"255","RUNNINGSTATUS":"
    28","TYPE":222,"USECHAP":"false"},{"HEALTHSTATUS":"1","ID":"iqn.1994-05.com.redhat:f4594f80d02f","ISFREE":"true","MULTIPATHTYPE":"0","OPERATIONSYSTEM":"255","RUNNINGSTATUS":"28","TYPE":222,"USECHA
    P":"false"}],"error":{"code":0,"description":"0"}}
    

    结论与疑问:

    • 对于华为xml配置文件里的配置项<Host HostIP="172.24.2.218" OSType="Linux" />,在初始化连接相关代码里我没有读到对其的读取操作,甚至在驱动代码里都没有捞到HostIP和OSType关键字。目前怀疑这个Host配置项没用处。还需要进一步实验验证。
    • 华为xml配置文件里的配置项<Initiator Name="iqn.1994-05.com.redhat:cce2fc0a8a" TargetIP="172.24.1.33" />。从初始化连接代码里看,如果没有配置TargetIP,但是有配置<DefaultTargetIP>,程序就用DefaultTargetIP作为TargetIP。没有看到对Name配置项的读取使用,target_iqn 是通过TargetIP 去查询华为rest_url后解析封装获得的。

    相关文章

      网友评论

        本文标题:cinder 初始化卷连接逻辑

        本文链接:https://www.haomeiwen.com/subject/sgtucxtx.html