Skip to content

Commit

Permalink
Merge remote-tracking branch 'interuss/main' into idempotency
Browse files Browse the repository at this point in the history
BenjaminPelletier committed Oct 13, 2023
2 parents c762dbf + 08502ce commit c8c8275
Showing 86 changed files with 1,487 additions and 2,287 deletions.
17 changes: 0 additions & 17 deletions interfaces/uss_qualifier/README.md

This file was deleted.

257 changes: 0 additions & 257 deletions interfaces/uss_qualifier/uss_qualifier.yaml

This file was deleted.

122 changes: 66 additions & 56 deletions monitoring/mock_uss/scdsc/routes_injection.py
Original file line number Diff line number Diff line change
@@ -10,9 +10,13 @@
from loguru import logger
import requests.exceptions

from monitoring.monitorlib.idempotency import idempotent_request

from monitoring.mock_uss.dynamic_configuration.configuration import get_locality
from uas_standards.astm.f3548.v21 import api
from uas_standards.astm.f3548.v21.api import (
OperationalIntent,
PutOperationalIntentDetailsParameters,
ImplicitSubscriptionParameters,
PutOperationalIntentReferenceParameters,
)
from uas_standards.interuss.automated_testing.scd.v1.api import (
InjectFlightRequest,
InjectFlightResponse,
@@ -26,34 +30,29 @@
CapabilitiesResponse,
OperationalIntentState,
)
from uas_standards.astm.f3548.v21 import api
from uas_standards.astm.f3548.v21.api import (
OperationalIntent,
PutOperationalIntentDetailsParameters,
ImplicitSubscriptionParameters,
PutOperationalIntentReferenceParameters,
)

from monitoring.mock_uss import webapp, require_config_value
from monitoring.mock_uss.auth import requires_scope
from monitoring.mock_uss.config import KEY_BASE_URL
from monitoring.mock_uss.dynamic_configuration.configuration import get_locality
from monitoring.mock_uss.scdsc import database, utm_client
from monitoring.mock_uss.scdsc.database import db
from monitoring.mock_uss.scdsc.flight_planning import (
validate_request,
check_for_disallowed_conflicts,
PlanningError,
op_intent_transition_valid,
)
from monitoring.mock_uss.scdsc.routes_scdsc import op_intent_from_flightrecord
from monitoring.monitorlib.geo import Polygon
from monitoring.monitorlib.geotemporal import Volume4D, Volume4DCollection
from monitoring.mock_uss.config import KEY_BASE_URL
from monitoring.monitorlib import versioning
from monitoring.monitorlib.clients import scd as scd_client
from monitoring.monitorlib.fetch import QueryError
from monitoring.monitorlib.geo import Polygon
from monitoring.monitorlib.geotemporal import Volume4D, Volume4DCollection
from monitoring.monitorlib.idempotency import idempotent_request
from monitoring.monitorlib.scd_automated_testing.scd_injection_api import (
SCOPE_SCD_QUALIFIER_INJECT,
)
from monitoring.mock_uss import webapp, require_config_value
from monitoring.mock_uss.auth import requires_scope
from monitoring.mock_uss.scdsc import database, utm_client
from monitoring.mock_uss.scdsc.database import db


require_config_value(KEY_BASE_URL)
@@ -185,7 +184,7 @@ def log(msg: str):
200,
)

# Check if this is an existing flight being modified
# If this is a change to an existing flight, acquire lock to that flight
log("Acquiring lock for flight")
deadline = datetime.utcnow() + DEADLOCK_TIMEOUT
while True:
@@ -211,60 +210,71 @@ def log(msg: str):
f"Deadlock in inject_flight while attempting to gain access to flight {flight_id}"
)

# Check the transition is valid
state_transition_from = (
OperationalIntentState(existing_flight.op_intent_reference.state)
if existing_flight
else None
)
state_transition_to = OperationalIntentState(req_body.operational_intent.state)
if not op_intent_transition_valid(state_transition_from, state_transition_to):
return (
InjectFlightResponse(
result=InjectFlightResponseResult.Rejected,
notes=f"Operational intent state transition from {state_transition_from} to {state_transition_to} is invalid",
),
200,
)

