Commit 74a75434 authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

Device component - GNMI OpenConfig:

- Corrected management of network instance interfaces
- Improved unitary tests
parent 32d82663
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -108,6 +108,18 @@ class NetworkInstanceHandler(_Handler):
            entry_net_inst_key = '/network_instance[{:s}]'.format(ni_name)
            entries.append((entry_net_inst_key, _net_inst))

            ni_interfaces = network_instance.get('interfaces', {}).get('interface', [])
            for ni_interface in ni_interfaces:
                #ni_if_id     = ni_interface['id']
                ni_if_config = ni_interface['config']
                ni_if_name   = ni_if_config['interface']
                ni_sif_index = ni_if_config['subinterface']
                ni_if_id     = '{:s}.{:d}'.format(ni_if_name, ni_sif_index)

                _interface = {'name': ni_name, 'id': ni_if_id, 'if_name': ni_if_name, 'sif_index': ni_sif_index}
                entry_interface_key = '{:s}/interface[{:s}]'.format(entry_net_inst_key, ni_if_id)
                entries.append((entry_interface_key, _interface))

            ni_protocols = network_instance.get('protocols', {}).get('protocol', [])
            for ni_protocol in ni_protocols:
                ni_protocol_id = ni_protocol['identifier'].split(':')[-1]
+3 −5
Original line number Diff line number Diff line
@@ -32,10 +32,6 @@ class NetworkInstanceInterfaceHandler(_Handler):
        ni_name   = get_str(resource_value, 'name'        ) # test-svc
        if_name   = get_str(resource_value, 'if_name'     ) # ethernet-1/1
        sif_index = get_int(resource_value, 'sif_index', 0) # 0
        
        if IS_CEOS:
            if_id = if_name
        else:
        if_id     = '{:s}.{:d}'.format(if_name, sif_index)

        if delete:
@@ -44,6 +40,8 @@ class NetworkInstanceInterfaceHandler(_Handler):
            str_data = json.dumps({})
            return str_path, str_data

        if IS_CEOS: if_id = if_name

        str_path = '/network-instances/network-instance[name={:s}]/interfaces/interface[id={:s}]'.format(ni_name, if_id)
        #str_data = json.dumps({
        #    'id': if_id,
