mirror of
https://github.com/zalando/postgres-operator.git
synced 2026-10-06 02:13:23 +02:00
Making progress on automated upgrade support via manifest and global upgrades.
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user