mirror of
https://github.com/containers/podman.git
synced 2025-07-04 01:48:28 +08:00
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:

committed by
Atomic Bot

parent
4ff251d911
commit
768fb6fe0f
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
|
||||||
}
|
|
@ -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" {
|
||||||
|
Reference in New Issue
Block a user