cli: fix pause-remove container

Instead of pausing the sanbox, this patch just pauses the container
allowing the communication with the agent. The communication with the agent
should be still possible even if all containers are paused, because of we don't
know when a new container can be created in the same sandbox.

Depends-on: github.com/kata-containers/agent#246

fixes #317

Signed-off-by: Julio Montes <julio.montes@intel.com>
This commit is contained in:
Julio Montes 2018-05-21 14:45:54 -05:00
parent b99cadb553
commit df05b2c5bd
4 changed files with 28 additions and 24 deletions

View File

@ -103,9 +103,9 @@ func kill(containerID, signal string, all bool) error {
return err return err
} }
// container MUST be created or running // container MUST be created, running or paused
if status.State.State != vc.StateReady && status.State.State != vc.StateRunning { if status.State.State != vc.StateReady && status.State.State != vc.StateRunning && status.State.State != vc.StatePaused {
return fmt.Errorf("Container %s not ready or running, cannot send a signal", containerID) return fmt.Errorf("Container %s not ready, running or paused, cannot send a signal", containerID)
} }
if err := vci.KillContainer(sandboxID, containerID, signum, all); err != nil { if err := vci.KillContainer(sandboxID, containerID, signum, all); err != nil {

View File

@ -312,7 +312,7 @@ func TestKillCLIFunctionInvalidSignalFailure(t *testing.T) {
execCLICommandFunc(assert, killCLICommand, set, true) execCLICommandFunc(assert, killCLICommand, set, true)
} }
func TestKillCLIFunctionInvalidStatePausedFailure(t *testing.T) { func TestKillCLIFunctionStatePausedSuccessful(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
state := vc.State{ state := vc.State{
@ -320,24 +320,27 @@ func TestKillCLIFunctionInvalidStatePausedFailure(t *testing.T) {
} }
testingImpl.KillContainerFunc = testKillContainerFuncReturnNil testingImpl.KillContainerFunc = testKillContainerFuncReturnNil
testingImpl.StopContainerFunc = testStopContainerFuncReturnNil
path, err := createTempContainerIDMapping(testContainerID, testSandboxID) path, err := createTempContainerIDMapping(testContainerID, testSandboxID)
assert.NoError(err) assert.NoError(err)
defer os.RemoveAll(path) defer os.RemoveAll(path)
testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) { testingImpl.StatusContainerFunc = func(sandboxID, containerID string) (vc.ContainerStatus, error) {
return newSingleContainerStatus(testContainerID, state, map[string]string{}), nil return newSingleContainerStatus(testContainerID, state,
map[string]string{string(vcAnnotations.ContainerTypeKey): string(vc.PodContainer)}), nil
} }
defer func() { defer func() {
testingImpl.KillContainerFunc = nil testingImpl.KillContainerFunc = nil
testingImpl.StatusContainerFunc = nil testingImpl.StatusContainerFunc = nil
testingImpl.StopContainerFunc = nil
}() }()
set := flag.NewFlagSet("", 0) set := flag.NewFlagSet("", 0)
set.Parse([]string{testContainerID}) set.Parse([]string{testContainerID})
execCLICommandFunc(assert, killCLICommand, set, true) execCLICommandFunc(assert, killCLICommand, set, false)
} }
func TestKillCLIFunctionInvalidStateStoppedFailure(t *testing.T) { func TestKillCLIFunctionInvalidStateStoppedFailure(t *testing.T) {

View File

@ -42,15 +42,17 @@ Where "<container-id>" is the container name to be resumed.`,
func toggleContainerPause(containerID string, pause bool) (err error) { func toggleContainerPause(containerID string, pause bool) (err error) {
// Checks the MUST and MUST NOT from OCI runtime specification // Checks the MUST and MUST NOT from OCI runtime specification
_, sandboxID, err := getExistingContainerInfo(containerID) status, sandboxID, err := getExistingContainerInfo(containerID)
if err != nil { if err != nil {
return err return err
} }
containerID = status.ID
if pause { if pause {
_, err = vci.PauseSandbox(sandboxID) err = vci.PauseContainer(sandboxID, containerID)
} else { } else {
_, err = vci.ResumeSandbox(sandboxID) err = vci.ResumeContainer(sandboxID, containerID)
} }
return err return err

View File

@ -12,17 +12,16 @@ import (
"testing" "testing"
vc "github.com/kata-containers/runtime/virtcontainers" vc "github.com/kata-containers/runtime/virtcontainers"
"github.com/kata-containers/runtime/virtcontainers/pkg/vcmock"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
var ( var (
testPauseSandboxFuncReturnNil = func(sandboxID string) (vc.VCSandbox, error) { testPauseContainerFuncReturnNil = func(sandboxID, containerID string) error {
return &vcmock.Sandbox{}, nil return nil
} }
testResumeSandboxFuncReturnNil = func(sandboxID string) (vc.VCSandbox, error) { testResumeContainerFuncReturnNil = func(sandboxID, containerID string) error {
return &vcmock.Sandbox{}, nil return nil
} }
) )
@ -33,7 +32,7 @@ func TestPauseCLIFunctionSuccessful(t *testing.T) {
State: vc.StateRunning, State: vc.StateRunning,
} }
testingImpl.PauseSandboxFunc = testPauseSandboxFuncReturnNil testingImpl.PauseContainerFunc = testPauseContainerFuncReturnNil
path, err := createTempContainerIDMapping(testContainerID, testSandboxID) path, err := createTempContainerIDMapping(testContainerID, testSandboxID)
assert.NoError(err) assert.NoError(err)
@ -44,7 +43,7 @@ func TestPauseCLIFunctionSuccessful(t *testing.T) {
} }
defer func() { defer func() {
testingImpl.PauseSandboxFunc = nil testingImpl.PauseContainerFunc = nil
testingImpl.StatusContainerFunc = nil testingImpl.StatusContainerFunc = nil
}() }()
@ -57,7 +56,7 @@ func TestPauseCLIFunctionSuccessful(t *testing.T) {
func TestPauseCLIFunctionContainerNotExistFailure(t *testing.T) { func TestPauseCLIFunctionContainerNotExistFailure(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
testingImpl.PauseSandboxFunc = testPauseSandboxFuncReturnNil testingImpl.PauseContainerFunc = testPauseContainerFuncReturnNil
path, err := ioutil.TempDir("", "containers-mapping") path, err := ioutil.TempDir("", "containers-mapping")
assert.NoError(err) assert.NoError(err)
@ -65,7 +64,7 @@ func TestPauseCLIFunctionContainerNotExistFailure(t *testing.T) {
ctrsMapTreePath = path ctrsMapTreePath = path
defer func() { defer func() {
testingImpl.PauseSandboxFunc = nil testingImpl.PauseContainerFunc = nil
}() }()
set := flag.NewFlagSet("", 0) set := flag.NewFlagSet("", 0)
@ -74,7 +73,7 @@ func TestPauseCLIFunctionContainerNotExistFailure(t *testing.T) {
execCLICommandFunc(assert, pauseCLICommand, set, true) execCLICommandFunc(assert, pauseCLICommand, set, true)
} }
func TestPauseCLIFunctionPauseSandboxFailure(t *testing.T) { func TestPauseCLIFunctionPauseContainerFailure(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
state := vc.State{ state := vc.State{
@ -106,7 +105,7 @@ func TestResumeCLIFunctionSuccessful(t *testing.T) {
State: vc.StateRunning, State: vc.StateRunning,
} }
testingImpl.ResumeSandboxFunc = testResumeSandboxFuncReturnNil testingImpl.ResumeContainerFunc = testResumeContainerFuncReturnNil
path, err := createTempContainerIDMapping(testContainerID, testSandboxID) path, err := createTempContainerIDMapping(testContainerID, testSandboxID)
assert.NoError(err) assert.NoError(err)
@ -117,7 +116,7 @@ func TestResumeCLIFunctionSuccessful(t *testing.T) {
} }
defer func() { defer func() {
testingImpl.ResumeSandboxFunc = nil testingImpl.ResumeContainerFunc = nil
testingImpl.StatusContainerFunc = nil testingImpl.StatusContainerFunc = nil
}() }()
@ -130,14 +129,14 @@ func TestResumeCLIFunctionSuccessful(t *testing.T) {
func TestResumeCLIFunctionContainerNotExistFailure(t *testing.T) { func TestResumeCLIFunctionContainerNotExistFailure(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
testingImpl.ResumeSandboxFunc = testResumeSandboxFuncReturnNil testingImpl.ResumeContainerFunc = testResumeContainerFuncReturnNil
path, err := createTempContainerIDMapping(testContainerID, testSandboxID) path, err := createTempContainerIDMapping(testContainerID, testSandboxID)
assert.NoError(err) assert.NoError(err)
defer os.RemoveAll(path) defer os.RemoveAll(path)
defer func() { defer func() {
testingImpl.ResumeSandboxFunc = nil testingImpl.ResumeContainerFunc = nil
}() }()
set := flag.NewFlagSet("", 0) set := flag.NewFlagSet("", 0)
@ -146,7 +145,7 @@ func TestResumeCLIFunctionContainerNotExistFailure(t *testing.T) {
execCLICommandFunc(assert, resumeCLICommand, set, true) execCLICommandFunc(assert, resumeCLICommand, set, true)
} }
func TestResumeCLIFunctionPauseSandboxFailure(t *testing.T) { func TestResumeCLIFunctionPauseContainerFailure(t *testing.T) {
assert := assert.New(t) assert := assert.New(t)
state := vc.State{ state := vc.State{