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