diff --git a/monitoring/monitorlib/fetch/rid.py b/monitoring/monitorlib/fetch/rid.py index d8122b5404..2c1142a54e 100644 --- a/monitoring/monitorlib/fetch/rid.py +++ b/monitoring/monitorlib/fetch/rid.py @@ -614,6 +614,17 @@ def notification_index(self) -> int: f"Cannot retrieve notification_index using RID version {self.rid_version}" ) + @property + def owner(self) -> str: + if self.rid_version == RIDVersion.f3411_19: + return self.v19_value.owner + elif self.rid_version == RIDVersion.f3411_22a: + return self.v22a_value.owner + else: + raise NotImplementedError( + f"Cannot retrieve owner using RID version {self.rid_version}" + ) + class RIDQuery(ImplicitDict): v19_query: Optional[Query] = None 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..2a8aef41ca 100644 --- a/monitoring/uss_qualifier/requirements/interuss/f3411/dss_endpoints.md +++ b/monitoring/uss_qualifier/requirements/interuss/f3411/dss_endpoints.md @@ -4,3 +4,5 @@ While neither ASTM F3411-19 nor F3411-22a explicitly require DSS implementations * 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. * 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. +* SubscriptionInitialNotificationIndex: The DSS implementation under test must set the `notification_index` at 0 for any newly created subscription. +* SubscriptionVersionFormat: The DSS implementation under test must use a string of 10 or more lower-cased alphanumeric characters for the `version` field of a subscription. 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..9e648fba71 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/subscription_simple.py @@ -0,0 +1,772 @@ +import re +from datetime import datetime, timedelta +from typing import Dict, Any, List + +import loguru +import s2sphere + +from monitoring.monitorlib.fetch.rid import Subscription +from monitoring.monitorlib.mutate.rid import ChangedSubscription +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 + +# TODO check if this is something that needs to be configurable. +USS_QUALIFIER_OWNER = "uss_qualifier" + + +class SubscriptionSimple(GenericTestScenario): + """Based on prober/rid/v2/test_subscription_simple.py from the legacy prober tool.""" + + SUB_TYPE = register_resource_type(371, "Subscription") + + # Base identifier for the subscriptions that will be created + _base_sub_id: str + + _test_subscription_ids: List[str] + + # Base parameters used for subscription creation variations + _default_creation_params: Dict[str, Any] + + # Effective parameters used for each subscription, indexed by subscription ID + _sub_params_by_sub_id: Dict[str, Dict[str, Any]] + + # Keep track of the latest subscription returned by the DSS + _current_subscriptions: Dict[str, Subscription] + + # An area designed to be too big to be allowed to search by the DSS + _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._base_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]) + + # Prepare 4 different subscription ids: + self._test_subscription_ids = [ + self._base_sub_id[:-1] + f"{i}" for i in range(4) + ] + + self._default_creation_params = self._isa.get_new_subscription_params( + sub_id="", # subscription ID will need to be overwritten + # Set this slightly in the past: we will update the subscriptions + # to a later value that still needs to be roughly 'now' without getting into the future + start_time=datetime.now().astimezone() - timedelta(seconds=10), + duration=timedelta(minutes=10), + ) + + self._problematically_big_area = [ + vertex.as_s2sphere() + for vertex in problematically_big_area.specification.vertices + ] + + def run(self): + self.begin_test_scenario() + + loguru.logger.info("setup") + self._setup_case() + + self.begin_test_case("Subscription Simple") + + self.begin_test_step("Create subscription validation") + + loguru.logger.info("create") + self._create_and_validate_subs() + + self.end_test_step() + + loguru.logger.info("mutate") + self.begin_test_step("Mutate Subscription") + + self._test_mutate_subscriptions_shift_time() + self._test_mutate_subscriptions_change_area() + + self.end_test_step() + self.begin_test_step("Query Existing Subscription") + + loguru.logger.info("get") + self._test_get_sub() + loguru.logger.info("search") + self._test_valid_search_sub() + self._test_huge_area_search_sub() + + self.end_test_step() + + self.begin_test_step("Delete Subscription") + + loguru.logger.info("delete faulty") + self._test_delete_sub_faulty() + loguru.logger.info("delete") + self._test_delete_sub() + + self.end_test_step() + self.begin_test_step("Query Deleted Subscription") + + loguru.logger.info("get deleted") + self._test_get_deleted_sub() + loguru.logger.info("search deleted") + 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") + + # Multiple runs of the scenario seem to rely on the same instance of it: + # thus we need to reset the state of the scenario before running it. + self._current_subscriptions = {} + self._sub_params_by_sub_id = {} + + self._ensure_clean_workspace_step() + + self.end_test_case() + + def _ensure_clean_workspace_step(self): + self.begin_test_step("Ensure clean workspace") + # Start by dropping any active sub + self._ensure_no_active_subs_exist() + # Check for subscriptions that will collide with our IDs and drop them + self._ensure_test_sub_ids_do_not_exist() + self.end_test_step() + + def _ensure_test_sub_ids_do_not_exist(self): + """ + Ensures no subscription with the IDs we intend to use exist. + Note that expired subscriptions won't appear in searches, + which is why we need to explicitly test for their presence. + """ + for sub_id in self._test_subscription_ids: + # TODO migrate this to the two-check pattern when the utility has been migrated + with self.check( + "Ensure subscription with test ID does not exist", + [self._dss_wrapper.participant_id], + ) as check: + self._dss_wrapper.cleanup_sub(check, sub_id) + + def _ensure_no_active_subs_exist(self): + """Ensure that we don't currently have any other active subscriptions at the DSS: + as there is a limit on how many simultaneous subscriptions we can create, + we want to avoid potentially reaching the limit during this scenario.""" + + 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, + ) + + for sub_id, sub in subs_in_area.subscriptions.items(): + with self.check( + "Subscription can be deleted", [self._dss_wrapper.participant_id] + ) as check: + self._dss_wrapper.del_sub(check, sub_id, sub.version) + + def _create_and_validate_subs(self): + """ + Creates multiple subscriptions using the configured footprint and variants of undefined start and end time parameters: + + - no start and end time + - no start time, with end time + - with start time, no end time + - with both start and end time + + Note that this does not check for service areas in the response: this behavior is checked + in the isa_subscription_interactions scenario. + + When this function returns, four subscriptions are expected to be created at the DSS + """ + + # TODO the existing dss_wrapper put_sub function (and the underlying mutate.upsert_subscription it relies on) + # does not allow empty start/end times. We need to change that before we can test + # DSS behaviors with respect to missing optional parameters. + + # no_opt_params = self._default_creation_params.copy() + # no_opt_params["sub_id"] = self._test_subscription_ids[0] + # del no_opt_params["start_time"] + # del no_opt_params["end_time"] + # self._create_sub_with_params(no_opt_params) + # + # no_start_param = self._default_creation_params.copy() + # no_start_param["sub_id"] = self._test_subscription_ids[1] + # del no_start_param["start_time"] + # self._create_sub_with_params(no_start_param) + # + # no_end_param = self._default_creation_params.copy() + # no_end_param["sub_id"] = self._test_subscription_ids[2] + # del no_end_param["end_time"] + # self._create_sub_with_params(no_start_param) + + # Create the subscription with all parameters set: + all_set_params = self._default_creation_params.copy() + all_set_params["sub_id"] = self._test_subscription_ids[3] + self._create_sub_with_params(all_set_params) + + def _create_sub_with_params(self, creation_params: Dict[str, Any]): + with self.check( + "Create subscription", [self._dss_wrapper.participant_id] + ) as check: + newly_created = self._dss_wrapper.put_sub( + check, + **creation_params, + ) + loguru.logger.info(f"Created subscription {newly_created}") + # Check that what we get back is valid and corresponds to what we want to create + self._compare_upsert_resp_with_params( + creation_params["sub_id"], newly_created, creation_params, False + ) + + # Check that the notification index is 0 for a newly created subscription. + # Should the notification field be missing, we assume it will have defaulted to 0 on the DSS's side. + with self.check( + "Returned notification index is 0 if present", + [self._dss_wrapper.participant_id], + ) as check: + notif_index = newly_created.subscription.notification_index + if notif_index is not None and notif_index != 0: + check.record_failed( + f"Returned notification index was {notif_index} instead of 0", + Severity.High, + details="A subscription is expected to have a notification index of 0 when it is created" + f"Parameters used: {creation_params}", + query_timestamps=[newly_created.query.request.timestamp], + ) + + # Store the version of the subscription + self._current_subscriptions[ + creation_params["sub_id"] + ] = newly_created.subscription + # Store the parameters we used for that subscription + self._sub_params_by_sub_id[creation_params["sub_id"]] = creation_params + + def _compare_upsert_resp_with_params( + self, + sub_id: str, + creation_resp_under_test: ChangedSubscription, + creation_params: Dict[str, Any], + was_mutated: bool, + ): + """ + Verify that the response of the server is conforming to the spec and the parameters we used in the request. + """ + check_name = ( + "Response to subscription mutation contains a subscription" + if was_mutated + else "Response to subscription creation contains a subscription" + ) + with self.check( + check_name, + [self._dss_wrapper.participant_id], + ) as check: + if not creation_resp_under_test.subscription: + check.record_failed( + "Response to subscription creation did not contain a subscription", + Severity.High, + details="A subscription is expected to be returned in the response to a subscription creation request." + f"Parameters used: {creation_params}", + query_timestamps=[creation_resp_under_test.query.request.timestamp], + ) + + # Make sure the subscription corresponds to what we requested + self._validate_subscription( + sub_id, + creation_resp_under_test.subscription, + creation_params, + was_mutated=was_mutated, + query_timestamps=[creation_resp_under_test.query.request.timestamp], + ) + + def _test_mutate_subscriptions_shift_time(self): + """Mutate all existing subscriptions by adding 10 seconds to their start and end times""" + + for sub_id, sub in self._current_subscriptions.items(): + with self.check( + "Subscription can be mutated", [self._dss_wrapper.participant_id] + ) as check: + orig_params = self._sub_params_by_sub_id[sub_id].copy() + new_params = dict( + sub_id=sub_id, + area_vertices=orig_params["area_vertices"][ + :-1 + ], # remove the last vertex to change the footprint + alt_lo=orig_params["alt_lo"], + alt_hi=orig_params["alt_hi"], + start_time=sub.time_start + timedelta(seconds=10), + end_time=sub.time_end + timedelta(seconds=10), + uss_base_url=orig_params["uss_base_url"], + ) + mutated_sub_response = self._dss_wrapper.put_sub( + check, + sub_version=sub.version, + **new_params, + ) + + # Check that what we get back is valid and corresponds to what we want to create + self._compare_upsert_resp_with_params( + sub_id, mutated_sub_response, new_params, was_mutated=True + ) + # Store the version of the subscription + self._current_subscriptions[sub_id] = mutated_sub_response.subscription + # Update the parameters we used for that subscription + self._sub_params_by_sub_id[sub_id] = new_params + + def _test_mutate_subscriptions_change_area(self): + """ + Mutate all existing subscriptions by updating their footprint. + """ + for sub_id, sub in self._current_subscriptions.items(): + with self.check( + "Subscription can be mutated", [self._dss_wrapper.participant_id] + ) as check: + new_params = self._sub_params_by_sub_id[sub_id].copy() + + # Shift all previous vertices west by 0.001 degrees + new_params["area_vertices"] = [ + s2sphere.LatLng.from_degrees( + vertex.lat().degrees, vertex.lng().degrees - 0.001 + ) + for vertex in new_params["area_vertices"] + ] + mutated_sub_response = self._dss_wrapper.put_sub( + check, + sub_version=sub.version, + **new_params, + ) + + # Check that what we get back is valid and corresponds to what we want to create + self._compare_upsert_resp_with_params( + sub_id, mutated_sub_response, new_params, was_mutated=True + ) + # Store the version of the subscription + self._current_subscriptions[sub_id] = mutated_sub_response.subscription + # Update the parameters we used for that subscription + self._sub_params_by_sub_id[sub_id] = new_params + + def _test_get_sub(self): + """Retrieves the previously created Subscription by their ID and ensures that + the data obtained in the response is correct.""" + + for sub_id, sub_params in self._sub_params_by_sub_id.items(): + with self.check( + "Get Subscription by ID", [self._dss_wrapper.participant_id] + ) as check: + fetched_sub = self._dss_wrapper.get_sub( + check, + sub_id, + ) + + # Make sure the subscription corresponds to what we requested + self._validate_subscription_and_notif_index( + sub_id, + fetched_sub.subscription, + sub_params, + False, + [fetched_sub.query.request.timestamp], + ) + + 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, + ) + + for sub_id, sub_params in self._sub_params_by_sub_id.items(): + with self.check( + "Created Subscription is in search results", + [self._dss_wrapper.participant_id], + ) as check: + if sub_id not in subs_in_area.subscriptions: + check.record_failed( + "Created subscription is not present in search results", + Severity.High, + f"The subscription {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( + sub_id, + subs_in_area.subscriptions[sub_id], + sub_params, + False, + [subs_in_area.query.request.timestamp], + ) + + 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""" + for sub_id in self._current_subscriptions.keys(): + 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=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=sub_id, + sub_version="notacorrectversion", + ) + + def _test_delete_sub(self): + """Delete the subscriptions in the correct way""" + + for sub_id, sub in self._current_subscriptions.items(): + 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=sub_id, sub_version=sub.version + ) + # Make sure the returned subscription corresponds to what we created + self._validate_subscription_and_notif_index( + sub_id, + deleted_sub.subscription, + self._sub_params_by_sub_id[sub_id], + False, + [deleted_sub.query.request.timestamp], + ) + + self._current_subscriptions = {} + + def _test_get_deleted_sub(self): + """Try to retrieve the deleted subscription by its ID.""" + for sub_id in self._sub_params_by_sub_id.keys(): + 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=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: + for sub_id in self._sub_params_by_sub_id.keys(): + if sub_id in subs_in_area.subscriptions: + check.record_failed( + "A deleted subscription is still present in search results", + Severity.High, + f"The subscription {sub_id} was deleted, and thus not expected to be found in the search results." + f"Subscription IDs returned in search results: {subs_in_area.subscriptions.keys()}", + 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_id: str, + sub_under_test: Subscription, + creation_params: Dict[str, Any], + was_mutated: bool, + query_timestamps: List[datetime], + ): + """Compare the passed subscription with the data we specified when creating it""" + self._validate_subscription( + sub_id, sub_under_test, creation_params, was_mutated, query_timestamps + ) + + # Check the notification index is 0 or more, if it is present + # (notifications might have been sent out between the creation and subsequent query) + # Should the index be absent, we assume it to be 0 on the DSS's side. + 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 is not None + and 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" + f"Parameters used: {creation_params}", + query_timestamps=query_timestamps, + ) + + def _validate_subscription( + self, + sub_id: str, + sub_under_test: Subscription, + creation_params: Dict[str, Any], + was_mutated: bool, + query_timestamps: List[datetime], + ): + """ + Validate the subscription against the parameters used to create it. + + Args: + sub_id: ID of the subscription being validated + sub_under_test: subscription being validated + creation_params: parameters used to create or update the subscription + was_mutated: true if the resulting subscription is the result of a mutation or deletion + """ + + expect_start_time = creation_params["start_time"] + expect_end_time = creation_params["end_time"] + + with self.check( + "Returned subscription has an ID", [self._dss_wrapper.participant_id] + ) as check: + if not sub_under_test.id: + check.record_failed( + "Returned subscription had no ID", + Severity.High, + details="A subscription is expected to have an ID", + query_timestamps=query_timestamps, + ) + + with self.check( + "Returned subscription ID is correct", [self._dss_wrapper.participant_id] + ) as check: + if sub_under_test.id != sub_id: + check.record_failed( + "Returned subscription ID does not match provided one", + Severity.High, + f"Provided: {sub_id}, Returned: {sub_under_test.id}", + query_timestamps=query_timestamps, + ) + + with self.check( + "Returned subscription has an owner", [self._dss_wrapper.participant_id] + ) as check: + if not sub_under_test.owner: + check.record_failed( + "Returned subscription had no owner", + Severity.High, + details="A subscription is expected to have an owner", + query_timestamps=query_timestamps, + ) + + with self.check( + "Returned subscription owner is correct", [self._dss_wrapper.participant_id] + ) as check: + if sub_under_test.owner != USS_QUALIFIER_OWNER: + check.record_failed( + "Returned subscription owner does not match provided one", + Severity.High, + f"Provided: {USS_QUALIFIER_OWNER}, Returned: {sub_under_test.owner}", + query_timestamps=query_timestamps, + ) + + with self.check( + "Returned subscription has an ISA URL", [self._dss_wrapper.participant_id] + ) as check: + if not sub_under_test.isa_url: + check.record_failed( + "Returned subscription had no ISA URL", + Severity.High, + details="A subscription is expected to have an ISA URL", + query_timestamps=query_timestamps, + ) + + 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=query_timestamps, + ) + + with self.check( + "Returned subscription has a start time", [self._dss_wrapper.participant_id] + ) as check: + if not sub_under_test.time_start: + check.record_failed( + "Returned subscription had no start time", + Severity.High, + details="A subscription is expected to have a start time", + query_timestamps=query_timestamps, + ) + + with self.check( + "Returned subscription has an end time", [self._dss_wrapper.participant_id] + ) as check: + if not sub_under_test.time_end: + check.record_failed( + "Returned subscription had no end time", + Severity.High, + details="A subscription is expected to have an end time", + query_timestamps=query_timestamps, + ) + + with self.check( + "Returned start time is correct", [self._dss_wrapper.participant_id] + ) as check: + if ( + abs(sub_under_test.time_start - expect_start_time).total_seconds() + > TIME_TOLERANCE_SEC + ): + check.record_failed( + "Returned start time does not match provided one", + Severity.High, + f"Provided: {expect_start_time}, Returned: {sub_under_test.time_start}", + query_timestamps=query_timestamps, + ) + + with self.check( + "Returned end time is correct", [self._dss_wrapper.participant_id] + ) as check: + if ( + abs(sub_under_test.time_end - expect_end_time).total_seconds() + > TIME_TOLERANCE_SEC + ): + check.record_failed( + "Returned end time does not match provided one", + Severity.High, + f"Provided: {expect_end_time}, Returned: {sub_under_test.time_end}", + query_timestamps=query_timestamps, + ) + + with self.check( + "Returned subscription has a version", [self._dss_wrapper.participant_id] + ) as check: + if not sub_under_test.version: + check.record_failed( + "Returned subscription had no version", + Severity.High, + details="A subscription is expected to have a version", + query_timestamps=query_timestamps, + ) + + 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=query_timestamps, + ) + + # If the subscription was mutated, we compare the returned version with the previously stored one: + if was_mutated: + with self.check( + "Mutated subscription version is updated", + [self._dss_wrapper.participant_id], + ) as check: + if ( + sub_under_test.version + == self._current_subscriptions[sub_under_test.id] + ): + check.record_failed( + "Returned subscription version was not updated", + Severity.High, + f"Returned: {sub_under_test.version}, Expected: {self._current_subscriptions[sub_under_test.id]}", + query_timestamps=query_timestamps, + ) + elif sub_id in self._current_subscriptions.keys(): + with self.check( + "Non-mutated subscription keeps the same version", + [self._dss_wrapper.participant_id], + ) as check: + if ( + sub_under_test.version + != self._current_subscriptions[sub_under_test.id].version + ): + check.record_failed( + "Returned subscription version was updated", + Severity.High, + f"Returned: {sub_under_test.version}, Expected: {self._current_subscriptions[sub_under_test.id]}.", + query_timestamps=query_timestamps, + ) + + def cleanup(self): + self.begin_cleanup() + self._ensure_test_sub_ids_do_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..142f06ca17 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v19/dss/subscription_simple.md @@ -0,0 +1,402 @@ +# 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. + +#### Search for all subscriptions in ISA area check + +If the DSS fails to let us search in the area for which test subscriptions will be created, it is failing to properly implement **[astm.f3411.v19.DSS0030,f](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,d](../../../../../requirements/astm/f3411/v19.md)**. + +#### 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 multiple subscriptions, goes on to query and search for them, then deletes and searches for them again. + +### Create subscription validation test step + +This test step creates multiple subscriptions with different combinations of the optional end and start time parameters. + +All subscriptions are left on the DSS when this step ends, as they are expected to be present for the subsequent step. + +#### Create subscription check + +As per **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**, the DSS API must allow callers to create a subscription with either onr or both of the +start and end time missing, provided all the required parameters are valid. + +#### Response to subscription creation contains a subscription check + +As per **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**, upon creation of a subscription, +the newly created subscription must be part of its response. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription owner is correct check + +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + + +#### Returned notification index is 0 if present check + +The notification index of a newly created subscription must be 0, otherwise the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### 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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### 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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v19.DSS0060](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### 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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,f](../../../../../requirements/astm/f3411/v19.md)**. + +#### No huge search area allowed check + +In accordance with **[astm.f3411.v19.DSS0030,f](../../../../../requirements/astm/f3411/v19.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, +**[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** might not be respected. + +#### Returned subscription owner is correct check + +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** might not be 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 **[astm.f3411.v19.DSS0030,e](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### 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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### 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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v19.DSS0060](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Non-mutated subscription keeps the same version check + +If the version of the subscription is updated without there having been any mutation of the subscription, the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +### Mutate Subscription test step + +This test step mutates the previously created subscription to verify that the DSS reacts properly: notably, it checks that the subscription version is updated, +including for changes that are not directly visible, such as changing the subscription's footprint. + +#### Subscription can be mutated check + +If a subscription cannot be modified with a valid set of parameters, the DSS is failing to meet **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Response to subscription mutation contains a subscription check + +As per **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**, upon creation of a subscription, +the newly created subscription must be part of its response. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** might not be respected. + +#### Returned subscription owner is correct check + +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** might not be 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 **[astm.f3411.v19.DSS0030,e](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### 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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### 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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v19.DSS0060](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Mutated subscription version is updated check + +Following a mutation, the DSS needs to update the subscription version, otherwise it is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,d](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,d](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,d](../../../../../requirements/astm/f3411/v19.md)**. + + + +#### 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 **[astm.f3411.v19.DSS0030,e](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** might not be respected. + +#### Returned subscription owner is correct check + +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** might not be respected. + + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### 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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### 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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v19.DSS0060](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.md)** is not respected. + +#### Non-mutated subscription keeps the same version check + +If the version of the subscription is updated without there having been any mutation of the subscription, the DSS is in violation of **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,c](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,f](../../../../../requirements/astm/f3411/v19.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 **[astm.f3411.v19.DSS0030,f](../../../../../requirements/astm/f3411/v19.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..8231a8dac3 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/netrid/v22a/dss/subscription_simple.md @@ -0,0 +1,395 @@ +# 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. + +#### Search for all subscriptions in ISA area check + +If the DSS fails to let us search in the area for which test subscriptions will be created, it is failing to properly implement **[astm.f3411.v22a.DSS0030,f](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,d](../../../../../requirements/astm/f3411/v22a.md)**. + +#### 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 multiple subscriptions, goes on to query and search for them, then deletes and searches for them again. + +### Create subscription validation test step + +This test step creates multiple subscriptions with different combinations of the optional end and start time parameters. + +All subscriptions are left on the DSS when this step ends, as they are expected to be present for the subsequent step. + +#### Create subscription check + +As per **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**, the DSS API must allow callers to create a subscription with either onr or both of the +start and end time missing, provided all the required parameters are valid. + +#### Response to subscription creation contains a subscription check + +As per **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**, upon creation of a subscription, +the newly created subscription must be part of its response. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription owner is correct check + +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned notification index is 0 if present check + +The notification index of a newly created subscription must be 0, otherwise the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### 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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### 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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v22a.DSS0060](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### 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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,f](../../../../../requirements/astm/f3411/v22a.md)**. + +#### No huge search area allowed check + +In accordance with **[astm.f3411.v22a.DSS0030,f](../../../../../requirements/astm/f3411/v22a.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, +**[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** might not be respected. + +#### Returned subscription owner is correct check + +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** might not be 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 **[astm.f3411.v22a.DSS0030,e](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### 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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### 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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v22a.DSS0060](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Non-mutated subscription keeps the same version check + +If the version of the subscription is updated without there having been any mutation of the subscription, the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +### Mutate Subscription test step + +This test step mutates the previously created subscription to verify that the DSS reacts properly: notably, it checks that the subscription version is updated, +including for changes that are not directly visible, such as changing the subscription's footprint. + +#### Subscription can be mutated check + +If a subscription cannot be modified with a valid set of parameters, the DSS is failing to meet **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Response to subscription mutation contains a subscription check + +As per **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**, upon creation of a subscription, +the newly created subscription must be part of its response. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** might not be respected. + +#### Returned subscription owner is correct check + +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** might not be 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 **[astm.f3411.v22a.DSS0030,e](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### 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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### 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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v22a.DSS0060](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Mutated subscription version is updated check + +Following a mutation, the DSS needs to update the subscription version, otherwise it is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,d](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,d](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,d](../../../../../requirements/astm/f3411/v22a.md)**. + +#### 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 **[astm.f3411.v22a.DSS0030,e](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an ID check + +If the returned subscription has no ID, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription ID is correct check + +If the returned subscription ID does not correspond to the one specified in the creation parameters, +**[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Returned subscription has an owner check + +If the returned subscription has no owner set, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** might not be respected. + +#### Returned subscription owner is correct check + +If the returned subscription's owner does not correspond to the uss_qualifier, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** might not be respected. + + +#### Returned subscription has an ISA URL check + +If the returned subscription has no ISA URL defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### 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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a start time check + +If the returned subscription has no start time defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### 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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has an end time check + +Subscriptions need a defined end time in order to limit their duration: if the DSS omits to set the end time, it will be in violation of **[astm.f3411.v22a.DSS0060](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)**. + +#### Returned subscription has a version check + +If the returned subscription has no version defined, **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.md)** is not respected. + +#### Non-mutated subscription keeps the same version check + +If the version of the subscription is updated without there having been any mutation of the subscription, the DSS is in violation of **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,c](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,f](../../../../../requirements/astm/f3411/v22a.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 **[astm.f3411.v22a.DSS0030,f](../../../../../requirements/astm/f3411/v22a.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.md b/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md index 0b46d1d692..90e13b0fdf 100644 --- a/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md +++ b/monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md @@ -21,7 +21,7 @@ Checked in - astm
.f3411
.v19
+ astm
.f3411
.v19
DSS0030,a Implemented ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA @@ -34,17 +34,22 @@ DSS0030,c Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0030,d Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation + + + DSS0030,e + Implemented + ASTM NetRID DSS: Subscription Simple DSS0030,f Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0050 @@ -54,7 +59,7 @@ DSS0060 Implemented - ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0070 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 af009a680c..f4b71fa6b0 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 @@ -9,8 +9,9 @@ 3. Scenario: [ASTM NetRID DSS: ISA Expiry](../../../../scenarios/astm/netrid/v19/dss/isa_expiry.md) ([`scenarios.astm.netrid.v19.dss.ISAExpiry`](../../../../scenarios/astm/netrid/v19/dss/isa_expiry.py)) 4. Scenario: [ASTM NetRID DSS: ISA Subscription Interactions](../../../../scenarios/astm/netrid/v19/dss/isa_subscription_interactions.md) ([`scenarios.astm.netrid.v19.dss.ISASubscriptionInteractions`](../../../../scenarios/astm/netrid/v19/dss/isa_subscription_interactions.py)) 5. 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)) -6. 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)) -7. 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)) +6. Scenario: [ASTM NetRID DSS: Subscription Simple](../../../../scenarios/astm/netrid/v19/dss/subscription_simple.md) ([`scenarios.astm.netrid.v19.dss.SubscriptionSimple`](../../../../scenarios/astm/netrid/v19/dss/subscription_simple.py)) +7. Scenario: [ASTM F3411-19 NetRID DSS interoperability](../../../../scenarios/astm/netrid/v19/dss_interoperability.md) ([`scenarios.astm.netrid.v19.DSSInteroperability`](../../../../scenarios/astm/netrid/v19/dss_interoperability.py)) +8. Scenario: [ASTM NetRID DSS: 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) @@ -22,7 +23,7 @@ Checked in - astm
.f3411
.v19
+ astm
.f3411
.v19
DSS0030,a Implemented ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA @@ -35,17 +36,22 @@ DSS0030,c Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0030,d Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation + + + DSS0030,e + Implemented + ASTM NetRID DSS: Subscription Simple DSS0030,f Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0050 @@ -55,7 +61,7 @@ DSS0060 Implemented - ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0070 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.md b/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.md index 574c121027..7f48807af1 100644 --- a/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.md +++ b/monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.md @@ -21,7 +21,7 @@ Checked in - astm
.f3411
.v22a
+ astm
.f3411
.v22a
DSS0030 Implemented ASTM NetRID DSS: ISA Expiry @@ -39,17 +39,22 @@ DSS0030,c Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0030,d Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation + + + DSS0030,e + Implemented + ASTM NetRID DSS: Subscription Simple DSS0030,f Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0050 @@ -59,7 +64,7 @@ DSS0060 Implemented - ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0070 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 35c5476bfd..3260149234 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 @@ -9,8 +9,9 @@ 3. Scenario: [ASTM NetRID DSS: ISA Expiry](../../../../scenarios/astm/netrid/v22a/dss/isa_expiry.md) ([`scenarios.astm.netrid.v22a.dss.ISAExpiry`](../../../../scenarios/astm/netrid/v22a/dss/isa_expiry.py)) 4. Scenario: [ASTM NetRID DSS: ISA Subscription Interactions](../../../../scenarios/astm/netrid/v22a/dss/isa_subscription_interactions.md) ([`scenarios.astm.netrid.v22a.dss.ISASubscriptionInteractions`](../../../../scenarios/astm/netrid/v22a/dss/isa_subscription_interactions.py)) 5. 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)) -6. 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)) -7. 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)) +6. Scenario: [ASTM NetRID DSS: Subscription Simple](../../../../scenarios/astm/netrid/v22a/dss/subscription_simple.md) ([`scenarios.astm.netrid.v22a.dss.SubscriptionSimple`](../../../../scenarios/astm/netrid/v22a/dss/subscription_simple.py)) +7. Scenario: [ASTM F3411-22a NetRID DSS interoperability](../../../../scenarios/astm/netrid/v22a/dss_interoperability.md) ([`scenarios.astm.netrid.v22a.DSSInteroperability`](../../../../scenarios/astm/netrid/v22a/dss_interoperability.py)) +8. Scenario: [ASTM NetRID DSS: 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) @@ -22,7 +23,7 @@ Checked in - astm
.f3411
.v22a
+ astm
.f3411
.v22a
DSS0030 Implemented ASTM NetRID DSS: ISA Expiry @@ -40,17 +41,22 @@ DSS0030,c Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0030,d Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation + + + DSS0030,e + Implemented + ASTM NetRID DSS: Subscription Simple DSS0030,f Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0050 @@ -60,7 +66,7 @@ DSS0060 Implemented - ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0070 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: diff --git a/monitoring/uss_qualifier/suites/interuss/dss/all_tests.md b/monitoring/uss_qualifier/suites/interuss/dss/all_tests.md index f582f9ab1b..97356db2a5 100644 --- a/monitoring/uss_qualifier/suites/interuss/dss/all_tests.md +++ b/monitoring/uss_qualifier/suites/interuss/dss/all_tests.md @@ -19,7 +19,7 @@ Checked in - astm
.f3411
.v19
+ astm
.f3411
.v19
DSS0030,a Implemented ASTM F3411-19 NetRID DSS interoperability
ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA @@ -32,17 +32,22 @@ DSS0030,c Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0030,d Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation + + + DSS0030,e + Implemented + ASTM NetRID DSS: Subscription Simple DSS0030,f Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0050 @@ -52,7 +57,7 @@ DSS0060 Implemented - ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0070 @@ -200,7 +205,7 @@ ASTM NetRID DSS: ISA Expiry
ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Simple ISA
ASTM NetRID DSS: Submitted ISA Validations - astm
.f3411
.v22a
+ astm
.f3411
.v22a
DSS0030 Implemented ASTM NetRID DSS: ISA Expiry @@ -218,17 +223,22 @@ DSS0030,c Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0030,d Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation + + + DSS0030,e + Implemented + ASTM NetRID DSS: Subscription Simple DSS0030,f Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0050 @@ -238,7 +248,7 @@ DSS0060 Implemented - ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0070 diff --git a/monitoring/uss_qualifier/suites/uspace/network_identification.md b/monitoring/uss_qualifier/suites/uspace/network_identification.md index 28230fd3ac..364185fddd 100644 --- a/monitoring/uss_qualifier/suites/uspace/network_identification.md +++ b/monitoring/uss_qualifier/suites/uspace/network_identification.md @@ -16,7 +16,7 @@ Checked in - astm
.f3411
.v22a
+ astm
.f3411
.v22a
DSS0030 Implemented ASTM NetRID DSS: ISA Expiry @@ -34,17 +34,22 @@ DSS0030,c Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0030,d Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation + + + DSS0030,e + Implemented + ASTM NetRID DSS: Subscription Simple DSS0030,f Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0050 @@ -54,7 +59,7 @@ DSS0060 Implemented - ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0070 diff --git a/monitoring/uss_qualifier/suites/uspace/required_services.md b/monitoring/uss_qualifier/suites/uspace/required_services.md index 33c2a97919..b834989b1c 100644 --- a/monitoring/uss_qualifier/suites/uspace/required_services.md +++ b/monitoring/uss_qualifier/suites/uspace/required_services.md @@ -18,7 +18,7 @@ Checked in - astm
.f3411
.v22a
+ astm
.f3411
.v22a
DSS0030 Implemented ASTM NetRID DSS: ISA Expiry @@ -36,17 +36,22 @@ DSS0030,c Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0030,d Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation + + + DSS0030,e + Implemented + ASTM NetRID DSS: Subscription Simple DSS0030,f Implemented - ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: ISA Subscription Interactions
ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0050 @@ -56,7 +61,7 @@ DSS0060 Implemented - ASTM NetRID DSS: Subscription Validation + ASTM NetRID DSS: Subscription Simple
ASTM NetRID DSS: Subscription Validation DSS0070