diff --git a/api/server/server.go b/api/server/server.go index b399bcc0e7b8b..f03865cab6d29 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -1126,12 +1126,21 @@ func getLabels(body map[string]interface{}) (map[string]string, error) { return nil, fmt.Errorf("Must specify Labels") } - value, ok := inf.(map[string]string) + value, ok := inf.(map[string]interface{}) if !ok { return nil, fmt.Errorf("Labels must be a map[string]string") } - return value, nil + result := make(map[string]string) + for k, v := range value { + val, ok := v.(string) + if !ok { + return nil, fmt.Errorf("Labels must be a map[string]string") + } + result[k] = val + } + + return result, nil } func postNetworkCreate(eng *engine.Engine, version version.Version, w http.ResponseWriter, r *http.Request, vars map[string]string) error { @@ -1143,8 +1152,7 @@ func postNetworkCreate(eng *engine.Engine, version version.Version, w http.Respo } body := make(map[string]interface{}) - decoder := json.NewDecoder(r.Body) - if err := decoder.Decode(&body); err != nil { + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { return err } @@ -1174,8 +1182,18 @@ func postNetworkPlug(eng *engine.Engine, version version.Version, w http.Respons return err } + body := make(map[string]interface{}) + if err := json.NewDecoder(r.Body).Decode(&body); err != nil { + return err + } + + labels, err := getLabels(body) + if err != nil { + return err + } + d := getDaemon(eng) - id, err := d.NetworkPlug(vars["name"], vars["network"]) + id, err := d.NetworkPlug(vars["name"], vars["network"], labels) if err != nil { return err } diff --git a/daemon/network.go b/daemon/network.go index f00a0ac13539f..1fa9049cfc3d5 100644 --- a/daemon/network.go +++ b/daemon/network.go @@ -95,7 +95,7 @@ func (daemon *Daemon) NetworkDestroy(id string) error { return nil } -func (daemon *Daemon) endpointOnNetwork(namesOrId string) (*Endpoint, error) { +func (daemon *Daemon) endpointOnNetwork(namesOrId string, labels map[string]string) (*Endpoint, error) { net := daemon.networks.Get(namesOrId) if net == nil { return nil, fmt.Errorf("Network '%s' not found", namesOrId) @@ -104,13 +104,14 @@ func (daemon *Daemon) endpointOnNetwork(namesOrId string) (*Endpoint, error) { return &Endpoint{ ID: stringid.GenerateRandomID(), Network: net.ID, + Labels: labels, }, nil } func (daemon *Daemon) endpointsOnNetworks(namesOrIds []string) ([]*Endpoint, error) { var result []*Endpoint for _, nameOrId := range namesOrIds { - endpoint, err := daemon.endpointOnNetwork(nameOrId) + endpoint, err := daemon.endpointOnNetwork(nameOrId, nil) if err != nil { return nil, err } @@ -119,7 +120,7 @@ func (daemon *Daemon) endpointsOnNetworks(namesOrIds []string) ([]*Endpoint, err return result, nil } -func (daemon *Daemon) NetworkPlug(containerID, nameOrId string) (string, error) { +func (daemon *Daemon) NetworkPlug(containerID, nameOrId string, labels map[string]string) (string, error) { daemon.networks.Lock() defer daemon.networks.Unlock() @@ -132,7 +133,7 @@ func (daemon *Daemon) NetworkPlug(containerID, nameOrId string) (string, error) return "", fmt.Errorf("Cannot plug in running container (yet)") } - endpoint, err := daemon.endpointOnNetwork(nameOrId) + endpoint, err := daemon.endpointOnNetwork(nameOrId, labels) if err != nil { return "", err } diff --git a/daemon/network/test.sh b/daemon/network/test.sh index d3f0476cc94b4..b3e6f4e013df4 100755 --- a/daemon/network/test.sh +++ b/daemon/network/test.sh @@ -2,7 +2,7 @@ set -eux -docker rm $(docker ps -a -q) +docker rm $(docker ps -a -q) || true CONTAINER=$(docker create ubuntu) NETWORK=$(docker net create --driver=noop) docker net plug $CONTAINER $NETWORK