Modify pod API to move Init() into Start()

Separate Init() and Start() does not make sense on the pod side,
where we may have to start containers in order to initialize
others due to dependency orders.

Also adjusts internal containers API for more code sharing.

Signed-off-by: Matthew Heon <matthew.heon@gmail.com>

Closes: #478
Approved by: rhatdan
This commit is contained in:
Matthew Heon
2018-03-12 15:32:10 -04:00
committed by Atomic Bot
parent 58c35daea2
commit 40d302be8f
3 changed files with 233 additions and 56 deletions

View File

@ -59,35 +59,11 @@ func (c *Container) Init() (err error) {
}
}()
if err := c.makeBindMounts(); err != nil {
return err
}
// Generate the OCI spec
spec, err := c.generateSpec()
if err != nil {
return err
}
// Save the OCI spec to disk
if err := c.saveSpec(spec); err != nil {
return err
}
// With the spec complete, do an OCI create
if err := c.runtime.ociRuntime.createContainer(c, c.config.CgroupParent); err != nil {
return err
}
logrus.Debugf("Created container %s in OCI runtime", c.ID())
c.state.State = ContainerStateCreated
return c.save()
return c.init()
}
// Start starts a container
func (c *Container) Start() error {
func (c *Container) Start() (err error) {
if !c.locked {
c.lock.Lock()
defer c.lock.Unlock()
@ -107,20 +83,33 @@ func (c *Container) Start() error {
return errors.Wrapf(ErrNotImplemented, "restarting a stopped container is not yet supported")
}
// Mount storage for the container
// Mount storage for the container if necessary
if err := c.mountStorage(); err != nil {
return err
}
defer func() {
if err != nil {
if err2 := c.cleanupStorage(); err2 != nil {
logrus.Errorf("Error cleaning up storage for container %s: %v", c.ID(), err2)
}
}
}()
if err := c.runtime.ociRuntime.startContainer(c); err != nil {
return err
// Create a network namespace if necessary
if c.config.CreateNetNS && c.state.NetNS == nil {
if err := c.runtime.createNetNS(c); err != nil {
return err
}
}
defer func() {
if err != nil {
if err2 := c.runtime.teardownNetNS(c); err2 != nil {
logrus.Errorf("Error tearing down network namespace for container %s: %v", c.ID(), err2)
}
}
}()
logrus.Debugf("Started container %s", c.ID())
c.state.State = ContainerStateRunning
return c.save()
return c.start()
}
// Stop uses the container's stop signal (or SIGTERM if no signal was specified)
@ -138,6 +127,12 @@ func (c *Container) Stop() error {
}
}
if c.state.State == ContainerStateConfigured ||
c.state.State == ContainerStateUnknown ||
c.state.State == ContainerStatePaused {
return errors.Wrapf(ErrCtrStateInvalid, "can only stop created, running, or stopped containers")
}
return c.stop(c.config.StopTimeout)
}
@ -154,6 +149,12 @@ func (c *Container) StopWithTimeout(timeout uint) error {
}
}
if c.state.State == ContainerStateConfigured ||
c.state.State == ContainerStateUnknown ||
c.state.State == ContainerStatePaused {
return errors.Wrapf(ErrCtrStateInvalid, "can only stop created, running, or stopped containers")
}
return c.stop(timeout)
}