Skip to content
Snippets Groups Projects
Select Git revision
  • 736738b865779c3b23e0ce063da66a43627272fa
  • master default protected
  • spilo-wale-removal
  • dependabot/go_modules/golang.org/x/oauth2-0.27.0
  • bug-upgrade
  • gh-pages
  • patroni-4-integration
  • remove-zappr
  • ignore-auto-upgrade
  • arm-pooler
  • update-go-and-deps
  • pluralsh-liveness-probe
  • silenium-dev-master
  • bump-v1.9.1
  • enable-query-logging
  • bump-v1.7.1
  • resize-mixed-mode
  • instance-annotation
  • bump-v1.8.2
  • clone-bucket-prefix
  • bump-v1.8.1
  • v1.14.0
  • v1.13.0
  • v1.12.2
  • v1.12.1
  • v1.12.0
  • v1.11.0
  • v1.10.1
  • v1.10.0
  • v1.9.0
  • v1.8.2
  • v1.8.1
  • v1.8.0
  • v1.7.1
  • v1.7.0
  • v1.6.3
  • v1.6.2
  • v1.6.1
  • v1.6.0
  • v1.5.0
  • v1.4.0
41 results

actions.go

Blame
  • user avatar
    erthalion authored
    736738b8
    History
    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)
    }