2
0
mirror of https://github.com/acepanel/panel.git synced 2026-02-04 06:47:20 +08:00
Files
panel/internal/data/container_volume.go

107 lines
2.8 KiB
Go

package data
import (
"context"
"slices"
"strings"
"time"
"github.com/moby/moby/client"
"github.com/acepanel/panel/internal/biz"
"github.com/acepanel/panel/internal/http/request"
"github.com/acepanel/panel/pkg/tools"
"github.com/acepanel/panel/pkg/types"
)
type containerVolumeRepo struct{}
func NewContainerVolumeRepo() biz.ContainerVolumeRepo {
return &containerVolumeRepo{}
}
// List 列出存储卷
func (r *containerVolumeRepo) List() ([]types.ContainerVolume, error) {
apiClient, err := getDockerClient("/var/run/docker.sock")
if err != nil {
return nil, err
}
defer func(apiClient *client.Client) { _ = apiClient.Close() }(apiClient)
resp, err := apiClient.VolumeList(context.Background(), client.VolumeListOptions{})
if err != nil {
return nil, err
}
var volumes []types.ContainerVolume
for _, item := range resp.Items {
createdAt, _ := time.Parse(time.RFC3339Nano, item.CreatedAt)
volumes = append(volumes, types.ContainerVolume{
Name: item.Name,
Driver: item.Driver,
Scope: item.Scope,
MountPoint: item.Mountpoint,
CreatedAt: createdAt,
Labels: types.MapToKV(item.Labels),
Options: types.MapToKV(item.Options),
RefCount: item.UsageData.RefCount,
Size: tools.FormatBytes(float64(item.UsageData.Size)),
})
}
slices.SortFunc(volumes, func(a types.ContainerVolume, b types.ContainerVolume) int {
return strings.Compare(a.Name, b.Name)
})
return volumes, nil
}
// Create 创建存储卷
func (r *containerVolumeRepo) Create(req *request.ContainerVolumeCreate) (string, error) {
apiClient, err := getDockerClient("/var/run/docker.sock")
if err != nil {
return "", err
}
defer func(apiClient *client.Client) { _ = apiClient.Close() }(apiClient)
resp, err := apiClient.VolumeCreate(context.Background(), client.VolumeCreateOptions{
Name: req.Name,
Driver: req.Driver,
DriverOpts: types.KVToMap(req.Options),
Labels: types.KVToMap(req.Labels),
})
if err != nil {
return "", err
}
return resp.Volume.Name, nil
}
// Remove 删除存储卷
func (r *containerVolumeRepo) Remove(id string) error {
apiClient, err := getDockerClient("/var/run/docker.sock")
if err != nil {
return err
}
defer func(apiClient *client.Client) { _ = apiClient.Close() }(apiClient)
_, err = apiClient.VolumeRemove(context.Background(), id, client.VolumeRemoveOptions{
Force: true,
})
return err
}
// Prune 清理未使用的存储卷
func (r *containerVolumeRepo) Prune() error {
apiClient, err := getDockerClient("/var/run/docker.sock")
if err != nil {
return err
}
defer func(apiClient *client.Client) { _ = apiClient.Close() }(apiClient)
_, err = apiClient.VolumePrune(context.Background(), client.VolumePruneOptions{
Filters: make(client.Filters).Add("label", "created_by!=acepanel"),
})
return err
}