Loading src/tests/ofc25/tests/Helper.py +64 −3 Original line number Diff line number Diff line Loading @@ -15,11 +15,11 @@ import logging import os import time from typing import List, Set from typing import List, Set, Tuple from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, Empty, LinkTypeEnum, ServiceStatusEnum, ServiceTypeEnum from common.tools.grpc.Tools import grpc_message_to_json_string from common.proto.context_pb2 import ContextId, Device, Empty, LinkTypeEnum, ServiceStatusEnum, ServiceTypeEnum from common.tools.grpc.Tools import grpc_message_list_to_json_string, grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id LOGGER = logging.getLogger(__name__) Loading @@ -35,6 +35,67 @@ VIRTUAL_LINK_DESCRIPTORS = [ DESCRIPTORS_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'descriptors') def is_imported_device(device: Device) -> bool: return device.HasField('controller_id') and bool(device.controller_id.device_uuid.uuid) def split_imported_devices(devices: List[Device]) -> Tuple[List[Device], List[Device]]: imported_devices = [device for device in devices if is_imported_device(device)] local_devices = [device for device in devices if not is_imported_device(device)] return local_devices, imported_devices def log_device_inventory(context_client, profile_name: str, log_prefix: str = 'Device inventory') -> Tuple[List[Device], List[Device]]: response = context_client.ListDevices(Empty()) local_devices, imported_devices = split_imported_devices(response.devices) LOGGER.info( '[%s] %s: total=%d local=%d imported=%d', profile_name, log_prefix, len(response.devices), len(local_devices), len(imported_devices), ) LOGGER.info('[%s] Local devices: %s', profile_name, grpc_message_list_to_json_string(local_devices)) LOGGER.info('[%s] Imported devices: %s', profile_name, grpc_message_list_to_json_string(imported_devices)) return local_devices, imported_devices def validate_descriptor_state(context_client, descriptor_loader, profile_name: str) -> None: contexts = context_client.ListContexts(Empty()) assert len(contexts.contexts) == descriptor_loader.num_contexts for context_uuid, num_topologies in descriptor_loader.num_topologies.items(): response = context_client.ListTopologies(ContextId(**json_context_id(context_uuid))) assert len(response.topologies) == num_topologies local_devices, imported_devices = log_device_inventory( context_client, profile_name, log_prefix='Descriptor validation device inventory' ) assert len(local_devices) == descriptor_loader.num_devices if imported_devices: LOGGER.info( '[%s] Ignoring %d imported devices for descriptor validation because they are learned via controllers', profile_name, len(imported_devices), ) response = context_client.ListLinks(Empty()) assert len(response.links) == descriptor_loader.num_links response = context_client.GetOpticalLinkList(Empty()) assert len(response.optical_links) == descriptor_loader.num_optical_links for context_uuid, num_services in descriptor_loader.num_services.items(): response = context_client.ListServices(ContextId(**json_context_id(context_uuid))) assert len(response.services) == num_services for context_uuid, num_slices in descriptor_loader.num_slices.items(): response = context_client.ListSlices(ContextId(**json_context_id(context_uuid))) assert len(response.slices) == num_slices def list_active_optical_services(context_client) -> List: response = context_client.ListServices(ADMIN_CONTEXT_ID) LOGGER.info('Services[%d] = %s', len(response.services), grpc_message_to_json_string(response)) Loading src/tests/ofc25/tests/test_functional_bootstrap.py +15 −3 Original line number Diff line number Diff line Loading @@ -18,13 +18,14 @@ import time from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario from common.tools.grpc.Tools import grpc_message_to_json, grpc_message_to_json_string from common.tools.grpc.Tools import grpc_message_list_to_json_string, grpc_message_to_json, grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id # pylint: disable=unused-import from .conftest import ( selected_tfs_client_bundle, selected_tfs_profile, selected_topology_descriptor ) from .Helper import split_imported_devices, validate_descriptor_state LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) Loading @@ -44,6 +45,7 @@ def _check_devices_enabled_or_raise(context_client, profile_name: str, max_retry time.sleep(wait_seconds) response = context_client.ListDevices(Empty()) num_devices = len(response.devices) local_devices, imported_devices = split_imported_devices(response.devices) num_devices_enabled = 0 disabled_devices = list() for device in response.devices: Loading @@ -51,7 +53,16 @@ def _check_devices_enabled_or_raise(context_client, profile_name: str, max_retry num_devices_enabled += 1 else: disabled_devices.append(grpc_message_to_json(device)) LOGGER.info('[%s] Num Devices enabled: %d/%d', profile_name, num_devices_enabled, num_devices) LOGGER.info( '[%s] Num Devices enabled: %d/%d (local=%d imported=%d)', profile_name, num_devices_enabled, num_devices, len(local_devices), len(imported_devices), ) LOGGER.info('[%s] Local devices: %s', profile_name, grpc_message_list_to_json_string(local_devices)) LOGGER.info('[%s] Imported devices: %s', profile_name, grpc_message_list_to_json_string(imported_devices)) num_retry += 1 if num_devices_enabled != num_devices: Loading @@ -63,6 +74,7 @@ def _check_devices_enabled_or_raise(context_client, profile_name: str, max_retry def test_scenario_bootstrap( selected_tfs_client_bundle, selected_tfs_profile: str, selected_topology_descriptor: str, ) -> None: context_client = selected_tfs_client_bundle.context Loading @@ -77,7 +89,7 @@ def test_scenario_bootstrap( ) results = descriptor_loader.process() check_descriptor_load_results(results, descriptor_loader) descriptor_loader.validate() validate_descriptor_state(context_client, descriptor_loader, selected_tfs_profile) response = context_client.GetContext(ADMIN_CONTEXT_ID) assert len(response.service_ids) == 0 Loading src/tests/ofc25/tests/test_functional_cleanup.py +4 −2 Original line number Diff line number Diff line Loading @@ -21,8 +21,9 @@ from common.tools.object_factory.Context import json_context_id # pylint: disable=unused-import from .conftest import ( selected_tfs_client_bundle, selected_topology_descriptor selected_tfs_client_bundle, selected_tfs_profile, selected_topology_descriptor ) from .Helper import validate_descriptor_state LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) Loading @@ -32,6 +33,7 @@ ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) def test_scenario_cleanup( selected_tfs_client_bundle, selected_tfs_profile: str, selected_topology_descriptor: str, ) -> None: context_client = selected_tfs_client_bundle.context Loading @@ -46,6 +48,6 @@ def test_scenario_cleanup( context_client=context_client, device_client=device_client, ) descriptor_loader.validate() validate_descriptor_state(context_client, descriptor_loader, selected_tfs_profile) descriptor_loader.unload() validate_empty_scenario(context_client) Loading
src/tests/ofc25/tests/Helper.py +64 −3 Original line number Diff line number Diff line Loading @@ -15,11 +15,11 @@ import logging import os import time from typing import List, Set from typing import List, Set, Tuple from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, Empty, LinkTypeEnum, ServiceStatusEnum, ServiceTypeEnum from common.tools.grpc.Tools import grpc_message_to_json_string from common.proto.context_pb2 import ContextId, Device, Empty, LinkTypeEnum, ServiceStatusEnum, ServiceTypeEnum from common.tools.grpc.Tools import grpc_message_list_to_json_string, grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id LOGGER = logging.getLogger(__name__) Loading @@ -35,6 +35,67 @@ VIRTUAL_LINK_DESCRIPTORS = [ DESCRIPTORS_DIR = os.path.join(os.path.dirname(os.path.abspath(__file__)), '..', 'descriptors') def is_imported_device(device: Device) -> bool: return device.HasField('controller_id') and bool(device.controller_id.device_uuid.uuid) def split_imported_devices(devices: List[Device]) -> Tuple[List[Device], List[Device]]: imported_devices = [device for device in devices if is_imported_device(device)] local_devices = [device for device in devices if not is_imported_device(device)] return local_devices, imported_devices def log_device_inventory(context_client, profile_name: str, log_prefix: str = 'Device inventory') -> Tuple[List[Device], List[Device]]: response = context_client.ListDevices(Empty()) local_devices, imported_devices = split_imported_devices(response.devices) LOGGER.info( '[%s] %s: total=%d local=%d imported=%d', profile_name, log_prefix, len(response.devices), len(local_devices), len(imported_devices), ) LOGGER.info('[%s] Local devices: %s', profile_name, grpc_message_list_to_json_string(local_devices)) LOGGER.info('[%s] Imported devices: %s', profile_name, grpc_message_list_to_json_string(imported_devices)) return local_devices, imported_devices def validate_descriptor_state(context_client, descriptor_loader, profile_name: str) -> None: contexts = context_client.ListContexts(Empty()) assert len(contexts.contexts) == descriptor_loader.num_contexts for context_uuid, num_topologies in descriptor_loader.num_topologies.items(): response = context_client.ListTopologies(ContextId(**json_context_id(context_uuid))) assert len(response.topologies) == num_topologies local_devices, imported_devices = log_device_inventory( context_client, profile_name, log_prefix='Descriptor validation device inventory' ) assert len(local_devices) == descriptor_loader.num_devices if imported_devices: LOGGER.info( '[%s] Ignoring %d imported devices for descriptor validation because they are learned via controllers', profile_name, len(imported_devices), ) response = context_client.ListLinks(Empty()) assert len(response.links) == descriptor_loader.num_links response = context_client.GetOpticalLinkList(Empty()) assert len(response.optical_links) == descriptor_loader.num_optical_links for context_uuid, num_services in descriptor_loader.num_services.items(): response = context_client.ListServices(ContextId(**json_context_id(context_uuid))) assert len(response.services) == num_services for context_uuid, num_slices in descriptor_loader.num_slices.items(): response = context_client.ListSlices(ContextId(**json_context_id(context_uuid))) assert len(response.slices) == num_slices def list_active_optical_services(context_client) -> List: response = context_client.ListServices(ADMIN_CONTEXT_ID) LOGGER.info('Services[%d] = %s', len(response.services), grpc_message_to_json_string(response)) Loading
src/tests/ofc25/tests/test_functional_bootstrap.py +15 −3 Original line number Diff line number Diff line Loading @@ -18,13 +18,14 @@ import time from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, DeviceOperationalStatusEnum, Empty from common.tools.descriptor.Loader import DescriptorLoader, check_descriptor_load_results, validate_empty_scenario from common.tools.grpc.Tools import grpc_message_to_json, grpc_message_to_json_string from common.tools.grpc.Tools import grpc_message_list_to_json_string, grpc_message_to_json, grpc_message_to_json_string from common.tools.object_factory.Context import json_context_id # pylint: disable=unused-import from .conftest import ( selected_tfs_client_bundle, selected_tfs_profile, selected_topology_descriptor ) from .Helper import split_imported_devices, validate_descriptor_state LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) Loading @@ -44,6 +45,7 @@ def _check_devices_enabled_or_raise(context_client, profile_name: str, max_retry time.sleep(wait_seconds) response = context_client.ListDevices(Empty()) num_devices = len(response.devices) local_devices, imported_devices = split_imported_devices(response.devices) num_devices_enabled = 0 disabled_devices = list() for device in response.devices: Loading @@ -51,7 +53,16 @@ def _check_devices_enabled_or_raise(context_client, profile_name: str, max_retry num_devices_enabled += 1 else: disabled_devices.append(grpc_message_to_json(device)) LOGGER.info('[%s] Num Devices enabled: %d/%d', profile_name, num_devices_enabled, num_devices) LOGGER.info( '[%s] Num Devices enabled: %d/%d (local=%d imported=%d)', profile_name, num_devices_enabled, num_devices, len(local_devices), len(imported_devices), ) LOGGER.info('[%s] Local devices: %s', profile_name, grpc_message_list_to_json_string(local_devices)) LOGGER.info('[%s] Imported devices: %s', profile_name, grpc_message_list_to_json_string(imported_devices)) num_retry += 1 if num_devices_enabled != num_devices: Loading @@ -63,6 +74,7 @@ def _check_devices_enabled_or_raise(context_client, profile_name: str, max_retry def test_scenario_bootstrap( selected_tfs_client_bundle, selected_tfs_profile: str, selected_topology_descriptor: str, ) -> None: context_client = selected_tfs_client_bundle.context Loading @@ -77,7 +89,7 @@ def test_scenario_bootstrap( ) results = descriptor_loader.process() check_descriptor_load_results(results, descriptor_loader) descriptor_loader.validate() validate_descriptor_state(context_client, descriptor_loader, selected_tfs_profile) response = context_client.GetContext(ADMIN_CONTEXT_ID) assert len(response.service_ids) == 0 Loading
src/tests/ofc25/tests/test_functional_cleanup.py +4 −2 Original line number Diff line number Diff line Loading @@ -21,8 +21,9 @@ from common.tools.object_factory.Context import json_context_id # pylint: disable=unused-import from .conftest import ( selected_tfs_client_bundle, selected_topology_descriptor selected_tfs_client_bundle, selected_tfs_profile, selected_topology_descriptor ) from .Helper import validate_descriptor_state LOGGER = logging.getLogger(__name__) LOGGER.setLevel(logging.DEBUG) Loading @@ -32,6 +33,7 @@ ADMIN_CONTEXT_ID = ContextId(**json_context_id(DEFAULT_CONTEXT_NAME)) def test_scenario_cleanup( selected_tfs_client_bundle, selected_tfs_profile: str, selected_topology_descriptor: str, ) -> None: context_client = selected_tfs_client_bundle.context Loading @@ -46,6 +48,6 @@ def test_scenario_cleanup( context_client=context_client, device_client=device_client, ) descriptor_loader.validate() validate_descriptor_state(context_client, descriptor_loader, selected_tfs_profile) descriptor_loader.unload() validate_empty_scenario(context_client)