Skip to content

Instantly share code, notes, and snippets.

@nextrevision
Created May 30, 2017 18:35
Show Gist options
  • Save nextrevision/d8cd8c6ff90a41328a7b221181bbdab6 to your computer and use it in GitHub Desktop.
Save nextrevision/d8cd8c6ff90a41328a7b221181bbdab6 to your computer and use it in GitHub Desktop.
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
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment