mirror of
https://github.com/acepanel/panel.git
synced 2026-02-04 03:07:20 +08:00
107 lines
2.8 KiB
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
|
|
}
|