Skip to content

Commit

Permalink
Update Check Subdues to allow for overlapping intervals (#4859)
Browse files Browse the repository at this point in the history
Signed-off-by: Christian Kruse <[email protected]>
(cherry picked from commit 19e4166)
  • Loading branch information
c-kruse committed Sep 28, 2022
1 parent 25cace3 commit c09e03c
Show file tree
Hide file tree
Showing 3 changed files with 138 additions and 35 deletions.
71 changes: 71 additions & 0 deletions CHANGELOG-6.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,77 @@ and this project adheres to [Semantic
Versioning](http://semver.org/spec/v2.0.0.html).

## [Unreleased]
## Unreleased

### Changed
- Check subdues are now evaluated on a half open interval such that there
should be no unintended gaps between overlapping subdues.

## [6.8.0] - 2022-08-24

### Changed
- Eventd now prioritizes keepalive events over other events in order to
mitigate the potential of keepalive event creation storms and mass agent
disconnects.

### Added
- GlobalResource interface in core/v3 allows core/v3 resources to
be marked as global resources.
- Added `--api-serve-wait-time` backend flag to delay serving API requests
for a period of time after startup.
- Added `/ready` endpoint to the sensu-go API. Returns 200 when the API is ready
to serve traffic.
- Added `--agent-serve-wait-time` backend flag to delay accepting agent
connections for a period of time after startup.
- Added `/ready` endpoint to the agent listener. Returns 200 when the listener
is ready to accept agent connections.

### Fixed
- Fixed a bug where sensu-backend could crash if the BackendIDGetter
encounters etcd client unavailability.

## [6.7.5] - 2022-08-10

### Security
- Updated the package graphql-go/graphql to address [CVE-2022-37315](https://nvd.nist.gov/vuln/detail/CVE-2022-37315)

## [6.7.4] - 2022-07-12

### Changed
- Upgraded CI Go version to 1.17.12

## [6.7.3] - 2022-07-07

### Changed
- Agents will no longer execute check requests with equal or older issued
timestamps than the issued timestamp for the last executed check request with
the same check name.

## [6.7.2] - 2022-05-12

### Added
- Added the `etcd-unsafe-no-fsync` backend configuration option,
making it possible to run a sensu-backend with an embedded etcd node
for testing and development without placing lots of load on the file
system.

### Fixed
- Print the correct round robin scheduler source (etcd or postgres).

### Changed
- Upgraded etcd version from 3.5.2 to 3.5.4.

## [6.7.1] - 2022-04-28

### Changed
- Cron scheduler now logs that it is stopping before it begins the process of
stopping.

### Fixed
- Fixed several data races in schedulerd.
- Mitigate a data race in agentd sessions.

## [6.7.0] - 2022-04-21

### Added
- Automatically create system namespace and backend entities.
Expand Down
9 changes: 6 additions & 3 deletions api/core/v2/time_window.go
Original file line number Diff line number Diff line change
Expand Up @@ -257,8 +257,9 @@ func (t *TimeWindowRepeated) inAbsoluteTimeRange(actualTime time.Time) bool {
if err != nil {
return false
}
endTime = endTime.Add(time.Second)

return actualTime.After(beginTime) && actualTime.Before(endTime)
return !actualTime.Before(beginTime) && actualTime.Before(endTime)
}

func (t *TimeWindowRepeated) inDayTimeRange(actualTime time.Time, weekday time.Weekday) bool {
Expand All @@ -284,9 +285,10 @@ func (t *TimeWindowRepeated) inDayTimeRange(actualTime time.Time, weekday time.W
thisWeekBegin = thisWeekBegin.AddDate(0, 0, dayOffset)

thisWeekEnd := thisWeekBegin.Add(duration)
thisWeekEnd = thisWeekEnd.Add(time.Second)
thisWeekEnd.In(beginTime.Location())

return actualTime.After(thisWeekBegin) && actualTime.Before(thisWeekEnd)
return !actualTime.Before(thisWeekBegin) && actualTime.Before(thisWeekEnd)
}

func (t *TimeWindowRepeated) inTimeRange(actualTime time.Time) bool {
Expand All @@ -310,8 +312,9 @@ func (t *TimeWindowRepeated) inTimeRange(actualTime time.Time) bool {
todayBegin := time.Date(actualTime.Year(), actualTime.Month(), actualTime.Day(), beginHour, beginMin, beginSec, 0, beginTime.Location())
todayEnd := todayBegin.Add(duration)
todayEnd = todayEnd.In(beginTime.Location())
todayEnd = todayEnd.Add(time.Second)

return actualTime.After(todayBegin) && actualTime.Before(todayEnd)
return !actualTime.Before(todayBegin) && actualTime.Before(todayEnd)
}

func (t *TimeWindowRepeated) inWeekdayTimeRange(actualTime time.Time) bool {
Expand Down
93 changes: 61 additions & 32 deletions api/core/v2/time_window_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -275,120 +275,143 @@ func TestTimeWindowRepeated_InWindows(t *testing.T) {
assert.NotNil(t, location)
}

func parseTime(t *testing.T, s string) time.Time {
ts, err := time.Parse(time.RFC3339, s)
if err != nil {
t.Fatal(err)
}
return ts
}

func TestTimeWindowRepeated_InDayTimeRange(t *testing.T) {

tests := []struct {
name string
beginTime string
endTime string
actualTime string
actualTime time.Time
weekday time.Weekday
expectedResult bool
}{
{
"simple positive",
"2022-03-22T09:00:00+00:00", // tuesday
"2022-03-22T11:00:00+00:00",
"2022-03-22T10:00:00+00:00",
parseTime(t, "2022-03-22T10:00:00+00:00"),
time.Tuesday,
true,
}, {
"simple negative lower hour",
"2022-03-22T09:00:00+00:00",
"2022-03-22T11:00:00+00:00",
"2022-03-22T08:00:00+00:00",
parseTime(t, "2022-03-22T08:00:00+00:00"),
time.Tuesday,
false,
}, {
"simple negative higher hour",
"2022-03-22T09:00:00+00:00",
"2022-03-22T11:00:00+00:00",
"2022-03-22T13:00:00+00:00",
parseTime(t, "2022-03-22T13:00:00+00:00"),
time.Tuesday,
false,
}, {
"simple negative lower minutes",
"2022-03-22T09:00:00+00:00",
"2022-03-22T11:00:00+00:00",
"2022-03-22T08:59:00+00:00",
parseTime(t, "2022-03-22T08:59:00+00:00"),
time.Tuesday,
false,
}, {
"simple negative higher minutes",
"2022-03-22T09:00:00+00:00",
"2022-03-22T11:00:00+00:00",
"2022-03-22T11:01:00+00:00",
parseTime(t, "2022-03-22T11:01:00+00:00"),
time.Tuesday,
false,
}, {
"simple negative lower seconds",
"2022-03-22T09:00:00+00:00",
"2022-03-22T11:00:00+00:00",
"2022-03-22T08:59:59+00:00",
parseTime(t, "2022-03-22T08:59:59+00:00"),
time.Tuesday,
false,
}, {
"simple negative higher seconds",
"2022-03-22T09:00:00+00:00",
"2022-03-22T11:00:00+00:00",
"2022-03-22T11:00:01+00:00",
parseTime(t, "2022-03-22T11:00:01+00:00"),
time.Tuesday,
false,
}, {
"simple negative different day before",
"2022-03-22T09:00:00+00:00",
"2022-03-22T11:00:00+00:00",
"2022-03-21T10:00:00+00:00", // monday
parseTime(t, "2022-03-21T10:00:00+00:00"), // monday
time.Tuesday,
false,
}, {
"simple negative different day after",
"2022-03-22T09:00:00+00:00",
"2022-03-22T11:00:00+00:00",
"2022-03-23T10:00:00+00:00", // wednesday
parseTime(t, "2022-03-23T10:00:00+00:00"), // wednesday
time.Tuesday,
false,
}, {
"positive next week",
"2022-03-22T09:00:00-07:00",
"2022-03-22T11:00:00-07:00",
"2022-03-29T10:00:00-07:00", // wednesday
parseTime(t, "2022-03-29T10:00:00-07:00"), // wednesday
time.Tuesday,
true,
}, {
"negative next week before",
"2022-03-22T09:00:00-07:00",
"2022-03-22T11:00:00-07:00",
"2022-03-27T10:00:00-07:00", // wednesday
parseTime(t, "2022-03-27T10:00:00-07:00"), // wednesday
time.Tuesday,
false,
}, {
"negative next week after",
"2022-03-22T09:00:00-07:00",
"2022-03-22T11:00:00-07:00",
"2022-03-30T10:00:00-07:00", // wednesday
parseTime(t, "2022-03-30T10:00:00-07:00"), // wednesday
time.Tuesday,
false,
}, {
"positive next week different time offset",
"2022-03-22T09:00:00+00:00",
"2022-03-22T11:00:00+00:00",
"2022-03-29T06:00:00-04:00", // wednesday
parseTime(t, "2022-03-29T06:00:00-04:00"), // wednesday
time.Tuesday,
true,
}, {
"positive multi days",
"2022-03-22T09:00:00+00:00",
"2022-03-24T11:00:00+00:00",
"2022-03-30T06:00:00-04:00", // wednesday
parseTime(t, "2022-03-30T06:00:00-04:00"), // wednesday
time.Tuesday,
true,
}, {
"negative previous week",
"2022-03-22T09:00:00-04:00",
"2022-03-22T11:00:00-04:00",
"2022-03-15T10:00:00-04:00", // tuesday
parseTime(t, "2022-03-15T10:00:00-04:00"), // tuesday
time.Tuesday,
false,
}, {
"GH-4847 lower bound day time range",
"2022-03-22T09:00:00+00:00",
"2022-03-22T11:00:00+00:00",
parseTime(t, "2022-03-22T09:00:00+00:00"),
time.Tuesday,
true,
}, {
"GH-4847 upper bound day time range",
"2022-03-22T09:00:00+00:00",
"2022-03-22T11:00:00+00:00",
parseTime(t, "2022-03-22T11:00:01+00:00").Add(-1 * time.Nanosecond),
time.Tuesday,
true,
},
}

Expand All @@ -399,10 +422,7 @@ func TestTimeWindowRepeated_InDayTimeRange(t *testing.T) {
End: test.endTime,
}

actualTime, err := time.Parse(time.RFC3339, test.actualTime)
require.NoError(t, err)

assert.Equal(t, test.expectedResult, window.inDayTimeRange(actualTime, test.weekday))
assert.Equal(t, test.expectedResult, window.inDayTimeRange(test.actualTime, test.weekday))
})
}
}
Expand All @@ -412,51 +432,63 @@ func TestTimeWindowRepeated_InTimeRange(t *testing.T) {
name string
beginTime string
endTime string
actualTime string
actualTime time.Time
expectedResult bool
}{
{
"simple positive",
"2022-03-22T09:00:00+00:00", // tuesday
"2022-03-22T11:00:00+00:00",
"2022-03-22T10:00:00+00:00",
parseTime(t, "2022-03-22T10:00:00+00:00"),
true,
}, {
"negative before valid times",
"2022-03-22T09:00:00-07:00", // tuesday
"2022-03-22T11:00:00-07:00",
"2022-01-12T10:00:00-07:00",
parseTime(t, "2022-01-12T10:00:00-07:00"),
false,
}, {
"simple negative before",
"2022-03-22T09:00:00+00:00", // tuesday
"2022-03-22T11:00:00+00:00",
"2022-03-22T08:00:00+00:00",
parseTime(t, "2022-03-22T08:00:00+00:00"),
false,
}, {
"simple negative after",
"2022-03-22T09:00:00+00:00", // tuesday
"2022-03-22T11:00:00+00:00",
"2022-03-22T11:05:00+00:00",
parseTime(t, "2022-03-22T11:05:00+00:00"),
false,
}, {
"positive after different day",
"2022-03-22T09:00:00-07:00", // tuesday
"2022-03-22T11:00:00-07:00",
"2023-01-12T10:00:00-07:00",
parseTime(t, "2023-01-12T10:00:00-07:00"),
true,
}, {
"negative before different day",
"2022-03-22T09:00:00-07:00", // tuesday
"2022-03-22T11:00:00-07:00",
"2021-01-12T12:00:00-07:00",
parseTime(t, "2021-01-12T12:00:00-07:00"),
false,
}, {
"negative after different day",
"2022-03-22T09:00:00-07:00", // tuesday
"2022-03-22T11:00:00-07:00",
"2023-01-12T08:59:59-07:00",
parseTime(t, "2023-01-12T08:59:59-07:00"),
false,
}, {
"GH-4847 lower bound time range",
"2022-03-22T09:00:00+00:00", // tuesday
"2022-03-22T11:00:00+00:00",
parseTime(t, "2022-03-22T09:00:00+00:00"),
true,
}, {
"GH-4847 upper bound time range",
"2022-03-22T09:00:00+00:00", // tuesday
"2022-03-22T11:00:00+00:00",
parseTime(t, "2022-03-22T11:00:01+00:00").Add(-1 * time.Nanosecond),
true,
},
}

Expand All @@ -467,10 +499,7 @@ func TestTimeWindowRepeated_InTimeRange(t *testing.T) {
End: test.endTime,
}

actualTime, err := time.ParseInLocation(time.RFC3339, test.actualTime, time.UTC)
require.NoError(t, err)

assert.Equal(t, test.expectedResult, window.inTimeRange(actualTime))
assert.Equal(t, test.expectedResult, window.inTimeRange(test.actualTime))
})
}
}
Expand Down

0 comments on commit c09e03c

Please sign in to comment.