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