diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_activate_flight_into_conflict.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_activate_flight_into_conflict.svg new file mode 100644 index 0000000000..72d99e63ab --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_activate_flight_into_conflict.svg @@ -0,0 +1 @@ +Flight 2Flight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_activated_flight_into_conflict.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_activated_flight_into_conflict.svg new file mode 100644 index 0000000000..1ae3bad70d --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_activated_flight_into_conflict.svg @@ -0,0 +1 @@ +Flight 2Flight 1cFlight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_planned_flight_into_conflict.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_planned_flight_into_conflict.svg new file mode 100644 index 0000000000..55859264e8 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_modify_planned_flight_into_conflict.svg @@ -0,0 +1 @@ +Flight 2Flight 1cFlight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_plan_flight_into_conflict.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_plan_flight_into_conflict.svg new file mode 100644 index 0000000000..a52a46a4d3 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/attempt_to_plan_flight_into_conflict.svg @@ -0,0 +1 @@ +Flight 2Flight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/make_assets.py b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/make_assets.py new file mode 100644 index 0000000000..69a57dc381 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/make_assets.py @@ -0,0 +1,316 @@ +# Requires svg.py 1.4.2 + +import inspect +from textwrap import dedent +from typing import List + +import svg + + +def translate(points: List[float], dx: float, dy: float) -> List[float]: + result = [] + x = True + for p in points: + result.append(p + dx if x else p + dy) + x = not x + return result + + +outline = "#202020" +accepted = "#808080" +activated = "#00ff00" +nonconforming = "#ffff00" +flight2_points = [10, 110, 100, 10, 190, 30, 220, 100, 160, 190] +flight1_points = [20, 190, 50, 110, 310, 90, 340, 90, 340, 180, 270, 160] +flight1c_points = [185, 180, 225, 110, 310, 90, 340, 90, 340, 180, 270, 160] +flight1m_points = [140, 190, 170, 110, 310, 90, 340, 90, 340, 180, 270, 160] +common_elements = [ + svg.Style( + text=dedent(""".heavy { font: bold 30px sans-serif; }"""), + ), + svg.Marker( + id="arrowhead", + viewBox=svg.ViewBoxSpec(0, 0, 10, 10), + refX=6, + refY=4, + markerWidth=6, + markerHeight=6, + color=outline, + orient="auto-start-reverse", + elements=[ + svg.Path( + d=[ + svg.MoveTo(0, 0), + svg.LineTo(8, 4), + svg.LineTo(0, 8), + svg.ClosePath(), + ], + fill=outline, + ) + ], + ), +] + + +def make_attempt_to_plan_flight_into_conflict(): + elements = [ + svg.Polygon( + points=flight2_points, + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=translate(flight2_points, 440, 0), + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60 + 440, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=translate(flight1_points, 440, 0), + stroke=outline, + fill=accepted, + fill_opacity=0.4, + stroke_width=8, + stroke_dasharray=[16], + ), + svg.Text(x=220 + 440, y=140, class_=["heavy"], text="Flight 1"), + svg.Text(x=560, y=150, class_=["heavy"], text="X", fill="red"), + svg.Line( + x1=370, + y1=100, + x2=420, + y2=100, + stroke=outline, + stroke_width=8, + marker_end="url(#arrowhead)", + ), + ] + canvas = svg.SVG( + width=800, + height=200, + elements=common_elements + elements, + ) + with open(inspect.currentframe().f_code.co_name[len("make_") :] + ".svg", "w") as f: + f.write(str(canvas)) + + +def make_attempt_to_activate_flight_into_conflict(): + elements = [ + svg.Polygon( + points=flight2_points, + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=translate(flight2_points, 440, 0), + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60 + 440, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=translate(flight1_points, 440, 0), + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + stroke_dasharray=[16], + ), + svg.Text(x=220 + 440, y=140, class_=["heavy"], text="Flight 1"), + svg.Text(x=560, y=150, class_=["heavy"], text="X", fill="red"), + svg.Line( + x1=370, + y1=100, + x2=420, + y2=100, + stroke=outline, + stroke_width=8, + marker_end="url(#arrowhead)", + ), + ] + canvas = svg.SVG( + width=800, + height=200, + elements=common_elements + elements, + ) + with open(inspect.currentframe().f_code.co_name[len("make_") :] + ".svg", "w") as f: + f.write(str(canvas)) + + +def make_attempt_to_modify_planned_flight_into_conflict(): + elements = [ + svg.Polygon( + points=flight2_points, + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=flight1c_points, + stroke=outline, + fill=accepted, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=217, y=145, class_=["heavy"], text="Flight 1c"), + svg.Polygon( + points=translate(flight2_points, 440, 0), + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60 + 440, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=translate(flight1_points, 440, 0), + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + stroke_dasharray=[16], + ), + svg.Text(x=222 + 440, y=145, class_=["heavy"], text="Flight 1"), + svg.Text(x=560, y=150, class_=["heavy"], text="X", fill="red"), + svg.Line( + x1=370, + y1=100, + x2=420, + y2=100, + stroke=outline, + stroke_width=8, + marker_end="url(#arrowhead)", + ), + ] + canvas = svg.SVG( + width=800, + height=200, + elements=common_elements + elements, + ) + with open(inspect.currentframe().f_code.co_name[len("make_") :] + ".svg", "w") as f: + f.write(str(canvas)) + + +def make_attempt_to_modify_activated_flight_into_conflict(): + elements = [ + svg.Polygon( + points=flight2_points, + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=flight1c_points, + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=217, y=145, class_=["heavy"], text="Flight 1c"), + svg.Polygon( + points=translate(flight2_points, 440, 0), + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60 + 440, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=translate(flight1_points, 440, 0), + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + stroke_dasharray=[16], + ), + svg.Text(x=222 + 440, y=145, class_=["heavy"], text="Flight 1"), + svg.Text(x=560, y=150, class_=["heavy"], text="X", fill="red"), + svg.Line( + x1=370, + y1=100, + x2=420, + y2=100, + stroke=outline, + stroke_width=8, + marker_end="url(#arrowhead)", + ), + ] + canvas = svg.SVG( + width=800, + height=200, + elements=common_elements + elements, + ) + with open(inspect.currentframe().f_code.co_name[len("make_") :] + ".svg", "w") as f: + f.write(str(canvas)) + + +def make_modify_activated_flight_with_preexisting_conflict(): + elements = [ + svg.Polygon( + points=flight2_points, + stroke=outline, + fill=nonconforming, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=flight1_points, + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=222, y=145, class_=["heavy"], text="Flight 1"), + svg.Polygon( + points=translate(flight2_points, 440, 0), + stroke=outline, + fill=nonconforming, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60 + 440, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=translate(flight1m_points, 440, 0), + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=202 + 440, y=145, class_=["heavy"], text="Flight 1m"), + svg.Line( + x1=370, + y1=100, + x2=420, + y2=100, + stroke=outline, + stroke_width=8, + marker_end="url(#arrowhead)", + ), + ] + canvas = svg.SVG( + width=800, + height=200, + elements=common_elements + elements, + ) + with open(inspect.currentframe().f_code.co_name[len("make_") :] + ".svg", "w") as f: + f.write(str(canvas)) + + +make_attempt_to_plan_flight_into_conflict() +make_attempt_to_activate_flight_into_conflict() +make_attempt_to_modify_planned_flight_into_conflict() +make_attempt_to_modify_activated_flight_into_conflict() +make_modify_activated_flight_with_preexisting_conflict() diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/modify_activated_flight_with_preexisting_conflict.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/modify_activated_flight_with_preexisting_conflict.svg new file mode 100644 index 0000000000..e4ac91baf1 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/assets/modify_activated_flight_with_preexisting_conflict.svg @@ -0,0 +1 @@ +Flight 2Flight 1Flight 2Flight 1m \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.md b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.md index a846f50355..6c690d2af4 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.md +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.md @@ -12,33 +12,68 @@ It involves a tested USS and a control USS through which conflicting flights are This scenario skips execution and completes successfully at the setup case if a resource containing equal priority flight intents where conflicts are not allow is not provided, such as if a jurisdiction does not have any priority levels at which conflicts are not allowed. - -## Sequence -![Sequence diagram](conflict_equal_priority_not_permitted.png) - ## Resources ### flight_intents If the jurisdiction in which these tests are being conducted does not have a priority level at which conflicts are not allowed, the FlightIntentsResource must be None to prevent the -execution of the test. +execution of this test. Otherwise, the FlightIntentsResource must provide the following flight intents: -- For flight 1: - - `flight_1_planned_time_range_A`: flight used for the tested USS - - original time range `time_range_A` (e.g. 1pm to 2pm) - - `flight_1_activated_time_range_A`: state mutation `Activated` - - `flight_1_activated_time_range_A_extended`: mutation of volume in time to extend original time range (e.g. 12pm to 2pm) - - `flight_1_planned_time_range_B`: mutation of volume in time to not intersect with `time_range_A` or `time_range_A_extended` (e.g. 4pm to 5pm) - - `flight_1_activated_time_range_B`: state mutation `Activated` - -- For flight 2: - - `flight_2_equal_prio_planned_time_range_B`: flight used for the control USS - - original time range `time_range_B` that does not intersect with `time_range_A` or `time_range_A_extended` (e.g. 4pm to 5pm) - - must have equal priority than flight 1 - - must intersect flight 1 in space - - `flight_2_equal_prio_activated_time_range_B`: state mutation `Activated` - - `flight_2_equal_prio_nonconforming_time_range_A`: state mutation `Nonconforming` - - must have an off-nominal volume with time range `time_range_A` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Flight intent IDFlight namePriorityStateMust conflict withMust not conflict with
flight_1_planned_time_range_AFlight 1Any (but all the same)AcceptedFlight 2N/A
flight_1_activated_time_range_AActivated
flight_1_activated_time_range_A_extendedFlight 1mActivatedFlight 2N/A
flight_1_planned_time_range_BFlight 1cPlannedN/AFlight 2
flight_1_activated_time_range_BActivated
flight_2_equal_prio_planned_time_range_BFlight 2PlannedFlight 1, Flight 1mFlight 1c
flight_2_equal_prio_activated_time_range_BActivated
flight_2_equal_prio_nonconforming_time_range_ANonconforming
### tested_uss FlightPlannerResource that is under test and will manage flight 1. @@ -65,7 +100,9 @@ Both USSs are requested to remove all flights from the area under test. **[interuss.automated_testing.flight_planning.ClearArea](../../../../../requirements/interuss/automated_testing/flight_planning.md)** -## Attempt to plan flight in conflict test case +## Attempt to plan flight into conflict test case +![Test case summary illustration](assets/attempt_to_plan_flight_into_conflict.svg) + ### [Plan flight 2 test step](../../../../flight_planning/plan_flight_intent.md) Flight 2 on time range B should be successfully planned by the control USS. @@ -84,7 +121,9 @@ per **[astm.f3548.v21.SCD0035](../../../../../requirements/astm/f3548/v21.md)**. Flight 1 should not have been planned. -## Attempt to activate flight in conflict test case +## Attempt to activate flight into conflict test case +![Test case summary illustration](assets/attempt_to_activate_flight_into_conflict.svg) + ### [Attempt to directly activate conflicting flight 1 test step](../../../../flight_planning/activate_conflict_flight_intent.md) The test driver attempts to activate directly flight 1 onto time range B, i.e. without the flight being planned before. However, this conflicts with activated flight 2, which is of equal priority. As such it should be rejected @@ -94,13 +133,15 @@ per **[astm.f3548.v21.SCD0045](../../../../../requirements/astm/f3548/v21.md)**. Flight 1 should not have been activated directly. -## Attempt to modify planned flight in conflict test case +## Attempt to modify planned flight into conflict test case +![Test case summary illustration](assets/attempt_to_modify_planned_flight_into_conflict.svg) + ### [Plan flight 1 test step](../../../../flight_planning/plan_flight_intent.md) Flight 1 on time range A should be successfully planned by the tested USS. ### [Validate flight 1 sharing test step](../../validate_shared_operational_intent.md) -### [Attempt to modify planned flight 1 in conflict test step](../../../../flight_planning/modify_planned_conflict_flight_intent.md) +### [Attempt to modify planned flight 1 into conflict test step](../../../../flight_planning/modify_planned_conflict_flight_intent.md) The test driver attempts to modify flight 1 via the tested USS so that it becomes planned on time range B. However, this conflicts with flight 2, which is of equal priority but was planned first. As such it should be rejected per **[astm.f3548.v21.SCD0040](../../../../../requirements/astm/f3548/v21.md)**. @@ -110,7 +151,9 @@ Because the modification attempt was invalid, either Flight 1 should not have be original accepted request), or it should have been removed (because the USS rejected the replacement plan provided). -## Attempt to modify activated flight in conflict test case +## Attempt to modify activated flight into conflict test case +![Test case summary illustration](assets/attempt_to_modify_activated_flight_into_conflict.svg) + ### [Activate flight 1 test step](../../../../flight_planning/activate_flight_intent.md) The test driver activates flight 1 onto its time range A, which should be done successfully. Note that flight 1 could be either planned or non-existent before this step. In the latter case, the flight will be @@ -118,7 +161,7 @@ directly activated without being planned beforehand. ### [Validate flight 1 sharing test step](../../validate_shared_operational_intent.md) -### [Attempt to modify activated flight 1 in conflict test step](../../../../flight_planning/modify_activated_conflict_flight_intent.md) +### [Attempt to modify activated flight 1 into conflict test step](../../../../flight_planning/modify_activated_conflict_flight_intent.md) The test driver attempts to modify flight 1 so that it becomes in conflict with flight 2 onto time range B. Both flights are activated at that point. However, because the conflict did not exist when the modification was initiated, it should be rejected per **[astm.f3548.v21.SCD0050](../../../../../requirements/astm/f3548/v21.md)**. @@ -129,6 +172,8 @@ original accepted request), or it should have been removed (because the USS reje ## Modify activated flight with pre-existing conflict test case +![Test case summary illustration](assets/modify_activated_flight_with_preexisting_conflict.svg) + ### [Activate flight 1 test step](../../../../flight_planning/activate_flight_intent.md) The test driver activates flight 1 onto its time range A, which should be done successfully. Note that flight 1 could be either already activated or non-existent before this step. In the former case, the call is @@ -158,7 +203,7 @@ to reject or accept the flight. If the USS indicates that the injection attempt ### [Validate flight 2 sharing test step](../../validate_shared_operational_intent.md) -### Attempt to modify activated flight 1 in conflict with activated flight 2 test step +### Attempt to modify activated flight 1 in conflict with nonconforming flight 2 test step Before execution of this step, flight 1 is activated (onto time range A) and flight 2 is non-conforming (onto time range A), and both are in conflict. The test driver modifies flight 1 in a way that still conflicts with flight 2 by extending its time range A. diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.plantuml b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.plantuml deleted file mode 100644 index c8b354ea96..0000000000 --- a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.plantuml +++ /dev/null @@ -1,123 +0,0 @@ -@startuml -center header ASTM Strategic Coordination -title Nominal planning: not permitted conflict with equal priority - -participant "DSS" -participant "Test Driver" as TD -participant "Tested USS\n(flight 1)" as T_USS -participant "Control USS\n(flight 2)" as C_USS - -== Attempt to plan flight in conflict == -TD -> C_USS: PUT /inject/flight/{flight2}\n{"state": "Accepted", "volumes": //time_range_B//} -TD <- C_USS: 200 Ok - Operational Intent 2 created\n{"result": "Planned"} - -TD -> C_USS: PUT /inject/flight/{flight2}\n{"state": "Activated"} -TD <- C_USS: 200 Ok - Operational Intent 2 activated\n{"result": "ReadyToFly"} - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing volume of flight 2 -TD <- DSS: 200 Ok - returns Operational Intent Reference 2 managed by Control USS -TD -> C_USS: GET /uss/v1/operational_intents/{opintent2} -TD <- C_USS: 200 Ok - returns Operational Intent 2 - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing volume of flight 1 -TD <- DSS: 200 Ok -TD -> T_USS: PUT /inject/flight/{flight1}\n{"state": "Accepted", "volumes": //time_range_B//} -TD <- T_USS: 200 Ok - Planning rejected\n{"result": "ConflictWithFlight"} -note left: Per ""astm.f3548.v21.SCD0035"" -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing volume of flight 1 -TD <- DSS: 200 Ok - no additional operational intent found - - -== Attempt to activate flight in conflict == -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing volume of flight 1 -TD <- DSS: 200 Ok -TD -> T_USS: PUT /inject/flight/{flight1}\n{"state": "Activated", "volumes": //time_range_B//} -TD <- T_USS: 200 Ok - Activation rejected\n{"result": "ConflictWithFlight"} -note left: Per ""astm.f3548.v21.SCD0045"" -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing volume of flight 1 -TD <- DSS: 200 Ok - no additional operational intent found - - -== Attempt to modify planned flight in conflict == -TD -> T_USS: PUT /inject/flight/{flight1}\n{"state": "Accepted", "volumes": //time_range_A//} -TD <- T_USS: 200 Ok - Operational Intent 1 created\n{"result": "Planned"} - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing flights volumes -TD <- DSS: 200 Ok - returns Operational Intent Reference 1 managed by Tested USS -TD -> T_USS: GET /uss/v1/operational_intents/{opintent1} -TD <- T_USS: 200 Ok - returns Operational Intent 1 - -TD -> T_USS: PUT /inject/flight/{flight1}\n{"volumes": //time_range_B//} -TD <- T_USS: 200 Ok - Modification rejected\n{"result": "ConflictWithFlight"} -note left: Per ""astm.f3548.v21.SCD0040"" - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing volume of flight 1 -TD <- DSS: 200 Ok - returns Operational Intent Reference 1 managed by Tested USS if it still exists -alt Operational Intent Reference 1 still exists - TD -> T_USS: GET /uss/v1/operational_intents/{opintent1} - TD <- T_USS: 200 Ok - returns Operational Intent 1 -end - -== Attempt to modify activated flight in conflict == -TD -> T_USS: PUT /inject/flight/{flight1}\n{"state": "Activated"} -TD <- T_USS: 200 Ok - Operational Intent 1 activated\n{"result": "ReadyToFly"} - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing flights volumes -TD <- DSS: 200 Ok - returns Operational Intent Reference 1 managed by Tested USS -TD -> T_USS: GET /uss/v1/operational_intents/{opintent1} -TD <- T_USS: 200 Ok - returns Operational Intent 1 - -TD -> T_USS: PUT /inject/flight/{flight1}\n{"volumes": //time_range_B//} -TD <- T_USS: 200 Ok - Modification rejected\n{"result": "ConflictWithFlight"} -note left: Per ""astm.f3548.v21.SCD0050"" - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing volume of flight 1 -TD <- DSS: 200 Ok - returns Operational Intent Reference 1 managed by Tested USS if it still exists -alt Operational Intent Reference 1 still exists - TD -> T_USS: GET /uss/v1/operational_intents/{opintent1} - TD <- T_USS: 200 Ok - returns Operational Intent 1 -end - -== Modify activated flight with pre-existing conflict == - -TD -> T_USS: PUT /inject/flight/{flight1}\n{"state": "Activated"} -TD <- T_USS: 200 Ok - Operational Intent 1 activated\n{"result": "ReadyToFly"} - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing flights volumes -TD <- DSS: 200 Ok - returns Operational Intent Reference 1 managed by Tested USS -TD -> T_USS: GET /uss/v1/operational_intents/{opintent1} -TD <- T_USS: 200 Ok - returns Operational Intent 1 - -TD -> C_USS: PUT /inject/flight/{flight2}\n{"state": "Nonconforming", "off_nominal_volumes": //time_range_A//} -alt Control USS does not support CMSA role - TD <- C_USS: 200 Ok - Transition rejected because USS does not support CMSA role\n{"result": "Rejected"} - note over TD, C_USS: Execution of scenario stops without failing - -else Control USS supports CMSA role - TD <- C_USS: 200 Ok - Operational Intent 2 declared non-conforming\n{"result": "Planned"} - - TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing volume of flight 2 - TD <- DSS: 200 Ok - returns Operational Intent Reference 2 managed by Control USS - TD -> C_USS: GET /uss/v1/operational_intents/{opintent2} - TD <- C_USS: 200 Ok - returns Operational Intent 2 - - TD -> T_USS: PUT /inject/flight/{flight1}\n{"volumes": //time_range_A_extended//} - note left: Both alternatives are valid and this does not validate a requirement - alt Tested USS allow the modification - TD <- T_USS: 200 Ok - Operational Intent 1 modified\n{"result": "ReadyToFly"} - - else Tested USS disallows the modification - TD <- T_USS: 200 Ok - Modification rejected\n{"result": "Rejected"} - - end - - TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing volume of flight 1 - TD <- DSS: 200 Ok - returns Operational Intent Reference 1 managed by Tested USS if it still exists - alt Operational Intent Reference 1 still exists - TD -> T_USS: GET /uss/v1/operational_intents/{opintent1} - TD <- T_USS: 200 Ok - returns Operational Intent 1 - end - -end - -@enduml diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.png b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.png deleted file mode 100644 index 0b6a24adc9..0000000000 Binary files a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.png and /dev/null differ diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.py b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.py index a5762e58eb..d12e632f60 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.py +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_equal_priority_not_permitted/conflict_equal_priority_not_permitted.py @@ -202,19 +202,19 @@ def run(self): return self.end_test_case() - self.begin_test_case("Attempt to plan flight in conflict") + self.begin_test_case("Attempt to plan flight into conflict") self._attempt_plan_flight_conflict() self.end_test_case() - self.begin_test_case("Attempt to activate flight in conflict") + self.begin_test_case("Attempt to activate flight into conflict") self._attempt_activate_flight_conflict() self.end_test_case() - self.begin_test_case("Attempt to modify planned flight in conflict") + self.begin_test_case("Attempt to modify planned flight into conflict") self._attempt_modify_planned_flight_conflict() self.end_test_case() - self.begin_test_case("Attempt to modify activated flight in conflict") + self.begin_test_case("Attempt to modify activated flight into conflict") flight_1_op_intent_id = self._attempt_modify_activated_flight_conflict() self.end_test_case() @@ -334,7 +334,7 @@ def _attempt_modify_planned_flight_conflict(self): _ = modify_planned_conflict_flight_intent( self, - "Attempt to modify planned flight 1 in conflict", + "Attempt to modify planned flight 1 into conflict", self.tested_uss, self.flight_1_planned_time_range_B.request, self.flight_1_id, @@ -369,7 +369,7 @@ def _attempt_modify_activated_flight_conflict(self) -> str: _ = modify_activated_conflict_flight_intent( self, - "Attempt to modify activated flight 1 in conflict", + "Attempt to modify activated flight 1 into conflict", self.tested_uss, self.flight_1_activated_time_range_B.request, self.flight_1_id, @@ -436,7 +436,7 @@ def _modify_activated_flight_preexisting_conflict( resp_flight_1, _ = submit_flight_intent( self, - "Attempt to modify activated flight 1 in conflict with activated flight 2", + "Attempt to modify activated flight 1 in conflict with nonconforming flight 2", "Successful modification or rejection", {InjectFlightResult.ReadyToFly, InjectFlightResult.Rejected}, {InjectFlightResult.Failed: "Failure"}, diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/attempt_to_activate_flight_into_conflict.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/attempt_to_activate_flight_into_conflict.svg new file mode 100644 index 0000000000..5599c29a15 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/attempt_to_activate_flight_into_conflict.svg @@ -0,0 +1 @@ +Flight 1Flight 2Flight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/attempt_to_modify_activated_flight_into_conflict.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/attempt_to_modify_activated_flight_into_conflict.svg new file mode 100644 index 0000000000..8c3dfb23d0 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/attempt_to_modify_activated_flight_into_conflict.svg @@ -0,0 +1 @@ +Flight 1Flight 2mFlight 2mFlight 1cX \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/attempt_to_modify_planned_flight_into_conflict.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/attempt_to_modify_planned_flight_into_conflict.svg new file mode 100644 index 0000000000..ab0e092689 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/attempt_to_modify_planned_flight_into_conflict.svg @@ -0,0 +1 @@ +Flight 1Flight 2Flight 2Flight 1mX \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/attempt_to_plan_flight_into_conflict.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/attempt_to_plan_flight_into_conflict.svg new file mode 100644 index 0000000000..431fa81e26 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/attempt_to_plan_flight_into_conflict.svg @@ -0,0 +1 @@ +Flight 2Flight 2Flight 1X \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/make_assets.py b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/make_assets.py new file mode 100644 index 0000000000..a210ab9432 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/make_assets.py @@ -0,0 +1,335 @@ +# Requires svg.py 1.4.2 + +import inspect +from textwrap import dedent +from typing import List + +import svg + + +def translate(points: List[float], dx: float, dy: float) -> List[float]: + result = [] + x = True + for p in points: + result.append(p + dx if x else p + dy) + x = not x + return result + + +outline = "#202020" +high_priority = "#dd2020" +accepted = "#808080" +activated = "#00ff00" +nonconforming = "#ffff00" +flight2_points = [10, 110, 100, 10, 190, 30, 220, 100, 160, 190] +flight2m_points = [ + 10, + 100, + 100, + 10, + 190, + 30, + 220, + 85, +] +flight1_points = [20, 190, 50, 110, 310, 90, 340, 90, 340, 180, 270, 160] +flight1c_points = [185, 180, 190, 40, 310, 90, 340, 90, 340, 180, 270, 160] +flight1m_points = [140, 190, 170, 110, 310, 90, 340, 90, 340, 180, 270, 160] +common_elements = [ + svg.Style( + text=dedent(""".heavy { font: bold 30px sans-serif; }"""), + ), + svg.Marker( + id="arrowhead", + viewBox=svg.ViewBoxSpec(0, 0, 10, 10), + refX=6, + refY=4, + markerWidth=6, + markerHeight=6, + color=outline, + orient="auto-start-reverse", + elements=[ + svg.Path( + d=[ + svg.MoveTo(0, 0), + svg.LineTo(8, 4), + svg.LineTo(0, 8), + svg.ClosePath(), + ], + fill=outline, + ) + ], + ), +] + + +def make_attempt_to_plan_flight_into_conflict(): + elements = [ + svg.Polygon( + points=flight2_points, + stroke=high_priority, + fill=accepted, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=translate(flight2_points, 440, 0), + stroke=high_priority, + fill=accepted, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60 + 440, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=translate(flight1_points, 440, 0), + stroke=outline, + fill=accepted, + fill_opacity=0.4, + stroke_width=8, + stroke_dasharray=[16], + ), + svg.Text(x=220 + 440, y=140, class_=["heavy"], text="Flight 1"), + svg.Text(x=560, y=150, class_=["heavy"], text="X", fill="red"), + svg.Line( + x1=370, + y1=100, + x2=420, + y2=100, + stroke=outline, + stroke_width=8, + marker_end="url(#arrowhead)", + ), + ] + canvas = svg.SVG( + width=800, + height=200, + elements=common_elements + elements, + ) + with open(inspect.currentframe().f_code.co_name[len("make_") :] + ".svg", "w") as f: + f.write(str(canvas)) + + +def make_attempt_to_modify_planned_flight_into_conflict(): + elements = [ + svg.Polygon( + points=flight1_points, + stroke=outline, + fill=accepted, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=205, y=150, class_=["heavy"], text="Flight 1"), + svg.Polygon( + points=flight2_points, + stroke=high_priority, + fill=accepted, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=translate(flight2_points, 440, 0), + stroke=high_priority, + fill=accepted, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60 + 440, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=translate(flight1m_points, 440, 0), + stroke=outline, + fill=accepted, + fill_opacity=0.4, + stroke_width=8, + stroke_dasharray=[16], + ), + svg.Text(x=205 + 440, y=150, class_=["heavy"], text="Flight 1m"), + svg.Text(x=605, y=150, class_=["heavy"], text="X", fill="red"), + svg.Line( + x1=370, + y1=100, + x2=420, + y2=100, + stroke=outline, + stroke_width=8, + marker_end="url(#arrowhead)", + ), + ] + canvas = svg.SVG( + width=800, + height=200, + elements=common_elements + elements, + ) + with open(inspect.currentframe().f_code.co_name[len("make_") :] + ".svg", "w") as f: + f.write(str(canvas)) + + +def make_attempt_to_activate_flight_into_conflict(): + elements = [ + svg.Polygon( + points=flight1_points, + stroke=outline, + fill=accepted, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=222, y=145, class_=["heavy"], text="Flight 1"), + svg.Polygon( + points=flight2_points, + stroke=high_priority, + fill=accepted, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=translate(flight2_points, 440, 0), + stroke=high_priority, + fill=accepted, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60 + 440, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=translate(flight1_points, 440, 0), + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + stroke_dasharray=[16], + ), + svg.Text(x=222 + 440, y=145, class_=["heavy"], text="Flight 1"), + svg.Text(x=560, y=150, class_=["heavy"], text="X", fill="red"), + svg.Line( + x1=370, + y1=100, + x2=420, + y2=100, + stroke=outline, + stroke_width=8, + marker_end="url(#arrowhead)", + ), + ] + canvas = svg.SVG( + width=800, + height=200, + elements=common_elements + elements, + ) + with open(inspect.currentframe().f_code.co_name[len("make_") :] + ".svg", "w") as f: + f.write(str(canvas)) + + +def make_modify_activated_flight_with_preexisting_conflict(): + elements = [ + svg.Polygon( + points=flight1_points, + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=222, y=145, class_=["heavy"], text="Flight 1"), + svg.Polygon( + points=flight2_points, + stroke=high_priority, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=translate(flight2_points, 440, 0), + stroke=high_priority, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=60 + 440, y=90, class_=["heavy"], text="Flight 2"), + svg.Polygon( + points=translate(flight1m_points, 440, 0), + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=222 + 440, y=145, class_=["heavy"], text="Flight 1m"), + svg.Line( + x1=370, + y1=100, + x2=420, + y2=100, + stroke=outline, + stroke_width=8, + marker_end="url(#arrowhead)", + ), + ] + canvas = svg.SVG( + width=800, + height=200, + elements=common_elements + elements, + ) + with open(inspect.currentframe().f_code.co_name[len("make_") :] + ".svg", "w") as f: + f.write(str(canvas)) + + +def make_attempt_to_modify_activated_flight_into_conflict(): + elements = [ + svg.Polygon( + points=flight1_points, + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=202, y=145, class_=["heavy"], text="Flight 1"), + svg.Polygon( + points=flight2m_points, + stroke=high_priority, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=55, y=80, class_=["heavy"], text="Flight 2m"), + svg.Polygon( + points=translate(flight2m_points, 440, 0), + stroke=high_priority, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + ), + svg.Text(x=55 + 440, y=80, class_=["heavy"], text="Flight 2m"), + svg.Polygon( + points=translate(flight1c_points, 440, 0), + stroke=outline, + fill=activated, + fill_opacity=0.4, + stroke_width=8, + stroke_dasharray=[16], + ), + svg.Text(x=202 + 440, y=145, class_=["heavy"], text="Flight 1c"), + svg.Text(x=635, y=85, class_=["heavy"], text="X", fill="red"), + svg.Line( + x1=370, + y1=100, + x2=420, + y2=100, + stroke=outline, + stroke_width=8, + marker_end="url(#arrowhead)", + ), + ] + canvas = svg.SVG( + width=800, + height=200, + elements=common_elements + elements, + ) + with open(inspect.currentframe().f_code.co_name[len("make_") :] + ".svg", "w") as f: + f.write(str(canvas)) + + +make_attempt_to_plan_flight_into_conflict() +make_attempt_to_modify_planned_flight_into_conflict() +make_attempt_to_activate_flight_into_conflict() +make_modify_activated_flight_with_preexisting_conflict() +make_attempt_to_modify_activated_flight_into_conflict() diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/modify_activated_flight_with_preexisting_conflict.svg b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/modify_activated_flight_with_preexisting_conflict.svg new file mode 100644 index 0000000000..91b05c2c41 --- /dev/null +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/assets/modify_activated_flight_with_preexisting_conflict.svg @@ -0,0 +1 @@ +Flight 1Flight 2Flight 2Flight 1m \ No newline at end of file diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.md b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.md index 600e7b7c46..3a4234fa83 100644 --- a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.md +++ b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.md @@ -10,35 +10,74 @@ exists a conflict with a higher priority flight: It involves a tested USS and a control USS through which conflicting flights are injected. -## Sequence - -![Sequence diagram](conflict_higher_priority.png) - ## Resources ### flight_intents -FlightIntentsResource that provides the 8 following flight intents: - -- For flight 1: - - `flight_1_planned_time_range_A`: used for the test lower priority flight - - original time range `time_range_A` (e.g. 1pm to 2pm) - - `flight_1_planned_time_range_A_extended`: mutation of volume in time to extend original time range (e.g. 12pm to 2pm) - - `flight_1_activated_time_range_A`: state mutation `Activated` - - `flight_1_activated_time_range_A_extended`: mutation of volume in time to extend original time range (e.g. 12pm to 2pm) - - `flight_1_activated_time_range_B`: mutation of volume in time to not intersect with `time_range_A` or `time_range_A_extended` (e.g. 4pm to 5pm) - -- For flight 2: - - `flight_2_planned_time_range_A`: used for the higher priority flight - - original time range `time_range_A` (e.g. 1pm to 2pm) - - must have higher priority than flight 1 - - must intersect flight 1 in space - - `flight_2_activated_time_range_A`: state mutation `Activated` - - `flight_2_activated_time_range_B`: mutation of volume in time to not intersect with `time_range_A` or `time_range_A_extended` (e.g. 4pm to 5pm) +FlightIntentsResource that provides the following flight intents: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Flight intent IDFlight namePriorityStateMust conflict withMust not conflict with
flight_1_planned_time_range_AFlight 1AnyAcceptedFlight 2Flight 2m
flight_1_activated_time_range_AActivated
flight_1_planned_time_range_A_extendedFlight 1mAcceptedFlight 2N/A
flight_1_activated_time_range_A_extendedActivated
flight_1_activated_time_range_BFlight 1cActivatedFlight 2N/A
flight_2_planned_time_range_AFlight 2Higher than Flight 1*AcceptedFlight 1N/A
flight_2_activated_time_range_AActivated
flight_2_activated_time_range_BFlight 2mActivatedFlight 1cFlight 1
### tested_uss -FlightPlannerResource that is under test and will manage the first lower priority flight. +FlightPlannerResource that is under test and will manage flight 1. ### control_uss -FlightPlannerResource that will be used to inject conflicting flight 2. +FlightPlannerResource that will manage conflicting flight 2. ### dss DSSInstanceResource that provides access to a DSS instance where flight creation/sharing can be verified. @@ -59,6 +98,8 @@ Both USSs are requested to remove all flights from the area under test. ## Attempt to plan flight in conflict test case +![Test case summary illustration](assets/attempt_to_plan_flight_into_conflict.svg) + ### [Plan flight 2 test step](../../../../flight_planning/plan_flight_intent.md) The higher priority flight should be successfully planned by the control USS. @@ -74,6 +115,8 @@ higher priority. As such it should be rejected per **[astm.f3548.v21.SCD0015](.. ## Attempt to modify planned flight in conflict test case +![Test case summary illustration](assets/attempt_to_modify_planned_flight_into_conflict.svg) + ### [Plan flight 1 test step](../../../../flight_planning/plan_flight_intent.md) The first flight should be successfully planned by the tested USS. @@ -96,6 +139,8 @@ original accepted request), or it should have been removed (because the USS reje ## Attempt to activate flight in conflict test case +![Test case summary illustration](assets/attempt_to_activate_flight_into_conflict.svg) + ### [Attempt to activate conflicting flight 1 test step](../../../../flight_planning/activate_priority_conflict_flight_intent.md) The test driver attempts to activate flight 1, however, it conflicts with flight 2, which is also planned and of higher priority. Note that flight 1 could be either planned or non-existent before this step. @@ -107,6 +152,8 @@ original accepted request), or it should have been removed (because the USS reje ## Modify activated flight with pre-existing conflict test case +![Test case summary illustration](assets/modify_activated_flight_with_preexisting_conflict.svg) + ### [Delete flight 2 test step](../../../../flight_planning/delete_flight_intent.md) ### [Activate flight 1 test step](../../../../flight_planning/activate_flight_intent.md) @@ -135,6 +182,8 @@ The first flight should have been modified. ## Attempt to modify activated flight in conflict test case +![Test case summary illustration](assets/attempt_to_modify_activated_flight_into_conflict.svg) + ### [Modify activated flight 2 to not conflict with activated flight 1 test step](../../../../flight_planning/modify_planned_flight_intent.md) The test driver modifies (activated) flight 2 with the control USS so that it is not anymore in conflict with (activated) flight of test USS. diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.plantuml b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.plantuml deleted file mode 100644 index b5960a7b22..0000000000 --- a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.plantuml +++ /dev/null @@ -1,122 +0,0 @@ -@startuml -center header ASTM Strategic Coordination -title Nominal planning: conflict with higher priority - -participant "DSS" -participant "Test Driver" as TD -participant "Tested USS\n(flight 1)" as T_USS -participant "Control USS\n(flight 2)" as C_USS - -== Attempt to plan flight in conflict == -TD -> C_USS: PUT /inject/flight/{flight2}\n{"state": "Accepted", "priority": //high//, "volumes": //time_range_A//} -TD <- C_USS: 200 Ok - Operational Intent 2 created\n{"result": "Planned"} - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing volume of flight 1 -TD <- DSS: 200 Ok -TD -> T_USS: PUT /inject/flight/{flight1}\n{"state": "Accepted", "priority": //low//, "volumes": //time_range_A//} -TD <- T_USS: 200 Ok - Planning rejected\n{"result": "ConflictWithFlight"} -note left: Per ""astm.f3548.v21.SCD0015"" -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing volume of flight 1 -TD <- DSS: 200 Ok - no additional operational intent found - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing flights volumes -TD <- DSS: 200 Ok - returns Operational Intent Reference 2 managed by Control USS -TD -> C_USS: GET /uss/v1/operational_intents/{opintent2} -TD <- C_USS: 200 Ok - returns Operational Intent 2 - -TD -> C_USS: DELETE /inject/flight/{flight2} -TD <- C_USS: 200 Ok - Operational Intent 2 deleted\n{"result": "Closed"} - -== Attempt to modify planned flight in conflict == -TD -> T_USS: PUT /inject/flight/{flight1}\n{"state": "Accepted", "priority": //low//, "volumes": //time_range_A//} -TD <- T_USS: 200 Ok - Operational Intent 1 created\n{"result": "Planned"} - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing flights volumes -TD <- DSS: 200 Ok - returns Operational Intent Reference 1 managed by Tested USS -TD -> T_USS: GET /uss/v1/operational_intents/{opintent1} -TD <- T_USS: 200 Ok - returns Operational Intent 1 - -TD -> C_USS: PUT /inject/flight/{flight2}\n{"state": "Accepted", "priority": //high//, "volumes": //time_range_A//} -TD <- C_USS: 200 Ok - Operational Intent 2 created\n{"result": "Planned"} - -TD -> T_USS: PUT /inject/flight/{flight1}\n{"volumes": //time_range_A_extended//} -TD <- T_USS: 200 Ok - Modification rejected\n{"result": "ConflictWithFlight"} -note left: Per ""astm.f3548.v21.SCD0020"" - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing flights volumes -TD <- DSS: 200 Ok - returns Operational Intent Reference 1 managed by Tested USS if it still exists -alt Operational Intent Reference 1 still exists - TD -> T_USS: GET /uss/v1/operational_intents/{opintent1} - TD <- T_USS: 200 Ok - returns Operational Intent 1 -end - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing flights volumes -TD <- DSS: 200 Ok - returns Operational Intent Reference 2 managed by Control USS -TD -> C_USS: GET /uss/v1/operational_intents/{opintent2} -TD <- C_USS: 200 Ok - returns Operational Intent 2 - -== Attempt to activate flight in conflict == -TD -> T_USS: PUT /inject/flight/{flight1}\n{"state": "Activated"} -TD <- T_USS: 200 Ok - Activation rejected\n{"result": "ConflictWithFlight"} -note left: Per ""astm.f3548.v21.SCD0025"" - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing flights volumes -TD <- DSS: 200 Ok - returns Operational Intent Reference 1 managed by Tested USS if it still exists -alt Operational Intent Reference 1 still exists - TD -> T_USS: GET /uss/v1/operational_intents/{opintent1} - TD <- T_USS: 200 Ok - returns Operational Intent 1 -end - -== Modify activated flight with pre-existing conflict == -TD -> C_USS: DELETE /inject/flight/{flight2} -TD <- C_USS: 200 Ok - Operational Intent 2 deleted\n{"result": "Closed"} - -TD -> T_USS: PUT /inject/flight/{flight1}\n{"state": "Activated"} -TD <- T_USS: 200 Ok - Operational Intent 1 activated\n{"result": "ReadyToFly"} - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing flights volumes -TD <- DSS: 200 Ok - returns Operational Intent Reference 1 managed by Tested USS -TD -> T_USS: GET /uss/v1/operational_intents/{opintent1} -TD <- T_USS: 200 Ok - returns Operational Intent 1 - -TD -> C_USS: PUT /inject/flight/{flight2}\n{"state": "Accepted", "priority": //high//, "volumes": //time_range_A//} -TD <- C_USS: 200 Ok - Operational Intent 2 created\n{"result": "Planned"} - -TD -> C_USS: PUT /inject/flight/{flight2}\n{"state": "Activated"} -TD <- C_USS: 200 Ok - Operational Intent 2 activated\n{"result": "ReadyToFly"} - -TD -> T_USS: PUT /inject/flight/{flight1}\n{"volumes": //time_range_A_extended//} -TD <- T_USS: 200 Ok - Operational Intent 1 modified\n{"result": "ReadyToFly"} -note left: Per ""astm.f3548.v21.SCD0030"" - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing flights volumes -TD <- DSS: 200 Ok - returns Operational Intent Reference 1 managed by Tested USS -TD -> T_USS: GET /uss/v1/operational_intents/{opintent1} -TD <- T_USS: 200 Ok - returns Operational Intent 1 - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing flights volumes -TD <- DSS: 200 Ok - returns Operational Intent Reference 2 managed by Control USS -TD -> C_USS: GET /uss/v1/operational_intents/{opintent2} -TD <- C_USS: 200 Ok - returns Operational Intent 2 - -== Attempt to modify activated flight in conflict == -TD -> C_USS: PUT /inject/flight/{flight2}\n{"volumes": //time_range_B//} -TD <- C_USS: 200 Ok - Operational Intent 2 modified\n{"result": "ReadyToFly"} - -TD -> T_USS: PUT /inject/flight/{flight1}\n{"volumes": //time_range_B//} -TD <- T_USS: 200 Ok - Modification rejected\n{"result": "ConflictWithFlight"} -note left: Per ""astm.f3548.v21.SCD0030"" - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing flights volumes -TD <- DSS: 200 Ok - returns Operational Intent Reference 1 managed by Tested USS if it still exists -alt Operational Intent Reference 1 still exists - TD -> T_USS: GET /uss/v1/operational_intents/{opintent1} - TD <- T_USS: 200 Ok - returns Operational Intent 1 -end - -TD -> DSS: POST /dss/v1/operational_intent_references/query\nwith area_of_interest encompassing flights volumes -TD <- DSS: 200 Ok - returns Operational Intent Reference 2 managed by Control USS -TD -> C_USS: GET /uss/v1/operational_intents/{opintent2} -TD <- C_USS: 200 Ok - returns Operational Intent 2 - -@enduml diff --git a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.png b/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.png deleted file mode 100644 index bbb4c9cc55..0000000000 Binary files a/monitoring/uss_qualifier/scenarios/astm/utm/nominal_planning/conflict_higher_priority/conflict_higher_priority.png and /dev/null differ