From 80f3272ee9957c537271462a688a7de88aaa92c0 Mon Sep 17 00:00:00 2001 From: Solomon Hykes Date: Thu, 31 Jul 2014 20:36:42 +0000 Subject: [PATCH] Move "create" to daemon/create.go This is part of an effort to break apart the deprecated server/ package Docker-DCO-1.1-Signed-off-by: Solomon Hykes (github: shykes) --- daemon/create.go | 86 +++++++++++++++++++++++++++++++++++++++++++++ daemon/daemon.go | 35 ++---------------- server/container.go | 48 ------------------------- server/init.go | 1 - 4 files changed, 89 insertions(+), 81 deletions(-) create mode 100644 daemon/create.go diff --git a/daemon/create.go b/daemon/create.go new file mode 100644 index 0000000000..8d008f8ade --- /dev/null +++ b/daemon/create.go @@ -0,0 +1,86 @@ +package daemon + +import ( + "github.com/docker/docker/engine" + "github.com/docker/docker/graph" + "github.com/docker/docker/pkg/parsers" + "github.com/docker/docker/runconfig" +) + +func (daemon *Daemon) ContainerCreate(job *engine.Job) engine.Status { + var name string + if len(job.Args) == 1 { + name = job.Args[0] + } else if len(job.Args) > 1 { + return job.Errorf("Usage: %s", job.Name) + } + config := runconfig.ContainerConfigFromJob(job) + if config.Memory != 0 && config.Memory < 524288 { + return job.Errorf("Minimum memory limit allowed is 512k") + } + if config.Memory > 0 && !daemon.SystemConfig().MemoryLimit { + job.Errorf("Your kernel does not support memory limit capabilities. Limitation discarded.\n") + config.Memory = 0 + } + if config.Memory > 0 && !daemon.SystemConfig().SwapLimit { + job.Errorf("Your kernel does not support swap limit capabilities. Limitation discarded.\n") + config.MemorySwap = -1 + } + container, buildWarnings, err := daemon.Create(config, name) + if err != nil { + if daemon.Graph().IsNotExist(err) { + _, tag := parsers.ParseRepositoryTag(config.Image) + if tag == "" { + tag = graph.DEFAULTTAG + } + return job.Errorf("No such image: %s (tag: %s)", config.Image, tag) + } + return job.Error(err) + } + if !container.Config.NetworkDisabled && daemon.SystemConfig().IPv4ForwardingDisabled { + job.Errorf("IPv4 forwarding is disabled.\n") + } + job.Eng.Job("log", "create", container.ID, daemon.Repositories().ImageName(container.Image)).Run() + // FIXME: this is necessary because daemon.Create might return a nil container + // with a non-nil error. This should not happen! Once it's fixed we + // can remove this workaround. + if container != nil { + job.Printf("%s\n", container.ID) + } + for _, warning := range buildWarnings { + job.Errorf("%s\n", warning) + } + return engine.StatusOK +} + +// Create creates a new container from the given configuration with a given name. +func (daemon *Daemon) Create(config *runconfig.Config, name string) (*Container, []string, error) { + var ( + container *Container + warnings []string + ) + + img, err := daemon.repositories.LookupImage(config.Image) + if err != nil { + return nil, nil, err + } + if err := daemon.checkImageDepth(img); err != nil { + return nil, nil, err + } + if warnings, err = daemon.mergeAndVerifyConfig(config, img); err != nil { + return nil, nil, err + } + if container, err = daemon.newContainer(name, config, img); err != nil { + return nil, nil, err + } + if err := daemon.createRootfs(container, img); err != nil { + return nil, nil, err + } + if err := container.ToDisk(); err != nil { + return nil, nil, err + } + if err := daemon.Register(container); err != nil { + return nil, nil, err + } + return container, warnings, nil +} diff --git a/daemon/daemon.go b/daemon/daemon.go index 39c2eec15b..b111331415 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -123,6 +123,9 @@ func (daemon *Daemon) Install(eng *engine.Engine) error { if err := eng.Register("export", daemon.ContainerExport); err != nil { return err } + if err := eng.Register("create", daemon.ContainerCreate); err != nil { + return err + } return nil } @@ -403,38 +406,6 @@ func (daemon *Daemon) restore() error { return nil } -// Create creates a new container from the given configuration with a given name. -func (daemon *Daemon) Create(config *runconfig.Config, name string) (*Container, []string, error) { - var ( - container *Container - warnings []string - ) - - img, err := daemon.repositories.LookupImage(config.Image) - if err != nil { - return nil, nil, err - } - if err := daemon.checkImageDepth(img); err != nil { - return nil, nil, err - } - if warnings, err = daemon.mergeAndVerifyConfig(config, img); err != nil { - return nil, nil, err - } - if container, err = daemon.newContainer(name, config, img); err != nil { - return nil, nil, err - } - if err := daemon.createRootfs(container, img); err != nil { - return nil, nil, err - } - if err := container.ToDisk(); err != nil { - return nil, nil, err - } - if err := daemon.Register(container); err != nil { - return nil, nil, err - } - return container, warnings, nil -} - func (daemon *Daemon) checkImageDepth(img *image.Image) error { // We add 2 layers to the depth because the container's rw and // init layer add to the restriction diff --git a/server/container.go b/server/container.go index cef405387c..64b942e208 100644 --- a/server/container.go +++ b/server/container.go @@ -21,9 +21,7 @@ import ( "github.com/docker/docker/daemon" "github.com/docker/docker/engine" - "github.com/docker/docker/graph" "github.com/docker/docker/pkg/graphdb" - "github.com/docker/docker/pkg/parsers" "github.com/docker/docker/pkg/tailfile" "github.com/docker/docker/runconfig" "github.com/docker/docker/utils" @@ -263,52 +261,6 @@ func (srv *Server) ContainerCommit(job *engine.Job) engine.Status { return engine.StatusOK } -func (srv *Server) ContainerCreate(job *engine.Job) engine.Status { - var name string - if len(job.Args) == 1 { - name = job.Args[0] - } else if len(job.Args) > 1 { - return job.Errorf("Usage: %s", job.Name) - } - config := runconfig.ContainerConfigFromJob(job) - if config.Memory != 0 && config.Memory < 524288 { - return job.Errorf("Minimum memory limit allowed is 512k") - } - if config.Memory > 0 && !srv.daemon.SystemConfig().MemoryLimit { - job.Errorf("Your kernel does not support memory limit capabilities. Limitation discarded.\n") - config.Memory = 0 - } - if config.Memory > 0 && !srv.daemon.SystemConfig().SwapLimit { - job.Errorf("Your kernel does not support swap limit capabilities. Limitation discarded.\n") - config.MemorySwap = -1 - } - container, buildWarnings, err := srv.daemon.Create(config, name) - if err != nil { - if srv.daemon.Graph().IsNotExist(err) { - _, tag := parsers.ParseRepositoryTag(config.Image) - if tag == "" { - tag = graph.DEFAULTTAG - } - return job.Errorf("No such image: %s (tag: %s)", config.Image, tag) - } - return job.Error(err) - } - if !container.Config.NetworkDisabled && srv.daemon.SystemConfig().IPv4ForwardingDisabled { - job.Errorf("IPv4 forwarding is disabled.\n") - } - srv.LogEvent("create", container.ID, srv.daemon.Repositories().ImageName(container.Image)) - // FIXME: this is necessary because daemon.Create might return a nil container - // with a non-nil error. This should not happen! Once it's fixed we - // can remove this workaround. - if container != nil { - job.Printf("%s\n", container.ID) - } - for _, warning := range buildWarnings { - job.Errorf("%s\n", warning) - } - return engine.StatusOK -} - func (srv *Server) ContainerRestart(job *engine.Job) engine.Status { if len(job.Args) != 1 { return job.Errorf("Usage: %s CONTAINER\n", job.Name) diff --git a/server/init.go b/server/init.go index a172d55c68..9ad5e41359 100644 --- a/server/init.go +++ b/server/init.go @@ -86,7 +86,6 @@ func InitServer(job *engine.Job) engine.Status { job.Eng.Hack_SetGlobalVar("httpapi.daemon", srv.daemon) for name, handler := range map[string]engine.Handler{ - "create": srv.ContainerCreate, "stop": srv.ContainerStop, "restart": srv.ContainerRestart, "start": srv.ContainerStart,