fix weekday parsing in MaintenanceWindow

This commit is contained in:
Murat Kabilov 2017-05-24 18:38:03 +02:00
parent 94e175eb12
commit 86d9b8c71c
1 changed files with 27 additions and 12 deletions

View File

@ -12,8 +12,6 @@ import (
"k8s.io/client-go/pkg/api/v1" "k8s.io/client-go/pkg/api/v1"
) )
var alphaRegexp = regexp.MustCompile("^[a-zA-Z]*$")
type MaintenanceWindow struct { type MaintenanceWindow struct {
StartTime time.Time // Start time StartTime time.Time // Start time
StartWeekday time.Weekday // Start weekday StartWeekday time.Weekday // Start weekday
@ -96,7 +94,10 @@ type PostgresqlList struct {
Items []Postgresql `json:"items"` Items []Postgresql `json:"items"`
} }
func parseTime(s string) (t time.Time, wd time.Weekday, wdProvided bool, err error) { var alphaRegexp = regexp.MustCompile("^[a-zA-Z]*$")
var weekdays = map[string]int{"Sun":0, "Mon":1, "Tue":2, "Wed":3, "Thu":4, "Fri":5, "Sat":6}
func ParseTime(s string) (t time.Time, wd time.Weekday, wdProvided bool, err error) {
var timeLayout string var timeLayout string
parts := strings.Split(s, ":") parts := strings.Split(s, ":")
@ -107,6 +108,12 @@ func parseTime(s string) (t time.Time, wd time.Weekday, wdProvided bool, err err
} }
timeLayout = "Mon:15:04" timeLayout = "Mon:15:04"
wdProvided = true wdProvided = true
weekday, ok := weekdays[parts[0]]
if !ok {
err = fmt.Errorf("incorrect weekday")
return
}
wd = time.Weekday(weekday)
} else { } else {
wdProvided = false wdProvided = false
timeLayout = "15:04" timeLayout = "15:04"
@ -116,8 +123,6 @@ func parseTime(s string) (t time.Time, wd time.Weekday, wdProvided bool, err err
if err != nil { if err != nil {
return return
} }
wd = tp.Weekday()
t = tp.UTC() t = tp.UTC()
return return
@ -125,7 +130,7 @@ func parseTime(s string) (t time.Time, wd time.Weekday, wdProvided bool, err err
func (m *MaintenanceWindow) MarshalJSON() ([]byte, error) { func (m *MaintenanceWindow) MarshalJSON() ([]byte, error) {
var startWd, endWd string var startWd, endWd string
if m.StartWeekday == time.Sunday && m.EndWeekday == time.Saturday { if m.StartWeekday == time.Monday && m.EndWeekday == time.Sunday {
startWd = "" startWd = ""
endWd = "" endWd = ""
} else { } else {
@ -151,12 +156,12 @@ func (m *MaintenanceWindow) UnmarshalJSON(data []byte) error {
return fmt.Errorf("incorrect maintenance window format") return fmt.Errorf("incorrect maintenance window format")
} }
got.StartTime, got.StartWeekday, weekdayProvidedFrom, err = parseTime(parts[0]) got.StartTime, got.StartWeekday, weekdayProvidedFrom, err = ParseTime(parts[0])
if err != nil { if err != nil {
return err return err
} }
got.EndTime, got.EndWeekday, weekdayProvidedTo, err = parseTime(parts[1]) got.EndTime, got.EndWeekday, weekdayProvidedTo, err = ParseTime(parts[1])
if err != nil { if err != nil {
return err return err
} }
@ -165,9 +170,13 @@ func (m *MaintenanceWindow) UnmarshalJSON(data []byte) error {
return fmt.Errorf("'From' time must be prior to the 'To' time") return fmt.Errorf("'From' time must be prior to the 'To' time")
} }
if (int(got.StartWeekday) + 6) % 7 > (int(got.EndWeekday) + 6) % 7 {
return fmt.Errorf("'From' weekday must be prior to the 'To' weekday")
}
if !weekdayProvidedFrom || !weekdayProvidedTo { if !weekdayProvidedFrom || !weekdayProvidedTo {
got.StartWeekday = time.Sunday got.StartWeekday = time.Monday
got.EndWeekday = time.Saturday got.EndWeekday = time.Sunday
} }
*m = got *m = got
@ -191,11 +200,17 @@ func (pl *PostgresqlList) GetListMeta() unversioned.List {
return &pl.Metadata return &pl.Metadata
} }
func clusterName(clusterName string, teamName string) (string, error) { func extractClusterName(clusterName string, teamName string) (string, error) {
teamNameLen := len(teamName) teamNameLen := len(teamName)
if len(clusterName) < teamNameLen+2 { if len(clusterName) < teamNameLen+2 {
return "", fmt.Errorf("name is too short") return "", fmt.Errorf("name is too short")
} }
if teamNameLen == 0 {
return "", fmt.Errorf("Team name is empty")
}
if strings.ToLower(clusterName[:teamNameLen+1]) != strings.ToLower(teamName)+"-" { if strings.ToLower(clusterName[:teamNameLen+1]) != strings.ToLower(teamName)+"-" {
return "", fmt.Errorf("name must match {TEAM}-{NAME} format") return "", fmt.Errorf("name must match {TEAM}-{NAME} format")
} }
@ -228,7 +243,7 @@ func (p *Postgresql) UnmarshalJSON(data []byte) error {
} }
tmp2 := Postgresql(tmp) tmp2 := Postgresql(tmp)
clusterName, err := clusterName(tmp2.Metadata.Name, tmp2.Spec.TeamID) clusterName, err := extractClusterName(tmp2.Metadata.Name, tmp2.Spec.TeamID)
if err == nil { if err == nil {
tmp2.Spec.ClusterName = clusterName tmp2.Spec.ClusterName = clusterName
} else { } else {