package main import ( "fmt" "github.com/pkg/errors" "github.com/rancher/go-rancher-metadata/metadata" ) func main() { mc := metadata.NewClient("http://rancher-metadata/latest") networks, _, err := localNetworks(mc) if err != nil { fmt.Printf("error fetching local networks %s\n", err.Error()) panic("oh no") } for _, n := range networks { host, err := mc.GetSelfHost() if err != nil { fmt.Printf("error fetching self host from metadata %s\n", err.Error()) panic("oh no") } containers, err := mc.GetContainers() if err != nil { fmt.Printf("error fetching containers from metadata: %s\n", err.Error()) panic("oh no") } for _, aContainer := range containers { if !(aContainer.HostUUID == host.UUID && aContainer.State == "running" && aContainer.ExternalId != "" && aContainer.PrimaryIp != "" && aContainer.PrimaryMacAddress != "" && aContainer.NetworkUUID == n.UUID) { continue } fmt.Printf("[!] Will modify %s\n", aContainer.Name) } } } func localNetworks(mc metadata.Client) ([]metadata.Network, map[string]metadata.Container, error) { networks, err := mc.GetNetworks() if err != nil { return nil, nil, errors.Wrap(err, "error fetching networks from metadata") } host, err := mc.GetSelfHost() if err != nil { return nil, nil, errors.Wrap(err, "error fetching self host from metadata") } services, err := mc.GetServices() if err != nil { return nil, nil, errors.Wrap(err, "error fetching services from metadata") } localNetworks := map[string]bool{} routers := map[string]metadata.Container{} for _, service := range services { // Trick to select the primary service of the network plugin // stack // TODO: Need to check if it's needed for Calico? if !(service.Kind == "networkDriverService" && service.Name == service.PrimaryServiceName) { continue } for _, aContainer := range service.Containers { if aContainer.HostUUID == host.UUID { routers[aContainer.NetworkUUID] = aContainer localNetworks[aContainer.NetworkUUID] = true } } } if len(localNetworks) == 0 { return nil, nil, nil } ret := []metadata.Network{} for _, aNetwork := range networks { if _, ok := localNetworks[aNetwork.UUID]; ok { ret = append(ret, aNetwork) } } return ret, routers, nil }