forked from toolshed/coop-cloud-backend
153 lines
4.2 KiB
Go
153 lines
4.2 KiB
Go
package api
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"encoding/json"
|
|
appPkg "coopcloud.tech/abra/pkg/app"
|
|
"coop-cloud-backend/internal"
|
|
"net/http"
|
|
)
|
|
|
|
func (h *abraHandler) handleListApps(w http.ResponseWriter, r *http.Request) {
|
|
appNames, err := GetAppNames()
|
|
if err != nil {
|
|
log.Printf("Error getting app names: %s\n", err)
|
|
InternalServerErrorHandler(w, r)
|
|
return
|
|
}
|
|
// counts the number of apps in a server to initialize slices later
|
|
serverAppCount := make(map[string]int)
|
|
|
|
remoteApps := make([]appPkg.App, 0, len(appNames))
|
|
for _, appName := range appNames {
|
|
remoteApp, err := GetApp(appName)
|
|
serverAppCount[remoteApp.Server] += 1
|
|
if err != nil {
|
|
log.Printf("Error getting app %s: %s\n", appName, err)
|
|
InternalServerErrorHandler(w, r)
|
|
return
|
|
}
|
|
remoteApps = append(remoteApps, remoteApp)
|
|
}
|
|
|
|
appStatuses, err := GetAppStatuses(remoteApps)
|
|
if err != nil {
|
|
log.Printf("Error: %s\n", err)
|
|
http.Error(w, fmt.Sprintf("Error: %s\n", err), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
abraAppResponse := ServerAppsResponse{}
|
|
for _, app := range remoteApps {
|
|
serverApps, ok := abraAppResponse[app.Server]
|
|
if !ok { // create the slice
|
|
// ever other field initializes to 0
|
|
serverApps = ServerApps{
|
|
Apps: make([]AbraApp, 0, serverAppCount[app.Server]),
|
|
}
|
|
}
|
|
appInfo, ok := appStatuses[app.StackName()]
|
|
if ok {
|
|
log.Printf("app %s is deployed\n", app.Name)
|
|
serverApps.Apps = append(serverApps.Apps, appTranspose(app, appInfo))
|
|
serverApps.AppCount += 1
|
|
// assume these are true rn idk
|
|
serverApps.VersionCount += 1
|
|
serverApps.LatestCount += 1
|
|
} else {
|
|
log.Printf("app %s is undeployed\n", app.Name)
|
|
appT, err := appTransposeUndeployed(app)
|
|
if err != nil {
|
|
log.Printf("app transpose failed: %s\n", err)
|
|
http.Error(w, fmt.Sprintf("app transpose failed: %s\n", err), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
serverApps.Apps = append(serverApps.Apps, appT)
|
|
serverApps.AppCount += 1
|
|
// assume these are true rn idk
|
|
serverApps.VersionCount += 1
|
|
serverApps.LatestCount += 1
|
|
}
|
|
abraAppResponse[app.Server] = serverApps
|
|
}
|
|
jsonBytes, err := json.Marshal(abraAppResponse)
|
|
if err != nil {
|
|
log.Printf("JSON conversion failed: %s\n", err)
|
|
http.Error(w, fmt.Sprintf("JSON conversion failed: %s\n", err), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
w.WriteHeader(http.StatusOK)
|
|
w.Write(jsonBytes)
|
|
}
|
|
func appTransposeUndeployed(app appPkg.App) (AbraApp, error) {
|
|
config, err := app.Recipe.GetComposeConfig(app.Env)
|
|
if err != nil {
|
|
return AbraApp{}, err
|
|
}
|
|
version := GetLabel(config, app.StackName(), "version")
|
|
if version == "" {
|
|
version = "unknown"
|
|
}
|
|
return AbraApp{
|
|
AppName: app.Name,
|
|
Server: app.Server,
|
|
Recipe: app.Recipe.Name,
|
|
Domain: app.Domain,
|
|
Chaos: "false",
|
|
Status: "undeployed",
|
|
ChaosVersion: "unknown",
|
|
Version: version,
|
|
Upgrade: "latest",
|
|
}, nil
|
|
}
|
|
func appTranspose(app appPkg.App, psInfo map[string]string) AbraApp {
|
|
return AbraApp{
|
|
AppName: app.Name,
|
|
Server: app.Server,
|
|
Recipe: app.Recipe.Name,
|
|
Domain: app.Domain,
|
|
Chaos: psInfo["chaos"],
|
|
Status: psInfo["status"],
|
|
ChaosVersion: getOrDefault(psInfo, "chaosVersion", "unknown"),
|
|
Version: psInfo["version"],
|
|
Upgrade: "latest",
|
|
}
|
|
}
|
|
|
|
func getOrDefault(m map[string]string, key, def string) string {
|
|
if v, ok := m[key]; ok {
|
|
return v
|
|
}
|
|
return def
|
|
}
|
|
|
|
func (h *abraHandler) handleListServers (w http.ResponseWriter, r *http.Request) {
|
|
servers, err := GetServers()
|
|
if err != nil {
|
|
log.Printf("Error: %s\n", err)
|
|
http.Error(w, fmt.Sprintf("Error: %s\n", err), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
serverNames, err := ReadServerNames()
|
|
if err != nil {
|
|
log.Printf("Error: %s\n", err)
|
|
http.Error(w, fmt.Sprintf("Error: %s\n", err), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
abraServers := make([]AbraServer, 0, len(servers))
|
|
for i := range len(servers) {
|
|
abraServers = append(abraServers,
|
|
AbraServer{
|
|
Name: serverNames[i],
|
|
Host: servers[i],
|
|
},
|
|
)
|
|
}
|
|
jsonBytes, err := json.Marshal(abraServers)
|
|
if err != nil {
|
|
log.Printf("Error: %s\n", err)
|
|
http.Error(w, fmt.Sprintf("Error: %s\n", err), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
w.WriteHeader(http.StatusOK)
|
|
w.Write(jsonBytes)
|
|
} |