From f17bbb587d9681d5f590e947b3b5e78733e98fbc Mon Sep 17 00:00:00 2001 From: Victor Lyuboslavsky Date: Tue, 2 Jul 2024 11:40:44 -0500 Subject: [PATCH] Maintenance window now scheduled weekly on Tuesdays (#20089) #19031 - Maintenance window now scheduled weekly on Tuesdays # Checklist for submitter If some of the following don't apply, delete the relevant line. - [x] Changes file added for user-visible changes in `changes/`, `orbit/changes/` or `ee/fleetd-chrome/changes`. See [Changes files](https://fleetdm.com/docs/contributing/committing-changes#changes-files) for more information. - [x] Added/updated tests - [x] Manual QA for all new/changed functionality --- changes/19031-maintenance-windows-every-week | 1 + server/cron/calendar_cron.go | 23 ++----- server/cron/calendar_cron_test.go | 70 ++++++++++---------- 3 files changed, 41 insertions(+), 53 deletions(-) create mode 100644 changes/19031-maintenance-windows-every-week diff --git a/changes/19031-maintenance-windows-every-week b/changes/19031-maintenance-windows-every-week new file mode 100644 index 0000000000..c23d6dd53a --- /dev/null +++ b/changes/19031-maintenance-windows-every-week @@ -0,0 +1 @@ +- Maintenance window now scheduled weekly on Tuesdays (previously monthly on the third Tuesday of the month) diff --git a/server/cron/calendar_cron.go b/server/cron/calendar_cron.go index f064e87976..874de3dfbc 100644 --- a/server/cron/calendar_cron.go +++ b/server/cron/calendar_cron.go @@ -475,27 +475,14 @@ func attemptCreatingEventOnUserCalendar( func getPreferredCalendarEventDate(year int, month time.Month, today int) time.Time { const ( - // 3rd Tuesday of Month + // Any Tuesday of Month preferredWeekDay = time.Tuesday - preferredOrdinal = 3 ) - - firstDayOfMonth := time.Date(year, month, 1, 0, 0, 0, 0, time.UTC) - offset := int(preferredWeekDay - firstDayOfMonth.Weekday()) - if offset < 0 { - offset += 7 + currentDate := time.Date(year, month, today, 0, 0, 0, 0, time.UTC) + for currentDate.Weekday() != preferredWeekDay { + currentDate = currentDate.AddDate(0, 0, 1) } - preferredDate := firstDayOfMonth.AddDate(0, 0, offset+(7*(preferredOrdinal-1))) - if today > preferredDate.Day() { - // We are past the preferred date, so we move to next month and calculate again. - month := month + 1 - if month == 13 { - month = 1 - year += 1 - } - return getPreferredCalendarEventDate(year, month, 1) - } - return preferredDate + return currentDate } func addBusinessDay(date time.Time) time.Time { diff --git a/server/cron/calendar_cron_test.go b/server/cron/calendar_cron_test.go index 9b2e5dcb6a..e03d633569 100644 --- a/server/cron/calendar_cron_test.go +++ b/server/cron/calendar_cron_test.go @@ -39,28 +39,28 @@ func TestGetPreferredCalendarEventDate(t *testing.T) { expected time.Time }{ { - name: "March 2024 (before 3rd Tuesday)", + name: "March 2024 (before 1st Tuesday)", year: 2024, month: 3, daysStart: 1, - daysEnd: 19, + daysEnd: 5, - expected: date(2024, 3, 19), + expected: date(2024, 3, 5), }, { - name: "March 2024 (past 3rd Tuesday)", + name: "March 2024 (past 1st Tuesday)", year: 2024, month: 3, - daysStart: 20, - daysEnd: 31, + daysStart: 6, + daysEnd: 12, - expected: date(2024, 4, 16), + expected: date(2024, 3, 12), }, { name: "April 2024 (before 3rd Tuesday)", year: 2024, month: 4, - daysStart: 1, + daysStart: 10, daysEnd: 16, expected: date(2024, 4, 16), @@ -70,45 +70,45 @@ func TestGetPreferredCalendarEventDate(t *testing.T) { year: 2024, month: 4, daysStart: 17, - daysEnd: 30, + daysEnd: 23, - expected: date(2024, 5, 21), + expected: date(2024, 4, 23), }, { - name: "May 2024 (before 3rd Tuesday)", - year: 2024, - month: 5, - daysStart: 1, - daysEnd: 21, - - expected: date(2024, 5, 21), - }, - { - name: "May 2024 (after 3rd Tuesday)", + name: "May 2024 (before last Tuesday)", year: 2024, month: 5, daysStart: 22, - daysEnd: 31, + daysEnd: 28, - expected: date(2024, 6, 18), + expected: date(2024, 5, 28), }, { - name: "Dec 2024 (before 3rd Tuesday)", + name: "May 2024 (after last Tuesday)", year: 2024, - month: 12, - daysStart: 1, - daysEnd: 17, - - expected: date(2024, 12, 17), - }, - { - name: "Dec 2024 (after 3rd Tuesday)", - year: 2024, - month: 12, - daysStart: 18, + month: 5, + daysStart: 29, daysEnd: 31, - expected: date(2025, 1, 21), + expected: date(2024, 6, 4), + }, + { + name: "Dec 2025 (before last Tuesday)", + year: 2025, + month: 12, + daysStart: 24, + daysEnd: 30, + + expected: date(2025, 12, 30), + }, + { + name: "Dec 2025 (after last Tuesday)", + year: 2025, + month: 12, + daysStart: 31, + daysEnd: 31, + + expected: date(2026, 1, 6), }, } { t.Run(tc.name, func(t *testing.T) {