diff --git a/monitoring/monitorlib/fetch/__init__.py b/monitoring/monitorlib/fetch/__init__.py index d69a3eb321..4ad629962c 100644 --- a/monitoring/monitorlib/fetch/__init__.py +++ b/monitoring/monitorlib/fetch/__init__.py @@ -8,6 +8,7 @@ from enum import Enum from urllib.parse import urlparse +import aiohttp import flask from loguru import logger import requests @@ -145,6 +146,20 @@ def describe_response(resp: requests.Response) -> ResponseDescription: return ResponseDescription(**kwargs) +def describe_aiohttp_response( + status: int, headers: Dict, resp_json: Dict, duration: datetime.timedelta +) -> ResponseDescription: + kwargs = { + "code": status, + "headers": headers, + "elapsed_s": duration.total_seconds(), + "reported": StringBasedDateTime(datetime.datetime.utcnow()), + "json": resp_json, + } + + return ResponseDescription(**kwargs) + + def describe_flask_response(resp: flask.Response, elapsed_s: float): headers = {k: v for k, v in resp.headers.items()} kwargs = { diff --git a/monitoring/monitorlib/infrastructure.py b/monitoring/monitorlib/infrastructure.py index 093ef73c28..971325ce30 100644 --- a/monitoring/monitorlib/infrastructure.py +++ b/monitoring/monitorlib/infrastructure.py @@ -3,7 +3,7 @@ import functools from typing import Dict, List, Optional import urllib.parse -from aiohttp import ClientSession +from aiohttp import ClientSession, ClientResponse import jwt import requests @@ -194,14 +194,22 @@ async def put(self, url, **kwargs): if "auth" not in kwargs: kwargs = self.adjust_request_kwargs(url, "PUT", kwargs) async with self._client.put(url, **kwargs) as response: - return response.status, await response.json() + return ( + response.status, + {k: v for k, v in response.headers.items()}, + await response.json(), + ) async def get(self, url, **kwargs): url = self._prefix_url + url if "auth" not in kwargs: kwargs = self.adjust_request_kwargs(url, "GET", kwargs) async with self._client.get(url, **kwargs) as response: - return response.status, await response.json() + return ( + response.status, + {k: v for k, v in response.headers.items()}, + await response.json(), + ) async def post(self, url, **kwargs): url = self._prefix_url + url @@ -215,7 +223,11 @@ async def delete(self, url, **kwargs): if "auth" not in kwargs: kwargs = self.adjust_request_kwargs(url, "DELETE", kwargs) async with self._client.delete(url, **kwargs) as response: - return response.status, await response.json() + return ( + response.status, + {k: v for k, v in response.headers.items()}, + await response.json(), + ) def default_scopes(scopes: List[str]): diff --git a/monitoring/monitorlib/mutate/rid.py b/monitoring/monitorlib/mutate/rid.py index 09fbe25cf0..6c89b6e7a9 100644 --- a/monitoring/monitorlib/mutate/rid.py +++ b/monitoring/monitorlib/mutate/rid.py @@ -3,6 +3,7 @@ from implicitdict import ImplicitDict import s2sphere +from uas_standards import Operation from monitoring.monitorlib.fetch.rid import RIDQuery, Subscription, ISA from monitoring.monitorlib.rid import RIDVersion @@ -439,22 +440,19 @@ class ISAChange(ImplicitDict): """Mapping from USS base URL to change notification query""" -def put_isa( +def build_isa_request_body( area_vertices: List[s2sphere.LatLng], alt_lo: float, alt_hi: float, start_time: datetime.datetime, end_time: datetime.datetime, uss_base_url: str, - isa_id: str, rid_version: RIDVersion, - utm_client: infrastructure.UTMClientSession, - isa_version: Optional[str] = None, - participant_id: Optional[str] = None, -) -> ISAChange: - mutation = "create" if isa_version is None else "update" +) -> Dict[str, any]: + """Build the payload expected to PUT or UPDATE an ISA on a DSS, + in accordance with the specified rid_version.""" if rid_version == RIDVersion.f3411_19: - body = { + return { "extents": rid_v1.make_volume_4d( area_vertices, alt_lo, @@ -465,25 +463,8 @@ def put_isa( "flights_url": uss_base_url + v19.api.OPERATIONS[v19.api.OperationID.SearchFlights].path, } - if isa_version is None: - op = v19.api.OPERATIONS[v19.api.OperationID.CreateIdentificationServiceArea] - url = op.path.format(id=isa_id) - else: - op = v19.api.OPERATIONS[v19.api.OperationID.UpdateIdentificationServiceArea] - url = op.path.format(id=isa_id, version=isa_version) - dss_response = ChangedISA( - mutation=mutation, - v19_query=fetch.query_and_describe( - utm_client, - op.verb, - url, - json=body, - scope=v19.constants.Scope.Write, - participant_id=participant_id, - ), - ) elif rid_version == RIDVersion.f3411_22a: - body = { + return { "extents": rid_v2.make_volume_4d( area_vertices, alt_lo, @@ -493,16 +474,79 @@ def put_isa( ), "uss_base_url": uss_base_url, } + else: + raise NotImplementedError( + f"Cannot build ISA payload for RID version {rid_version}" + ) + + +def build_isa_url( + rid_version: RIDVersion, isa_id: str, isa_version: Optional[str] = None +) -> (Operation, str): + """Build the required URL to create, get, update or delete an ISA on a DSS, + in accordance with the specified rid_version and isa_version, if it is available. + + Note that for mutations and deletions, isa_version must be provided. + """ + if rid_version == RIDVersion.f3411_19: + if isa_version is None: + op = v19.api.OPERATIONS[v19.api.OperationID.CreateIdentificationServiceArea] + return (op, op.path.format(id=isa_id)) + else: + op = v19.api.OPERATIONS[v19.api.OperationID.UpdateIdentificationServiceArea] + return (op, op.path.format(id=isa_id, version=isa_version)) + elif rid_version == RIDVersion.f3411_22a: if isa_version is None: op = v22a.api.OPERATIONS[ v22a.api.OperationID.CreateIdentificationServiceArea ] - url = op.path.format(id=isa_id) + return (op, op.path.format(id=isa_id)) else: op = v22a.api.OPERATIONS[ v22a.api.OperationID.UpdateIdentificationServiceArea ] - url = op.path.format(id=isa_id, version=isa_version) + return (op, op.path.format(id=isa_id, version=isa_version)) + else: + raise NotImplementedError(f"Cannot build ISA URL for RID version {rid_version}") + + +def put_isa( + area_vertices: List[s2sphere.LatLng], + alt_lo: float, + alt_hi: float, + start_time: datetime.datetime, + end_time: datetime.datetime, + uss_base_url: str, + isa_id: str, + rid_version: RIDVersion, + utm_client: infrastructure.UTMClientSession, + isa_version: Optional[str] = None, + participant_id: Optional[str] = None, +) -> ISAChange: + mutation = "create" if isa_version is None else "update" + body = build_isa_request_body( + area_vertices, + alt_lo, + alt_hi, + start_time, + end_time, + uss_base_url, + rid_version, + ) + (op, url) = build_isa_url(rid_version, isa_id, isa_version) + if rid_version == RIDVersion.f3411_19: + dss_response = ChangedISA( + mutation=mutation, + v19_query=fetch.query_and_describe( + utm_client, + op.verb, + url, + json=body, + scope=v19.constants.Scope.Write, + participant_id=participant_id, + ), + ) + elif rid_version == RIDVersion.f3411_22a: dss_response = ChangedISA( mutation=mutation, v22a_query=fetch.query_and_describe( diff --git a/monitoring/monitorlib/rid.py b/monitoring/monitorlib/rid.py index 5aa9f4ff9e..3d2826de41 100644 --- a/monitoring/monitorlib/rid.py +++ b/monitoring/monitorlib/rid.py @@ -57,6 +57,15 @@ def openapi_search_isas_response_path(self) -> str: else: raise ValueError(f"Unsupported RID version '{self}'") + @property + def openapi_get_isa_response_path(self) -> str: + if self == RIDVersion.f3411_19: + return schema_validation.F3411_19.GetIdentificationServiceAreaResponse + elif self == RIDVersion.f3411_22a: + return schema_validation.F3411_22a.GetIdentificationServiceAreaResponse + else: + raise ValueError(f"Unsupported RID version '{self}'") + @property def openapi_put_isa_response_path(self) -> str: if self == RIDVersion.f3411_19: diff --git a/monitoring/monitorlib/schema_validation.py b/monitoring/monitorlib/schema_validation.py index 9a7492f897..ce0c43786f 100644 --- a/monitoring/monitorlib/schema_validation.py +++ b/monitoring/monitorlib/schema_validation.py @@ -19,6 +19,9 @@ class F3411_19(str, Enum): SearchIdentificationServiceAreasResponse = ( "components.schemas.SearchIdentificationServiceAreasResponse" ) + GetIdentificationServiceAreaResponse = ( + "components.schemas.GetIdentificationServiceAreaResponse" + ) PutIdentificationServiceAreaResponse = ( "components.schemas.PutIdentificationServiceAreaResponse" ) @@ -34,6 +37,9 @@ class F3411_22a(str, Enum): SearchIdentificationServiceAreasResponse = ( "components.schemas.SearchIdentificationServiceAreasResponse" ) + GetIdentificationServiceAreaResponse = ( + "components.schemas.GetIdentificationServiceAreaResponse" + ) PutIdentificationServiceAreaResponse = ( "components.schemas.PutIdentificationServiceAreaResponse" ) diff --git a/monitoring/prober/infrastructure.py b/monitoring/prober/infrastructure.py index 5a5f145965..d0124b10c6 100644 --- a/monitoring/prober/infrastructure.py +++ b/monitoring/prober/infrastructure.py @@ -100,7 +100,7 @@ def wrapper_default_scope(*args, **kwargs): resource_type_code_descriptions: Dict[ResourceType, str] = {} -# Next code: 373 +# Next code: 374 def register_resource_type(code: int, description: str) -> ResourceType: """Register that the specified code refers to the described resource. 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 new file mode 100644 index 0000000000..aee87d080f --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/heavy_traffic_concurrent.py @@ -0,0 +1,449 @@ +import asyncio +import typing +from datetime import datetime +from typing import List, Dict + +import arrow +import requests +from uas_standards.astm.f3411 import v19, v22a + +from monitoring.monitorlib.fetch import ( + describe_request, + Query, + describe_aiohttp_response, +) +from monitoring.monitorlib.fetch.rid import FetchedISA +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.prober.infrastructure import register_resource_type +from monitoring.uss_qualifier.common_data_definitions import Severity +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 +from monitoring.uss_qualifier.scenarios.astm.netrid.common.dss.isa_validator import ( + ISAValidator, +) +from monitoring.uss_qualifier.scenarios.astm.netrid.common.dss.utils import ( + delete_isa_if_exists, +) +from monitoring.uss_qualifier.scenarios.astm.netrid.dss_wrapper import DSSWrapper +from monitoring.uss_qualifier.scenarios.scenario import GenericTestScenario +from monitoring.uss_qualifier.suites.suite import ExecutionContext + +# Semaphore is added to limit the number of simultaneous requests. +# Should we consider making these configurable through the scenario's parameters? +SEMAPHORE = asyncio.Semaphore(20) +THREAD_COUNT = 10 +CREATE_ISAS_COUNT = 100 + + +class HeavyTrafficConcurrent(GenericTestScenario): + """Based on prober/rid/v1/test_isa_simple_heavy_traffic_concurrent.py from the legacy prober tool.""" + + ISA_TYPE = register_resource_type(373, "ISA") + + _isa_ids: List[str] + + _isa_params: Dict[str, any] + + _isa_versions: Dict[str, str] + + _async_session: AsyncUTMTestSession + + def __init__( + self, + dss: DSSInstanceResource, + id_generator: IDGeneratorResource, + isa: ServiceAreaResource, + ): + super().__init__() + self._dss = ( + dss.dss_instance + ) # TODO: delete once _delete_isa_if_exists updated to use dss_wrapper + self._dss_wrapper = DSSWrapper(self, dss.dss_instance) + + self._isa_versions: Dict[str, str] = {} + self._isa = isa.specification + + now = arrow.utcnow().datetime + self._isa_start_time = self._isa.shifted_time_start(now) + self._isa_end_time = self._isa.shifted_time_end(now) + self._isa_area = [vertex.as_s2sphere() for vertex in self._isa.footprint] + + # Note that when the test scenario ends prematurely, we may end up with an unclosed session. + self._async_session = AsyncUTMTestSession( + self._dss.base_url, self._dss.client.auth_adapter + ) + + isa_base_id = id_generator.id_factory.make_id(HeavyTrafficConcurrent.ISA_TYPE) + # The base ID ends in 000: we simply increment it to generate the other IDs + self._isa_ids = [f"{isa_base_id[:-3]}{i:03d}" for i in range(CREATE_ISAS_COUNT)] + + # currently all params are the same: + # we could improve the test by having unique parameters per ISA + self._isa_params = dict( + area_vertices=self._isa_area, + start_time=self._isa_start_time, + end_time=self._isa_end_time, + uss_base_url=self._isa.base_url, + alt_lo=self._isa.altitude_min, + alt_hi=self._isa.altitude_max, + ) + + def run(self, context: ExecutionContext): + self.begin_test_scenario(context) + + self.begin_test_case("Setup") + self.begin_test_step("Ensure clean workspace") + self._delete_isas_if_exists() + self.end_test_step() + self.end_test_case() + + self.begin_test_case("Concurrent Requests") + + self.begin_test_step("Create ISA concurrently") + self._create_isas_concurrent_step() + self.end_test_step() + + self.begin_test_step("Get ISAs concurrently") + self._get_isas_by_id_concurrent_step() + self.end_test_step() + + self.begin_test_step("Search Available ISAs") + self._search_area_step() + self.end_test_step() + + self.begin_test_step("Delete ISAs concurrently") + self._delete_isas() + self.end_test_step() + + self.begin_test_step("Access Deleted ISAs") + self._get_deleted_isas() + self.end_test_step() + + self.begin_test_step("Search Deleted ISAs") + self._search_deleted_isas() + self.end_test_step() + + self.end_test_case() + self.end_test_scenario() + + def _delete_isas_if_exists(self): + """Delete test ISAs if they exist. Done sequentially.""" + for isa_id in self._isa_ids: + delete_isa_if_exists( + self, + isa_id=isa_id, + rid_version=self._dss.rid_version, + session=self._dss.client, + participant_id=self._dss_wrapper.participant_id, + ) + + def _get_isas_by_id_concurrent_step(self): + loop = asyncio.get_event_loop() + results = loop.run_until_complete( + asyncio.gather(*[self._get_isa(isa_id) for isa_id in self._isa_ids]) + ) + + results = typing.cast(Dict[str, FetchedISA], results) + + for _, fetched_isa in results: + self.record_query(fetched_isa.query) + + with self.check( + "Successful Concurrent ISA query", [self._dss_wrapper.participant_id] + ) as main_check: + for isa_id, fetched_isa in results: + if fetched_isa.status_code != 200: + main_check.record_failed( + f"ISA retrieval query failed for {isa_id}", + severity=Severity.High, + details=f"ISA retrieval query for {isa_id} yielded code {fetched_isa.status_code}", + ) + + isa_validator = ISAValidator( + main_check=main_check, + scenario=self, + isa_params=self._isa_params, + dss_id=self._dss.participant_id, + rid_version=self._dss.rid_version, + ) + + for isa_id, fetched_isa in results: + isa_validator.validate_fetched_isa( + isa_id, fetched_isa, expected_version=self._isa_versions[isa_id] + ) + + def _wrap_isa_get_query(self, q: Query) -> FetchedISA: + """Wrap things into the correct utility class""" + if self._dss.rid_version == RIDVersion.f3411_19: + return FetchedISA(v19_query=q) + elif self._dss.rid_version == RIDVersion.f3411_22a: + return FetchedISA(v22a_query=q) + else: + raise ValueError(f"Unsupported RID version '{self._dss.rid_version}'") + + def _wrap_isa_put_query(self, q: Query, mutation: str) -> ChangedISA: + """Wrap things into the correct utility class""" + if self._dss.rid_version == RIDVersion.f3411_19: + return ChangedISA(mutation=mutation, v19_query=q) + elif self._dss.rid_version == RIDVersion.f3411_22a: + return ChangedISA(mutation=mutation, v22a_query=q) + else: + raise ValueError(f"Unsupported RID version '{self._dss.rid_version}'") + + async def _get_isa(self, isa_id): + async with SEMAPHORE: + (_, url) = mutate.build_isa_url(self._dss.rid_version, isa_id) + # Build a `Request` object to register the query later on, + # although we don't need it to do the effective request here on the async_session + # This one is quite barebone and we need to check if anything needs to be added + r = requests.Request( + "GET", + url, + ) + prep = self._dss.client.prepare_request(r) + t0 = datetime.utcnow() + req_descr = describe_request(prep, t0) + status, headers, resp_json = await self._async_session.get( + url=url, scope=self._read_scope() + ) + duration = datetime.utcnow() - t0 + rq = Query( + request=req_descr, + response=describe_aiohttp_response( + status, headers, resp_json, duration + ), + participant_id=self._dss.participant_id, + ) + return isa_id, self._wrap_isa_get_query(rq) + + async def _create_isa(self, isa_id): + async with SEMAPHORE: + payload = mutate.build_isa_request_body( + **self._isa_params, + rid_version=self._dss.rid_version, + ) + (_, url) = mutate.build_isa_url(self._dss.rid_version, isa_id) + r = requests.Request( + "PUT", + url, + json=payload, + ) + prep = self._dss.client.prepare_request(r) + t0 = datetime.utcnow() + req_descr = describe_request(prep, t0) + status, headers, resp_json = await self._async_session.put( + url=url, json=payload, scope=self._write_scope() + ) + duration = datetime.utcnow() - t0 + rq = Query( + request=req_descr, + response=describe_aiohttp_response( + status, headers, resp_json, duration + ), + participant_id=self._dss.participant_id, + ) + return isa_id, self._wrap_isa_put_query(rq, "create") + + async def _delete_isa(self, isa_id, isa_version): + async with SEMAPHORE: + (_, url) = mutate.build_isa_url(self._dss.rid_version, isa_id, isa_version) + r = requests.Request( + "DELETE", + url, + ) + prep = self._dss.client.prepare_request(r) + t0 = datetime.utcnow() + req_descr = describe_request(prep, t0) + status, headers, resp_json = await self._async_session.delete( + url=url, scope=self._write_scope() + ) + duration = datetime.utcnow() - t0 + rq = Query( + request=req_descr, + response=describe_aiohttp_response( + status, headers, resp_json, duration + ), + participant_id=self._dss.participant_id, + ) + return isa_id, self._wrap_isa_put_query(rq, "delete") + + def _write_scope(self): + if self._dss.rid_version == RIDVersion.f3411_19: + return v19.constants.Scope.Write + elif self._dss.rid_version == RIDVersion.f3411_22a: + return v22a.constants.Scope.ServiceProvider + else: + raise ValueError(f"Unsupported RID version '{self._dss.rid_version}'") + + def _read_scope(self): + if self._dss.rid_version == RIDVersion.f3411_19: + return v19.constants.Scope.Read + elif self._dss.rid_version == RIDVersion.f3411_22a: + return v22a.constants.Scope.DisplayProvider + else: + raise ValueError(f"Unsupported RID version '{self._dss.rid_version}'") + + def _create_isas_concurrent_step(self): + loop = asyncio.get_event_loop() + results = loop.run_until_complete( + asyncio.gather(*[self._create_isa(isa_id) for isa_id in self._isa_ids]) + ) + + results = typing.cast(Dict[str, ChangedISA], results) + + for _, fetched_isa in results: + self.record_query(fetched_isa.query) + + with self.check( + "Concurrent ISAs creation", [self._dss_wrapper.participant_id] + ) as main_check: + for isa_id, changed_isa in results: + if changed_isa.query.response.code != 200: + main_check.record_failed( + f"ISA creation failed for {isa_id}", + severity=Severity.High, + details=f"ISA creation for {isa_id} returned {changed_isa.query.response.code}", + ) + else: + self._isa_versions[isa_id] = changed_isa.isa.version + + isa_validator = ISAValidator( + main_check=main_check, + scenario=self, + isa_params=self._isa_params, + dss_id=self._dss.participant_id, + rid_version=self._dss.rid_version, + ) + + for isa_id, changed_isa in results: + isa_validator.validate_mutated_isa( + isa_id, changed_isa, previous_version=None + ) + + def _search_area_step(self): + with self.check( + "Successful ISAs search", [self._dss_wrapper.participant_id] + ) as main_check: + isas = self._dss_wrapper.search_isas( + main_check, + area=self._isa_area, + ) + + with self.check( + "Correct ISAs returned by search", [self._dss_wrapper.participant_id] + ) as sub_check: + for isa_id in self._isa_ids: + if isa_id not in isas.isas.keys(): + sub_check.record_failed( + f"ISAs search did not return ISA {isa_id} that was just created", + severity=Severity.High, + details=f"Search in area {self._isa_area} returned ISAs {isas.isas.keys()} and is missing some of the created ISAs", + query_timestamps=[isas.dss_query.query.request.timestamp], + ) + + isa_validator = ISAValidator( + main_check=main_check, + scenario=self, + isa_params=self._isa_params, + dss_id=self._dss.participant_id, + rid_version=self._dss.rid_version, + ) + + isa_validator.validate_searched_isas( + isas, expected_versions=self._isa_versions + ) + + def _delete_isas(self): + loop = asyncio.get_event_loop() + results = loop.run_until_complete( + asyncio.gather( + *[ + self._delete_isa(isa_id, self._isa_versions[isa_id]) + for isa_id in self._isa_ids + ] + ) + ) + + results = typing.cast(Dict[str, ChangedISA], results) + + for _, fetched_isa in results: + self.record_query(fetched_isa.query) + + with self.check( + "ISAs deletion query success", [self._dss_wrapper.participant_id] + ) as main_check: + for isa_id, deleted_isa in results: + if deleted_isa.query.response.code != 200: + main_check.record_failed( + f"ISA deletion failed for {isa_id}", + severity=Severity.High, + details=f"ISA deletion for {isa_id} returned {deleted_isa.query.response.code}", + ) + + isa_validator = ISAValidator( + main_check=main_check, + scenario=self, + isa_params=self._isa_params, + dss_id=self._dss.participant_id, + rid_version=self._dss.rid_version, + ) + + for isa_id, changed_isa in results: + isa_validator.validate_deleted_isa( + isa_id, changed_isa, expected_version=self._isa_versions[isa_id] + ) + + def _get_deleted_isas(self): + + loop = asyncio.get_event_loop() + results = loop.run_until_complete( + asyncio.gather(*[self._get_isa(isa_id) for isa_id in self._isa_ids]) + ) + + results = typing.cast(Dict[str, ChangedISA], results) + + for _, fetched_isa in results: + self.record_query(fetched_isa.query) + + with self.check("ISAs not found", [self._dss_wrapper.participant_id]) as check: + for isa_id, fetched_isa in results: + if fetched_isa.status_code != 404: + check.record_failed( + f"ISA retrieval succeeded for {isa_id}", + severity=Severity.High, + details=f"ISA retrieval for {isa_id} returned {fetched_isa.status_code}", + query_timestamps=[fetched_isa.query.request.timestamp], + ) + + def _search_deleted_isas(self): + with self.check( + "Successful ISAs search", [self._dss_wrapper.participant_id] + ) as check: + isas = self._dss_wrapper.search_isas( + check, + area=self._isa_area, + ) + + with self.check( + "ISAs not returned by search", [self._dss_wrapper.participant_id] + ) as check: + for isa_id in self._isa_ids: + if isa_id in isas.isas.keys(): + check.record_failed( + f"ISAs search returned deleted ISA {isa_id}", + severity=Severity.High, + details=f"Search in area {self._isa_area} returned ISAs {isas.isas.keys()} that contained some of the ISAs we had previously deleted.", + query_timestamps=[isas.dss_query.query.request.timestamp], + ) + + def cleanup(self): + self.begin_cleanup() + + self._delete_isas_if_exists() + self._async_session.close() + + self.end_cleanup() diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/utils.py b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/utils.py index 036876ed93..d1c2811a49 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/utils.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/utils.py @@ -1,11 +1,18 @@ -from typing import Optional +from datetime import datetime +from typing import Optional, Dict +from monitoring.monitorlib import schema_validation from monitoring.monitorlib.fetch import rid as fetch +from monitoring.monitorlib.fetch.rid import ISA, FetchedISA, FetchedISAs from monitoring.monitorlib.infrastructure import UTMClientSession from monitoring.monitorlib.mutate import rid as mutate +from monitoring.monitorlib.mutate.rid import ChangedISA from monitoring.monitorlib.rid import RIDVersion from monitoring.uss_qualifier.common_data_definitions import Severity -from monitoring.uss_qualifier.scenarios.scenario import GenericTestScenario +from monitoring.uss_qualifier.scenarios.scenario import ( + GenericTestScenario, + PendingCheck, +) def delete_isa_if_exists( diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/__init__.py b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/__init__.py index aed0f85b9d..a89cb054cb 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/__init__.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/__init__.py @@ -6,3 +6,4 @@ from .subscription_simple import SubscriptionSimple from .token_validation import TokenValidation from .crdb_access import CRDBAccess +from .heavy_traffic_concurrent import HeavyTrafficConcurrent diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/heavy_traffic_concurrent.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/heavy_traffic_concurrent.md new file mode 100644 index 0000000000..1a8c371c78 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/heavy_traffic_concurrent.md @@ -0,0 +1,120 @@ +# ASTM NetRID DSS: Concurrent Requests test scenario + +## Overview + +Create, query and delete ISAs on the DSS, concurrently. + +## Resources + +### dss + +[`DSSInstanceResource`](../../../../../resources/astm/f3411/dss.py) to be tested in this scenario. + +### id_generator + +[`IDGeneratorResource`](../../../../../resources/interuss/id_generator.py) providing the ISA ID for this scenario. + +### isa + +[`ServiceAreaResource`](../../../../../resources/netrid/service_area.py) describing the ISAs to be created. All created ISAs use the same parameters. + +## Setup test case + +### Ensure clean workspace test step + +This scenario creates ISA's with known IDs. This step ensures that no ISA with a known ID is present in the DSS before proceeding with the test. + +#### Successful ISA query check + +While F3411-19 does not explicitly require the implementation of a specific ISA retrieval endpoint, Annex A4 specifies the explicit format for this endpoint. If this format is not followed and the error isn't a 404, this check will fail per **[interuss.f3411.dss_endpoints.GetISA](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Removed pre-existing ISA check + +If an ISA with the intended ID is already present in the DSS, it needs to be removed before proceeding with the test. If that ISA cannot be deleted, then the **[astm.f3411.v19.DSS0030,b](../../../../../requirements/astm/f3411/v19.md)** requirement to implement the ISA deletion endpoint might not be met. + +#### Notified subscriber check + +When a pre-existing ISA needs to be deleted to ensure a clean workspace, any subscribers to ISAs in that area must be notified (as specified by the DSS). If a notification cannot be delivered, then the **[astm.f3411.v19.NET0730](../../../../../requirements/astm/f3411/v19.md)** requirement to implement the POST ISAs endpoint isn't met. + +## Concurrent Requests test case + +This test case will: + +1. Create ISAs concurrently +2. Query each ISA individually, but concurrently +3. Search for all ISAs in the area of the created ISAs (using a single request) +4. Delete the ISAs concurrently +5. Query each ISA individually, but concurrently +6. Search for all ISAs in the area of the deleted ISAs (using a single request) + +### [Create ISA concurrently test step](test_steps/put_isa.md) + +This step attempts to concurrently create multiple ISAs, as specified in this scenario's resource, at the configured DSS. + +#### Concurrent ISAs creation check + +If any of the concurrent ISA creation requests fail or leads to the creation of an incorrect ISA, the PUT DSS endpoint in **[astm.f3411.v19.DSS0030,a](../../../../../requirements/astm/f3411/v19.md)** is likely not implemented correctly. + +### [Get ISAs concurrently test step](test_steps/get_isa.md) + +This step attempts to concurrently retrieve the previously created ISAs from the DSS. + +#### Successful Concurrent ISA query check + +If any of the ISAs cannot be queried, the GET ISA DSS endpoint in **[interuss.f3411.dss_endpoints.GetISA](../../../../../requirements/interuss/f3411/dss_endpoints.md)** is likely not implemented correctly. + +### [Search Available ISAs test step](test_steps/search_isas.md) + +This test step searches the area in which the ISAs were concurrently created, and expects to find all of them. + +#### Successful ISAs search check + +The ISA search parameters are valid, as such the search should be successful. If the request is not successful, this check will fail per **[interuss.f3411.dss_endpoints.SearchISAs](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Correct ISAs returned by search check + +The ISA search parameters cover the resource ISA, as such the resource ISA that exists at the DSS should be returned by the search. If it is not returned, this check will fail. + +### [Delete ISAs concurrently test step](test_steps/delete_isa.md) + +This step attempts to concurrently delete the earlier created ISAs. + +#### ISAs deletion query success check + +If an ISA cannot be deleted, the PUT DSS endpoint in **[astm.f3411.v19.DSS0030,b](../../../../../requirements/astm/f3411/v19.md)** is likely not implemented correctly. + +### Access Deleted ISAs test step + +This step attempts to concurrently access the previously deleted ISAs from the DSS. + +#### ISAs not found check + +The ISA fetch request was about a deleted ISA, as such the DSS should reject it with a 404 HTTP code. If the DSS responds successfully to this request, or if it rejected with an incorrect HTTP code, this check will fail as per **[interuss.f3411.dss_endpoints.GetISA](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +### [Search Deleted ISAs test step](test_steps/search_isas.md) + +This step issues a search for active ISAs in the area of the previously deleted ISAs from the DSS. + +#### Successful ISAs search check + +The ISA search parameters are valid, as such the search should be successful. If the request is not successful, this check will fail as per **[interuss.f3411.dss_endpoints.SearchISAs](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### ISAs not returned by search check + +The ISA search area parameter cover the resource ISA, but it has been previously deleted, as such the ISA should not be returned by the search. If it is returned, this check will fail as per **[interuss.f3411.dss_endpoints.SearchISAs](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +## Cleanup + +The cleanup phase of this test scenario attempts to remove any created ISA if the test ended prematurely. + +### Successful ISA query check + +**[interuss.f3411.dss_endpoints.GetISA](../../../../../requirements/interuss/f3411/dss_endpoints.md)** requires the implementation of the DSS endpoint enabling retrieval of information about a specific ISA; if the individual ISA cannot be retrieved and the error isn't a 404, then this requirement isn't met. + +### Removed pre-existing ISA check + +If an ISA with the intended ID is still present in the DSS, it needs to be removed before exiting the test. If that ISA cannot be deleted, then the **[astm.f3411.v19.DSS0030,b](../../../../../requirements/astm/f3411/v19.md)** requirement to implement the ISA deletion endpoint might not be met. + +### Notified subscriber check + +When an ISA is deleted, subscribers must be notified. If a subscriber cannot be notified, that subscriber USS did not correctly implement "POST Identification Service Area" in **[astm.f3411.v19.NET0730](../../../../../requirements/astm/f3411/v19.md)**. diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/heavy_traffic_concurrent.py b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/heavy_traffic_concurrent.py new file mode 100644 index 0000000000..9eee0c4b76 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/heavy_traffic_concurrent.py @@ -0,0 +1,8 @@ +from monitoring.uss_qualifier.scenarios.astm.netrid.common.dss.heavy_traffic_concurrent import ( + HeavyTrafficConcurrent as CommonHeavyTrafficConcurrent, +) +from monitoring.uss_qualifier.scenarios.scenario import TestScenario + + +class HeavyTrafficConcurrent(TestScenario, CommonHeavyTrafficConcurrent): + pass diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/test_steps/delete_isa.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/test_steps/delete_isa.md index 65c65a9fc2..f4980de7ec 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/test_steps/delete_isa.md +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/test_steps/delete_isa.md @@ -18,3 +18,15 @@ Because the ISA version must be used in URLs, it must be URL-safe even though th ## ISA version matches check When the ISA is deleted, the DSS returns the version of the ISA in the response body. If this version does not match the version in the resource path, **[astm.f3411.v19.DSS0030,b](../../../../../../requirements/astm/f3411/v19.md)** was not implemented correctly and this check will fail. + +## ISA start time matches check + +If a start time between slightly before now and an arbitrary time in the future was specified, and the DSS response indicates an ISA start time different from this value, **[astm.f3411.v19.DSS0030,a](../../../../../../requirements/astm/f3411/v19.md)** is not implemented correctly and this check will fail. + +## ISA end time matches check + +The ISA creation request specified an exact end time, so the DSS should have created an ISA ending at exactly that time. If the DSS response indicates the ISA end time is not this value, **[astm.f3411.v19.DSS0030,a](../../../../../../requirements/astm/f3411/v19.md)** is not implemented correctly and this check will fail. + +## ISA URL matches check + +When the ISA is created, the DSS returns the URL of the ISA in the response body. If this URL does not match the URL requested, **[astm.f3411.v19.DSS0030,a](../../../../../../requirements/astm/f3411/v19.md)** is not implemented correctly and this check will fail. diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/test_steps/get_isa.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/test_steps/get_isa.md new file mode 100644 index 0000000000..f512223999 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/test_steps/get_isa.md @@ -0,0 +1,32 @@ +# Get ISA test step + +This page describes the content of a common test step where a request for an ISA by its ID should be successful. +See `ISAValidator` in [`isa_validator.py`](../../../common/dss/isa_validator.py). + +## ISA response format check + +While F3411-19 does not explicitly require the implementation of the ISA search endpoint, Annex A4 specifies the explicit format for this endpoint. If this format is not followed, this check will fail per **[interuss.f3411.dss_endpoints.GetISA](../../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +## ISA ID matches check + +The DSS returns the ID of the ISA in the response body. If this ID does not match the ID in the resource path, **[interuss.f3411.dss_endpoints.GetISA](../../../../../../requirements/interuss/f3411/dss_endpoints.md)** was not implemented correctly and this check will fail. + +## ISA version format check + +Because the ISA version must be used in URLs, it must be URL-safe even though the ASTM standards do not explicitly require this. If the indicated ISA version is not URL-safe, this check will fail. + +## ISA version matches check + +The DSS returns the version of the ISA in the response body. If this version does not match the version that was returned after creation, and that no modification of the ISA occurred in the meantime, **[interuss.f3411.dss_endpoints.GetISA](../../../../../../requirements/interuss/f3411/dss_endpoints.md)** was not implemented correctly and this check will fail. + +## ISA start time matches check + +The ISA creation request specified an exact start time slightly past now, so the DSS should have created an ISA starting at exactly that time. If the DSS response indicates the ISA start time is not this value, **[astm.f3411.v19.DSS0030,a](../../../../../../requirements/astm/f3411/v19.md)** is not implemented correctly and this check will fail. + +## ISA end time matches check + +The ISA creation request specified an exact end time, so the DSS should have created an ISA ending at exactly that time. If the DSS response indicates the ISA end time is not this value, **[astm.f3411.v19.DSS0030,a](../../../../../../requirements/astm/f3411/v19.md)** is not implemented correctly and this check will fail. + +## ISA URL matches check + +When the ISA is created, the DSS returns the URL of the ISA in the response body. If this URL does not match the URL requested, **[astm.f3411.v19.DSS0030,a](../../../../../../requirements/astm/f3411/v19.md)** is not implemented correctly and this check will fail. diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/test_steps/search_isas.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/test_steps/search_isas.md index 0103964533..9da9490fb5 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/test_steps/search_isas.md +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/test_steps/search_isas.md @@ -6,3 +6,27 @@ See `DSSWrapper.search_isa` in [`dss_wrapper.py`](../../../dss_wrapper.py). ## ISAs search response format check While F3411-19 does not explicitly require the implementation of the ISA search endpoint, Annex A4 specifies the explicit format for this endpoint. If this format is not followed, this check will fail per **[interuss.f3411.dss_endpoints.SearchISAs](../../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +## ISA ID matches check + +The DSS returns the ID of the ISA in the response body. If this ID does not match the ID in the resource path, **[interuss.f3411.dss_endpoints.GetISA](../../../../../../requirements/interuss/f3411/dss_endpoints.md)** was not implemented correctly and this check will fail. + +## ISA version format check + +Because the ISA version must be used in URLs, it must be URL-safe even though the ASTM standards do not explicitly require this. If the indicated ISA version is not URL-safe, this check will fail. + +## ISA version matches check + +The DSS returns the version of the ISA in the response body. If this version does not match the version that was returned after creation, and that no modification of the ISA occurred in the meantime, **[interuss.f3411.dss_endpoints.GetISA](../../../../../../requirements/interuss/f3411/dss_endpoints.md)** was not implemented correctly and this check will fail. + +## ISA start time matches check + +The ISA creation request specified an exact start time slightly past now, so the DSS should have created an ISA starting at exactly that time. If the DSS response indicates the ISA start time is not this value, **[astm.f3411.v19.DSS0030,a](../../../../../../requirements/astm/f3411/v19.md)** is not implemented correctly and this check will fail. + +## ISA end time matches check + +The ISA creation request specified an exact end time, so the DSS should have created an ISA ending at exactly that time. If the DSS response indicates the ISA end time is not this value, **[astm.f3411.v19.DSS0030,a](../../../../../../requirements/astm/f3411/v19.md)** is not implemented correctly and this check will fail. + +## ISA URL matches check + +When the ISA is created, the DSS returns the URL of the ISA in the response body. If this URL does not match the URL requested, **[astm.f3411.v19.DSS0030,a](../../../../../../requirements/astm/f3411/v19.md)** is not implemented correctly and this check will fail. diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/__init__.py b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/__init__.py index aed0f85b9d..a89cb054cb 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/__init__.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/__init__.py @@ -6,3 +6,4 @@ from .subscription_simple import SubscriptionSimple from .token_validation import TokenValidation from .crdb_access import CRDBAccess +from .heavy_traffic_concurrent import HeavyTrafficConcurrent diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/heavy_traffic_concurrent.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/heavy_traffic_concurrent.md new file mode 100644 index 0000000000..ff8ab8dccf --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/heavy_traffic_concurrent.md @@ -0,0 +1,120 @@ +# ASTM NetRID DSS: Concurrent Requests test scenario + +## Overview + +Create, query and delete ISAs on the DSS, concurrently. + +## Resources + +### dss + +[`DSSInstanceResource`](../../../../../resources/astm/f3411/dss.py) to be tested in this scenario. + +### id_generator + +[`IDGeneratorResource`](../../../../../resources/interuss/id_generator.py) providing the ISA ID for this scenario. + +### isa + +[`ServiceAreaResource`](../../../../../resources/netrid/service_area.py) describing the ISAs to be created. All created ISAs use the same parameters. + +## Setup test case + +### Ensure clean workspace test step + +This scenario creates ISA's with known IDs. This step ensures that no ISA with a known ID is present in the DSS before proceeding with the test. + +#### Successful ISA query check + +While F3411-22a does not explicitly require the implementation of a specific ISA retrieval endpoint, Annex A4 specifies the explicit format for this endpoint. If this format is not followed and the error isn't a 404, this check will fail per **[interuss.f3411.dss_endpoints.GetISA](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Removed pre-existing ISA check + +If an ISA with the intended ID is already present in the DSS, it needs to be removed before proceeding with the test. If that ISA cannot be deleted, then the **[astm.f3411.v22a.DSS0030,b](../../../../../requirements/astm/f3411/v22a.md)** requirement to implement the ISA deletion endpoint might not be met. + +#### Notified subscriber check + +When a pre-existing ISA needs to be deleted to ensure a clean workspace, any subscribers to ISAs in that area must be notified (as specified by the DSS). If a notification cannot be delivered, then the **[astm.f3411.v22a.NET0730](../../../../../requirements/astm/f3411/v22a.md)** requirement to implement the POST ISAs endpoint isn't met. + +## Concurrent Requests test case + +This test case will: + +1. Create ISAs concurrently +2. Query each ISA individually, but concurrently +3. Search for all ISAs in the area of the created ISAs (using a single request) +4. Delete the ISAs concurrently +5. Query each ISA individually, but concurrently +6. Search for all ISAs in the area of the deleted ISAs (using a single request) + +### [Create ISA concurrently test step](test_steps/put_isa.md) + +This step attempts to concurrently create multiple ISAs, as specified in this scenario's resource, at the configured DSS. + +#### Concurrent ISAs creation check + +If any of the concurrent ISA creation requests fail or leads to the creation of an incorrect ISA, the PUT DSS endpoint in **[astm.f3411.v22a.DSS0030,a](../../../../../requirements/astm/f3411/v22a.md)** is likely not implemented correctly. + +### [Get ISAs concurrently test step](test_steps/get_isa.md) + +This step attempts to concurrently retrieve the previously created ISAs from the DSS. + +#### Successful Concurrent ISA query check + +If any of the ISAs cannot be queried, the GET ISA DSS endpoint in **[interuss.f3411.dss_endpoints.GetISA](../../../../../requirements/interuss/f3411/dss_endpoints.md)** is likely not implemented correctly. + +### [Search Available ISAs test step](test_steps/search_isas.md) + +This test step searches the area in which the ISAs were concurrently created, and expects to find all of them. + +#### Successful ISAs search check + +The ISA search parameters are valid, as such the search should be successful. If the request is not successful, this check will fail per **[interuss.f3411.dss_endpoints.SearchISAs](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Correct ISAs returned by search check + +The ISA search parameters cover the resource ISA, as such the resource ISA that exists at the DSS should be returned by the search. If it is not returned, this check will fail. + +### [Delete ISAs concurrently test step](test_steps/delete_isa.md) + +This step attempts to concurrently delete the earlier created ISAs. + +#### ISAs deletion query success check + +If an ISA cannot be deleted, the PUT DSS endpoint in **[astm.f3411.v22a.DSS0030,b](../../../../../requirements/astm/f3411/v22a.md)** is likely not implemented correctly. + +### Access Deleted ISAs test step + +This step attempts to concurrently access the previously deleted ISAs from the DSS. + +#### ISAs not found check + +The ISA fetch request was about a deleted ISA, as such the DSS should reject it with a 404 HTTP code. If the DSS responds successfully to this request, or if it rejected with an incorrect HTTP code, this check will fail as per **[interuss.f3411.dss_endpoints.GetISA](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +### [Search Deleted ISAs test step](test_steps/search_isas.md) + +This step issues a search for active ISAs in the area of the previously deleted ISAs from the DSS. + +#### Successful ISAs search check + +The ISA search parameters are valid, as such the search should be successful. If the request is not successful, this check will fail as per **[interuss.f3411.dss_endpoints.SearchISAs](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### ISAs not returned by search check + +The ISA search area parameter cover the resource ISA, but it has been previously deleted, as such the ISA should not be returned by the search. If it is returned, this check will fail as per **[interuss.f3411.dss_endpoints.SearchISAs](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +## Cleanup + +The cleanup phase of this test scenario attempts to remove any created ISA if the test ended prematurely. + +### Successful ISA query check + +**[interuss.f3411.dss_endpoints.GetISA](../../../../../requirements/interuss/f3411/dss_endpoints.md)** requires the implementation of the DSS endpoint enabling retrieval of information about a specific ISA; if the individual ISA cannot be retrieved and the error isn't a 404, then this requirement isn't met. + +### Removed pre-existing ISA check + +If an ISA with the intended ID is still present in the DSS, it needs to be removed before exiting the test. If that ISA cannot be deleted, then the **[astm.f3411.v22a.DSS0030,b](../../../../../requirements/astm/f3411/v22a.md)** requirement to implement the ISA deletion endpoint might not be met. + +### Notified subscriber check + +When an ISA is deleted, subscribers must be notified. If a subscriber cannot be notified, that subscriber USS did not correctly implement "POST Identification Service Area" in **[astm.f3411.v22a.NET0730](../../../../../requirements/astm/f3411/v22a.md)**. diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/heavy_traffic_concurrent.py b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/heavy_traffic_concurrent.py new file mode 100644 index 0000000000..9eee0c4b76 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/heavy_traffic_concurrent.py @@ -0,0 +1,8 @@ +from monitoring.uss_qualifier.scenarios.astm.netrid.common.dss.heavy_traffic_concurrent import ( + HeavyTrafficConcurrent as CommonHeavyTrafficConcurrent, +) +from monitoring.uss_qualifier.scenarios.scenario import TestScenario + + +class HeavyTrafficConcurrent(TestScenario, CommonHeavyTrafficConcurrent): + pass diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/test_steps/delete_isa.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/test_steps/delete_isa.md index 74b6f1927f..fa77a2f9ed 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/test_steps/delete_isa.md +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/test_steps/delete_isa.md @@ -18,3 +18,15 @@ Because the ISA version must be used in URLs, it must be URL-safe even though th ## ISA version matches check When the ISA is deleted, the DSS returns the version of the ISA in the response body. If this version does not match the version in the resource path, **[astm.f3411.v22a.DSS0030,b](../../../../../../requirements/astm/f3411/v22a.md)** was not implemented correctly and this check will fail. + +## ISA start time matches check + +If a start time between slightly before now and an arbitrary time in the future was specified, and the DSS response indicates an ISA start time different from this value, **[astm.f3411.v22a.DSS0030,a](../../../../../../requirements/astm/f3411/v22a.md)** is not implemented correctly and this check will fail. + +## ISA end time matches check + +The ISA creation request specified an exact end time, so the DSS should have created an ISA ending at exactly that time. If the DSS response indicates the ISA end time is not this value, **[astm.f3411.v22a.DSS0030,a](../../../../../../requirements/astm/f3411/v22a.md)** is not implemented correctly and this check will fail. + +## ISA URL matches check + +When the ISA is created, the DSS returns the URL of the ISA in the response body. If this URL does not match the URL requested, **[astm.f3411.v22a.DSS0030,a](../../../../../../requirements/astm/f3411/v22a.md)** is not implemented correctly and this check will fail. diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/test_steps/get_isa.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/test_steps/get_isa.md new file mode 100644 index 0000000000..754a66e935 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/test_steps/get_isa.md @@ -0,0 +1,32 @@ +# Get ISA test step + +This page describes the content of a common test step where a request for an ISA by its ID should be successful. +See `ISAValidator` in [`isa_validator.py`](../../../common/dss/isa_validator.py). + +## ISA response format check + +While F3411-22a does not explicitly require the implementation of the ISA search endpoint, Annex A4 specifies the explicit format for this endpoint. If this format is not followed, this check will fail per **[interuss.f3411.dss_endpoints.GetISA](../../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +## ISA ID matches check + +The DSS returns the ID of the ISA in the response body. If this ID does not match the ID in the resource path, **[interuss.f3411.dss_endpoints.GetISA](../../../../../../requirements/interuss/f3411/dss_endpoints.md)** was not implemented correctly and this check will fail. + +## ISA version format check + +Because the ISA version must be used in URLs, it must be URL-safe even though the ASTM standards do not explicitly require this. If the indicated ISA version is not URL-safe, this check will fail. + +## ISA version matches check + +The DSS returns the version of the ISA in the response body. If this version does not match the version that was returned after creation, and that no modification of the ISA occurred in the meantime, **[interuss.f3411.dss_endpoints.GetISA](../../../../../../requirements/interuss/f3411/dss_endpoints.md)** was not implemented correctly and this check will fail. + +## ISA start time matches check + +The ISA creation request specified an exact start time slightly past now, so the DSS should have created an ISA starting at exactly that time. If the DSS response indicates the ISA start time is not this value, **[astm.f3411.v22a.DSS0030,a](../../../../../../requirements/astm/f3411/v22a.md)** is not implemented correctly and this check will fail. + +## ISA end time matches check + +The ISA creation request specified an exact end time, so the DSS should have created an ISA ending at exactly that time. If the DSS response indicates the ISA end time is not this value, **[astm.f3411.v22a.DSS0030,a](../../../../../../requirements/astm/f3411/v22a.md)** is not implemented correctly and this check will fail. + +## ISA URL matches check + +When the ISA is created, the DSS returns the URL of the ISA in the response body. If this URL does not match the URL requested, **[astm.f3411.v22a.DSS0030,a](../../../../../../requirements/astm/f3411/v22a.md)** is not implemented correctly and this check will fail. diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/test_steps/search_isas.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/test_steps/search_isas.md index 5f50e1b067..7b6c073692 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/test_steps/search_isas.md +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/test_steps/search_isas.md @@ -6,3 +6,27 @@ See `DSSWrapper.search_isa` in [`dss_wrapper.py`](../../../dss_wrapper.py). ## ISAs search response format check While F3411-22a does not explicitly require the implementation of the ISA search endpoint, Annex A4 specifies the explicit format for this endpoint. If this format is not followed, this check will fail per **[interuss.f3411.dss_endpoints.SearchISAs](../../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +## ISA ID matches check + +The DSS returns the ID of the ISA in the response body. If this ID does not match the ID in the resource path, **[interuss.f3411.dss_endpoints.GetISA](../../../../../../requirements/interuss/f3411/dss_endpoints.md)** was not implemented correctly and this check will fail. + +## ISA version format check + +Because the ISA version must be used in URLs, it must be URL-safe even though the ASTM standards do not explicitly require this. If the indicated ISA version is not URL-safe, this check will fail. + +## ISA version matches check + +The DSS returns the version of the ISA in the response body. If this version does not match the version that was returned after creation, and that no modification of the ISA occurred in the meantime, **[interuss.f3411.dss_endpoints.GetISA](../../../../../../requirements/interuss/f3411/dss_endpoints.md)** was not implemented correctly and this check will fail. + +## ISA start time matches check + +The ISA creation request specified an exact start time slightly past now, so the DSS should have created an ISA starting at exactly that time. If the DSS response indicates the ISA start time is not this value, **[astm.f3411.v22a.DSS0030,a](../../../../../../requirements/astm/f3411/v22a.md)** is not implemented correctly and this check will fail. + +## ISA end time matches check + +The ISA creation request specified an exact end time, so the DSS should have created an ISA ending at exactly that time. If the DSS response indicates the ISA end time is not this value, **[astm.f3411.v22a.DSS0030,a](../../../../../../requirements/astm/f3411/v22a.md)** is not implemented correctly and this check will fail. + +## ISA URL matches check + +When the ISA is created, the DSS returns the URL of the ISA in the response body. If this URL does not match the URL requested, **[astm.f3411.v22a.DSS0030,a](../../../../../../requirements/astm/f3411/v22a.md)** is not implemented correctly and this check will fail. diff --git a/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md b/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md index 3e5abd0c49..600dfd8a55 100644 --- a/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md +++ b/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md @@ -24,12 +24,12 @@ astm
.f3411
.v19
DSS0030,a Implemented - ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,b Implemented - ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,c @@ -324,7 +324,7 @@ NET0730 Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation interuss
.automated_testing
.rid
.injection
@@ -362,11 +362,11 @@ interuss
.f3411
.dss_endpoints
GetISA Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation SearchISAs Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Token Validation
ASTM NetRID nominal behavior + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Token Validation
ASTM NetRID nominal behavior diff --git a/monitoring/uss_qualifier/suites/astm/netrid/f3411_19/dss_probing.md b/monitoring/uss_qualifier/suites/astm/netrid/f3411_19/dss_probing.md index bd165eb681..f56e865f7a 100644 --- a/monitoring/uss_qualifier/suites/astm/netrid/f3411_19/dss_probing.md +++ b/monitoring/uss_qualifier/suites/astm/netrid/f3411_19/dss_probing.md @@ -13,6 +13,7 @@ 7. Scenario: [ASTM F3411-19 NetRID DSS interoperability](../../../../scenarios/astm/netrid/v19/dss_interoperability.md) ([`scenarios.astm.netrid.v19.DSSInteroperability`](../../../../scenarios/astm/netrid/v19/dss_interoperability.py)) 8. Scenario: [ASTM NetRID DSS: Token Validation](../../../../scenarios/astm/netrid/v19/dss/token_validation.md) ([`scenarios.astm.netrid.v19.dss.TokenValidation`](../../../../scenarios/astm/netrid/v19/dss/token_validation.py)) 9. Scenario: [ASTM NetRID DSS: Direct CRDB access](../../../../scenarios/astm/netrid/v19/dss/crdb_access.md) ([`scenarios.astm.netrid.v19.dss.CRDBAccess`](../../../../scenarios/astm/netrid/v19/dss/crdb_access.py)) +10. Scenario: [ASTM NetRID DSS: Concurrent Requests](../../../../scenarios/astm/netrid/v19/dss/heavy_traffic_concurrent.md) ([`scenarios.astm.netrid.v19.dss.HeavyTrafficConcurrent`](../../../../scenarios/astm/netrid/v19/dss/heavy_traffic_concurrent.py)) ## [Checked requirements](../../../README.md#checked-requirements) @@ -27,12 +28,12 @@ astm
.f3411
.v19
DSS0030,a Implemented - ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,b Implemented - ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,c @@ -207,17 +208,17 @@ NET0730 Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation interuss
.f3411
.dss_endpoints
GetISA Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation SearchISAs Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Token Validation diff --git a/monitoring/uss_qualifier/suites/astm/netrid/f3411_19/dss_probing.yaml b/monitoring/uss_qualifier/suites/astm/netrid/f3411_19/dss_probing.yaml index 85f476277f..89fb62c33a 100644 --- a/monitoring/uss_qualifier/suites/astm/netrid/f3411_19/dss_probing.yaml +++ b/monitoring/uss_qualifier/suites/astm/netrid/f3411_19/dss_probing.yaml @@ -62,3 +62,9 @@ actions: scenario_type: scenarios.astm.netrid.v19.dss.CRDBAccess resources: {} on_failure: Continue + - test_scenario: + scenario_type: scenarios.astm.netrid.v19.dss.HeavyTrafficConcurrent + resources: + dss: dss + id_generator: id_generator + isa: isa diff --git a/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.md b/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.md index 2ee9ca9209..a97c1e8458 100644 --- a/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.md +++ b/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.md @@ -29,12 +29,12 @@ DSS0030,a Implemented - ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,b Implemented - ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,c @@ -449,7 +449,7 @@ NET0730 Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation interuss
.automated_testing
.rid
.injection
@@ -487,11 +487,11 @@ interuss
.f3411
.dss_endpoints
GetISA Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation SearchISAs Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Token Validation
ASTM NetRID nominal behavior + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Token Validation
ASTM NetRID nominal behavior diff --git a/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a/dss_probing.md b/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a/dss_probing.md index a1a4b7002d..2755da32c0 100644 --- a/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a/dss_probing.md +++ b/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a/dss_probing.md @@ -13,6 +13,7 @@ 7. Scenario: [ASTM F3411-22a NetRID DSS interoperability](../../../../scenarios/astm/netrid/v22a/dss_interoperability.md) ([`scenarios.astm.netrid.v22a.DSSInteroperability`](../../../../scenarios/astm/netrid/v22a/dss_interoperability.py)) 8. Scenario: [ASTM NetRID DSS: Token Validation](../../../../scenarios/astm/netrid/v22a/dss/token_validation.md) ([`scenarios.astm.netrid.v22a.dss.TokenValidation`](../../../../scenarios/astm/netrid/v22a/dss/token_validation.py)) 9. Scenario: [ASTM NetRID DSS: Direct CRDB access](../../../../scenarios/astm/netrid/v22a/dss/crdb_access.md) ([`scenarios.astm.netrid.v22a.dss.CRDBAccess`](../../../../scenarios/astm/netrid/v22a/dss/crdb_access.py)) +10. Scenario: [ASTM NetRID DSS: Concurrent Requests](../../../../scenarios/astm/netrid/v22a/dss/heavy_traffic_concurrent.md) ([`scenarios.astm.netrid.v22a.dss.HeavyTrafficConcurrent`](../../../../scenarios/astm/netrid/v22a/dss/heavy_traffic_concurrent.py)) ## [Checked requirements](../../../README.md#checked-requirements) @@ -32,12 +33,12 @@ DSS0030,a Implemented - ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,b Implemented - ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,c @@ -217,17 +218,17 @@ NET0730 Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation interuss
.f3411
.dss_endpoints
GetISA Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation SearchISAs Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Token Validation diff --git a/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a/dss_probing.yaml b/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a/dss_probing.yaml index 1dbaf5aca2..5fa3163039 100644 --- a/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a/dss_probing.yaml +++ b/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a/dss_probing.yaml @@ -62,3 +62,9 @@ actions: scenario_type: scenarios.astm.netrid.v22a.dss.CRDBAccess resources: {} on_failure: Continue + - test_scenario: + scenario_type: scenarios.astm.netrid.v22a.dss.HeavyTrafficConcurrent + resources: + dss: dss + id_generator: id_generator + isa: isa diff --git a/monitoring/uss_qualifier/suites/interuss/dss/all_tests.md b/monitoring/uss_qualifier/suites/interuss/dss/all_tests.md index cd5267e269..63930021a7 100644 --- a/monitoring/uss_qualifier/suites/interuss/dss/all_tests.md +++ b/monitoring/uss_qualifier/suites/interuss/dss/all_tests.md @@ -22,12 +22,12 @@ astm
.f3411
.v19
DSS0030,a Implemented - ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,b Implemented - ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,c @@ -202,7 +202,7 @@ NET0730 Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation astm
.f3411
.v22a
@@ -213,12 +213,12 @@ DSS0030,a Implemented - ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,b Implemented - ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,c @@ -398,17 +398,17 @@ NET0730 Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation interuss
.f3411
.dss_endpoints
GetISA Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation SearchISAs Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Token Validation diff --git a/monitoring/uss_qualifier/suites/uspace/network_identification.md b/monitoring/uss_qualifier/suites/uspace/network_identification.md index a216f030e9..a4d7f2caae 100644 --- a/monitoring/uss_qualifier/suites/uspace/network_identification.md +++ b/monitoring/uss_qualifier/suites/uspace/network_identification.md @@ -24,12 +24,12 @@ DSS0030,a Implemented - ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,b Implemented - ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,c @@ -444,7 +444,7 @@ NET0730 Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation interuss
.automated_testing
.rid
.injection
@@ -482,11 +482,11 @@ interuss
.f3411
.dss_endpoints
GetISA Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation SearchISAs Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Token Validation
ASTM NetRID nominal behavior + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Token Validation
ASTM NetRID nominal behavior diff --git a/monitoring/uss_qualifier/suites/uspace/required_services.md b/monitoring/uss_qualifier/suites/uspace/required_services.md index 964c6d4576..2c18eebcb1 100644 --- a/monitoring/uss_qualifier/suites/uspace/required_services.md +++ b/monitoring/uss_qualifier/suites/uspace/required_services.md @@ -26,12 +26,12 @@ DSS0030,a Implemented - ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,b Implemented - ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation DSS0030,c @@ -446,7 +446,7 @@ NET0730 Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation astm
.f3548
.v21
@@ -621,12 +621,12 @@ interuss
.f3411
.dss_endpoints
GetISA Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Token Validation SearchISAs Implemented - ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Token Validation
ASTM NetRID nominal behavior + ASTM NetRID DSS: Concurrent Requests
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Token Validation
ASTM NetRID nominal behavior interuss
.f3548
.notification_requirements