diff --git a/src/device/tests/gnmi_openconfig/storage/StorageNetworkInstance.py b/src/device/tests/gnmi_openconfig/storage/StorageNetworkInstance.py index 558cc032cdf0be46733f565f7c9143bdcc401e78..fa336488317776a10e20b283acfc1dcfbc3d7b8a 100644 --- a/src/device/tests/gnmi_openconfig/storage/StorageNetworkInstance.py +++ b/src/device/tests/gnmi_openconfig/storage/StorageNetworkInstance.py @@ -45,16 +45,14 @@ class NetworkInstances: class Interfaces: STRUCT : List[Tuple[str, List[str]]] = [ - ('/network_instance[{:s}]/interface[{:s}]', ['ni_name', 'if_name']), + ('/network_instance[{:s}]/interface[{:s}]', []), ] def __init__(self) -> None: self._items : Dict[Tuple[str, str], Dict] = dict() def add(self, ni_name : str, if_name : str) -> None: - item = self._items.setdefault((ni_name, if_name), dict()) - item['ni_name'] = ni_name - item['if_name'] = if_name + self._items.setdefault((ni_name, if_name), dict()) def remove(self, ni_name : str, if_name : str) -> None: self._items.pop((ni_name, if_name), None) @@ -86,6 +84,11 @@ class StaticRoutes: ('/network_instance[{:s}]/protocol[{:s}]/static_routes[{:s}]', ['prefix', 'next_hops']), ] + #('/network_instance[{:s}]/static_route[{:s}]'.format(ni_name, static_route['prefix']), { + # 'name': ni_name, 'prefix': static_route['prefix'], 'next_hop': static_route['gateway'], + # 'next_hop_index': 0, 'metric': static_route['metric'] + #}) + def __init__(self) -> None: self._items : Dict[Tuple[str, str, str], Dict] = dict() 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 dd0561a2b82b81ff2fe89e8369a829a1950e61b4..3970e65a63ba5325da37cc3ea20baf42936ad947 100644 --- a/src/device/tests/gnmi_openconfig/test_unitary_gnmi_openconfig.py +++ b/src/device/tests/gnmi_openconfig/test_unitary_gnmi_openconfig.py @@ -16,21 +16,17 @@ import os os.environ['DEVICE_EMULATED_ONLY'] = 'YES' # pylint: disable=wrong-import-position -import itertools, logging, pytest, time +import logging, pytest, time from typing import Dict -from device.service.driver_api._Driver import ( - RESOURCE_ENDPOINTS, RESOURCE_INTERFACES, RESOURCE_NETWORK_INSTANCES, RESOURCE_ROUTING_POLICIES, RESOURCE_SERVICES -) from device.service.drivers.gnmi_openconfig.GnmiOpenConfigDriver import GnmiOpenConfigDriver -from .tools.check_config import check_config_endpoints, check_config_interfaces, check_config_network_instances -from .tools.check_updates import check_updates -from .tools.expected_config_composers import ( - compose_expected_config__interface, compose_expected_config__network_instance +from .storage.Storage import Storage +from .tools.check_config import ( + check_config_endpoints, check_config_interfaces, check_config_network_instances ) +from .tools.check_updates import check_updates from .tools.request_composers import ( interface, network_instance, network_instance_interface, network_instance_static_route ) -from .storage.Storage import Storage logging.basicConfig(level=logging.DEBUG) LOGGER = logging.getLogger(__name__) @@ -200,7 +196,7 @@ def test_add_interfaces_to_network_instance( subif_index = ni_if['sif_index'] resources_to_set.append(network_instance_interface(ni_name, if_name, subif_index)) ni_if_names.append((ni_name, '{:s}.{:d}'.format(if_name, subif_index))) - storage.network_instances.interfaces.add(ni_name, if_name, subif_index) + storage.network_instances.interfaces.add(ni_name, if_name) # TODO: add subif_index LOGGER.info('resources_to_set = {:s}'.format(str(resources_to_set))) results_setconfig = driver.SetConfig(resources_to_set) @@ -218,22 +214,26 @@ def test_set_network_instance_static_routes( check_config_interfaces(driver, storage) check_config_network_instances(driver, storage) - # TODO: update structure + resources_to_set = list() + ni_sr_prefixes = list() + for ni in NETWORK_INSTANCES: + ni_name = ni['name'] + for ni_sr in ni.get('static_routes', list()): + ni_sr_prefix = ni_sr['prefix' ] + ni_sr_gateway = ni_sr['gateway'] + ni_sr_metric = ni_sr['metric' ] + resources_to_set.append( + network_instance_static_route(ni_name, ni_sr_prefix, ni_sr_gateway, metric=ni_sr_metric) + ) + ni_sr_prefixes.append((ni_name, ni_sr_prefix)) + storage.network_instances.protocol_static.add(ni_name, 'STATIC', ni_sr_prefix, { + 'prefix': ni_sr_prefix, + }) - resources_to_set = list(itertools.chain(*[ - [ - network_instance_static_route(ni['name'], ni_sr['prefix'], ni_sr['gateway'], metric=ni_sr['metric']) - for ni_sr in ni.get('static_routes', list()) - ] - for ni in NETWORK_INSTANCES - ])) LOGGER.info('resources_to_set = {:s}'.format(str(resources_to_set))) results_setconfig = driver.SetConfig(resources_to_set) LOGGER.info('results_setconfig = {:s}'.format(str(results_setconfig))) - check_updates(results_setconfig, '/network_instance[{:s}]/static_route[{:s}]', list(itertools.chain(*[ - [(ni['name'], ni_sr['prefix']) for ni_sr in ni.get('static_routes', list())] - for ni in NETWORK_INSTANCES - ]))) + check_updates(results_setconfig, '/network_instance[{:s}]/static_route[{:s}]', ni_sr_prefixes) check_config_interfaces(driver, storage, max_retries=5) check_config_network_instances(driver, storage, max_retries=5) @@ -246,22 +246,24 @@ def test_del_network_instance_static_routes( check_config_interfaces(driver, storage) check_config_network_instances(driver, storage) - # TODO: update structure + resources_to_delete = list() + ni_sr_prefixes = list() + for ni in NETWORK_INSTANCES: + ni_name = ni['name'] + for ni_sr in ni.get('static_routes', list()): + ni_sr_prefix = ni_sr['prefix' ] + ni_sr_gateway = ni_sr['gateway'] + ni_sr_metric = ni_sr['metric' ] + resources_to_delete.append( + network_instance_static_route(ni_name, ni_sr_prefix, ni_sr_gateway, metric=ni_sr_metric) + ) + ni_sr_prefixes.append((ni_name, ni_sr_prefix)) + storage.network_instances.protocol_static.remove(ni_name, 'STATIC', ni_sr_prefix) - resources_to_delete = list(itertools.chain(*[ - [ - network_instance_static_route(ni['name'], ni_sr['prefix'], ni_sr['gateway'], metric=ni_sr['metric']) - for ni_sr in ni.get('static_routes', list()) - ] - for ni in NETWORK_INSTANCES - ])) 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))) - check_updates(results_deleteconfig, '/network_instance[{:s}]/static_route[{:s}]', list(itertools.chain(*[ - [(ni['name'], ni_sr['prefix']) for ni_sr in ni.get('static_routes', list())] - for ni in NETWORK_INSTANCES - ]))) + check_updates(results_deleteconfig, '/network_instance[{:s}]/static_route[{:s}]', ni_sr_prefixes) check_config_interfaces(driver, storage, max_retries=5) check_config_network_instances(driver, storage, max_retries=5) @@ -274,26 +276,22 @@ def test_del_interfaces_from_network_instance( check_config_interfaces(driver, storage) check_config_network_instances(driver, storage) - # TODO: update structure + resources_to_delete = list() + ni_if_names = list() + for ni in NETWORK_INSTANCES: + ni_name = ni['name'] + for ni_if in ni.get('interfaces', list()): + if_name = ni_if['if_name'] + subif_index = ni_if['sif_index'] + resources_to_delete.append(network_instance_interface(ni_name, if_name, subif_index)) + ni_if_names.append((ni_name, '{:s}.{:d}'.format(if_name, subif_index))) + storage.network_instances.interfaces.remove(ni_name, if_name) # TODO: add subif_index - resources_to_delete = list(itertools.chain(*[ - [ - network_instance_interface(ni['name'], ni_if['if_name'], ni_if['subif_index']) - for ni_if in ni.get('interfaces', list()) - ] - for ni in NETWORK_INSTANCES - ])) 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))) - check_updates(results_deleteconfig, '/network_instance[{:s}]/interface[{:s}]', list(itertools.chain(*[ - [ - (ni['name'], '{:s}.{:d}'.format(ni_if['if_name'], ni_if['subif_index'])) - for ni_if in ni.get('interfaces', list()) - ] - for ni in NETWORK_INSTANCES - ]))) - + check_updates(results_deleteconfig, '/network_instance[{:s}]/interface[{:s}]', ni_if_names) + check_config_interfaces(driver, storage, max_retries=5) check_config_network_instances(driver, storage, max_retries=5) @@ -305,22 +303,24 @@ def test_del_interfaces( check_config_interfaces(driver, storage) check_config_network_instances(driver, storage) - # TODO: update structure + resources_to_delete = list() + if_names = list() + for ni in NETWORK_INSTANCES: + ni_name = ni['name'] + for ni_if in ni.get('interfaces', list()): + if_name = ni_if['if_name'] + subif_index = ni_if['sif_index'] + ipv4_address = ni_if['ipv4_addr'] + ipv4_prefix = ni_if['ipv4_prefix'] + enabled = ni_if['enabled'] + resources_to_delete.append(interface(if_name, subif_index, ipv4_address, ipv4_prefix, enabled)) + if_names.append(ni_name) + storage.interfaces.ipv4_addresses.remove(if_name, subif_index, ipv4_address) - resources_to_delete = list(itertools.chain(*[ - [ - interface(ni_if['if_name'], ni_if['sif_index'], ni_if['ipv4_addr'], ni_if['ipv4_prefix'], ni_if['enabled']) - for ni_if in ni.get('interfaces', list()) - ] - for ni in NETWORK_INSTANCES - ])) 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))) - check_updates(results_deleteconfig, '/interface[{:s}]', list(itertools.chain(*[ - [ni_if['name'] for ni_if in ni.get('interfaces', list())] - for ni in NETWORK_INSTANCES - ]))) + check_updates(results_deleteconfig, '/interface[{:s}]', if_names) check_config_interfaces(driver, storage, max_retries=5) check_config_network_instances(driver, storage, max_retries=5) @@ -333,16 +333,19 @@ def test_del_network_instances( check_config_interfaces(driver, storage) check_config_network_instances(driver, storage) - # TODO: update structure + resources_to_delete = list() + ni_names = list() + for ni in NETWORK_INSTANCES: + ni_name = ni['name'] + ni_type = ni['type'] + resources_to_delete.append(network_instance(ni_name, ni_type)) + ni_names.append(ni_name) + storage.network_instances.network_instances.remove(ni_name) - resources_to_delete = [ - network_instance(ni['name'], ni['type']) - for ni in NETWORK_INSTANCES - ] 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))) - check_updates(results_deleteconfig, '/network_instance[{:s}]', [ni['name'] for ni in NETWORK_INSTANCES]) + check_updates(results_deleteconfig, '/network_instance[{:s}]', ni_names) check_config_interfaces(driver, storage, max_retries=5) check_config_network_instances(driver, storage, max_retries=5) diff --git a/src/device/tests/gnmi_openconfig/tools/check_config.py b/src/device/tests/gnmi_openconfig/tools/check_config.py index 017a7038e3c264cba9a32fda2bcd4cb7ead38589..974acdeba4c02b1197c2af74a229f537118a4577 100644 --- a/src/device/tests/gnmi_openconfig/tools/check_config.py +++ b/src/device/tests/gnmi_openconfig/tools/check_config.py @@ -75,7 +75,6 @@ def check_config_network_instances( driver : GnmiOpenConfigDriver, storage : Storage, max_retries : int = 1, retry_delay : float = 0.5 ) -> List[Dict]: - expected_config = return check_expected_config( driver, [RESOURCE_NETWORK_INSTANCES], storage.network_instances.get_expected_config(), adapt_network_instance, max_retries=max_retries, retry_delay=retry_delay diff --git a/src/device/tests/gnmi_openconfig/tools/expected_config_composers.py b/src/device/tests/gnmi_openconfig/tools/expected_config_composers.py deleted file mode 100644 index 487476c016fd86991c50f66fb8dc9ec9b112d643..0000000000000000000000000000000000000000 --- a/src/device/tests/gnmi_openconfig/tools/expected_config_composers.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright 2022-2023 ETSI TeraFlowSDN - TFS OSG (https://tfs.etsi.org/) -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from typing import Dict, List - - -def compose_expected_config__network_instance( - network_instances : List[Dict], include_interfaces : bool = False, include_static_routes : bool = False -) -> List[Dict]: - expected_config = list() - for network_instance in network_instances: - ni_name = network_instance['name'] - ni_type = network_instance['type'] - - expected_config.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' - }) - ]) - - if include_interfaces: - expected_config.extend([ - ('/network_instance[{:s}]/interface[{:s}]'.format(ni_name, interface['name']), { - - }) - for interface in network_instance.get('interfaces', list()) - ]) - - if include_static_routes: - expected_config.extend([ - ('/network_instance[{:s}]/static_route[{:s}]'.format(ni_name, static_route['prefix']), { - 'name': ni_name, 'prefix': static_route['prefix'], 'next_hop': static_route['gateway'], - 'next_hop_index': 0, 'metric': static_route['metric'] - }) - for static_route in network_instance.get('static_routes', list()) - ]) - - return expected_config