mirror of
https://github.com/yusing/godoxy.git
synced 2026-02-19 00:47:41 +01:00
This is a large-scale refactoring across the codebase that replaces the custom `gperr.Error` type with Go's standard `error` interface. The changes include: - Replacing `gperr.Error` return types with `error` in function signatures - Using `errors.New()` and `fmt.Errorf()` instead of `gperr.New()` and `gperr.Errorf()` - Using `%w` format verb for error wrapping instead of `.With()` method - Replacing `gperr.Subject()` calls with `gperr.PrependSubject()` - Converting error logging from `gperr.Log*()` functions to zerolog's `.Err().Msg()` pattern - Update NewLogger to handle multiline error message - Updating `goutils` submodule to latest commit This refactoring aligns with Go idioms and removes the dependency on custom error handling abstractions in favor of standard library patterns.
70 lines
1.8 KiB
Go
70 lines
1.8 KiB
Go
package dockerapi
|
|
|
|
import (
|
|
"context"
|
|
"sort"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/moby/moby/api/types/container"
|
|
"github.com/moby/moby/client"
|
|
"github.com/rs/zerolog/log"
|
|
gperr "github.com/yusing/goutils/errs"
|
|
|
|
_ "github.com/yusing/goutils/apitypes"
|
|
)
|
|
|
|
type ContainerState = container.ContainerState // @name ContainerState
|
|
|
|
type Container struct {
|
|
Server string `json:"server"`
|
|
Name string `json:"name"`
|
|
ID string `json:"id"`
|
|
Image string `json:"image"`
|
|
State ContainerState `json:"state,omitempty" extensions:"x-nullable"`
|
|
} // @name ContainerResponse
|
|
|
|
// @x-id "containers"
|
|
// @BasePath /api/v1
|
|
// @Summary Get containers
|
|
// @Description Get containers
|
|
// @Tags docker
|
|
// @Produce json
|
|
// @Success 200 {array} Container
|
|
// @Failure 403 {object} apitypes.ErrorResponse
|
|
// @Failure 500 {object} apitypes.ErrorResponse
|
|
// @Router /docker/containers [get]
|
|
func Containers(c *gin.Context) {
|
|
serveHTTP[Container](c, GetContainers)
|
|
}
|
|
|
|
func GetContainers(ctx context.Context, dockerClients DockerClients) ([]Container, error) {
|
|
errs := gperr.NewBuilder("failed to get containers")
|
|
containers := make([]Container, 0)
|
|
for name, dockerClient := range dockerClients {
|
|
conts, err := dockerClient.ContainerList(ctx, client.ContainerListOptions{All: true})
|
|
if err != nil {
|
|
errs.AddSubject(err, name)
|
|
continue
|
|
}
|
|
for _, cont := range conts.Items {
|
|
containers = append(containers, Container{
|
|
Server: name,
|
|
Name: cont.Names[0],
|
|
ID: cont.ID,
|
|
Image: cont.Image,
|
|
State: cont.State,
|
|
})
|
|
}
|
|
}
|
|
sort.Slice(containers, func(i, j int) bool {
|
|
return containers[i].Name < containers[j].Name
|
|
})
|
|
if err := errs.Error(); err != nil {
|
|
if len(containers) > 0 {
|
|
log.Err(err).Msg("failed to get containers from some servers")
|
|
return containers, nil
|
|
}
|
|
}
|
|
return containers, errs.Error()
|
|
}
|