Skip to content

Commit debc331

Browse files
committed
[uss_qualifier] uss availability status: version conflict
get old version before updating availability fix test check mismatch fix doc OVN/version naming record all queries factorize fragments
1 parent 682dd9b commit debc331

File tree

7 files changed

+189
-4
lines changed

7 files changed

+189
-4
lines changed

monitoring/uss_qualifier/scenarios/astm/utm/dss/__init__.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,3 +20,4 @@
2020
)
2121
from .subscription_simple import SubscriptionSimple as SubscriptionSimple
2222
from .subscription_validation import SubscriptionValidation as SubscriptionValidation
23+
from .uss_availability_simple import UssAvailabilitySimple as UssAvailabilitySimple

monitoring/uss_qualifier/scenarios/astm/utm/dss/fragments/availability/read.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
# USS Availability Read test step fragment
22

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

66
## 🛑 USS Availability can be requested check

monitoring/uss_qualifier/scenarios/astm/utm/dss/fragments/availability/update.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# USS Availability Read test step fragment
1+
# USS Availability Update test step fragment
22

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

66
## 🛑 USS Availability can be updated check

monitoring/uss_qualifier/scenarios/astm/utm/dss/synchronization/uss_availability_synchronization.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ def __init__(
5050
"""
5151
super().__init__()
5252
scopes_primary = {
53-
Scope.AvailabilityArbitration: "Set and read USS availability states"
53+
Scope.AvailabilityArbitration: "set and read USS availability states"
5454
}
5555
scopes_read = {Scope.StrategicCoordination: "read USS availability states"}
5656

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# ASTM Availability DSS: USS Availability Simple test scenario
2+
3+
## Overview
4+
5+
Verifies the behavior of a DSS for simple interactions pertaining to USS availability status.
6+
7+
## Resources
8+
9+
### dss
10+
11+
[`DSSInstanceResource`](../../../../resources/astm/f3548/v21/dss.py) the DSS instance through which entities are created, modified and deleted.
12+
13+
### client_identity
14+
15+
[`ClientIdentityResource`](../../../../resources/communications/client_identity.py) the client identity with the `utm.availability_arbitration` scope that will be used to report the availability status.
16+
17+
## Update USS availability state test case
18+
19+
### Declare USS as available at DSS test step
20+
21+
#### [Availability can be read](./fragments/availability/read.md)
22+
23+
#### [Availability can be updated](./fragments/availability/update.md)
24+
25+
## Update requires correct version test case
26+
27+
Test DSS behavior when update requests are not providing the required version.
28+
29+
### Attempt update with missing version test step
30+
31+
This step verifies that an existing USS availability status cannot be mutated with a missing version.
32+
33+
#### 🛑 Request to update USS availability status with empty version fails check
34+
35+
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)**
36+
37+
### Attempt update with incorrect version test step
38+
39+
This step verifies that an existing OIR cannot be mutated with an incorrect version.
40+
41+
#### 🛑 Request to update USS availability status with incorrect version fails check
42+
43+
If the DSS under test allows the qualifier to update the USS availability status with a request that provided an incorrect version,
44+
it is in violation of **[astm.f3548.v21.DSS0005,1](../../../../requirements/astm/f3548/v21.md)**
Lines changed: 135 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,135 @@
1+
from uas_standards.astm.f3548.v21.api import UssAvailabilityState
2+
from uas_standards.astm.f3548.v21.constants import Scope
3+
4+
from monitoring.monitorlib.fetch import QueryError
5+
from monitoring.uss_qualifier.resources.astm.f3548.v21.dss import (
6+
DSSInstance,
7+
DSSInstanceResource,
8+
)
9+
from monitoring.uss_qualifier.resources.communications import ClientIdentityResource
10+
from monitoring.uss_qualifier.scenarios.astm.utm.dss.test_step_fragments import (
11+
get_uss_availability,
12+
set_uss_availability,
13+
)
14+
from monitoring.uss_qualifier.scenarios.scenario import TestScenario
15+
from monitoring.uss_qualifier.suites.suite import ExecutionContext
16+
17+
18+
class UssAvailabilitySimple(TestScenario):
19+
"""
20+
A scenario that verifies that USS availability status cannot be updated with the incorrect version.
21+
"""
22+
23+
_dss: DSSInstance
24+
25+
_uss_id: str
26+
27+
def __init__(
28+
self,
29+
dss: DSSInstanceResource,
30+
client_identity: ClientIdentityResource,
31+
):
32+
"""
33+
Args:
34+
dss: dss to test
35+
id_generator: will let us generate specific identifiers
36+
client_identity: tells us the identity we should expect as an entity's manager
37+
"""
38+
super().__init__()
39+
scopes: dict[str, str] = {
40+
Scope.AvailabilityArbitration: "read and set availability for a USS"
41+
}
42+
43+
self._dss = dss.get_instance(scopes)
44+
self._pid = [self._dss.participant_id]
45+
46+
self._uss_id = client_identity.subject()
47+
48+
def run(self, context: ExecutionContext):
49+
self.begin_test_scenario(context)
50+
51+
self.begin_test_case("Update USS availability state")
52+
self._step_declare_uss_available()
53+
self.end_test_case()
54+
55+
self.begin_test_case("Update requires correct version")
56+
self._step_attempt_update_missing_version()
57+
self._step_attempt_update_incorrect_version()
58+
self.end_test_case()
59+
60+
def _step_declare_uss_available(self):
61+
self.begin_test_step("Declare USS as available at DSS")
62+
version = get_uss_availability(
63+
self,
64+
self._dss,
65+
self._uss_id,
66+
Scope.AvailabilityArbitration,
67+
)
68+
set_uss_availability(
69+
self, self._dss, self._uss_id, UssAvailabilityState.Normal, version
70+
)
71+
self.end_test_step()
72+
73+
def _step_attempt_update_missing_version(self):
74+
self.begin_test_step("Attempt update with missing version")
75+
with self.check(
76+
"Request to update USS availability status with empty version fails",
77+
self._pid,
78+
) as check:
79+
try:
80+
_, q = self._dss.set_uss_availability(
81+
self._uss_id,
82+
UssAvailabilityState.Down,
83+
"",
84+
)
85+
self.record_query(q)
86+
# We don't expect the reach this point:
87+
check.record_failed(
88+
summary="Set USS availability with missing version was not expected to succeed",
89+
details=f"Was expecting an HTTP 409 response because of an missing version, but got {q.status_code} instead",
90+
query_timestamps=[q.request.timestamp],
91+
)
92+
except QueryError as qe:
93+
self.record_queries(qe.queries)
94+
if qe.cause_status_code == 409:
95+
# The spec explicitly requests a 409 response code for incorrect OVNs.
96+
pass
97+
else:
98+
check.record_failed(
99+
summary="Set USS availability with missing version failed for unexpected reason",
100+
details=f"Was expecting an HTTP 409 response because of an missing version, but got {qe.cause_status_code} instead",
101+
query_timestamps=qe.query_timestamps,
102+
)
103+
self.end_test_step()
104+
105+
def _step_attempt_update_incorrect_version(self):
106+
self.begin_test_step("Attempt update with incorrect version")
107+
with self.check(
108+
"Request to update USS availability status with incorrect version fails",
109+
self._pid,
110+
) as check:
111+
try:
112+
_, q = self._dss.set_uss_availability(
113+
self._uss_id,
114+
UssAvailabilityState.Down,
115+
"ThisIsAnIncorrectVersion",
116+
)
117+
self.record_query(q)
118+
# We don't expect the reach this point:
119+
check.record_failed(
120+
summary="Set USS availability with incorrect version was not expected to succeed",
121+
details=f"Was expecting an HTTP 409 response because of an incorrect version, but got {q.status_code} instead",
122+
query_timestamps=[q.request.timestamp],
123+
)
124+
except QueryError as qe:
125+
self.record_queries(qe.queries)
126+
if qe.cause_status_code == 409:
127+
# The spec explicitly requests a 409 response code for incorrect OVNs.
128+
pass
129+
else:
130+
check.record_failed(
131+
summary="Set USS availability with incorrect version failed for unexpected reason",
132+
details=f"Was expecting an HTTP 409 response because of an incorrect version, but got {qe.cause_status_code} instead",
133+
query_timestamps=qe.query_timestamps,
134+
)
135+
self.end_test_step()

monitoring/uss_qualifier/suites/astm/utm/dss_probing.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,3 +146,8 @@ actions:
146146
scenario_type: scenarios.astm.utm.dss.Report
147147
resources:
148148
dss: dss
149+
- test_scenario:
150+
scenario_type: scenarios.astm.utm.dss.UssAvailabilitySimple
151+
resources:
152+
dss: dss
153+
client_identity: utm_client_identity

0 commit comments

Comments
 (0)