diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstance.py b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstance.py index 1efed024c1c9e8f5d0aad0494c4a1e4d51bebf0e..b9761298704f9e13e75ad7421370a7ce00349e82 100644 --- a/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstance.py +++ b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstance.py @@ -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] diff --git a/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceInterface.py b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceInterface.py index ab105c2b0e8f8fa086805b8485651891c12bfd5f..af2178fe9966b86bf5c7447cf5c7b76cd61e5664 100644 --- a/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceInterface.py +++ b/src/device/service/drivers/gnmi_openconfig/handlers/NetworkInstanceInterface.py @@ -32,11 +32,7 @@ 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_id = '{:s}.{:d}'.format(if_name, sif_index) if delete: PATH_TMPL = '/network-instances/network-instance[name={:s}]/interfaces/interface[id={:s}]' @@ -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, diff --git a/src/device/tests/gnmi_openconfig/test_unitary_gnmi_openconfig.py b/src/device/tests/gnmi_openconfig/test_unitary_gnmi_openconfig.py index 69b7a609ad40f6a3c57c315d3ef0a18a0e4bcdfc..47c8e1cdbd692749b7142bc706705cedc0074bb5 100644 --- a/src/device/tests/gnmi_openconfig/test_unitary_gnmi_openconfig.py +++ b/src/device/tests/gnmi_openconfig/test_unitary_gnmi_openconfig.py @@ -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)