swirl/biz/docker/network.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
}