diff --git a/agent/app/api/v2/container.go b/agent/app/api/v2/container.go index ed7f9d3b3b82..02d8de4fc9c1 100644 --- a/agent/app/api/v2/container.go +++ b/agent/app/api/v2/container.go @@ -54,6 +54,24 @@ func (b *BaseApi) ListContainer(c *gin.Context) { helper.SuccessWithData(c, list) } + +// @Tags Container +// @Summary Load containers status +// @Description 获取容器状态 +// @Accept json +// @Produce json +// @Success 200 +// @Security ApiKeyAuth +// @Router /containers/status [get] +func (b *BaseApi) LoadContainerStatus(c *gin.Context) { + data, err := containerService.LoadStatus() + if err != nil { + helper.ErrorWithDetail(c, constant.CodeErrInternalServer, constant.ErrTypeInternalServer, err) + return + } + helper.SuccessWithData(c, data) +} + // @Tags Container Compose // @Summary Page composes // @Description 获取编排列表分页 diff --git a/agent/app/dto/container.go b/agent/app/dto/container.go index 90a35176853e..e5c06c764f26 100644 --- a/agent/app/dto/container.go +++ b/agent/app/dto/container.go @@ -8,7 +8,7 @@ type PageContainer struct { PageInfo Name string `json:"name"` State string `json:"state" validate:"required,oneof=all created running paused restarting removing exited dead"` - OrderBy string `json:"orderBy" validate:"required,oneof=name state created_at"` + OrderBy string `json:"orderBy" validate:"required,oneof=name created_at"` Order string `json:"order" validate:"required,oneof=null ascending descending"` Filters string `json:"filters"` ExcludeAppStore bool `json:"excludeAppStore"` @@ -39,6 +39,16 @@ type ContainerInfo struct { Websites []string `json:"websites"` } +type ContainerStatus struct { + All uint `json:"all"` + Created uint `json:"created"` + Running uint `json:"running"` + Paused uint `json:"paused"` + Restarting uint `json:"restarting"` + Removing uint `json:"removing"` + Exited uint `json:"exited"` + Dead uint `json:"dead"` +} type ResourceLimit struct { CPU int `json:"cpu"` Memory uint64 `json:"memory"` diff --git a/agent/app/service/container.go b/agent/app/service/container.go index aac779099080..0c8f241ee355 100644 --- a/agent/app/service/container.go +++ b/agent/app/service/container.go @@ -51,6 +51,7 @@ type ContainerService struct{} type IContainerService interface { Page(req dto.PageContainer) (int64, interface{}, error) List() ([]string, error) + LoadStatus() (dto.ContainerStatus, error) PageNetwork(req dto.SearchWithPage) (int64, interface{}, error) ListNetwork() ([]dto.Options, error) PageVolume(req dto.SearchWithPage) (int64, interface{}, error) @@ -149,13 +150,6 @@ func (u *ContainerService) Page(req dto.PageContainer) (int64, interface{}, erro } return list[i].Names[0][1:] > list[j].Names[0][1:] }) - case "state": - sort.Slice(list, func(i, j int) bool { - if req.Order == constant.OrderAsc { - return list[i].State < list[j].State - } - return list[i].State > list[j].State - }) default: sort.Slice(list, func(i, j int) bool { if req.Order == constant.OrderAsc { @@ -245,6 +239,38 @@ func (u *ContainerService) List() ([]string, error) { return datas, nil } +func (u *ContainerService) LoadStatus() (dto.ContainerStatus, error) { + var data dto.ContainerStatus + client, err := docker.NewDockerClient() + if err != nil { + return data, err + } + defer client.Close() + containers, err := client.ContainerList(context.Background(), container.ListOptions{All: true}) + if err != nil { + return data, err + } + data.All = uint(len(containers)) + for _, item := range containers { + switch item.State { + case "created": + data.Created++ + case "running": + data.Running++ + case "paused": + data.Paused++ + case "restarting": + data.Restarting++ + case "dead": + data.Dead++ + case "exited": + data.Exited++ + case "removing": + data.Removing++ + } + } + return data, nil +} func (u *ContainerService) ContainerListStats() ([]dto.ContainerListStats, error) { client, err := docker.NewDockerClient() if err != nil { diff --git a/agent/router/ro_container.go b/agent/router/ro_container.go index eaabbbfec6a5..5085504654bf 100644 --- a/agent/router/ro_container.go +++ b/agent/router/ro_container.go @@ -20,6 +20,7 @@ func (s *ContainerRouter) InitRouter(Router *gin.RouterGroup) { baRouter.POST("/info", baseApi.ContainerInfo) baRouter.POST("/search", baseApi.SearchContainer) baRouter.POST("/list", baseApi.ListContainer) + baRouter.GET("/status", baseApi.LoadContainerStatus) baRouter.GET("/list/stats", baseApi.ContainerListStats) baRouter.GET("/search/log", baseApi.ContainerLogs) baRouter.POST("/download/log", baseApi.DownloadContainerLogs)