Do not create roles if cluster is masterless
fix pod deletion
This commit is contained in:
		
							parent
							
								
									da438aab3a
								
							
						
					
					
						commit
						a7c57874d5
					
				|  | @ -62,6 +62,8 @@ type Cluster struct { | |||
| 	podSubscribers       map[spec.NamespacedName]chan spec.PodEvent | ||||
| 	pgDb                 *sql.DB | ||||
| 	mu                   sync.Mutex | ||||
| 	masterLess           bool | ||||
| 	podDispatcherRunning bool | ||||
| } | ||||
| 
 | ||||
| func New(cfg Config, pgSpec spec.Postgresql, logger *logrus.Logger) *Cluster { | ||||
|  | @ -76,6 +78,8 @@ func New(cfg Config, pgSpec spec.Postgresql, logger *logrus.Logger) *Cluster { | |||
| 		podEvents:            make(chan spec.PodEvent), | ||||
| 		podSubscribers:       make(map[spec.NamespacedName]chan spec.PodEvent), | ||||
| 		kubeResources:        kubeResources, | ||||
| 		masterLess:           false, | ||||
| 		podDispatcherRunning: false, | ||||
| 	} | ||||
| 
 | ||||
| 	return cluster | ||||
|  | @ -90,12 +94,6 @@ func (c *Cluster) TeamName() string { | |||
| 	return c.Spec.TeamId | ||||
| } | ||||
| 
 | ||||
| func (c *Cluster) Run(stopCh <-chan struct{}) { | ||||
| 	go c.podEventsDispatcher(stopCh) | ||||
| 
 | ||||
| 	<-stopCh | ||||
| } | ||||
| 
 | ||||
| func (c *Cluster) SetStatus(status spec.PostgresStatus) { | ||||
| 	c.Status = status | ||||
| 	b, err := json.Marshal(status) | ||||
|  | @ -155,7 +153,12 @@ func (c *Cluster) etcdKeyExists(keyName string) (bool, error) { | |||
| 	return resp != nil, err | ||||
| } | ||||
| 
 | ||||
| func (c *Cluster) Create() error { | ||||
| func (c *Cluster) Create(stopCh <-chan struct{}) error { | ||||
| 	if !c.podDispatcherRunning { | ||||
| 		go c.podEventsDispatcher(stopCh) | ||||
| 		c.podDispatcherRunning = true | ||||
| 	} | ||||
| 
 | ||||
| 	keyExist, err := c.etcdKeyExists(fmt.Sprintf("/%s/%s", c.OpConfig.EtcdScope, c.Metadata.Name)) | ||||
| 	if err != nil { | ||||
| 		c.logger.Warnf("Can't check etcd key: %s", err) | ||||
|  | @ -203,6 +206,7 @@ func (c *Cluster) Create() error { | |||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	if !c.masterLess { | ||||
| 		if err := c.initDbConn(); err != nil { | ||||
| 			return fmt.Errorf("Can't init db connection: %s", err) | ||||
| 		} | ||||
|  | @ -212,6 +216,9 @@ func (c *Cluster) Create() error { | |||
| 		} else { | ||||
| 			c.logger.Infof("Users have been successfully created") | ||||
| 		} | ||||
| 	} else { | ||||
| 		c.logger.Warnln("Cluster is masterless") | ||||
| 	} | ||||
| 
 | ||||
| 	c.ListResources() | ||||
| 
 | ||||
|  |  | |||
|  | @ -45,11 +45,13 @@ func (c *Cluster) deletePods() error { | |||
| 	} | ||||
| 
 | ||||
| 	for _, obj := range pods { | ||||
| 		c.logger.Debugf("Deleting Pod '%s'", util.NameFromMeta(obj.ObjectMeta)) | ||||
| 		if err := c.deletePod(&obj); err != nil { | ||||
| 			c.logger.Errorf("Can't delete Pod: %s", err) | ||||
| 		podName := util.NameFromMeta(obj.ObjectMeta) | ||||
| 
 | ||||
| 		c.logger.Debugf("Deleting Pod '%s'", podName) | ||||
| 		if err := c.deletePod(podName); err != nil { | ||||
| 			c.logger.Errorf("Can't delete Pod '%s': %s", podName, err) | ||||
| 		} else { | ||||
| 			c.logger.Infof("Pod '%s' has been deleted", util.NameFromMeta(obj.ObjectMeta)) | ||||
| 			c.logger.Infof("Pod '%s' has been deleted", podName) | ||||
| 		} | ||||
| 	} | ||||
| 	if len(pods) > 0 { | ||||
|  | @ -83,9 +85,7 @@ func (c *Cluster) deletePersistenVolumeClaims() error { | |||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (c *Cluster) deletePod(pod *v1.Pod) error { | ||||
| 	podName := util.NameFromMeta(pod.ObjectMeta) | ||||
| 
 | ||||
| func (c *Cluster) deletePod(podName spec.NamespacedName) error { | ||||
| 	ch := make(chan spec.PodEvent) | ||||
| 	if _, ok := c.podSubscribers[podName]; ok { | ||||
| 		panic("Pod '" + podName.String() + "' is already subscribed") | ||||
|  | @ -96,7 +96,7 @@ func (c *Cluster) deletePod(pod *v1.Pod) error { | |||
| 		delete(c.podSubscribers, podName) | ||||
| 	}() | ||||
| 
 | ||||
| 	if err := c.KubeClient.Pods(pod.Namespace).Delete(pod.Name, deleteOptions); err != nil { | ||||
| 	if err := c.KubeClient.Pods(podName.Namespace).Delete(podName.Name, deleteOptions); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
|  |  | |||
|  | @ -6,7 +6,11 @@ import ( | |||
| 	"github.bus.zalan.do/acid/postgres-operator/pkg/util" | ||||
| ) | ||||
| 
 | ||||
| func (c *Cluster) SyncCluster() { | ||||
| func (c *Cluster) SyncCluster(stopCh <-chan struct{}) { | ||||
| 	if !c.podDispatcherRunning { | ||||
| 		go c.podEventsDispatcher(stopCh) | ||||
| 	} | ||||
| 
 | ||||
| 	c.logger.Debugf("Syncing Secrets") | ||||
| 	if err := c.syncSecrets(); err != nil { | ||||
| 		c.logger.Infof("Can't sync Secrets: %s", err) | ||||
|  |  | |||
|  | @ -171,7 +171,7 @@ func (c *Cluster) waitPodLabelsReady() error { | |||
| 	} | ||||
| 	podsNumber := len(pods.Items) | ||||
| 
 | ||||
| 	return retryutil.Retry(c.OpConfig.ResourceCheckInterval, c.OpConfig.ResourceCheckTimeout, | ||||
| 	err = retryutil.Retry(c.OpConfig.ResourceCheckInterval, c.OpConfig.ResourceCheckTimeout, | ||||
| 		func() (bool, error) { | ||||
| 			masterPods, err := c.KubeClient.Pods(namespace).List(masterListOption) | ||||
| 			if err != nil { | ||||
|  | @ -185,11 +185,20 @@ func (c *Cluster) waitPodLabelsReady() error { | |||
| 				return false, fmt.Errorf("Too many masters") | ||||
| 			} | ||||
| 			if len(replicaPods.Items) == podsNumber { | ||||
| 				return false, fmt.Errorf("Cluster has no master") | ||||
| 				c.masterLess = true | ||||
| 				return true, nil | ||||
| 			} | ||||
| 
 | ||||
| 			return len(masterPods.Items)+len(replicaPods.Items) == podsNumber, nil | ||||
| 		}) | ||||
| 
 | ||||
| 	//TODO: wait for master for a while and then set masterLess flag
 | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func (c *Cluster) waitStatefulsetPodsReady() error { | ||||
|  |  | |||
|  | @ -48,10 +48,8 @@ func (c *Controller) clusterListFunc(options api.ListOptions) (runtime.Object, e | |||
| 		c.stopChMap[clusterName] = stopCh | ||||
| 		c.clusters[clusterName] = cl | ||||
| 		cl.LoadResources() | ||||
| 		go cl.Run(stopCh) | ||||
| 
 | ||||
| 		cl.ListResources() | ||||
| 		cl.SyncCluster() | ||||
| 		cl.SyncCluster(stopCh) | ||||
| 	} | ||||
| 	if len(c.clusters) > 0 { | ||||
| 		c.logger.Infof("There are %d clusters currently running", len(c.clusters)) | ||||
|  | @ -95,13 +93,12 @@ func (c *Controller) postgresqlAdd(obj interface{}) { | |||
| 	c.stopChMap[clusterName] = stopCh | ||||
| 
 | ||||
| 	cl.SetStatus(spec.ClusterStatusCreating) | ||||
| 	if err := cl.Create(); err != nil { | ||||
| 	if err := cl.Create(stopCh); err != nil { | ||||
| 		c.logger.Errorf("Can't create cluster: %s", err) | ||||
| 		cl.SetStatus(spec.ClusterStatusAddFailed) | ||||
| 		return | ||||
| 	} | ||||
| 	cl.SetStatus(spec.ClusterStatusRunning) //TODO: are you sure it's running?
 | ||||
| 	go cl.Run(stopCh) | ||||
| 
 | ||||
| 	c.logger.Infof("Postgresql cluster '%s' has been created", clusterName) | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue