From 1c6e7ac2e73450ca44360b8922fdd8288ba78087 Mon Sep 17 00:00:00 2001 From: Murat Kabilov Date: Wed, 8 Mar 2017 15:43:24 +0100 Subject: [PATCH] loadBalancerSourceRanges update --- pkg/cluster/cluster.go | 41 ++++++++++++++++++++++++++---------- pkg/cluster/util.go | 10 +++++++++ pkg/controller/postgresql.go | 13 ++---------- 3 files changed, 42 insertions(+), 22 deletions(-) diff --git a/pkg/cluster/cluster.go b/pkg/cluster/cluster.go index 535e0dcd8..d9786d950 100644 --- a/pkg/cluster/cluster.go +++ b/pkg/cluster/cluster.go @@ -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") } diff --git a/pkg/cluster/util.go b/pkg/cluster/util.go index 458e3d92b..7372428be 100644 --- a/pkg/cluster/util.go +++ b/pkg/cluster/util.go @@ -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 +} diff --git a/pkg/controller/postgresql.go b/pkg/controller/postgresql.go index 7a86a2886..d04edaf18 100644 --- a/pkg/controller/postgresql.go +++ b/pkg/controller/postgresql.go @@ -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{}) {