@@ -3,6 +3,8 @@ package commands
33import (
44 "encoding/json"
55 "fmt"
6+ "github.com/fly-examples/postgres-ha/pkg/flypg"
7+ "github.com/pkg/errors"
68 "io"
79 "net/http"
810 "os/exec"
@@ -174,3 +176,115 @@ func handleUpdateSettings(w http.ResponseWriter, r *http.Request) {
174176
175177 render .JSON (w , resp , http .StatusOK )
176178}
179+
180+ func handleReplicationStats (w http.ResponseWriter , r * http.Request ) {
181+ conn , close , err := localConnection (r .Context ())
182+ if err != nil {
183+ render .Err (w , err )
184+ return
185+ }
186+ defer close ()
187+
188+ stats , err := admin .ResolveReplicationLag (r .Context (), conn )
189+ if err != nil {
190+ render .Err (w , err )
191+ return
192+ }
193+
194+ resp := & Response {Result : stats }
195+
196+ render .JSON (w , resp , http .StatusOK )
197+ }
198+
199+ func handleStolonDBUid (w http.ResponseWriter , r * http.Request ) {
200+ env , err := util .BuildEnv ()
201+ if err != nil {
202+ render .Err (w , err )
203+ }
204+
205+ data , err := stolon .FetchClusterData (env )
206+ if err != nil {
207+ render .Err (w , err )
208+ }
209+
210+ node , err := flypg .NewNode ()
211+ if err != nil {
212+ render .Err (w , err )
213+ }
214+
215+ for _ , db := range data .DBs {
216+ if db .Spec .KeeperUID == node .KeeperUID {
217+ resp := & Response {Result : db .UID }
218+ render .JSON (w , resp , http .StatusOK )
219+ return
220+ }
221+ }
222+
223+ render .Err (w , errors .New ("can't find db" ))
224+ }
225+
226+ func handleEnableReadonly (w http.ResponseWriter , r * http.Request ) {
227+ conn , close , err := localConnection (r .Context ())
228+ if err != nil {
229+ render .Err (w , err )
230+ return
231+ }
232+ defer close ()
233+
234+ err = admin .SetReadonly (r .Context (), conn , true )
235+ if err != nil {
236+ render .Err (w , err )
237+ }
238+
239+ args := []string {"root" , "pkill" , "haproxy" }
240+
241+ cmd := exec .Command ("gosu" , args ... )
242+
243+ if err := cmd .Run (); err != nil {
244+ render .Err (w , err )
245+ return
246+ }
247+
248+ if cmd .ProcessState .ExitCode () != 0 {
249+ err := fmt .Errorf (cmd .ProcessState .String ())
250+ render .Err (w , err )
251+ return
252+ }
253+
254+ resp := & Response {Result : true }
255+
256+ render .JSON (w , resp , http .StatusOK )
257+ }
258+
259+ func handleDisableReadonly (w http.ResponseWriter , r * http.Request ) {
260+ conn , close , err := localConnection (r .Context ())
261+ if err != nil {
262+ render .Err (w , err )
263+ return
264+ }
265+ defer close ()
266+
267+ err = admin .SetReadonly (r .Context (), conn , false )
268+ if err != nil {
269+ render .Err (w , err )
270+ }
271+
272+ args := []string {"root" , "pkill" , "haproxy" }
273+
274+ cmd := exec .Command ("gosu" , args ... )
275+
276+ if err := cmd .Run (); err != nil {
277+ render .Err (w , err )
278+ return
279+ }
280+
281+ if cmd .ProcessState .ExitCode () != 0 {
282+ err := fmt .Errorf (cmd .ProcessState .String ())
283+ render .Err (w , err )
284+ return
285+ }
286+
287+ resp := & Response {Result : true }
288+
289+ render .JSON (w , resp , http .StatusOK )
290+ }
0 commit comments