@@ -10,9 +10,11 @@ import (
1010 "strconv"
1111 "time"
1212
13+ "github.com/zalando/postgres-operator/pkg/util/constants"
1314 httpclient "github.com/zalando/postgres-operator/pkg/util/httpclient"
1415
1516 "github.com/sirupsen/logrus"
17+ acidv1 "github.com/zalando/postgres-operator/pkg/apis/acid.zalan.do/v1"
1618 v1 "k8s.io/api/core/v1"
1719)
1820
@@ -31,7 +33,7 @@ type Interface interface {
3133 SetPostgresParameters (server * v1.Pod , options map [string ]string ) error
3234 GetMemberData (server * v1.Pod ) (MemberData , error )
3335 Restart (server * v1.Pod ) error
34- GetConfig (server * v1.Pod ) (map [string ]interface {} , error )
36+ GetConfig (server * v1.Pod ) (acidv1. Patroni , map [string ]string , error )
3537 SetConfig (server * v1.Pod , config map [string ]interface {}) error
3638}
3739
@@ -109,28 +111,23 @@ func (p *Patroni) httpPostOrPatch(method string, url string, body *bytes.Buffer)
109111}
110112
111113func (p * Patroni ) httpGet (url string ) (string , error ) {
112- request , err := http .NewRequest ("GET" , url , nil )
113- if err != nil {
114- return "" , fmt .Errorf ("could not create request: %v" , err )
115- }
114+ p .logger .Debugf ("making GET http request: %s" , url )
116115
117- p .logger .Debugf ("making GET http request: %s" , request .URL .String ())
118-
119- resp , err := p .httpClient .Do (request )
116+ response , err := p .httpClient .Get (url )
120117 if err != nil {
121118 return "" , fmt .Errorf ("could not make request: %v" , err )
122119 }
123- bodyBytes , err := ioutil .ReadAll (resp .Body )
120+ defer response .Body .Close ()
121+
122+ bodyBytes , err := ioutil .ReadAll (response .Body )
124123 if err != nil {
125124 return "" , fmt .Errorf ("could not read response: %v" , err )
126125 }
127- if err := resp .Body .Close (); err != nil {
128- return "" , fmt .Errorf ("could not close request: %v" , err )
129- }
130126
131- if resp .StatusCode != http .StatusOK {
132- return string (bodyBytes ), fmt .Errorf ("patroni returned '%d'" , resp .StatusCode )
127+ if response .StatusCode != http .StatusOK {
128+ return string (bodyBytes ), fmt .Errorf ("patroni returned '%d'" , response .StatusCode )
133129 }
130+
134131 return string (bodyBytes ), nil
135132}
136133
@@ -194,30 +191,43 @@ type MemberData struct {
194191 Patroni MemberDataPatroni `json:"patroni"`
195192}
196193
197- func (p * Patroni ) GetConfigOrStatus (server * v1.Pod , path string ) (map [string ]interface {}, error ) {
198- result := make (map [string ]interface {})
194+ func (p * Patroni ) GetConfig (server * v1.Pod ) (acidv1.Patroni , map [string ]string , error ) {
195+ var (
196+ patroniConfig acidv1.Patroni
197+ pgConfig map [string ]interface {}
198+ )
199199 apiURLString , err := apiURL (server )
200200 if err != nil {
201- return result , err
201+ return patroniConfig , nil , err
202202 }
203- body , err := p .httpGet (apiURLString + path )
204- err = json .Unmarshal ([]byte (body ), & result )
203+ body , err := p .httpGet (apiURLString + configPath )
205204 if err != nil {
206- return result , err
205+ return patroniConfig , nil , err
206+ }
207+ err = json .Unmarshal ([]byte (body ), & patroniConfig )
208+ if err != nil {
209+ return patroniConfig , nil , err
207210 }
208211
209- return result , err
210- }
211-
212- func (p * Patroni ) GetStatus (server * v1.Pod ) (map [string ]interface {}, error ) {
213- return p .GetConfigOrStatus (server , statusPath )
214- }
212+ // unmarshalling postgresql parameters needs a detour
213+ err = json .Unmarshal ([]byte (body ), & pgConfig )
214+ if err != nil {
215+ return patroniConfig , nil , err
216+ }
217+ pgParameters := make (map [string ]string )
218+ if _ , exists := pgConfig ["postgresql" ]; exists {
219+ effectivePostgresql := pgConfig ["postgresql" ].(map [string ]interface {})
220+ effectivePgParameters := effectivePostgresql [constants .PatroniPGParametersParameterName ].(map [string ]interface {})
221+ for parameter , value := range effectivePgParameters {
222+ strValue := fmt .Sprintf ("%v" , value )
223+ pgParameters [parameter ] = strValue
224+ }
225+ }
215226
216- func (p * Patroni ) GetConfig (server * v1.Pod ) (map [string ]interface {}, error ) {
217- return p .GetConfigOrStatus (server , configPath )
227+ return patroniConfig , pgParameters , err
218228}
219229
220- //Restart method restarts instance via Patroni POST API call.
230+ // Restart method restarts instance via Patroni POST API call.
221231func (p * Patroni ) Restart (server * v1.Pod ) error {
222232 buf := & bytes.Buffer {}
223233 err := json .NewEncoder (buf ).Encode (map [string ]interface {}{"restart_pending" : true })
@@ -228,9 +238,13 @@ func (p *Patroni) Restart(server *v1.Pod) error {
228238 if err != nil {
229239 return err
230240 }
231- status , err := p .GetStatus (server )
232- pending_restart , ok := status ["pending_restart" ]
233- if ! ok || ! pending_restart .(bool ) {
241+ memberData , err := p .GetMemberData (server )
242+ if err != nil {
243+ return err
244+ }
245+
246+ // do restart only when it is pending
247+ if ! memberData .PendingRestart {
234248 return nil
235249 }
236250 return p .httpPostOrPatch (http .MethodPost , apiURLString + restartPath , buf )
@@ -243,19 +257,13 @@ func (p *Patroni) GetMemberData(server *v1.Pod) (MemberData, error) {
243257 if err != nil {
244258 return MemberData {}, err
245259 }
246- response , err := p .httpClient .Get (apiURLString )
247- if err != nil {
248- return MemberData {}, fmt .Errorf ("could not perform Get request: %v" , err )
249- }
250- defer response .Body .Close ()
251-
252- body , err := ioutil .ReadAll (response .Body )
260+ body , err := p .httpGet (apiURLString + statusPath )
253261 if err != nil {
254- return MemberData {}, fmt . Errorf ( "could not read response: %v" , err )
262+ return MemberData {}, err
255263 }
256264
257265 data := MemberData {}
258- err = json .Unmarshal (body , & data )
266+ err = json .Unmarshal ([] byte ( body ) , & data )
259267 if err != nil {
260268 return MemberData {}, err
261269 }
0 commit comments