Select Git revision
actions.go 2.93 KiB
package cluster
import (
"fmt"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/types"
"k8s.io/api/core/v1"
)
var NoActions []Action = []Action{}
type ActionHash [16]byte
var orphanDependents bool = true
var deleteOptions *metav1.DeleteOptions = &metav1.DeleteOptions{
OrphanDependents: &orphanDependents,
}
type CreateService struct {
ActionService
}
type UpdateService struct {
ActionService
}
type DeleteService struct {
ActionService
}
type MetaData struct {
cluster *Cluster
namespace string
}
type ActionService struct {
meta MetaData
name string
role PostgresRole
service *v1.Service
}
type Action interface {
Process() error
Name() string
GetMeta() MetaData
SetCluster(*Cluster)
}
func CheckAction(action Action) error {
if action.GetMeta().cluster == nil {
return fmt.Errorf("no valid cluster for %v", action)
}
return nil
}
func (action UpdateService) Process() error {
var (
err error
patchData []byte
updatedService *v1.Service
)
if err := CheckAction(action); err != nil {
return err
}
meta := action.GetMeta()
service := action.service
if len(service.ObjectMeta.Annotations) > 0 {
patchData, err = servicePatchData(service.Spec, service.ObjectMeta.Annotations)
if err != nil {
msg := "could not prepare patch data with annotations for service %q: %v"
return fmt.Errorf(msg, action.name, err)
}
} else {
patchData, err = specPatch(service.Spec)
if err != nil {
msg := "could not prepare patch data for service %q: %v"
return fmt.Errorf(msg, action.name, err)
}
}
if updatedService, err = meta.cluster.KubeClient.
Services(meta.namespace).
Patch(action.name, types.MergePatchType, patchData, ""); err != nil {
return err
}
meta.cluster.Services[action.role] = updatedService
return nil
}
func (action CreateService) Process() error {
var (
err error
newService *v1.Service
)
if err := CheckAction(action); err != nil {
return err
}
meta := action.GetMeta()
if newService, err = meta.cluster.KubeClient.
Services(meta.namespace).
Create(action.service); err != nil {
return err
}
meta.cluster.Services[action.role] = newService
return nil
}
func (action DeleteService) Process() error {
if err := CheckAction(action); err != nil {
return err
}
meta := action.GetMeta()
if err := meta.cluster.KubeClient.
Services(meta.namespace).
Delete(action.name, deleteOptions); err != nil {
return err
}
meta.cluster.Services[action.role] = nil
return nil
}
func (action ActionService) SetCluster(client *Cluster) {
action.meta.cluster = client
}
func (action ActionService) GetMeta() MetaData {
return action.meta
}
func (action UpdateService) Name() string {
return fmt.Sprintf("Update service %s", action.name)
}
func (action CreateService) Name() string {
return fmt.Sprintf("Create a new service")
}
func (action DeleteService) Name() string {
return fmt.Sprintf("Delete service %s", action.name)
}