1
0
Fork 0
mirror of https://github.com/moby/moby.git synced 2022-11-09 12:21:53 -05:00

Separate a) initialization of the http api and b) actually serving the api into 2 distinct jobs

This commit is contained in:
Solomon Hykes 2013-10-26 17:19:35 -07:00
parent dcaaecc815
commit 433c8e9c7d
3 changed files with 21 additions and 20 deletions

View file

@ -9,7 +9,6 @@ import (
type DaemonConfig struct { type DaemonConfig struct {
Pidfile string Pidfile string
Root string Root string
ProtoAddresses []string
AutoRestart bool AutoRestart bool
EnableCors bool EnableCors bool
Dns []string Dns []string
@ -36,7 +35,6 @@ func ConfigFromJob(job *engine.Job) *DaemonConfig {
} else { } else {
config.BridgeIface = DefaultNetworkBridge config.BridgeIface = DefaultNetworkBridge
} }
config.ProtoAddresses = job.GetenvList("ProtoAddresses")
config.DefaultIp = net.ParseIP(job.Getenv("DefaultIp")) config.DefaultIp = net.ParseIP(job.Getenv("DefaultIp"))
config.InterContainerCommunication = job.GetenvBool("InterContainerCommunication") config.InterContainerCommunication = job.GetenvBool("InterContainerCommunication")
return &config return &config

View file

@ -71,7 +71,8 @@ func main() {
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
} }
job := eng.Job("serveapi") // Load plugin: httpapi
job := eng.Job("initapi")
job.Setenv("Pidfile", *pidfile) job.Setenv("Pidfile", *pidfile)
job.Setenv("Root", *flRoot) job.Setenv("Root", *flRoot)
job.SetenvBool("AutoRestart", *flAutoRestart) job.SetenvBool("AutoRestart", *flAutoRestart)
@ -79,12 +80,15 @@ func main() {
job.Setenv("Dns", *flDns) job.Setenv("Dns", *flDns)
job.SetenvBool("EnableIptables", *flEnableIptables) job.SetenvBool("EnableIptables", *flEnableIptables)
job.Setenv("BridgeIface", *bridgeName) job.Setenv("BridgeIface", *bridgeName)
job.SetenvList("ProtoAddresses", flHosts)
job.Setenv("DefaultIp", *flDefaultIp) job.Setenv("DefaultIp", *flDefaultIp)
job.SetenvBool("InterContainerCommunication", *flInterContainerComm) job.SetenvBool("InterContainerCommunication", *flInterContainerComm)
if err := job.Run(); err != nil { if err := job.Run(); err != nil {
log.Fatal(err) log.Fatal(err)
} }
// Serve api
if err := eng.Job("serveapi", flHosts...).Run(); err != nil {
log.Fatal(err)
}
} else { } else {
if len(flHosts) > 1 { if len(flHosts) > 1 {
log.Fatal("Please specify only one -H") log.Fatal("Please specify only one -H")

View file

@ -33,30 +33,20 @@ func (srv *Server) Close() error {
} }
func init() { func init() {
engine.Register("serveapi", JobServeApi) engine.Register("initapi", jobInitApi)
} }
func JobServeApi(job *engine.Job) string { // jobInitApi runs the remote api server `srv` as a daemon,
// Only one api server can run at the same time - this is enforced by a pidfile.
// The signals SIGINT, SIGKILL and SIGTERM are intercepted for cleanup.
func jobInitApi(job *engine.Job) string {
srv, err := NewServer(ConfigFromJob(job)) srv, err := NewServer(ConfigFromJob(job))
if err != nil { if err != nil {
return err.Error() return err.Error()
} }
defer srv.Close()
if err := srv.Daemon(); err != nil {
return err.Error()
}
return "0"
}
// Daemon runs the remote api server `srv` as a daemon,
// Only one api server can run at the same time - this is enforced by a pidfile.
// The signals SIGINT, SIGKILL and SIGTERM are intercepted for cleanup.
func (srv *Server) Daemon() error {
if err := utils.CreatePidFile(srv.runtime.config.Pidfile); err != nil { if err := utils.CreatePidFile(srv.runtime.config.Pidfile); err != nil {
log.Fatal(err) log.Fatal(err)
} }
defer utils.RemovePidFile(srv.runtime.config.Pidfile)
c := make(chan os.Signal, 1) c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, os.Kill, os.Signal(syscall.SIGTERM)) signal.Notify(c, os.Interrupt, os.Kill, os.Signal(syscall.SIGTERM))
go func() { go func() {
@ -66,8 +56,17 @@ func (srv *Server) Daemon() error {
srv.Close() srv.Close()
os.Exit(0) os.Exit(0)
}() }()
err = engine.Register("serveapi", func(job *engine.Job) string {
return srv.ListenAndServe(job.Args...).Error()
})
if err != nil {
return err.Error()
}
return "0"
}
protoAddrs := srv.runtime.config.ProtoAddresses
func (srv *Server) ListenAndServe(protoAddrs ...string) error {
chErrors := make(chan error, len(protoAddrs)) chErrors := make(chan error, len(protoAddrs))
for _, protoAddr := range protoAddrs { for _, protoAddr := range protoAddrs {
protoAddrParts := strings.SplitN(protoAddr, "://", 2) protoAddrParts := strings.SplitN(protoAddr, "://", 2)