Making progress on automated upgrade support via manifest and global upgrades.

This commit is contained in:
Jan Mußler
2021-02-18 22:01:30 +01:00
parent 3962e71ddd
commit fe465cf492
5 changed files with 196 additions and 9 deletions
+4
View File
@@ -206,6 +206,10 @@ type Config struct {
EnableLazySpiloUpgrade bool `name:"enable_lazy_spilo_upgrade" default:"false"`
EnablePgVersionEnvVar bool `name:"enable_pgversion_env_var" default:"true"`
EnableSpiloWalPathCompat bool `name:"enable_spilo_wal_path_compat" default:"false"`
MajorVersionUpgradeMode string `name:"major_version_upgrade_mode" default:"off"` // off - no actions, manual - manifest triggers action, full - manifest and minimal version violation trigger upgrade
MinimalMajorVersion string `name:"minimal_major_version" default:"9.5"`
TargetMajorVersion string `name:"target_major_version" default:"13"`
AllowedMajorUpgradeVersions []string `name:"allowed_major_upgrade_versions" default:"12,13"`
}
// MustMarshal marshals the config or panics
+54
View File
@@ -27,6 +27,7 @@ type Interface interface {
Switchover(master *v1.Pod, candidate string) error
SetPostgresParameters(server *v1.Pod, options map[string]string) error
GetPatroniMemberState(pod *v1.Pod) (string, error)
GetMemberData(server *v1.Pod) (MemberData, error)
}
// Patroni API client
@@ -158,3 +159,56 @@ func (p *Patroni) GetPatroniMemberState(server *v1.Pod) (string, error) {
return state, nil
}
// MemberData Patroni member data from Patroni API
type MemberData struct {
State string
Role string
ServerVersion int
Scope string
PatroniVersion string
}
// GetMemberData read member data from patroni API
func (p *Patroni) GetMemberData(server *v1.Pod) (MemberData, error) {
apiURLString, err := apiURL(server)
if err != nil {
return MemberData{}, err
}
response, err := p.httpClient.Get(apiURLString)
if err != nil {
return MemberData{}, fmt.Errorf("could not perform Get request: %v", err)
}
defer response.Body.Close()
body, err := ioutil.ReadAll(response.Body)
if err != nil {
return MemberData{}, fmt.Errorf("could not read response: %v", err)
}
data := make(map[string]interface{})
err = json.Unmarshal(body, &data)
if err != nil {
return MemberData{}, err
}
memberData := MemberData{}
var ok, r bool
memberData.state, r = data["state"].(string)
ok = ok && r
memberData.serverVersion, r = data["server_version"].(int)
ok = ok && r
memberData.role, r = data["role"].(string)
ok = ok && r
memberData.role, r = data["scope"].(string)
ok = ok && r
if !ok {
return MemberData{}, errors.New("Patroni member data could not be read")
}
return memberData, nil
}