From 081c6c76e2e9924159e1d320525048e4657a9e74 Mon Sep 17 00:00:00 2001 From: "John Howard (VM)" Date: Fri, 13 Feb 2015 15:08:42 -0800 Subject: [PATCH] Factor out ServeFD & systemd in server for Linux only (Not Windows) Signed-off-by: John Howard --- api/server/server.go | 50 ----------------------------------- api/server/server_linux.go | 51 ++++++++++++++++++++++++++++++++++++ api/server/server_windows.go | 11 ++++++++ 3 files changed, 62 insertions(+), 50 deletions(-) diff --git a/api/server/server.go b/api/server/server.go index 55dfe386f2..aff6ace7e2 100644 --- a/api/server/server.go +++ b/api/server/server.go @@ -32,7 +32,6 @@ import ( "github.com/docker/docker/pkg/listenbuffer" "github.com/docker/docker/pkg/parsers" "github.com/docker/docker/pkg/stdcopy" - "github.com/docker/docker/pkg/systemd" "github.com/docker/docker/pkg/version" "github.com/docker/docker/registry" "github.com/docker/docker/utils" @@ -1406,43 +1405,6 @@ func ServeRequest(eng *engine.Engine, apiversion version.Version, w http.Respons router.ServeHTTP(w, req) } -// serveFd creates an http.Server and sets it up to serve given a socket activated -// argument. -func serveFd(addr string, job *engine.Job) error { - r := createRouter(job.Eng, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"), job.Getenv("CorsHeaders"), job.Getenv("Version")) - - ls, e := systemd.ListenFD(addr) - if e != nil { - return e - } - - chErrors := make(chan error, len(ls)) - - // We don't want to start serving on these sockets until the - // daemon is initialized and installed. Otherwise required handlers - // won't be ready. - <-activationLock - - // Since ListenFD will return one or more sockets we have - // to create a go func to spawn off multiple serves - for i := range ls { - listener := ls[i] - go func() { - httpSrv := http.Server{Handler: r} - chErrors <- httpSrv.Serve(listener) - }() - } - - for i := 0; i < len(ls); i++ { - err := <-chErrors - if err != nil { - return err - } - } - - return nil -} - func lookupGidByName(nameOrGid string) (int, error) { groupFile, err := user.GetGroupPath() if err != nil { @@ -1620,15 +1582,3 @@ func ServeApi(job *engine.Job) engine.Status { return engine.StatusOK } - -func AcceptConnections(job *engine.Job) engine.Status { - // Tell the init daemon we are accepting requests - go systemd.SdNotify("READY=1") - - // close the lock so the listeners start accepting connections - if activationLock != nil { - close(activationLock) - } - - return engine.StatusOK -} diff --git a/api/server/server_linux.go b/api/server/server_linux.go index 6cf2c3f185..fff803ddaf 100644 --- a/api/server/server_linux.go +++ b/api/server/server_linux.go @@ -9,6 +9,7 @@ import ( "syscall" "github.com/docker/docker/engine" + "github.com/docker/docker/pkg/systemd" ) // NewServer sets up the required Server and does protocol specific checking. @@ -50,3 +51,53 @@ func setupUnixHttp(addr string, job *engine.Job) (*HttpServer, error) { return &HttpServer{&http.Server{Addr: addr, Handler: r}, l}, nil } + +// serveFd creates an http.Server and sets it up to serve given a socket activated +// argument. +func serveFd(addr string, job *engine.Job) error { + r := createRouter(job.Eng, job.GetenvBool("Logging"), job.GetenvBool("EnableCors"), job.Getenv("CorsHeaders"), job.Getenv("Version")) + + ls, e := systemd.ListenFD(addr) + if e != nil { + return e + } + + chErrors := make(chan error, len(ls)) + + // We don't want to start serving on these sockets until the + // daemon is initialized and installed. Otherwise required handlers + // won't be ready. + <-activationLock + + // Since ListenFD will return one or more sockets we have + // to create a go func to spawn off multiple serves + for i := range ls { + listener := ls[i] + go func() { + httpSrv := http.Server{Handler: r} + chErrors <- httpSrv.Serve(listener) + }() + } + + for i := 0; i < len(ls); i++ { + err := <-chErrors + if err != nil { + return err + } + } + + return nil +} + +// Called through eng.Job("acceptconnections") +func AcceptConnections(job *engine.Job) engine.Status { + // Tell the init daemon we are accepting requests + go systemd.SdNotify("READY=1") + + // close the lock so the listeners start accepting connections + if activationLock != nil { + close(activationLock) + } + + return engine.StatusOK +} diff --git a/api/server/server_windows.go b/api/server/server_windows.go index fba1c6a60a..c5d2c2ca56 100644 --- a/api/server/server_windows.go +++ b/api/server/server_windows.go @@ -18,3 +18,14 @@ func NewServer(proto, addr string, job *engine.Job) (Server, error) { return nil, errors.New("Invalid protocol format. Windows only supports tcp.") } } + +// Called through eng.Job("acceptconnections") +func AcceptConnections(job *engine.Job) engine.Status { + + // close the lock so the listeners start accepting connections + if activationLock != nil { + close(activationLock) + } + + return engine.StatusOK +}