plugin-v2 is not going to be used with Docker IPAM in most cases, so there is no need to complicate the code with ipam mode selection.
56 lines
1.0 KiB
Go
56 lines
1.0 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"strings"
|
|
|
|
"github.com/fsouza/go-dockerclient"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
const DOCKER_API_VERSION = "1.26"
|
|
|
|
func swarmManagerPeers(args []string) error {
|
|
info, err := dockerInfo()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
ips := make([]string, 0)
|
|
|
|
for _, managerNode := range info.Swarm.RemoteManagers {
|
|
ip, err := ipFromAddr(managerNode.Addr)
|
|
if err != nil {
|
|
return errors.Wrap(err, "ipFromAddr")
|
|
}
|
|
ips = append(ips, ip)
|
|
}
|
|
|
|
fmt.Println(strings.Join(ips, " "))
|
|
|
|
return nil
|
|
}
|
|
|
|
func dockerInfo() (*docker.DockerInfo, error) {
|
|
client, err := docker.NewVersionedClientFromEnv(DOCKER_API_VERSION)
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "docker.NewVersionedClientFromEnv")
|
|
}
|
|
|
|
info, err := client.Info()
|
|
if err != nil {
|
|
return nil, errors.Wrap(err, "docker.Info")
|
|
}
|
|
|
|
return info, nil
|
|
}
|
|
|
|
func ipFromAddr(addr string) (string, error) {
|
|
parts := strings.Split(addr, ":")
|
|
if len(parts) != 2 {
|
|
return "", fmt.Errorf("invalid address: %q", addr)
|
|
}
|
|
|
|
return parts[0], nil
|
|
}
|