From e2bf978929bd62cbfa501a7c7abbd5ba8f403aa2 Mon Sep 17 00:00:00 2001 From: Julien Perrochet Date: Fri, 27 Oct 2023 09:50:51 +0200 Subject: [PATCH] [uss_qualifier] DSS0030 simple subscription test scenario --- monitoring/prober/infrastructure.py | 2 +- .../interuss/f3411/dss_endpoints.md | 6 + .../resources/netrid/service_area.py | 21 +- .../netrid/common/dss/subscription_simple.py | 380 ++++++++++++++++++ .../scenarios/astm/netrid/dss_wrapper.py | 108 ++++- .../scenarios/astm/netrid/v19/dss/__init__.py | 1 + .../netrid/v19/dss/subscription_simple.md | 189 +++++++++ .../netrid/v19/dss/subscription_simple.py | 8 + .../netrid/v19/dss/subscription_validation.md | 4 +- .../astm/netrid/v22a/dss/__init__.py | 1 + .../netrid/v22a/dss/subscription_simple.md | 189 +++++++++ .../netrid/v22a/dss/subscription_simple.py | 8 + .../v22a/dss/subscription_validation.md | 4 +- .../astm/netrid/f3411_19/dss_probing.yaml | 7 + .../astm/netrid/f3411_22a/dss_probing.yaml | 7 + 15 files changed, 924 insertions(+), 11 deletions(-) create mode 100644 monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_simple.py create mode 100644 monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_simple.md create mode 100644 monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_simple.py create mode 100644 monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_simple.md create mode 100644 monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_simple.py diff --git a/monitoring/prober/infrastructure.py b/monitoring/prober/infrastructure.py index bc73f0aba3..f90115ff5b 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: 371 +# Next code: 372 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/requirements/interuss/f3411/dss_endpoints.md b/monitoring/uss_qualifier/requirements/interuss/f3411/dss_endpoints.md index 2d8a926754..45d5cf8de9 100644 --- a/monitoring/uss_qualifier/requirements/interuss/f3411/dss_endpoints.md +++ b/monitoring/uss_qualifier/requirements/interuss/f3411/dss_endpoints.md @@ -2,5 +2,11 @@ While neither ASTM F3411-19 nor F3411-22a explicitly require DSS implementations to implement all endpoints specified in Annex A4 (of each respective standard), InterUSS automated testing expects DSS implementations to implement all DSS endpoints specified in Annex A4. Specifically: +* PutISA: The DSS implementation under test must implement the ability to create and update an Identification Service Area by ID in accordance with the API specified in Annex A4 of the respective standard. * GetISA: The DSS implementation under test must implement the ability to retrieve an Identification Service Area by ID in accordance with the API specified in Annex A4 of the respective standard. +* DeleteISA: The DSS implementation under test must implement the ability to delete an Identification Service Area by ID in accordance with the API specified in Annex A4 of the respective standard. * SearchISAs: The DSS implementation under test must implement the ability to search for Identification Service Areas meeting the specified criteria in accordance with the API specified in Annex A4 of the respective standard. +* PutSubscription: The DSS implementation under test must implement the ability to create a subscription in accordance with the API specified in Annex A4 of the respective standard. +* GetSubscription: The DSS implementation under test must implement the ability to retrieve a Subscription by ID in accordance with the API specified in Annex A4 of the respective standard. +* DeleteSubscription: The DSS implementation under test must implement the ability to delete s Subscription in accordance with the API specified in Annex A4 of the respective standard. +* SearchSubscriptions: The DSS implementation under test must implement the ability to search for subscriptions in accordance with the API specified in Annex A4 of the respective standard. diff --git a/monitoring/uss_qualifier/resources/netrid/service_area.py b/monitoring/uss_qualifier/resources/netrid/service_area.py index 826007354e..7905fbff93 100644 --- a/monitoring/uss_qualifier/resources/netrid/service_area.py +++ b/monitoring/uss_qualifier/resources/netrid/service_area.py @@ -1,9 +1,9 @@ import datetime -from typing import List +from typing import List, Dict, Any from implicitdict import ImplicitDict, StringBasedDateTime -from monitoring.monitorlib.geo import LatLngPoint +from monitoring.monitorlib.geo import LatLngPoint from monitoring.uss_qualifier.resources.resource import Resource @@ -45,6 +45,23 @@ def shifted_time_end( dt = new_reference_time - self.reference_time.datetime return self.time_end.datetime + dt + def get_new_subscription_params( + self, sub_id: str, start_time: datetime.datetime, duration: datetime.timedelta + ) -> Dict[str, Any]: + """ + Builds a dict of parameters that can be used to create a subscription, using this ISA's parameters + and the passed start time and duration + """ + return dict( + sub_id=sub_id, + area_vertices=[vertex.as_s2sphere() for vertex in self.footprint], + alt_lo=self.altitude_min, + alt_hi=self.altitude_max, + start_time=start_time, + end_time=start_time + duration, + uss_base_url=self.base_url, + ) + class ServiceAreaResource(Resource[ServiceAreaSpecification]): specification: ServiceAreaSpecification diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_simple.py b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_simple.py new file mode 100644 index 0000000000..b2df764c7e --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_simple.py @@ -0,0 +1,380 @@ +import re +from datetime import datetime, timedelta +from typing import Dict, Any, List + +import s2sphere + +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.dss_wrapper import DSSWrapper +from monitoring.uss_qualifier.scenarios.scenario import ( + GenericTestScenario, +) + +TIME_TOLERANCE_SEC = 1 + + +class SubscriptionSimple(GenericTestScenario): + """Based on prober/rid/v2/test_subscription_simple.py from the legacy prober tool.""" + + SUB_TYPE = register_resource_type(371, "Subscription") + + _test_subscription_params: Dict[str, Any] + _problematically_big_area: List[s2sphere.LatLng] + + def __init__( + self, + dss: DSSInstanceResource, + id_generator: IDGeneratorResource, + isa: ServiceAreaResource, + problematically_big_area: VerticesResource, + ): + """ + + Args: + dss: dss to test + id_generator: will let us generate specific identifiers + isa: Service Area to use for the tests. It should be an area for which the DSS is responsible, + but has no other requirements. + """ + super().__init__() + # This is an UTMClientSession + self._dss = dss.dss_instance + self._dss_wrapper = DSSWrapper(self, self._dss) + self._sub_id = id_generator.id_factory.make_id(self.SUB_TYPE) + self._isa = isa.specification + self._isa_area = [vertex.as_s2sphere() for vertex in self._isa.footprint] + # List of vertices that has the same first and last point: + # Used to validate some special-case handling by the DSS + self._isa_area_loop = self._isa_area.copy() + self._isa_area_loop.append(self._isa_area_loop[0]) + + self._test_subscription_params = self._isa.get_new_subscription_params( + sub_id=self._sub_id, + start_time=datetime.now().astimezone(), + duration=timedelta( + minutes=5 + ), # 5 minutes are enough to run through this test + ) + + self._problematically_big_area = [ + vertex.as_s2sphere() + for vertex in problematically_big_area.specification.vertices + ] + + def run(self): + self.begin_test_scenario() + + self._setup_case() + + self.begin_test_case("Subscription Simple") + + self.begin_test_step("Create subscription validation") + + self._create_and_validate_sub() + + self.end_test_step() + self.begin_test_step("Query Existing Subscription") + + self._test_get_sub() + self._test_valid_search_sub() + self._test_huge_area_search_sub() + + self.end_test_step() + self.begin_test_step("Delete Subscription") + + self._test_delete_sub_faulty() + self._test_delete_sub() + + self.end_test_step() + self.begin_test_step("Query Deleted Subscription") + + self._test_get_deleted_sub() + self._test_search_deleted_sub() + self._test_loop_vertices_search_deleted_sub() + + self.end_test_step() + self.end_test_case() + + self.end_test_scenario() + + def _setup_case(self): + self.begin_test_case("Setup") + + self._ensure_clean_workspace_step() + + self.end_test_case() + + def _ensure_clean_workspace_step(self): + self.begin_test_step("Ensure clean workspace") + self._ensure_test_sub_does_not_exist() + self.end_test_step() + + def _ensure_test_sub_does_not_exist(self): + with self.check( + "Ensure subscription with test ID does not exist", + [self._dss_wrapper.participant_id], + ) as check: + self._dss_wrapper.cleanup_sub(check, self._sub_id) + + def _create_and_validate_sub(self): + """Creates a subscription and ensures that the data obtained in the response is correct. + Note that this does not check for services areas in the response: this behavior is checked + in the isa_subscription_interactions scenario. + """ + with self.check( + "Create subscription", [self._dss_wrapper.participant_id] + ) as check: + created_sub = self._dss_wrapper.put_sub( + check, + **self._test_subscription_params, + ) + + # Make sure the subscription corresponds to what we requested + self._validate_subscription(created_sub.subscription) + + # Check the notification index is 0 + with self.check( + "Returned notification index is 0", [self._dss_wrapper.participant_id] + ) as check: + notif_index = created_sub.subscription.notification_index + if notif_index != 0: + check.record_failed( + f"Returned notification index was {notif_index} instead of 0", + Severity.High, + query_timestamps=[created_sub.query.request.timestamp], + ) + + self._current_sub_version = created_sub.subscription.version + + def _test_get_sub(self): + """Retrieves the previously created Submission by its ID and ensures that + the data obtained in the response is correct.""" + with self.check( + "Get Subscription by ID", [self._dss_wrapper.participant_id] + ) as check: + fetched_sub = self._dss_wrapper.get_sub( + check, + self._sub_id, + ) + + # Make sure the subscription corresponds to what we requested + self._validate_subscription_and_notif_index(fetched_sub.subscription) + + def _test_valid_search_sub(self): + """Search for the created subscription by using the configured ISA's footprint. This is expected to work""" + + with self.check( + "Search for all subscriptions in ISA area", + [self._dss_wrapper.participant_id], + ) as check: + subs_in_area = self._dss_wrapper.search_subs( + check, + self._isa_area, + ) + + with self.check( + "Created Subscription is in search results", + [self._dss_wrapper.participant_id], + ) as check: + if self._sub_id not in subs_in_area.subscriptions: + check.record_failed( + "Created subscription is not present in search results", + Severity.High, + f"The subscription {self._sub_id} was expected to be found in the search results, but these only contained the following subscriptions: {subs_in_area.subscriptions.keys()}", + query_timestamps=[subs_in_area.query.request.timestamp], + ) + + # Make sure the returned subscription corresponds to what we created + self._validate_subscription_and_notif_index( + subs_in_area.subscriptions[self._sub_id] + ) + + def _test_huge_area_search_sub(self): + """Checks that too big search areas are rejected""" + with self.check( + "No huge search area allowed", [self._dss_wrapper.participant_id] + ) as check: + self._dss_wrapper.search_subs_expect_response_code( + check=check, + expected_codes={413}, + area=self._problematically_big_area, + ) + + def _test_delete_sub_faulty(self): + """Try to delete subscription in an incorrect way""" + with self.check( + "Missing version prevents deletion", [self._dss_wrapper.participant_id] + ) as check: + self._dss_wrapper.del_sub_expect_response_code( + check=check, + expected_response_codes={400}, + sub_id=self._sub_id, + sub_version="", # this results in an empty url path parameter in the query (what we want to test) + ) + + with self.check( + "Incorrect version prevents deletion", [self._dss_wrapper.participant_id] + ) as check: + self._dss_wrapper.del_sub_expect_response_code( + check=check, + expected_response_codes={400}, + sub_id=self._sub_id, + sub_version="notacorrectversion", + ) + + def _test_delete_sub(self): + """Delete the subscription in the correct way""" + with self.check( + "Subscription can be deleted", [self._dss_wrapper.participant_id] + ) as check: + deleted_sub = self._dss_wrapper.del_sub( + check=check, sub_id=self._sub_id, sub_version=self._current_sub_version + ) + + # Make sure the returned subscription corresponds to what we created + self._validate_subscription_and_notif_index(deleted_sub.subscription) + + def _test_get_deleted_sub(self): + """Try to retrieve the deleted subscription by its ID.""" + with self.check( + "Query by subscription ID should fail", [self._dss_wrapper.participant_id] + ) as check: + self._dss_wrapper.get_sub_expect_response_code( + check=check, + expected_response_codes={404}, + sub_id=self._sub_id, + ) + + def _test_search_deleted_sub(self): + """Try searching for the deleted subscription""" + # Search should succeed + with self.check( + "Search for all subscriptions in ISA area", + [self._dss_wrapper.participant_id], + ) as check: + subs_in_area = self._dss_wrapper.search_subs( + check, + self._isa_area, + ) + + with self.check( + "Deleted subscription should not be present in search results", + [self._dss_wrapper.participant_id], + ) as check: + if self._sub_id in subs_in_area.subscriptions: + check.record_failed( + "Deleted subscription is still present in search results", + Severity.High, + f"The subscription {self._sub_id} was deleted, and thus not expected to be found in the search results.", + query_timestamps=[subs_in_area.query.request.timestamp], + ) + + def _test_loop_vertices_search_deleted_sub(self): + """Try searching for the deleted subscription using vertices that describe a loop""" + with self.check( + "Search area that represents a loop is not allowed", + [self._dss_wrapper.participant_id], + ) as check: + self._dss_wrapper.search_subs_expect_response_code( + check=check, + expected_codes={400}, # We explicitly want to forbid a 500 error here + area=self._isa_area_loop, + ) + + def _validate_subscription_and_notif_index(self, sub_under_test): + """Compare the passed subscription with the data we specified when creating it""" + self._validate_subscription(sub_under_test) + + # Check the notification index is 0 or more + # (notifications might have been sent out between the creation and subsequent query) + with self.check( + "Returned notification index is equal to or greater than 0", + [self._dss_wrapper.participant_id], + ) as check: + if sub_under_test.notification_index < 0: + check.record_failed( + "Returned notification index is lower than 0", + Severity.High, + f"Returned: {sub_under_test.notification_index} when 0 or more was expected", + query_timestamps=[sub_under_test.query.request.timestamp], + ) + + def _validate_subscription(self, sub_under_test): + + with self.check( + "Returned subscription ID is correct", [self._dss_wrapper.participant_id] + ) as check: + if sub_under_test.id != self._sub_id: + check.record_failed( + "Returned subscription ID does not match provided one", + Severity.High, + f"Provided: {self._sub_id}, Returned: {sub_under_test.id}", + query_timestamps=[sub_under_test.query.request.timestamp], + ) + + with self.check( + "Returned ISA URL has correct base URL", [self._dss_wrapper.participant_id] + ) as check: + if not sub_under_test.isa_url.startswith(self._isa.base_url): + check.record_failed( + "Returned USS Base URL does not match provided one", + Severity.High, + f"Provided: {self._isa.base_url}, Returned: {sub_under_test.isa_url}", + query_timestamps=[sub_under_test.query.request.timestamp], + ) + + with self.check( + "Returned start time is correct", [self._dss_wrapper.participant_id] + ) as check: + if ( + abs( + sub_under_test.time_start + - self._test_subscription_params["start_time"] + ).total_seconds() + > TIME_TOLERANCE_SEC + ): + check.record_failed( + "Returned start time does not match provided one", + Severity.High, + f"Provided: {self._test_subscription_params['time_start']}, Returned: {sub_under_test.time_start}", + query_timestamps=[sub_under_test.query.request.timestamp], + ) + + with self.check( + "Returned end time is correct", [self._dss_wrapper.participant_id] + ) as check: + if ( + abs( + sub_under_test.time_end - self._test_subscription_params["end_time"] + ).total_seconds() + > TIME_TOLERANCE_SEC + ): + check.record_failed( + "Returned end time does not match provided one", + Severity.High, + f"Provided: {self._test_subscription_params['time_end']}, Returned: {sub_under_test.time_end}", + query_timestamps=[sub_under_test.query.request.timestamp], + ) + + with self.check( + "Generated subscription version has proper format", + [self._dss_wrapper.participant_id], + ) as check: + if not re.match(r"[a-z0-9]{10,}$", sub_under_test.version): + check.record_failed( + "Returned subscription version does not match expected format", + Severity.High, + f"Returned: {sub_under_test.version}, this does not match" + + "[a-z0-9]{10,}$", + query_timestamps=[sub_under_test.query.request.timestamp], + ) + + def cleanup(self): + self.begin_cleanup() + self._ensure_test_sub_does_not_exist() + self.end_cleanup() diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/dss_wrapper.py b/monitoring/uss_qualifier/scenarios/astm/netrid/dss_wrapper.py index e49500a326..d18ef2b063 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/dss_wrapper.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/dss_wrapper.py @@ -1,8 +1,7 @@ import datetime -import s2sphere - from typing import Optional, List, Set, Dict, Any +import s2sphere from implicitdict import StringBasedDateTime from monitoring.monitorlib import schema_validation @@ -12,6 +11,7 @@ RequestDescription, ResponseDescription, ) +from monitoring.monitorlib.fetch import rid as fetch from monitoring.monitorlib.fetch.rid import ( FetchedSubscription, FetchedSubscriptions, @@ -20,7 +20,6 @@ FetchedISAs, ) 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 @@ -604,6 +603,38 @@ def cleanup_isa( "DSS query was not successful, but a High Severity issue didn't interrupt execution" ) + def search_subs_expect_response_code( + self, + check: PendingCheck, + expected_codes: Set[int], + area: List[s2sphere.LatLng], + ) -> FetchedSubscriptions: + """Search for subscriptions at the DSS, expecting one of the passed HTTP response codes. + + :return: anything the DSS responded with if the response code was as expected + """ + try: + subs = fetch.subscriptions( + area=area, + rid_version=self._dss.rid_version, + session=self._dss.client, + participant_id=self._dss.participant_id, + ) + + self._handle_query_result( + check=check, + q=subs, + fail_msg=f"Search for subscriptions in area {area} failed to yield a result code in {expected_codes}", + required_status_code=expected_codes, + ) + return subs + + except QueryError as e: + self._handle_query_error(check, e) + raise RuntimeError( + "DSS query was not successful, but a High Severity issue didn't interrupt execution" + ) + def search_subs( self, check: PendingCheck, @@ -634,6 +665,39 @@ def search_subs( "DSS query was not successful, but a High Severity issue didn't interrupt execution" ) + def get_sub_expect_response_code( + self, + check: PendingCheck, + expected_response_codes: Set[int], + sub_id: str, + ) -> FetchedSubscription: + """Get a subscription at the DSS, expecting one the passed HTTP response codes. + + :return: anything the DSS responded with if the response code was as expected + """ + try: + sub = fetch.subscription( + subscription_id=sub_id, + rid_version=self._dss.rid_version, + session=self._dss.client, + participant_id=self._dss.participant_id, + ) + + self._handle_query_result( + check=check, + q=sub, + fail_msg=f"The request to get subscription with ID {sub_id} yielded a response code that wasn't in {expected_response_codes}", + required_status_code=expected_response_codes, + ) + + return sub + + except QueryError as e: + self._handle_query_error(check, e) + raise RuntimeError( + "DSS query was not successful, but a High Severity issue didn't interrupt execution" + ) + def get_sub( self, check: PendingCheck, @@ -720,7 +784,7 @@ def put_sub_expect_response_code( ) -> ChangedSubscription: """Attempt to create or update a subscription at the DSS, and expect the specified HTTP response code. - :return: the DSS response + :return: anything the DSS responded with if the response code was as expected """ try: created_sub = mutate.upsert_subscription( @@ -797,6 +861,42 @@ def put_sub( "DSS query was not successful, but a High Severity issue didn't interrupt execution" ) + def del_sub_expect_response_code( + self, + check: PendingCheck, + expected_response_codes: Set[int], + sub_id: str, + sub_version: str, + ) -> ChangedSubscription: + """Attempts to delete a subscription at the DSS, + and verifies that the response code is part of the expected ones. + + :return: anything the DSS responded with if the response code was as expected + """ + + try: + del_sub = mutate.delete_subscription( + subscription_id=sub_id, + subscription_version=sub_version, + rid_version=self._dss.rid_version, + utm_client=self._dss.client, + participant_id=self._dss.participant_id, + ) + + self._handle_query_result( + check=check, + q=del_sub, + fail_msg=f"Query to delete subscription with ID {sub_id} wit not yield a response code in {expected_response_codes}", + required_status_code=expected_response_codes, + ) + + return del_sub + except QueryError as e: + self._handle_query_error(check, e) + raise RuntimeError( + "DSS query was not successful, but a High Severity issue didn't interrupt execution" + ) + def del_sub( self, check: PendingCheck, 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 77eade4f6e..60c13cf6d2 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/__init__.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/__init__.py @@ -3,4 +3,5 @@ from .isa_expiry import ISAExpiry from .isa_subscription_interactions import ISASubscriptionInteractions from .subscription_validation import SubscriptionValidation +from .subscription_simple import SubscriptionSimple from .crdb_access import CRDBAccess diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_simple.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_simple.md new file mode 100644 index 0000000000..c910806301 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_simple.md @@ -0,0 +1,189 @@ +# ASTM NetRID DSS: Subscription Simple test scenario + +## Overview + +Perform basic operations on a single DSS instance to create, update and delete subscriptions. + +## Resources + +### dss + +[`DSSInstanceResource`](../../../../../resources/astm/f3411/dss.py) to be tested in this scenario. + +### id_generator + +[`IDGeneratorResource`](../../../../../resources/interuss/id_generator.py) providing the Subscription IDs for this scenario. + +### isa + +[`ServiceAreaResource`](../../../../../resources/netrid/service_area.py) describing a service area for which to subscribe. + +### 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 step ensures that no subscription with the known test ID exists in the DSS. + +#### Ensure subscription with test ID does not exist check + +If the DSS cannot be queried for the existing test ID, or if a subscription with that ID exists and it cannot be removed, +the DSS is likely not implementing **[astm.f3411.v19.DSS0030,e](../../../../../requirements/astm/f3411/v19.md)** or **[astm.f3411.v19.DSS0030,d](../../../../../requirements/astm/f3411/v19.md)** properly. + +## Subscription Simple test case + +This test case creates a subscription, goes on to query and search it in different ways, then deletes it and searches for it again. + +### Create subscription validation test step + +This test step creates a subscription and ensures that the subscription the DSS returned in the API call is correct and well-formed. + +#### Create subscription check + +As per **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**, the DSS API must allow callers to create a valid subscription. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)** is not respected. + +#### Returned notification index is 0 check + +The notification index of a newly created subscription must be 0, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned ISA URL has correct base URL check + +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned start time is correct check + +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned end time is correct check + +The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Generated subscription version has proper format check + +The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +### Query Existing Subscription test step + +Query and search for the created subscription in various ways + +#### Get Subscription by ID check + +If the freshly created subscription cannot be queried using its ID, the DSS is failing to meet **[astm.f3411.v19.DSS0030,e](../../../../../requirements/astm/f3411/v19.md)**. + +#### Search for all subscriptions in ISA area check + +If the DSS fails to let us search in the area for which the subscription was just created, it is failing to meet **[astm.f3411.v19.DSS0030,f](../../../../../requirements/astm/f3411/v19.md)**. + +#### Created Subscription is in search results check + +If the created subscription is not returned in a search that covers the area it was created for, the DSS is not properly implementing **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### No huge search area allowed check + +In accordance with **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**, the DSS should not allow searches for areas that are too big. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)** is not respected. + +#### Returned notification index is equal to or greater than 0 check + +If the notification index of the subscription is less than 0, the DSS fails to properly implement **[interuss.f3411.dss_endpoints.GetSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned ISA URL has correct base URL check + +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned start time is correct check + +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned end time is correct check + +The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Generated subscription version has proper format check + +The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +### Delete Subscription test step + +Attempt to delete the subscription in various ways and ensure that the DSS reacts properly. + +This also checks that the subscription data returned by a successful deletion is correct. + +#### Missing version prevents deletion check + +An attempt to delete a subscription without providing a version should fail, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.DeleteSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Incorrect version prevents deletion check + +An attempt to delete a subscription while providing an incorrect version should fail, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.DeleteSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Subscription can be deleted check + +An attempt to delete a subscription when the correct version is provided should succeed, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.DeleteSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the deletion request, +**[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)** is not respected. + +#### Returned notification index is equal to or greater than 0 check + +If the notification index of the subscription is less than 0, the DSS fails to properly implement **[interuss.f3411.dss_endpoints.GetSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned ISA URL has correct base URL check + +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned start time is correct check + +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned end time is correct check + +The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Generated subscription version has proper format check + +The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +### Query Deleted Subscription test step + +Attempt to query and search for the deleted subscription in various ways + +#### Query by subscription ID should fail check + +If the DSS provides a successful reply to a direct query for the deleted subscription, it is in violation of **[astm.f3411.v19.DSS0030,e](../../../../../requirements/astm/f3411/v19.md)**. + +#### Search for all subscriptions in ISA area check + +If the DSS fails to let us search in the area for which the subscription was just created, it is failing to meet **[astm.f3411.v19.DSS0030,f](../../../../../requirements/astm/f3411/v19.md)**. + +#### Search area that represents a loop is not allowed check + +The DSS should not allow us to search for subscriptions using a list of vertices describing a loop (first and last points in the list of vertices are the same), +otherwise it is failing to meet **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Deleted subscription should not be present in search results check + +If the DSS returns the deleted subscription in a search that covers the area it was originally created for, the DSS is not properly implementing **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +## Cleanup + +The cleanup phase of this test scenario removes the subscription with the known test ID if it has not been removed before. + +#### Ensure subscription with test ID does not exist check + +If the DSS cannot be queried for the existing test ID, or if a subscription with that ID exists and it cannot be removed, +the DSS is likely not implementing **[astm.f3411.v19.DSS0030,e](../../../../../requirements/astm/f3411/v19.md)** or **[astm.f3411.v19.DSS0030,d](../../../../../requirements/astm/f3411/v19.md)** properly. diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_simple.py b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_simple.py new file mode 100644 index 0000000000..25f95e1d88 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_simple.py @@ -0,0 +1,8 @@ +from monitoring.uss_qualifier.scenarios.astm.netrid.common.dss.subscription_simple import ( + SubscriptionSimple as CommonSubscriptionSimple, +) +from monitoring.uss_qualifier.scenarios.scenario import TestScenario + + +class SubscriptionSimple(TestScenario, CommonSubscriptionSimple): + pass diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_validation.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_validation.md index 7b987cc193..e7b6cbcc0b 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_validation.md +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_validation.md @@ -28,7 +28,7 @@ This step ensures that we remove any subscription that may already exist for the If the query for subscriptions fails, **[astm.f3411.v19.DSS0030,f](../../../../../requirements/astm/f3411/v19.md)** was not met. -#### Successful subscription deletion +#### Successful subscription deletion check If the deletion attempt fails, **[astm.f3411.v19.DSS0030,d](../../../../../requirements/astm/f3411/v19.md)** was not met. @@ -105,6 +105,6 @@ The cleanup phase of this test scenario will remove any subscription that may ha If the query for subscriptions fails, the "GET Subscriptions" portion of **[astm.f3411.v19.DSS0030,f](../../../../../requirements/astm/f3411/v19.md)** was not met. -### Successful subscription deletion +### Successful subscription deletion check If the deletion attempt fails, the "DELETE Subscription" portion of **[astm.f3411.v19.DSS0030,d](../../../../../requirements/astm/f3411/v19.md)** was not met. 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 77eade4f6e..60c13cf6d2 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/__init__.py +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/__init__.py @@ -3,4 +3,5 @@ from .isa_expiry import ISAExpiry from .isa_subscription_interactions import ISASubscriptionInteractions from .subscription_validation import SubscriptionValidation +from .subscription_simple import SubscriptionSimple from .crdb_access import CRDBAccess diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_simple.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_simple.md new file mode 100644 index 0000000000..9bc7c14a01 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_simple.md @@ -0,0 +1,189 @@ +# ASTM NetRID DSS: Subscription Simple test scenario + +## Overview + +Perform basic operations on a single DSS instance to create, update and delete subscriptions. + +## Resources + +### dss + +[`DSSInstanceResource`](../../../../../resources/astm/f3411/dss.py) to be tested in this scenario. + +### id_generator + +[`IDGeneratorResource`](../../../../../resources/interuss/id_generator.py) providing the Subscription IDs for this scenario. + +### isa + +[`ServiceAreaResource`](../../../../../resources/netrid/service_area.py) describing a service area for which to subscribe. + +### 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 step ensures that no subscription with the known test ID exists in the DSS. + +#### Ensure subscription with test ID does not exist check + +If the DSS cannot be queried for the existing test ID, or if a subscription with that ID exists and it cannot be removed, +the DSS is likely not implementing **[astm.f3411.v22a.DSS0030,e](../../../../../requirements/astm/f3411/v22a.md)** or **[astm.f3411.v22a.DSS0030,d](../../../../../requirements/astm/f3411/v22a.md)** properly. + +## Subscription Simple test case + +This test case creates a subscription, goes on to query and search it in different ways, then deletes it and searches for it again. + +### Create subscription validation test step + +This test step creates a subscription and ensures that the subscription the DSS returned in the API call is correct and well-formed. + +#### Create subscription check + +As per **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**, the DSS API must allow callers to create a valid subscription. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)** is not respected. + +#### Returned notification index is 0 check + +The notification index of a newly created subscription must be 0, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned ISA URL has correct base URL check + +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned start time is correct check + +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned end time is correct check + +The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Generated subscription version has proper format check + +The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +### Query Existing Subscription test step + +Query and search for the created subscription in various ways + +#### Get Subscription by ID check + +If the freshly created subscription cannot be queried using its ID, the DSS is failing to meet **[astm.f3411.v22a.DSS0030,e](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Search for all subscriptions in ISA area check + +If the DSS fails to let us search in the area for which the subscription was just created, it is failing to meet **[astm.f3411.v22a.DSS0030,f](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Created Subscription is in search results check + +If the created subscription is not returned in a search that covers the area it was created for, the DSS is not properly implementing **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### No huge search area allowed check + +In accordance with **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**, the DSS should not allow searches for areas that are too big. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)** is not respected. + +#### Returned notification index is equal to or greater than 0 check + +If the notification index of the subscription is less than 0, the DSS fails to properly implement **[interuss.f3411.dss_endpoints.GetSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned ISA URL has correct base URL check + +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned start time is correct check + +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned end time is correct check + +The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Generated subscription version has proper format check + +The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +### Delete Subscription test step + +Attempt to delete the subscription in various ways and ensure that the DSS reacts properly. + +This also checks that the subscription data returned by a successful deletion is correct. + +#### Missing version prevents deletion check + +An attempt to delete a subscription without providing a version should fail, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.DeleteSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Incorrect version prevents deletion check + +An attempt to delete a subscription while providing an incorrect version should fail, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.DeleteSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Subscription can be deleted check + +An attempt to delete a subscription when the correct version is provided should succeed, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.DeleteSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the deletion request, +**[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)** is not respected. + +#### Returned notification index is equal to or greater than 0 check + +If the notification index of the subscription is less than 0, the DSS fails to properly implement **[interuss.f3411.dss_endpoints.GetSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned ISA URL has correct base URL check + +The returned ISA URL must be prefixed with the USS base URL that was provided at subscription creation, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned start time is correct check + +The returned start time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Returned end time is correct check + +The returned end time must be the same as the provided one, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Generated subscription version has proper format check + +The subscription version generated by the DSS must be a lower-case alphanumeric string of 10 characters or more, otherwise the DSS is in violation of **[interuss.f3411.dss_endpoints.PutSubscription](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +### Query Deleted Subscription test step + +Attempt to query and search for the deleted subscription in various ways + +#### Query by subscription ID should fail check + +If the DSS provides a successful reply to a direct query for the deleted subscription, it is in violation of **[astm.f3411.v22a.DSS0030,e](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Search for all subscriptions in ISA area check + +If the DSS fails to let us search in the area for which the subscription was just created, it is failing to meet **[astm.f3411.v22a.DSS0030,f](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Search area that represents a loop is not allowed check + +The DSS should not allow us to search for subscriptions using a list of vertices describing a loop (first and last points in the list of vertices are the same), +otherwise it is failing to meet **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +#### Deleted subscription should not be present in search results check + +If the DSS returns the deleted subscription in a search that covers the area it was originally created for, the DSS is not properly implementing **[interuss.f3411.dss_endpoints.SearchSubscriptions](../../../../../requirements/interuss/f3411/dss_endpoints.md)**. + +## Cleanup + +The cleanup phase of this test scenario removes the subscription with the known test ID if it has not been removed before. + +#### Ensure subscription with test ID does not exist check + +If the DSS cannot be queried for the existing test ID, or if a subscription with that ID exists and it cannot be removed, +the DSS is likely not implementing **[astm.f3411.v22a.DSS0030,e](../../../../../requirements/astm/f3411/v22a.md)** or **[astm.f3411.v22a.DSS0030,d](../../../../../requirements/astm/f3411/v22a.md)** properly. diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_simple.py b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_simple.py new file mode 100644 index 0000000000..25f95e1d88 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_simple.py @@ -0,0 +1,8 @@ +from monitoring.uss_qualifier.scenarios.astm.netrid.common.dss.subscription_simple import ( + SubscriptionSimple as CommonSubscriptionSimple, +) +from monitoring.uss_qualifier.scenarios.scenario import TestScenario + + +class SubscriptionSimple(TestScenario, CommonSubscriptionSimple): + pass diff --git a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_validation.md b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_validation.md index d92aa31975..7df8283fdd 100644 --- a/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_validation.md +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_validation.md @@ -28,7 +28,7 @@ This step ensures that we remove any subscription that may already exist for the If the query for subscriptions fails, **[astm.f3411.v22a.DSS0030,f](../../../../../requirements/astm/f3411/v22a.md)** was not met. -#### Successful subscription deletion +#### Successful subscription deletion check If the deletion attempt fails, **[astm.f3411.v22a.DSS0030,d](../../../../../requirements/astm/f3411/v22a.md)** was not met. @@ -105,6 +105,6 @@ The cleanup phase of this test scenario will remove any subscription that may ha If the query for subscriptions fails, the "GET Subscriptions" portion of **[astm.f3411.v22a.DSS0030,f](../../../../../requirements/astm/f3411/v22a.md)** was not met. -### Successful subscription deletion +### Successful subscription deletion check If the deletion attempt fails, the "DELETE Subscription" portion of **[astm.f3411.v22a.DSS0030,d](../../../../../requirements/astm/f3411/v22a.md)** was not met. 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 26b8967611..3ee3003be1 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 @@ -38,6 +38,13 @@ actions: dss: dss id_generator: id_generator isa: isa + - test_scenario: + scenario_type: scenarios.astm.netrid.v19.dss.SubscriptionSimple + resources: + dss: dss + id_generator: id_generator + isa: isa + problematically_big_area: problematically_big_area - test_scenario: scenario_type: scenarios.astm.netrid.v19.DSSInteroperability resources: 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 6b159abb5e..61723b8915 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 @@ -38,6 +38,13 @@ actions: dss: dss id_generator: id_generator isa: isa + - test_scenario: + scenario_type: scenarios.astm.netrid.v22a.dss.SubscriptionSimple + resources: + dss: dss + id_generator: id_generator + isa: isa + problematically_big_area: problematically_big_area - test_scenario: scenario_type: scenarios.astm.netrid.v22a.DSSInteroperability resources: