mirror of
https://github.com/cuigh/swirl
synced 2024-12-31 16:23:13 +00:00
99 lines
2.5 KiB
Go
99 lines
2.5 KiB
Go
package docker
|
|
|
|
import (
|
|
"context"
|
|
"encoding/base64"
|
|
"sort"
|
|
|
|
"github.com/cuigh/swirl/misc"
|
|
"github.com/cuigh/swirl/model"
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/docker/docker/api/types/filters"
|
|
"github.com/docker/docker/api/types/swarm"
|
|
"github.com/docker/docker/client"
|
|
)
|
|
|
|
// SecretList return all secrets.
|
|
func SecretList(name string, pageIndex, pageSize int) (secrets []swarm.Secret, totalCount int, err error) {
|
|
err = mgr.Do(func(ctx context.Context, cli *client.Client) (err error) {
|
|
opts := types.SecretListOptions{}
|
|
if name != "" {
|
|
opts.Filters = filters.NewArgs()
|
|
opts.Filters.Add("name", name)
|
|
}
|
|
secrets, err = cli.SecretList(ctx, opts)
|
|
if err == nil {
|
|
sort.Slice(secrets, func(i, j int) bool {
|
|
return secrets[i].Spec.Name < secrets[j].Spec.Name
|
|
})
|
|
totalCount = len(secrets)
|
|
start, end := misc.Page(totalCount, pageIndex, pageSize)
|
|
secrets = secrets[start:end]
|
|
}
|
|
return
|
|
})
|
|
return
|
|
}
|
|
|
|
// SecretCreate create a secret.
|
|
func SecretCreate(info *model.ConfigCreateInfo) error {
|
|
return mgr.Do(func(ctx context.Context, cli *client.Client) (err error) {
|
|
spec := swarm.SecretSpec{}
|
|
spec.Name = info.Name
|
|
if info.Base64 {
|
|
spec.Data, err = base64.StdEncoding.DecodeString(info.Data)
|
|
if err != nil {
|
|
return
|
|
}
|
|
} else {
|
|
spec.Data = []byte(info.Data)
|
|
}
|
|
spec.Labels = info.Labels.ToMap()
|
|
if info.Template.Name != "" {
|
|
spec.Templating = &swarm.Driver{
|
|
Name: info.Template.Name,
|
|
Options: info.Template.Options,
|
|
}
|
|
}
|
|
_, err = cli.SecretCreate(ctx, spec)
|
|
return
|
|
})
|
|
}
|
|
|
|
// SecretUpdate update a config.
|
|
func SecretUpdate(info *model.ConfigUpdateInfo) error {
|
|
return mgr.Do(func(ctx context.Context, cli *client.Client) (err error) {
|
|
var secret swarm.Secret
|
|
secret, _, err = cli.SecretInspectWithRaw(ctx, info.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
spec := secret.Spec
|
|
// only the Labels field can be updated on API 1.30
|
|
//spec.Name = info.Name
|
|
//spec.Data = []byte(info.Data)
|
|
spec.Labels = info.Labels.ToMap()
|
|
return cli.SecretUpdate(ctx, info.ID, version(info.Version), spec)
|
|
})
|
|
}
|
|
|
|
// SecretInspect returns secret information with raw data.
|
|
func SecretInspect(id string) (secret swarm.Secret, raw []byte, err error) {
|
|
var (
|
|
ctx context.Context
|
|
cli *client.Client
|
|
)
|
|
if ctx, cli, err = mgr.Client(); err == nil {
|
|
secret, raw, err = cli.SecretInspectWithRaw(ctx, id)
|
|
}
|
|
return
|
|
}
|
|
|
|
// SecretRemove remove a secret.
|
|
func SecretRemove(id string) error {
|
|
return mgr.Do(func(ctx context.Context, cli *client.Client) (err error) {
|
|
return cli.SecretRemove(ctx, id)
|
|
})
|
|
}
|