on sync compare pgVersion with SpiloConfiguration
This commit is contained in:
		
							parent
							
								
									9668d2703b
								
							
						
					
					
						commit
						64022c9367
					
				|  | @ -26,7 +26,7 @@ import ( | |||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	pgBinariesLocationTemplate       = "/usr/lib/postgresql/%s/bin" | ||||
| 	pgBinariesLocationTemplate       = "/usr/lib/postgresql/%v/bin" | ||||
| 	patroniPGBinariesParameterName   = "bin_dir" | ||||
| 	patroniPGParametersParameterName = "parameters" | ||||
| 	patroniPGHBAConfParameterName    = "pg_hba" | ||||
|  | @ -716,6 +716,55 @@ func makeResources(cpuRequest, memoryRequest, cpuLimit, memoryLimit string) acid | |||
| 	} | ||||
| } | ||||
| 
 | ||||
| func extractPgVersionFromBinPath(binPath string, template string) (string, error) { | ||||
| 	var pgVersion float32 | ||||
| 	_, err := fmt.Sscanf(binPath, template, &pgVersion) | ||||
| 	if err != nil { | ||||
| 		return "", err | ||||
| 	} | ||||
| 	return fmt.Sprintf("%v", pgVersion), nil | ||||
| } | ||||
| 
 | ||||
| func (c *Cluster) getNewPgVersion(containers []v1.Container, newPgVersion string) (string, error) { | ||||
| 	var ( | ||||
| 		spiloConfiguration spiloConfiguration | ||||
| 		runningPgVersion   string | ||||
| 		err                error | ||||
| 	) | ||||
| 
 | ||||
| 	for _, container := range containers { | ||||
| 		if container.Name != "postgres" { | ||||
| 			continue | ||||
| 		} | ||||
| 		for _, env := range container.Env { | ||||
| 			if env.Name != "SPILO_CONFIGURATION" { | ||||
| 				continue | ||||
| 			} | ||||
| 			err = json.Unmarshal([]byte(env.Value), &spiloConfiguration) | ||||
| 			if err != nil { | ||||
| 				return newPgVersion, err | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if len(spiloConfiguration.PgLocalConfiguration) > 0 { | ||||
| 		currentBinPath := fmt.Sprintf("%v", spiloConfiguration.PgLocalConfiguration[patroniPGBinariesParameterName]) | ||||
| 		runningPgVersion, err = extractPgVersionFromBinPath(currentBinPath, pgBinariesLocationTemplate) | ||||
| 		if err != nil { | ||||
| 			return "", fmt.Errorf("could not extract Postgres version from %v in SPILO_CONFIGURATION", currentBinPath) | ||||
| 		} | ||||
| 	} else { | ||||
| 		return "", fmt.Errorf("could not find %q setting in SPILO_CONFIGURATION", patroniPGBinariesParameterName) | ||||
| 	} | ||||
| 
 | ||||
| 	if runningPgVersion != newPgVersion { | ||||
| 		c.logger.Warningf("postgresql version change(%q -> %q) has no effect", runningPgVersion, newPgVersion) | ||||
| 		newPgVersion = runningPgVersion | ||||
| 	} | ||||
| 
 | ||||
| 	return newPgVersion, nil | ||||
| } | ||||
| 
 | ||||
| func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.StatefulSet, error) { | ||||
| 
 | ||||
| 	var ( | ||||
|  |  | |||
|  | @ -23,7 +23,6 @@ func (c *Cluster) Sync(newSpec *acidv1.Postgresql) error { | |||
| 	c.mu.Lock() | ||||
| 	defer c.mu.Unlock() | ||||
| 
 | ||||
| 	currentPgVersion := c.Spec.PostgresqlParam.PgVersion | ||||
| 	c.setSpec(newSpec) | ||||
| 
 | ||||
| 	defer func() { | ||||
|  | @ -35,12 +34,6 @@ func (c *Cluster) Sync(newSpec *acidv1.Postgresql) error { | |||
| 		} | ||||
| 	}() | ||||
| 
 | ||||
| 	if currentPgVersion != newSpec.Spec.PostgresqlParam.PgVersion { // PG versions comparison
 | ||||
| 		c.logger.Warningf("postgresql version change(%q -> %q) has no effect", currentPgVersion, newSpec.Spec.PostgresqlParam.PgVersion) | ||||
| 		// we need that hack to generate statefulset with the old version
 | ||||
| 		newSpec.Spec.PostgresqlParam.PgVersion = currentPgVersion | ||||
| 	} | ||||
| 
 | ||||
| 	if err = c.initUsers(); err != nil { | ||||
| 		err = fmt.Errorf("could not init users: %v", err) | ||||
| 		return err | ||||
|  | @ -292,6 +285,13 @@ func (c *Cluster) syncStatefulSet() error { | |||
| 		// statefulset is already there, make sure we use its definition in order to compare with the spec.
 | ||||
| 		c.Statefulset = sset | ||||
| 
 | ||||
| 		// check if there is no Postgres version mismatch
 | ||||
| 		pgVersion, err := c.getNewPgVersion(c.Statefulset.Spec.Template.Spec.Containers, c.Spec.PostgresqlParam.PgVersion) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("could not parse current Postgres version: %v", err) | ||||
| 		} | ||||
| 		c.Spec.PostgresqlParam.PgVersion = pgVersion | ||||
| 
 | ||||
| 		desiredSS, err := c.generateStatefulSet(&c.Spec) | ||||
| 		if err != nil { | ||||
| 			return fmt.Errorf("could not generate statefulset: %v", err) | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue