151 lines
2.9 KiB
Go
151 lines
2.9 KiB
Go
package cluster
|
|
|
|
import (
|
|
"fmt"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/types"
|
|
"k8s.io/client-go/pkg/api/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)
|
|
}
|