瀏覽代碼

Merge pull request #21586 from calavera/remove_runconfig_from_routes

Remove runconfig package dependency from the API.
Arnaud Porterie 9 年之前
父節點
當前提交
1da40fb4ba

+ 16 - 0
api/server/httputils/decoder.go

@@ -0,0 +1,16 @@
+package httputils
+
+import (
+	"io"
+
+	"github.com/docker/engine-api/types/container"
+	"github.com/docker/engine-api/types/network"
+)
+
+// ContainerDecoder specifies how
+// to translate an io.Reader into
+// container configuration.
+type ContainerDecoder interface {
+	DecodeConfig(src io.Reader) (*container.Config, *container.HostConfig, *network.NetworkingConfig, error)
+	DecodeHostConfig(src io.Reader) (*container.HostConfig, error)
+}

+ 7 - 2
api/server/router/container/container.go

@@ -1,17 +1,22 @@
 package container
 package container
 
 
-import "github.com/docker/docker/api/server/router"
+import (
+	"github.com/docker/docker/api/server/httputils"
+	"github.com/docker/docker/api/server/router"
+)
 
 
 // containerRouter is a router to talk with the container controller
 // containerRouter is a router to talk with the container controller
 type containerRouter struct {
 type containerRouter struct {
 	backend Backend
 	backend Backend
+	decoder httputils.ContainerDecoder
 	routes  []router.Route
 	routes  []router.Route
 }
 }
 
 
 // NewRouter initializes a new container router
 // NewRouter initializes a new container router
