Update kpod rm to use new container state

kpod rm now uses the new container state and runtime

Signed-off-by: Urvashi Mohnani <umohnani@redhat.com>

Closes: #58
Approved by: mheon
This commit is contained in:
Urvashi Mohnani
2017-11-21 15:31:20 -05:00
committed by Atomic Bot
parent 4ff251d911
commit 768fb6fe0f
3 changed files with 20 additions and 92 deletions

View File

@ -4,9 +4,7 @@ import (
"fmt" "fmt"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/projectatomic/libpod/libkpod"
"github.com/urfave/cli" "github.com/urfave/cli"
"golang.org/x/net/context"
) )
var ( var (
@ -30,40 +28,31 @@ var (
// saveCmd saves the image to either docker-archive or oci // saveCmd saves the image to either docker-archive or oci
func rmCmd(c *cli.Context) error { func rmCmd(c *cli.Context) error {
args := c.Args()
if len(args) == 0 {
return errors.Errorf("specify one or more containers to remove")
}
if err := validateFlags(c, rmFlags); err != nil { if err := validateFlags(c, rmFlags); err != nil {
return err return err
} }
config, err := getConfig(c) runtime, err := getRuntime(c)
if err != nil { if err != nil {
return errors.Wrapf(err, "could not get config") return errors.Wrapf(err, "Could not get runtime")
} }
server, err := libkpod.New(config) defer runtime.Shutdown(false)
if err != nil {
return errors.Wrapf(err, "could not get container server")
}
defer server.Shutdown()
err = server.Update()
if err != nil {
return errors.Wrapf(err, "could not update list of containers")
}
force := c.Bool("force")
for _, container := range c.Args() { args := c.Args()
id, err2 := server.Remove(context.Background(), container, force) if len(args) == 0 {
if err2 != nil { return errors.Errorf("specify one or more containers to remove")
if err == nil {
err = err2
} else {
err = errors.Wrapf(err, "%v. Stop the container before attempting removal or use -f\n", err2)
} }
} else {
fmt.Println(id) for _, container := range args {
ctr, err := runtime.LookupContainer(container)
if err != nil {
return errors.Wrapf(err, "error looking up container", container)
} }
err = runtime.RemoveContainer(ctr, c.Bool("force"))
if err != nil {
return errors.Wrapf(err, "error removing container %q", ctr.ID())
} }
return err fmt.Println(ctr.ID())
}
return nil
} }

View File

@ -1,53 +0,0 @@
package libkpod
import (
"os"
"path/filepath"
"github.com/pkg/errors"
"github.com/projectatomic/libpod/oci"
"golang.org/x/net/context"
)
// Remove removes a container
func (c *ContainerServer) Remove(ctx context.Context, container string, force bool) (string, error) {
ctr, err := c.LookupContainer(container)
if err != nil {
return "", err
}
ctrID := ctr.ID()
cStatus := c.runtime.ContainerStatus(ctr)
switch cStatus.Status {
case oci.ContainerStatePaused:
return "", errors.Errorf("cannot remove paused container %s", ctrID)
case oci.ContainerStateCreated, oci.ContainerStateRunning:
if force {
_, err = c.ContainerStop(ctx, container, 10)
if err != nil {
return "", errors.Wrapf(err, "unable to stop container %s", ctrID)
}
} else {
return "", errors.Errorf("cannot remove running container %s", ctrID)
}
}
if err := c.runtime.DeleteContainer(ctr); err != nil {
return "", errors.Wrapf(err, "failed to delete container %s", ctrID)
}
if err := os.Remove(filepath.Join(c.Config().RuntimeConfig.ContainerExitsDir, ctrID)); err != nil && !os.IsNotExist(err) {
return "", errors.Wrapf(err, "failed to remove container exit file %s", ctrID)
}
c.RemoveContainer(ctr)
if err := c.storageRuntimeServer.DeleteContainer(ctrID); err != nil {
return "", errors.Wrapf(err, "failed to delete storage for container %s", ctrID)
}
c.ReleaseContainerName(ctr.Name())
if err := c.ctrIDIndex.Delete(ctrID); err != nil {
return "", err
}
return ctrID, nil
}

View File

@ -59,21 +59,13 @@ function setup() {
} }
@test "remove a created container" { @test "remove a created container" {
skip "Test needs to be converted to kpod run" run ${KPOD_BINARY} ${KPOD_OPTIONS} create $BB ls
start_crio
run crioctl pod run --config "$TESTDATA"/sandbox_config.json
echo "$output"
[ "$status" -eq 0 ]
pod_id="$output"
run crioctl ctr create --config "$TESTDATA"/container_config.json --pod "$pod_id"
echo "$output" echo "$output"
[ "$status" -eq 0 ] [ "$status" -eq 0 ]
ctr_id="$output" ctr_id="$output"
run bash -c ${KPOD_BINARY} $KPOD_OPTIONS rm -f "$ctr_id" run bash -c ${KPOD_BINARY} $KPOD_OPTIONS rm -f "$ctr_id"
echo "$output" echo "$output"
[ "$status" -eq 0 ] [ "$status" -eq 0 ]
cleanup_pods
stop_crio
} }
@test "remove a running container" { @test "remove a running container" {