github.com/hustcat/docker@v1.3.3-0.20160314103604-901c67a8eeab/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.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 r.Name = nw.Name() 167 r.ID = nw.ID() 168 r.Scope = nw.Info().Scope() 169 r.Driver = nw.Type() 170 r.EnableIPv6 = nw.Info().IPv6Enabled() 171 r.Internal = nw.Info().Internal() 172 r.Options = nw.Info().DriverOptions() 173 r.Containers = make(map[string]types.EndpointResource) 174 buildIpamResources(r, nw) 175 r.Internal = nw.Info().Internal() 176 177 epl := nw.Endpoints() 178 for _, e := range epl { 179 ei := e.Info() 180 if ei == nil { 181 continue 182 } 183 sb := ei.Sandbox() 184 key := "ep-" + e.ID() 185 if sb != nil { 186 key = sb.ContainerID() 187 } 188 189 r.Containers[key] = buildEndpointResource(e) 190 } 191 return r 192 } 193 194 func buildIpamResources(r *types.NetworkResource, nw libnetwork.Network) { 195 id, opts, ipv4conf, ipv6conf := nw.Info().IpamConfig() 196 197 ipv4Info, ipv6Info := nw.Info().IpamInfo() 198 199 r.IPAM.Driver = id 200 201 r.IPAM.Options = opts 202 203 r.IPAM.Config = []network.IPAMConfig{} 204 for _, ip4 := range ipv4conf { 205 if ip4.PreferredPool == "" { 206 continue 207 } 208 iData := network.IPAMConfig{} 209 iData.Subnet = ip4.PreferredPool 210 iData.IPRange = ip4.SubPool 211 iData.Gateway = ip4.Gateway 212 iData.AuxAddress = ip4.AuxAddresses 213 r.IPAM.Config = append(r.IPAM.Config, iData) 214 } 215 216 if len(r.IPAM.Config) == 0 { 217 for _, ip4Info := range ipv4Info { 218 iData := network.IPAMConfig{} 219 iData.Subnet = ip4Info.IPAMData.Pool.String() 220 iData.Gateway = ip4Info.IPAMData.Gateway.String() 221 r.IPAM.Config = append(r.IPAM.Config, iData) 222 } 223 } 224 225 hasIpv6Conf := false 226 for _, ip6 := range ipv6conf { 227 if ip6.PreferredPool == "" { 228 continue 229 } 230 hasIpv6Conf = true 231 iData := network.IPAMConfig{} 232 iData.Subnet = ip6.PreferredPool 233 iData.IPRange = ip6.SubPool 234 iData.Gateway = ip6.Gateway 235 iData.AuxAddress = ip6.AuxAddresses 236 r.IPAM.Config = append(r.IPAM.Config, iData) 237 } 238 239 if !hasIpv6Conf { 240 for _, ip6Info := range ipv6Info { 241 iData := network.IPAMConfig{} 242 iData.Subnet = ip6Info.IPAMData.Pool.String() 243 iData.Gateway = ip6Info.IPAMData.Gateway.String() 244 r.IPAM.Config = append(r.IPAM.Config, iData) 245 } 246 } 247 } 248 249 func buildEndpointResource(e libnetwork.Endpoint) types.EndpointResource { 250 er := types.EndpointResource{} 251 if e == nil { 252 return er 253 } 254 255 er.EndpointID = e.ID() 256 er.Name = e.Name() 257 ei := e.Info() 258 if ei == nil { 259 return er 260 } 261 262 if iface := ei.Iface(); iface != nil { 263 if mac := iface.MacAddress(); mac != nil { 264 er.MacAddress = mac.String() 265 } 266 if ip := iface.Address(); ip != nil && len(ip.IP) > 0 { 267 er.IPv4Address = ip.String() 268 } 269 270 if ipv6 := iface.AddressIPv6(); ipv6 != nil && len(ipv6.IP) > 0 { 271 er.IPv6Address = ipv6.String() 272 } 273 } 274 return er 275 }