mirror of
https://github.com/yusing/godoxy.git
synced 2026-01-11 22:30:47 +01:00
83 lines
2.1 KiB
Go
83 lines
2.1 KiB
Go
package dockerapi
|
|
|
|
import (
|
|
"context"
|
|
"sort"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
dockerSystem "github.com/moby/moby/api/types/system"
|
|
"github.com/moby/moby/client"
|
|
gperr "github.com/yusing/goutils/errs"
|
|
strutils "github.com/yusing/goutils/strings"
|
|
|
|
_ "github.com/yusing/goutils/apitypes"
|
|
)
|
|
|
|
type containerStats struct {
|
|
Total int `json:"total"`
|
|
Running int `json:"running"`
|
|
Paused int `json:"paused"`
|
|
Stopped int `json:"stopped"`
|
|
} // @name ContainerStats
|
|
|
|
type dockerInfo struct {
|
|
Name string `json:"name"`
|
|
ServerVersion string `json:"version"`
|
|
Containers containerStats `json:"containers"`
|
|
Images int `json:"images"`
|
|
NCPU int `json:"n_cpu"`
|
|
MemTotal string `json:"memory"`
|
|
} // @name ServerInfo
|
|
|
|
func toDockerInfo(info dockerSystem.Info) dockerInfo {
|
|
return dockerInfo{
|
|
Name: info.Name,
|
|
ServerVersion: info.ServerVersion,
|
|
Containers: containerStats{
|
|
Total: info.ContainersRunning,
|
|
Running: info.ContainersRunning,
|
|
Paused: info.ContainersPaused,
|
|
Stopped: info.ContainersStopped,
|
|
},
|
|
Images: info.Images,
|
|
NCPU: info.NCPU,
|
|
MemTotal: strutils.FormatByteSize(info.MemTotal),
|
|
}
|
|
}
|
|
|
|
// @x-id "info"
|
|
// @BasePath /api/v1
|
|
// @Summary Get docker info
|
|
// @Description Get docker info
|
|
// @Tags docker
|
|
// @Produce json
|
|
// @Success 200 {object} dockerInfo
|
|
// @Failure 403 {object} apitypes.ErrorResponse
|
|
// @Failure 500 {object} apitypes.ErrorResponse
|
|
// @Router /docker/info [get]
|
|
func Info(c *gin.Context) {
|
|
serveHTTP[dockerInfo](c, GetDockerInfo)
|
|
}
|
|
|
|
func GetDockerInfo(ctx context.Context, dockerClients DockerClients) ([]dockerInfo, gperr.Error) {
|
|
errs := gperr.NewBuilder("failed to get docker info")
|
|
dockerInfos := make([]dockerInfo, len(dockerClients))
|
|
|
|
i := 0
|
|
for name, dockerClient := range dockerClients {
|
|
info, err := dockerClient.Info(ctx, client.InfoOptions{})
|
|
if err != nil {
|
|
errs.Add(err)
|
|
continue
|
|
}
|
|
info.Info.Name = name
|
|
dockerInfos[i] = toDockerInfo(info.Info)
|
|
i++
|
|
}
|
|
|
|
sort.Slice(dockerInfos, func(i, j int) bool {
|
|
return dockerInfos[i].Name < dockerInfos[j].Name
|
|
})
|
|
return dockerInfos, errs.Error()
|
|
}
|