Quellcode durchsuchen

Return 404 for all network operations without network controller.

This will prevent the api from trying to serve network requests in
systems where libnetwork is not enabled, returning 404 responses in any
case.

Signed-off-by: David Calavera <david.calavera@gmail.com>
David Calavera vor 9 Jahren
Ursprung
Commit
eb982e7c00
4 geänderte Dateien mit 38 neuen und 6 gelöschten Zeilen
  1. 22 6
      api/server/router/network/network.go
  2. 1 0
      api/server/server.go
  3. 6 0
      daemon/network.go
  4. 9 0
      errors/server.go

+ 22 - 6
api/server/router/network/network.go

@@ -1,9 +1,14 @@
 package network
 package network
 
 
 import (
 import (
+	"net/http"
+
+	"github.com/docker/docker/api/server/httputils"
 	"github.com/docker/docker/api/server/router"
 	"github.com/docker/docker/api/server/router"
 	"github.com/docker/docker/api/server/router/local"
 	"github.com/docker/docker/api/server/router/local"
 	"github.com/docker/docker/daemon"
 	"github.com/docker/docker/daemon"
+	"github.com/docker/docker/errors"
+	"golang.org/x/net/context"
 )
 )
 
 
 // networkRouter is a router to talk with the network controller
 // networkRouter is a router to talk with the network controller
@@ -29,13 +34,24 @@ func (r *networkRouter) Routes() []router.Route {
 func (r *networkRouter) initRoutes() {
 func (r *networkRouter) initRoutes() {
 	r.routes = []router.Route{
 	r.routes = []router.Route{
 		// GET
 		// GET
-		local.NewGetRoute("/networks", r.getNetworksList),
-		local.NewGetRoute("/networks/{id:.*}", r.getNetwork),
+		local.NewGetRoute("/networks", r.controllerEnabledMiddleware(r.getNetworksList)),
+		local.NewGetRoute("/networks/{id:.*}", r.controllerEnabledMiddleware(r.getNetwork)),
 		// POST
 		// POST
-		local.NewPostRoute("/networks/create", r.postNetworkCreate),
-		local.NewPostRoute("/networks/{id:.*}/connect", r.postNetworkConnect),
-		local.NewPostRoute("/networks/{id:.*}/disconnect", r.postNetworkDisconnect),
+		local.NewPostRoute("/networks/create", r.controllerEnabledMiddleware(r.postNetworkCreate)),
+		local.NewPostRoute("/networks/{id:.*}/connect", r.controllerEnabledMiddleware(r.postNetworkConnect)),
+		local.NewPostRoute("/networks/{id:.*}/disconnect", r.controllerEnabledMiddleware(r.postNetworkDisconnect)),
 		// DELETE
 		// DELETE
-		local.NewDeleteRoute("/networks/{id:.*}", r.deleteNetwork),
+		local.NewDeleteRoute("/networks/{id:.*}", r.controllerEnabledMiddleware(r.deleteNetwork)),
+	}
+}
+
+func (r *networkRouter) controllerEnabledMiddleware(handler httputils.APIFunc) httputils.APIFunc {
+	if r.daemon.NetworkControllerEnabled() {
+		return handler
 	}
 	}
+	return networkControllerDisabled
+}
+
+func networkControllerDisabled(ctx context.Context, w http.ResponseWriter, r *http.Request, vars map[string]string) error {
+	return errors.ErrorNetworkControllerNotEnabled.WithArgs()
 }
 }

+ 1 - 0
api/server/server.go

@@ -170,6 +170,7 @@ func (s *Server) makeHTTPHandler(handler httputils.APIFunc) http.HandlerFunc {
 func (s *Server) InitRouters(d *daemon.Daemon) {
 func (s *Server) InitRouters(d *daemon.Daemon) {
 	s.addRouter(local.NewRouter(d))
 	s.addRouter(local.NewRouter(d))
 	s.addRouter(network.NewRouter(d))
 	s.addRouter(network.NewRouter(d))
+
 	for _, srv := range s.servers {
 	for _, srv := range s.servers {
 		srv.srv.Handler = s.CreateMux()
 		srv.srv.Handler = s.CreateMux()
 	}
 	}

+ 6 - 0
daemon/network.go

@@ -17,6 +17,12 @@ const (
 	NetworkByName
 	NetworkByName
 )
 )
 
 
+// NetworkControllerEnabled checks if the networking stack is enabled.
+// This feature depends on OS primitives and it's dissabled in systems like Windows.
+func (daemon *Daemon) NetworkControllerEnabled() bool {
+	return daemon.netController != nil
+}
+
 // FindNetwork function finds a network for a given string that can represent network name or id
 // FindNetwork function finds a network for a given string that can represent network name or id
 func (daemon *Daemon) FindNetwork(idName string) (libnetwork.Network, error) {
 func (daemon *Daemon) FindNetwork(idName string) (libnetwork.Network, error) {
 	// Find by Name
 	// Find by Name

+ 9 - 0
errors/server.go

@@ -24,4 +24,13 @@ var (
 		Description:    "The client version is too old for the server",
 		Description:    "The client version is too old for the server",
 		HTTPStatusCode: http.StatusBadRequest,
 		HTTPStatusCode: http.StatusBadRequest,
 	})
 	})
+
+	// ErrorNetworkControllerNotEnabled is generated when the networking stack in not enabled
+	// for certain platforms, like windows.
+	ErrorNetworkControllerNotEnabled = errcode.Register(errGroup, errcode.ErrorDescriptor{
+		Value:          "NETWORK_CONTROLLER_NOT_ENABLED",
+		Message:        "the network controller is not enabled for this platform",
+		Description:    "Docker's networking stack is disabled for this platform",
+		HTTPStatusCode: http.StatusNotFound,
+	})
 )
 )