Fix a failure to create new statefulset at sync.

Also do a fmt run.
This commit is contained in:
Oleksii Kliukin 2017-11-08 18:10:48 +01:00
parent 6813bf5921
commit c25e849fe4
4 changed files with 19 additions and 23 deletions

View File

@ -495,6 +495,7 @@ func (c *Cluster) Update(oldSpec, newSpec *spec.Postgresql) error {
if !reflect.DeepEqual(oldSs, newSs) { if !reflect.DeepEqual(oldSs, newSs) {
c.logger.Debugf("syncing statefulsets") c.logger.Debugf("syncing statefulsets")
// TODO: avoid generating the StatefulSet object twice by passing it to syncStatefulSet
if err := c.syncStatefulSet(); err != nil { if err := c.syncStatefulSet(); err != nil {
c.logger.Errorf("could not sync statefulsets: %v", err) c.logger.Errorf("could not sync statefulsets: %v", err)
updateFailed = true updateFailed = true

View File

@ -262,7 +262,7 @@ func (c *Cluster) tolerations(tolerationsSpec *[]v1.Toleration) []v1.Toleration
} }
podToleration := c.Config.OpConfig.PodToleration podToleration := c.Config.OpConfig.PodToleration
if (len(podToleration["key"]) > 0 || len(podToleration["operator"]) > 0 || len(podToleration["value"]) > 0 || len(podToleration["effect"]) > 0) { if len(podToleration["key"]) > 0 || len(podToleration["operator"]) > 0 || len(podToleration["value"]) > 0 || len(podToleration["effect"]) > 0 {
return []v1.Toleration{ return []v1.Toleration{
{ {
Key: podToleration["key"], Key: podToleration["key"],

View File

@ -238,29 +238,20 @@ func (c *Cluster) syncPodDisruptionBudget(isUpdate bool) error {
} }
func (c *Cluster) syncStatefulSet() error { func (c *Cluster) syncStatefulSet() error {
var (
err error
rollUpdate bool
)
c.Statefulset, err = c.KubeClient.StatefulSets(c.Namespace).Get(c.statefulSetName(), metav1.GetOptions{})
if err != nil && !k8sutil.ResourceNotFound(err) { sset, err := c.KubeClient.StatefulSets(c.Namespace).Get(c.statefulSetName(), metav1.GetOptions{})
return fmt.Errorf("could not get statefulset: %v", err) if err != nil {
} if !k8sutil.ResourceNotFound(err) {
return fmt.Errorf("could not get statefulset: %v", err)
if err != nil && k8sutil.ResourceNotFound(err) { }
// statefulset does not exist, try to re-create it
c.logger.Infof("could not find the cluster's statefulset") c.logger.Infof("could not find the cluster's statefulset")
pods, err := c.listPods() pods, err := c.listPods()
if err != nil { if err != nil {
return fmt.Errorf("could not list pods of the statefulset: %v", err) return fmt.Errorf("could not list pods of the statefulset: %v", err)
} }
if len(pods) > 0 { sset, err = c.createStatefulSet()
c.logger.Infof("found pods without the statefulset: trigger rolling update")
rollUpdate = true
}
ss, err := c.createStatefulSet()
if err != nil { if err != nil {
return fmt.Errorf("could not create missing statefulset: %v", err) return fmt.Errorf("could not create missing statefulset: %v", err)
} }
@ -269,14 +260,16 @@ func (c *Cluster) syncStatefulSet() error {
return fmt.Errorf("cluster is not ready: %v", err) return fmt.Errorf("cluster is not ready: %v", err)
} }
c.logger.Infof("created missing statefulset %q", util.NameFromMeta(ss.ObjectMeta)) c.logger.Infof("created missing statefulset %q", util.NameFromMeta(sset.ObjectMeta))
if !rollUpdate { if len(pods) <= 0 {
return nil return nil
} }
} c.logger.Infof("found pods without the statefulset: trigger rolling update")
} else {
// statefulset is alrady there, make sure we use its definition in order to compare with the spec.
c.Statefulset = sset
/* TODO: should check that we need to replace the statefulset */
if !rollUpdate {
desiredSS, err := c.generateStatefulSet(&c.Spec) desiredSS, err := c.generateStatefulSet(&c.Spec)
if err != nil { if err != nil {
return fmt.Errorf("could not generate statefulset: %v", err) return fmt.Errorf("could not generate statefulset: %v", err)
@ -303,6 +296,8 @@ func (c *Cluster) syncStatefulSet() error {
return nil return nil
} }
} }
// if we get here we also need to re-create the pods (either leftovers from the old
// statefulset or those that got their configuration from the outdated statefulset)
c.logger.Debugln("performing rolling update") c.logger.Debugln("performing rolling update")
if err := c.recreatePods(); err != nil { if err := c.recreatePods(); err != nil {
return fmt.Errorf("could not recreate pods: %v", err) return fmt.Errorf("could not recreate pods: %v", err)

View File

@ -25,7 +25,7 @@ type Resources struct {
ClusterLabels map[string]string `name:"cluster_labels" default:"application:spilo"` ClusterLabels map[string]string `name:"cluster_labels" default:"application:spilo"`
ClusterNameLabel string `name:"cluster_name_label" default:"cluster-name"` ClusterNameLabel string `name:"cluster_name_label" default:"cluster-name"`
PodRoleLabel string `name:"pod_role_label" default:"spilo-role"` PodRoleLabel string `name:"pod_role_label" default:"spilo-role"`
PodToleration map[string]string `name:"toleration" default:""` PodToleration map[string]string `name:"toleration" default:""`
DefaultCPURequest string `name:"default_cpu_request" default:"100m"` DefaultCPURequest string `name:"default_cpu_request" default:"100m"`
DefaultMemoryRequest string `name:"default_memory_request" default:"100Mi"` DefaultMemoryRequest string `name:"default_memory_request" default:"100Mi"`
DefaultCPULimit string `name:"default_cpu_limit" default:"3"` DefaultCPULimit string `name:"default_cpu_limit" default:"3"`