9
"github.com/gorilla/mux"
11
"github.com/lxc/lxd/shared"
14
func networksGet(d *Daemon, r *http.Request) Response {
15
recursionStr := r.FormValue("recursion")
16
recursion, err := strconv.Atoi(recursionStr)
21
ifs, err := net.Interfaces()
23
return InternalError(err)
26
resultString := []string{}
27
resultMap := []network{}
28
for _, iface := range ifs {
30
resultString = append(resultString, fmt.Sprintf("/%s/networks/%s", shared.APIVersion, iface.Name))
32
net, err := doNetworkGet(d, iface.Name)
36
resultMap = append(resultMap, net)
42
return SyncResponse(true, resultString)
45
return SyncResponse(true, resultMap)
48
var networksCmd = Command{name: "networks", get: networksGet}
51
Name string `json:"name"`
52
Type string `json:"type"`
53
UsedBy []string `json:"used_by"`
56
func isOnBridge(c container, bridge string) bool {
57
for _, device := range c.ExpandedDevices() {
58
if device["type"] != "nic" {
62
if !shared.StringInSlice(device["nictype"], []string{"bridged", "macvlan"}) {
66
if device["parent"] == "" {
70
if device["parent"] == bridge {
78
func networkGet(d *Daemon, r *http.Request) Response {
79
name := mux.Vars(r)["name"]
81
n, err := doNetworkGet(d, name)
83
return InternalError(err)
86
return SyncResponse(true, &n)
89
func doNetworkGet(d *Daemon, name string) (network, error) {
90
iface, err := net.InterfaceByName(name)
95
// Prepare the response
100
// Look for containers using the interface
101
cts, err := dbContainersList(d.db, cTypeRegular)
103
return network{}, err
106
for _, ct := range cts {
107
c, err := containerLoadByName(d, ct)
109
return network{}, err
112
if isOnBridge(c, n.Name) {
113
n.UsedBy = append(n.UsedBy, fmt.Sprintf("/%s/containers/%s", shared.APIVersion, ct))
117
// Set the device type as needed
118
if shared.IsLoopback(iface) {
120
} else if shared.PathExists(fmt.Sprintf("/sys/class/net/%s/bridge", n.Name)) {
122
} else if shared.PathExists(fmt.Sprintf("/sys/class/net/%s/device", n.Name)) {
131
var networkCmd = Command{name: "networks/{name}", get: networkGet}