Skip to content

Commit

Permalink
godo/kubernetes: add maintenance policy support
Browse files Browse the repository at this point in the history
This PR adds the maintenance policy support for the upcoming Maintenance
Window feature on the Managed Kubernetes service.
  • Loading branch information
fatih committed Apr 15, 2019
1 parent 2e7ec72 commit 0b49e8a
Show file tree
Hide file tree
Showing 2 changed files with 109 additions and 6 deletions.
81 changes: 79 additions & 2 deletions kubernetes.go
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,15 @@ type KubernetesClusterCreateRequest struct {
VPCUUID string `json:"vpc_uuid,omitempty"`

NodePools []*KubernetesNodePoolCreateRequest `json:"node_pools,omitempty"`

MaintenancePolicy *KubernetesMaintenancePolicy `json:"maintenance_policy"`
}

// KubernetesClusterUpdateRequest represents a request to update a Kubernetes cluster.
type KubernetesClusterUpdateRequest struct {
Name string `json:"name,omitempty"`
Tags []string `json:"tags,omitempty"`
Name string `json:"name,omitempty"`
Tags []string `json:"tags,omitempty"`
MaintenancePolicy *KubernetesMaintenancePolicy `json:"maintenance_policy"`
}

// KubernetesNodePoolCreateRequest represents a request to create a node pool for a
Expand Down Expand Up @@ -99,11 +102,85 @@ type KubernetesCluster struct {

NodePools []*KubernetesNodePool `json:"node_pools,omitempty"`

MaintenancePolicy *KubernetesMaintenancePolicy `json:"maintenance_policy,omitempty"`

Status *KubernetesClusterStatus `json:"status,omitempty"`
CreatedAt time.Time `json:"created_at,omitempty"`
UpdatedAt time.Time `json:"updated_at,omitempty"`
}

// KubernetesMaintenancePolicy is a configuration to set the maintenance window
// of a cluster
type KubernetesMaintenancePolicy struct {
StartTime string `json:"start_time"`
Duration string `json:"duration"`
Day KubernetesMaintenancePolicyDay `json:"day"`
}

// KubernetesMaintenancePolicyDay represents the possible days of a maintenance
// window
type KubernetesMaintenancePolicyDay int

const (
KubernetesMaintenanceDayAny KubernetesMaintenancePolicyDay = iota
KubernetesMaintenanceDayMonday
KubernetesMaintenanceDayTuesday
KubernetesMaintenanceDayWednesday
KubernetesMaintenanceDayThursday
KubernetesMaintenanceDayFriday
KubernetesMaintenanceDaySaturday
KubernetesMaintenanceDaySunday
)

var (
days = [...]string{
"any",
"monday",
"tuesday",
"wednesday",
"thursday",
"friday",
"saturday",
"sunday",
}

toDay = map[string]KubernetesMaintenancePolicyDay{
"any": KubernetesMaintenanceDayAny,
"monday": KubernetesMaintenanceDayMonday,
"tuesday": KubernetesMaintenanceDayTuesday,
"wednesday": KubernetesMaintenanceDayWednesday,
"thursday": KubernetesMaintenanceDayThursday,
"friday": KubernetesMaintenanceDayFriday,
"saturday": KubernetesMaintenanceDaySaturday,
"sunday": KubernetesMaintenanceDaySunday,
}
)

func (k KubernetesMaintenancePolicyDay) String() string {
if KubernetesMaintenanceDayAny <= k && k <= KubernetesMaintenanceDaySunday {
return days[k]
}
return fmt.Sprintf("%d !Weekday", k)
}

func (k *KubernetesMaintenancePolicyDay) UnmarshalJSON(data []byte) error {
val := string(data)
parsed, ok := toDay[strings.Trim(val, `"`)]
if !ok {
return fmt.Errorf("unknown day: %q", val)
}
*k = parsed
return nil
}

func (k KubernetesMaintenancePolicyDay) MarshalJSON() ([]byte, error) {
if KubernetesMaintenanceDayAny <= k && k <= KubernetesMaintenanceDaySunday {
return []byte(`"` + days[k] + `"`), nil
}

return nil, fmt.Errorf("invalid weekday: %q", k)
}

// Possible states for a cluster.
const (
KubernetesClusterStatusProvisioning = KubernetesClusterStatusState("provisioning")
Expand Down
34 changes: 30 additions & 4 deletions kubernetes_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,10 @@ func TestKubernetesClusters_Get(t *testing.T) {
},
},
},
MaintenancePolicy: &KubernetesMaintenancePolicy{
StartTime: "00:00",
Day: KubernetesMaintenanceDayMonday,
},
CreatedAt: time.Date(2018, 6, 15, 7, 10, 23, 0, time.UTC),
UpdatedAt: time.Date(2018, 6, 15, 7, 11, 26, 0, time.UTC),
}
Expand Down Expand Up @@ -294,6 +298,10 @@ func TestKubernetesClusters_Get(t *testing.T) {
]
}
],
"maintenance_policy": {
"start_time": "00:00",
"day": "monday"
},
"created_at": "2018-06-15T07:10:23Z",
"updated_at": "2018-06-15T07:11:26Z"
}
Expand Down Expand Up @@ -348,6 +356,10 @@ func TestKubernetesClusters_Create(t *testing.T) {
Tags: []string{"tag-1"},
},
},
MaintenancePolicy: &KubernetesMaintenancePolicy{
StartTime: "00:00",
Day: KubernetesMaintenanceDayMonday,
},
}
createRequest := &KubernetesClusterCreateRequest{
Name: want.Name,
Expand All @@ -363,6 +375,7 @@ func TestKubernetesClusters_Create(t *testing.T) {
Tags: want.NodePools[0].Tags,
},
},
MaintenancePolicy: want.MaintenancePolicy,
}

jBlob := `
Expand All @@ -389,7 +402,11 @@ func TestKubernetesClusters_Create(t *testing.T) {
"tag-1"
]
}
]
],
"maintenance_policy": {
"start_time": "00:00",
"day": "monday"
}
}
}`

Expand Down Expand Up @@ -434,10 +451,15 @@ func TestKubernetesClusters_Update(t *testing.T) {
Tags: []string{"tag-1"},
},
},
MaintenancePolicy: &KubernetesMaintenancePolicy{
StartTime: "00:00",
Day: KubernetesMaintenanceDayMonday,
},
}
updateRequest := &KubernetesClusterUpdateRequest{
Name: want.Name,
Tags: want.Tags,
Name: want.Name,
Tags: want.Tags,
MaintenancePolicy: want.MaintenancePolicy,
}

jBlob := `
Expand All @@ -464,7 +486,11 @@ func TestKubernetesClusters_Update(t *testing.T) {
"tag-1"
]
}
]
],
"maintenance_policy": {
"start_time": "00:00",
"day": "monday"
}
}
}`

Expand Down

0 comments on commit 0b49e8a

Please sign in to comment.