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