Fix deletion of the failed cluster; more debug messages
This commit is contained in:
parent
ce90a54cf9
commit
bb4fec25ae
|
|
@ -98,6 +98,7 @@ func (c *Cluster) Run(stopCh <-chan struct{}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cluster) SetStatus(status spec.PostgresStatus) {
|
func (c *Cluster) SetStatus(status spec.PostgresStatus) {
|
||||||
|
c.Status = status
|
||||||
b, err := json.Marshal(status)
|
b, err := json.Marshal(status)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
c.logger.Fatalf("Can't marshal status: %s", err)
|
c.logger.Fatalf("Can't marshal status: %s", err)
|
||||||
|
|
@ -136,7 +137,11 @@ func (c *Cluster) etcdKeyExists(keyName string) (bool, error) {
|
||||||
options := etcdclient.GetOptions{}
|
options := etcdclient.GetOptions{}
|
||||||
resp, err := c.EtcdClient.Get(context.Background(), keyName, &options)
|
resp, err := c.EtcdClient.Get(context.Background(), keyName, &options)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if err.(etcdclient.Error).Code == etcdclient.ErrorCodeKeyNotFound {
|
etcdErr, ok := err.(etcdclient.Error)
|
||||||
|
if !ok {
|
||||||
|
return false, err
|
||||||
|
}
|
||||||
|
if etcdErr.Code == etcdclient.ErrorCodeKeyNotFound {
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -329,41 +334,56 @@ func (c *Cluster) Update(newSpec *spec.Postgresql) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *Cluster) Delete() error {
|
func (c *Cluster) Delete() error {
|
||||||
epName := util.NameFromMeta(c.Endpoint.ObjectMeta)
|
if c.Endpoint != nil {
|
||||||
if err := c.deleteEndpoint(); err != nil {
|
c.logger.Debugln("Deleting Endpoints")
|
||||||
c.logger.Errorf("Can't delete Endpoint: %s", err)
|
epName := util.NameFromMeta(c.Endpoint.ObjectMeta)
|
||||||
} else {
|
if err := c.deleteEndpoint(); err != nil {
|
||||||
c.logger.Infof("Endpoint '%s' has been deleted", epName)
|
c.logger.Errorf("Can't delete Endpoint: %s", err)
|
||||||
}
|
|
||||||
|
|
||||||
svcName := util.NameFromMeta(c.Service.ObjectMeta)
|
|
||||||
if err := c.deleteService(); err != nil {
|
|
||||||
c.logger.Errorf("Can't delete Service: %s", err)
|
|
||||||
} else {
|
|
||||||
c.logger.Infof("Service '%s' has been deleted", svcName)
|
|
||||||
}
|
|
||||||
|
|
||||||
ssName := util.NameFromMeta(c.Statefulset.ObjectMeta)
|
|
||||||
if err := c.deleteStatefulSet(); err != nil {
|
|
||||||
c.logger.Errorf("Can't delete StatefulSet: %s", err)
|
|
||||||
} else {
|
|
||||||
c.logger.Infof("StatefulSet '%s' has been deleted", ssName)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, obj := range c.Secrets {
|
|
||||||
if err := c.deleteSecret(obj); err != nil {
|
|
||||||
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("Endpoint '%s' has been deleted", epName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if c.Service != nil {
|
||||||
|
c.logger.Debugln("Deleting Service")
|
||||||
|
svcName := util.NameFromMeta(c.Service.ObjectMeta)
|
||||||
|
if err := c.deleteService(); err != nil {
|
||||||
|
c.logger.Errorf("Can't delete Service: %s", err)
|
||||||
|
} else {
|
||||||
|
c.logger.Infof("Service '%s' has been deleted", svcName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.Statefulset != nil {
|
||||||
|
c.logger.Debugln("Deleting StatefulSet")
|
||||||
|
ssName := util.NameFromMeta(c.Statefulset.ObjectMeta)
|
||||||
|
if err := c.deleteStatefulSet(); err != nil {
|
||||||
|
c.logger.Errorf("Can't delete StatefulSet: %s", err)
|
||||||
|
} else {
|
||||||
|
c.logger.Infof("StatefulSet '%s' has been deleted", ssName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.Secrets != nil {
|
||||||
|
c.logger.Debugln("Deleting Secrets")
|
||||||
|
for _, obj := range c.Secrets {
|
||||||
|
c.logger.Debugf("Deleting Secret '%s'", util.NameFromMeta(obj.ObjectMeta))
|
||||||
|
if err := c.deleteSecret(obj); err != nil {
|
||||||
|
c.logger.Errorf("Can't delete Secret: %s", err)
|
||||||
|
} else {
|
||||||
|
c.logger.Infof("Secret '%s' has been deleted", util.NameFromMeta(obj.ObjectMeta))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
c.logger.Debugln("Deleting Pods")
|
||||||
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")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
c.logger.Debugln("Deleting PVCs")
|
||||||
if err := c.deletePersistenVolumeClaims(); err != nil {
|
if err := c.deletePersistenVolumeClaims(); err != nil {
|
||||||
return fmt.Errorf("Can't delete PersistentVolumeClaims: %s", err)
|
return fmt.Errorf("Can't delete PersistentVolumeClaims: %s", err)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ func (c *Cluster) deletePods() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, obj := range pods {
|
for _, obj := range pods {
|
||||||
|
c.logger.Debugf("Deleting Pod '%s'", util.NameFromMeta(obj.ObjectMeta))
|
||||||
if err := c.deletePod(&obj); err != nil {
|
if err := c.deletePod(&obj); err != nil {
|
||||||
c.logger.Errorf("Can't delete Pod: %s", err)
|
c.logger.Errorf("Can't delete Pod: %s", err)
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -61,6 +62,7 @@ func (c *Cluster) deletePersistenVolumeClaims() error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for _, pvc := range pvcs {
|
for _, pvc := range pvcs {
|
||||||
|
c.logger.Debugf("Deleting PVC '%s'", util.NameFromMeta(pvc.ObjectMeta))
|
||||||
if err := c.KubeClient.PersistentVolumeClaims(ns).Delete(pvc.Name, deleteOptions); err != nil {
|
if err := c.KubeClient.PersistentVolumeClaims(ns).Delete(pvc.Name, deleteOptions); err != nil {
|
||||||
c.logger.Warningf("Can't delete PersistentVolumeClaim: %s", err)
|
c.logger.Warningf("Can't delete PersistentVolumeClaim: %s", err)
|
||||||
}
|
}
|
||||||
|
|
@ -148,7 +150,6 @@ func (c *Cluster) podEventsDispatcher(stopCh <-chan struct{}) {
|
||||||
select {
|
select {
|
||||||
case event := <-c.podEvents:
|
case event := <-c.podEvents:
|
||||||
if subscriber, ok := c.podSubscribers[event.PodName]; ok {
|
if subscriber, ok := c.podSubscribers[event.PodName]; ok {
|
||||||
c.logger.Debugf("New event for '%s' Pod", event.PodName)
|
|
||||||
go func() { subscriber <- event }() //TODO: is it a right way to do nonblocking send to the channel?
|
go func() { subscriber <- event }() //TODO: is it a right way to do nonblocking send to the channel?
|
||||||
} else {
|
} else {
|
||||||
c.logger.Debugf("Skipping event for an unwatched Pod '%s'", event.PodName)
|
c.logger.Debugf("Skipping event for an unwatched Pod '%s'", event.PodName)
|
||||||
|
|
|
||||||
|
|
@ -117,7 +117,7 @@ func (c *Cluster) createStatefulSet() (*v1beta1.StatefulSet, error) {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
c.Statefulset = statefulSet
|
c.Statefulset = statefulSet
|
||||||
c.logger.Debugf("Created new StatefulSet, uid: %s", statefulSet.UID)
|
c.logger.Debugf("Created new StatefulSet '%s', uid: %s", util.NameFromMeta(statefulSet.ObjectMeta), statefulSet.UID)
|
||||||
|
|
||||||
return statefulSet, nil
|
return statefulSet, nil
|
||||||
}
|
}
|
||||||
|
|
@ -244,13 +244,13 @@ func (c *Cluster) applySecrets() error {
|
||||||
for secretUsername, secretSpec := range secrets {
|
for secretUsername, secretSpec := range secrets {
|
||||||
secret, err := c.KubeClient.Secrets(secretSpec.Namespace).Create(secretSpec)
|
secret, err := c.KubeClient.Secrets(secretSpec.Namespace).Create(secretSpec)
|
||||||
if k8sutil.ResourceAlreadyExists(err) {
|
if k8sutil.ResourceAlreadyExists(err) {
|
||||||
curSecrets, err := c.KubeClient.Secrets(secretSpec.Namespace).Get(secretSpec.Name)
|
curSecret, err := c.KubeClient.Secrets(secretSpec.Namespace).Get(secretSpec.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("Can't get current Secret: %s", err)
|
return fmt.Errorf("Can't get current Secret: %s", err)
|
||||||
}
|
}
|
||||||
c.logger.Debugf("Secret '%s' already exists, fetching it's password", util.NameFromMeta(secret.ObjectMeta))
|
c.logger.Debugf("Secret '%s' already exists, fetching it's password", util.NameFromMeta(curSecret.ObjectMeta))
|
||||||
pwdUser := c.pgUsers[secretUsername]
|
pwdUser := c.pgUsers[secretUsername]
|
||||||
pwdUser.Password = string(curSecrets.Data["password"])
|
pwdUser.Password = string(curSecret.Data["password"])
|
||||||
c.pgUsers[secretUsername] = pwdUser
|
c.pgUsers[secretUsername] = pwdUser
|
||||||
|
|
||||||
continue
|
continue
|
||||||
|
|
@ -259,7 +259,7 @@ func (c *Cluster) applySecrets() error {
|
||||||
return fmt.Errorf("Can't create Secret for user '%s': %s", secretUsername, err)
|
return fmt.Errorf("Can't create Secret for user '%s': %s", secretUsername, err)
|
||||||
}
|
}
|
||||||
c.Secrets[secret.UID] = secret
|
c.Secrets[secret.UID] = secret
|
||||||
c.logger.Debugf("Created new Secret, uid: %s", secret.UID)
|
c.logger.Debugf("Created new Secret '%s', uid: %s", util.NameFromMeta(secret.ObjectMeta), secret.UID)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -125,7 +125,7 @@ func (c *Controller) podEventsDispatcher(stopCh <-chan struct{}) {
|
||||||
c.logger.Debugf("Sending %s event of Pod '%s' to the '%s' cluster channel", event.EventType, event.PodName, event.ClusterName)
|
c.logger.Debugf("Sending %s event of Pod '%s' to the '%s' cluster channel", event.EventType, event.PodName, event.ClusterName)
|
||||||
go subscriber.ReceivePodEvent(event)
|
go subscriber.ReceivePodEvent(event)
|
||||||
} else {
|
} else {
|
||||||
c.logger.Debugf("Skipping Pods unrelated to clusters: %s", event.PodName)
|
c.logger.Debugf("Skipping %s event of the '%s' pod", event.EventType, event.PodName)
|
||||||
}
|
}
|
||||||
case <-stopCh:
|
case <-stopCh:
|
||||||
return
|
return
|
||||||
|
|
|
||||||
|
|
@ -98,6 +98,8 @@ func (c *Controller) postgresqlAdd(obj interface{}) {
|
||||||
cl := cluster.New(c.makeClusterConfig(), *pg, c.logger.Logger)
|
cl := cluster.New(c.makeClusterConfig(), *pg, c.logger.Logger)
|
||||||
|
|
||||||
c.clusters[clusterName] = cl
|
c.clusters[clusterName] = cl
|
||||||
|
stopCh := make(chan struct{})
|
||||||
|
c.stopChMap[clusterName] = stopCh
|
||||||
|
|
||||||
cl.SetStatus(spec.ClusterStatusCreating)
|
cl.SetStatus(spec.ClusterStatusCreating)
|
||||||
if err := cl.Create(); err != nil {
|
if err := cl.Create(); err != nil {
|
||||||
|
|
@ -106,8 +108,6 @@ func (c *Controller) postgresqlAdd(obj interface{}) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
cl.SetStatus(spec.ClusterStatusRunning) //TODO: are you sure it's running?
|
cl.SetStatus(spec.ClusterStatusRunning) //TODO: are you sure it's running?
|
||||||
stopCh := make(chan struct{})
|
|
||||||
c.stopChMap[clusterName] = stopCh
|
|
||||||
go cl.Run(stopCh)
|
go cl.Run(stopCh)
|
||||||
|
|
||||||
c.logger.Infof("Postgresql cluster '%s' has been created", clusterName)
|
c.logger.Infof("Postgresql cluster '%s' has been created", clusterName)
|
||||||
|
|
@ -165,7 +165,7 @@ func (c *Controller) postgresqlDelete(obj interface{}) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
c.logger.Infof("Cluster delete: %s", util.NameFromMeta(pgCur.Metadata))
|
c.logger.Infof("Starting deletion of the '%s' cluster", util.NameFromMeta(pgCur.Metadata))
|
||||||
if err := pgCluster.Delete(); err != nil {
|
if err := pgCluster.Delete(); err != nil {
|
||||||
c.logger.Errorf("Can't delete cluster '%s': %s", clusterName, err)
|
c.logger.Errorf("Can't delete cluster '%s': %s", clusterName, err)
|
||||||
return
|
return
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue