|
@@ -40,7 +40,7 @@ func init() {
|
|
|
// 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(job.Eng, ConfigFromJob(job))
|
|
|
if err != nil {
|
|
|
return err.Error()
|
|
|
}
|
|
@@ -56,17 +56,19 @@ func jobInitApi(job *engine.Job) string {
|
|
|
srv.Close()
|
|
|
os.Exit(0)
|
|
|
}()
|
|
|
- err = engine.Register("serveapi", func(job *engine.Job) string {
|
|
|
- return srv.ListenAndServe(job.Args...).Error()
|
|
|
- })
|
|
|
- if err != nil {
|
|
|
+ job.Eng.Hack_SetGlobalVar("httpapi.server", srv)
|
|
|
+ if err := engine.Register("start", srv.ContainerStart); err != nil {
|
|
|
+ return err.Error()
|
|
|
+ }
|
|
|
+ if err := engine.Register("serveapi", srv.ListenAndServe); err != nil {
|
|
|
return err.Error()
|
|
|
}
|
|
|
return "0"
|
|
|
}
|
|
|
|
|
|
|
|
|
-func (srv *Server) ListenAndServe(protoAddrs ...string) error {
|
|
|
+func (srv *Server) ListenAndServe(job *engine.Job) string {
|
|
|
+ protoAddrs := job.Args
|
|
|
chErrors := make(chan error, len(protoAddrs))
|
|
|
for _, protoAddr := range protoAddrs {
|
|
|
protoAddrParts := strings.SplitN(protoAddr, "://", 2)
|
|
@@ -80,7 +82,7 @@ func (srv *Server) ListenAndServe(protoAddrs ...string) error {
|
|
|
log.Println("/!\\ DON'T BIND ON ANOTHER IP ADDRESS THAN 127.0.0.1 IF YOU DON'T KNOW WHAT YOU'RE DOING /!\\")
|
|
|
}
|
|
|
default:
|
|
|
- return fmt.Errorf("Invalid protocol format.")
|
|
|
+ return "Invalid protocol format."
|
|
|
}
|
|
|
go func() {
|
|
|
chErrors <- ListenAndServe(protoAddrParts[0], protoAddrParts[1], srv, true)
|
|
@@ -89,10 +91,10 @@ func (srv *Server) ListenAndServe(protoAddrs ...string) error {
|
|
|
for i := 0; i < len(protoAddrs); i += 1 {
|
|
|
err := <-chErrors
|
|
|
if err != nil {
|
|
|
- return err
|
|
|
+ return err.Error()
|
|
|
}
|
|
|
}
|
|
|
- return nil
|
|
|
+ return "0"
|
|
|
}
|
|
|
|
|
|
func (srv *Server) DockerVersion() APIVersion {
|
|
@@ -1282,8 +1284,7 @@ func (srv *Server) RegisterLinks(name string, hostConfig *HostConfig) error {
|
|
|
return fmt.Errorf("No such container: %s", name)
|
|
|
}
|
|
|
|
|
|
- // Register links
|
|
|
- if hostConfig != nil && hostConfig.Links != nil {
|
|
|
+ if hostConfig.Links != nil {
|
|
|
for _, l := range hostConfig.Links {
|
|
|
parts, err := parseLink(l)
|
|
|
if err != nil {
|
|
@@ -1296,7 +1297,6 @@ func (srv *Server) RegisterLinks(name string, hostConfig *HostConfig) error {
|
|
|
if child == nil {
|
|
|
return fmt.Errorf("Could not get container for %s", parts["name"])
|
|
|
}
|
|
|
-
|
|
|
if err := runtime.RegisterLink(container, child, parts["alias"]); err != nil {
|
|
|
return err
|
|
|
}
|
|
@@ -1312,22 +1312,36 @@ func (srv *Server) RegisterLinks(name string, hostConfig *HostConfig) error {
|
|
|
return nil
|
|
|
}
|
|
|
|
|
|
-func (srv *Server) ContainerStart(name string, hostConfig *HostConfig) error {
|
|
|
+func (srv *Server) ContainerStart(job *engine.Job) string {
|
|
|
+ if len(job.Args) < 1 {
|
|
|
+ return fmt.Sprintf("Usage: %s container_id", job.Name)
|
|
|
+ }
|
|
|
+ name := job.Args[0]
|
|
|
runtime := srv.runtime
|
|
|
container := runtime.Get(name)
|
|
|
if container == nil {
|
|
|
- return fmt.Errorf("No such container: %s", name)
|
|
|
+ return fmt.Sprintf("No such container: %s", name)
|
|
|
}
|
|
|
- if hostConfig != nil {
|
|
|
- container.hostConfig = hostConfig
|
|
|
+ // If no environment was set, then no hostconfig was passed.
|
|
|
+ if len(job.Environ()) > 0 {
|
|
|
+ var hostConfig HostConfig
|
|
|
+ if err := job.ExportEnv(&hostConfig); err != nil {
|
|
|
+ return err.Error()
|
|
|
+ }
|
|
|
+ // Register any links from the host config before starting the container
|
|
|
+ // FIXME: we could just pass the container here, no need to lookup by name again.
|
|
|
+ if err := srv.RegisterLinks(name, &hostConfig); err != nil {
|
|
|
+ return err.Error()
|
|
|
+ }
|
|
|
+ container.hostConfig = &hostConfig
|
|
|
container.ToDisk()
|
|
|
}
|
|
|
if err := container.Start(); err != nil {
|
|
|
- return fmt.Errorf("Cannot start container %s: %s", name, err)
|
|
|
+ return fmt.Sprintf("Cannot start container %s: %s", name, err)
|
|
|
}
|
|
|
srv.LogEvent("start", container.ShortID(), runtime.repositories.ImageName(container.Image))
|
|
|
|
|
|
- return nil
|
|
|
+ return "0"
|
|
|
}
|
|
|
|
|
|
func (srv *Server) ContainerStop(name string, t int) error {
|
|
@@ -1478,12 +1492,13 @@ func (srv *Server) ContainerCopy(name string, resource string, out io.Writer) er
|
|
|
|
|
|
}
|
|
|
|
|
|
-func NewServer(config *DaemonConfig) (*Server, error) {
|
|
|
+func NewServer(eng *engine.Engine, config *DaemonConfig) (*Server, error) {
|
|
|
runtime, err := NewRuntime(config)
|
|
|
if err != nil {
|
|
|
return nil, err
|
|
|
}
|
|
|
srv := &Server{
|
|
|
+ Eng: eng,
|
|
|
runtime: runtime,
|
|
|
pullingPool: make(map[string]struct{}),
|
|
|
pushingPool: make(map[string]struct{}),
|
|
@@ -1527,4 +1542,5 @@ type Server struct {
|
|
|
events []utils.JSONMessage
|
|
|
listeners map[string]chan utils.JSONMessage
|
|
|
reqFactory *utils.HTTPRequestFactory
|
|
|
+ Eng *engine.Engine
|
|
|
}
|