123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216 |
- package network
- import (
- "encoding/json"
- "fmt"
- "net/http"
- "golang.org/x/net/context"
- "github.com/Sirupsen/logrus"
- "github.com/docker/docker/api/server/httputils"
- "github.com/docker/docker/api/types"
- "github.com/docker/docker/daemon"
- "github.com/docker/docker/pkg/parsers/filters"
- "github.com/docker/libnetwork"
- )
- func (n *networkRouter) getNetworksList(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
- if err := httputils.ParseForm(r); err != nil {
- return err
- }
- filter := r.Form.Get("filters")
- netFilters, err := filters.FromParam(filter)
- if err != nil {
- return err
- }
- list := []*types.NetworkResource{}
- var nameFilter, idFilter bool
- var names, ids []string
- if names, nameFilter = netFilters["name"]; nameFilter {
- for _, name := range names {
- if nw, err := n.daemon.GetNetwork(name, daemon.NetworkByName); err == nil {
- list = append(list, buildNetworkResource(nw))
- } else {
- logrus.Errorf("failed to get network for filter=%s : %v", name, err)
- }
- }
- }
- if ids, idFilter = netFilters["id"]; idFilter {
- for _, id := range ids {
- for _, nw := range n.daemon.GetNetworksByID(id) {
- list = append(list, buildNetworkResource(nw))
- }
- }
- }
- if !nameFilter && !idFilter {
- nwList := n.daemon.GetNetworksByID("")
- for _, nw := range nwList {
- list = append(list, buildNetworkResource(nw))
- }
- }
- return httputils.WriteJSON(w, http.StatusOK, list)
- }
- func (n *networkRouter) getNetwork(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
- if err := httputils.ParseForm(r); err != nil {
- return err
- }
- nw, err := n.daemon.FindNetwork(vars["id"])
- if err != nil {
- return err
- }
- return httputils.WriteJSON(w, http.StatusOK, buildNetworkResource(nw))
- }
- func (n *networkRouter) postNetworkCreate(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
- var create types.NetworkCreate
- var warning string
- if err := httputils.ParseForm(r); err != nil {
- return err
- }
- if err := httputils.CheckForJSON(r); err != nil {
- return err
- }
- if err := json.NewDecoder(r.Body).Decode(&create); err != nil {
- return err
- }
- nw, err := n.daemon.GetNetwork(create.Name, daemon.NetworkByName)
- if _, ok := err.(libnetwork.ErrNoSuchNetwork); err != nil && !ok {
- return err
- }
- if nw != nil {
- if create.CheckDuplicate {
- return libnetwork.NetworkNameError(create.Name)
- }
- warning = fmt.Sprintf("Network with name %s (id : %s) already exists", nw.Name(), nw.ID())
- }
- nw, err = n.daemon.CreateNetwork(create.Name, create.Driver, create.Options)
- if err != nil {
- return err
- }
- return httputils.WriteJSON(w, http.StatusCreated, &types.NetworkCreateResponse{
- ID: nw.ID(),
- Warning: warning,
- })
- }
- func (n *networkRouter) postNetworkConnect(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
- var connect types.NetworkConnect
- if err := httputils.ParseForm(r); err != nil {
- return err
- }
- if err := httputils.CheckForJSON(r); err != nil {
- return err
- }
- if err := json.NewDecoder(r.Body).Decode(&connect); err != nil {
- return err
- }
- nw, err := n.daemon.FindNetwork(vars["id"])
- if err != nil {
- return err
- }
- container, err := n.daemon.Get(connect.Container)
- if err != nil {
- return fmt.Errorf("invalid container %s : %v", container, err)
- }
- return container.ConnectToNetwork(nw.Name())
- }
- func (n *networkRouter) postNetworkDisconnect(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
- var disconnect types.NetworkDisconnect
- if err := httputils.ParseForm(r); err != nil {
- return err
- }
- if err := httputils.CheckForJSON(r); err != nil {
- return err
- }
- if err := json.NewDecoder(r.Body).Decode(&disconnect); err != nil {
- return err
- }
- nw, err := n.daemon.FindNetwork(vars["id"])
- if err != nil {
- return err
- }
- container, err := n.daemon.Get(disconnect.Container)
- if err != nil {
- return fmt.Errorf("invalid container %s : %v", container, err)
- }
- return container.DisconnectFromNetwork(nw)
- }
- func (n *networkRouter) deleteNetwork(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
- if err := httputils.ParseForm(r); err != nil {
- return err
- }
- nw, err := n.daemon.FindNetwork(vars["id"])
- if err != nil {
- return err
- }
- return nw.Delete()
- }
- func buildNetworkResource(nw libnetwork.Network) *types.NetworkResource {
- r := &types.NetworkResource{}
- if nw == nil {
- return r
- }
- r.Name = nw.Name()
- r.ID = nw.ID()
- r.Driver = nw.Type()
- r.Containers = make(map[string]types.EndpointResource)
- epl := nw.Endpoints()
- for _, e := range epl {
- sb := e.Info().Sandbox()
- if sb == nil {
- continue
- }
- r.Containers[sb.ContainerID()] = buildEndpointResource(e)
- }
- return r
- }
- func buildEndpointResource(e libnetwork.Endpoint) types.EndpointResource {
- er := types.EndpointResource{}
- if e == nil {
- return er
- }
- er.EndpointID = e.ID()
- if iface := e.Info().Iface(); iface != nil {
- if mac := iface.MacAddress(); mac != nil {
- er.MacAddress = mac.String()
- }
- if ip := iface.Address(); len(ip.IP) > 0 {
- er.IPv4Address = (&ip).String()
- }
- if ipv6 := iface.AddressIPv6(); len(ipv6.IP) > 0 {
- er.IPv6Address = (&ipv6).String()
- }
- }
- return er
- }
|