github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/api/server/router/network/network_routes.go (about) 1 package network 2 3 import ( 4 "encoding/json" 5 "net/http" 6 7 "golang.org/x/net/context" 8 9 "github.com/docker/docker/api/server/httputils" 10 "github.com/docker/docker/api/types" 11 "github.com/docker/docker/api/types/filters" 12 "github.com/docker/docker/api/types/network" 13 "github.com/docker/libnetwork" 14 ) 15 16 func (n *networkRouter) getNetworksList(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 17 if err := httputils.ParseForm(r); err != nil { 18 return err 19 } 20 21 filter := r.Form.Get("filters") 22 netFilters, err := filters.FromParam(filter) 23 if err != nil { 24 return err 25 } 26 27 list := []types.NetworkResource{} 28 29 if nr, err := n.clusterProvider.GetNetworks(); err == nil { 30 for _, nw := range nr { 31 list = append(list, nw) 32 } 33 } 34 35 // Combine the network list returned by Docker daemon if it is not already 36 // returned by the cluster manager 37 SKIP: 38 for _, nw := range n.backend.GetNetworks() { 39 for _, nl := range list { 40 if nl.ID == nw.ID() { 41 continue SKIP 42 } 43 } 44 list = append(list, *n.buildNetworkResource(nw)) 45 } 46 47 list, err = filterNetworks(list, netFilters) 48 if err != nil { 49 return err 50 } 51 return httputils.WriteJSON(w, http.StatusOK, list) 52 } 53 54 func (n *networkRouter) getNetwork(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 55 if err := httputils.ParseForm(r); err != nil { 56 return err 57 } 58 59 nw, err := n.backend.FindNetwork(vars["id"]) 60 if err != nil { 61 if nr, err := n.clusterProvider.GetNetwork(vars["id"]); err == nil { 62 return httputils.WriteJSON(w, http.StatusOK, nr) 63 } 64 return err 65 } 66 return httputils.WriteJSON(w, http.StatusOK, n.buildNetworkResource(nw)) 67 } 68 69 func (n *networkRouter) postNetworkCreate(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 70 var create types.NetworkCreateRequest 71 72 if err := httputils.ParseForm(r); err != nil { 73 return err 74 } 75 76 if err := httputils.CheckForJSON(r); err != nil { 77 return err 78 } 79 80 if err := json.NewDecoder(r.Body).Decode(&create); err != nil { 81 return err 82 } 83 84 if _, err := n.clusterProvider.GetNetwork(create.Name); err == nil { 85 return libnetwork.NetworkNameError(create.Name) 86 } 87 88 nw, err := n.backend.CreateNetwork(create) 89 if err != nil { 90 if _, ok := err.(libnetwork.ManagerRedirectError); !ok { 91 return err 92 } 93 id, err := n.clusterProvider.CreateNetwork(create) 94 if err != nil { 95 return err 96 } 97 nw = &types.NetworkCreateResponse{ID: id} 98 } 99 100 return httputils.WriteJSON(w, http.StatusCreated, nw) 101 } 102 103 func (n *networkRouter) postNetworkConnect(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 104 var connect types.NetworkConnect 105 if err := httputils.ParseForm(r); err != nil { 106 return err 107 } 108 109 if err := httputils.CheckForJSON(r); err != nil { 110 return err 111 } 112 113 if err := json.NewDecoder(r.Body).Decode(&connect); err != nil { 114 return err 115 } 116 117 return n.backend.ConnectContainerToNetwork(connect.Container, vars["id"], connect.EndpointConfig) 118 } 119 120 func (n *networkRouter) postNetworkDisconnect(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 121 var disconnect types.NetworkDisconnect 122 if err := httputils.ParseForm(r); err != nil { 123 return err 124 } 125 126 if err := httputils.CheckForJSON(r); err != nil { 127 return err 128 } 129 130 if err := json.NewDecoder(r.Body).Decode(&disconnect); err != nil { 131 return err 132 } 133 134 return n.backend.DisconnectContainerFromNetwork(disconnect.Container, vars["id"], disconnect.Force) 135 } 136 137 func (n *networkRouter) deleteNetwork(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 138 if err := httputils.ParseForm(r); err != nil { 139 return err 140 } 141 if _, err := n.clusterProvider.GetNetwork(vars["id"]); err == nil { 142 if err = n.clusterProvider.RemoveNetwork(vars["id"]); err != nil { 143 return err 144 } 145 w.WriteHeader(http.StatusNoContent) 146 return nil 147 } 148 if err := n.backend.DeleteNetwork(vars["id"]); err != nil { 149 return err 150 } 151 w.WriteHeader(http.StatusNoContent) 152 return nil 153 } 154 155 func (n *networkRouter) buildNetworkResource(nw libnetwork.Network) *types.NetworkResource { 156 r := &types.NetworkResource{} 157 if nw == nil { 158 return r 159 } 160 161 info := nw.Info() 162 r.Name = nw.Name() 163 r.ID = nw.ID() 164 r.Scope = info.Scope() 165 if n.clusterProvider.IsManager() { 166 if _, err := n.clusterProvider.GetNetwork(nw.Name()); err == nil { 167 r.Scope = "swarm" 168 } 169 } else if info.Dynamic() { 170 r.Scope = "swarm" 171 } 172 r.Driver = nw.Type() 173 r.EnableIPv6 = info.IPv6Enabled() 174 r.Internal = info.Internal() 175 r.Options = info.DriverOptions() 176 r.Containers = make(map[string]types.EndpointResource) 177 buildIpamResources(r, info) 178 r.Internal = info.Internal() 179 r.Labels = info.Labels() 180 181 epl := nw.Endpoints() 182 for _, e := range epl { 183 ei := e.Info() 184 if ei == nil { 185 continue 186 } 187 sb := ei.Sandbox() 188 tmpID := e.ID() 189 key := "ep-" + tmpID 190 if sb != nil { 191 key = sb.ContainerID() 192 } 193 194 r.Containers[key] = buildEndpointResource(tmpID, e.Name(), ei) 195 } 196 return r 197 } 198 199 func buildIpamResources(r *types.NetworkResource, nwInfo libnetwork.NetworkInfo) { 200 id, opts, ipv4conf, ipv6conf := nwInfo.IpamConfig() 201 202 ipv4Info, ipv6Info := nwInfo.IpamInfo() 203 204 r.IPAM.Driver = id 205 206 r.IPAM.Options = opts 207 208 r.IPAM.Config = []network.IPAMConfig{} 209 for _, ip4 := range ipv4conf { 210 if ip4.PreferredPool == "" { 211 continue 212 } 213 iData := network.IPAMConfig{} 214 iData.Subnet = ip4.PreferredPool 215 iData.IPRange = ip4.SubPool 216 iData.Gateway = ip4.Gateway 217 iData.AuxAddress = ip4.AuxAddresses 218 r.IPAM.Config = append(r.IPAM.Config, iData) 219 } 220 221 if len(r.IPAM.Config) == 0 { 222 for _, ip4Info := range ipv4Info { 223 iData := network.IPAMConfig{} 224 iData.Subnet = ip4Info.IPAMData.Pool.String() 225 iData.Gateway = ip4Info.IPAMData.Gateway.IP.String() 226 r.IPAM.Config = append(r.IPAM.Config, iData) 227 } 228 } 229 230 hasIpv6Conf := false 231 for _, ip6 := range ipv6conf { 232 if ip6.PreferredPool == "" { 233 continue 234 } 235 hasIpv6Conf = true 236 iData := network.IPAMConfig{} 237 iData.Subnet = ip6.PreferredPool 238 iData.IPRange = ip6.SubPool 239 iData.Gateway = ip6.Gateway 240 iData.AuxAddress = ip6.AuxAddresses 241 r.IPAM.Config = append(r.IPAM.Config, iData) 242 } 243 244 if !hasIpv6Conf { 245 for _, ip6Info := range ipv6Info { 246 iData := network.IPAMConfig{} 247 iData.Subnet = ip6Info.IPAMData.Pool.String() 248 iData.Gateway = ip6Info.IPAMData.Gateway.String() 249 r.IPAM.Config = append(r.IPAM.Config, iData) 250 } 251 } 252 } 253 254 func buildEndpointResource(id string, name string, info libnetwork.EndpointInfo) types.EndpointResource { 255 er := types.EndpointResource{} 256 257 er.EndpointID = id 258 er.Name = name 259 ei := info 260 if ei == nil { 261 return er 262 } 263 264 if iface := ei.Iface(); iface != nil { 265 if mac := iface.MacAddress(); mac != nil { 266 er.MacAddress = mac.String() 267 } 268 if ip := iface.Address(); ip != nil && len(ip.IP) > 0 { 269 er.IPv4Address = ip.String() 270 } 271 272 if ipv6 := iface.AddressIPv6(); ipv6 != nil && len(ipv6.IP) > 0 { 273 er.IPv6Address = ipv6.String() 274 } 275 } 276 return er 277 }