loadBalancerSourceRanges update

This commit is contained in:
Murat Kabilov 2017-03-08 15:43:24 +01:00
parent fc127069ab
commit 1c6e7ac2e7
3 changed files with 42 additions and 22 deletions

View File

@ -23,6 +23,7 @@ import (
"github.bus.zalan.do/acid/postgres-operator/pkg/util"
"github.bus.zalan.do/acid/postgres-operator/pkg/util/constants"
"github.bus.zalan.do/acid/postgres-operator/pkg/util/k8sutil"
"github.bus.zalan.do/acid/postgres-operator/pkg/util/resources"
"github.bus.zalan.do/acid/postgres-operator/pkg/util/teams"
)
@ -93,7 +94,7 @@ func (c *Cluster) Run(stopCh <-chan struct{}) {
<-stopCh
}
func (c *Cluster) NeedsRollingUpdate(otherSpec *spec.Postgresql) bool {
func (c *Cluster) needsRollingUpdate(otherSpec *spec.Postgresql) bool {
//TODO: add more checks
if c.Spec.Version != otherSpec.Spec.Version {
return true
@ -124,7 +125,7 @@ func (c *Cluster) MustSetStatus(status spec.PostgresStatus) {
}
if err != nil {
c.logger.Fatalf("Can't set status for cluster '%s': %s", c.ClusterName(), err)
c.logger.Warningf("Can't set status for cluster '%s': %s", c.ClusterName(), err)
}
}
@ -132,13 +133,13 @@ func (c *Cluster) Create() error {
//TODO: service will create endpoint implicitly
ep, err := c.createEndpoint()
if err != nil {
return fmt.Errorf("Can't create endpoint: %s", err)
return fmt.Errorf("Can't create Endpoint: %s", err)
}
c.logger.Infof("Endpoint '%s' has been successfully created", util.NameFromMeta(ep.ObjectMeta))
service, err := c.createService()
if err != nil {
return fmt.Errorf("Can't create service: %s", err)
return fmt.Errorf("Can't create Service: %s", err)
} else {
c.logger.Infof("Service '%s' has been successfully created", util.NameFromMeta(service.ObjectMeta))
}
@ -187,22 +188,40 @@ func (c *Cluster) Create() error {
return nil
}
func (c *Cluster) Update(newSpec *spec.Postgresql, rollingUpdate bool) error {
func (c *Cluster) Update(newSpec *spec.Postgresql) error {
c.logger.Infof("Cluster update from version %s to %s",
c.Metadata.ResourceVersion, newSpec.Metadata.ResourceVersion)
rollingUpdate := c.needsRollingUpdate(newSpec)
if rollingUpdate {
c.logger.Infof("Pods need to be recreated")
}
newStatefulSet := getStatefulSet(c.ClusterName(), newSpec.Spec, c.etcdHost, c.dockerImage)
newService := resources.Service(c.ClusterName(), newSpec.Spec.AllowedSourceRanges)
if !servicesEqual(newService, c.Service) {
c.logger.Infof("Service needs to be upated")
if err := c.updateService(newService); err != nil {
return fmt.Errorf("Can't update Service: %s", err)
} else {
c.logger.Infof("Service has been updated")
}
}
if !reflect.DeepEqual(newSpec.Spec.Volume, c.Spec.Volume) {
//TODO: update PVC
}
//TODO: mind the case of updating allowedSourceRanges
if err := c.updateStatefulSet(newStatefulSet); err != nil {
return fmt.Errorf("Can't upate cluster: %s", err)
return fmt.Errorf("Can't upate StatefulSet: %s", err)
}
if rollingUpdate {
// TODO: wait for actual streaming to the replica
if err := c.recreatePods(); err != nil {
return fmt.Errorf("Can't recreate pods: %s", err)
return fmt.Errorf("Can't recreate Pods: %s", err)
}
}
@ -211,13 +230,13 @@ func (c *Cluster) Update(newSpec *spec.Postgresql, rollingUpdate bool) error {
func (c *Cluster) Delete() error {
if err := c.deleteEndpoint(); err != nil {
c.logger.Errorf("Can't delete endpoint: %s", err)
c.logger.Errorf("Can't delete Endpoint: %s", err)
} else {
c.logger.Infof("Endpoint '%s' has been deleted", util.NameFromMeta(c.Endpoint.ObjectMeta))
}
if err := c.deleteService(); err != nil {
c.logger.Errorf("Can't delete service: %s", err)
c.logger.Errorf("Can't delete Service: %s", err)
} else {
c.logger.Infof("Service '%s' has been deleted", util.NameFromMeta(c.Service.ObjectMeta))
}
@ -230,14 +249,14 @@ func (c *Cluster) Delete() error {
for _, obj := range c.Secrets {
if err := c.deleteSecret(obj); err != nil {
c.logger.Errorf("Can't delete secret: %s", err)
c.logger.Errorf("Can't delete Secret: %s", err)
} else {
c.logger.Infof("Secret '%s' has been deleted", util.NameFromMeta(obj.ObjectMeta))
}
}
if err := c.deletePods(); err != nil {
c.logger.Errorf("Can't delete pods: %s", err)
c.logger.Errorf("Can't delete Pods: %s", err)
} else {
c.logger.Infof("Pods have been deleted")
}

View File

@ -3,6 +3,7 @@ package cluster
import (
"context"
"fmt"
"reflect"
"strings"
"time"
@ -184,3 +185,12 @@ func (c *Cluster) deleteEtcdKey() error {
return nil
}
func servicesEqual(svc1, svc2 *v1.Service) bool {
//TODO: improve me
if reflect.DeepEqual(svc1.Spec.LoadBalancerSourceRanges, svc2.Spec.LoadBalancerSourceRanges) {
return true
}
return false
}

View File

@ -132,28 +132,19 @@ func (c *Controller) postgresqlUpdate(prev, cur interface{}) {
return
}
pgCluster := c.clusters[clusterName] // current
if reflect.DeepEqual(pgPrev.Spec, pgNew.Spec) {
c.logger.Infof("Skipping update with no spec change")
return
}
c.logger.Infof("Cluster update: %s(version: %s) -> %s(version: %s)",
util.NameFromMeta(pgPrev.Metadata), pgPrev.Metadata.ResourceVersion,
util.NameFromMeta(pgNew.Metadata), pgNew.Metadata.ResourceVersion)
rollingUpdate := pgCluster.NeedsRollingUpdate(pgNew)
if rollingUpdate {
c.logger.Infof("Pods need to be recreated")
}
pgCluster.MustSetStatus(spec.ClusterStatusUpdating)
if err := pgCluster.Update(pgNew, rollingUpdate); err != nil {
if err := pgCluster.Update(pgNew); err != nil {
pgCluster.MustSetStatus(spec.ClusterStatusUpdateFailed)
c.logger.Errorf("Can't update cluster: %s", err)
} else {
c.logger.Infof("Cluster has been updated")
}
pgCluster.MustSetStatus(spec.ClusterStatusRunning)
}
func (c *Controller) postgresqlDelete(obj interface{}) {