Change maintenance window format

This commit is contained in:
Murat Kabilov 2017-05-30 09:56:10 +02:00 committed by GitHub
parent d39cfaab43
commit f7aaf8863d
2 changed files with 61 additions and 53 deletions

View File

@ -43,4 +43,4 @@ spec:
maximum_lag_on_failover: 33554432 maximum_lag_on_failover: 33554432
maintenanceWindows: maintenanceWindows:
- 01:00-06:00 #UTC - 01:00-06:00 #UTC
- Sat:00:00-Sat:04:00 - Sat:00:00-04:00

View File

@ -3,7 +3,6 @@ package spec
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"regexp"
"strings" "strings"
"time" "time"
@ -12,14 +11,11 @@ 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 Everyday bool
StartWeekday time.Weekday // Start weekday Weekday time.Weekday
StartTime time.Time // Start time
EndTime time.Time // End time EndTime time.Time // End time
EndWeekday time.Weekday // End weekday
} }
type Volume struct { type Volume struct {
@ -71,7 +67,7 @@ type Postgresql struct {
Metadata v1.ObjectMeta `json:"metadata"` Metadata v1.ObjectMeta `json:"metadata"`
Spec PostgresSpec `json:"spec"` Spec PostgresSpec `json:"spec"`
Status PostgresStatus `json:"status"` Status PostgresStatus `json:"status,omitempty"`
Error error `json:"-"` Error error `json:"-"`
} }
@ -96,54 +92,49 @@ 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 weekdays = map[string]int{"Sun": 0, "Mon": 1, "Tue": 2, "Wed": 3, "Thu": 4, "Fri": 5, "Sat": 6}
var timeLayout string
func parseTime(s string) (time.Time, error) {
parts := strings.Split(s, ":") parts := strings.Split(s, ":")
if len(parts) == 3 { if len(parts) != 2 {
if len(parts[0]) != 3 || !alphaRegexp.MatchString(parts[0]) { return time.Time{}, fmt.Errorf("incorrect time format")
err = fmt.Errorf("weekday must be 3 characters length")
return
}
timeLayout = "Mon:15:04"
wdProvided = true
} else {
wdProvided = false
timeLayout = "15:04"
} }
timeLayout := "15:04"
tp, err := time.Parse(timeLayout, s) tp, err := time.Parse(timeLayout, s)
if err != nil { if err != nil {
return return time.Time{}, err
} }
wd = tp.Weekday() return tp.UTC(), nil
t = tp.UTC() }
return func parseWeekday(s string) (time.Weekday, error) {
weekday, ok := weekdays[s]
if !ok {
return time.Weekday(0), fmt.Errorf("incorrect weekday")
}
return time.Weekday(weekday), nil
} }
func (m *MaintenanceWindow) MarshalJSON() ([]byte, error) { func (m *MaintenanceWindow) MarshalJSON() ([]byte, error) {
var startWd, endWd string if m.Everyday {
if m.StartWeekday == time.Sunday && m.EndWeekday == time.Saturday { return []byte(fmt.Sprintf("\"%s-%s\"",
startWd = "" m.StartTime.Format("15:04"),
endWd = "" m.EndTime.Format("15:04"))), nil
} else { } else {
startWd = m.StartWeekday.String()[:3] + ":" return []byte(fmt.Sprintf("\"%s:%s-%s\"",
endWd = m.EndWeekday.String()[:3] + ":" m.Weekday.String()[:3],
m.StartTime.Format("15:04"),
m.EndTime.Format("15:04"))), nil
} }
return []byte(fmt.Sprintf("\"%s%s-%s%s\"",
startWd, m.StartTime.Format("15:04"),
endWd, m.EndTime.Format("15:04"))), nil
} }
func (m *MaintenanceWindow) UnmarshalJSON(data []byte) error { func (m *MaintenanceWindow) UnmarshalJSON(data []byte) error {
var ( var (
got MaintenanceWindow got MaintenanceWindow
weekdayProvidedFrom bool err error
weekdayProvidedTo bool
err error
) )
parts := strings.Split(string(data[1:len(data)-1]), "-") parts := strings.Split(string(data[1:len(data)-1]), "-")
@ -151,25 +142,35 @@ 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]) fromParts := strings.Split(parts[0], ":")
switch len(fromParts) {
case 3:
got.Everyday = false
got.Weekday, err = parseWeekday(fromParts[0])
if err != nil {
return fmt.Errorf("could not parse weekday: %v", err)
}
got.StartTime, err = parseTime(fromParts[1] + ":" + fromParts[2])
case 2:
got.Everyday = true
got.StartTime, err = parseTime(fromParts[0] + ":" + fromParts[1])
default:
return fmt.Errorf("incorrect maintenance window format")
}
if err != nil { if err != nil {
return err return fmt.Errorf("could not parse start time: %v", err)
} }
got.EndTime, got.EndWeekday, weekdayProvidedTo, err = parseTime(parts[1]) got.EndTime, err = parseTime(parts[1])
if err != nil { if err != nil {
return err return fmt.Errorf("could not parse end time: %v", err)
} }
if got.EndTime.Before(got.StartTime) { if got.EndTime.Before(got.StartTime) {
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 !weekdayProvidedFrom || !weekdayProvidedTo {
got.StartWeekday = time.Sunday
got.EndWeekday = time.Saturday
}
*m = got *m = got
return nil return nil
@ -191,11 +192,16 @@ 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")
} }
@ -211,7 +217,8 @@ type PostgresqlListCopy PostgresqlList
type PostgresqlCopy Postgresql type PostgresqlCopy Postgresql
func (p *Postgresql) UnmarshalJSON(data []byte) error { func (p *Postgresql) UnmarshalJSON(data []byte) error {
tmp := PostgresqlCopy{} var tmp PostgresqlCopy
err := json.Unmarshal(data, &tmp) err := json.Unmarshal(data, &tmp)
if err != nil { if err != nil {
metaErr := json.Unmarshal(data, &tmp.Metadata) metaErr := json.Unmarshal(data, &tmp.Metadata)
@ -228,7 +235,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 {
@ -241,7 +248,8 @@ func (p *Postgresql) UnmarshalJSON(data []byte) error {
} }
func (pl *PostgresqlList) UnmarshalJSON(data []byte) error { func (pl *PostgresqlList) UnmarshalJSON(data []byte) error {
tmp := PostgresqlListCopy{} var tmp PostgresqlListCopy
err := json.Unmarshal(data, &tmp) err := json.Unmarshal(data, &tmp)
if err != nil { if err != nil {
return err return err