feat: implement action proxy route
This commit is contained in:
@@ -1,10 +1,54 @@
|
|||||||
package actions
|
package actions
|
||||||
|
|
||||||
import "net/http"
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"git.dcntrlized.org/Dcntrlized/Maestro/lib/docker"
|
||||||
|
)
|
||||||
|
|
||||||
func RunAction(w http.ResponseWriter, r *http.Request) {
|
func RunAction(w http.ResponseWriter, r *http.Request) {
|
||||||
// Stub, to implement, receives an action via frontend code and redirects it to the correct container, which will execute it and return the result to the frontend
|
// Runs an action on the container specified by the actionName and containerId path parameters.
|
||||||
// Request comes in format {"container_id": string, "action": { "method": "GET" | "POST" | "PUT" | "DELETE", "action_name": string }, "payload": object}
|
actionName := r.PathValue("actionName")
|
||||||
|
containerId := r.PathValue("containerId")
|
||||||
|
|
||||||
http.Error(w, "Action not implemented", http.StatusNotImplemented)
|
// Get IP address of the container using containerId
|
||||||
|
dockerClient, err := docker.NewDockerClient()
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, "Failed to create Docker client", http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
inspectData, err := dockerClient.ContainerInspect(context.Background(), containerId)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, "Failed to inspect container", http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
network, _, err := docker.ExtractNetworkInfo(context.Background(), dockerClient, inspectData)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, "Failed to extract network info", http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// Construct the URL for the action endpoint
|
||||||
|
actionURL := fmt.Sprintf("http://%s:%d/%s", network.IPAddress, network.Ports[0].Host, actionName) // Assuming network.Ports[0] is the main port. Might change in the future
|
||||||
|
|
||||||
|
// Forward the request to the container's action endpoint
|
||||||
|
resp, err := http.Get(actionURL)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, "Failed to forward request to container", http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
// Copy the response from the container back to the original response writer
|
||||||
|
w.WriteHeader(resp.StatusCode)
|
||||||
|
_, err = io.Copy(w, resp.Body)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, "Failed to read response from container", http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -43,7 +43,7 @@ func main() {
|
|||||||
mux.HandleFunc("/api/containers", containers.NewListContainersHandler(cache))
|
mux.HandleFunc("/api/containers", containers.NewListContainersHandler(cache))
|
||||||
mux.HandleFunc("/api/ws", wsHub.HandleWS)
|
mux.HandleFunc("/api/ws", wsHub.HandleWS)
|
||||||
mux.HandleFunc("/api/containers/install", containers.InstallContainer)
|
mux.HandleFunc("/api/containers/install", containers.InstallContainer)
|
||||||
mux.HandleFunc("/api/actions", actions.RunAction)
|
mux.HandleFunc("/api/actions/{actionName}/{containerId}", actions.RunAction)
|
||||||
mux.HandleFunc("/api/registry", handlers.GetRegistry)
|
mux.HandleFunc("/api/registry", handlers.GetRegistry)
|
||||||
|
|
||||||
if os.Getenv("DEV_MODE") != "true" {
|
if os.Getenv("DEV_MODE") != "true" {
|
||||||
|
|||||||
Reference in New Issue
Block a user