orama/pkg/cli/production/report/deployments.go

113 lines
2.8 KiB
Go

package report
import (
"context"
"encoding/json"
"fmt"
"net/http"
"strings"
"time"
)
// collectDeployments discovers deployed applications by querying the local gateway.
func collectDeployments() *DeploymentsReport {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
report := &DeploymentsReport{}
// Query the local gateway for deployment list
url := "http://localhost:8080/v1/health"
body, err := httpGet(ctx, url)
if err != nil {
// Gateway not available — fall back to systemd unit discovery
return collectDeploymentsFromSystemd()
}
// Check if gateway reports deployment counts in health response
var health map[string]interface{}
if err := json.Unmarshal(body, &health); err == nil {
if deps, ok := health["deployments"].(map[string]interface{}); ok {
if v, ok := deps["total"].(float64); ok {
report.TotalCount = int(v)
}
if v, ok := deps["running"].(float64); ok {
report.RunningCount = int(v)
}
if v, ok := deps["failed"].(float64); ok {
report.FailedCount = int(v)
}
return report
}
}
// Fallback: count deployment systemd units
return collectDeploymentsFromSystemd()
}
// collectDeploymentsFromSystemd discovers deployments by listing systemd units.
func collectDeploymentsFromSystemd() *DeploymentsReport {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
report := &DeploymentsReport{}
// List orama-deploy-* units
out, err := runCmd(ctx, "systemctl", "list-units", "--type=service", "--no-legend", "--no-pager", "orama-deploy-*")
if err != nil {
return report
}
for _, line := range strings.Split(out, "\n") {
line = strings.TrimSpace(line)
if line == "" {
continue
}
report.TotalCount++
fields := strings.Fields(line)
// systemctl list-units format: UNIT LOAD ACTIVE SUB DESCRIPTION...
if len(fields) >= 4 {
switch fields[3] {
case "running":
report.RunningCount++
case "failed", "dead":
report.FailedCount++
}
}
}
return report
}
// collectServerless checks if the serverless engine is available via the gateway health endpoint.
func collectServerless() *ServerlessReport {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
report := &ServerlessReport{
EngineStatus: "unknown",
}
// Check gateway health for serverless subsystem
url := "http://localhost:8080/v1/health"
req, err := http.NewRequestWithContext(ctx, http.MethodGet, url, nil)
if err != nil {
return report
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
report.EngineStatus = "unreachable"
return report
}
defer resp.Body.Close()
if resp.StatusCode == http.StatusOK {
report.EngineStatus = "healthy"
} else {
report.EngineStatus = fmt.Sprintf("unhealthy (HTTP %d)", resp.StatusCode)
}
return report
}