Change maintenance window format
This commit is contained in:
parent
d39cfaab43
commit
f7aaf8863d
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue