142 lines
3.8 KiB
Go
142 lines
3.8 KiB
Go
package v1
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
|
|
"github.com/gorilla/mux"
|
|
|
|
"github.com/wild-cloud/wild-central/daemon/internal/pxe"
|
|
)
|
|
|
|
// PXEListAssets lists all PXE assets for an instance
|
|
func (api *API) PXEListAssets(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
|
|
}
|
|
|
|
// List assets
|
|
pxeMgr := pxe.NewManager(api.dataDir)
|
|
assets, err := pxeMgr.ListAssets(instanceName)
|
|
if err != nil {
|
|
respondError(w, http.StatusInternalServerError, fmt.Sprintf("Failed to list assets: %v", err))
|
|
return
|
|
}
|
|
|
|
respondJSON(w, http.StatusOK, map[string]interface{}{
|
|
"assets": assets,
|
|
})
|
|
}
|
|
|
|
// PXEDownloadAsset downloads a PXE asset
|
|
func (api *API) PXEDownloadAsset(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
|
|
}
|
|
|
|
// Parse request
|
|
var req struct {
|
|
AssetType string `json:"asset_type"` // kernel, initramfs, iso
|
|
Version string `json:"version"`
|
|
URL string `json:"url"`
|
|
}
|
|
|
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
|
respondError(w, http.StatusBadRequest, "Invalid request body")
|
|
return
|
|
}
|
|
|
|
if req.AssetType == "" {
|
|
respondError(w, http.StatusBadRequest, "asset_type is required")
|
|
return
|
|
}
|
|
|
|
if req.URL == "" {
|
|
respondError(w, http.StatusBadRequest, "url is required")
|
|
return
|
|
}
|
|
|
|
// Download asset
|
|
pxeMgr := pxe.NewManager(api.dataDir)
|
|
if err := pxeMgr.DownloadAsset(instanceName, req.AssetType, req.Version, req.URL); err != nil {
|
|
respondError(w, http.StatusInternalServerError, fmt.Sprintf("Failed to download asset: %v", err))
|
|
return
|
|
}
|
|
|
|
respondJSON(w, http.StatusOK, map[string]string{
|
|
"message": "Asset downloaded successfully",
|
|
"asset_type": req.AssetType,
|
|
"version": req.Version,
|
|
})
|
|
}
|
|
|
|
// PXEGetAsset returns information about a specific asset
|
|
func (api *API) PXEGetAsset(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
instanceName := vars["name"]
|
|
assetType := vars["type"]
|
|
|
|
// Validate instance exists
|
|
if err := api.instance.ValidateInstance(instanceName); err != nil {
|
|
respondError(w, http.StatusNotFound, fmt.Sprintf("Instance not found: %v", err))
|
|
return
|
|
}
|
|
|
|
// Get asset path
|
|
pxeMgr := pxe.NewManager(api.dataDir)
|
|
assetPath, err := pxeMgr.GetAssetPath(instanceName, assetType)
|
|
if err != nil {
|
|
respondError(w, http.StatusNotFound, fmt.Sprintf("Asset not found: %v", err))
|
|
return
|
|
}
|
|
|
|
// Verify asset
|
|
valid, err := pxeMgr.VerifyAsset(instanceName, assetType)
|
|
if err != nil {
|
|
respondError(w, http.StatusInternalServerError, fmt.Sprintf("Failed to verify asset: %v", err))
|
|
return
|
|
}
|
|
|
|
respondJSON(w, http.StatusOK, map[string]interface{}{
|
|
"type": assetType,
|
|
"path": assetPath,
|
|
"valid": valid,
|
|
})
|
|
}
|
|
|
|
// PXEDeleteAsset deletes a PXE asset
|
|
func (api *API) PXEDeleteAsset(w http.ResponseWriter, r *http.Request) {
|
|
vars := mux.Vars(r)
|
|
instanceName := vars["name"]
|
|
assetType := vars["type"]
|
|
|
|
// Validate instance exists
|
|
if err := api.instance.ValidateInstance(instanceName); err != nil {
|
|
respondError(w, http.StatusNotFound, fmt.Sprintf("Instance not found: %v", err))
|
|
return
|
|
}
|
|
|
|
// Delete asset
|
|
pxeMgr := pxe.NewManager(api.dataDir)
|
|
if err := pxeMgr.DeleteAsset(instanceName, assetType); err != nil {
|
|
respondError(w, http.StatusInternalServerError, fmt.Sprintf("Failed to delete asset: %v", err))
|
|
return
|
|
}
|
|
|
|
respondJSON(w, http.StatusOK, map[string]string{
|
|
"message": "Asset deleted successfully",
|
|
"type": assetType,
|
|
})
|
|
}
|