mirror of
https://github.com/cuigh/swirl
synced 2024-12-31 16:23:13 +00:00
142 lines
3.7 KiB
Go
142 lines
3.7 KiB
Go
package docker
|
|
|
|
import (
|
|
"context"
|
|
"sort"
|
|
|
|
"github.com/cuigh/swirl/model"
|
|
"github.com/docker/docker/api/types"
|
|
"github.com/docker/docker/api/types/network"
|
|
"github.com/docker/docker/client"
|
|
)
|
|
|
|
// NetworkList return all networks.
|
|
func NetworkList() (networks []types.NetworkResource, err error) {
|
|
err = mgr.Do(func(ctx context.Context, cli *client.Client) (err error) {
|
|
networks, err = cli.NetworkList(ctx, types.NetworkListOptions{})
|
|
if err == nil {
|
|
sort.Slice(networks, func(i, j int) bool {
|
|
return networks[i].Name < networks[j].Name
|
|
})
|
|
}
|
|
return
|
|
})
|
|
return
|
|
}
|
|
|
|
// NetworkCount return number of networks.
|
|
func NetworkCount() (count int, err error) {
|
|
err = mgr.Do(func(ctx context.Context, cli *client.Client) (err error) {
|
|
var networks []types.NetworkResource
|
|
networks, err = cli.NetworkList(ctx, types.NetworkListOptions{})
|
|
if err == nil {
|
|
count = len(networks)
|
|
}
|
|
return
|
|
})
|
|
return
|
|
}
|
|
|
|
// NetworkCreate create a network.
|
|
func NetworkCreate(info *model.NetworkCreateInfo) error {
|
|
return mgr.Do(func(ctx context.Context, cli *client.Client) (err error) {
|
|
var (
|
|
resp types.NetworkCreateResponse
|
|
options = types.NetworkCreate{
|
|
Internal: info.Internal,
|
|
Attachable: info.Attachable,
|
|
IPAM: &network.IPAM{},
|
|
EnableIPv6: info.IPV6.Enabled,
|
|
Options: info.Options.ToMap(),
|
|
Labels: info.Labels.ToMap(),
|
|
}
|
|
)
|
|
|
|
if info.Driver == "other" {
|
|
options.Driver = info.CustomDriver
|
|
} else {
|
|
options.Driver = info.Driver
|
|
}
|
|
|
|
if info.IPV4.Subnet != "" || info.IPV4.Gateway != "" || info.IPV4.IPRange != "" {
|
|
cfg := network.IPAMConfig{
|
|
Subnet: info.IPV4.Subnet,
|
|
Gateway: info.IPV4.Gateway,
|
|
IPRange: info.IPV4.IPRange,
|
|
}
|
|
options.IPAM.Config = append(options.IPAM.Config, cfg)
|
|
}
|
|
|
|
if info.IPV6.Enabled && (info.IPV6.Subnet != "" || info.IPV6.Gateway != "") {
|
|
cfg := network.IPAMConfig{
|
|
Subnet: info.IPV6.Subnet,
|
|
Gateway: info.IPV6.Gateway,
|
|
}
|
|
options.IPAM.Config = append(options.IPAM.Config, cfg)
|
|
}
|
|
|
|
resp, err = cli.NetworkCreate(ctx, info.Name, options)
|
|
if err == nil && resp.Warning != "" {
|
|
mgr.Logger().Warnf("network %s was created but got warning: %s", info.Name, resp.Warning)
|
|
}
|
|
return
|
|
})
|
|
}
|
|
|
|
// NetworkRemove remove a network.
|
|
func NetworkRemove(name string) error {
|
|
return mgr.Do(func(ctx context.Context, cli *client.Client) (err error) {
|
|
return cli.NetworkRemove(ctx, name)
|
|
})
|
|
}
|
|
|
|
// NetworkDisconnect Disconnect a container from a network.
|
|
func NetworkDisconnect(name, container string) error {
|
|
return mgr.Do(func(ctx context.Context, cli *client.Client) (err error) {
|
|
return cli.NetworkDisconnect(ctx, name, container, false)
|
|
})
|
|
}
|
|
|
|
// NetworkInspect return network information.
|
|
func NetworkInspect(name string) (network types.NetworkResource, err error) {
|
|
var (
|
|
ctx context.Context
|
|
cli *client.Client
|
|
)
|
|
if ctx, cli, err = mgr.Client(); err == nil {
|
|
network, err = cli.NetworkInspect(ctx, name, types.NetworkInspectOptions{})
|
|
}
|
|
return
|
|
}
|
|
|
|
// NetworkInspectRaw return network raw information.
|
|
func NetworkInspectRaw(name string) (raw []byte, err error) {
|
|
var (
|
|
ctx context.Context
|
|
cli *client.Client
|
|
)
|
|
if ctx, cli, err = mgr.Client(); err == nil {
|
|
_, raw, err = cli.NetworkInspectWithRaw(ctx, name, types.NetworkInspectOptions{})
|
|
}
|
|
return
|
|
}
|
|
|
|
// NetworkNames return network names by id list.
|
|
func NetworkNames(ids ...string) (names []string, err error) {
|
|
var (
|
|
ctx context.Context
|
|
cli *client.Client
|
|
)
|
|
if ctx, cli, err = mgr.Client(); err == nil {
|
|
for _, id := range ids {
|
|
var n types.NetworkResource
|
|
n, err = cli.NetworkInspect(ctx, id, types.NetworkInspectOptions{})
|
|
if err != nil {
|
|
break
|
|
}
|
|
names = append(names, n.Name)
|
|
}
|
|
}
|
|
return
|
|
}
|