Created
May 30, 2017 18:35
-
-
Save nextrevision/d8cd8c6ff90a41328a7b221181bbdab6 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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