Commit 3af2558b authored by Lluis Gifre Renom's avatar Lluis Gifre Renom
Browse files

OFC25 test:

- Fixed validation of imported devices
parent 3e392d9b
Loading
Loading
Loading
Loading
+64 −3
Original line number Diff line number Diff line
@@ -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__)
@@ -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))
+15 −3
Original line number Diff line number Diff line
@@ -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)
@@ -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:
@@ -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:
@@ -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
@@ -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
+4 −2
Original line number Diff line number Diff line
@@ -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)
@@ -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
@@ -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)