Node endpoints with container handling
This commit is contained in:
107
node/node.go
Normal file
107
node/node.go
Normal file
@@ -0,0 +1,107 @@
|
||||
package node
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
|
||||
"github.com/moby/moby/api/types/container"
|
||||
"github.com/moby/moby/client"
|
||||
log "gitlab.com/gdulai/simpleloglvl"
|
||||
)
|
||||
|
||||
type BuildCommand struct {
|
||||
Repository string `json:"repository"`
|
||||
Branch string `json:"branch"`
|
||||
Descriptor string `json:"descriptor"`
|
||||
}
|
||||
|
||||
func HandleBuild(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
}
|
||||
|
||||
func build(command BuildCommand) {
|
||||
|
||||
}
|
||||
|
||||
func HandleStart(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
}
|
||||
|
||||
func start() {
|
||||
|
||||
}
|
||||
|
||||
func HandleStop(w http.ResponseWriter, r *http.Request) {
|
||||
decoder := json.NewDecoder(r.Body)
|
||||
var containerId string
|
||||
err := decoder.Decode(&containerId)
|
||||
if err != nil {
|
||||
log.LogError("Failed to decode node/stop request body!")
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
if containerId == "" {
|
||||
log.LogError("Container id mus be specified for node/stop!")
|
||||
w.WriteHeader(http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
if stop(containerId) {
|
||||
w.WriteHeader(http.StatusOK)
|
||||
} else {
|
||||
w.WriteHeader(http.StatusInternalServerError)
|
||||
}
|
||||
}
|
||||
|
||||
func stop(containerId string) bool {
|
||||
cli := openDockerClient()
|
||||
_, err := cli.ContainerStop(context.Background(), containerId, client.ContainerStopOptions{})
|
||||
if err != nil {
|
||||
log.LogError("Failed to stop container: %s\n%s", containerId, err)
|
||||
return false
|
||||
}
|
||||
log.LogInfo("Successfully stopped container: %s", containerId)
|
||||
return true
|
||||
}
|
||||
|
||||
func HandleInfo(w http.ResponseWriter, r *http.Request) {
|
||||
json.NewEncoder(w).Encode(info())
|
||||
}
|
||||
|
||||
func info() []container.Summary {
|
||||
cli := openDockerClient()
|
||||
// List all containers (running and stopped)
|
||||
containers, err := cli.ContainerList(context.Background(), client.ContainerListOptions{
|
||||
All: true,
|
||||
})
|
||||
if err != nil {
|
||||
log.LogFatalError("Failed to list containers: %v", err)
|
||||
}
|
||||
|
||||
var summaries []container.Summary
|
||||
// Print container info
|
||||
for _, c := range containers.Items {
|
||||
summaries = append(summaries, c)
|
||||
name := ""
|
||||
if len(c.Names) > 0 {
|
||||
name = c.Names[0]
|
||||
}
|
||||
log.LogInfo("ID: %s Name: %s Image: %s Status: %s\n",
|
||||
c.ID[:12], name, c.Image, c.Status)
|
||||
}
|
||||
|
||||
return summaries
|
||||
|
||||
}
|
||||
|
||||
func openDockerClient() *client.Client {
|
||||
cli, err := client.New(
|
||||
client.FromEnv,
|
||||
client.WithAPIVersionFromEnv(),
|
||||
)
|
||||
if err != nil {
|
||||
log.LogFatalError("Failed to create Docker client: %v", err)
|
||||
}
|
||||
return cli
|
||||
}
|
||||
Reference in New Issue
Block a user