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