+110 −68
Original line number Diff line number Diff line
@@ -141,7 +141,6 @@ def test_get_network_instances(
    num_diffs = len(diff_data)
    if num_diffs > 0: LOGGER.error('Differences[{:d}]:\n{:s}'.format(num_diffs, str(diff_data.pretty())))
    assert num_diffs == 0
    raise Exception()


def test_set_network_instances(
@@ -284,39 +283,80 @@ def test_add_interfaces_to_network_instance(
    results_setconfig = driver.SetConfig(resources_to_set)
    LOGGER.info('results_setconfig = {:s}'.format(str(results_setconfig)))

    #interfaces = sorted(['Ethernet1', 'Ethernet10'])
    #results = set(results_setconfig)
    #assert len(results) == len(interfaces)
    #for if_name in interfaces:
    #    assert ('/interface[{:s}]'.format(if_name), True) in results
    interfaces = sorted([
        '{:s}.{:d}'.format(if_name, sif_index)
        for if_name, sif_index, _, _, _ in NI_INTERFACES
    ])
    results = set(results_setconfig)
    assert len(results) == len(interfaces)
    for if_name in interfaces:
        assert ('/network_instance[{:s}]/interface[{:s}]'.format(NI_NAME, if_name), True) in results

    #expected_getconfig = get_expected_interface_config(storage)
    #expected_getconfig.extend([
    #    ('/interface[Ethernet1]/subinterface[0]/ipv4[192.168.1.1]', {
    #        'ip': '192.168.1.1', 'origin': 'STATIC', 'prefix': 24
    #    }),
    #    ('/interface[Ethernet10]/subinterface[0]/ipv4[192.168.10.1]', {
    #        'ip': '192.168.10.1', 'origin': 'STATIC', 'prefix': 24
    #    })
    #])

    #permitted_retries = 5
    #while permitted_retries > 0:
    #    resources_to_get = [RESOURCE_INTERFACES]
    #    LOGGER.info('resources_to_get = {:s}'.format(str(resources_to_get)))
    #    results_getconfig = driver.GetConfig(resources_to_get)
    #    LOGGER.info('results_getconfig = {:s}'.format(str(results_getconfig)))
    #
    #    diff_data = deepdiff.DeepDiff(sorted(expected_getconfig), sorted(results_getconfig))
    #    num_diffs = len(diff_data)
    #    if num_diffs == 0: break
    #    # let the device take some time to reconfigure
    #    time.sleep(0.5)
    #    permitted_retries -= 1
    expected_getconfig = get_expected_interface_config(storage)
    expected_getconfig.extend([
        ('/interface[{:s}]/subinterface[{:d}]/ipv4[{:s}]'.format(if_name, sif_index, ipv4_addr), {
            'ip': ipv4_addr, 'origin': 'STATIC', 'prefix': ipv4_prefix
        })
        for if_name, sif_index, ipv4_addr, ipv4_prefix, _ in NI_INTERFACES
    ])
    LOGGER.info('expected_getconfig = {:s}'.format(str(sorted(expected_getconfig))))

    #if num_diffs > 0: LOGGER.error('Differences[{:d}]:\n{:s}'.format(num_diffs, str(diff_data.pretty())))
    #assert num_diffs == 0
    raise Exception()
    permitted_retries = 5
    while permitted_retries > 0:
        resources_to_get = [RESOURCE_INTERFACES]
        LOGGER.info('resources_to_get = {:s}'.format(str(resources_to_get)))
        results_getconfig = driver.GetConfig(resources_to_get)
        LOGGER.info('results_getconfig = {:s}'.format(str(results_getconfig)))
    
        diff_data = deepdiff.DeepDiff(sorted(expected_getconfig), sorted(results_getconfig))
        num_diffs = len(diff_data)
        if num_diffs == 0: break
        # let the device take some time to reconfigure
        time.sleep(0.5)
        permitted_retries -= 1

    if num_diffs > 0: LOGGER.error('Differences[{:d}]:\n{:s}'.format(num_diffs, str(diff_data.pretty())))
    assert num_diffs == 0

    expected_getconfig = get_expected_network_instance_config(storage)
    expected_getconfig.extend([
        ('/network_instance[{:s}]'.format(NI_NAME), {
            'name': NI_NAME, 'type': NI_TYPE
        }),
        ('/network_instance[{:s}]/protocol[DIRECTLY_CONNECTED]'.format(NI_NAME), {
            'id': 'DIRECTLY_CONNECTED', 'name': 'DIRECTLY_CONNECTED'
        }),
        ('/network_instance[{:s}]/table[DIRECTLY_CONNECTED,IPV4]'.format(NI_NAME), {
            'protocol': 'DIRECTLY_CONNECTED', 'address_family': 'IPV4'
        }),
        ('/network_instance[{:s}]/table[DIRECTLY_CONNECTED,IPV6]'.format(NI_NAME), {
            'protocol': 'DIRECTLY_CONNECTED', 'address_family': 'IPV6'
        })
    ])
    LOGGER.info('expected_getconfig = {:s}'.format(str(sorted(expected_getconfig))))

    permitted_retries = 5
    while permitted_retries > 0:
        resources_to_get = [RESOURCE_NETWORK_INSTANCES]
        LOGGER.info('resources_to_get = {:s}'.format(str(resources_to_get)))
        results_getconfig = driver.GetConfig(resources_to_get)
        LOGGER.info('results_getconfig = {:s}'.format(str(results_getconfig)))

        for resource_key, resource_value in results_getconfig:
            match = re.match(r'^\/network\_instance\[([^\]]+)\]\/vlan\[([^\]]+)\]$', resource_key)
            if match is None: continue
            members = resource_value.get('members')
            if len(members) > 0: resource_value['members'] = sorted(members)

        diff_data = deepdiff.DeepDiff(sorted(expected_getconfig), sorted(results_getconfig))
        num_diffs = len(diff_data)
        if num_diffs == 0: break
        # let the device take some time to reconfigure
        time.sleep(0.5)
        permitted_retries -= 1

    if num_diffs > 0: LOGGER.error('Differences[{:d}]:\n{:s}'.format(num_diffs, str(diff_data.pretty())))
    assert num_diffs == 0


def test_set_network_instance_static_routes(
@@ -336,43 +376,45 @@ def test_set_network_instance_static_routes(
    results_setconfig = driver.SetConfig(resources_to_set)
    LOGGER.info('results_setconfig = {:s}'.format(str(results_setconfig)))

    prefixes = sorted([
        prefix
        for prefix, _, _ in NI_STATIC_ROUTES
    ])
    results = set(results_setconfig)
    assert len(results) == len(prefixes)
    for prefix in prefixes:
        assert ('/network_instance[{:s}]/static_route[{:s}]'.format(NI_NAME, prefix), True) in results

    expected_getconfig = get_expected_network_instance_config(storage)
    expected_getconfig.extend([
        ('/network_instance[{:s}]/static_route[{:s}]'.format(NI_NAME, prefix), {
            'name': NI_NAME, 'prefix': prefix, 'next_hop': gateway, 'next_hop_index': 0, 'metric': metric
        })
        for prefix, gateway, metric in NI_STATIC_ROUTES
    ])

    permitted_retries = 5
    while permitted_retries > 0:
        resources_to_get = [RESOURCE_NETWORK_INSTANCES]
        LOGGER.info('resources_to_get = {:s}'.format(str(resources_to_get)))
        results_getconfig = driver.GetConfig(resources_to_get)
        LOGGER.info('results_getconfig = {:s}'.format(str(results_getconfig)))

        for resource_key, resource_value in results_getconfig:
            match = re.match(r'^\/network\_instance\[([^\]]+)\]\/vlan\[([^\]]+)\]$', resource_key)
            if match is None: continue
            members = resource_value.get('members')
            if len(members) > 0: resource_value['members'] = sorted(members)

    #interfaces = sorted(['Ethernet1', 'Ethernet10'])
    #results = set(results_setconfig)
    #assert len(results) == len(interfaces)
    #for if_name in interfaces:
    #    assert ('/interface[{:s}]'.format(if_name), True) in results
        diff_data = deepdiff.DeepDiff(sorted(expected_getconfig), sorted(results_getconfig))
        num_diffs = len(diff_data)
        if num_diffs == 0: break
        # let the device take some time to reconfigure
        time.sleep(0.5)
        permitted_retries -= 1

    #expected_getconfig = get_expected_interface_config(storage)
    #expected_getconfig.extend([
    #    ('/interface[Ethernet1]/subinterface[0]/ipv4[192.168.1.1]', {
    #        'ip': '192.168.1.1', 'origin': 'STATIC', 'prefix': 24
    #    }),
    #    ('/interface[Ethernet10]/subinterface[0]/ipv4[192.168.10.1]', {
    #        'ip': '192.168.10.1', 'origin': 'STATIC', 'prefix': 24
    #    })
    #])

    #permitted_retries = 5
    #while permitted_retries > 0:
    #    resources_to_get = [RESOURCE_INTERFACES]
    #    LOGGER.info('resources_to_get = {:s}'.format(str(resources_to_get)))
    #    results_getconfig = driver.GetConfig(resources_to_get)
    #    LOGGER.info('results_getconfig = {:s}'.format(str(results_getconfig)))
    #
    #    diff_data = deepdiff.DeepDiff(sorted(expected_getconfig), sorted(results_getconfig))
    #    num_diffs = len(diff_data)
    #    if num_diffs == 0: break
    #    # let the device take some time to reconfigure
    #    time.sleep(0.5)
    #    permitted_retries -= 1
    #
    #if num_diffs > 0: LOGGER.error('Differences[{:d}]:\n{:s}'.format(num_diffs, str(diff_data.pretty())))
    #assert num_diffs == 0
    raise Exception()
    if num_diffs > 0: LOGGER.error('Differences[{:d}]:\n{:s}'.format(num_diffs, str(diff_data.pretty())))
    assert num_diffs == 0


def test_del_network_instance_static_routes(
@@ -429,16 +471,16 @@ def test_del_interfaces_from_network_instance(
    LOGGER.info('results_getconfig = {:s}'.format(str(results_getconfig)))

    resources_to_delete = [
        network_instance_interface(NI_NAME, ni_if_name, ni_sif_index)
        for ni_if_name, ni_sif_index in NI_INTERFACES
        network_instance_interface(NI_NAME, if_name, sif_index)
        for if_name, sif_index, _, _, _ in NI_INTERFACES
    ]
    LOGGER.info('resources_to_delete = {:s}'.format(str(resources_to_delete)))
    results_deleteconfig = driver.DeleteConfig(resources_to_delete)
    LOGGER.info('results_deleteconfig = {:s}'.format(str(results_deleteconfig)))

    interface_ids = sorted([
        '{:s}.{:d}'.format(ni_if_name, ni_sif_index)
        for ni_if_name, ni_sif_index in NI_INTERFACES
        '{:s}.{:d}'.format(if_name, sif_index)
        for if_name, sif_index, _, _, _ in NI_INTERFACES
    ])
    results = set(results_deleteconfig)
    assert len(results) == len(interface_ids)