-func NewRouter(b Backend) router.Router {
+func NewRouter(b Backend, decoder httputils.ContainerDecoder) router.Router {
 	r := &containerRouter{
 	r := &containerRouter{
 		backend: b,
 		backend: b,
+		decoder: decoder,
 	}
 	}
 	r.initRoutes()
 	r.initRoutes()
 	return r
 	return r

+ 2 - 3
api/server/router/container/container_routes.go

@@ -16,7 +16,6 @@ import (
 	"github.com/docker/docker/pkg/ioutils"
 	"github.com/docker/docker/pkg/ioutils"
 	"github.com/docker/docker/pkg/signal"
 	"github.com/docker/docker/pkg/signal"
 	"github.com/docker/docker/pkg/term"
 	"github.com/docker/docker/pkg/term"
-	"github.com/docker/docker/runconfig"
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types/container"
 	"github.com/docker/engine-api/types/container"
 	"github.com/docker/engine-api/types/filters"
 	"github.com/docker/engine-api/types/filters"
@@ -137,7 +136,7 @@ func (s *containerRouter) postContainersStart(ctx context.Context, w http.Respon
 			return err
 			return err
 		}
 		}
 
 
-		c, err := runconfig.DecodeHostConfig(r.Body)
+		c, err := s.decoder.DecodeHostConfig(r.Body)
 		if err != nil {
 		if err != nil {
 			return err
 			return err
 		}
 		}
@@ -338,7 +337,7 @@ func (s *containerRouter) postContainersCreate(ctx context.Context, w http.Respo
 
 
 	name := r.Form.Get("name")
 	name := r.Form.Get("name")
 
 
-	config, hostConfig, networkingConfig, err := runconfig.DecodeContainerConfig(r.Body)
+	config, hostConfig, networkingConfig, err := s.decoder.DecodeConfig(r.Body)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}

+ 7 - 2
api/server/router/image/image.go

@@ -1,17 +1,22 @@
 package image
 package image
 
 
-import "github.com/docker/docker/api/server/router"
+import (
+	"github.com/docker/docker/api/server/httputils"
+	"github.com/docker/docker/api/server/router"
+)
 
 
 // imageRouter is a router to talk with the image controller
 // imageRouter is a router to talk with the image controller
 type imageRouter struct {
 type imageRouter struct {
 	backend Backend
 	backend Backend
+	decoder httputils.ContainerDecoder
 	routes  []router.Route
 	routes  []router.Route
 }
 }
 
 
 // NewRouter initializes a new image router
 // NewRouter initializes a new image router
-func NewRouter(backend Backend) router.Router {
+func NewRouter(backend Backend, decoder httputils.ContainerDecoder) router.Router {
 	r := &imageRouter{
 	r := &imageRouter{
 		backend: backend,
 		backend: backend,
+		decoder: decoder,
 	}
 	}
 	r.initRoutes()
 	r.initRoutes()
 	return r
 	return r

+ 1 - 2
api/server/router/image/image_routes.go

@@ -17,7 +17,6 @@ import (
 	"github.com/docker/docker/pkg/ioutils"
 	"github.com/docker/docker/pkg/ioutils"
 	"github.com/docker/docker/pkg/streamformatter"
 	"github.com/docker/docker/pkg/streamformatter"
 	"github.com/docker/docker/reference"
 	"github.com/docker/docker/reference"
-	"github.com/docker/docker/runconfig"
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types/container"
 	"github.com/docker/engine-api/types/container"
 	"golang.org/x/net/context"
 	"golang.org/x/net/context"
@@ -40,7 +39,7 @@ func (s *imageRouter) postCommit(ctx context.Context, w http.ResponseWriter, r *
 		pause = true
 		pause = true
 	}
 	}
 
 
-	c, _, _, err := runconfig.DecodeContainerConfig(r.Body)
+	c, _, _, err := s.decoder.DecodeConfig(r.Body)
 	if err != nil && err != io.EOF { //Do not fail if body is empty.
 	if err != nil && err != io.EOF { //Do not fail if body is empty.
 		return err
 		return err
 	}
 	}

+ 4 - 2
api/server/router/network/backend.go

@@ -1,6 +1,8 @@
 package network
 package network
 
 
 import (
 import (
+	"github.com/docker/engine-api/types"
+	"github.com/docker/engine-api/types/filters"
 	"github.com/docker/engine-api/types/network"
 	"github.com/docker/engine-api/types/network"
 	"github.com/docker/libnetwork"
 	"github.com/docker/libnetwork"
 )
 )
@@ -11,8 +13,8 @@ type Backend interface {
 	FindNetwork(idName string) (libnetwork.Network, error)
 	FindNetwork(idName string) (libnetwork.Network, error)
 	GetNetworkByName(idName string) (libnetwork.Network, error)
 	GetNetworkByName(idName string) (libnetwork.Network, error)
 	GetNetworksByID(partialID string) []libnetwork.Network
 	GetNetworksByID(partialID string) []libnetwork.Network
-	GetAllNetworks() []libnetwork.Network
-	CreateNetwork(name, driver string, ipam network.IPAM, options map[string]string, labels map[string]string, internal bool, enableIPv6 bool) (libnetwork.Network, error)
+	FilterNetworks(netFilters filters.Args) ([]libnetwork.Network, error)
+	CreateNetwork(types.NetworkCreate) (*types.NetworkCreateResponse, error)
 	ConnectContainerToNetwork(containerName, networkName string, endpointConfig *network.EndpointSettings) error
 	ConnectContainerToNetwork(containerName, networkName string, endpointConfig *network.EndpointSettings) error
 	DisconnectContainerFromNetwork(containerName string, network libnetwork.Network, force bool) error
 	DisconnectContainerFromNetwork(containerName string, network libnetwork.Network, force bool) error
 	DeleteNetwork(name string) error
 	DeleteNetwork(name string) error

+ 4 - 33
api/server/router/network/network_routes.go

@@ -2,13 +2,11 @@ package network
 
 
 import (
 import (
 	"encoding/json"
 	"encoding/json"
-	"fmt"
 	"net/http"
 	"net/http"
 
 
 	"golang.org/x/net/context"
 	"golang.org/x/net/context"
 
 
 	"github.com/docker/docker/api/server/httputils"
 	"github.com/docker/docker/api/server/httputils"
-	"github.com/docker/docker/runconfig"
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types"
 	"github.com/docker/engine-api/types/filters"
 	"github.com/docker/engine-api/types/filters"
 	"github.com/docker/engine-api/types/network"
 	"github.com/docker/engine-api/types/network"
@@ -26,21 +24,14 @@ func (n *networkRouter) getNetworksList(ctx context.Context, w http.ResponseWrit
 		return err
 		return err
 	}
 	}
 
 
-	if netFilters.Len() != 0 {
-		if err := netFilters.Validate(acceptedFilters); err != nil {
-			return err
-		}
-	}
-
 	list := []*types.NetworkResource{}
 	list := []*types.NetworkResource{}
 
 
-	nwList := n.backend.GetAllNetworks()
-	displayable, err := filterNetworks(nwList, netFilters)
+	nwList, err := n.backend.FilterNetworks(netFilters)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
 
 
-	for _, nw := range displayable {
+	for _, nw := range nwList {
 		list = append(list, buildNetworkResource(nw))
 		list = append(list, buildNetworkResource(nw))
 	}
 	}
 
 
@@ -61,7 +52,6 @@ func (n *networkRouter) getNetwork(ctx context.Context, w http.ResponseWriter, r
 
 
 func (n *networkRouter) postNetworkCreate(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 func (n *networkRouter) postNetworkCreate(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 	var create types.NetworkCreate
 	var create types.NetworkCreate
-	var warning string
 
 
 	if err := httputils.ParseForm(r); err != nil {
 	if err := httputils.ParseForm(r); err != nil {
 		return err
 		return err
@@ -75,31 +65,12 @@ func (n *networkRouter) postNetworkCreate(ctx context.Context, w http.ResponseWr
 		return err
 		return err
 	}
 	}
 
 
-	if runconfig.IsPreDefinedNetwork(create.Name) {
-		return httputils.WriteJSON(w, http.StatusForbidden,
-			fmt.Sprintf("%s is a pre-defined network and cannot be created", create.Name))
-	}
-
-	nw, err := n.backend.GetNetworkByName(create.Name)
-	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.backend.CreateNetwork(create.Name, create.Driver, create.IPAM, create.Options, create.Labels, create.Internal, create.EnableIPv6)
+	nw, err := n.backend.CreateNetwork(create)
 	if err != nil {
 	if err != nil {
 		return err
 		return err
 	}
 	}
 
 
-	return httputils.WriteJSON(w, http.StatusCreated, &types.NetworkCreateResponse{
-		ID:      nw.ID(),
-		Warning: warning,
-	})
+	return httputils.WriteJSON(w, http.StatusCreated, nw)
 }
 }
 
 
 func (n *networkRouter) postNetworkConnect(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
 func (n *networkRouter) postNetworkConnect(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {

+ 48 - 9
daemon/network.go

@@ -6,8 +6,11 @@ import (
 	"net/http"
 	"net/http"
 	"strings"
 	"strings"
 
 
+	netsettings "github.com/docker/docker/daemon/network"
 	"github.com/docker/docker/errors"
 	"github.com/docker/docker/errors"
 	"github.com/docker/docker/runconfig"
 	"github.com/docker/docker/runconfig"
+	"github.com/docker/engine-api/types"
+	"github.com/docker/engine-api/types/filters"
 	"github.com/docker/engine-api/types/network"
 	"github.com/docker/engine-api/types/network"
 	"github.com/docker/libnetwork"
 	"github.com/docker/libnetwork"
 )
 )
@@ -77,8 +80,8 @@ func (daemon *Daemon) GetNetworksByID(partialID string) []libnetwork.Network {
 	return list
 	return list
 }
 }
 
 
-// GetAllNetworks returns a list containing all networks
-func (daemon *Daemon) GetAllNetworks() []libnetwork.Network {
+// getAllNetworks returns a list containing all networks
+func (daemon *Daemon) getAllNetworks() []libnetwork.Network {
 	c := daemon.netController
 	c := daemon.netController
 	list := []libnetwork.Network{}
 	list := []libnetwork.Network{}
 	l := func(nw libnetwork.Network) bool {
 	l := func(nw libnetwork.Network) bool {
@@ -91,12 +94,33 @@ func (daemon *Daemon) GetAllNetworks() []libnetwork.Network {
 }
 }
 
 
 // CreateNetwork creates a network with the given name, driver and other optional parameters
 // CreateNetwork creates a network with the given name, driver and other optional parameters
-func (daemon *Daemon) CreateNetwork(name, driver string, ipam network.IPAM, netOption map[string]string, labels map[string]string, internal bool, enableIPv6 bool) (libnetwork.Network, error) {
+func (daemon *Daemon) CreateNetwork(create types.NetworkCreate) (*types.NetworkCreateResponse, error) {
+	if runconfig.IsPreDefinedNetwork(create.Name) {
+		err := fmt.Errorf("%s is a pre-defined network and cannot be created", create.Name)
+		return nil, errors.NewErrorWithStatusCode(err, http.StatusForbidden)
+	}
+
+	var warning string
+	nw, err := daemon.GetNetworkByName(create.Name)
+	if err != nil {
+		if _, ok := err.(libnetwork.ErrNoSuchNetwork); !ok {
+			return nil, err
+		}
+	}
+	if nw != nil {
+		if create.CheckDuplicate {
+			return nil, libnetwork.NetworkNameError(create.Name)
+		}
+		warning = fmt.Sprintf("Network with name %s (id : %s) already exists", nw.Name(), nw.ID())
+	}
+
 	c := daemon.netController
 	c := daemon.netController
+	driver := create.Driver
 	if driver == "" {
 	if driver == "" {
 		driver = c.Config().Daemon.DefaultDriver
 		driver = c.Config().Daemon.DefaultDriver
 	}
 	}
 
 
+	ipam := create.IPAM
 	v4Conf, v6Conf, err := getIpamConfig(ipam.Config)
 	v4Conf, v6Conf, err := getIpamConfig(ipam.Config)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
@@ -104,20 +128,23 @@ func (daemon *Daemon) CreateNetwork(name, driver string, ipam network.IPAM, netO
 
 
 	nwOptions := []libnetwork.NetworkOption{
 	nwOptions := []libnetwork.NetworkOption{
 		libnetwork.NetworkOptionIpam(ipam.Driver, "", v4Conf, v6Conf, ipam.Options),
 		libnetwork.NetworkOptionIpam(ipam.Driver, "", v4Conf, v6Conf, ipam.Options),
-		libnetwork.NetworkOptionEnableIPv6(enableIPv6),
-		libnetwork.NetworkOptionDriverOpts(netOption),
-		libnetwork.NetworkOptionLabels(labels),
+		libnetwork.NetworkOptionEnableIPv6(create.EnableIPv6),
+		libnetwork.NetworkOptionDriverOpts(create.Options),
+		libnetwork.NetworkOptionLabels(create.Labels),
 	}
 	}
-	if internal {
+	if create.Internal {
 		nwOptions = append(nwOptions, libnetwork.NetworkOptionInternalNetwork())
 		nwOptions = append(nwOptions, libnetwork.NetworkOptionInternalNetwork())
 	}
 	}
-	n, err := c.NewNetwork(driver, name, nwOptions...)
+	n, err := c.NewNetwork(driver, create.Name, nwOptions...)
 	if err != nil {
 	if err != nil {
 		return nil, err
 		return nil, err
 	}
 	}
 
 
 	daemon.LogNetworkEvent(n, "create")
 	daemon.LogNetworkEvent(n, "create")
-	return n, nil
+	return &types.NetworkCreateResponse{
+		ID:      n.ID(),
+		Warning: warning,
+	}, nil
 }
 }
 
 
 func getIpamConfig(data []network.IPAMConfig) ([]*libnetwork.IpamConf, []*libnetwork.IpamConf, error) {
 func getIpamConfig(data []network.IPAMConfig) ([]*libnetwork.IpamConf, []*libnetwork.IpamConf, error) {
@@ -203,3 +230,15 @@ func (daemon *Daemon) DeleteNetwork(networkID string) error {
 	daemon.LogNetworkEvent(nw, "destroy")
 	daemon.LogNetworkEvent(nw, "destroy")
 	return nil
 	return nil
 }
 }
+
+// FilterNetworks returns a list of networks filtered by the given arguments.
+// It returns an error if the filters are not included in the list of accepted filters.
+func (daemon *Daemon) FilterNetworks(netFilters filters.Args) ([]libnetwork.Network, error) {
+	if netFilters.Len() != 0 {
+		if err := netFilters.Validate(netsettings.AcceptedFilters); err != nil {
+			return nil, err
+		}
+	}
+	nwList := daemon.getAllNetworks()
+	return netsettings.FilterNetworks(nwList, netFilters)
+}

+ 4 - 4
api/server/router/network/filter.go → daemon/network/filter.go

@@ -20,14 +20,14 @@ var (
 		"id":   filterNetworkByID,
 		"id":   filterNetworkByID,
 	}
 	}
 
 
-	// acceptFilters is an acceptable filter flag list
+	// AcceptedFilters is an acceptable filter flag list
 	// generated for validation. e.g.
 	// generated for validation. e.g.
 	// acceptedFilters = map[string]bool{
 	// acceptedFilters = map[string]bool{
 	//     "type": true,
 	//     "type": true,
 	//     "name": true,
 	//     "name": true,
 	//     "id":   true,
 	//     "id":   true,
 	// }
 	// }
-	acceptedFilters = func() map[string]bool {
+	AcceptedFilters = func() map[string]bool {
 		ret := make(map[string]bool)
 		ret := make(map[string]bool)
 		for k := range supportedFilters {
 		for k := range supportedFilters {
 			ret[k] = true
 			ret[k] = true
@@ -84,9 +84,9 @@ func filterNetworkByID(nws []libnetwork.Network, id string) (retNws []libnetwork
 	return retNws, nil
 	return retNws, nil
 }
 }
 
 
-// filterAllNetworks filters network list according to user specified filter
+// FilterNetworks filters network list according to user specified filter
 // and returns user chosen networks
 // and returns user chosen networks
-func filterNetworks(nws []libnetwork.Network, filter filters.Args) ([]libnetwork.Network, error) {
+func FilterNetworks(nws []libnetwork.Network, filter filters.Args) ([]libnetwork.Network, error) {
 	// if filter is empty, return original network list
 	// if filter is empty, return original network list
 	if filter.Len() == 0 {
 	if filter.Len() == 0 {
 		return nws, nil
 		return nws, nil

+ 5 - 2
docker/daemon.go

@@ -37,6 +37,7 @@ import (
 	"github.com/docker/docker/pkg/signal"
 	"github.com/docker/docker/pkg/signal"
 	"github.com/docker/docker/pkg/system"
 	"github.com/docker/docker/pkg/system"
 	"github.com/docker/docker/registry"
 	"github.com/docker/docker/registry"
+	"github.com/docker/docker/runconfig"
 	"github.com/docker/docker/utils"
 	"github.com/docker/docker/utils"
 	"github.com/docker/go-connections/tlsconfig"
 	"github.com/docker/go-connections/tlsconfig"
 )
 )
@@ -405,9 +406,11 @@ func loadDaemonCliConfig(config *daemon.Config, daemonFlags *flag.FlagSet, commo
 }
 }
 
 
 func initRouter(s *apiserver.Server, d *daemon.Daemon) {
 func initRouter(s *apiserver.Server, d *daemon.Daemon) {
+	decoder := runconfig.ContainerDecoder{}
+
 	routers := []router.Router{
 	routers := []router.Router{
-		container.NewRouter(d),
-		image.NewRouter(d),
+		container.NewRouter(d, decoder),
+		image.NewRouter(d, decoder),
 		systemrouter.NewRouter(d),
 		systemrouter.NewRouter(d),
 		volume.NewRouter(d),
 		volume.NewRouter(d),
 		build.NewRouter(dockerfile.NewBuildManager(d)),
 		build.NewRouter(dockerfile.NewBuildManager(d)),

+ 1 - 1
integration-cli/docker_api_network_test.go

@@ -296,8 +296,8 @@ func createNetwork(c *check.C, config types.NetworkCreate, shouldSucceed bool) s
 		return ""
 		return ""
 	}
 	}
 
 
-	c.Assert(status, checker.Equals, http.StatusCreated)
 	c.Assert(err, checker.IsNil)
 	c.Assert(err, checker.IsNil)
+	c.Assert(status, checker.Equals, http.StatusCreated)
 
 
 	var nr types.NetworkCreateResponse
 	var nr types.NetworkCreateResponse
 	err = json.Unmarshal(resp, &nr)
 	err = json.Unmarshal(resp, &nr)

+ 14 - 0
runconfig/config.go

@@ -10,6 +10,20 @@ import (
 	networktypes "github.com/docker/engine-api/types/network"
 	networktypes "github.com/docker/engine-api/types/network"
 )
 )
 
 
+// ContainerDecoder implements httputils.ContainerDecoder
+// calling DecodeContainerConfig.
+type ContainerDecoder struct{}
+
+// DecodeConfig makes ContainerDecoder to implement httputils.ContainerDecoder
+func (r ContainerDecoder) DecodeConfig(src io.Reader) (*container.Config, *container.HostConfig, *networktypes.NetworkingConfig, error) {
+	return DecodeContainerConfig(src)
+}
+
+// DecodeHostConfig makes ContainerDecoder to implement httputils.ContainerDecoder
+func (r ContainerDecoder) DecodeHostConfig(src io.Reader) (*container.HostConfig, error) {
+	return DecodeHostConfig(src)
+}
+
 // DecodeContainerConfig decodes a json encoded config into a ContainerConfigWrapper
 // DecodeContainerConfig decodes a json encoded config into a ContainerConfigWrapper
 // struct and returns both a Config and an HostConfig struct
 // struct and returns both a Config and an HostConfig struct
 // Be aware this function is not checking whether the resulted structs are nil,
 // Be aware this function is not checking whether the resulted structs are nil,