diff --git a/monitoring/prober/infrastructure.py b/monitoring/prober/infrastructure.py index c707ca00e4..8e644f3400 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: 368 +# Next code: 369 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/configurations/dev/library/resources.yaml b/monitoring/uss_qualifier/configurations/dev/library/resources.yaml index 3fd555c5aa..c0d82dd4b2 100644 --- a/monitoring/uss_qualifier/configurations/dev/library/resources.yaml +++ b/monitoring/uss_qualifier/configurations/dev/library/resources.yaml @@ -46,6 +46,21 @@ net_rid: reference_time: '2023-01-10T00:00:00.123456+00:00' time_start: '2023-01-10T00:00:01.123456+00:00' time_end: '2023-01-10T01:00:01.123456+00:00' + problematically_big_area: # A huge (as in "too big") area for checks around area sizes + $content_schema: monitoring/uss_qualifier/resources/definitions/ResourceDeclaration.json + resource_type: resources.VerticesResource + specification: + vertices: + - lat: -23 + lng: 130 + - lat: -24 + lng: 130 + - lat: -24 + lng: 132 + - lat: -23 + lng: 132 + + net_rid_sims: adjacent_circular_flights_data: diff --git a/monitoring/uss_qualifier/configurations/dev/netrid_v19.yaml b/monitoring/uss_qualifier/configurations/dev/netrid_v19.yaml index 7e48171215..66169ae52f 100644 --- a/monitoring/uss_qualifier/configurations/dev/netrid_v19.yaml +++ b/monitoring/uss_qualifier/configurations/dev/netrid_v19.yaml @@ -15,6 +15,7 @@ v1: dss_instances: netrid_dss_instances_v19 id_generator: id_generator service_area: service_area + problematically_big_area: problematically_big_area artifacts: report: report_path: output/report_netrid_v19.json diff --git a/monitoring/uss_qualifier/configurations/dev/netrid_v22a.yaml b/monitoring/uss_qualifier/configurations/dev/netrid_v22a.yaml index 0609b657b4..21ae1bfc46 100644 --- a/monitoring/uss_qualifier/configurations/dev/netrid_v22a.yaml +++ b/monitoring/uss_qualifier/configurations/dev/netrid_v22a.yaml @@ -15,6 +15,7 @@ v1: dss_instances: netrid_dss_instances_v22a id_generator: id_generator service_area: service_area + problematically_big_area: problematically_big_area artifacts: report: report_path: output/report_netrid_v22a.json diff --git a/monitoring/uss_qualifier/resources/__init__.py b/monitoring/uss_qualifier/resources/__init__.py index e69de29bb2..e9c7a3bcd9 100644 --- a/monitoring/uss_qualifier/resources/__init__.py +++ b/monitoring/uss_qualifier/resources/__init__.py @@ -0,0 +1 @@ +from .vertices import VerticesResource diff --git a/monitoring/uss_qualifier/resources/vertices.py b/monitoring/uss_qualifier/resources/vertices.py new file mode 100644 index 0000000000..075456cc4c --- /dev/null +++ b/monitoring/uss_qualifier/resources/vertices.py @@ -0,0 +1,21 @@ +from typing import List + +from implicitdict import ImplicitDict + +from monitoring.monitorlib.geo import LatLngPoint +from monitoring.uss_qualifier.resources.resource import Resource + + +class VerticesSpecification(ImplicitDict): + """Specifies a list of vertices representing a 2D area. + Useful for passing arbitrary areas to test scenarios.""" + + vertices: List[LatLngPoint] + """Represents a 2D area""" + + +class VerticesResource(Resource[VerticesSpecification]): + specification: VerticesSpecification + + def __init__(self, specification: VerticesSpecification): + self.specification = specification 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 24f43a1a26..dd347acddc 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 @@ -11,27 +11,24 @@ 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.resources import VerticesResource from monitoring.uss_qualifier.scenarios.astm.netrid.dss_wrapper import DSSWrapper from monitoring.uss_qualifier.scenarios.scenario import GenericTestScenario -HUGE_VERTICES: List[s2sphere.LatLng] = [ - s2sphere.LatLng.from_degrees(lng=130, lat=-23), - s2sphere.LatLng.from_degrees(lng=130, lat=-24), - s2sphere.LatLng.from_degrees(lng=132, lat=-24), - s2sphere.LatLng.from_degrees(lng=132, lat=-23), -] - class ISASimple(GenericTestScenario): """Based on prober/rid/v2/test_isa_simple.py from the legacy prober tool.""" ISA_TYPE = register_resource_type(348, "ISA") + _huge_are: List[s2sphere.LatLng] + def __init__( self, dss: DSSInstanceResource, id_generator: IDGeneratorResource, isa: ServiceAreaResource, + problematically_big_area: VerticesResource, ): super().__init__() self._dss = ( @@ -46,6 +43,9 @@ def __init__( 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] + self._huge_area = [ + v.as_s2sphere() for v in problematically_big_area.specification.vertices + ] def run(self): self.begin_test_scenario() @@ -362,7 +362,7 @@ def _search_huge_area_step(): _ = self._dss_wrapper.search_isas_expect_response_code( check, expected_error_codes={413}, - area=HUGE_VERTICES, + area=self._huge_area, ) self.end_test_step() 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 new file mode 100644 index 0000000000..3616dfec5c --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/isa_validation.py @@ -0,0 +1,329 @@ +import copy +import datetime +from typing import Optional, List, Dict, Any + +import arrow +import s2sphere +from uas_standards.astm.f3411 import v19, v22a + +from monitoring.monitorlib.fetch import query_and_describe +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 import VerticesResource +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 import utils +from monitoring.uss_qualifier.scenarios.astm.netrid.dss_wrapper import DSSWrapper +from monitoring.uss_qualifier.scenarios.scenario import GenericTestScenario + + +class ISAValidation(GenericTestScenario): + """Based on prober/rid/v2/test_isa_validation.py from the legacy prober tool.""" + + ISA_TYPE = register_resource_type(368, "ISA") + + _huge_are: List[s2sphere.LatLng] + + create_isa_path: str + + write_scope: str + + def __init__( + self, + dss: DSSInstanceResource, + id_generator: IDGeneratorResource, + isa: ServiceAreaResource, + problematically_big_area: VerticesResource, + ): + 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_id = id_generator.id_factory.make_id(ISAValidation.ISA_TYPE) + self._isa_version: Optional[str] = None + 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] + + self._huge_area = [ + v.as_s2sphere() for v in problematically_big_area.specification.vertices + ] + + if self._dss.rid_version == RIDVersion.f3411_19: + self.create_isa_path = v19.api.OPERATIONS[ + v19.api.OperationID.CreateSubscription + ].path + self.write_scope = v19.constants.Scope.Write + elif self._dss.rid_version == RIDVersion.f3411_22a: + self.create_isa_path = v22a.api.OPERATIONS[ + v22a.api.OperationID.CreateSubscription + ].path + self.write_scope = v22a.constants.Scope.ServiceProvider + else: + ValueError(f"Unsupported RID version '{self._dss.rid_version}'") + + def run(self): + self.begin_test_scenario() + + self._setup_case() + + self.begin_test_case("ISA Validation") + self.begin_test_step("ISA Validation") + + (create_isa_url, json_body) = self._isa_huge_area_check() + + self._isa_empty_vertices_check() + self._isa_start_time_in_past() + self._isa_start_time_after_time_end() + self._isa_vertices_are_valid() + + self._isa_missing_outline(create_isa_url, json_body) + self._isa_missing_volume(create_isa_url, json_body) + + self.end_test_step() + self.end_test_case() + self.end_test_scenario() + + def _setup_case(self): + self.begin_test_case("Setup") + + def _ensure_clean_workspace_step(): + self.begin_test_step("Ensure clean workspace") + + self._delete_isa_if_exists() + + self.end_test_step() + + _ensure_clean_workspace_step() + + self.end_test_case() + + def _delete_isa_if_exists(self): + utils.delete_isa_if_exists( + self, + isa_id=self._isa_id, + rid_version=self._dss.rid_version, + session=self._dss.client, + server_id=self._dss_wrapper.participant_id, + ) + + def _isa_huge_area_check(self) -> (str, Dict[str, Any]): + """Returns the request's URL and json payload for subsequently re-using it. + + It is of the following form (note that v19 and v22a have slight differences): + + "extents": { + "volume": { + "outline_polygon": { + "vertices": [], + }, + "altitude_lower": 20.0, + "altitude_upper": 400.0, + }, + "time_start": , + "time_end": , + }, + "uss_base_url": , + """ + + with self.check("ISA huge area", [self._dss_wrapper.participant_id]) as check: + q = self._dss_wrapper.put_isa_expect_response_code( + check=check, + expected_error_codes={400}, + area_vertices=self._huge_area, + alt_lo=self._isa.altitude_min, + alt_hi=self._isa.altitude_max, + start_time=self._isa_start_time, + end_time=self._isa_end_time, + uss_base_url=self._isa.base_url, + isa_id=self._isa_id, + isa_version=self._isa_version, + ) + + return q.dss_query.query.request.url, q.dss_query.query.request.json + + def _isa_empty_vertices_check(self): + + with self.check( + "ISA empty vertices", [self._dss_wrapper.participant_id] + ) as check: + self._dss_wrapper.put_isa_expect_response_code( + check=check, + expected_error_codes={400}, + area_vertices=[], + alt_lo=self._isa.altitude_min, + alt_hi=self._isa.altitude_max, + start_time=self._isa_start_time, + end_time=self._isa_end_time, + uss_base_url=self._isa.base_url, + isa_id=self._isa_id, + isa_version=self._isa_version, + ) + + def _isa_start_time_in_past(self): + time_start = datetime.datetime.utcnow() - datetime.timedelta(minutes=10) + time_end = time_start + datetime.timedelta(minutes=60) + + with self.check( + "ISA start time in the past", [self._dss_wrapper.participant_id] + ) as check: + self._dss_wrapper.put_isa_expect_response_code( + check=check, + expected_error_codes={400}, + area_vertices=self._isa_area, + alt_lo=self._isa.altitude_min, + alt_hi=self._isa.altitude_max, + start_time=time_start, + end_time=time_end, + uss_base_url=self._isa.base_url, + isa_id=self._isa_id, + isa_version=self._isa_version, + ) + + def _isa_start_time_after_time_end(self): + with self.check( + "ISA start time after end time", [self._dss_wrapper.participant_id] + ) as check: + self._dss_wrapper.put_isa_expect_response_code( + check=check, + expected_error_codes={400}, + area_vertices=self._isa_area, + alt_lo=self._isa.altitude_min, + alt_hi=self._isa.altitude_max, + start_time=self._isa.time_end.datetime, + end_time=self._isa.time_start.datetime, + uss_base_url=self._isa.base_url, + isa_id=self._isa_id, + isa_version=self._isa_version, + ) + + def _isa_vertices_are_valid(self): + INVALID_VERTICES: List[s2sphere.LatLng] = [ + s2sphere.LatLng.from_degrees(lat=130, lng=-23), + s2sphere.LatLng.from_degrees(lat=130, lng=-24), + s2sphere.LatLng.from_degrees(lat=132, lng=-24), + s2sphere.LatLng.from_degrees(lat=132, lng=-23), + ] + + with self.check( + "ISA vertices are valid", [self._dss_wrapper.participant_id] + ) as check: + self._dss_wrapper.put_isa_expect_response_code( + check=check, + expected_error_codes={400}, + area_vertices=INVALID_VERTICES, + alt_lo=self._isa.altitude_min, + alt_hi=self._isa.altitude_max, + start_time=self._isa.time_start.datetime, + end_time=self._isa.time_end.datetime, + uss_base_url=self._isa.base_url, + isa_id=self._isa_id, + isa_version=self._isa_version, + ) + + def _isa_missing_outline(self, create_isa_url: str, json_body: Dict[str, Any]): + payload = copy.deepcopy(json_body) + if self._dss.rid_version == RIDVersion.f3411_19: + del payload["extents"]["spatial_volume"]["footprint"] + elif self._dss.rid_version == RIDVersion.f3411_22a: + del payload["extents"]["volume"]["outline_polygon"] + + with self.check( + "ISA missing outline", [self._dss_wrapper.participant_id] + ) as check: + q = query_and_describe( + client=self._dss.client, + verb="PUT", + url=create_isa_url, + scope=self.write_scope, + json=payload, + ) + if self._dss.rid_version == RIDVersion.f3411_19: + rid_query = ChangedISA(v19_query=q) + elif self._dss.rid_version == RIDVersion.f3411_22a: + rid_query = ChangedISA(v22a_query=q) + else: + raise ValueError(f"Unknown RID version: {self._dss.rid_version}") + + self._dss_wrapper._handle_query_result( + check=check, + q=rid_query, + fail_msg="ISA Creation with missing outline has unexpected result code", + required_status_code={400}, + severity=Severity.High, + ) + + def _isa_missing_volume(self, create_isa_url: str, json_body: Dict[str, Any]): + payload = copy.deepcopy(json_body) + if self._dss.rid_version == RIDVersion.f3411_19: + del payload["extents"]["spatial_volume"] + elif self._dss.rid_version == RIDVersion.f3411_22a: + del payload["extents"]["volume"] + + with self.check( + "ISA missing volume", [self._dss_wrapper.participant_id] + ) as check: + q = query_and_describe( + client=self._dss.client, + verb="PUT", + url=create_isa_url, + scope=self.write_scope, + json=payload, + ) + if self._dss.rid_version == RIDVersion.f3411_19: + rid_query = ChangedISA(v19_query=q) + elif self._dss.rid_version == RIDVersion.f3411_22a: + rid_query = ChangedISA(v22a_query=q) + else: + raise ValueError(f"Unknown RID version: {self._dss.rid_version}") + + self._dss_wrapper._handle_query_result( + check=check, + q=rid_query, + fail_msg="ISA Creation with missing outline has unexpected result code", + required_status_code={400}, + severity=Severity.High, + ) + + def _isa_missing_extents(self, create_isa_url: str, json_body: Dict[str, Any]): + payload = copy.deepcopy(json_body) + del payload["extents"] + + with self.check( + "ISA missing extents", [self._dss_wrapper.participant_id] + ) as check: + q = query_and_describe( + client=self._dss.client, + verb="PUT", + url=create_isa_url, + scope=self.write_scope, + json=payload, + ) + if self._dss.rid_version == RIDVersion.f3411_19: + rid_query = ChangedISA(v19_query=q) + elif self._dss.rid_version == RIDVersion.f3411_22a: + rid_query = ChangedISA(v22a_query=q) + else: + raise ValueError(f"Unknown RID version: {self._dss.rid_version}") + + self._dss_wrapper._handle_query_result( + check=check, + q=rid_query, + fail_msg="ISA Creation with missing outline has unexpected result code", + required_status_code={400}, + severity=Severity.High, + ) + + def cleanup(self): + self.begin_cleanup() + + self._delete_isa_if_exists() + + 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 new file mode 100644 index 0000000000..c108b93f96 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/utils.py @@ -0,0 +1,62 @@ +from typing import Optional + +from monitoring.monitorlib.fetch import rid as fetch +from monitoring.monitorlib.mutate import rid as mutate +from monitoring.monitorlib.infrastructure import UTMClientSession +from monitoring.monitorlib.rid import RIDVersion +from monitoring.uss_qualifier.common_data_definitions import Severity +from monitoring.uss_qualifier.scenarios.scenario import GenericTestScenario + + +def delete_isa_if_exists( + scenario: GenericTestScenario, + isa_id: str, + rid_version: RIDVersion, + session: UTMClientSession, + server_id: Optional[str] = None, +): + fetched = fetch.isa( + isa_id, + rid_version=rid_version, + session=session, + server_id=server_id, + ) + scenario.record_query(fetched.query) + with scenario.check("Successful ISA query", [server_id]) as check: + if not fetched.success and fetched.status_code != 404: + check.record_failed( + "ISA information could not be retrieved", + Severity.High, + f"{server_id} DSS instance returned {fetched.status_code} when queried for ISA {isa_id}", + query_timestamps=[fetched.query.request.timestamp], + ) + + if fetched.success: + deleted = mutate.delete_isa( + isa_id, + fetched.isa.version, + rid_version, + session, + server_id=server_id, + ) + scenario.record_query(deleted.dss_query.query) + for subscriber_id, notification in deleted.notifications.items(): + scenario.record_query(notification.query) + with scenario.check("Removed pre-existing ISA", [server_id]) as check: + if not deleted.dss_query.success: + check.record_failed( + "Could not delete pre-existing ISA", + Severity.High, + f"Attempting to delete ISA {isa_id} from the {server_id} DSS returned error {deleted.dss_query.status_code}", + query_timestamps=[deleted.dss_query.query.request.timestamp], + ) + for subscriber_url, notification in deleted.notifications.items(): + with scenario.check("Notified subscriber", [subscriber_url]) as check: + # TODO: Find a better way to identify a subscriber who couldn't be notified + if not notification.success: + check.record_failed( + "Could not notify ISA subscriber", + Severity.Medium, + f"Attempting to notify subscriber for ISA {isa_id} at {subscriber_url} resulted in {notification.status_code}", + query_timestamps=[notification.query.request.timestamp], + ) diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/dss_wrapper.py b/monitoring/uss_qualifier/scenarios/astm/netrid/dss_wrapper.py index dd8b8cbb0b..6c5dd91570 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/dss_wrapper.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/dss_wrapper.py @@ -1,10 +1,17 @@ import datetime import s2sphere -from typing import Optional, List, Set +from typing import Optional, List, Set, Dict, Any + +from implicitdict import StringBasedDateTime from monitoring.monitorlib import schema_validation -from monitoring.monitorlib.fetch import QueryError +from monitoring.monitorlib.fetch import ( + QueryError, + Query, + RequestDescription, + ResponseDescription, +) from monitoring.monitorlib.fetch.rid import ( FetchedSubscription, FetchedSubscriptions, @@ -15,6 +22,7 @@ from monitoring.monitorlib.mutate import rid as mutate from monitoring.monitorlib.fetch import rid as fetch from monitoring.monitorlib.mutate.rid import ISAChange, ChangedSubscription +from monitoring.monitorlib.rid import RIDVersion from monitoring.uss_qualifier.common_data_definitions import Severity from monitoring.uss_qualifier.resources.astm.f3411.dss import DSSInstance from monitoring.uss_qualifier.scenarios.scenario import ( @@ -250,6 +258,43 @@ def get_isa_expect_response_code( return isa + def put_isa_expect_response_code( + self, + check: PendingCheck, + expected_error_codes: Set[int], + 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, + isa_version: Optional[str] = None, + ) -> ISAChange: + mutated_isa = mutate.put_isa( + area_vertices=area_vertices, + alt_lo=alt_lo, + alt_hi=alt_hi, + start_time=start_time, + end_time=end_time, + uss_base_url=uss_base_url, + isa_id=isa_id, + isa_version=isa_version, + rid_version=self._dss.rid_version, + utm_client=self._dss.client, + server_id=self._dss.participant_id, + ) + + self._handle_query_result( + check=check, + q=mutated_isa.dss_query, + fail_msg="ISA Put succeeded when expecting a failure", + required_status_code=expected_error_codes, + severity=Severity.High, + fail_details=f"The submitted query was expected to fail. Payload: {mutated_isa.dss_query.query.request.json}", + ) + return mutated_isa + def put_isa( self, main_check: PendingCheck, @@ -846,3 +891,54 @@ def cleanup_sub( raise RuntimeError( "DSS query was not successful, but a High Severity issue didn't interrupt execution" ) + + def raw_request_with_expected_code( + self, + check: PendingCheck, + method: str, + url_path: str, + json: Dict[str, Any], + expected_error_codes: Set[int], + fail_msg: str, + ) -> RIDQuery: + """For passing raw requests to the underlying client. + Mostly useful for sending malformed requests when testing validations. + """ + + req_descr = RequestDescription( + method=method, + url=url_path, + json=json, + timestamp=datetime.datetime.utcnow(), + ) + + resp = self._dss.client.put(url_path, json=json) + + q = Query( + request=req_descr, + response=ResponseDescription( + code=resp.status_code, + json=resp.json(), + body=resp.content, + headers=resp.headers, + reported=StringBasedDateTime(datetime.datetime.utcnow()), + ), + ) + self._scenario.record_query(q) + + if self._dss.rid_version == RIDVersion.f3411_19: + rid_query = RIDQuery(v19_query=q) + elif self._dss.rid_version == RIDVersion.f3411_22a: + rid_query = RIDQuery(v22a_query=q) + else: + raise ValueError(f"Unknown RID version: {self._dss.rid_version}") + + self._handle_query_result( + check, + rid_query, + fail_msg, + expected_error_codes, + Severity.Medium, + ) + + return rid_query 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 a3a46b4509..3a58386869 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/__init__.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/__init__.py @@ -1,3 +1,4 @@ from .isa_simple import ISASimple +from .isa_validation import ISAValidation from .subscription_validation import SubscriptionValidation from .crdb_access import CRDBAccess diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/isa_simple.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/isa_simple.md index 7ba1e3d551..985ce4df4a 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/isa_simple.md +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/isa_simple.md @@ -19,6 +19,10 @@ after its time of applicability. [`ServiceAreaResource`](../../../../../resources/netrid/service_area.py) describing an ISA to be created. +### problematically_big_area + +[`VerticesResource`](../../../../../resources/vertices.py) describing an area designed to be too big to be accepted by the DSS. + ## Setup test case ### Ensure clean workspace test step diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/isa_validation.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/isa_validation.md new file mode 100644 index 0000000000..ffa1e6aa2b --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/isa_validation.md @@ -0,0 +1,99 @@ +# ASTM NetRID DSS: Submitted ISA Validations test scenario + +## Overview + +Perform basic operations on a single DSS instance to create an ISA and query it during its time of applicability and +after its time of applicability. + +## 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 an ISA to be created. + +### problematically_big_area + +[`VerticesResource`](../../../../../resources/vertices.py) describing an area designed to be too big to be accepted by the DSS. + +## Setup test case + +### Ensure clean workspace test step + +This scenario creates an ISA with a known ID. This step ensures that ISA does not exist before the start of the main +part of the test. + +#### Successful ISA query check + +**[astm.f3411.v19.DSS0030](../../../../../requirements/astm/f3411/v19.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 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](../../../../../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.NET0710](../../../../../requirements/astm/f3411/v19.md)** requirement to implement the POST ISAs endpoint isn't met. + + +## ISA Validation test case + +### ISA Validation test step + +#### ISA huge area check + +Attempting to put a too large ISA should result in a 400. + +#### ISA empty vertices check + +An ISA with a empty `vertices` array in the `extents.spatial_volume.footprint` field of the ISA creation payload should not result in a successful submission. + +#### ISA start time in the past check + +The DSS must reject ISAs with start times in the past. + +#### ISA start time after end time check + +The DSS must reject ISAs for which the start time is after the end time. + +#### ISA vertices are valid check + +The DSS must reject ISAs with invalid vertices, such as vertices that have latitude or longitude outside meaningful ranges. + +#### ISA missing outline check + +If the outline polygon is missing from the `extents.spatial_volume.footprint` field in the payload of the ISA creation request, +the DSS is expected to reject the request. + +#### ISA missing volume check + +If the outline polygon is missing from the `extents.spatial_volume` field in the payload of the ISA creation request, +the DSS is expected to reject the request. + +#### ISA missing extents check + +If the `extents` field is missing from the payload of the ISA creation request, +the DSS is expected to reject the request. + +## Cleanup + +The cleanup phase of this test scenario attempts to remove the ISA if the test ended prematurely. + +### Successful ISA query check + +**[astm.f3411.v19.DSS0030](../../../../../requirements/astm/f3411/v19.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](../../../../../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/isa_validation.py b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/isa_validation.py new file mode 100644 index 0000000000..26e070dee1 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/isa_validation.py @@ -0,0 +1,8 @@ +from monitoring.uss_qualifier.scenarios.astm.netrid.common.dss.isa_validation import ( + ISAValidation as CommonISAValidation, +) +from monitoring.uss_qualifier.scenarios.scenario import TestScenario + + +class ISAValidation(TestScenario, CommonISAValidation): + pass 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 a3a46b4509..3a58386869 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/__init__.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/__init__.py @@ -1,3 +1,4 @@ from .isa_simple import ISASimple +from .isa_validation import ISAValidation from .subscription_validation import SubscriptionValidation from .crdb_access import CRDBAccess diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/isa_simple.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/isa_simple.md index 29ca35daf9..c72a478953 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/isa_simple.md +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/isa_simple.md @@ -19,6 +19,10 @@ after its time of applicability. [`ServiceAreaResource`](../../../../../resources/netrid/service_area.py) describing an ISA to be created. +### problematically_big_area + +[`VerticesResource`](../../../../../resources/vertices.py) describing an area designed to be too big to be accepted by the DSS. + ## Setup test case ### Ensure clean workspace test step diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/isa_validation.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/isa_validation.md new file mode 100644 index 0000000000..f47570a4f7 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/isa_validation.md @@ -0,0 +1,99 @@ +# ASTM NetRID DSS: Submitted ISA Validations test scenario + +## Overview + +Perform basic operations on a single DSS instance to create an ISA and query it during its time of applicability and +after its time of applicability. + +## 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 an ISA to be created. + +### problematically_big_area + +[`VerticesResource`](../../../../../resources/vertices.py) describing an area designed to be too big to be accepted by the DSS. + +## Setup test case + +### Ensure clean workspace test step + +This scenario creates an ISA with a known ID. This step ensures that ISA does not exist before the start of the main +part of the test. + +#### Successful ISA query check + +**[astm.f3411.v22a.DSS0030](../../../../../requirements/astm/f3411/v22a.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 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](../../../../../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.NET0710](../../../../../requirements/astm/f3411/v22a.md)** requirement to implement the POST ISAs endpoint isn't met. + + +## ISA Validation test case + +### ISA Validation test step + +#### ISA huge area check + +Attempting to put a too large ISA should result in a 400. + +#### ISA empty vertices check + +An ISA with a empty `vertices` array in the `extents.volume.outline_polygon` field of the ISA creation payload should not result in a successful submission. + +#### ISA start time in the past check + +The DSS must reject ISAs with start times in the past. + +#### ISA start time after end time check + +The DSS must reject ISAs for which the start time is after the end time. + +#### ISA vertices are valid check + +The DSS must reject ISAs with invalid vertices, such as vertices that have latitude or longitude outside meaningful ranges. + +#### ISA missing outline check + +If the outline polygon is missing from the `extents.volume.outline_polygon` field in the payload of the ISA creation request, +the DSS is expected to reject the request. + +#### ISA missing volume check + +If the outline polygon is missing from the `extents.volume` field in the payload of the ISA creation request, +the DSS is expected to reject the request. + +#### ISA missing extents check + +If the `extents` field is missing from the payload of the ISA creation request, +the DSS is expected to reject the request. + +## Cleanup + +The cleanup phase of this test scenario attempts to remove the ISA if the test ended prematurely. + +### Successful ISA query check + +**[astm.f3411.v22a.DSS0030](../../../../../requirements/astm/f3411/v22a.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](../../../../../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/isa_validation.py b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/isa_validation.py new file mode 100644 index 0000000000..26e070dee1 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/isa_validation.py @@ -0,0 +1,8 @@ +from monitoring.uss_qualifier.scenarios.astm.netrid.common.dss.isa_validation import ( + ISAValidation as CommonISAValidation, +) +from monitoring.uss_qualifier.scenarios.scenario import TestScenario + + +class ISAValidation(TestScenario, CommonISAValidation): + pass diff --git a/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md b/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md index 4a00bf06f7..90caa13126 100644 --- a/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md +++ b/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md @@ -94,7 +94,7 @@ DSS0030 Implemented - ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Subscription Validation
ASTM NetRID nominal behavior + ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Subscription Validation
ASTM NetRID nominal behavior DSS0050 @@ -274,12 +274,12 @@ NET0710 Implemented - ASTM NetRID DSS: Simple ISA
ASTM NetRID nominal behavior + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID nominal behavior NET0730 Implemented - ASTM NetRID DSS: Simple ISA + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations interuss
.automated_testing
.rid
.injection
diff --git a/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.yaml b/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.yaml index a07f333708..2e754ecdd7 100644 --- a/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.yaml +++ b/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.yaml @@ -7,6 +7,7 @@ resources: dss_instances: resources.astm.f3411.DSSInstancesResource id_generator: resources.interuss.IDGeneratorResource service_area: resources.netrid.ServiceAreaResource + problematically_big_area: resources.VerticesResource actions: - action_generator: generator_type: action_generators.astm.f3411.ForEachDSS @@ -14,6 +15,7 @@ actions: dss_instances: dss_instances id_generator: id_generator service_area: service_area + problematically_big_area: problematically_big_area specification: action_to_repeat: test_suite: @@ -23,6 +25,7 @@ actions: all_dss_instances: dss_instances id_generator: id_generator isa: service_area + problematically_big_area: problematically_big_area on_failure: Continue dss_instances_source: dss_instances dss_instance_id: dss 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 ad6777da5b..ba85635292 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 @@ -5,9 +5,10 @@ ## [Actions](../../../README.md#actions) 1. Scenario: [ASTM NetRID DSS: Simple ISA](../../../../scenarios/astm/netrid/v19/dss/isa_simple.md) ([`scenarios.astm.netrid.v19.dss.ISASimple`](../../../../scenarios/astm/netrid/v19/dss/isa_simple.py)) -2. Scenario: [ASTM NetRID DSS: Subscription Validation](../../../../scenarios/astm/netrid/v19/dss/subscription_validation.md) ([`scenarios.astm.netrid.v19.dss.SubscriptionValidation`](../../../../scenarios/astm/netrid/v19/dss/subscription_validation.py)) -3. 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)) -4. 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)) +2. Scenario: [ASTM NetRID DSS: Submitted ISA Validations](../../../../scenarios/astm/netrid/v19/dss/isa_validation.md) ([`scenarios.astm.netrid.v19.dss.ISAValidation`](../../../../scenarios/astm/netrid/v19/dss/isa_validation.py)) +3. Scenario: [ASTM NetRID DSS: Subscription Validation](../../../../scenarios/astm/netrid/v19/dss/subscription_validation.md) ([`scenarios.astm.netrid.v19.dss.SubscriptionValidation`](../../../../scenarios/astm/netrid/v19/dss/subscription_validation.py)) +4. 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)) +5. 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)) ## [Checked requirements](../../../README.md#checked-requirements) @@ -92,7 +93,7 @@ DSS0030 Implemented - ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Subscription Validation + ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Subscription Validation DSS0050 @@ -177,11 +178,11 @@ NET0710 Implemented - ASTM NetRID DSS: Simple ISA + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations NET0730 Implemented - ASTM NetRID DSS: Simple ISA + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations 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 0fc8819078..80c2c3307f 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 @@ -4,6 +4,7 @@ resources: all_dss_instances: resources.astm.f3411.DSSInstancesResource? id_generator: resources.interuss.IDGeneratorResource isa: resources.netrid.ServiceAreaResource + problematically_big_area: resources.VerticesResource actions: - test_scenario: scenario_type: scenarios.astm.netrid.v19.dss.ISASimple @@ -11,6 +12,14 @@ actions: dss: dss id_generator: id_generator isa: isa + problematically_big_area: problematically_big_area + - test_scenario: + scenario_type: scenarios.astm.netrid.v19.dss.ISAValidation + resources: + dss: dss + id_generator: id_generator + isa: isa + problematically_big_area: problematically_big_area - test_scenario: scenario_type: scenarios.astm.netrid.v19.dss.SubscriptionValidation resources: diff --git a/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.md b/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.md index b0d5e2fbc9..c37186be03 100644 --- a/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.md +++ b/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.md @@ -94,7 +94,7 @@ DSS0030 Implemented - ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Subscription Validation
ASTM NetRID nominal behavior + ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Subscription Validation
ASTM NetRID nominal behavior DSS0050 @@ -384,12 +384,12 @@ NET0710 Implemented - ASTM NetRID DSS: Simple ISA
ASTM NetRID nominal behavior + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID nominal behavior NET0730 Implemented - ASTM NetRID DSS: Simple ISA + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations interuss
.automated_testing
.rid
.injection
diff --git a/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.yaml b/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.yaml index 91d1bdaf42..b651bbd8c8 100644 --- a/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.yaml +++ b/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.yaml @@ -7,6 +7,7 @@ resources: dss_instances: resources.astm.f3411.DSSInstancesResource id_generator: resources.interuss.IDGeneratorResource service_area: resources.netrid.ServiceAreaResource + problematically_big_area: resources.VerticesResource actions: - action_generator: generator_type: action_generators.astm.f3411.ForEachDSS @@ -14,6 +15,7 @@ actions: dss_instances: dss_instances id_generator: id_generator service_area: service_area + problematically_big_area: problematically_big_area specification: action_to_repeat: test_suite: @@ -23,6 +25,7 @@ actions: all_dss_instances: dss_instances id_generator: id_generator isa: service_area + problematically_big_area: problematically_big_area on_failure: Continue dss_instances_source: dss_instances dss_instance_id: dss 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 409640cb84..8f8846a482 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 @@ -5,9 +5,10 @@ ## [Actions](../../../README.md#actions) 1. Scenario: [ASTM NetRID DSS: Simple ISA](../../../../scenarios/astm/netrid/v22a/dss/isa_simple.md) ([`scenarios.astm.netrid.v22a.dss.ISASimple`](../../../../scenarios/astm/netrid/v22a/dss/isa_simple.py)) -2. Scenario: [ASTM NetRID DSS: Subscription Validation](../../../../scenarios/astm/netrid/v22a/dss/subscription_validation.md) ([`scenarios.astm.netrid.v22a.dss.SubscriptionValidation`](../../../../scenarios/astm/netrid/v22a/dss/subscription_validation.py)) -3. 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)) -4. 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)) +2. Scenario: [ASTM NetRID DSS: Submitted ISA Validations](../../../../scenarios/astm/netrid/v22a/dss/isa_validation.md) ([`scenarios.astm.netrid.v22a.dss.ISAValidation`](../../../../scenarios/astm/netrid/v22a/dss/isa_validation.py)) +3. Scenario: [ASTM NetRID DSS: Subscription Validation](../../../../scenarios/astm/netrid/v22a/dss/subscription_validation.md) ([`scenarios.astm.netrid.v22a.dss.SubscriptionValidation`](../../../../scenarios/astm/netrid/v22a/dss/subscription_validation.py)) +4. 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)) +5. 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)) ## [Checked requirements](../../../README.md#checked-requirements) @@ -92,7 +93,7 @@ DSS0030 Implemented - ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Subscription Validation + ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Subscription Validation DSS0050 @@ -182,11 +183,11 @@ NET0710 Implemented - ASTM NetRID DSS: Simple ISA + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations NET0730 Implemented - ASTM NetRID DSS: Simple ISA + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations 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 3091f087b2..4dc8a869f2 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 @@ -4,6 +4,7 @@ resources: all_dss_instances: resources.astm.f3411.DSSInstancesResource? id_generator: resources.interuss.IDGeneratorResource isa: resources.netrid.ServiceAreaResource + problematically_big_area: resources.VerticesResource actions: - test_scenario: scenario_type: scenarios.astm.netrid.v22a.dss.ISASimple @@ -11,6 +12,14 @@ actions: dss: dss id_generator: id_generator isa: isa + problematically_big_area: problematically_big_area + - test_scenario: + scenario_type: scenarios.astm.netrid.v22a.dss.ISAValidation + resources: + dss: dss + id_generator: id_generator + isa: isa + problematically_big_area: problematically_big_area - test_scenario: scenario_type: scenarios.astm.netrid.v22a.dss.SubscriptionValidation resources: diff --git a/monitoring/uss_qualifier/suites/interuss/dss/all_tests.md b/monitoring/uss_qualifier/suites/interuss/dss/all_tests.md index 43e85d6b57..0f09ce43a8 100644 --- a/monitoring/uss_qualifier/suites/interuss/dss/all_tests.md +++ b/monitoring/uss_qualifier/suites/interuss/dss/all_tests.md @@ -92,7 +92,7 @@ DSS0030 Implemented - ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Subscription Validation + ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Subscription Validation DSS0050 @@ -177,12 +177,12 @@ NET0710 Implemented - ASTM NetRID DSS: Simple ISA + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations NET0730 Implemented - ASTM NetRID DSS: Simple ISA + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations astm
.f3411
.v22a
@@ -258,7 +258,7 @@ DSS0030 Implemented - ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Subscription Validation + ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Subscription Validation DSS0050 @@ -348,11 +348,11 @@ NET0710 Implemented - ASTM NetRID DSS: Simple ISA + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations NET0730 Implemented - ASTM NetRID DSS: Simple ISA + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations diff --git a/monitoring/uss_qualifier/suites/uspace/network_identification.md b/monitoring/uss_qualifier/suites/uspace/network_identification.md index ddee175bc9..2154ddc429 100644 --- a/monitoring/uss_qualifier/suites/uspace/network_identification.md +++ b/monitoring/uss_qualifier/suites/uspace/network_identification.md @@ -89,7 +89,7 @@ DSS0030 Implemented - ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Subscription Validation
ASTM NetRID nominal behavior + ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Subscription Validation
ASTM NetRID nominal behavior DSS0050 @@ -379,12 +379,12 @@ NET0710 Implemented - ASTM NetRID DSS: Simple ISA
ASTM NetRID nominal behavior + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID nominal behavior NET0730 Implemented - ASTM NetRID DSS: Simple ISA + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations interuss
.automated_testing
.rid
.injection
diff --git a/monitoring/uss_qualifier/suites/uspace/required_services.md b/monitoring/uss_qualifier/suites/uspace/required_services.md index 7997e33f9c..89080beaa2 100644 --- a/monitoring/uss_qualifier/suites/uspace/required_services.md +++ b/monitoring/uss_qualifier/suites/uspace/required_services.md @@ -90,7 +90,7 @@ DSS0030 Implemented - ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Subscription Validation
ASTM NetRID nominal behavior + ASTM F3411-22a NetRID DSS interoperability
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID DSS: Subscription Validation
ASTM NetRID nominal behavior DSS0050 @@ -380,12 +380,12 @@ NET0710 Implemented - ASTM NetRID DSS: Simple ISA
ASTM NetRID nominal behavior + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations
ASTM NetRID nominal behavior NET0730 Implemented - ASTM NetRID DSS: Simple ISA + ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations astm
.f3548
.v21
diff --git a/schemas/monitoring/monitorlib/geo/Altitude.json b/schemas/monitoring/monitorlib/geo/Altitude.json new file mode 100644 index 0000000000..407a4d1e73 --- /dev/null +++ b/schemas/monitoring/monitorlib/geo/Altitude.json @@ -0,0 +1,34 @@ +{ + "$id": "https://github.com/interuss/monitoring/blob/main/schemas/monitoring/monitorlib/geo/Altitude.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "monitoring.monitorlib.geo.Altitude, as defined in monitoring/monitorlib/geo.py", + "properties": { + "$ref": { + "description": "Path to content that replaces the $ref", + "type": "string" + }, + "reference": { + "enum": [ + "W84", + "SFC" + ], + "type": "string" + }, + "units": { + "enum": [ + "M", + "FT" + ], + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "reference", + "units", + "value" + ], + "type": "object" +} \ No newline at end of file diff --git a/schemas/monitoring/monitorlib/geo/Circle.json b/schemas/monitoring/monitorlib/geo/Circle.json new file mode 100644 index 0000000000..9df21a707d --- /dev/null +++ b/schemas/monitoring/monitorlib/geo/Circle.json @@ -0,0 +1,22 @@ +{ + "$id": "https://github.com/interuss/monitoring/blob/main/schemas/monitoring/monitorlib/geo/Circle.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "monitoring.monitorlib.geo.Circle, as defined in monitoring/monitorlib/geo.py", + "properties": { + "$ref": { + "description": "Path to content that replaces the $ref", + "type": "string" + }, + "center": { + "$ref": "LatLngPoint.json" + }, + "radius": { + "$ref": "Radius.json" + } + }, + "required": [ + "center", + "radius" + ], + "type": "object" +} \ No newline at end of file diff --git a/schemas/monitoring/monitorlib/geo/LatLngBoundingBox.json b/schemas/monitoring/monitorlib/geo/LatLngBoundingBox.json new file mode 100644 index 0000000000..da84055d29 --- /dev/null +++ b/schemas/monitoring/monitorlib/geo/LatLngBoundingBox.json @@ -0,0 +1,34 @@ +{ + "$id": "https://github.com/interuss/monitoring/blob/main/schemas/monitoring/monitorlib/geo/LatLngBoundingBox.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "Bounding box in latitude and longitude\n\nmonitoring.monitorlib.geo.LatLngBoundingBox, as defined in monitoring/monitorlib/geo.py", + "properties": { + "$ref": { + "description": "Path to content that replaces the $ref", + "type": "string" + }, + "lat_max": { + "description": "Upper latitude bound (degrees)", + "type": "number" + }, + "lat_min": { + "description": "Lower latitude bound (degrees)", + "type": "number" + }, + "lng_max": { + "description": "Upper longitude bound (degrees)", + "type": "number" + }, + "lng_min": { + "description": "Lower longitude bound (degrees)", + "type": "number" + } + }, + "required": [ + "lat_max", + "lat_min", + "lng_max", + "lng_min" + ], + "type": "object" +} \ No newline at end of file diff --git a/schemas/monitoring/monitorlib/geo/LatLngPoint.json b/schemas/monitoring/monitorlib/geo/LatLngPoint.json new file mode 100644 index 0000000000..e69c4104a6 --- /dev/null +++ b/schemas/monitoring/monitorlib/geo/LatLngPoint.json @@ -0,0 +1,24 @@ +{ + "$id": "https://github.com/interuss/monitoring/blob/main/schemas/monitoring/monitorlib/geo/LatLngPoint.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "Vertex in latitude and longitude\n\nmonitoring.monitorlib.geo.LatLngPoint, as defined in monitoring/monitorlib/geo.py", + "properties": { + "$ref": { + "description": "Path to content that replaces the $ref", + "type": "string" + }, + "lat": { + "description": "Latitude (degrees)", + "type": "number" + }, + "lng": { + "description": "Longitude (degrees)", + "type": "number" + } + }, + "required": [ + "lat", + "lng" + ], + "type": "object" +} \ No newline at end of file diff --git a/schemas/monitoring/monitorlib/geo/Polygon.json b/schemas/monitoring/monitorlib/geo/Polygon.json new file mode 100644 index 0000000000..c7bb037d14 --- /dev/null +++ b/schemas/monitoring/monitorlib/geo/Polygon.json @@ -0,0 +1,21 @@ +{ + "$id": "https://github.com/interuss/monitoring/blob/main/schemas/monitoring/monitorlib/geo/Polygon.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "monitoring.monitorlib.geo.Polygon, as defined in monitoring/monitorlib/geo.py", + "properties": { + "$ref": { + "description": "Path to content that replaces the $ref", + "type": "string" + }, + "vertices": { + "items": { + "$ref": "LatLngPoint.json" + }, + "type": "array" + } + }, + "required": [ + "vertices" + ], + "type": "object" +} \ No newline at end of file diff --git a/schemas/monitoring/monitorlib/geo/Radius.json b/schemas/monitoring/monitorlib/geo/Radius.json new file mode 100644 index 0000000000..b4a2b3cc14 --- /dev/null +++ b/schemas/monitoring/monitorlib/geo/Radius.json @@ -0,0 +1,26 @@ +{ + "$id": "https://github.com/interuss/monitoring/blob/main/schemas/monitoring/monitorlib/geo/Radius.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "monitoring.monitorlib.geo.Radius, as defined in monitoring/monitorlib/geo.py", + "properties": { + "$ref": { + "description": "Path to content that replaces the $ref", + "type": "string" + }, + "units": { + "enum": [ + "M", + "FT" + ], + "type": "string" + }, + "value": { + "type": "number" + } + }, + "required": [ + "units", + "value" + ], + "type": "object" +} \ No newline at end of file diff --git a/schemas/monitoring/monitorlib/geo/Volume3D.json b/schemas/monitoring/monitorlib/geo/Volume3D.json new file mode 100644 index 0000000000..abbbc30120 --- /dev/null +++ b/schemas/monitoring/monitorlib/geo/Volume3D.json @@ -0,0 +1,52 @@ +{ + "$id": "https://github.com/interuss/monitoring/blob/main/schemas/monitoring/monitorlib/geo/Volume3D.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "monitoring.monitorlib.geo.Volume3D, as defined in monitoring/monitorlib/geo.py", + "properties": { + "$ref": { + "description": "Path to content that replaces the $ref", + "type": "string" + }, + "altitude_lower": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "Altitude.json" + } + ] + }, + "altitude_upper": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "Altitude.json" + } + ] + }, + "outline_circle": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "Circle.json" + } + ] + }, + "outline_polygon": { + "oneOf": [ + { + "type": "null" + }, + { + "$ref": "Polygon.json" + } + ] + } + }, + "type": "object" +} \ No newline at end of file diff --git a/schemas/monitoring/uss_qualifier/resources/vertices/VerticesSpecification.json b/schemas/monitoring/uss_qualifier/resources/vertices/VerticesSpecification.json new file mode 100644 index 0000000000..790130c666 --- /dev/null +++ b/schemas/monitoring/uss_qualifier/resources/vertices/VerticesSpecification.json @@ -0,0 +1,22 @@ +{ + "$id": "https://github.com/interuss/monitoring/blob/main/schemas/monitoring/uss_qualifier/resources/vertices/VerticesSpecification.json", + "$schema": "https://json-schema.org/draft/2020-12/schema", + "description": "Specifies a list of vertices representing a 2D area.\nUseful for passing arbitrary areas to test scenarios.\n\nmonitoring.uss_qualifier.resources.vertices.VerticesSpecification, as defined in monitoring/uss_qualifier/resources/vertices.py", + "properties": { + "$ref": { + "description": "Path to content that replaces the $ref", + "type": "string" + }, + "vertices": { + "description": "Represents a 2D area", + "items": { + "$ref": "../../../monitorlib/geo/LatLngPoint.json" + }, + "type": "array" + } + }, + "required": [ + "vertices" + ], + "type": "object" +} \ No newline at end of file