func AdminStartServerContainers(w rest.ResponseWriter, r *rest.Request) { dbConn, err := util.GetConnection(CLUSTERADMIN_DB) if err != nil { logit.Error.Println("BackupNow: error " + err.Error()) rest.Error(w, err.Error(), 400) return } defer dbConn.Close() err = secimpl.Authorize(dbConn, r.PathParam("Token"), "perm-read") if err != nil { logit.Error.Println("AdminStartServerContainers: validate token error " + err.Error()) rest.Error(w, err.Error(), http.StatusUnauthorized) return } //serverID serverid := r.PathParam("ID") if serverid == "" { logit.Error.Println("AdminStartServerContainers: error ID required") rest.Error(w, "ID required", http.StatusBadRequest) return } containers, err := admindb.GetAllContainersForServer(dbConn, serverid) if err != nil { logit.Error.Println("AdminStartServerContainers:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } //for each, get server, start container //use a 'best effort' approach here since containers //can be removed outside of CPM's control var url string for i := range containers { //fetch the server server := admindb.Server{} server, err = admindb.GetServer(dbConn, containers[i].ServerID) if err != nil { logit.Error.Println("AdminStartServerContainers:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } //start the container var response cpmserverapi.DockerStartResponse var err error request := &cpmserverapi.DockerStartRequest{} request.ContainerName = containers[i].Name url = "http://" + server.IPAddress + ":10001" response, err = cpmserverapi.DockerStartClient(url, request) if err != nil { logit.Error.Println("AdminStartServerContainers: error when trying to start container " + err.Error()) } logit.Info.Println(response.Output) } w.WriteHeader(http.StatusOK) status := SimpleStatus{} status.Status = "OK" w.WriteJson(&status) }
func AdminStopServerContainers(w rest.ResponseWriter, r *rest.Request) { dbConn, err := util.GetConnection(CLUSTERADMIN_DB) if err != nil { logit.Error.Println("BackupNow: error " + err.Error()) rest.Error(w, err.Error(), 400) return } defer dbConn.Close() err = secimpl.Authorize(dbConn, r.PathParam("Token"), "perm-read") if err != nil { logit.Error.Println("AdminStopServerContainers: validate token error " + err.Error()) rest.Error(w, err.Error(), http.StatusUnauthorized) return } //serverID serverid := r.PathParam("ID") if serverid == "" { logit.Error.Println("AdminStopoServerContainers: error ID required") rest.Error(w, "ID required", http.StatusBadRequest) return } //fetch the server containers, err := admindb.GetAllContainersForServer(dbConn, serverid) if err != nil { logit.Error.Println("AdminStopServerContainers:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } var url string //for each, get server, stop container for i := range containers { server := admindb.Server{} server, err = admindb.GetServer(dbConn, containers[i].ServerID) if err != nil { logit.Error.Println("AdminStopServerContainers:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } //send stop command before stopping container if containers[i].Role == "pgpool" { var stoppoolResp cpmcontainerapi.StopPgpoolResponse stoppoolResp, err = cpmcontainerapi.StopPgpoolClient(containers[i].Name) logit.Info.Println("AdminStoppg:" + stoppoolResp.Output) } else { var stopResp cpmcontainerapi.StopPGResponse stopResp, err = cpmcontainerapi.StopPGClient(containers[i].Name) logit.Info.Println("AdminStoppg:" + stopResp.Output) } if err != nil { logit.Error.Println("AdminStopServerContainers:" + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } time.Sleep(2000 * time.Millisecond) //stop container request := &cpmserverapi.DockerStopRequest{} request.ContainerName = containers[i].Name url = "http://" + server.IPAddress + ":10001" _, err = cpmserverapi.DockerStopClient(url, request) if err != nil { logit.Error.Println("AdminStopServerContainers: error when trying to start container " + err.Error()) } } w.WriteHeader(http.StatusOK) status := SimpleStatus{} status.Status = "OK" w.WriteJson(&status) }
func GetAllNodesForServer(w rest.ResponseWriter, r *rest.Request) { dbConn, err := util.GetConnection(CLUSTERADMIN_DB) if err != nil { logit.Error.Println("BackupNow: error " + err.Error()) rest.Error(w, err.Error(), 400) return } defer dbConn.Close() err = secimpl.Authorize(dbConn, r.PathParam("Token"), "perm-read") if err != nil { logit.Error.Println("GetAllNodesForServer: validate token error " + err.Error()) rest.Error(w, err.Error(), http.StatusUnauthorized) return } serverID := r.PathParam("ServerID") if serverID == "" { logit.Error.Println("GetAllNodesForServer: error serverID required") rest.Error(w, "serverID required", http.StatusBadRequest) return } results, err := admindb.GetAllContainersForServer(dbConn, serverID) if err != nil { logit.Error.Println("GetAllNodesForServer:" + err.Error()) logit.Error.Println("error " + err.Error()) rest.Error(w, err.Error(), http.StatusBadRequest) return } server, err2 := admindb.GetServer(dbConn, serverID) if err2 != nil { logit.Error.Println("GetAllNodesForServer:" + err2.Error()) logit.Error.Println("error " + err2.Error()) rest.Error(w, err2.Error(), http.StatusBadRequest) return } var response cpmserverapi.DockerInspectResponse var e error var url string nodes := make([]ClusterNode, len(results)) i := 0 for i = range results { nodes[i].ID = results[i].ID nodes[i].Name = results[i].Name nodes[i].ClusterID = results[i].ClusterID nodes[i].ServerID = results[i].ServerID nodes[i].Role = results[i].Role nodes[i].Image = results[i].Image nodes[i].CreateDate = results[i].CreateDate nodes[i].ProjectID = results[i].ProjectID nodes[i].ProjectName = results[i].ProjectName nodes[i].ServerName = results[i].ServerName nodes[i].Status = "down" request := &cpmserverapi.DockerInspectRequest{} request.ContainerName = results[i].Name url = "http://" + server.IPAddress + ":10001" response, e = cpmserverapi.DockerInspectClient(url, request) logit.Info.Println("GetAllNodesForServer:" + results[i].Name + " " + response.IPAddress + " " + response.RunningState) if e != nil { logit.Error.Println("GetAllNodesForServer:" + e.Error()) logit.Error.Println(e.Error()) nodes[i].Status = "notfound" } else { logit.Info.Println("GetAllNodesForServer: setting " + results[i].Name + " to " + response.RunningState) nodes[i].Status = response.RunningState } i++ } w.WriteJson(&nodes) }