loadBalancerSourceRanges update
This commit is contained in:
		
							parent
							
								
									fc127069ab
								
							
						
					
					
						commit
						1c6e7ac2e7
					
				|  | @ -23,6 +23,7 @@ import ( | ||||||
| 	"github.bus.zalan.do/acid/postgres-operator/pkg/util" | 	"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/constants" | ||||||
| 	"github.bus.zalan.do/acid/postgres-operator/pkg/util/k8sutil" | 	"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" | 	"github.bus.zalan.do/acid/postgres-operator/pkg/util/teams" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -93,7 +94,7 @@ func (c *Cluster) Run(stopCh <-chan struct{}) { | ||||||
| 	<-stopCh | 	<-stopCh | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c *Cluster) NeedsRollingUpdate(otherSpec *spec.Postgresql) bool { | func (c *Cluster) needsRollingUpdate(otherSpec *spec.Postgresql) bool { | ||||||
| 	//TODO: add more checks
 | 	//TODO: add more checks
 | ||||||
| 	if c.Spec.Version != otherSpec.Spec.Version { | 	if c.Spec.Version != otherSpec.Spec.Version { | ||||||
| 		return true | 		return true | ||||||
|  | @ -124,7 +125,7 @@ func (c *Cluster) MustSetStatus(status spec.PostgresStatus) { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err != nil { | 	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
 | 	//TODO: service will create endpoint implicitly
 | ||||||
| 	ep, err := c.createEndpoint() | 	ep, err := c.createEndpoint() | ||||||
| 	if err != nil { | 	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)) | 	c.logger.Infof("Endpoint '%s' has been successfully created", util.NameFromMeta(ep.ObjectMeta)) | ||||||
| 
 | 
 | ||||||
| 	service, err := c.createService() | 	service, err := c.createService() | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return fmt.Errorf("Can't create service: %s", err) | 		return fmt.Errorf("Can't create Service: %s", err) | ||||||
| 	} else { | 	} else { | ||||||
| 		c.logger.Infof("Service '%s' has been successfully created", util.NameFromMeta(service.ObjectMeta)) | 		c.logger.Infof("Service '%s' has been successfully created", util.NameFromMeta(service.ObjectMeta)) | ||||||
| 	} | 	} | ||||||
|  | @ -187,22 +188,40 @@ func (c *Cluster) Create() error { | ||||||
| 	return nil | 	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) | 	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) { | 	if !reflect.DeepEqual(newSpec.Spec.Volume, c.Spec.Volume) { | ||||||
| 		//TODO: update PVC
 | 		//TODO: update PVC
 | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	//TODO: mind the case of updating allowedSourceRanges
 | 	//TODO: mind the case of updating allowedSourceRanges
 | ||||||
| 	if err := c.updateStatefulSet(newStatefulSet); err != nil { | 	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 { | 	if rollingUpdate { | ||||||
| 		// TODO: wait for actual streaming to the replica
 | 		// TODO: wait for actual streaming to the replica
 | ||||||
| 		if err := c.recreatePods(); err != nil { | 		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 { | func (c *Cluster) Delete() error { | ||||||
| 	if err := c.deleteEndpoint(); err != nil { | 	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 { | 	} else { | ||||||
| 		c.logger.Infof("Endpoint '%s' has been deleted", util.NameFromMeta(c.Endpoint.ObjectMeta)) | 		c.logger.Infof("Endpoint '%s' has been deleted", util.NameFromMeta(c.Endpoint.ObjectMeta)) | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := c.deleteService(); err != nil { | 	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 { | 	} else { | ||||||
| 		c.logger.Infof("Service '%s' has been deleted", util.NameFromMeta(c.Service.ObjectMeta)) | 		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 { | 	for _, obj := range c.Secrets { | ||||||
| 		if err := c.deleteSecret(obj); err != nil { | 		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 { | 		} else { | ||||||
| 			c.logger.Infof("Secret '%s' has been deleted", util.NameFromMeta(obj.ObjectMeta)) | 			c.logger.Infof("Secret '%s' has been deleted", util.NameFromMeta(obj.ObjectMeta)) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	if err := c.deletePods(); err != nil { | 	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 { | 	} else { | ||||||
| 		c.logger.Infof("Pods have been deleted") | 		c.logger.Infof("Pods have been deleted") | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | @ -3,6 +3,7 @@ package cluster | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
|  | 	"reflect" | ||||||
| 	"strings" | 	"strings" | ||||||
| 	"time" | 	"time" | ||||||
| 
 | 
 | ||||||
|  | @ -184,3 +185,12 @@ func (c *Cluster) deleteEtcdKey() error { | ||||||
| 
 | 
 | ||||||
| 	return nil | 	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 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | @ -132,28 +132,19 @@ func (c *Controller) postgresqlUpdate(prev, cur interface{}) { | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| 	pgCluster := c.clusters[clusterName] // current
 | 	pgCluster := c.clusters[clusterName] // current
 | ||||||
| 
 |  | ||||||
| 	if reflect.DeepEqual(pgPrev.Spec, pgNew.Spec) { | 	if reflect.DeepEqual(pgPrev.Spec, pgNew.Spec) { | ||||||
| 		c.logger.Infof("Skipping update with no spec change") | 		c.logger.Infof("Skipping update with no spec change") | ||||||
| 		return | 		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) | 	pgCluster.MustSetStatus(spec.ClusterStatusUpdating) | ||||||
| 	if err := pgCluster.Update(pgNew, rollingUpdate); err != nil { | 	if err := pgCluster.Update(pgNew); err != nil { | ||||||
| 		pgCluster.MustSetStatus(spec.ClusterStatusUpdateFailed) | 		pgCluster.MustSetStatus(spec.ClusterStatusUpdateFailed) | ||||||
| 		c.logger.Errorf("Can't update cluster: %s", err) | 		c.logger.Errorf("Can't update cluster: %s", err) | ||||||
| 	} else { | 	} else { | ||||||
| 		c.logger.Infof("Cluster has been updated") | 		c.logger.Infof("Cluster has been updated") | ||||||
| 	} | 	} | ||||||
|  | 	pgCluster.MustSetStatus(spec.ClusterStatusRunning) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func (c *Controller) postgresqlDelete(obj interface{}) { | func (c *Controller) postgresqlDelete(obj interface{}) { | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue