func doNetworkGet(d *Daemon, name string) (network, error) { iface, err := net.InterfaceByName(name) if err != nil { return network{}, err } n := network{} n.Name = iface.Name n.Members = make([]string, 0) if shared.IsLoopback(iface) { n.Type = "loopback" } else if isBridge(iface) { n.Type = "bridge" for _, ct := range lxc.ActiveContainerNames(d.lxcpath) { c, err := containerLoadByName(d, ct) if err != nil { return network{}, err } if isOnBridge(c.LXContainerGet(), n.Name) { n.Members = append(n.Members, ct) } } } else { n.Type = "unknown" } return n, nil }
func doNetworkGet(d *Daemon, name string) (shared.NetworkConfig, error) { // Get some information osInfo, _ := net.InterfaceByName(name) _, dbInfo, _ := dbNetworkGet(d.db, name) // Sanity check if osInfo == nil && dbInfo == nil { return shared.NetworkConfig{}, os.ErrNotExist } // Prepare the response n := shared.NetworkConfig{} n.Name = name n.UsedBy = []string{} n.Config = map[string]string{} // Look for containers using the interface cts, err := dbContainersList(d.db, cTypeRegular) if err != nil { return shared.NetworkConfig{}, err } for _, ct := range cts { c, err := containerLoadByName(d, ct) if err != nil { return shared.NetworkConfig{}, err } if networkIsInUse(c, n.Name) { n.UsedBy = append(n.UsedBy, fmt.Sprintf("/%s/containers/%s", shared.APIVersion, ct)) } } // Set the device type as needed if osInfo != nil && shared.IsLoopback(osInfo) { n.Type = "loopback" } else if dbInfo != nil || shared.PathExists(fmt.Sprintf("/sys/class/net/%s/bridge", n.Name)) { if dbInfo != nil { n.Managed = true n.Config = dbInfo.Config } n.Type = "bridge" } else if shared.PathExists(fmt.Sprintf("/sys/class/net/%s/device", n.Name)) { n.Type = "physical" } else if shared.PathExists(fmt.Sprintf("/sys/class/net/%s/bonding", n.Name)) { n.Type = "bond" } else { _, err := exec.Command("ovs-vsctl", "br-exists", n.Name).CombinedOutput() if err == nil { n.Type = "bridge" } else { n.Type = "unknown" } } return n, nil }
func doNetworkGet(d *Daemon, name string) (network, error) { iface, err := net.InterfaceByName(name) if err != nil { return network{}, err } // Prepare the response n := network{} n.Name = iface.Name n.UsedBy = []string{} // Look for containers using the interface cts, err := dbContainersList(d.db, cTypeRegular) if err != nil { return network{}, err } for _, ct := range cts { c, err := containerLoadByName(d, ct) if err != nil { return network{}, err } if isOnBridge(c, n.Name) { n.UsedBy = append(n.UsedBy, fmt.Sprintf("/%s/containers/%s", shared.APIVersion, ct)) } } // Set the device type as needed if shared.IsLoopback(iface) { n.Type = "loopback" } else if shared.PathExists(fmt.Sprintf("/sys/class/net/%s/bridge", n.Name)) { n.Type = "bridge" } else if shared.PathExists(fmt.Sprintf("/sys/class/net/%s/device", n.Name)) { n.Type = "physical" } else { n.Type = "unknown" } return n, nil }