Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,4 @@
)
from .subscription_simple import SubscriptionSimple as SubscriptionSimple
from .subscription_validation import SubscriptionValidation as SubscriptionValidation
from .uss_availability_simple import UssAvailabilitySimple as UssAvailabilitySimple
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# USS Availability Read test step fragment

This fragment contains the steps for the USS Availability synchronization scenario
This fragment contains the steps for the USS Availability scenario
where we confirm that a USS availability can be correctly read from a DSS instance

## 🛑 USS Availability can be requested check
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# USS Availability Read test step fragment
# USS Availability Update test step fragment

This fragment contains the steps for the USS Availability synchronization scenario
This fragment contains the steps for the USS Availability scenario
where we confirm that a USS availability can be correctly read from a DSS instance

## 🛑 USS Availability can be updated check
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def __init__(
"""
super().__init__()
scopes_primary = {
Scope.AvailabilityArbitration: "Set and read USS availability states"
Scope.AvailabilityArbitration: "set and read USS availability states"
}
scopes_read = {Scope.StrategicCoordination: "read USS availability states"}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
# ASTM Availability DSS: USS Availability Simple test scenario

## Overview

Verifies the behavior of a DSS for simple interactions pertaining to USS availability status.

## Resources

### dss

[`DSSInstanceResource`](../../../../resources/astm/f3548/v21/dss.py) the DSS instance through which entities are created, modified and deleted.

### client_identity

[`ClientIdentityResource`](../../../../resources/communications/client_identity.py) the client identity with the `utm.availability_arbitration` scope that will be used to report the availability status.

## Update USS availability state test case

### Declare USS as available at DSS test step

#### [Availability can be read](./fragments/availability/read.md)

#### [Availability can be updated](./fragments/availability/update.md)

## Update requires correct version test case

Test DSS behavior when update requests are not providing the required version.

### Attempt update with missing version test step

This step verifies that an existing USS availability status cannot be mutated with a missing version.

#### 🛑 Request to update USS availability status with empty version fails check

If the DSS under test allows the qualifier to update the USS availability status with a request that provided an empty version, it is in violation of **[astm.f3548.v21.DSS0100,1](../../../../requirements/astm/f3548/v21.md)**

### Attempt update with incorrect version test step

This step verifies that an existing OIR cannot be mutated with an incorrect version.

#### 🛑 Request to update USS availability status with incorrect version fails check

If the DSS under test allows the qualifier to update the USS availability status with a request that provided an incorrect version,
it is in violation of **[astm.f3548.v21.DSS0005,1](../../../../requirements/astm/f3548/v21.md)**
Original file line number Diff line number Diff line change
@@ -0,0 +1,135 @@
from uas_standards.astm.f3548.v21.api import UssAvailabilityState
from uas_standards.astm.f3548.v21.constants import Scope

from monitoring.monitorlib.fetch import QueryError
from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import (
DSSInstance,
DSSInstanceResource,
)
from monitoring.uss_qualifier.resources.communications import ClientIdentityResource
from monitoring.uss_qualifier.scenarios.astm.utm.dss.test_step_fragments import (
get_uss_availability,
set_uss_availability,
)
from monitoring.uss_qualifier.scenarios.scenario import TestScenario
from monitoring.uss_qualifier.suites.suite import ExecutionContext


class UssAvailabilitySimple(TestScenario):
"""
A scenario that verifies that USS availability status cannot be updated with the incorrect version.
"""

_dss: DSSInstance

_uss_id: str

def __init__(
self,
dss: DSSInstanceResource,
client_identity: ClientIdentityResource,
):
"""
Args:
dss: dss to test
id_generator: will let us generate specific identifiers
client_identity: tells us the identity we should expect as an entity's manager
"""
super().__init__()
scopes: dict[str, str] = {
Scope.AvailabilityArbitration: "read and set availability for a USS"
}

self._dss = dss.get_instance(scopes)
self._pid = [self._dss.participant_id]

self._uss_id = client_identity.subject()

def run(self, context: ExecutionContext):
self.begin_test_scenario(context)

self.begin_test_case("Update USS availability state")
self._step_declare_uss_available()
self.end_test_case()

self.begin_test_case("Update requires correct version")
self._step_attempt_update_missing_version()
self._step_attempt_update_incorrect_version()
self.end_test_case()

def _step_declare_uss_available(self):
self.begin_test_step("Declare USS as available at DSS")
_, version = get_uss_availability(
self,
self._dss,
self._uss_id,
Scope.AvailabilityArbitration,
)
set_uss_availability(
self, self._dss, self._uss_id, UssAvailabilityState.Normal, version
)
self.end_test_step()

def _step_attempt_update_missing_version(self):
self.begin_test_step("Attempt update with missing version")
with self.check(
"Request to update USS availability status with empty version fails",
self._pid,
) as check:
try:
_, q = self._dss.set_uss_availability(
self._uss_id,
UssAvailabilityState.Down,
"",
)
self.record_query(q)
# We don't expect the reach this point:
check.record_failed(
summary="Set USS availability with missing version was not expected to succeed",
details=f"Was expecting an HTTP 409 response because of an missing version, but got {q.status_code} instead",
query_timestamps=[q.request.timestamp],
)
except QueryError as qe:
self.record_queries(qe.queries)
if qe.cause_status_code == 409:
# The spec explicitly requests a 409 response code for incorrect OVNs.
pass
else:
check.record_failed(
summary="Set USS availability with missing version failed for unexpected reason",
details=f"Was expecting an HTTP 409 response because of an missing version, but got {qe.cause_status_code} instead",
query_timestamps=qe.query_timestamps,
)
self.end_test_step()

def _step_attempt_update_incorrect_version(self):
self.begin_test_step("Attempt update with incorrect version")
with self.check(
"Request to update USS availability status with incorrect version fails",
self._pid,
) as check:
try:
_, q = self._dss.set_uss_availability(
self._uss_id,
UssAvailabilityState.Down,
"ThisIsAnIncorrectVersion",
)
self.record_query(q)
# We don't expect the reach this point:
check.record_failed(
summary="Set USS availability with incorrect version was not expected to succeed",
details=f"Was expecting an HTTP 409 response because of an incorrect version, but got {q.status_code} instead",
query_timestamps=[q.request.timestamp],
)
except QueryError as qe:
self.record_queries(qe.queries)
if qe.cause_status_code == 409:
# The spec explicitly requests a 409 response code for incorrect OVNs.
pass
else:
check.record_failed(
summary="Set USS availability with incorrect version failed for unexpected reason",
details=f"Was expecting an HTTP 409 response because of an incorrect version, but got {qe.cause_status_code} instead",
query_timestamps=qe.query_timestamps,
)
self.end_test_step()
5 changes: 3 additions & 2 deletions monitoring/uss_qualifier/suites/astm/utm/dss_probing.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
18. Scenario: [ASTM UTM DSS: Direct datastore access](../../../scenarios/astm/utm/dss/datastore_access.md) ([`scenarios.astm.utm.dss.DatastoreAccess`](../../../scenarios/astm/utm/dss/datastore_access.py))
19. Scenario: [OVN Request Optional Extension to ASTM F3548-21](../../../scenarios/interuss/ovn_request/dss_ovn_request.md) ([`scenarios.interuss.ovn_request.DSSOVNRequest`](../../../scenarios/interuss/ovn_request/dss_ovn_request.py))
20. Scenario: [ASTM SCD DSS: Report](../../../scenarios/astm/utm/dss/report.md) ([`scenarios.astm.utm.dss.Report`](../../../scenarios/astm/utm/dss/report.py))
21. Scenario: [ASTM Availability DSS: USS Availability Simple](../../../scenarios/astm/utm/dss/uss_availability_simple.md) ([`scenarios.astm.utm.dss.UssAvailabilitySimple`](../../../scenarios/astm/utm/dss/uss_availability_simple.py))

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

Expand All @@ -38,7 +39,7 @@
<td rowspan="52" 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,1</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/utm/dss/op_intent_ref_access_control.md">ASTM F3548-21 UTM DSS Operational Intent Reference Access Control</a><br><a href="../../../scenarios/astm/utm/dss/op_intent_ref_state_transitions.md">ASTM F3548-21 UTM DSS Operational Intent Reference State Transitions</a><br><a href="../../../scenarios/astm/utm/dss/oir_implicit_sub_handling.md">ASTM SCD DSS: Implicit Subscription handling</a><br><a href="../../../scenarios/astm/utm/dss/authentication/authentication_validation.md">ASTM SCD DSS: Interfaces authentication</a><br><a href="../../../scenarios/astm/utm/dss/oir_explicit_sub_handling.md">ASTM SCD DSS: Operational Intent Explicit Subscription handling</a><br><a href="../../../scenarios/astm/utm/dss/op_intent_ref_key_validation.md">ASTM SCD DSS: Operational Intent Reference Key Validation</a><br><a href="../../../scenarios/astm/utm/dss/op_intent_ref_simple.md">ASTM SCD DSS: Operational Intent Reference Simple</a><br><a href="../../../scenarios/astm/utm/dss/synchronization/op_intent_ref_synchronization.md">ASTM SCD DSS: Operational Intent Reference Synchronization</a><br><a href="../../../scenarios/astm/utm/dss/subscription_interactions_deletion.md">ASTM SCD DSS: Subscription and entity deletion interaction</a><br><a href="../../../scenarios/astm/utm/dss/subscription_interactions.md">ASTM SCD DSS: Subscription and entity interaction</a><br><a href="../../../scenarios/interuss/ovn_request/dss_ovn_request.md">OVN Request Optional Extension to ASTM F3548-21</a></td>
<td><a href="../../../scenarios/astm/utm/dss/uss_availability_simple.md">ASTM Availability DSS: USS Availability Simple</a><br><a href="../../../scenarios/astm/utm/dss/op_intent_ref_access_control.md">ASTM F3548-21 UTM DSS Operational Intent Reference Access Control</a><br><a href="../../../scenarios/astm/utm/dss/op_intent_ref_state_transitions.md">ASTM F3548-21 UTM DSS Operational Intent Reference State Transitions</a><br><a href="../../../scenarios/astm/utm/dss/oir_implicit_sub_handling.md">ASTM SCD DSS: Implicit Subscription handling</a><br><a href="../../../scenarios/astm/utm/dss/authentication/authentication_validation.md">ASTM SCD DSS: Interfaces authentication</a><br><a href="../../../scenarios/astm/utm/dss/oir_explicit_sub_handling.md">ASTM SCD DSS: Operational Intent Explicit Subscription handling</a><br><a href="../../../scenarios/astm/utm/dss/op_intent_ref_key_validation.md">ASTM SCD DSS: Operational Intent Reference Key Validation</a><br><a href="../../../scenarios/astm/utm/dss/op_intent_ref_simple.md">ASTM SCD DSS: Operational Intent Reference Simple</a><br><a href="../../../scenarios/astm/utm/dss/synchronization/op_intent_ref_synchronization.md">ASTM SCD DSS: Operational Intent Reference Synchronization</a><br><a href="../../../scenarios/astm/utm/dss/subscription_interactions_deletion.md">ASTM SCD DSS: Subscription and entity deletion interaction</a><br><a href="../../../scenarios/astm/utm/dss/subscription_interactions.md">ASTM SCD DSS: Subscription and entity interaction</a><br><a href="../../../scenarios/interuss/ovn_request/dss_ovn_request.md">OVN Request Optional Extension to ASTM F3548-21</a></td>
</tr>
<tr>
<td><a href="../../../requirements/astm/f3548/v21.md">DSS0005,2</a></td>
Expand Down Expand Up @@ -73,7 +74,7 @@
<tr>
<td><a href="../../../requirements/astm/f3548/v21.md">DSS0100,1</a></td>
<td>Implemented</td>
<td><a href="../../../scenarios/astm/utm/dss/authentication/authentication_validation.md">ASTM SCD DSS: Interfaces authentication</a><br><a href="../../../scenarios/astm/utm/dss/synchronization/uss_availability_synchronization.md">ASTM SCD DSS: USS Availability Synchronization</a></td>
<td><a href="../../../scenarios/astm/utm/dss/uss_availability_simple.md">ASTM Availability DSS: USS Availability Simple</a><br><a href="../../../scenarios/astm/utm/dss/authentication/authentication_validation.md">ASTM SCD DSS: Interfaces authentication</a><br><a href="../../../scenarios/astm/utm/dss/synchronization/uss_availability_synchronization.md">ASTM SCD DSS: USS Availability Synchronization</a></td>
</tr>
<tr>
<td><a href="../../../requirements/astm/f3548/v21.md">DSS0100,2</a></td>
Expand Down
5 changes: 5 additions & 0 deletions monitoring/uss_qualifier/suites/astm/utm/dss_probing.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -146,3 +146,8 @@ actions:
scenario_type: scenarios.astm.utm.dss.Report
resources:
dss: dss
- test_scenario:
scenario_type: scenarios.astm.utm.dss.UssAvailabilitySimple
resources:
dss: dss
client_identity: utm_client_identity
Loading
Loading