From 133a79ba9ae9266d15efc9aec7cb2119c58c93cb Mon Sep 17 00:00:00 2001 From: Benjamin Pelletier Date: Thu, 22 Oct 2026 20:29:46 -0700 Subject: [PATCH] Move IDGenerator to monitorlib --- monitoring/monitorlib/README.md | 17 ++ monitoring/monitorlib/decode_id.py | 27 +++ monitoring/monitorlib/ids.py | 221 ++++++++++++++++++ monitoring/prober/README.md | 11 +- monitoring/prober/conftest.py | 10 +- monitoring/prober/decode_id.py | 51 ---- monitoring/prober/infrastructure.py | 125 ---------- .../prober/scd/test_constraint_simple.py | 7 +- .../test_constraints_with_subscriptions.py | 3 +- .../test_operation_references_error_cases.py | 3 +- ...t_operation_references_state_transition.py | 3 +- .../prober/scd/test_operation_simple.py | 7 +- .../test_operation_simple_heavy_traffic.py | 3 +- ...eration_simple_heavy_traffic_concurrent.py | 11 +- .../scd/test_operation_special_cases.py | 3 +- .../prober/scd/test_operations_simple.py | 3 +- .../prober/scd/test_subscription_queries.py | 3 +- .../scd/test_subscription_query_time.py | 3 +- .../prober/scd/test_subscription_simple.py | 3 +- .../test_subscription_update_validation.py | 7 +- monitoring/prober/utils.py | 97 -------- monitoring/uss_qualifier/README.md | 2 +- .../resources/interuss/id_generator.py | 2 +- .../astm/netrid/common/dp_behavior.py | 2 +- .../common/dss/heavy_traffic_concurrent.py | 2 +- .../astm/netrid/common/dss/isa_expiry.py | 2 +- .../astm/netrid/common/dss/isa_simple.py | 2 +- .../dss/isa_subscription_interactions.py | 2 +- .../astm/netrid/common/dss/isa_validation.py | 2 +- .../netrid/common/dss/subscription_simple.py | 2 +- .../common/dss/subscription_validation.py | 2 +- .../netrid/common/dss/token_validation.py | 2 +- .../netrid/common/sp_notification_behavior.py | 2 +- .../authentication_validation.py | 2 +- .../astm/utm/dss/constraint_ref_simple.py | 2 +- .../astm/utm/dss/oir_explicit_sub_handling.py | 2 +- .../astm/utm/dss/oir_implicit_sub_handling.py | 2 +- .../utm/dss/op_intent_ref_access_control.py | 2 +- .../utm/dss/op_intent_ref_key_validation.py | 2 +- .../astm/utm/dss/op_intent_ref_simple.py | 2 +- .../dss/op_intent_ref_state_transitions.py | 2 +- .../astm/utm/dss/subscription_interactions.py | 2 +- .../astm/utm/dss/subscription_simple.py | 2 +- .../astm/utm/dss/subscription_validation.py | 2 +- .../constraint_ref_synchronization.py | 2 +- .../op_intent_ref_synchronization.py | 2 +- .../subscription_synchronization.py | 2 +- .../interuss/ovn_request/dss_ovn_request.py | 2 +- 48 files changed, 329 insertions(+), 343 deletions(-) create mode 100644 monitoring/monitorlib/decode_id.py delete mode 100644 monitoring/prober/decode_id.py delete mode 100644 monitoring/prober/utils.py diff --git a/monitoring/monitorlib/README.md b/monitoring/monitorlib/README.md index bf3e270dc4..9300d5a5ac 100644 --- a/monitoring/monitorlib/README.md +++ b/monitoring/monitorlib/README.md @@ -37,3 +37,20 @@ AuthAdapter's `__init__` constructor. Both ordinal (e.g., Use [`get_access_token.py`](../get_access_token.py) to retrieve an access token using a provided auth spec. + +## Test resource IDs + +[ids.py](ids.py) provides `register_resource_type` and `IDFactory` for creating +recognizable UUIDv4-format test IDs. Register each resource type with a code +that is unique across all monitoring tools. The comment above +`register_resource_type` identifies the next available code; update it after +allocating codes. `IDFactory` encodes the owner, resource type code, and an +instance index from 0 to 255. The default index of 0 preserves legacy IDs. + +If a test resource (subscription, operational intent, etc.) is orphaned in a DSS, +use [decode_id.py](decode_id.py) to identify its owner and origin. From the +repository root, run: + +```shell +uv run python -m monitoring.monitorlib.decode_id +``` diff --git a/monitoring/monitorlib/decode_id.py b/monitoring/monitorlib/decode_id.py new file mode 100644 index 0000000000..7e51ed60d3 --- /dev/null +++ b/monitoring/monitorlib/decode_id.py @@ -0,0 +1,27 @@ +import argparse +import sys + +import monitoring.uss_qualifier.scenarios +from monitoring.monitorlib import ids +from monitoring.monitorlib.inspection import import_submodules + + +def parse_args(argv: list[str]): + parser = argparse.ArgumentParser(description="Decode a test ID") + parser.add_argument( + action="store", dest="id", type=str, metavar="ID", help="The ID to decode" + ) + return parser.parse_args(argv) + + +if __name__ == "__main__": + args = parse_args(sys.argv[1:]) + import_submodules(monitoring.uss_qualifier.scenarios) + decoded = ids.IDFactory.decode_details(args.id) + id_code = decoded.resource_type + print(f"Owner: {decoded.owner_name}") + print(f"Instance index: {decoded.instance_index}") + if id_code in ids.resource_type_code_descriptions: + print(f"Resource type: {ids.resource_type_code_descriptions[id_code]}") + else: + print(f"Resource type: Unregistered ({id_code})") diff --git a/monitoring/monitorlib/ids.py b/monitoring/monitorlib/ids.py index d8f4ca5e26..d632b10417 100644 --- a/monitoring/monitorlib/ids.py +++ b/monitoring/monitorlib/ids.py @@ -1,5 +1,9 @@ import hashlib +import inspect +import math +import os import uuid +from dataclasses import dataclass mac = uuid.getnode() @@ -27,3 +31,220 @@ def make_id(code: str) -> uuid.UUID: digest[-2] = 0 digest[-1] = 0 return uuid.UUID(bytes=bytes(digest), version=4) + + +ID_CHAR_SET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_" +MAX_OWNER_LENGTH = 12 # characters + + +def bin_to_hex(bin_string): + return format(int(bin_string, 2), "02x") + + +def bin_to_dec(bin_string): + return int(bin_string, 2) + + +def hex_to_bin(hex_string): + return format(int(hex_string, 16), "08b") + + +def dec_to_bin(num): + return format(num, "06b") + + +def split_by(string_val, num=8): + """Splits a string into substrings with a length of given number.""" + return [string_val[i : i + num] for i in range(0, len(string_val), num)] + + +def get_ord_val(letter): + """Encodes new ord value for ascii letters.""" + v = ID_CHAR_SET.find(letter) + if v == -1: + v = 63 + return v + + +def get_ascii_val_from_bit_value(num): + """Decodes new ord value to ascii letters.""" + return ID_CHAR_SET[num] if num < 63 else "?" + + +def encode_owner(owner_name: str) -> str: + """Encode an owner name as an 18-character hexadecimal string""" + bits = "" + if len(owner_name) > MAX_OWNER_LENGTH: + string_val = ( + owner_name[: math.ceil(MAX_OWNER_LENGTH / 2)] + + owner_name[-math.floor(MAX_OWNER_LENGTH / 2) :] + ) + elif len(owner_name) < MAX_OWNER_LENGTH: + string_val = ("?" * (MAX_OWNER_LENGTH - len(owner_name))) + owner_name + else: + string_val = owner_name + for letter in string_val: + ord_val = get_ord_val(letter) + bits += dec_to_bin(ord_val) + return "".join(bin_to_hex(s) for s in split_by(bits)) + + +def encode_resource_type_code(resource_type: int) -> str: + """Encode a number between 0 and 0xFFFF as a 4-character hexadecimal string""" + return format(resource_type, "04x") + + +def decode_owner(owner_id: str) -> str: + """Decode an owner name, marking a truncated final character as unknown. + + IDFactory preserves only the first 17 of the original 18 hexadecimal digits. + """ + truncated = len(owner_id) == 17 + if truncated: + owner_id += "0" + elif len(owner_id) != 18: + raise ValueError("Invalid owner id.") + hex_splits = split_by(owner_id, num=2) + bits = "" + for h in hex_splits: + bits += hex_to_bin(h) + test_owner = "" + for seq in split_by(bits, 6): + num = bin_to_dec(seq) + test_owner += get_ascii_val_from_bit_value(num) + if truncated: + test_owner = test_owner[:-1] + "?" + if test_owner[0] != "?": + return ( + test_owner[: math.ceil(MAX_OWNER_LENGTH / 2)] + + ".." + + test_owner[-math.floor(MAX_OWNER_LENGTH / 2) :] + ) + if truncated: + return test_owner[:-1].lstrip("?") + "?" + return test_owner.lstrip("?") + + +def decode_resouce_type(id: str) -> int: + """Decode a number between 0 and 0xFFFF from a 4-character hex string""" + return int(id, 16) + + +ResourceType = int +resource_type_code_descriptions: dict[ResourceType, str] = {} + + +# Next code: 406 +def register_resource_type(code: int, description: str) -> ResourceType: + """Register that the specified code refers to the described resource. + + Args: + code: An integer that is globally-unique among all register_resource_type + calls across all monitoring tools, referring to this resource type. + description: Description of the resource created from this type. + + Returns: + ResourceType that can be used to create an ID with .make_id. + """ + test_filename = inspect.stack()[1].filename + this_folder = os.path.dirname(os.path.abspath(__file__)) + test = os.path.relpath(test_filename, this_folder) + full_description = f"{test}: {description}" + if code in resource_type_code_descriptions: + raise ValueError( + f'Resource type code {code} is already in use as "{resource_type_code_descriptions[code]}" so it cannot be used for "{full_description}"' + ) + resource_type_code_descriptions[code] = full_description + return code + + +@dataclass(frozen=True) +class DecodedTestID: + owner_name: str + resource_type: ResourceType + instance_index: int + + +class IDFactory: + """Creates UUIDv4 (as described in RFC4122) formatted IDs encoding the kind of ID and owner. + + Format: 000HXXXX-YYYY-4LYY-8YYY-YYYYYYYY0000 + + Note that a UUID V4 needs to conform to the following regexp, which is why we + set the first digit of the fourth group to 8. + + ^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-4[0-9a-fA-F]{3}\\-[8-b][0-9a-fA-F]{3}\\-[0-9a-fA-F]{12}$ + + XXXX encodes the kind of ID according to resource_type_code_descriptions. + YYYYYYYYYYYYYYYYY encodes the owner/creator of the resource having the ID and + consists of 11 complete characters and 2 bits of a twelfth character, + encoded as 6-bit groups. Decoding marks the incomplete character with '?'. + HL encodes an instance index from 0 to 255 in hexadecimal. Index 0 produces + the original ID format; other indices separate repeated invocations of a test. + """ + + owner_id: str + _instance_index: int + + def __init__(self, test_owner: str, instance_index: int = 0): + self.validate_instance_index(instance_index) + self.owner_id = encode_owner(test_owner) + self._instance_index = instance_index + + @staticmethod + def validate_instance_index(instance_index: int) -> None: + if type(instance_index) is not int or not 0 <= instance_index <= 255: + raise ValueError("instance_index must be an integer from 0 to 255") + + @property + def instance_index(self) -> int: + return self._instance_index + + def make_id(self, resource_type: ResourceType): + """Make a test ID with the specified resource type code""" + return f"000{self.instance_index >> 4:x}{encode_resource_type_code(resource_type)}-{self.owner_id[0:4]}-4{self.instance_index & 0xF:x}{self.owner_id[4:6]}-8{self.owner_id[6:9]}-{self.owner_id[9:17]}0000" + + @classmethod + def decode(cls, id: str) -> tuple[str, ResourceType]: + """Decode an ID, retaining the original two-item return value.""" + decoded = cls.decode_details(id) + return decoded.owner_name, decoded.resource_type + + @classmethod + def decode_details(cls, id: str) -> DecodedTestID: + """Decode the owner, resource type, and instance index of a test ID.""" + hex_digits = id.replace("-", "").lower() + if len(hex_digits) != 32: + raise ValueError(f"ID {id} has the wrong number of characters for a UUID") + if any(c not in "0123456789abcdef" for c in hex_digits): + raise ValueError(f"ID {id} contains non-hexadecimal characters") + if hex_digits[0:3] != "000" or hex_digits[-4:] != "0000": + raise ValueError( + f"ID {id} does not have the leading and trailing zeros indicating a test ID" + ) + if hex_digits[12] != "4" or hex_digits[16] != "8": + raise ValueError(f"ID {id} is not formatted like a v4 test ID") + x = hex_digits[4:8] + y = hex_digits[8:12] + hex_digits[14:16] + hex_digits[17:28] + resource_type_code = ResourceType(int(x, 16)) + owner_name = decode_owner(y) + return DecodedTestID( + owner_name=owner_name, + resource_type=resource_type_code, + instance_index=int(hex_digits[3] + hex_digits[13], 16), + ) + + +check_scd_write_subscription_id = register_resource_type( + 344, "Subscription created by build/dev/check_scd_write.sh" +) +check_scd_write_constraint_id = register_resource_type( + 345, "Constraint reference created by build/dev/check_scd_write.sh" +) +check_scd_write_operational_intent_id = register_resource_type( + 346, "Operational intent reference created by build/dev/check_scd_write.sh" +) + +unknown_resource_id = register_resource_type( + 404, "" +) diff --git a/monitoring/prober/README.md b/monitoring/prober/README.md index dddf8c4eba..e02a71fb46 100644 --- a/monitoring/prober/README.md +++ b/monitoring/prober/README.md @@ -143,7 +143,7 @@ Specifically: obtained using the `ids` fixture providing a registered resource type code. E.g.: ```python - from monitoring.prober.infrastructure import register_resource_type + from monitoring.monitorlib.ids import register_resource_type [...] CONFLICTING_OI_TYPE = register_resource_type(103, "OI that conflicts with first OI") @@ -153,9 +153,9 @@ Specifically: def test_create_conflict(ids): conflicting_id = ids(CONFLICTING_OI_TYPE) ``` - The resource type code must be unique among all prober tests. To determine + The resource type code must be unique across all monitoring tools. To determine an appropriate resource type code for a new resource, see the comment above - `register_resource_type` in [infrastructure.py](infrastructure.py), and then + `register_resource_type` in [ids.py](../monitorlib/ids.py), and then make sure to update that comment after adding new resource type codes. 1. Tests should be designed to pass even with pre-existing resources which may even be in the same area/time range/etc as the test resources. Toward this @@ -165,6 +165,5 @@ Specifically: The guidelines above should allow the prober to be used on production DSS instances without any nominal adverse effects. -If an orphaned resource with a test ID is found in a DSS, the owner and origin -of that resource can be determined from the ID with -[decode_id.py](decode_id.py). +For decoding orphaned test resource IDs, see the +[monitorlib ID documentation](../monitorlib/README.md#test-resource-ids). diff --git a/monitoring/prober/conftest.py b/monitoring/prober/conftest.py index 25f3311e91..da7ded3cdb 100644 --- a/monitoring/prober/conftest.py +++ b/monitoring/prober/conftest.py @@ -7,17 +7,13 @@ import uas_standards.astm.f3548.v21.constants as v21_constants from monitoring.monitorlib import auth, scd +from monitoring.monitorlib.ids import IDFactory, ResourceType from monitoring.monitorlib.infrastructure import ( AsyncUTMTestSession, UTMClientSession, utm_client_session_factory, ) -from monitoring.prober.infrastructure import ( - IDFactory, - ResourceType, - VersionString, - add_test_result, -) +from monitoring.prober.infrastructure import VersionString, add_test_result OPT_RID_AUTH = "rid_auth" OPT_RID_V2_AUTH = "rid_v2_auth" @@ -252,7 +248,7 @@ def ids(pytestconfig, subscriber) -> Callable[[ResourceType], str]: This fixture is a function that accepts a ResourceType as the argument and returns a UUIDv4-format string containing an ID for that resource. - See register_resource_type in infrastructure.py for how to create + See register_resource_type in monitoring.monitorlib.ids for how to create ResourceTypes to provide to this fixture, and also the "Resources" section of the README. """ diff --git a/monitoring/prober/decode_id.py b/monitoring/prober/decode_id.py deleted file mode 100644 index d03cee9b94..0000000000 --- a/monitoring/prober/decode_id.py +++ /dev/null @@ -1,51 +0,0 @@ -import argparse -import importlib -import pkgutil -import sys - -import monitoring.prober -import monitoring.uss_qualifier.scenarios -from monitoring.prober import infrastructure - - -# Import all tests -def import_submodules(package, recursive=True): - """Import all submodules of a module, recursively, including subpackages - - :param package: package (name or actual module) - :type package: str | module - :rtype: dict[str, types.ModuleType] - """ - if isinstance(package, str): - package = importlib.import_module(package) - results = {} - for _, name, is_pkg in pkgutil.walk_packages(package.__path__): - full_name = package.__name__ + "." + name - results[full_name] = importlib.import_module(full_name) - if recursive and is_pkg: - results.update(import_submodules(full_name)) - return results - - -def parse_args(argv: list[str]): - parser = argparse.ArgumentParser(description="Decode a test ID") - parser.add_argument( - action="store", dest="id", type=str, metavar="ID", help="The ID to decode" - ) - return parser.parse_args(argv) - - -if __name__ == "__main__": - args = parse_args(sys.argv[1:]) - import_submodules(monitoring.prober) - import_submodules(monitoring.uss_qualifier.scenarios) - decoded = infrastructure.IDFactory.decode_details(args.id) - id_code = decoded.resource_type - print(f"Owner: {decoded.owner_name}") - print(f"Instance index: {decoded.instance_index}") - if id_code in infrastructure.resource_type_code_descriptions: - print( - f"Resource type: {infrastructure.resource_type_code_descriptions[id_code]}" - ) - else: - print(f"Resource type: Unregistered ({id_code})") diff --git a/monitoring/prober/infrastructure.py b/monitoring/prober/infrastructure.py index d9519f8175..9daf9d41ac 100644 --- a/monitoring/prober/infrastructure.py +++ b/monitoring/prober/infrastructure.py @@ -1,12 +1,8 @@ import functools import inspect -import os -from dataclasses import dataclass import pytest -from monitoring.prober import utils - _test_results = dict() @@ -91,124 +87,3 @@ def wrapper_default_scope(*args, **kwargs): return wrapper_default_scope return decorator_default_scope - - -ResourceType = int -resource_type_code_descriptions: dict[ResourceType, str] = {} - - -# Next code: 406 -def register_resource_type(code: int, description: str) -> ResourceType: - """Register that the specified code refers to the described resource. - - Args: - code: A integer that is globally-unique among all register_resource_type - calls in all prober tests, referring to this specific resource type. - description: Description of the resource created from this type. - - Returns: - ResourceType that can be used to create an ID with .make_id, - especially with the `ids` test fixture (see conftest.py). - """ - test_filename = inspect.stack()[1].filename - this_folder = os.path.dirname(os.path.abspath(__file__)) - test = os.path.relpath(test_filename, this_folder) - full_description = f"{test}: {description}" - if code in resource_type_code_descriptions: - raise ValueError( - f'Resource type code {code} is already in use as "{resource_type_code_descriptions[code]}" so it cannot be used for "{full_description}"' - ) - resource_type_code_descriptions[code] = full_description - return code - - -@dataclass(frozen=True) -class DecodedTestID: - owner_name: str - resource_type: ResourceType - instance_index: int - - -class IDFactory: - """Creates UUIDv4 (as described in RFC4122) formatted IDs encoding the kind of ID and owner. - - Format: 000HXXXX-YYYY-4LYY-8YYY-YYYYYYYY0000 - - Note that a UUID V4 needs to conform to the following regexp, which is why we - set the first digit of the fourth group to 8. - - ^[0-9a-fA-F]{8}\\-[0-9a-fA-F]{4}\\-4[0-9a-fA-F]{3}\\-[8-b][0-9a-fA-F]{3}\\-[0-9a-fA-F]{12}$ - - XXXX encodes the kind of ID according to id_codes. - YYYYYYYYYYYYYYYYY encodes the owner/creator of the resource having the ID and - consists of 11 complete characters and 2 bits of a twelfth character, - encoded as 6-bit groups. Decoding marks the incomplete character with '?'. - HL encodes an instance index from 0 to 255 in hexadecimal. Index 0 produces - the original ID format; other indices separate repeated invocations of a test. - """ - - owner_id: str - _instance_index: int - - def __init__(self, test_owner: str, instance_index: int = 0): - self.validate_instance_index(instance_index) - self.owner_id = utils.encode_owner(test_owner) - self._instance_index = instance_index - - @staticmethod - def validate_instance_index(instance_index: int) -> None: - if type(instance_index) is not int or not 0 <= instance_index <= 255: - raise ValueError("instance_index must be an integer from 0 to 255") - - @property - def instance_index(self) -> int: - return self._instance_index - - def make_id(self, resource_type: ResourceType): - """Make a test ID with the specified resource type code""" - return f"000{self.instance_index >> 4:x}{utils.encode_resource_type_code(resource_type)}-{self.owner_id[0:4]}-4{self.instance_index & 0xF:x}{self.owner_id[4:6]}-8{self.owner_id[6:9]}-{self.owner_id[9:17]}0000" - - @classmethod - def decode(cls, id: str) -> tuple[str, ResourceType]: - """Decode an ID, retaining the original two-item return value.""" - decoded = cls.decode_details(id) - return decoded.owner_name, decoded.resource_type - - @classmethod - def decode_details(cls, id: str) -> DecodedTestID: - """Decode the owner, resource type, and instance index of a test ID.""" - hex_digits = id.replace("-", "").lower() - if len(hex_digits) != 32: - raise ValueError(f"ID {id} has the wrong number of characters for a UUID") - if any(c not in "0123456789abcdef" for c in hex_digits): - raise ValueError(f"ID {id} contains non-hexadecimal characters") - if hex_digits[0:3] != "000" or hex_digits[-4:] != "0000": - raise ValueError( - f"ID {id} does not have the leading and trailing zeros indicating a test ID" - ) - if hex_digits[12] != "4" or hex_digits[16] != "8": - raise ValueError(f"ID {id} is not formatted like a v4 test ID") - x = hex_digits[4:8] - y = hex_digits[8:12] + hex_digits[14:16] + hex_digits[17:28] - resource_type_code = ResourceType(int(x, 16)) - owner_name = utils.decode_owner(y) - return DecodedTestID( - owner_name=owner_name, - resource_type=resource_type_code, - instance_index=int(hex_digits[3] + hex_digits[13], 16), - ) - - -check_scd_write_subscription_id = register_resource_type( - 344, "Subscription created by build/dev/check_scd_write.sh" -) -check_scd_write_constraint_id = register_resource_type( - 345, "Constraint reference created by build/dev/check_scd_write.sh" -) -check_scd_write_operational_intent_id = register_resource_type( - 346, "Operational intent reference created by build/dev/check_scd_write.sh" -) - -unknown_resource_id = register_resource_type( - 404, "" -) diff --git a/monitoring/prober/scd/test_constraint_simple.py b/monitoring/prober/scd/test_constraint_simple.py index cb39fa76ca..d8e6140b77 100644 --- a/monitoring/prober/scd/test_constraint_simple.py +++ b/monitoring/prober/scd/test_constraint_simple.py @@ -15,6 +15,7 @@ from monitoring.monitorlib import scd from monitoring.monitorlib.geo import Circle from monitoring.monitorlib.geotemporal import Volume4D +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.infrastructure import default_scope from monitoring.monitorlib.scd import ( SCOPE_AA, @@ -24,11 +25,7 @@ SCOPE_SC, ) from monitoring.monitorlib.testing import assert_datetimes_are_equal, make_fake_url -from monitoring.prober.infrastructure import ( - depends_on, - for_api_versions, - register_resource_type, -) +from monitoring.prober.infrastructure import depends_on, for_api_versions from monitoring.prober.scd import actions BASE_URL = make_fake_url() diff --git a/monitoring/prober/scd/test_constraints_with_subscriptions.py b/monitoring/prober/scd/test_constraints_with_subscriptions.py index 247a62c35b..150eead134 100644 --- a/monitoring/prober/scd/test_constraints_with_subscriptions.py +++ b/monitoring/prober/scd/test_constraints_with_subscriptions.py @@ -13,10 +13,11 @@ from monitoring.monitorlib import scd from monitoring.monitorlib.geo import Circle from monitoring.monitorlib.geotemporal import Volume4D +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.infrastructure import default_scope from monitoring.monitorlib.scd import SCOPE_CM, SCOPE_CP, SCOPE_SC from monitoring.monitorlib.testing import make_fake_url -from monitoring.prober.infrastructure import for_api_versions, register_resource_type +from monitoring.prober.infrastructure import for_api_versions from monitoring.prober.scd import actions CONSTRAINT_BASE_URL_1 = make_fake_url("con1/uss") diff --git a/monitoring/prober/scd/test_operation_references_error_cases.py b/monitoring/prober/scd/test_operation_references_error_cases.py index c3633bbf5d..cb3f735a3c 100644 --- a/monitoring/prober/scd/test_operation_references_error_cases.py +++ b/monitoring/prober/scd/test_operation_references_error_cases.py @@ -8,9 +8,10 @@ from monitoring.monitorlib import scd from monitoring.monitorlib.geotemporal import Volume4D, Volume4DCollection +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.infrastructure import default_scope from monitoring.monitorlib.scd import SCOPE_SC -from monitoring.prober.infrastructure import for_api_versions, register_resource_type +from monitoring.prober.infrastructure import for_api_versions from monitoring.prober.scd import actions OP_TYPE = register_resource_type(342, "Primary operational intent") diff --git a/monitoring/prober/scd/test_operation_references_state_transition.py b/monitoring/prober/scd/test_operation_references_state_transition.py index 3835702189..3a7c04fac7 100644 --- a/monitoring/prober/scd/test_operation_references_state_transition.py +++ b/monitoring/prober/scd/test_operation_references_state_transition.py @@ -3,9 +3,10 @@ import json from monitoring.monitorlib import scd +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.infrastructure import default_scope from monitoring.monitorlib.scd import SCOPE_SC -from monitoring.prober.infrastructure import for_api_versions, register_resource_type +from monitoring.prober.infrastructure import for_api_versions from monitoring.prober.scd import actions OP_TYPE = register_resource_type(8, "Operational intent") diff --git a/monitoring/prober/scd/test_operation_simple.py b/monitoring/prober/scd/test_operation_simple.py index 78afd580b2..7b62ec1983 100644 --- a/monitoring/prober/scd/test_operation_simple.py +++ b/monitoring/prober/scd/test_operation_simple.py @@ -13,14 +13,11 @@ from monitoring.monitorlib import scd from monitoring.monitorlib.geo import Circle from monitoring.monitorlib.geotemporal import Volume4D +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.infrastructure import default_scope from monitoring.monitorlib.scd import SCOPE_CM, SCOPE_CP, SCOPE_SC from monitoring.monitorlib.testing import assert_datetimes_are_equal, make_fake_url -from monitoring.prober.infrastructure import ( - depends_on, - for_api_versions, - register_resource_type, -) +from monitoring.prober.infrastructure import depends_on, for_api_versions from monitoring.prober.scd import actions BASE_URL = make_fake_url() diff --git a/monitoring/prober/scd/test_operation_simple_heavy_traffic.py b/monitoring/prober/scd/test_operation_simple_heavy_traffic.py index ebc53a8ea2..7c5951afa4 100644 --- a/monitoring/prober/scd/test_operation_simple_heavy_traffic.py +++ b/monitoring/prober/scd/test_operation_simple_heavy_traffic.py @@ -14,10 +14,11 @@ from monitoring.monitorlib import scd from monitoring.monitorlib.geo import Circle from monitoring.monitorlib.geotemporal import Volume4D +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.infrastructure import default_scope from monitoring.monitorlib.scd import SCOPE_SC from monitoring.monitorlib.testing import assert_datetimes_are_equal, make_fake_url -from monitoring.prober.infrastructure import for_api_versions, register_resource_type +from monitoring.prober.infrastructure import for_api_versions from monitoring.prober.scd import actions BASE_URL = make_fake_url() diff --git a/monitoring/prober/scd/test_operation_simple_heavy_traffic_concurrent.py b/monitoring/prober/scd/test_operation_simple_heavy_traffic_concurrent.py index 555908c9a5..f6636eae27 100644 --- a/monitoring/prober/scd/test_operation_simple_heavy_traffic_concurrent.py +++ b/monitoring/prober/scd/test_operation_simple_heavy_traffic_concurrent.py @@ -21,17 +21,16 @@ from monitoring.monitorlib import scd from monitoring.monitorlib.geo import Circle from monitoring.monitorlib.geotemporal import Volume4D -from monitoring.monitorlib.infrastructure import default_scope -from monitoring.monitorlib.scd import SCOPE_SC -from monitoring.monitorlib.testing import assert_datetimes_are_equal, make_fake_url -from monitoring.prober.infrastructure import ( +from monitoring.monitorlib.ids import ( IDFactory, - depends_on, - for_api_versions, register_resource_type, resource_type_code_descriptions, unknown_resource_id, ) +from monitoring.monitorlib.infrastructure import default_scope +from monitoring.monitorlib.scd import SCOPE_SC +from monitoring.monitorlib.testing import assert_datetimes_are_equal, make_fake_url +from monitoring.prober.infrastructure import depends_on, for_api_versions from monitoring.prober.scd import actions BASE_URL = make_fake_url() diff --git a/monitoring/prober/scd/test_operation_special_cases.py b/monitoring/prober/scd/test_operation_special_cases.py index 015f10fffd..88c81e7008 100644 --- a/monitoring/prober/scd/test_operation_special_cases.py +++ b/monitoring/prober/scd/test_operation_special_cases.py @@ -12,10 +12,11 @@ import json from monitoring.monitorlib import scd +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.infrastructure import default_scope from monitoring.monitorlib.scd import SCOPE_CP, SCOPE_SC from monitoring.monitorlib.testing import make_fake_url -from monitoring.prober.infrastructure import for_api_versions, register_resource_type +from monitoring.prober.infrastructure import for_api_versions from monitoring.prober.scd import actions OP1_TYPE = register_resource_type(210, "Operational intent 1") diff --git a/monitoring/prober/scd/test_operations_simple.py b/monitoring/prober/scd/test_operations_simple.py index db366440bf..1e43a8744e 100644 --- a/monitoring/prober/scd/test_operations_simple.py +++ b/monitoring/prober/scd/test_operations_simple.py @@ -14,10 +14,11 @@ from monitoring.monitorlib import scd from monitoring.monitorlib.geo import Altitude, Circle from monitoring.monitorlib.geotemporal import Time, Volume4D +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.infrastructure import default_scope from monitoring.monitorlib.scd import SCOPE_SC from monitoring.monitorlib.testing import assert_datetimes_are_equal, make_fake_url -from monitoring.prober.infrastructure import for_api_versions, register_resource_type +from monitoring.prober.infrastructure import for_api_versions from monitoring.prober.scd import actions URL_OP1 = make_fake_url("op1") diff --git a/monitoring/prober/scd/test_subscription_queries.py b/monitoring/prober/scd/test_subscription_queries.py index 63dfb2026a..bd4d9af47f 100644 --- a/monitoring/prober/scd/test_subscription_queries.py +++ b/monitoring/prober/scd/test_subscription_queries.py @@ -9,10 +9,11 @@ from monitoring.monitorlib import scd from monitoring.monitorlib.geo import Circle, latitude_degrees from monitoring.monitorlib.geotemporal import Volume4D +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.infrastructure import default_scope from monitoring.monitorlib.scd import SCOPE_SC from monitoring.monitorlib.testing import make_fake_url -from monitoring.prober.infrastructure import for_api_versions, register_resource_type +from monitoring.prober.infrastructure import for_api_versions from monitoring.prober.scd import actions SUB1_TYPE = register_resource_type(216, "Subscription 1") diff --git a/monitoring/prober/scd/test_subscription_query_time.py b/monitoring/prober/scd/test_subscription_query_time.py index 96756f4d31..f1ecc30d00 100644 --- a/monitoring/prober/scd/test_subscription_query_time.py +++ b/monitoring/prober/scd/test_subscription_query_time.py @@ -8,10 +8,11 @@ from monitoring.monitorlib import scd from monitoring.monitorlib.geo import Circle from monitoring.monitorlib.geotemporal import Volume4D +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.infrastructure import default_scope from monitoring.monitorlib.scd import SCOPE_SC from monitoring.monitorlib.testing import make_fake_url -from monitoring.prober.infrastructure import for_api_versions, register_resource_type +from monitoring.prober.infrastructure import for_api_versions BASE_URL = make_fake_url() diff --git a/monitoring/prober/scd/test_subscription_simple.py b/monitoring/prober/scd/test_subscription_simple.py index 010baf5143..44267999f3 100644 --- a/monitoring/prober/scd/test_subscription_simple.py +++ b/monitoring/prober/scd/test_subscription_simple.py @@ -19,10 +19,11 @@ from monitoring.monitorlib import scd from monitoring.monitorlib.geo import Circle from monitoring.monitorlib.geotemporal import Volume4D +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.infrastructure import default_scope from monitoring.monitorlib.scd import SCOPE_CP, SCOPE_SC from monitoring.monitorlib.testing import assert_datetimes_are_equal, make_fake_url -from monitoring.prober.infrastructure import for_api_versions, register_resource_type +from monitoring.prober.infrastructure import for_api_versions from monitoring.prober.scd import actions SUB_TYPE = register_resource_type(220, "Subscription") diff --git a/monitoring/prober/scd/test_subscription_update_validation.py b/monitoring/prober/scd/test_subscription_update_validation.py index 745898866a..1c853a44f5 100644 --- a/monitoring/prober/scd/test_subscription_update_validation.py +++ b/monitoring/prober/scd/test_subscription_update_validation.py @@ -16,14 +16,11 @@ from monitoring.monitorlib import scd from monitoring.monitorlib.geo import Circle from monitoring.monitorlib.geotemporal import Volume4D +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.infrastructure import default_scope, default_scopes from monitoring.monitorlib.scd import SCOPE_CP, SCOPE_SC from monitoring.monitorlib.testing import assert_datetimes_are_equal, make_fake_url -from monitoring.prober.infrastructure import ( - depends_on, - for_api_versions, - register_resource_type, -) +from monitoring.prober.infrastructure import depends_on, for_api_versions from monitoring.prober.scd import actions BASE_URL = make_fake_url() diff --git a/monitoring/prober/utils.py b/monitoring/prober/utils.py deleted file mode 100644 index a8f1973e97..0000000000 --- a/monitoring/prober/utils.py +++ /dev/null @@ -1,97 +0,0 @@ -import math - -ID_CHAR_SET = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_" -MAX_OWNER_LENGTH = 12 # characters - - -def bin_to_hex(bin_string): - return format(int(bin_string, 2), "02x") - - -def bin_to_dec(bin_string): - return int(bin_string, 2) - - -def hex_to_bin(hex_string): - return format(int(hex_string, 16), "08b") - - -def dec_to_bin(num): - return format(num, "06b") - - -def split_by(string_val, num=8): - """Splits a string into substrings with a length of given number.""" - return [string_val[i : i + num] for i in range(0, len(string_val), num)] - - -def get_ord_val(letter): - """Encodes new ord value for ascii letters.""" - v = ID_CHAR_SET.find(letter) - if v == -1: - v = 63 - return v - - -def get_ascii_val_from_bit_value(num): - """Decodes new ord value to ascii letters.""" - return ID_CHAR_SET[num] if num < 63 else "?" - - -def encode_owner(owner_name: str) -> str: - """Encode an owner name as a 18-character hexidecimal string""" - bits = "" - if len(owner_name) > MAX_OWNER_LENGTH: - string_val = ( - owner_name[: math.ceil(MAX_OWNER_LENGTH / 2)] - + owner_name[-math.floor(MAX_OWNER_LENGTH / 2) :] - ) - elif len(owner_name) < MAX_OWNER_LENGTH: - string_val = ("?" * (MAX_OWNER_LENGTH - len(owner_name))) + owner_name - else: - string_val = owner_name - for letter in string_val: - ord_val = get_ord_val(letter) - bits += dec_to_bin(ord_val) - return "".join(bin_to_hex(s) for s in split_by(bits)) - - -def encode_resource_type_code(resource_type: int) -> str: - """Encode a number between 0 and 0xFFFF as a 4-character hexidecimal string""" - return format(resource_type, "04x") - - -def decode_owner(owner_id: str) -> str: - """Decode an owner name, marking a truncated final character as unknown. - - IDFactory preserves only the first 17 of the original 18 hexadecimal digits. - """ - truncated = len(owner_id) == 17 - if truncated: - owner_id += "0" - elif len(owner_id) != 18: - raise ValueError("Invalid owner id.") - hex_splits = split_by(owner_id, num=2) - bits = "" - for h in hex_splits: - bits += hex_to_bin(h) - test_owner = "" - for seq in split_by(bits, 6): - num = bin_to_dec(seq) - test_owner += get_ascii_val_from_bit_value(num) - if truncated: - test_owner = test_owner[:-1] + "?" - if test_owner[0] != "?": - return ( - test_owner[: math.ceil(MAX_OWNER_LENGTH / 2)] - + ".." - + test_owner[-math.floor(MAX_OWNER_LENGTH / 2) :] - ) - if truncated: - return test_owner[:-1].lstrip("?") + "?" - return test_owner.lstrip("?") - - -def decode_resouce_type(id: str) -> int: - """Decode a number between 0 and 0xFFFF from a 4-character hex string""" - return int(id, 16) diff --git a/monitoring/uss_qualifier/README.md b/monitoring/uss_qualifier/README.md index 24f24997d5..db30dace38 100644 --- a/monitoring/uss_qualifier/README.md +++ b/monitoring/uss_qualifier/README.md @@ -63,7 +63,7 @@ uss_qualifier is generally designed to skip test components when some prerequisi ### Orphaned DSS entities -If a test entity (subscription, etc) is orphaned in the DSS, its origin can be determined by running (from the repository root) `uv run ./monitoring/prober/decode_id.py `. This displays the owner, instance index, and registered resource description, including qualifier scenarios. Owner encoding truncates its final character; the decoder displays `?` for that character. +If a test entity (subscription, etc) is orphaned in the DSS, its origin can be determined using [monitorlib's test ID decoder](../monitorlib/README.md#test-resource-ids). ## Architecture diff --git a/monitoring/uss_qualifier/resources/interuss/id_generator.py b/monitoring/uss_qualifier/resources/interuss/id_generator.py index b2b236ec74..9e7777b0ac 100644 --- a/monitoring/uss_qualifier/resources/interuss/id_generator.py +++ b/monitoring/uss_qualifier/resources/interuss/id_generator.py @@ -1,6 +1,6 @@ from implicitdict import ImplicitDict -from monitoring.prober.infrastructure import IDFactory +from monitoring.monitorlib.ids import IDFactory from monitoring.uss_qualifier.resources.communications import ClientIdentityResource from monitoring.uss_qualifier.resources.resource import ( Resource, diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dp_behavior.py b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dp_behavior.py index 41b53ed400..d0714b7a30 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dp_behavior.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dp_behavior.py @@ -14,9 +14,9 @@ QueryDirection, ) from monitoring.monitorlib.fetch import Query +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.rid import RIDVersion from monitoring.monitorlib.temporal import Time -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources.astm.f3411.dss import DSSInstancesResource from monitoring.uss_qualifier.resources.interuss import IDGeneratorResource from monitoring.uss_qualifier.resources.interuss.mock_uss.client import ( diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/heavy_traffic_concurrent.py b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/heavy_traffic_concurrent.py index e43c3675f2..ae26668b87 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/heavy_traffic_concurrent.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/heavy_traffic_concurrent.py @@ -13,12 +13,12 @@ fetch_async, ) from monitoring.monitorlib.fetch.rid import FetchedISA +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.infrastructure import AsyncUTMTestSession from monitoring.monitorlib.mutate import rid as mutate from monitoring.monitorlib.mutate.rid import ChangedISA from monitoring.monitorlib.rid import RIDVersion from monitoring.monitorlib.testing import make_fake_url -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources.astm.f3411.dss import DSSInstanceResource from monitoring.uss_qualifier.resources.interuss.id_generator import IDGeneratorResource from monitoring.uss_qualifier.resources.interuss.scenarios.astm.netrid.common.dss.heavy_traffic_concurrent import ( diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_expiry.py b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_expiry.py index b2bf4033ff..b5c2943cc2 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_expiry.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_expiry.py @@ -1,6 +1,6 @@ import datetime -from monitoring.prober.infrastructure import register_resource_type +from monitoring.monitorlib.ids import register_resource_type from monitoring.uss_qualifier.resources.astm.f3411.dss import DSSInstanceResource from monitoring.uss_qualifier.resources.interuss.id_generator import IDGeneratorResource from monitoring.uss_qualifier.resources.netrid.service_area import ServiceAreaResource diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_simple.py b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_simple.py index 397b2f140b..cfb2973127 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_simple.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_simple.py @@ -3,8 +3,8 @@ import s2sphere from monitoring.monitorlib.fetch import rid as fetch +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.mutate import rid as mutate -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources.astm.f3411.dss import DSSInstanceResource from monitoring.uss_qualifier.resources.interuss.id_generator import IDGeneratorResource from monitoring.uss_qualifier.resources.netrid.service_area import ServiceAreaResource diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_subscription_interactions.py b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_subscription_interactions.py index 0f07987b3c..9615f0a99e 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_subscription_interactions.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_subscription_interactions.py @@ -1,5 +1,5 @@ from monitoring.monitorlib import geo -from monitoring.prober.infrastructure import register_resource_type +from monitoring.monitorlib.ids import register_resource_type from monitoring.uss_qualifier.resources.astm.f3411.dss import DSSInstanceResource from monitoring.uss_qualifier.resources.interuss.id_generator import IDGeneratorResource from monitoring.uss_qualifier.resources.netrid.service_area import ServiceAreaResource diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_validation.py b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_validation.py index 053c4feac4..ce32710cdd 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_validation.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_validation.py @@ -6,9 +6,9 @@ from uas_standards.astm.f3411 import v19, v22a from monitoring.monitorlib.fetch import QueryType, query_and_describe +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.mutate.rid import ChangedISA from monitoring.monitorlib.rid import RIDVersion -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources.astm.f3411.dss import DSSInstanceResource from monitoring.uss_qualifier.resources.interuss.id_generator import IDGeneratorResource from monitoring.uss_qualifier.resources.netrid.service_area import ServiceAreaResource diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_simple.py b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_simple.py index 475bcc16a2..ad2c258521 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_simple.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_simple.py @@ -5,8 +5,8 @@ import s2sphere from monitoring.monitorlib.fetch.rid import Subscription +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.mutate.rid import ChangedSubscription -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources.astm.f3411.dss import DSSInstanceResource from monitoring.uss_qualifier.resources.communications import ClientIdentityResource from monitoring.uss_qualifier.resources.interuss.id_generator import IDGeneratorResource diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_validation.py b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_validation.py index 477367ee5f..e73543f137 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_validation.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_validation.py @@ -1,7 +1,7 @@ import datetime +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.mutate.rid import ChangedSubscription -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources.astm.f3411.dss import DSSInstanceResource from monitoring.uss_qualifier.resources.interuss.id_generator import IDGeneratorResource from monitoring.uss_qualifier.resources.netrid.service_area import ServiceAreaResource diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/token_validation.py b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/token_validation.py index 304efc11e8..af4a2a7ec6 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/token_validation.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/token_validation.py @@ -8,6 +8,7 @@ from monitoring.monitorlib.fetch import QueryType from monitoring.monitorlib.fetch import rid as rid_fetch from monitoring.monitorlib.fetch.rid import FetchedISA, FetchedISAs +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.mutate import rid as mutate from monitoring.monitorlib.mutate.rid import ( ChangedISA, @@ -15,7 +16,6 @@ ISAChangeNotification, ) from monitoring.monitorlib.rid import RIDVersion -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources.astm.f3411.dss import DSSInstanceResource from monitoring.uss_qualifier.resources.interuss.id_generator import IDGeneratorResource from monitoring.uss_qualifier.resources.netrid.service_area import ServiceAreaResource diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/common/sp_notification_behavior.py b/monitoring/uss_qualifier/scenarios/astm/netrid/common/sp_notification_behavior.py index fd3963650b..39c0553d36 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/common/sp_notification_behavior.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/sp_notification_behavior.py @@ -9,9 +9,9 @@ QueryDirection, ) from monitoring.monitorlib.fetch import Query, QueryType +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.rid import RIDVersion from monitoring.monitorlib.temporal import Time -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.configurations.configuration import ParticipantID from monitoring.uss_qualifier.resources.astm.f3411.dss import DSSInstancesResource from monitoring.uss_qualifier.resources.interuss import IDGeneratorResource diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/dss/authentication/authentication_validation.py b/monitoring/uss_qualifier/scenarios/astm/utm/dss/authentication/authentication_validation.py index 3a423c0dd6..563ca74166 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/dss/authentication/authentication_validation.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/dss/authentication/authentication_validation.py @@ -3,11 +3,11 @@ from monitoring.monitorlib.auth import InvalidTokenSignatureAuth from monitoring.monitorlib.fetch import QueryError +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.infrastructure import ( utm_client_session_factory, ) from monitoring.monitorlib.inspection import fullname -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import ( DSSInstance, DSSInstanceResource, diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/dss/constraint_ref_simple.py b/monitoring/uss_qualifier/scenarios/astm/utm/dss/constraint_ref_simple.py index 1def2a27f0..47c6376d80 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/dss/constraint_ref_simple.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/dss/constraint_ref_simple.py @@ -4,7 +4,7 @@ from uas_standards.astm.f3548.v21.constants import Scope from monitoring.monitorlib.fetch import QueryError -from monitoring.prober.infrastructure import register_resource_type +from monitoring.monitorlib.ids import register_resource_type from monitoring.uss_qualifier.resources import PlanningAreaResource from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import ( DSSInstance, diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/dss/oir_explicit_sub_handling.py b/monitoring/uss_qualifier/scenarios/astm/utm/dss/oir_explicit_sub_handling.py index 328c427efa..2edfb42abd 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/dss/oir_explicit_sub_handling.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/dss/oir_explicit_sub_handling.py @@ -12,8 +12,8 @@ from monitoring.monitorlib.fetch import QueryError from monitoring.monitorlib.geotemporal import Volume4D +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.subscription_params import SubscriptionParams -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources import PlanningAreaResource from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import ( DSSInstance, diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/dss/oir_implicit_sub_handling.py b/monitoring/uss_qualifier/scenarios/astm/utm/dss/oir_implicit_sub_handling.py index 54d83ea026..de25473e6e 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/dss/oir_implicit_sub_handling.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/dss/oir_implicit_sub_handling.py @@ -13,8 +13,8 @@ from uas_standards.astm.f3548.v21.constants import Scope from monitoring.monitorlib.fetch import Query, QueryError +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.testing import make_fake_url -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources import PlanningAreaResource from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import DSSInstanceResource from monitoring.uss_qualifier.resources.communications import ClientIdentityResource diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_access_control.py b/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_access_control.py index 8eb489ec30..c25fa4f5a1 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_access_control.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_access_control.py @@ -10,8 +10,8 @@ ) from monitoring.monitorlib.fetch import QueryError from monitoring.monitorlib.geotemporal import Volume4D, Volume4DCollection +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.testing import make_fake_url -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources.astm.f3548.v21 import DSSInstanceResource from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import DSSInstance from monitoring.uss_qualifier.resources.communications import AuthAdapterResource diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_key_validation.py b/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_key_validation.py index 4481144f95..1871820541 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_key_validation.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_key_validation.py @@ -11,8 +11,8 @@ from monitoring.monitorlib import fetch, schema_validation from monitoring.monitorlib.fetch import QueryError from monitoring.monitorlib.fetch.scd import FetchedSubscriptions +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.schema_validation import F3548_21 -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources import PlanningAreaResource from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import ( DSSInstance, diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_simple.py b/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_simple.py index 24d690b815..9dc46b98fd 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_simple.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_simple.py @@ -10,7 +10,7 @@ from uas_standards.astm.f3548.v21.constants import Scope from monitoring.monitorlib.fetch import QueryError -from monitoring.prober.infrastructure import register_resource_type +from monitoring.monitorlib.ids import register_resource_type from monitoring.uss_qualifier.resources import PlanningAreaResource from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import ( DSSInstance, diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_state_transitions.py b/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_state_transitions.py index 5d7c98c2a8..cf3fddd834 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_state_transitions.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/dss/op_intent_ref_state_transitions.py @@ -7,8 +7,8 @@ ) from monitoring.monitorlib.fetch import QueryError from monitoring.monitorlib.geotemporal import Volume4D +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.testing import make_fake_url -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources.astm.f3548.v21 import DSSInstanceResource from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import DSSInstance from monitoring.uss_qualifier.resources.flight_planning import FlightIntentsResource diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/dss/subscription_interactions.py b/monitoring/uss_qualifier/scenarios/astm/utm/dss/subscription_interactions.py index 77f80af828..6b5f90f675 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/dss/subscription_interactions.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/dss/subscription_interactions.py @@ -11,8 +11,8 @@ from uas_standards.astm.f3548.v21.constants import Scope from monitoring.monitorlib.fetch import QueryError +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.testing import make_fake_url -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.configurations.configuration import ParticipantID from monitoring.uss_qualifier.resources import PlanningAreaResource from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import ( diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/dss/subscription_simple.py b/monitoring/uss_qualifier/scenarios/astm/utm/dss/subscription_simple.py index dad9e940ab..22185714a2 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/dss/subscription_simple.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/dss/subscription_simple.py @@ -6,8 +6,8 @@ from monitoring.monitorlib import geo from monitoring.monitorlib.geo import Polygon, Volume3D from monitoring.monitorlib.geotemporal import Volume4D +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.mutate.scd import MutatedSubscription -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources import PlanningAreaResource from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import DSSInstanceResource from monitoring.uss_qualifier.resources.interuss.id_generator import IDGeneratorResource diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/dss/subscription_validation.py b/monitoring/uss_qualifier/scenarios/astm/utm/dss/subscription_validation.py index 1c3b2ce5b5..f021f53a16 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/dss/subscription_validation.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/dss/subscription_validation.py @@ -7,8 +7,8 @@ ) from monitoring.monitorlib.geotemporal import Volume4D +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.mutate.scd import MutatedSubscription -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import DSSInstanceResource from monitoring.uss_qualifier.resources.interuss.id_generator import IDGeneratorResource from monitoring.uss_qualifier.resources.planning_area import ( diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/dss/synchronization/constraint_ref_synchronization.py b/monitoring/uss_qualifier/scenarios/astm/utm/dss/synchronization/constraint_ref_synchronization.py index 120e58ce5a..5fafa7d869 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/dss/synchronization/constraint_ref_synchronization.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/dss/synchronization/constraint_ref_synchronization.py @@ -10,7 +10,7 @@ from monitoring.monitorlib.fetch import Query, QueryError from monitoring.monitorlib.geotemporal import Volume4DCollection -from monitoring.prober.infrastructure import register_resource_type +from monitoring.monitorlib.ids import register_resource_type from monitoring.uss_qualifier.resources import PlanningAreaResource from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import ( DSSInstance, diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/dss/synchronization/op_intent_ref_synchronization.py b/monitoring/uss_qualifier/scenarios/astm/utm/dss/synchronization/op_intent_ref_synchronization.py index 7232a12920..5f9b6570e5 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/dss/synchronization/op_intent_ref_synchronization.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/dss/synchronization/op_intent_ref_synchronization.py @@ -11,7 +11,7 @@ from monitoring.monitorlib.fetch import Query, QueryError from monitoring.monitorlib.geotemporal import Volume4DCollection -from monitoring.prober.infrastructure import register_resource_type +from monitoring.monitorlib.ids import register_resource_type from monitoring.uss_qualifier.resources import PlanningAreaResource from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import ( DSSInstance, diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/dss/synchronization/subscription_synchronization.py b/monitoring/uss_qualifier/scenarios/astm/utm/dss/synchronization/subscription_synchronization.py index c6ca1a1638..11973c45d6 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/dss/synchronization/subscription_synchronization.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/dss/synchronization/subscription_synchronization.py @@ -7,9 +7,9 @@ from monitoring.monitorlib import geo, schema_validation from monitoring.monitorlib.geo import Volume3D from monitoring.monitorlib.geotemporal import Volume4D +from monitoring.monitorlib.ids import register_resource_type from monitoring.monitorlib.mutate.scd import MutatedSubscription from monitoring.monitorlib.schema_validation import F3548_21 -from monitoring.prober.infrastructure import register_resource_type from monitoring.uss_qualifier.resources import PlanningAreaResource from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import ( DSSInstance, diff --git a/monitoring/uss_qualifier/scenarios/interuss/ovn_request/dss_ovn_request.py b/monitoring/uss_qualifier/scenarios/interuss/ovn_request/dss_ovn_request.py index 84c68260b3..2493128904 100644 --- a/monitoring/uss_qualifier/scenarios/interuss/ovn_request/dss_ovn_request.py +++ b/monitoring/uss_qualifier/scenarios/interuss/ovn_request/dss_ovn_request.py @@ -9,7 +9,7 @@ from uuid6 import uuid6, uuid7 from monitoring.monitorlib.fetch import QueryError -from monitoring.prober.infrastructure import register_resource_type +from monitoring.monitorlib.ids import register_resource_type from monitoring.uss_qualifier.resources import PlanningAreaResource from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import DSSInstanceResource from monitoring.uss_qualifier.resources.communications import ClientIdentityResource