on sync compare pgVersion with SpiloConfiguration
This commit is contained in:
		
							parent
							
								
									9668d2703b
								
							
						
					
					
						commit
						64022c9367
					
				|  | @ -26,7 +26,7 @@ import ( | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| const ( | const ( | ||||||
| 	pgBinariesLocationTemplate       = "/usr/lib/postgresql/%s/bin" | 	pgBinariesLocationTemplate       = "/usr/lib/postgresql/%v/bin" | ||||||
| 	patroniPGBinariesParameterName   = "bin_dir" | 	patroniPGBinariesParameterName   = "bin_dir" | ||||||
| 	patroniPGParametersParameterName = "parameters" | 	patroniPGParametersParameterName = "parameters" | ||||||
| 	patroniPGHBAConfParameterName    = "pg_hba" | 	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) { | func (c *Cluster) generateStatefulSet(spec *acidv1.PostgresSpec) (*appsv1.StatefulSet, error) { | ||||||
| 
 | 
 | ||||||
| 	var ( | 	var ( | ||||||
|  |  | ||||||
|  | @ -23,7 +23,6 @@ func (c *Cluster) Sync(newSpec *acidv1.Postgresql) error { | ||||||
| 	c.mu.Lock() | 	c.mu.Lock() | ||||||
| 	defer c.mu.Unlock() | 	defer c.mu.Unlock() | ||||||
| 
 | 
 | ||||||
| 	currentPgVersion := c.Spec.PostgresqlParam.PgVersion |  | ||||||
| 	c.setSpec(newSpec) | 	c.setSpec(newSpec) | ||||||
| 
 | 
 | ||||||
| 	defer func() { | 	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 { | 	if err = c.initUsers(); err != nil { | ||||||
| 		err = fmt.Errorf("could not init users: %v", err) | 		err = fmt.Errorf("could not init users: %v", err) | ||||||
| 		return 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.
 | 		// statefulset is already there, make sure we use its definition in order to compare with the spec.
 | ||||||
| 		c.Statefulset = sset | 		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) | 		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) | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue