164 lines
4.6 KiB
Go
164 lines
4.6 KiB
Go
package v1
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/gorilla/mux"
|
|
"github.com/wild-cloud/wild-central/daemon/internal/tools"
|
|
"github.com/wild-cloud/wild-central/daemon/internal/utilities"
|
|
)
|
|
|
|
// UtilitiesHealth returns cluster health status (legacy, no instance context)
|
|
func (api *API) UtilitiesHealth(w http.ResponseWriter, r *http.Request) {
|
|
status, err := utilities.GetClusterHealth("")
|
|
if err != nil {
|
|
respondError(w, http.StatusInternalServerError, "Failed to get cluster health")
|
|
return
|
|
}
|
|
|
|
respondJSON(w, http.StatusOK, map[string]interface{}{
|
|
"success": true,
|
|
"data": status,
|
|
})
|
|
}
|
|
|
|
// InstanceUtilitiesHealth returns cluster health status for a specific instance
|
|
func (api *API) InstanceUtilitiesHealth(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
instanceName := vars["name"]
|
|
|
|
// Validate instance exists
|
|
if err := api.instance.ValidateInstance(instanceName); err != nil {
|
|
respondError(w, http.StatusNotFound, fmt.Sprintf("Instance not found: %v", err))
|
|
return
|
|
}
|
|
|
|
// Get kubeconfig path for this instance
|
|
kubeconfigPath := tools.GetKubeconfigPath(api.dataDir, instanceName)
|
|
|
|
status, err := utilities.GetClusterHealth(kubeconfigPath)
|
|
if err != nil {
|
|
respondError(w, http.StatusInternalServerError, "Failed to get cluster health")
|
|
return
|
|
}
|
|
|
|
respondJSON(w, http.StatusOK, map[string]interface{}{
|
|
"success": true,
|
|
"data": status,
|
|
})
|
|
}
|
|
|
|
// InstanceUtilitiesDashboardToken returns a Kubernetes dashboard token for a specific instance
|
|
func (api *API) UtilitiesDashboardToken(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
instanceName := vars["name"]
|
|
|
|
// Validate instance exists
|
|
if err := api.instance.ValidateInstance(instanceName); err != nil {
|
|
respondError(w, http.StatusNotFound, fmt.Sprintf("Instance not found: %v", err))
|
|
return
|
|
}
|
|
|
|
// Get kubeconfig path for the instance
|
|
kubeconfigPath := tools.GetKubeconfigPath(api.dataDir, instanceName)
|
|
|
|
token, err := utilities.GetDashboardToken(kubeconfigPath)
|
|
if err != nil {
|
|
// Try fallback method
|
|
token, err = utilities.GetDashboardTokenFromSecret(kubeconfigPath)
|
|
if err != nil {
|
|
respondError(w, http.StatusInternalServerError, "Failed to get dashboard token")
|
|
return
|
|
}
|
|
}
|
|
|
|
respondJSON(w, http.StatusOK, map[string]interface{}{
|
|
"success": true,
|
|
"data": token,
|
|
})
|
|
}
|
|
|
|
// UtilitiesNodeIPs returns IP addresses for all cluster nodes
|
|
func (api *API) UtilitiesNodeIPs(w http.ResponseWriter, r *http.Request) {
|
|
nodes, err := utilities.GetNodeIPs()
|
|
if err != nil {
|
|
respondError(w, http.StatusInternalServerError, "Failed to get node IPs")
|
|
return
|
|
}
|
|
|
|
respondJSON(w, http.StatusOK, map[string]interface{}{
|
|
"success": true,
|
|
"data": map[string]interface{}{
|
|
"nodes": nodes,
|
|
},
|
|
})
|
|
}
|
|
|
|
// UtilitiesControlPlaneIP returns the control plane IP
|
|
func (api *API) UtilitiesControlPlaneIP(w http.ResponseWriter, r *http.Request) {
|
|
ip, err := utilities.GetControlPlaneIP()
|
|
if err != nil {
|
|
respondError(w, http.StatusInternalServerError, "Failed to get control plane IP")
|
|
return
|
|
}
|
|
|
|
respondJSON(w, http.StatusOK, map[string]interface{}{
|
|
"success": true,
|
|
"data": map[string]interface{}{
|
|
"ip": ip,
|
|
},
|
|
})
|
|
}
|
|
|
|
// UtilitiesSecretCopy copies a secret between namespaces
|
|
func (api *API) UtilitiesSecretCopy(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
secretName := vars["secret"]
|
|
|
|
var req struct {
|
|
SourceNamespace string `json:"source_namespace"`
|
|
DestinationNamespace string `json:"destination_namespace"`
|
|
}
|
|
|
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
|
respondError(w, http.StatusBadRequest, "Invalid request body")
|
|
return
|
|
}
|
|
|
|
if req.SourceNamespace == "" || req.DestinationNamespace == "" {
|
|
respondError(w, http.StatusBadRequest, "source_namespace and destination_namespace are required")
|
|
return
|
|
}
|
|
|
|
if err := utilities.CopySecretBetweenNamespaces(secretName, req.SourceNamespace, req.DestinationNamespace); err != nil {
|
|
respondError(w, http.StatusInternalServerError, "Failed to copy secret")
|
|
return
|
|
}
|
|
|
|
respondJSON(w, http.StatusOK, map[string]interface{}{
|
|
"success": true,
|
|
"message": "Secret copied successfully",
|
|
})
|
|
}
|
|
|
|
// UtilitiesVersion returns cluster and Talos versions
|
|
func (api *API) UtilitiesVersion(w http.ResponseWriter, r *http.Request) {
|
|
k8sVersion, err := utilities.GetClusterVersion()
|
|
if err != nil {
|
|
respondError(w, http.StatusInternalServerError, "Failed to get cluster version")
|
|
return
|
|
}
|
|
|
|
talosVersion, _ := utilities.GetTalosVersion() // Don't fail if Talos check fails
|
|
|
|
respondJSON(w, http.StatusOK, map[string]interface{}{
|
|
"success": true,
|
|
"data": map[string]interface{}{
|
|
"kubernetes": k8sVersion,
|
|
"talos": talosVersion,
|
|
},
|
|
})
|
|
}
|