From 7d85e85db0292ba4fcddc4dae474bb7201e2b55d Mon Sep 17 00:00:00 2001 From: JJ Jordan Date: Thu, 4 Apr 2019 01:02:27 -0700 Subject: [PATCH] weekdays to use a bitmap, add (minimal) tests --- cmd/kured/main.go | 2 +- pkg/timewindow/days.go | 54 +++++++++++++++++------------ pkg/timewindow/days_test.go | 46 +++++++++++++++++++++++++ pkg/timewindow/timewindow.go | 6 +++- pkg/timewindow/timewindow_test.go | 56 +++++++++++++++++++++++++++++++ 5 files changed, 141 insertions(+), 23 deletions(-) create mode 100644 pkg/timewindow/days_test.go create mode 100644 pkg/timewindow/timewindow_test.go diff --git a/cmd/kured/main.go b/cmd/kured/main.go index 7ca3b21..a4fde16 100644 --- a/cmd/kured/main.go +++ b/cmd/kured/main.go @@ -85,7 +85,7 @@ func main() { rootCmd.PersistentFlags().StringArrayVar(&podSelectors, "blocking-pod-selector", nil, "label selector identifying pods whose presence should prevent reboots") - rootCmd.PersistentFlags().StringSliceVar(&rebootDays, "reboot-on-days", []string{"sun", "mon", "tue", "wed", "thu", "fri", "sat"}, + rootCmd.PersistentFlags().StringSliceVar(&rebootDays, "reboot-on-days", timewindow.EveryDay, "only reboot on these days") rootCmd.PersistentFlags().StringVar(&rebootStart, "start-time", "0:00", "only reboot after this time of day") diff --git a/pkg/timewindow/days.go b/pkg/timewindow/days.go index 298cfe4..2d6c42d 100644 --- a/pkg/timewindow/days.go +++ b/pkg/timewindow/days.go @@ -7,6 +7,9 @@ import ( "time" ) +var EveryDay = []string{"su", "mo", "tu", "we", "th", "fr", "sa"} + +// dayStrings maps day strings to time.Weekdays var dayStrings = map[string]time.Weekday{ "su": time.Sunday, "sun": time.Sunday, @@ -31,39 +34,48 @@ var dayStrings = map[string]time.Weekday{ "saturday": time.Saturday, } -type weekdays []time.Weekday +type weekdays uint32 +// parseWeekdays creates a set of weekdays from a string slice func parseWeekdays(days []string) (weekdays, error) { - var result []time.Weekday + var result uint32 for _, day := range days { - weekday, err := parseWeekday(day) - if err != nil { - return nil, err + if len(day) == 0 { + continue } - result = append(result, weekday) + weekday, err := parseWeekday(day) + if err != nil { + return weekdays(0), err + } + + result |= 1 << uint32(weekday) } return weekdays(result), nil } +// Contains returns true if the specified weekday is a member of this set. func (w weekdays) Contains(day time.Weekday) bool { - for _, d := range w { - if d == day { - return true + return uint32(w)&(1<