Loading src/tests/ofc25/tests/Helper.py +46 −18 Original line number Diff line number Diff line Loading @@ -15,7 +15,7 @@ import logging import os import time from typing import List, Set, Tuple from typing import List, Optional, Set, Tuple from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, Device, Empty, Link, LinkTypeEnum, ServiceStatusEnum, ServiceTypeEnum Loading Loading @@ -216,15 +216,20 @@ def describe_services(context_client, profile_name: str) -> str: return str(services) def get_virtual_link_ids(context_client) -> Set[str]: def get_virtual_link_identifiers(context_client) -> Tuple[Set[str], Set[str]]: response = context_client.ListLinks(Empty()) virtual_link_ids = { link.link_id.link_uuid.uuid for link in response.links if link.link_type == LinkTypeEnum.LINKTYPE_VIRTUAL } LOGGER.info('VirtualLinks[%d] = %s', len(virtual_link_ids), str(sorted(virtual_link_ids))) return virtual_link_ids virtual_link_uuids = set() virtual_link_names = set() for link in response.links: if link.link_type != LinkTypeEnum.LINKTYPE_VIRTUAL: continue virtual_link_uuids.add(link.link_id.link_uuid.uuid) if len(link.name) > 0: virtual_link_names.add(link.name) LOGGER.info('VirtualLinkNames[%d] = %s', len(virtual_link_names), str(sorted(virtual_link_names))) LOGGER.info('VirtualLinkUuids[%d] = %s', len(virtual_link_uuids), str(sorted(virtual_link_uuids))) return virtual_link_uuids, virtual_link_names def describe_links(context_client, profile_name: str) -> str: Loading @@ -245,19 +250,32 @@ def log_global_state(ip_context_client, e2e_context_client, opt_context_client) describe_services(opt_context_client, 'opt') def assert_expected_set(actual_items: Set[str], expected_items: Optional[Set[str]], label: str) -> None: if expected_items is None: return assert actual_items == expected_items, ( '{:s} mismatch: expected={:s} actual={:s}'.format( label, str(sorted(expected_items)), str(sorted(actual_items)) ) ) def assert_global_state( ip_context_client, e2e_context_client, opt_context_client, expected_virtual_link_ids: Set[str], expected_virtual_link_uuids: Optional[Set[str]], expected_virtual_link_names: Optional[Set[str]], expected_e2e_services: int, expected_opt_connections: int, ) -> None: response = ip_context_client.ListServices(ADMIN_CONTEXT_ID) assert len(response.services) == 0 virtual_link_ids = get_virtual_link_ids(ip_context_client) assert virtual_link_ids == expected_virtual_link_ids virtual_link_uuids, virtual_link_names = get_virtual_link_identifiers(ip_context_client) assert_expected_set(virtual_link_uuids, expected_virtual_link_uuids, 'Virtual link UUIDs') assert_expected_set(virtual_link_names, expected_virtual_link_names, 'Virtual link names') e2e_services = list_active_optical_services(e2e_context_client) if expected_e2e_services == 0: Loading @@ -281,7 +299,8 @@ def wait_for_state_or_raise( ip_context_client, e2e_context_client, opt_context_client, expected_virtual_link_ids: Set[str], expected_virtual_link_uuids: Optional[Set[str]], expected_virtual_link_names: Optional[Set[str]], expected_e2e_services: int, expected_opt_connections: int, max_retry: int = 30, Loading @@ -291,14 +310,21 @@ def wait_for_state_or_raise( for attempt in range(1, max_retry + 1): try: LOGGER.info( 'Checking expected state attempt %d/%d: virtual_links=%s e2e_services=%d opt_connections=%d', attempt, max_retry, str(sorted(expected_virtual_link_ids)), expected_e2e_services, expected_opt_connections 'Checking expected state attempt %d/%d: virtual_link_uuids=%s virtual_link_names=%s ' 'e2e_services=%d opt_connections=%d', attempt, max_retry, '<ignored>' if expected_virtual_link_uuids is None else str(sorted(expected_virtual_link_uuids)), '<ignored>' if expected_virtual_link_names is None else str(sorted(expected_virtual_link_names)), expected_e2e_services, expected_opt_connections, ) assert_global_state( ip_context_client=ip_context_client, e2e_context_client=e2e_context_client, opt_context_client=opt_context_client, expected_virtual_link_ids=expected_virtual_link_ids, expected_virtual_link_uuids=expected_virtual_link_uuids, expected_virtual_link_names=expected_virtual_link_names, expected_e2e_services=expected_e2e_services, expected_opt_connections=expected_opt_connections, ) Loading @@ -313,8 +339,10 @@ def wait_for_state_or_raise( time.sleep(wait_seconds) LOGGER.error( 'Timed out waiting expected state: virtual_links=%s e2e_services=%d opt_connections=%d', str(sorted(expected_virtual_link_ids)), 'Timed out waiting expected state: virtual_link_uuids=%s virtual_link_names=%s ' 'e2e_services=%d opt_connections=%d', '<ignored>' if expected_virtual_link_uuids is None else str(sorted(expected_virtual_link_uuids)), '<ignored>' if expected_virtual_link_names is None else str(sorted(expected_virtual_link_names)), expected_e2e_services, expected_opt_connections, ) Loading src/tests/ofc25/tests/test_functional_create_vlinks.py +11 −8 Original line number Diff line number Diff line Loading @@ -41,13 +41,14 @@ def test_create_virtual_link( ip_context_client=ip_context_client, e2e_context_client=e2e_context_client, opt_context_client=opt_context_client, expected_virtual_link_ids=set(), expected_virtual_link_uuids=None, expected_virtual_link_names=set(), expected_e2e_services=0, expected_opt_connections=0, ) expected_virtual_link_ids: Set[str] = set() for index, (descriptor_name, virtual_link_id) in enumerate(VIRTUAL_LINK_DESCRIPTORS, start=1): expected_virtual_link_names: Set[str] = set() for index, (descriptor_name, virtual_link_name) in enumerate(VIRTUAL_LINK_DESCRIPTORS, start=1): descriptor_file = os.path.join(DESCRIPTORS_DIR, descriptor_name) LOGGER.info( 'Creating virtual link step %d/%d from descriptor %s', Loading @@ -61,18 +62,20 @@ def test_create_virtual_link( ) results = descriptor_loader.process() check_descriptor_load_results(results, descriptor_loader) LOGGER.info('Virtual link request submitted successfully for %s', virtual_link_id) LOGGER.info('Virtual link request submitted successfully for %s', virtual_link_name) expected_virtual_link_ids.add(virtual_link_id) expected_virtual_link_names.add(virtual_link_name) LOGGER.info( 'Waiting for propagated state after creating %s: expected_virtual_links=%s expected_e2e_services=%d', virtual_link_id, str(sorted(expected_virtual_link_ids)), index 'Waiting for propagated state after creating %s: expected_virtual_link_names=%s ' 'expected_e2e_services=%d', virtual_link_name, str(sorted(expected_virtual_link_names)), index ) wait_for_state_or_raise( ip_context_client=ip_context_client, e2e_context_client=e2e_context_client, opt_context_client=opt_context_client, expected_virtual_link_ids=expected_virtual_link_ids, expected_virtual_link_uuids=None, expected_virtual_link_names=expected_virtual_link_names, expected_e2e_services=index, expected_opt_connections=1, ) src/tests/ofc25/tests/test_functional_delete_vlinks.py +11 −8 Original line number Diff line number Diff line Loading @@ -40,17 +40,18 @@ def test_delete_virtual_links( assert ip_vnt_manager_client is not None expected_virtual_link_ids = {link_id for _, link_id in VIRTUAL_LINK_DESCRIPTORS} expected_virtual_link_names = {link_name for _, link_name in VIRTUAL_LINK_DESCRIPTORS} wait_for_state_or_raise( ip_context_client=ip_context_client, e2e_context_client=e2e_context_client, opt_context_client=opt_context_client, expected_virtual_link_ids=expected_virtual_link_ids, expected_virtual_link_uuids=None, expected_virtual_link_names=expected_virtual_link_names, expected_e2e_services=3, expected_opt_connections=1, ) for remaining, (descriptor_name, virtual_link_id) in zip( for remaining, (descriptor_name, virtual_link_name) in zip( [2, 1, 0], reversed(VIRTUAL_LINK_DESCRIPTORS) ): descriptor_file = os.path.join(DESCRIPTORS_DIR, descriptor_name) Loading @@ -65,18 +66,20 @@ def test_delete_virtual_links( vntm_client=ip_vnt_manager_client, ) descriptor_loader.unload() LOGGER.info('Virtual link removal submitted successfully for %s', virtual_link_id) LOGGER.info('Virtual link removal submitted successfully for %s', virtual_link_name) expected_virtual_link_ids.remove(virtual_link_id) expected_virtual_link_names.remove(virtual_link_name) LOGGER.info( 'Waiting for propagated state after deleting %s: expected_virtual_links=%s expected_e2e_services=%d', virtual_link_id, str(sorted(expected_virtual_link_ids)), remaining 'Waiting for propagated state after deleting %s: expected_virtual_link_names=%s ' 'expected_e2e_services=%d', virtual_link_name, str(sorted(expected_virtual_link_names)), remaining ) wait_for_state_or_raise( ip_context_client=ip_context_client, e2e_context_client=e2e_context_client, opt_context_client=opt_context_client, expected_virtual_link_ids=expected_virtual_link_ids, expected_virtual_link_uuids=None, expected_virtual_link_names=expected_virtual_link_names, expected_e2e_services=remaining, expected_opt_connections=(1 if remaining > 0 else 0), ) Loading
src/tests/ofc25/tests/Helper.py +46 −18 Original line number Diff line number Diff line Loading @@ -15,7 +15,7 @@ import logging import os import time from typing import List, Set, Tuple from typing import List, Optional, Set, Tuple from common.Constants import DEFAULT_CONTEXT_NAME from common.proto.context_pb2 import ContextId, Device, Empty, Link, LinkTypeEnum, ServiceStatusEnum, ServiceTypeEnum Loading Loading @@ -216,15 +216,20 @@ def describe_services(context_client, profile_name: str) -> str: return str(services) def get_virtual_link_ids(context_client) -> Set[str]: def get_virtual_link_identifiers(context_client) -> Tuple[Set[str], Set[str]]: response = context_client.ListLinks(Empty()) virtual_link_ids = { link.link_id.link_uuid.uuid for link in response.links if link.link_type == LinkTypeEnum.LINKTYPE_VIRTUAL } LOGGER.info('VirtualLinks[%d] = %s', len(virtual_link_ids), str(sorted(virtual_link_ids))) return virtual_link_ids virtual_link_uuids = set() virtual_link_names = set() for link in response.links: if link.link_type != LinkTypeEnum.LINKTYPE_VIRTUAL: continue virtual_link_uuids.add(link.link_id.link_uuid.uuid) if len(link.name) > 0: virtual_link_names.add(link.name) LOGGER.info('VirtualLinkNames[%d] = %s', len(virtual_link_names), str(sorted(virtual_link_names))) LOGGER.info('VirtualLinkUuids[%d] = %s', len(virtual_link_uuids), str(sorted(virtual_link_uuids))) return virtual_link_uuids, virtual_link_names def describe_links(context_client, profile_name: str) -> str: Loading @@ -245,19 +250,32 @@ def log_global_state(ip_context_client, e2e_context_client, opt_context_client) describe_services(opt_context_client, 'opt') def assert_expected_set(actual_items: Set[str], expected_items: Optional[Set[str]], label: str) -> None: if expected_items is None: return assert actual_items == expected_items, ( '{:s} mismatch: expected={:s} actual={:s}'.format( label, str(sorted(expected_items)), str(sorted(actual_items)) ) ) def assert_global_state( ip_context_client, e2e_context_client, opt_context_client, expected_virtual_link_ids: Set[str], expected_virtual_link_uuids: Optional[Set[str]], expected_virtual_link_names: Optional[Set[str]], expected_e2e_services: int, expected_opt_connections: int, ) -> None: response = ip_context_client.ListServices(ADMIN_CONTEXT_ID) assert len(response.services) == 0 virtual_link_ids = get_virtual_link_ids(ip_context_client) assert virtual_link_ids == expected_virtual_link_ids virtual_link_uuids, virtual_link_names = get_virtual_link_identifiers(ip_context_client) assert_expected_set(virtual_link_uuids, expected_virtual_link_uuids, 'Virtual link UUIDs') assert_expected_set(virtual_link_names, expected_virtual_link_names, 'Virtual link names') e2e_services = list_active_optical_services(e2e_context_client) if expected_e2e_services == 0: Loading @@ -281,7 +299,8 @@ def wait_for_state_or_raise( ip_context_client, e2e_context_client, opt_context_client, expected_virtual_link_ids: Set[str], expected_virtual_link_uuids: Optional[Set[str]], expected_virtual_link_names: Optional[Set[str]], expected_e2e_services: int, expected_opt_connections: int, max_retry: int = 30, Loading @@ -291,14 +310,21 @@ def wait_for_state_or_raise( for attempt in range(1, max_retry + 1): try: LOGGER.info( 'Checking expected state attempt %d/%d: virtual_links=%s e2e_services=%d opt_connections=%d', attempt, max_retry, str(sorted(expected_virtual_link_ids)), expected_e2e_services, expected_opt_connections 'Checking expected state attempt %d/%d: virtual_link_uuids=%s virtual_link_names=%s ' 'e2e_services=%d opt_connections=%d', attempt, max_retry, '<ignored>' if expected_virtual_link_uuids is None else str(sorted(expected_virtual_link_uuids)), '<ignored>' if expected_virtual_link_names is None else str(sorted(expected_virtual_link_names)), expected_e2e_services, expected_opt_connections, ) assert_global_state( ip_context_client=ip_context_client, e2e_context_client=e2e_context_client, opt_context_client=opt_context_client, expected_virtual_link_ids=expected_virtual_link_ids, expected_virtual_link_uuids=expected_virtual_link_uuids, expected_virtual_link_names=expected_virtual_link_names, expected_e2e_services=expected_e2e_services, expected_opt_connections=expected_opt_connections, ) Loading @@ -313,8 +339,10 @@ def wait_for_state_or_raise( time.sleep(wait_seconds) LOGGER.error( 'Timed out waiting expected state: virtual_links=%s e2e_services=%d opt_connections=%d', str(sorted(expected_virtual_link_ids)), 'Timed out waiting expected state: virtual_link_uuids=%s virtual_link_names=%s ' 'e2e_services=%d opt_connections=%d', '<ignored>' if expected_virtual_link_uuids is None else str(sorted(expected_virtual_link_uuids)), '<ignored>' if expected_virtual_link_names is None else str(sorted(expected_virtual_link_names)), expected_e2e_services, expected_opt_connections, ) Loading
src/tests/ofc25/tests/test_functional_create_vlinks.py +11 −8 Original line number Diff line number Diff line Loading @@ -41,13 +41,14 @@ def test_create_virtual_link( ip_context_client=ip_context_client, e2e_context_client=e2e_context_client, opt_context_client=opt_context_client, expected_virtual_link_ids=set(), expected_virtual_link_uuids=None, expected_virtual_link_names=set(), expected_e2e_services=0, expected_opt_connections=0, ) expected_virtual_link_ids: Set[str] = set() for index, (descriptor_name, virtual_link_id) in enumerate(VIRTUAL_LINK_DESCRIPTORS, start=1): expected_virtual_link_names: Set[str] = set() for index, (descriptor_name, virtual_link_name) in enumerate(VIRTUAL_LINK_DESCRIPTORS, start=1): descriptor_file = os.path.join(DESCRIPTORS_DIR, descriptor_name) LOGGER.info( 'Creating virtual link step %d/%d from descriptor %s', Loading @@ -61,18 +62,20 @@ def test_create_virtual_link( ) results = descriptor_loader.process() check_descriptor_load_results(results, descriptor_loader) LOGGER.info('Virtual link request submitted successfully for %s', virtual_link_id) LOGGER.info('Virtual link request submitted successfully for %s', virtual_link_name) expected_virtual_link_ids.add(virtual_link_id) expected_virtual_link_names.add(virtual_link_name) LOGGER.info( 'Waiting for propagated state after creating %s: expected_virtual_links=%s expected_e2e_services=%d', virtual_link_id, str(sorted(expected_virtual_link_ids)), index 'Waiting for propagated state after creating %s: expected_virtual_link_names=%s ' 'expected_e2e_services=%d', virtual_link_name, str(sorted(expected_virtual_link_names)), index ) wait_for_state_or_raise( ip_context_client=ip_context_client, e2e_context_client=e2e_context_client, opt_context_client=opt_context_client, expected_virtual_link_ids=expected_virtual_link_ids, expected_virtual_link_uuids=None, expected_virtual_link_names=expected_virtual_link_names, expected_e2e_services=index, expected_opt_connections=1, )
src/tests/ofc25/tests/test_functional_delete_vlinks.py +11 −8 Original line number Diff line number Diff line Loading @@ -40,17 +40,18 @@ def test_delete_virtual_links( assert ip_vnt_manager_client is not None expected_virtual_link_ids = {link_id for _, link_id in VIRTUAL_LINK_DESCRIPTORS} expected_virtual_link_names = {link_name for _, link_name in VIRTUAL_LINK_DESCRIPTORS} wait_for_state_or_raise( ip_context_client=ip_context_client, e2e_context_client=e2e_context_client, opt_context_client=opt_context_client, expected_virtual_link_ids=expected_virtual_link_ids, expected_virtual_link_uuids=None, expected_virtual_link_names=expected_virtual_link_names, expected_e2e_services=3, expected_opt_connections=1, ) for remaining, (descriptor_name, virtual_link_id) in zip( for remaining, (descriptor_name, virtual_link_name) in zip( [2, 1, 0], reversed(VIRTUAL_LINK_DESCRIPTORS) ): descriptor_file = os.path.join(DESCRIPTORS_DIR, descriptor_name) Loading @@ -65,18 +66,20 @@ def test_delete_virtual_links( vntm_client=ip_vnt_manager_client, ) descriptor_loader.unload() LOGGER.info('Virtual link removal submitted successfully for %s', virtual_link_id) LOGGER.info('Virtual link removal submitted successfully for %s', virtual_link_name) expected_virtual_link_ids.remove(virtual_link_id) expected_virtual_link_names.remove(virtual_link_name) LOGGER.info( 'Waiting for propagated state after deleting %s: expected_virtual_links=%s expected_e2e_services=%d', virtual_link_id, str(sorted(expected_virtual_link_ids)), remaining 'Waiting for propagated state after deleting %s: expected_virtual_link_names=%s ' 'expected_e2e_services=%d', virtual_link_name, str(sorted(expected_virtual_link_names)), remaining ) wait_for_state_or_raise( ip_context_client=ip_context_client, e2e_context_client=e2e_context_client, opt_context_client=opt_context_client, expected_virtual_link_ids=expected_virtual_link_ids, expected_virtual_link_uuids=None, expected_virtual_link_names=expected_virtual_link_names, expected_e2e_services=remaining, expected_opt_connections=(1 if remaining > 0 else 0), )