Skip to content

Commit 81eac87

Browse files
committed
volume expiration validator
1 parent dc89011 commit 81eac87

File tree

4 files changed

+36
-9
lines changed

4 files changed

+36
-9
lines changed

pkg/models/scd_conversions.go

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ func WithRequireTimeBounds() Volume4DValidator {
2121
}
2222
}
2323

24+
func WithRequireEndTimeAfter(now time.Time) Volume4DValidator {
25+
return func(v *Volume4D) error {
26+
if v.EndTime != nil && v.EndTime.Before(now) {
27+
return stacktrace.NewError("End time may not be in the past")
28+
}
29+
return nil
30+
}
31+
}
32+
2433
func WithRequireAltitudeBounds() Volume4DValidator {
2534
return func(v *Volume4D) error {
2635
if v.SpatialVolume.AltitudeLo == nil {
@@ -81,7 +90,7 @@ func Volume4DFromSCDRest(vol4 *restapi.Volume4D, validators ...Volume4DValidator
8190
func UnionVolume4DFromSCDRest(vol4s []restapi.Volume4D, validators ...Volume4DValidator) (*Volume4D, error) {
8291
volumes := make([]*Volume4D, len(vol4s))
8392
for idx, vol4 := range vol4s {
84-
volume, err := Volume4DFromSCDRest(&vol4, validators...)
93+
volume, err := Volume4DFromSCDRest(&vol4)
8594
if err != nil {
8695
return nil, stacktrace.Propagate(err, "Failed to parse volume %d", idx)
8796
}
@@ -92,6 +101,12 @@ func UnionVolume4DFromSCDRest(vol4s []restapi.Volume4D, validators ...Volume4DVa
92101
return nil, stacktrace.Propagate(err, "Failed to union volumes")
93102
}
94103

104+
for _, validator := range validators {
105+
if err := validator(union); err != nil {
106+
return nil, err
107+
}
108+
}
109+
95110
return union, nil
96111
}
97112

pkg/models/scd_conversions_test.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func TestVolume4DFromSCDRest(t *testing.T) {
3333
},
3434
{
3535
name: "Times",
36-
validators: []Volume4DValidator{WithRequireTimeBounds()},
36+
validators: []Volume4DValidator{WithRequireTimeBounds(), WithRequireEndTimeAfter(end.Add(-time.Minute))},
3737
rest: &restapi.Volume4D{TimeStart: &timeStart, TimeEnd: &timeEnd},
3838
want: &Volume4D{
3939
SpatialVolume: &Volume3D{},
@@ -56,6 +56,12 @@ func TestVolume4DFromSCDRest(t *testing.T) {
5656
rest: &restapi.Volume4D{TimeStart: &timeEnd, TimeEnd: &timeStart},
5757
wantErr: true,
5858
},
59+
{
60+
name: "TimeEndExpired",
61+
validators: []Volume4DValidator{WithRequireEndTimeAfter(end.Add(time.Minute))},
62+
rest: &restapi.Volume4D{TimeStart: &timeStart, TimeEnd: &timeEnd},
63+
wantErr: true,
64+
},
5965
{
6066
name: "MissingTimeStart",
6167
validators: []Volume4DValidator{WithRequireTimeBounds()},

pkg/scd/constraints_handler.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,12 @@ func validateAndReturnConstraintUpsertParams(
414414
}
415415

416416
// Start and end times are required for each volume
417-
valid.uExtent, err = dssmodels.UnionVolume4DFromSCDRest(params.Extents, dssmodels.WithRequireTimeBounds())
417+
// The end time may not be in the past
418+
valid.uExtent, err = dssmodels.UnionVolume4DFromSCDRest(
419+
params.Extents,
420+
dssmodels.WithRequireTimeBounds(),
421+
dssmodels.WithRequireEndTimeAfter(now),
422+
)
418423
if err != nil {
419424
return nil, stacktrace.Propagate(err, "Invalid extents")
420425
}

pkg/scd/operational_intents_handler.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -503,15 +503,16 @@ func validateAndReturnOIRUpsertParams(
503503
}
504504

505505
// Start and end times, as well as lower and upper altitudes, are required for each volume
506-
valid.uExtent, err = dssmodels.UnionVolume4DFromSCDRest(params.Extents, dssmodels.WithRequireTimeBounds(), dssmodels.WithRequireAltitudeBounds())
506+
// The end time may not be in the past.
507+
valid.uExtent, err = dssmodels.UnionVolume4DFromSCDRest(
508+
params.Extents,
509+
dssmodels.WithRequireTimeBounds(),
510+
dssmodels.WithRequireAltitudeBounds(),
511+
dssmodels.WithRequireEndTimeAfter(now),
512+
)
507513
if err != nil {
508514
return nil, stacktrace.Propagate(err, "Invalid extents")
509515
}
510-
511-
if now.After(*valid.uExtent.EndTime) {
512-
return nil, stacktrace.NewError("OperationalIntents may not end in the past")
513-
}
514-
515516
valid.cells, err = valid.uExtent.CalculateSpatialCovering()
516517
if err != nil {
517518
return nil, stacktrace.Propagate(err, "Invalid area")

0 commit comments

Comments
 (0)