mirror of
https://github.com/yusing/godoxy.git
synced 2026-04-23 00:38:33 +02:00
refactor(api): restructured API for type safety, maintainability and docs generation
- These changes makes the API incombatible with previous versions - Added new types for error handling, success responses, and health checks. - Updated health check logic to utilize the new types for better clarity and structure. - Refactored existing handlers to improve response consistency and error handling. - Updated Makefile to include a new target for generating API types from Swagger. - Updated "new agent" API to respond an encrypted cert pair
This commit is contained in:
79
internal/api/v1/docker/info.go
Normal file
79
internal/api/v1/docker/info.go
Normal file
@@ -0,0 +1,79 @@
|
||||
package dockerapi
|
||||
|
||||
import (
|
||||
"context"
|
||||
"sort"
|
||||
|
||||
dockerSystem "github.com/docker/docker/api/types/system"
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/yusing/go-proxy/internal/gperr"
|
||||
"github.com/yusing/go-proxy/internal/utils/strutils"
|
||||
)
|
||||
|
||||
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),
|
||||
}
|
||||
}
|
||||
|
||||
// @BasePath /api/v1
|
||||
// @Summary Get docker info
|
||||
// @Description Get docker info
|
||||
// @Tags docker
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Success 200 {array} 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)
|
||||
if err != nil {
|
||||
errs.Add(err)
|
||||
continue
|
||||
}
|
||||
info.Name = name
|
||||
dockerInfos[i] = toDockerInfo(info)
|
||||
i++
|
||||
}
|
||||
|
||||
sort.Slice(dockerInfos, func(i, j int) bool {
|
||||
return dockerInfos[i].Name < dockerInfos[j].Name
|
||||
})
|
||||
return dockerInfos, errs.Error()
|
||||
}
|
||||
Reference in New Issue
Block a user