github.com/kobeld/docker@v1.12.0-rc1/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/engine-api/types" 11 "github.com/docker/engine-api/types/filters" 12 "github.com/docker/engine-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 nw, err := n.backend.CreateNetwork(create) 85 if err != nil { 86 if _, ok := err.(libnetwork.ManagerRedirectError); !ok { 87 return err 88 } 89 id, err := n.clusterProvider.CreateNetwork(create) 90 if err != nil { 91 return err 92 } 93 nw = &types.NetworkCreateResponse{ID: id} 94 } 95 96 return httputils.WriteJSON(w, http.StatusCreated, nw) 97 } 98 99 func (n *networkRouter) postNetworkConnect(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 100 var connect types.NetworkConnect 101 if err := httputils.ParseForm(r); err != nil { 102 return err 103 } 104 105 if err := httputils.CheckForJSON(r); err != nil { 106 return err 107 } 108 109 if err := json.NewDecoder(r.Body).Decode(&connect); err != nil { 110 return err 111 } 112 113 nw, err := n.backend.FindNetwork(vars["id"]) 114 if err != nil { 115 return err 116 } 117 118 return n.backend.ConnectContainerToNetwork(connect.Container, nw.Name(), connect.EndpointConfig) 119 } 120 121 func (n *networkRouter) postNetworkDisconnect(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 122 var disconnect types.NetworkDisconnect 123 if err := httputils.ParseForm(r); err != nil { 124 return err 125 } 126 127 if err := httputils.CheckForJSON(r); err != nil { 128 return err 129 } 130 131 if err := json.NewDecoder(r.Body).Decode(&disconnect); err != nil { 132 return err 133 } 134 135 nw, err := n.backend.FindNetwork(vars["id"]) 136 if err != nil { 137 return err 138 } 139 140 return n.backend.DisconnectContainerFromNetwork(disconnect.Container, nw, disconnect.Force) 141 } 142 143 func (n *networkRouter) deleteNetwork(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error { 144 if err := httputils.ParseForm(r); err != nil { 145 return err 146 } 147 if _, err := n.clusterProvider.GetNetwork(vars["id"]); err == nil { 148 return n.clusterProvider.RemoveNetwork(vars["id"]) 149 } 150 if err := n.backend.DeleteNetwork(vars["id"]); err != nil { 151 return err 152 } 153 w.WriteHeader(http.StatusNoContent) 154 return nil 155 } 156 157 func (n *networkRouter) buildNetworkResource(nw libnetwork.Network) *types.NetworkResource { 158 r := &types.NetworkResource{} 159 if nw == nil { 160 return r 161 } 162 163 info := nw.Info() 164 r.Name = nw.Name() 165 r.ID = nw.ID() 166 r.Scope = info.Scope() 167 if n.clusterProvider.IsManager() { 168 if _, err := n.clusterProvider.GetNetwork(nw.Name()); err == nil { 169 r.Scope = "swarm" 170 } 171 } else if info.Dynamic() { 172 r.Scope = "swarm" 173 } 174 r.Driver = nw.Type() 175 r.EnableIPv6 = info.IPv6Enabled() 176 r.Internal = info.Internal() 177 r.Options = info.DriverOptions() 178 r.Containers = make(map[string]types.EndpointResource) 179 buildIpamResources(r, info) 180 r.Internal = info.Internal() 181 r.Labels = info.Labels() 182 183 epl := nw.Endpoints() 184 for _, e := range epl { 185 ei := e.Info() 186 if ei == nil { 187 continue 188 } 189 sb := ei.Sandbox() 190 key := "ep-" + e.ID() 191 if sb != nil { 192 key = sb.ContainerID() 193 } 194 195 r.Containers[key] = buildEndpointResource(e) 196 } 197 return r 198 } 199 200 func buildIpamResources(r *types.NetworkResource, nwInfo libnetwork.NetworkInfo) { 201 id, opts, ipv4conf, ipv6conf := nwInfo.IpamConfig() 202 203 ipv4Info, ipv6Info := nwInfo.IpamInfo() 204 205 r.IPAM.Driver = id 206 207 r.IPAM.Options = opts 208 209 r.IPAM.Config = []network.IPAMConfig{} 210 for _, ip4 := range ipv4conf { 211 if ip4.PreferredPool == "" { 212 continue 213 } 214 iData := network.IPAMConfig{} 215 iData.Subnet = ip4.PreferredPool 216 iData.IPRange = ip4.SubPool 217 iData.Gateway = ip4.Gateway 218 iData.AuxAddress = ip4.AuxAddresses 219 r.IPAM.Config = append(r.IPAM.Config, iData) 220 } 221 222 if len(r.IPAM.Config) == 0 { 223 for _, ip4Info := range ipv4Info { 224 iData := network.IPAMConfig{} 225 iData.Subnet = ip4Info.IPAMData.Pool.String() 226 iData.Gateway = ip4Info.IPAMData.Gateway.String() 227 r.IPAM.Config = append(r.IPAM.Config, iData) 228 } 229 } 230 231 hasIpv6Conf := false 232 for _, ip6 := range ipv6conf { 233 if ip6.PreferredPool == "" { 234 continue 235 } 236 hasIpv6Conf = true 237 iData := network.IPAMConfig{} 238 iData.Subnet = ip6.PreferredPool 239 iData.IPRange = ip6.SubPool 240 iData.Gateway = ip6.Gateway 241 iData.AuxAddress = ip6.AuxAddresses 242 r.IPAM.Config = append(r.IPAM.Config, iData) 243 } 244 245 if !hasIpv6Conf { 246 for _, ip6Info := range ipv6Info { 247 iData := network.IPAMConfig{} 248 iData.Subnet = ip6Info.IPAMData.Pool.String() 249 iData.Gateway = ip6Info.IPAMData.Gateway.String() 250 r.IPAM.Config = append(r.IPAM.Config, iData) 251 } 252 } 253 } 254 255 func buildEndpointResource(e libnetwork.Endpoint) types.EndpointResource { 256 er := types.EndpointResource{} 257 if e == nil { 258 return er 259 } 260 261 er.EndpointID = e.ID() 262 er.Name = e.Name() 263 ei := e.Info() 264 if ei == nil { 265 return er 266 } 267 268 if iface := ei.Iface(); iface != nil { 269 if mac := iface.MacAddress(); mac != nil { 270 er.MacAddress = mac.String() 271 } 272 if ip := iface.Address(); ip != nil && len(ip.IP) > 0 { 273 er.IPv4Address = ip.String() 274 } 275 276 if ipv6 := iface.AddressIPv6(); ipv6 != nil && len(ipv6.IP) > 0 { 277 er.IPv6Address = ipv6.String() 278 } 279 } 280 return er 281 }