step_name = "performing unknown operation"
try:
# Check for operational intents in the DSS
step_name = "querying for operational intents"
log("Obtaining latest operational intent information")
v1 = Volume4DCollection.from_interuss_scd_api(
req_body.operational_intent.volumes
+ req_body.operational_intent.off_nominal_volumes
# Check the transition is valid
state_transition_from = (
OperationalIntentState(existing_flight.op_intent_reference.state)
if existing_flight
else None
)
vol4 = v1.bounding_volume.to_f3548v21()
op_intents = query_operational_intents(vol4)

# Check for intersections
step_name = "checking for intersections"
log(
f"Checking for intersections with {', '.join(op_intent.reference.id for op_intent in op_intents)}"
)
try:
check_for_disallowed_conflicts(
req_body, existing_flight, op_intents, locality, log
)
except PlanningError as e:
state_transition_to = OperationalIntentState(req_body.operational_intent.state)
if not op_intent_transition_valid(state_transition_from, state_transition_to):
return (
InjectFlightResponse(
result=InjectFlightResponseResult.ConflictWithFlight,
notes=str(e),
result=InjectFlightResponseResult.Rejected,
notes=f"Operational intent state transition from {state_transition_from} to {state_transition_to} is invalid",
),
200,
)

if req_body.operational_intent.state in (
OperationalIntentState.Accepted,
OperationalIntentState.Activated,
):
# Check for intersections if the flight is nominal

# Check for operational intents in the DSS
step_name = "querying for operational intents"
log("Obtaining latest operational intent information")
v1 = Volume4DCollection.from_interuss_scd_api(
req_body.operational_intent.volumes
+ req_body.operational_intent.off_nominal_volumes
)
vol4 = v1.bounding_volume.to_f3548v21()
op_intents = query_operational_intents(vol4)

# Check for intersections
step_name = "checking for intersections"
log(
f"Checking for intersections with {', '.join(op_intent.reference.id for op_intent in op_intents)}"
)
try:
check_for_disallowed_conflicts(
req_body, existing_flight, op_intents, locality, log
)
except PlanningError as e:
return (
InjectFlightResponse(
result=InjectFlightResponseResult.ConflictWithFlight,
notes=str(e),
),
200,
)

key = [op.reference.ovn for op in op_intents]
else:
# Flight is not nominal and therefore doesn't need to check intersections
key = []

# Create operational intent in DSS
step_name = "sharing operational intent in DSS"
log("Sharing operational intent with DSS")
base_url = "{}/mock/scd".format(webapp.config[KEY_BASE_URL])
req = PutOperationalIntentReferenceParameters(
extents=req_body.operational_intent.volumes
+ req_body.operational_intent.off_nominal_volumes,
key=[op.reference.ovn for op in op_intents],
key=key,
state=req_body.operational_intent.state,
uss_base_url=base_url,
new_subscription=ImplicitSubscriptionParameters(uss_base_url=base_url),
2 changes: 1 addition & 1 deletion monitoring/prober/infrastructure.py
Original file line number Diff line number Diff line change
@@ -100,7 +100,7 @@ def wrapper_default_scope(*args, **kwargs):
resource_type_code_descriptions: Dict[ResourceType, str] = {}


# Next code: 368
# Next code: 369
def register_resource_type(code: int, description: str) -> ResourceType:
"""Register that the specified code refers to the described resource.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .for_each_dss import ForEachDSS
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
from typing import Dict, List, Optional

from implicitdict import ImplicitDict

from monitoring.monitorlib.inspection import fullname
from monitoring.uss_qualifier.action_generators.documentation.definitions import (
PotentialGeneratedAction,
)
from monitoring.uss_qualifier.action_generators.documentation.documentation import (
list_potential_actions_for_action_declaration,
)
from monitoring.uss_qualifier.reports.report import TestSuiteActionReport
from monitoring.uss_qualifier.resources.astm.f3548.v21 import (
DSSInstancesResource,
DSSInstanceResource,
)

from monitoring.uss_qualifier.resources.definitions import ResourceID
from monitoring.uss_qualifier.resources.resource import (
ResourceType,
MissingResourceError,
)
from monitoring.uss_qualifier.suites.definitions import TestSuiteActionDeclaration
from monitoring.uss_qualifier.suites.suite import (
ActionGenerator,
TestSuiteAction,
ReactionToFailure,
)


class ForEachDSSSpecification(ImplicitDict):
action_to_repeat: TestSuiteActionDeclaration
"""Test suite action to run for each DSS instance"""

dss_instances_source: ResourceID
"""ID of the resource providing the single DSS instance"""

dss_instance_id: ResourceID
"""Resource IDs of DSS input to the action_to_repeat"""


class ForEachDSS(ActionGenerator[ForEachDSSSpecification]):
_actions: List[TestSuiteAction]
_current_action: int
_failure_reaction: ReactionToFailure

@classmethod
def list_potential_actions(
cls, specification: ForEachDSSSpecification
) -> List[PotentialGeneratedAction]:
return list_potential_actions_for_action_declaration(
specification.action_to_repeat
)

def __init__(
self,
specification: ForEachDSSSpecification,
resources: Dict[ResourceID, ResourceType],
):
if specification.dss_instances_source not in resources:
raise MissingResourceError(
f"Resource ID {specification.dss_instances_source} specified as `dss_instances_source` was not present in the available resource pool",
specification.dss_instances_source,
)
dss_instances_resource: DSSInstancesResource = resources[
specification.dss_instances_source
]
if not isinstance(dss_instances_resource, DSSInstancesResource):
raise ValueError(
f"Expected resource ID {specification.dss_instances_source} to be a {fullname(DSSInstancesResource)} but it was a {fullname(dss_instances_resource.__class__)} instead"
)
dss_instances = dss_instances_resource.dss_instances

self._actions = []
for dss_instance in dss_instances:
modified_resources = {k: v for k, v in resources.items()}
modified_resources[
specification.dss_instance_id
] = DSSInstanceResource.from_dss_instance(dss_instance)

self._actions.append(
TestSuiteAction(specification.action_to_repeat, modified_resources)
)

self._current_action = 0
self._failure_reaction = specification.action_to_repeat.on_failure

def run_next_action(self) -> Optional[TestSuiteActionReport]:
if self._current_action < len(self._actions):
report = self._actions[self._current_action].run()
self._current_action += 1
if not report.successful():
if self._failure_reaction == ReactionToFailure.Abort:
self._current_action = len(self._actions)
return report
else:
return None
1 change: 1 addition & 0 deletions monitoring/uss_qualifier/configurations/dev/f3548.yaml
Original file line number Diff line number Diff line change
@@ -13,6 +13,7 @@ v1:
priority_preemption_flights: priority_preemption_flights
invalid_flight_intents: invalid_flight_intents
dss: dss
dss_instances: dss_instances
artifacts:
tested_roles:
report_path: output/tested_roles_f3548
Original file line number Diff line number Diff line change
@@ -147,6 +147,19 @@ f3548:
participant_id: uss1
base_url: http://dss.uss1.localutm
has_private_address: true
dss_instances:
$content_schema: monitoring/uss_qualifier/resources/definitions/ResourceDeclaration.json
resource_type: resources.astm.f3548.v21.DSSInstancesResource
dependencies:
auth_adapter: utm_auth
specification:
dss_instances:
- participant_id: uss1
base_url: http://dss.uss1.localutm
has_private_address: true
- participant_id: uss2
base_url: http://dss.uss2.localutm
has_private_address: true

f3548_single_scenario:
uss1:
15 changes: 15 additions & 0 deletions monitoring/uss_qualifier/configurations/dev/library/resources.yaml
Original file line number Diff line number Diff line change
@@ -46,6 +46,21 @@ net_rid:
reference_time: '2023-01-10T00:00:00.123456+00:00'
time_start: '2023-01-10T00:00:01.123456+00:00'
time_end: '2023-01-10T01:00:01.123456+00:00'
problematically_big_area: # A huge (as in "too big") area for checks around area sizes
$content_schema: monitoring/uss_qualifier/resources/definitions/ResourceDeclaration.json
resource_type: resources.VerticesResource
specification:
vertices:
- lat: -23
lng: 130
- lat: -24
lng: 130
- lat: -24
lng: 132
- lat: -23
lng: 132



net_rid_sims:
adjacent_circular_flights_data:
Original file line number Diff line number Diff line change
@@ -15,6 +15,7 @@ v1:
dss_instances: netrid_dss_instances_v19
id_generator: id_generator
service_area: service_area
problematically_big_area: problematically_big_area
artifacts:
report:
report_path: output/report_netrid_v19.json
Original file line number Diff line number Diff line change
@@ -15,6 +15,7 @@ v1:
dss_instances: netrid_dss_instances_v22a
id_generator: id_generator
service_area: service_area
problematically_big_area: problematically_big_area
artifacts:
report:
report_path: output/report_netrid_v22a.json
Original file line number Diff line number Diff line change
@@ -80,6 +80,10 @@ <h2>Test run</h2>
<td>Participant</td>
<td>{{ participant_id }}</td>
</tr>
<tr>
<td>Other participants</td>
<td>{{ other_participants }}</td>
</tr>
<tr>
<td>Test run identifier</td>
<td>TR-{{ test_run.test_run_id[0:7] }}</td>
7 changes: 6 additions & 1 deletion monitoring/uss_qualifier/reports/tested_requirements.py
Original file line number Diff line number Diff line change
@@ -212,7 +212,8 @@ def generate_tested_requirements(
os.makedirs(config.output_path, exist_ok=True)
index_file = os.path.join(config.output_path, "index.html")

participant_ids = report.report.participant_ids()
participant_ids = list(report.report.participant_ids())
participant_ids.sort()
template = jinja_env.get_template("tested_requirements/test_run_report.html")
with open(index_file, "w") as f:
f.write(template.render(participant_ids=participant_ids))
@@ -235,10 +236,14 @@ def generate_tested_requirements(
)
_sort_breakdown(participant_breakdown)
participant_file = os.path.join(config.output_path, f"{participant_id}.html")
other_participants = ", ".join(
p for p in participant_ids if p != participant_id
)
with open(participant_file, "w") as f:
f.write(
template.render(
participant_id=participant_id,
other_participants=other_participants,
breakdown=participant_breakdown,
test_run=_compute_test_run_information(report),
)
1 change: 1 addition & 0 deletions monitoring/uss_qualifier/resources/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .vertices import VerticesResource
Original file line number Diff line number Diff line change
@@ -1 +1 @@
from .dss import DSSInstanceResource
from .dss import DSSInstanceResource, DSSInstancesResource
54 changes: 51 additions & 3 deletions monitoring/uss_qualifier/resources/astm/f3548/v21/dss.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from typing import Tuple, List
from __future__ import annotations
from typing import Tuple, List, Optional
from urllib.parse import urlparse

from implicitdict import ImplicitDict
@@ -24,6 +25,9 @@ class DSSInstanceSpecification(ImplicitDict):
base_url: str
"""Base URL for the DSS instance according to the ASTM F3548-21 API"""

has_private_address: Optional[bool]
"""Whether this DSS instance is expected to have a private address that is not publicly addressable."""

def __init__(self, *args, **kwargs):
super().__init__(**kwargs)
try:
@@ -34,16 +38,21 @@ def __init__(self, *args, **kwargs):

class DSSInstance(object):
participant_id: str
base_url: str
has_private_address: bool = False
client: infrastructure.UTMClientSession

def __init__(
self,
participant_id: str,
base_url: str,
has_private_address: Optional[bool],
auth_adapter: infrastructure.AuthAdapter,
):
self.participant_id = participant_id
self._base_url = base_url
self.base_url = base_url
if has_private_address is not None:
self.has_private_address = has_private_address
self.client = infrastructure.UTMClientSession(base_url, auth_adapter)

def find_op_intent(
@@ -82,6 +91,13 @@ def get_full_op_intent(
).operational_intent
return result, query

def is_same_as(self, other: DSSInstance) -> bool:
return (
self.participant_id == other.participant_id
and self.base_url == other.base_url
and self.has_private_address == other.has_private_address
)


class DSSInstanceResource(Resource[DSSInstanceSpecification]):
dss: DSSInstance
@@ -92,5 +108,37 @@ def __init__(
auth_adapter: AuthAdapterResource,
):
self.dss = DSSInstance(
specification.participant_id, specification.base_url, auth_adapter.adapter
specification.participant_id,
specification.base_url,
specification.get("has_private_address"),
auth_adapter.adapter,
)

@classmethod
def from_dss_instance(cls, dss_instance: DSSInstance) -> DSSInstanceResource:
self = cls.__new__(cls)
self.dss = dss_instance
return self


class DSSInstancesSpecification(ImplicitDict):
dss_instances: List[DSSInstanceSpecification]


class DSSInstancesResource(Resource[DSSInstancesSpecification]):
dss_instances: List[DSSInstance]

def __init__(
self,
specification: DSSInstancesSpecification,
auth_adapter: AuthAdapterResource,
):
self.dss_instances = [
DSSInstance(
s.participant_id,
s.base_url,
s.has_private_address,
auth_adapter.adapter,
)
for s in specification.dss_instances
]
21 changes: 21 additions & 0 deletions monitoring/uss_qualifier/resources/vertices.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
from typing import List

from implicitdict import ImplicitDict

from monitoring.monitorlib.geo import LatLngPoint
from monitoring.uss_qualifier.resources.resource import Resource


class VerticesSpecification(ImplicitDict):
"""Specifies a list of vertices representing a 2D area.
Useful for passing arbitrary areas to test scenarios."""

vertices: List[LatLngPoint]
"""Represents a 2D area"""


class VerticesResource(Resource[VerticesSpecification]):
specification: VerticesSpecification

def __init__(self, specification: VerticesSpecification):
self.specification = specification
Original file line number Diff line number Diff line change
@@ -11,27 +11,24 @@
from monitoring.uss_qualifier.resources.astm.f3411.dss import DSSInstanceResource
from monitoring.uss_qualifier.resources.interuss.id_generator import IDGeneratorResource
from monitoring.uss_qualifier.resources.netrid.service_area import ServiceAreaResource
from monitoring.uss_qualifier.resources import VerticesResource
from monitoring.uss_qualifier.scenarios.astm.netrid.dss_wrapper import DSSWrapper
from monitoring.uss_qualifier.scenarios.scenario import GenericTestScenario

HUGE_VERTICES: List[s2sphere.LatLng] = [
s2sphere.LatLng.from_degrees(lng=130, lat=-23),
s2sphere.LatLng.from_degrees(lng=130, lat=-24),
s2sphere.LatLng.from_degrees(lng=132, lat=-24),
s2sphere.LatLng.from_degrees(lng=132, lat=-23),
]


class ISASimple(GenericTestScenario):
"""Based on prober/rid/v2/test_isa_simple.py from the legacy prober tool."""

ISA_TYPE = register_resource_type(348, "ISA")

_huge_are: List[s2sphere.LatLng]

def __init__(
self,
dss: DSSInstanceResource,
id_generator: IDGeneratorResource,
isa: ServiceAreaResource,
problematically_big_area: VerticesResource,
):
super().__init__()
self._dss = (
@@ -46,6 +43,9 @@ def __init__(
self._isa_start_time = self._isa.shifted_time_start(now)
self._isa_end_time = self._isa.shifted_time_end(now)
self._isa_area = [vertex.as_s2sphere() for vertex in self._isa.footprint]
self._huge_area = [
v.as_s2sphere() for v in problematically_big_area.specification.vertices
]

def run(self):
self.begin_test_scenario()
@@ -362,7 +362,7 @@ def _search_huge_area_step():
_ = self._dss_wrapper.search_isas_expect_response_code(
check,
expected_error_codes={413},
area=HUGE_VERTICES,
area=self._huge_area,
)

self.end_test_step()
Original file line number Diff line number Diff line change
@@ -0,0 +1,329 @@
import copy
import datetime
from typing import Optional, List, Dict, Any

import arrow
import s2sphere
from uas_standards.astm.f3411 import v19, v22a

from monitoring.monitorlib.fetch import query_and_describe
from monitoring.monitorlib.mutate.rid import ChangedISA
from monitoring.monitorlib.rid import RIDVersion
from monitoring.prober.infrastructure import register_resource_type
from monitoring.uss_qualifier.common_data_definitions import Severity
from monitoring.uss_qualifier.resources import VerticesResource
from monitoring.uss_qualifier.resources.astm.f3411.dss import DSSInstanceResource
from monitoring.uss_qualifier.resources.interuss.id_generator import IDGeneratorResource
from monitoring.uss_qualifier.resources.netrid.service_area import ServiceAreaResource
from monitoring.uss_qualifier.scenarios.astm.netrid.common.dss import utils
from monitoring.uss_qualifier.scenarios.astm.netrid.dss_wrapper import DSSWrapper
from monitoring.uss_qualifier.scenarios.scenario import GenericTestScenario


class ISAValidation(GenericTestScenario):
"""Based on prober/rid/v2/test_isa_validation.py from the legacy prober tool."""

ISA_TYPE = register_resource_type(368, "ISA")

_huge_are: List[s2sphere.LatLng]

create_isa_path: str

write_scope: str

def __init__(
self,
dss: DSSInstanceResource,
id_generator: IDGeneratorResource,
isa: ServiceAreaResource,
problematically_big_area: VerticesResource,
):
super().__init__()
self._dss = (
dss.dss_instance
) # TODO: delete once _delete_isa_if_exists updated to use dss_wrapper
self._dss_wrapper = DSSWrapper(self, dss.dss_instance)
self._isa_id = id_generator.id_factory.make_id(ISAValidation.ISA_TYPE)
self._isa_version: Optional[str] = None
self._isa = isa.specification

now = arrow.utcnow().datetime
self._isa_start_time = self._isa.shifted_time_start(now)
self._isa_end_time = self._isa.shifted_time_end(now)
self._isa_area = [vertex.as_s2sphere() for vertex in self._isa.footprint]

self._huge_area = [
v.as_s2sphere() for v in problematically_big_area.specification.vertices
]

if self._dss.rid_version == RIDVersion.f3411_19:
self.create_isa_path = v19.api.OPERATIONS[
v19.api.OperationID.CreateSubscription
].path
self.write_scope = v19.constants.Scope.Write
elif self._dss.rid_version == RIDVersion.f3411_22a:
self.create_isa_path = v22a.api.OPERATIONS[
v22a.api.OperationID.CreateSubscription
].path
self.write_scope = v22a.constants.Scope.ServiceProvider
else:
ValueError(f"Unsupported RID version '{self._dss.rid_version}'")

def run(self):
self.begin_test_scenario()

self._setup_case()

self.begin_test_case("ISA Validation")
self.begin_test_step("ISA Validation")

(create_isa_url, json_body) = self._isa_huge_area_check()

self._isa_empty_vertices_check()
self._isa_start_time_in_past()
self._isa_start_time_after_time_end()
self._isa_vertices_are_valid()

self._isa_missing_outline(create_isa_url, json_body)
self._isa_missing_volume(create_isa_url, json_body)

self.end_test_step()
self.end_test_case()
self.end_test_scenario()

def _setup_case(self):
self.begin_test_case("Setup")

def _ensure_clean_workspace_step():
self.begin_test_step("Ensure clean workspace")

self._delete_isa_if_exists()

self.end_test_step()

_ensure_clean_workspace_step()

self.end_test_case()

def _delete_isa_if_exists(self):
utils.delete_isa_if_exists(
self,
isa_id=self._isa_id,
rid_version=self._dss.rid_version,
session=self._dss.client,
server_id=self._dss_wrapper.participant_id,
)

def _isa_huge_area_check(self) -> (str, Dict[str, Any]):
"""Returns the request's URL and json payload for subsequently re-using it.
It is of the following form (note that v19 and v22a have slight differences):
"extents": {
"volume": {
"outline_polygon": {
"vertices": [],
},
"altitude_lower": 20.0,
"altitude_upper": 400.0,
},
"time_start": <timestamp>,
"time_end": <timestamp>,
},
"uss_base_url": <base_url>,
"""

with self.check("ISA huge area", [self._dss_wrapper.participant_id]) as check:
q = self._dss_wrapper.put_isa_expect_response_code(
check=check,
expected_error_codes={400},
area_vertices=self._huge_area,
alt_lo=self._isa.altitude_min,
alt_hi=self._isa.altitude_max,
start_time=self._isa_start_time,
end_time=self._isa_end_time,
uss_base_url=self._isa.base_url,
isa_id=self._isa_id,
isa_version=self._isa_version,
)

return q.dss_query.query.request.url, q.dss_query.query.request.json

def _isa_empty_vertices_check(self):

with self.check(
"ISA empty vertices", [self._dss_wrapper.participant_id]
) as check:
self._dss_wrapper.put_isa_expect_response_code(
check=check,
expected_error_codes={400},
area_vertices=[],
alt_lo=self._isa.altitude_min,
alt_hi=self._isa.altitude_max,
start_time=self._isa_start_time,
end_time=self._isa_end_time,
uss_base_url=self._isa.base_url,
isa_id=self._isa_id,
isa_version=self._isa_version,
)

def _isa_start_time_in_past(self):
time_start = datetime.datetime.utcnow() - datetime.timedelta(minutes=10)
time_end = time_start + datetime.timedelta(minutes=60)

with self.check(
"ISA start time in the past", [self._dss_wrapper.participant_id]
) as check:
self._dss_wrapper.put_isa_expect_response_code(
check=check,
expected_error_codes={400},
area_vertices=self._isa_area,
alt_lo=self._isa.altitude_min,
alt_hi=self._isa.altitude_max,
start_time=time_start,
end_time=time_end,
uss_base_url=self._isa.base_url,
isa_id=self._isa_id,
isa_version=self._isa_version,
)

def _isa_start_time_after_time_end(self):
with self.check(
"ISA start time after end time", [self._dss_wrapper.participant_id]
) as check:
self._dss_wrapper.put_isa_expect_response_code(
check=check,
expected_error_codes={400},
area_vertices=self._isa_area,
alt_lo=self._isa.altitude_min,
alt_hi=self._isa.altitude_max,
start_time=self._isa.time_end.datetime,
end_time=self._isa.time_start.datetime,
uss_base_url=self._isa.base_url,
isa_id=self._isa_id,
isa_version=self._isa_version,
)

def _isa_vertices_are_valid(self):
INVALID_VERTICES: List[s2sphere.LatLng] = [
s2sphere.LatLng.from_degrees(lat=130, lng=-23),
s2sphere.LatLng.from_degrees(lat=130, lng=-24),
s2sphere.LatLng.from_degrees(lat=132, lng=-24),
s2sphere.LatLng.from_degrees(lat=132, lng=-23),
]

with self.check(
"ISA vertices are valid", [self._dss_wrapper.participant_id]
) as check:
self._dss_wrapper.put_isa_expect_response_code(
check=check,
expected_error_codes={400},
area_vertices=INVALID_VERTICES,
alt_lo=self._isa.altitude_min,
alt_hi=self._isa.altitude_max,
start_time=self._isa.time_start.datetime,
end_time=self._isa.time_end.datetime,
uss_base_url=self._isa.base_url,
isa_id=self._isa_id,
isa_version=self._isa_version,
)

def _isa_missing_outline(self, create_isa_url: str, json_body: Dict[str, Any]):
payload = copy.deepcopy(json_body)
if self._dss.rid_version == RIDVersion.f3411_19:
del payload["extents"]["spatial_volume"]["footprint"]
elif self._dss.rid_version == RIDVersion.f3411_22a:
del payload["extents"]["volume"]["outline_polygon"]

with self.check(
"ISA missing outline", [self._dss_wrapper.participant_id]
) as check:
q = query_and_describe(
client=self._dss.client,
verb="PUT",
url=create_isa_url,
scope=self.write_scope,
json=payload,
)
if self._dss.rid_version == RIDVersion.f3411_19:
rid_query = ChangedISA(v19_query=q)
elif self._dss.rid_version == RIDVersion.f3411_22a:
rid_query = ChangedISA(v22a_query=q)
else:
raise ValueError(f"Unknown RID version: {self._dss.rid_version}")

self._dss_wrapper._handle_query_result(
check=check,
q=rid_query,
fail_msg="ISA Creation with missing outline has unexpected result code",
required_status_code={400},
severity=Severity.High,
)

def _isa_missing_volume(self, create_isa_url: str, json_body: Dict[str, Any]):
payload = copy.deepcopy(json_body)
if self._dss.rid_version == RIDVersion.f3411_19:
del payload["extents"]["spatial_volume"]
elif self._dss.rid_version == RIDVersion.f3411_22a:
del payload["extents"]["volume"]

with self.check(
"ISA missing volume", [self._dss_wrapper.participant_id]
) as check:
q = query_and_describe(
client=self._dss.client,
verb="PUT",
url=create_isa_url,
scope=self.write_scope,
json=payload,
)
if self._dss.rid_version == RIDVersion.f3411_19:
rid_query = ChangedISA(v19_query=q)
elif self._dss.rid_version == RIDVersion.f3411_22a:
rid_query = ChangedISA(v22a_query=q)
else:
raise ValueError(f"Unknown RID version: {self._dss.rid_version}")

self._dss_wrapper._handle_query_result(
check=check,
q=rid_query,
fail_msg="ISA Creation with missing outline has unexpected result code",
required_status_code={400},
severity=Severity.High,
)

def _isa_missing_extents(self, create_isa_url: str, json_body: Dict[str, Any]):
payload = copy.deepcopy(json_body)
del payload["extents"]

with self.check(
"ISA missing extents", [self._dss_wrapper.participant_id]
) as check:
q = query_and_describe(
client=self._dss.client,
verb="PUT",
url=create_isa_url,
scope=self.write_scope,
json=payload,
)
if self._dss.rid_version == RIDVersion.f3411_19:
rid_query = ChangedISA(v19_query=q)
elif self._dss.rid_version == RIDVersion.f3411_22a:
rid_query = ChangedISA(v22a_query=q)
else:
raise ValueError(f"Unknown RID version: {self._dss.rid_version}")

self._dss_wrapper._handle_query_result(
check=check,
q=rid_query,
fail_msg="ISA Creation with missing outline has unexpected result code",
required_status_code={400},
severity=Severity.High,
)

def cleanup(self):
self.begin_cleanup()

self._delete_isa_if_exists()

self.end_cleanup()
62 changes: 62 additions & 0 deletions monitoring/uss_qualifier/scenarios/astm/netrid/common/dss/utils.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
from typing import Optional

from monitoring.monitorlib.fetch import rid as fetch
from monitoring.monitorlib.mutate import rid as mutate
from monitoring.monitorlib.infrastructure import UTMClientSession
from monitoring.monitorlib.rid import RIDVersion
from monitoring.uss_qualifier.common_data_definitions import Severity
from monitoring.uss_qualifier.scenarios.scenario import GenericTestScenario


def delete_isa_if_exists(
scenario: GenericTestScenario,
isa_id: str,
rid_version: RIDVersion,
session: UTMClientSession,
server_id: Optional[str] = None,
):
fetched = fetch.isa(
isa_id,
rid_version=rid_version,
session=session,
server_id=server_id,
)
scenario.record_query(fetched.query)
with scenario.check("Successful ISA query", [server_id]) as check:
if not fetched.success and fetched.status_code != 404:
check.record_failed(
"ISA information could not be retrieved",
Severity.High,
f"{server_id} DSS instance returned {fetched.status_code} when queried for ISA {isa_id}",
query_timestamps=[fetched.query.request.timestamp],
)

if fetched.success:
deleted = mutate.delete_isa(
isa_id,
fetched.isa.version,
rid_version,
session,
server_id=server_id,
)
scenario.record_query(deleted.dss_query.query)
for subscriber_id, notification in deleted.notifications.items():
scenario.record_query(notification.query)
with scenario.check("Removed pre-existing ISA", [server_id]) as check:
if not deleted.dss_query.success:
check.record_failed(
"Could not delete pre-existing ISA",
Severity.High,
f"Attempting to delete ISA {isa_id} from the {server_id} DSS returned error {deleted.dss_query.status_code}",
query_timestamps=[deleted.dss_query.query.request.timestamp],
)
for subscriber_url, notification in deleted.notifications.items():
with scenario.check("Notified subscriber", [subscriber_url]) as check:
# TODO: Find a better way to identify a subscriber who couldn't be notified
if not notification.success:
check.record_failed(
"Could not notify ISA subscriber",
Severity.Medium,
f"Attempting to notify subscriber for ISA {isa_id} at {subscriber_url} resulted in {notification.status_code}",
query_timestamps=[notification.query.request.timestamp],
)
100 changes: 98 additions & 2 deletions monitoring/uss_qualifier/scenarios/astm/netrid/dss_wrapper.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,17 @@
import datetime
import s2sphere

from typing import Optional, List, Set
from typing import Optional, List, Set, Dict, Any

from implicitdict import StringBasedDateTime

from monitoring.monitorlib import schema_validation
from monitoring.monitorlib.fetch import QueryError
from monitoring.monitorlib.fetch import (
QueryError,
Query,
RequestDescription,
ResponseDescription,
)
from monitoring.monitorlib.fetch.rid import (
FetchedSubscription,
FetchedSubscriptions,
@@ -15,6 +22,7 @@
from monitoring.monitorlib.mutate import rid as mutate
from monitoring.monitorlib.fetch import rid as fetch
from monitoring.monitorlib.mutate.rid import ISAChange, ChangedSubscription
from monitoring.monitorlib.rid import RIDVersion
from monitoring.uss_qualifier.common_data_definitions import Severity
from monitoring.uss_qualifier.resources.astm.f3411.dss import DSSInstance
from monitoring.uss_qualifier.scenarios.scenario import (
@@ -250,6 +258,43 @@ def get_isa_expect_response_code(

return isa

def put_isa_expect_response_code(
self,
check: PendingCheck,
expected_error_codes: Set[int],
area_vertices: List[s2sphere.LatLng],
alt_lo: float,
alt_hi: float,
start_time: datetime.datetime,
end_time: datetime.datetime,
uss_base_url: str,
isa_id: str,
isa_version: Optional[str] = None,
) -> ISAChange:
mutated_isa = mutate.put_isa(
area_vertices=area_vertices,
alt_lo=alt_lo,
alt_hi=alt_hi,
start_time=start_time,
end_time=end_time,
uss_base_url=uss_base_url,
isa_id=isa_id,
isa_version=isa_version,
rid_version=self._dss.rid_version,
utm_client=self._dss.client,
server_id=self._dss.participant_id,
)

self._handle_query_result(
check=check,
q=mutated_isa.dss_query,
fail_msg="ISA Put succeeded when expecting a failure",
required_status_code=expected_error_codes,
severity=Severity.High,
fail_details=f"The submitted query was expected to fail. Payload: {mutated_isa.dss_query.query.request.json}",
)
return mutated_isa

def put_isa(
self,
main_check: PendingCheck,
@@ -846,3 +891,54 @@ def cleanup_sub(
raise RuntimeError(
"DSS query was not successful, but a High Severity issue didn't interrupt execution"
)

def raw_request_with_expected_code(
self,
check: PendingCheck,
method: str,
url_path: str,
json: Dict[str, Any],
expected_error_codes: Set[int],
fail_msg: str,
) -> RIDQuery:
"""For passing raw requests to the underlying client.
Mostly useful for sending malformed requests when testing validations.
"""

req_descr = RequestDescription(
method=method,
url=url_path,
json=json,
timestamp=datetime.datetime.utcnow(),
)

resp = self._dss.client.put(url_path, json=json)

q = Query(
request=req_descr,
response=ResponseDescription(
code=resp.status_code,
json=resp.json(),
body=resp.content,
headers=resp.headers,
reported=StringBasedDateTime(datetime.datetime.utcnow()),
),
)
self._scenario.record_query(q)

if self._dss.rid_version == RIDVersion.f3411_19:
rid_query = RIDQuery(v19_query=q)
elif self._dss.rid_version == RIDVersion.f3411_22a:
rid_query = RIDQuery(v22a_query=q)
else:
raise ValueError(f"Unknown RID version: {self._dss.rid_version}")

self._handle_query_result(
check,
rid_query,
fail_msg,
expected_error_codes,
Severity.Medium,
)

return rid_query
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from .isa_simple import ISASimple
from .isa_validation import ISAValidation
from .subscription_validation import SubscriptionValidation
from .crdb_access import CRDBAccess
Original file line number Diff line number Diff line change
@@ -19,6 +19,10 @@ after its time of applicability.

[`ServiceAreaResource`](../../../../../resources/netrid/service_area.py) describing an ISA to be created.

### problematically_big_area

[`VerticesResource`](../../../../../resources/vertices.py) describing an area designed to be too big to be accepted by the DSS.

## Setup test case

### Ensure clean workspace test step
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# ASTM NetRID DSS: Submitted ISA Validations test scenario

## Overview

Perform basic operations on a single DSS instance to create an ISA and query it during its time of applicability and
after its time of applicability.

## Resources

### dss

[`DSSInstanceResource`](../../../../../resources/astm/f3411/dss.py) to be tested in this scenario.

### id_generator

[`IDGeneratorResource`](../../../../../resources/interuss/id_generator.py) providing the ISA ID for this scenario.

### isa

[`ServiceAreaResource`](../../../../../resources/netrid/service_area.py) describing an ISA to be created.

### problematically_big_area

[`VerticesResource`](../../../../../resources/vertices.py) describing an area designed to be too big to be accepted by the DSS.

## Setup test case

### Ensure clean workspace test step

This scenario creates an ISA with a known ID. This step ensures that ISA does not exist before the start of the main
part of the test.

#### Successful ISA query check

**[astm.f3411.v19.DSS0030](../../../../../requirements/astm/f3411/v19.md)** requires the implementation of the DSS endpoint enabling retrieval of information about a specific ISA; if the individual ISA cannot be retrieved and the error isn't a 404, then this requirement isn't met.

#### Removed pre-existing ISA check

If an ISA with the intended ID is already present in the DSS, it needs to be removed before proceeding with the test. If that ISA cannot be deleted, then the **[astm.f3411.v19.DSS0030](../../../../../requirements/astm/f3411/v19.md)** requirement to implement the ISA deletion endpoint might not be met.

#### Notified subscriber check

When a pre-existing ISA needs to be deleted to ensure a clean workspace, any subscribers to ISAs in that area must be notified (as specified by the DSS). If a notification cannot be delivered, then the **[astm.f3411.v19.NET0710](../../../../../requirements/astm/f3411/v19.md)** requirement to implement the POST ISAs endpoint isn't met.


## ISA Validation test case

### ISA Validation test step

#### ISA huge area check

Attempting to put a too large ISA should result in a 400.

#### ISA empty vertices check

An ISA with a empty `vertices` array in the `extents.spatial_volume.footprint` field of the ISA creation payload should not result in a successful submission.

#### ISA start time in the past check

The DSS must reject ISAs with start times in the past.

#### ISA start time after end time check

The DSS must reject ISAs for which the start time is after the end time.

#### ISA vertices are valid check

The DSS must reject ISAs with invalid vertices, such as vertices that have latitude or longitude outside meaningful ranges.

#### ISA missing outline check

If the outline polygon is missing from the `extents.spatial_volume.footprint` field in the payload of the ISA creation request,
the DSS is expected to reject the request.

#### ISA missing volume check

If the outline polygon is missing from the `extents.spatial_volume` field in the payload of the ISA creation request,
the DSS is expected to reject the request.

#### ISA missing extents check

If the `extents` field is missing from the payload of the ISA creation request,
the DSS is expected to reject the request.

## Cleanup

The cleanup phase of this test scenario attempts to remove the ISA if the test ended prematurely.

### Successful ISA query check

**[astm.f3411.v19.DSS0030](../../../../../requirements/astm/f3411/v19.md)** requires the implementation of the DSS endpoint enabling retrieval of information about a specific ISA; if the individual ISA cannot be retrieved and the error isn't a 404, then this requirement isn't met.

### Removed pre-existing ISA check

If an ISA with the intended ID is still present in the DSS, it needs to be removed before exiting the test. If that ISA cannot be deleted, then the **[astm.f3411.v19.DSS0030](../../../../../requirements/astm/f3411/v19.md)** requirement to implement the ISA deletion endpoint might not be met.

### Notified subscriber check

When an ISA is deleted, subscribers must be notified. If a subscriber cannot be notified, that subscriber USS did not correctly implement "POST Identification Service Area" in **[astm.f3411.v19.NET0730](../../../../../requirements/astm/f3411/v19.md)**.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from monitoring.uss_qualifier.scenarios.astm.netrid.common.dss.isa_validation import (
ISAValidation as CommonISAValidation,
)
from monitoring.uss_qualifier.scenarios.scenario import TestScenario


class ISAValidation(TestScenario, CommonISAValidation):
pass
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from .isa_simple import ISASimple
from .isa_validation import ISAValidation
from .subscription_validation import SubscriptionValidation
from .crdb_access import CRDBAccess
Original file line number Diff line number Diff line change
@@ -19,6 +19,10 @@ after its time of applicability.

[`ServiceAreaResource`](../../../../../resources/netrid/service_area.py) describing an ISA to be created.

### problematically_big_area

[`VerticesResource`](../../../../../resources/vertices.py) describing an area designed to be too big to be accepted by the DSS.

## Setup test case

### Ensure clean workspace test step
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
# ASTM NetRID DSS: Submitted ISA Validations test scenario

## Overview

Perform basic operations on a single DSS instance to create an ISA and query it during its time of applicability and
after its time of applicability.

## Resources

### dss

[`DSSInstanceResource`](../../../../../resources/astm/f3411/dss.py) to be tested in this scenario.

### id_generator

[`IDGeneratorResource`](../../../../../resources/interuss/id_generator.py) providing the ISA ID for this scenario.

### isa

[`ServiceAreaResource`](../../../../../resources/netrid/service_area.py) describing an ISA to be created.

### problematically_big_area

[`VerticesResource`](../../../../../resources/vertices.py) describing an area designed to be too big to be accepted by the DSS.

## Setup test case

### Ensure clean workspace test step

This scenario creates an ISA with a known ID. This step ensures that ISA does not exist before the start of the main
part of the test.

#### Successful ISA query check

**[astm.f3411.v22a.DSS0030](../../../../../requirements/astm/f3411/v22a.md)** requires the implementation of the DSS endpoint enabling retrieval of information about a specific ISA; if the individual ISA cannot be retrieved and the error isn't a 404, then this requirement isn't met.

#### Removed pre-existing ISA check

If an ISA with the intended ID is already present in the DSS, it needs to be removed before proceeding with the test. If that ISA cannot be deleted, then the **[astm.f3411.v22a.DSS0030](../../../../../requirements/astm/f3411/v22a.md)** requirement to implement the ISA deletion endpoint might not be met.

#### Notified subscriber check

When a pre-existing ISA needs to be deleted to ensure a clean workspace, any subscribers to ISAs in that area must be notified (as specified by the DSS). If a notification cannot be delivered, then the **[astm.f3411.v22a.NET0710](../../../../../requirements/astm/f3411/v22a.md)** requirement to implement the POST ISAs endpoint isn't met.


## ISA Validation test case

### ISA Validation test step

#### ISA huge area check

Attempting to put a too large ISA should result in a 400.

#### ISA empty vertices check

An ISA with a empty `vertices` array in the `extents.volume.outline_polygon` field of the ISA creation payload should not result in a successful submission.

#### ISA start time in the past check

The DSS must reject ISAs with start times in the past.

#### ISA start time after end time check

The DSS must reject ISAs for which the start time is after the end time.

#### ISA vertices are valid check

The DSS must reject ISAs with invalid vertices, such as vertices that have latitude or longitude outside meaningful ranges.

#### ISA missing outline check

If the outline polygon is missing from the `extents.volume.outline_polygon` field in the payload of the ISA creation request,
the DSS is expected to reject the request.

#### ISA missing volume check

If the outline polygon is missing from the `extents.volume` field in the payload of the ISA creation request,
the DSS is expected to reject the request.

#### ISA missing extents check

If the `extents` field is missing from the payload of the ISA creation request,
the DSS is expected to reject the request.

## Cleanup

The cleanup phase of this test scenario attempts to remove the ISA if the test ended prematurely.

### Successful ISA query check

**[astm.f3411.v22a.DSS0030](../../../../../requirements/astm/f3411/v22a.md)** requires the implementation of the DSS endpoint enabling retrieval of information about a specific ISA; if the individual ISA cannot be retrieved and the error isn't a 404, then this requirement isn't met.

### Removed pre-existing ISA check

If an ISA with the intended ID is still present in the DSS, it needs to be removed before exiting the test. If that ISA cannot be deleted, then the **[astm.f3411.v22a.DSS0030](../../../../../requirements/astm/f3411/v22a.md)** requirement to implement the ISA deletion endpoint might not be met.

### Notified subscriber check

When an ISA is deleted, subscribers must be notified. If a subscriber cannot be notified, that subscriber USS did not correctly implement "POST Identification Service Area" in **[astm.f3411.v22a.NET0730](../../../../../requirements/astm/f3411/v22a.md)**.
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from monitoring.uss_qualifier.scenarios.astm.netrid.common.dss.isa_validation import (
ISAValidation as CommonISAValidation,
)
from monitoring.uss_qualifier.scenarios.scenario import TestScenario


class ISAValidation(TestScenario, CommonISAValidation):
pass
1 change: 1 addition & 0 deletions monitoring/uss_qualifier/scenarios/astm/utm/__init__.py
Original file line number Diff line number Diff line change
@@ -5,3 +5,4 @@
from .nominal_planning.conflict_equal_priority_not_permitted.conflict_equal_priority_not_permitted import (
ConflictEqualPriorityNotPermitted,
)
from .dss_interoperability import DSSInteroperability
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# ASTM F3548-21 UTM DSS interoperability test scenario

## Overview

TODO: Complete with details once we check more than the prerequisites.

This scenario currently only checks that all specified DSS instances are publicly addressable and reachable.

## Resources

### primary_dss_instance

A resources.astm.f3548.v21.DSSInstanceResource containing the "primary" DSS instance for this scenario.

### all_dss_instances

A resources.astm.f3548.v21.DSSInstancesResource containing at least two DSS instances complying with ASTM F3548-21.

## Prerequisites test case

### Test environment requirements test step

#### DSS instance is publicly addressable check

As per **[astm.f3548.v21.DSS0300](../../../requirements/astm/f3548/v21.md)** the DSS instance should be publicly addressable.
As such, this check will fail if the resolved IP of the DSS host is a private IP address, unless that is explicitly
expected.

#### DSS instance is reachable check
As per **[astm.f3548.v21.DSS0300](../../../requirements/astm/f3548/v21.md)** the DSS instance should be publicly addressable.
As such, this check will fail if the DSS is not reachable with a dummy query.
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import ipaddress
import socket
from typing import List
from urllib.parse import urlparse

from uas_standards.astm.f3548.v21.api import Volume4D, Volume3D, Polygon, LatLngPoint

from monitoring.uss_qualifier.common_data_definitions import Severity
from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import (
DSSInstancesResource,
DSSInstanceResource,
DSSInstance,
)
from monitoring.uss_qualifier.scenarios.scenario import TestScenario

VERTICES: List[LatLngPoint] = [
LatLngPoint(lng=130.6205, lat=-23.6558),
LatLngPoint(lng=130.6301, lat=-23.6898),
LatLngPoint(lng=130.6700, lat=-23.6709),
LatLngPoint(lng=130.6466, lat=-23.6407),
]
SHORT_WAIT_SEC = 5


class DSSInteroperability(TestScenario):
_dss_primary: DSSInstance
_dss_others: List[DSSInstance]

def __init__(
self,
primary_dss_instance: DSSInstanceResource,
all_dss_instances: DSSInstancesResource,
):
super().__init__()
self._dss_primary = primary_dss_instance.dss
self._dss_others = [
dss
for dss in all_dss_instances.dss_instances
if not dss.is_same_as(primary_dss_instance.dss)
]

def run(self):

self.begin_test_scenario()

self.begin_test_case("Prerequisites")

self.begin_test_step("Test environment requirements")
self._test_env_reqs()
self.end_test_step()

self.end_test_case()

self.end_test_scenario()

def _test_env_reqs(self):
for dss in [self._dss_primary] + self._dss_others:
with self.check(
"DSS instance is publicly addressable", [dss.participant_id]
) as check:
parsed_url = urlparse(dss.base_url)
ip_addr = socket.gethostbyname(parsed_url.hostname)

if dss.has_private_address:
self.record_note(
f"{dss.participant_id}_private_address",
f"DSS instance (URL: {dss.base_url}, netloc: {parsed_url.netloc}, resolved IP: {ip_addr}) is declared as explicitly having a private address, skipping check",
)
elif ipaddress.ip_address(ip_addr).is_private:
check.record_failed(
summary=f"DSS host {parsed_url.netloc} is not publicly addressable",
severity=Severity.Medium,
participants=[dss.participant_id],
details=f"DSS (URL: {dss.base_url}, netloc: {parsed_url.netloc}, resolved IP: {ip_addr}) is not publicly addressable",
)

with self.check("DSS instance is reachable", [dss.participant_id]) as check:
# dummy search query
dss.find_op_intent(
extent=Volume4D(
volume=Volume3D(outline_polygon=Polygon(vertices=VERTICES))
)
)
6 changes: 3 additions & 3 deletions monitoring/uss_qualifier/suites/astm/netrid/f3411_19.md
Original file line number Diff line number Diff line change
@@ -94,7 +94,7 @@
<tr>
<td><a href="../../../requirements/astm/f3411/v19.md">DSS0030</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/netrid/v19/dss_interoperability.md">ASTM F3411-19 NetRID DSS interoperability</a><br><a href="../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v19/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a><br><a href="../../../scenarios/astm/netrid/v19/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
<td><a href="../../../scenarios/astm/netrid/v19/dss_interoperability.md">ASTM F3411-19 NetRID DSS interoperability</a><br><a href="../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v19/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a><br><a href="../../../scenarios/astm/netrid/v19/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a><br><a href="../../../scenarios/astm/netrid/v19/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
</tr>
<tr>
<td><a href="../../../requirements/astm/f3411/v19.md">DSS0050</a></td>
@@ -274,12 +274,12 @@
<tr>
<td><a href="../../../requirements/astm/f3411/v19.md">NET0710</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v19/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
<td><a href="../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v19/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a><br><a href="../../../scenarios/astm/netrid/v19/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
</tr>
<tr>
<td><a href="../../../requirements/astm/f3411/v19.md">NET0730</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a></td>
<td><a href="../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v19/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a></td>
</tr>
<tr>
<td rowspan="4" style="vertical-align:top;"><a href="../../../requirements/interuss/automated_testing/rid/injection.md">interuss<br>.automated_testing<br>.rid<br>.injection</a></td>
3 changes: 3 additions & 0 deletions monitoring/uss_qualifier/suites/astm/netrid/f3411_19.yaml
Original file line number Diff line number Diff line change
@@ -7,13 +7,15 @@ resources:
dss_instances: resources.astm.f3411.DSSInstancesResource
id_generator: resources.interuss.IDGeneratorResource
service_area: resources.netrid.ServiceAreaResource
problematically_big_area: resources.VerticesResource
actions:
- action_generator:
generator_type: action_generators.astm.f3411.ForEachDSS
resources:
dss_instances: dss_instances
id_generator: id_generator
service_area: service_area
problematically_big_area: problematically_big_area
specification:
action_to_repeat:
test_suite:
@@ -23,6 +25,7 @@ actions:
all_dss_instances: dss_instances
id_generator: id_generator
isa: service_area
problematically_big_area: problematically_big_area
on_failure: Continue
dss_instances_source: dss_instances
dss_instance_id: dss
Original file line number Diff line number Diff line change
@@ -5,9 +5,10 @@
## [Actions](../../../README.md#actions)

1. Scenario: [ASTM NetRID DSS: Simple ISA](../../../../scenarios/astm/netrid/v19/dss/isa_simple.md) ([`scenarios.astm.netrid.v19.dss.ISASimple`](../../../../scenarios/astm/netrid/v19/dss/isa_simple.py))
2. Scenario: [ASTM NetRID DSS: Subscription Validation](../../../../scenarios/astm/netrid/v19/dss/subscription_validation.md) ([`scenarios.astm.netrid.v19.dss.SubscriptionValidation`](../../../../scenarios/astm/netrid/v19/dss/subscription_validation.py))
3. Scenario: [ASTM F3411-19 NetRID DSS interoperability](../../../../scenarios/astm/netrid/v19/dss_interoperability.md) ([`scenarios.astm.netrid.v19.DSSInteroperability`](../../../../scenarios/astm/netrid/v19/dss_interoperability.py))
4. Scenario: [ASTM NetRID DSS: Direct CRDB access](../../../../scenarios/astm/netrid/v19/dss/crdb_access.md) ([`scenarios.astm.netrid.v19.dss.CRDBAccess`](../../../../scenarios/astm/netrid/v19/dss/crdb_access.py))
2. Scenario: [ASTM NetRID DSS: Submitted ISA Validations](../../../../scenarios/astm/netrid/v19/dss/isa_validation.md) ([`scenarios.astm.netrid.v19.dss.ISAValidation`](../../../../scenarios/astm/netrid/v19/dss/isa_validation.py))
3. Scenario: [ASTM NetRID DSS: Subscription Validation](../../../../scenarios/astm/netrid/v19/dss/subscription_validation.md) ([`scenarios.astm.netrid.v19.dss.SubscriptionValidation`](../../../../scenarios/astm/netrid/v19/dss/subscription_validation.py))
4. Scenario: [ASTM F3411-19 NetRID DSS interoperability](../../../../scenarios/astm/netrid/v19/dss_interoperability.md) ([`scenarios.astm.netrid.v19.DSSInteroperability`](../../../../scenarios/astm/netrid/v19/dss_interoperability.py))
5. Scenario: [ASTM NetRID DSS: Direct CRDB access](../../../../scenarios/astm/netrid/v19/dss/crdb_access.md) ([`scenarios.astm.netrid.v19.dss.CRDBAccess`](../../../../scenarios/astm/netrid/v19/dss/crdb_access.py))

## [Checked requirements](../../../README.md#checked-requirements)

@@ -92,7 +93,7 @@
<tr>
<td><a href="../../../../requirements/astm/f3411/v19.md">DSS0030</a></td>
<td>Implemented</td>
<td><a href="../../../../scenarios/astm/netrid/v19/dss_interoperability.md">ASTM F3411-19 NetRID DSS interoperability</a><br><a href="../../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../../scenarios/astm/netrid/v19/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a></td>
<td><a href="../../../../scenarios/astm/netrid/v19/dss_interoperability.md">ASTM F3411-19 NetRID DSS interoperability</a><br><a href="../../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../../scenarios/astm/netrid/v19/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a><br><a href="../../../../scenarios/astm/netrid/v19/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a></td>
</tr>
<tr>
<td><a href="../../../../requirements/astm/f3411/v19.md">DSS0050</a></td>
@@ -177,11 +178,11 @@
<tr>
<td><a href="../../../../requirements/astm/f3411/v19.md">NET0710</a></td>
<td>Implemented</td>
<td><a href="../../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a></td>
<td><a href="../../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../../scenarios/astm/netrid/v19/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a></td>
</tr>
<tr>
<td><a href="../../../../requirements/astm/f3411/v19.md">NET0730</a></td>
<td>Implemented</td>
<td><a href="../../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a></td>
<td><a href="../../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../../scenarios/astm/netrid/v19/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a></td>
</tr>
</table>
Original file line number Diff line number Diff line change
@@ -4,13 +4,22 @@ resources:
all_dss_instances: resources.astm.f3411.DSSInstancesResource?
id_generator: resources.interuss.IDGeneratorResource
isa: resources.netrid.ServiceAreaResource
problematically_big_area: resources.VerticesResource
actions:
- test_scenario:
scenario_type: scenarios.astm.netrid.v19.dss.ISASimple
resources:
dss: dss
id_generator: id_generator
isa: isa
problematically_big_area: problematically_big_area
- test_scenario:
scenario_type: scenarios.astm.netrid.v19.dss.ISAValidation
resources:
dss: dss
id_generator: id_generator
isa: isa
problematically_big_area: problematically_big_area
- test_scenario:
scenario_type: scenarios.astm.netrid.v19.dss.SubscriptionValidation
resources:
6 changes: 3 additions & 3 deletions monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.md
Original file line number Diff line number Diff line change
@@ -94,7 +94,7 @@
<tr>
<td><a href="../../../requirements/astm/f3411/v22a.md">DSS0030</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/netrid/v22a/dss_interoperability.md">ASTM F3411-22a NetRID DSS interoperability</a><br><a href="../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v22a/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a><br><a href="../../../scenarios/astm/netrid/v22a/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
<td><a href="../../../scenarios/astm/netrid/v22a/dss_interoperability.md">ASTM F3411-22a NetRID DSS interoperability</a><br><a href="../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v22a/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a><br><a href="../../../scenarios/astm/netrid/v22a/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a><br><a href="../../../scenarios/astm/netrid/v22a/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
</tr>
<tr>
<td><a href="../../../requirements/astm/f3411/v22a.md">DSS0050</a></td>
@@ -384,12 +384,12 @@
<tr>
<td><a href="../../../requirements/astm/f3411/v22a.md">NET0710</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v22a/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
<td><a href="../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v22a/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a><br><a href="../../../scenarios/astm/netrid/v22a/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
</tr>
<tr>
<td><a href="../../../requirements/astm/f3411/v22a.md">NET0730</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a></td>
<td><a href="../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v22a/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a></td>
</tr>
<tr>
<td rowspan="4" style="vertical-align:top;"><a href="../../../requirements/interuss/automated_testing/rid/injection.md">interuss<br>.automated_testing<br>.rid<br>.injection</a></td>
3 changes: 3 additions & 0 deletions monitoring/uss_qualifier/suites/astm/netrid/f3411_22a.yaml
Original file line number Diff line number Diff line change
@@ -7,13 +7,15 @@ resources:
dss_instances: resources.astm.f3411.DSSInstancesResource
id_generator: resources.interuss.IDGeneratorResource
service_area: resources.netrid.ServiceAreaResource
problematically_big_area: resources.VerticesResource
actions:
- action_generator:
generator_type: action_generators.astm.f3411.ForEachDSS
resources:
dss_instances: dss_instances
id_generator: id_generator
service_area: service_area
problematically_big_area: problematically_big_area
specification:
action_to_repeat:
test_suite:
@@ -23,6 +25,7 @@ actions:
all_dss_instances: dss_instances
id_generator: id_generator
isa: service_area
problematically_big_area: problematically_big_area
on_failure: Continue
dss_instances_source: dss_instances
dss_instance_id: dss
Original file line number Diff line number Diff line change
@@ -5,9 +5,10 @@
## [Actions](../../../README.md#actions)

1. Scenario: [ASTM NetRID DSS: Simple ISA](../../../../scenarios/astm/netrid/v22a/dss/isa_simple.md) ([`scenarios.astm.netrid.v22a.dss.ISASimple`](../../../../scenarios/astm/netrid/v22a/dss/isa_simple.py))
2. Scenario: [ASTM NetRID DSS: Subscription Validation](../../../../scenarios/astm/netrid/v22a/dss/subscription_validation.md) ([`scenarios.astm.netrid.v22a.dss.SubscriptionValidation`](../../../../scenarios/astm/netrid/v22a/dss/subscription_validation.py))
3. Scenario: [ASTM F3411-22a NetRID DSS interoperability](../../../../scenarios/astm/netrid/v22a/dss_interoperability.md) ([`scenarios.astm.netrid.v22a.DSSInteroperability`](../../../../scenarios/astm/netrid/v22a/dss_interoperability.py))
4. Scenario: [ASTM NetRID DSS: Direct CRDB access](../../../../scenarios/astm/netrid/v22a/dss/crdb_access.md) ([`scenarios.astm.netrid.v22a.dss.CRDBAccess`](../../../../scenarios/astm/netrid/v22a/dss/crdb_access.py))
2. Scenario: [ASTM NetRID DSS: Submitted ISA Validations](../../../../scenarios/astm/netrid/v22a/dss/isa_validation.md) ([`scenarios.astm.netrid.v22a.dss.ISAValidation`](../../../../scenarios/astm/netrid/v22a/dss/isa_validation.py))
3. Scenario: [ASTM NetRID DSS: Subscription Validation](../../../../scenarios/astm/netrid/v22a/dss/subscription_validation.md) ([`scenarios.astm.netrid.v22a.dss.SubscriptionValidation`](../../../../scenarios/astm/netrid/v22a/dss/subscription_validation.py))
4. Scenario: [ASTM F3411-22a NetRID DSS interoperability](../../../../scenarios/astm/netrid/v22a/dss_interoperability.md) ([`scenarios.astm.netrid.v22a.DSSInteroperability`](../../../../scenarios/astm/netrid/v22a/dss_interoperability.py))
5. Scenario: [ASTM NetRID DSS: Direct CRDB access](../../../../scenarios/astm/netrid/v22a/dss/crdb_access.md) ([`scenarios.astm.netrid.v22a.dss.CRDBAccess`](../../../../scenarios/astm/netrid/v22a/dss/crdb_access.py))

## [Checked requirements](../../../README.md#checked-requirements)

@@ -92,7 +93,7 @@
<tr>
<td><a href="../../../../requirements/astm/f3411/v22a.md">DSS0030</a></td>
<td>Implemented</td>
<td><a href="../../../../scenarios/astm/netrid/v22a/dss_interoperability.md">ASTM F3411-22a NetRID DSS interoperability</a><br><a href="../../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../../scenarios/astm/netrid/v22a/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a></td>
<td><a href="../../../../scenarios/astm/netrid/v22a/dss_interoperability.md">ASTM F3411-22a NetRID DSS interoperability</a><br><a href="../../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../../scenarios/astm/netrid/v22a/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a><br><a href="../../../../scenarios/astm/netrid/v22a/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a></td>
</tr>
<tr>
<td><a href="../../../../requirements/astm/f3411/v22a.md">DSS0050</a></td>
@@ -182,11 +183,11 @@
<tr>
<td><a href="../../../../requirements/astm/f3411/v22a.md">NET0710</a></td>
<td>Implemented</td>
<td><a href="../../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a></td>
<td><a href="../../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../../scenarios/astm/netrid/v22a/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a></td>
</tr>
<tr>
<td><a href="../../../../requirements/astm/f3411/v22a.md">NET0730</a></td>
<td>Implemented</td>
<td><a href="../../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a></td>
<td><a href="../../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../../scenarios/astm/netrid/v22a/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a></td>
</tr>
</table>
Original file line number Diff line number Diff line change
@@ -4,13 +4,22 @@ resources:
all_dss_instances: resources.astm.f3411.DSSInstancesResource?
id_generator: resources.interuss.IDGeneratorResource
isa: resources.netrid.ServiceAreaResource
problematically_big_area: resources.VerticesResource
actions:
- test_scenario:
scenario_type: scenarios.astm.netrid.v22a.dss.ISASimple
resources:
dss: dss
id_generator: id_generator
isa: isa
problematically_big_area: problematically_big_area
- test_scenario:
scenario_type: scenarios.astm.netrid.v22a.dss.ISAValidation
resources:
dss: dss
id_generator: id_generator
isa: isa
problematically_big_area: problematically_big_area
- test_scenario:
scenario_type: scenarios.astm.netrid.v22a.dss.SubscriptionValidation
resources:
24 changes: 24 additions & 0 deletions monitoring/uss_qualifier/suites/astm/utm/dss_probing.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
<!--This file is autogenerated via `make format`; do not change manually-->
# DSS testing for ASTM NetRID F3558-21 test suite
[`suites.astm.utm.dss_probing`](./dss_probing.yaml)

## [Actions](../../README.md#actions)

1. Scenario: [ASTM F3548-21 UTM DSS interoperability](../../../scenarios/astm/utm/dss_interoperability.md) ([`scenarios.astm.utm.DSSInteroperability`](../../../scenarios/astm/utm/dss_interoperability.py))

## [Checked requirements](../../README.md#checked-requirements)

<table>
<tr>
<th><a href="../../README.md#package">Package</a></th>
<th><a href="../../README.md#requirement">Requirement</a></th>
<th><a href="../../README.md#status">Status</a></th>
<th><a href="../../README.md#checked-in">Checked in</a></th>
</tr>
<tr>
<td rowspan="1" style="vertical-align:top;"><a href="../../../requirements/astm/f3548/v21.md">astm<br>.f3548<br>.v21</a></td>
<td><a href="../../../requirements/astm/f3548/v21.md">DSS0300</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/utm/dss_interoperability.md">ASTM F3548-21 UTM DSS interoperability</a></td>
</tr>
</table>
11 changes: 11 additions & 0 deletions monitoring/uss_qualifier/suites/astm/utm/dss_probing.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
name: DSS testing for ASTM NetRID F3558-21
resources:
dss: resources.astm.f3548.v21.DSSInstanceResource
all_dss_instances: resources.astm.f3548.v21.DSSInstancesResource?
actions:
- test_scenario:
scenario_type: scenarios.astm.utm.DSSInteroperability
resources:
primary_dss_instance: dss
all_dss_instances: all_dss_instances

15 changes: 11 additions & 4 deletions monitoring/uss_qualifier/suites/astm/utm/f3548_21.md
Original file line number Diff line number Diff line change
@@ -4,11 +4,13 @@

## [Actions](../../README.md#actions)

1. Action generator: [`action_generators.flight_planning.FlightPlannerCombinations`](../../../action_generators/flight_planning/planner_combinations.py)
1. Scenario: [Validation of operational intents](../../../scenarios/astm/utm/flight_intent_validation/flight_intent_validation.md) ([`scenarios.astm.utm.FlightIntentValidation`](../../../scenarios/astm/utm/flight_intent_validation/flight_intent_validation.py))
1. Action generator: [`action_generators.astm.f3548.ForEachDSS`](../../../action_generators/astm/f3548/for_each_dss.py)
1. Suite: [DSS testing for ASTM NetRID F3558-21](dss_probing.md) ([`suites.astm.utm.dss_probing`](dss_probing.yaml))
2. Action generator: [`action_generators.flight_planning.FlightPlannerCombinations`](../../../action_generators/flight_planning/planner_combinations.py)
1. Scenario: [Nominal planning: conflict with higher priority](../../../scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.md) ([`scenarios.astm.utm.ConflictHigherPriority`](../../../scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.py))
1. Scenario: [Validation of operational intents](../../../scenarios/astm/utm/flight_intent_validation/flight_intent_validation.md) ([`scenarios.astm.utm.FlightIntentValidation`](../../../scenarios/astm/utm/flight_intent_validation/flight_intent_validation.py))
3. Action generator: [`action_generators.flight_planning.FlightPlannerCombinations`](../../../action_generators/flight_planning/planner_combinations.py)
1. Scenario: [Nominal planning: conflict with higher priority](../../../scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.md) ([`scenarios.astm.utm.ConflictHigherPriority`](../../../scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.py))
4. Action generator: [`action_generators.flight_planning.FlightPlannerCombinations`](../../../action_generators/flight_planning/planner_combinations.py)
1. Scenario: [Nominal planning: not permitted conflict with equal priority](../../../scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.md) ([`scenarios.astm.utm.ConflictEqualPriorityNotPermitted`](../../../scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.py))

## [Checked requirements](../../README.md#checked-requirements)
@@ -21,11 +23,16 @@
<th><a href="../../README.md#checked-in">Checked in</a></th>
</tr>
<tr>
<td rowspan="18" style="vertical-align:top;"><a href="../../../requirements/astm/f3548/v21.md">astm<br>.f3548<br>.v21</a></td>
<td rowspan="19" style="vertical-align:top;"><a href="../../../requirements/astm/f3548/v21.md">astm<br>.f3548<br>.v21</a></td>
<td><a href="../../../requirements/astm/f3548/v21.md">DSS0005</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.md">Nominal planning: conflict with higher priority</a><br><a href="../../../scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.md">Nominal planning: not permitted conflict with equal priority</a><br><a href="../../../scenarios/astm/utm/flight_intent_validation/flight_intent_validation.md">Validation of operational intents</a></td>
</tr>
<tr>
<td><a href="../../../requirements/astm/f3548/v21.md">DSS0300</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/utm/dss_interoperability.md">ASTM F3548-21 UTM DSS interoperability</a></td>
</tr>
<tr>
<td><a href="../../../requirements/astm/f3548/v21.md">GEN0310</a></td>
<td>Implemented</td>
16 changes: 16 additions & 0 deletions monitoring/uss_qualifier/suites/astm/utm/f3548_21.yaml
Original file line number Diff line number Diff line change
@@ -2,12 +2,28 @@ name: ASTM F3548-21
resources:
flight_planners: resources.flight_planning.FlightPlannersResource
dss: resources.astm.f3548.v21.DSSInstanceResource
dss_instances: resources.astm.f3548.v21.DSSInstancesResource?
conflicting_flights: resources.flight_planning.FlightIntentsResource
priority_preemption_flights: resources.flight_planning.FlightIntentsResource
invalid_flight_intents: resources.flight_planning.FlightIntentsResource
nominal_planning_selector: resources.flight_planning.FlightPlannerCombinationSelectorResource?
priority_planning_selector: resources.flight_planning.FlightPlannerCombinationSelectorResource?
actions:
- action_generator:
generator_type: action_generators.astm.f3548.ForEachDSS
resources:
dss_instances: dss_instances
specification:
action_to_repeat:
test_suite:
suite_type: suites.astm.utm.dss_probing
resources:
dss: dss
all_dss_instances: dss_instances
on_failure: Continue
dss_instances_source: dss_instances
dss_instance_id: dss
on_failure: Continue
- action_generator:
generator_type: action_generators.flight_planning.FlightPlannerCombinations
resources:
7 changes: 6 additions & 1 deletion monitoring/uss_qualifier/suites/faa/uft/message_signing.md
Original file line number Diff line number Diff line change
@@ -18,11 +18,16 @@
<th><a href="../../README.md#checked-in">Checked in</a></th>
</tr>
<tr>
<td rowspan="18" style="vertical-align:top;"><a href="../../../requirements/astm/f3548/v21.md">astm<br>.f3548<br>.v21</a></td>
<td rowspan="19" style="vertical-align:top;"><a href="../../../requirements/astm/f3548/v21.md">astm<br>.f3548<br>.v21</a></td>
<td><a href="../../../requirements/astm/f3548/v21.md">DSS0005</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.md">Nominal planning: conflict with higher priority</a><br><a href="../../../scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.md">Nominal planning: not permitted conflict with equal priority</a><br><a href="../../../scenarios/astm/utm/flight_intent_validation/flight_intent_validation.md">Validation of operational intents</a></td>
</tr>
<tr>
<td><a href="../../../requirements/astm/f3548/v21.md">DSS0300</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/utm/dss_interoperability.md">ASTM F3548-21 UTM DSS interoperability</a></td>
</tr>
<tr>
<td><a href="../../../requirements/astm/f3548/v21.md">GEN0310</a></td>
<td>Implemented</td>
12 changes: 6 additions & 6 deletions monitoring/uss_qualifier/suites/interuss/dss/all_tests.md
Original file line number Diff line number Diff line change
@@ -92,7 +92,7 @@
<tr>
<td><a href="../../../requirements/astm/f3411/v19.md">DSS0030</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/netrid/v19/dss_interoperability.md">ASTM F3411-19 NetRID DSS interoperability</a><br><a href="../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v19/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a></td>
<td><a href="../../../scenarios/astm/netrid/v19/dss_interoperability.md">ASTM F3411-19 NetRID DSS interoperability</a><br><a href="../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v19/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a><br><a href="../../../scenarios/astm/netrid/v19/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a></td>
</tr>
<tr>
<td><a href="../../../requirements/astm/f3411/v19.md">DSS0050</a></td>
@@ -177,12 +177,12 @@
<tr>
<td><a href="../../../requirements/astm/f3411/v19.md">NET0710</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a></td>
<td><a href="../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v19/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a></td>
</tr>
<tr>
<td><a href="../../../requirements/astm/f3411/v19.md">NET0730</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a></td>
<td><a href="../../../scenarios/astm/netrid/v19/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v19/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a></td>
</tr>
<tr>
<td rowspan="34" style="vertical-align:top;"><a href="../../../requirements/astm/f3411/v22a.md">astm<br>.f3411<br>.v22a</a></td>
@@ -258,7 +258,7 @@
<tr>
<td><a href="../../../requirements/astm/f3411/v22a.md">DSS0030</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/netrid/v22a/dss_interoperability.md">ASTM F3411-22a NetRID DSS interoperability</a><br><a href="../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v22a/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a></td>
<td><a href="../../../scenarios/astm/netrid/v22a/dss_interoperability.md">ASTM F3411-22a NetRID DSS interoperability</a><br><a href="../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v22a/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a><br><a href="../../../scenarios/astm/netrid/v22a/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a></td>
</tr>
<tr>
<td><a href="../../../requirements/astm/f3411/v22a.md">DSS0050</a></td>
@@ -348,11 +348,11 @@
<tr>
<td><a href="../../../requirements/astm/f3411/v22a.md">NET0710</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a></td>
<td><a href="../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v22a/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a></td>
</tr>
<tr>
<td><a href="../../../requirements/astm/f3411/v22a.md">NET0730</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a></td>
<td><a href="../../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../../scenarios/astm/netrid/v22a/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a></td>
</tr>
</table>
7 changes: 6 additions & 1 deletion monitoring/uss_qualifier/suites/uspace/flight_auth.md
Original file line number Diff line number Diff line change
@@ -18,11 +18,16 @@
<th><a href="../README.md#checked-in">Checked in</a></th>
</tr>
<tr>
<td rowspan="18" style="vertical-align:top;"><a href="../../requirements/astm/f3548/v21.md">astm<br>.f3548<br>.v21</a></td>
<td rowspan="19" style="vertical-align:top;"><a href="../../requirements/astm/f3548/v21.md">astm<br>.f3548<br>.v21</a></td>
<td><a href="../../requirements/astm/f3548/v21.md">DSS0005</a></td>
<td>Implemented</td>
<td><a href="../../scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.md">Nominal planning: conflict with higher priority</a><br><a href="../../scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.md">Nominal planning: not permitted conflict with equal priority</a><br><a href="../../scenarios/astm/utm/flight_intent_validation/flight_intent_validation.md">Validation of operational intents</a></td>
</tr>
<tr>
<td><a href="../../requirements/astm/f3548/v21.md">DSS0300</a></td>
<td>Implemented</td>
<td><a href="../../scenarios/astm/utm/dss_interoperability.md">ASTM F3548-21 UTM DSS interoperability</a></td>
</tr>
<tr>
<td><a href="../../requirements/astm/f3548/v21.md">GEN0310</a></td>
<td>Implemented</td>
Original file line number Diff line number Diff line change
@@ -89,7 +89,7 @@
<tr>
<td><a href="../../requirements/astm/f3411/v22a.md">DSS0030</a></td>
<td>Implemented</td>
<td><a href="../../scenarios/astm/netrid/v22a/dss_interoperability.md">ASTM F3411-22a NetRID DSS interoperability</a><br><a href="../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../scenarios/astm/netrid/v22a/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a><br><a href="../../scenarios/astm/netrid/v22a/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
<td><a href="../../scenarios/astm/netrid/v22a/dss_interoperability.md">ASTM F3411-22a NetRID DSS interoperability</a><br><a href="../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../scenarios/astm/netrid/v22a/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a><br><a href="../../scenarios/astm/netrid/v22a/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a><br><a href="../../scenarios/astm/netrid/v22a/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
</tr>
<tr>
<td><a href="../../requirements/astm/f3411/v22a.md">DSS0050</a></td>
@@ -379,12 +379,12 @@
<tr>
<td><a href="../../requirements/astm/f3411/v22a.md">NET0710</a></td>
<td>Implemented</td>
<td><a href="../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../scenarios/astm/netrid/v22a/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
<td><a href="../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../scenarios/astm/netrid/v22a/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a><br><a href="../../scenarios/astm/netrid/v22a/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
</tr>
<tr>
<td><a href="../../requirements/astm/f3411/v22a.md">NET0730</a></td>
<td>Implemented</td>
<td><a href="../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a></td>
<td><a href="../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../scenarios/astm/netrid/v22a/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a></td>
</tr>
<tr>
<td rowspan="4" style="vertical-align:top;"><a href="../../requirements/interuss/automated_testing/rid/injection.md">interuss<br>.automated_testing<br>.rid<br>.injection</a></td>
13 changes: 9 additions & 4 deletions monitoring/uss_qualifier/suites/uspace/required_services.md
Original file line number Diff line number Diff line change
@@ -90,7 +90,7 @@
<tr>
<td><a href="../../requirements/astm/f3411/v22a.md">DSS0030</a></td>
<td>Implemented</td>
<td><a href="../../scenarios/astm/netrid/v22a/dss_interoperability.md">ASTM F3411-22a NetRID DSS interoperability</a><br><a href="../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../scenarios/astm/netrid/v22a/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a><br><a href="../../scenarios/astm/netrid/v22a/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
<td><a href="../../scenarios/astm/netrid/v22a/dss_interoperability.md">ASTM F3411-22a NetRID DSS interoperability</a><br><a href="../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../scenarios/astm/netrid/v22a/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a><br><a href="../../scenarios/astm/netrid/v22a/dss/subscription_validation.md">ASTM NetRID DSS: Subscription Validation</a><br><a href="../../scenarios/astm/netrid/v22a/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
</tr>
<tr>
<td><a href="../../requirements/astm/f3411/v22a.md">DSS0050</a></td>
@@ -380,19 +380,24 @@
<tr>
<td><a href="../../requirements/astm/f3411/v22a.md">NET0710</a></td>
<td>Implemented</td>
<td><a href="../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../scenarios/astm/netrid/v22a/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
<td><a href="../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../scenarios/astm/netrid/v22a/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a><br><a href="../../scenarios/astm/netrid/v22a/nominal_behavior.md">ASTM NetRID nominal behavior</a></td>
</tr>
<tr>
<td><a href="../../requirements/astm/f3411/v22a.md">NET0730</a></td>
<td>Implemented</td>
<td><a href="../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a></td>
<td><a href="../../scenarios/astm/netrid/v22a/dss/isa_simple.md">ASTM NetRID DSS: Simple ISA</a><br><a href="../../scenarios/astm/netrid/v22a/dss/isa_validation.md">ASTM NetRID DSS: Submitted ISA Validations</a></td>
</tr>
<tr>
<td rowspan="18" style="vertical-align:top;"><a href="../../requirements/astm/f3548/v21.md">astm<br>.f3548<br>.v21</a></td>
<td rowspan="19" style="vertical-align:top;"><a href="../../requirements/astm/f3548/v21.md">astm<br>.f3548<br>.v21</a></td>
<td><a href="../../requirements/astm/f3548/v21.md">DSS0005</a></td>
<td>Implemented</td>
<td><a href="../../scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.md">Nominal planning: conflict with higher priority</a><br><a href="../../scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.md">Nominal planning: not permitted conflict with equal priority</a><br><a href="../../scenarios/astm/utm/flight_intent_validation/flight_intent_validation.md">Validation of operational intents</a></td>
</tr>
<tr>
<td><a href="../../requirements/astm/f3548/v21.md">DSS0300</a></td>
<td>Implemented</td>
<td><a href="../../scenarios/astm/utm/dss_interoperability.md">ASTM F3548-21 UTM DSS interoperability</a></td>
</tr>
<tr>
<td><a href="../../requirements/astm/f3548/v21.md">GEN0310</a></td>
<td>Implemented</td>
22 changes: 0 additions & 22 deletions monitoring/uss_qualifier/webapp/LOGIN.md

This file was deleted.

27 changes: 0 additions & 27 deletions monitoring/uss_qualifier/webapp/OAUTH2_CONFIG_POSTMAN.md

This file was deleted.

66 changes: 0 additions & 66 deletions monitoring/uss_qualifier/webapp/README.md

This file was deleted.

9 changes: 0 additions & 9 deletions monitoring/uss_qualifier/webapp/__init__.py

This file was deleted.

Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
32 changes: 0 additions & 32 deletions monitoring/uss_qualifier/webapp/config.py

This file was deleted.

15 changes: 0 additions & 15 deletions monitoring/uss_qualifier/webapp/debug_host.py

This file was deleted.

Loading

0 comments on commit c8c8275

Please sign in to comment.