Update kpod export to use the new container state and runtime

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

Closes: #59
Approved by: rhatdan
This commit is contained in:
Urvashi Mohnani 2017-11-21 16:51:17 -05:00 committed by Atomic Bot
parent 91b406ea4a
commit 2a3934f1da
4 changed files with 57 additions and 67 deletions

View File

@ -1,13 +1,8 @@
package main package main
import ( import (
"io"
"os" "os"
"fmt"
"github.com/containers/storage"
"github.com/containers/storage/pkg/archive"
"github.com/pkg/errors" "github.com/pkg/errors"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
"github.com/urfave/cli" "github.com/urfave/cli"
@ -40,6 +35,16 @@ var (
// exportCmd saves a container to a tarball on disk // exportCmd saves a container to a tarball on disk
func exportCmd(c *cli.Context) error { func exportCmd(c *cli.Context) error {
if err := validateFlags(c, exportFlags); err != nil {
return err
}
runtime, err := getRuntime(c)
if err != nil {
return errors.Wrapf(err, "could not get runtime")
}
defer runtime.Shutdown(false)
args := c.Args() args := c.Args()
if len(args) == 0 { if len(args) == 0 {
return errors.Errorf("container id must be specified") return errors.Errorf("container id must be specified")
@ -47,19 +52,6 @@ func exportCmd(c *cli.Context) error {
if len(args) > 1 { if len(args) > 1 {
return errors.Errorf("too many arguments given, need 1 at most.") return errors.Errorf("too many arguments given, need 1 at most.")
} }
container := args[0]
if err := validateFlags(c, exportFlags); err != nil {
return err
}
config, err := getConfig(c)
if err != nil {
return errors.Wrapf(err, "could not get config")
}
store, err := getStore(config)
if err != nil {
return err
}
output := c.String("output") output := c.String("output")
if output == "/dev/stdout" { if output == "/dev/stdout" {
@ -69,38 +61,10 @@ func exportCmd(c *cli.Context) error {
} }
} }
opts := exportOptions{ ctr, err := runtime.LookupContainer(args[0])
output: output, if err != nil {
container: container, return errors.Wrapf(err, "error looking up container %q", args[0])
} }
return exportContainer(store, opts) return ctr.Export(output)
}
// exportContainer exports the contents of a container and saves it as
// a tarball on disk
func exportContainer(store storage.Store, opts exportOptions) error {
mountPoint, err := store.Mount(opts.container, "")
if err != nil {
return errors.Wrapf(err, "error finding container %q", opts.container)
}
defer func() {
if err := store.Unmount(opts.container); err != nil {
fmt.Printf("error unmounting container %q: %v\n", opts.container, err)
}
}()
input, err := archive.Tar(mountPoint, archive.Uncompressed)
if err != nil {
return errors.Wrapf(err, "error reading container directory %q", opts.container)
}
outFile, err := os.Create(opts.output)
if err != nil {
return errors.Wrapf(err, "error creating file %q", opts.output)
}
defer outFile.Close()
_, err = io.Copy(outFile, input)
return err
} }

View File

@ -34,7 +34,7 @@ func rmCmd(c *cli.Context) error {
runtime, err := getRuntime(c) runtime, err := getRuntime(c)
if err != nil { if err != nil {
return errors.Wrapf(err, "Could not get runtime") return errors.Wrapf(err, "could not get runtime")
} }
defer runtime.Shutdown(false) defer runtime.Shutdown(false)

View File

@ -3,12 +3,15 @@ package libpod
import ( import (
"encoding/json" "encoding/json"
"fmt" "fmt"
"io"
"io/ioutil" "io/ioutil"
"os"
"path/filepath" "path/filepath"
"sync" "sync"
"time" "time"
"github.com/containers/storage" "github.com/containers/storage"
"github.com/containers/storage/pkg/archive"
"github.com/docker/docker/pkg/stringid" "github.com/docker/docker/pkg/stringid"
"github.com/docker/docker/pkg/term" "github.com/docker/docker/pkg/term"
spec "github.com/opencontainers/runtime-spec/specs-go" spec "github.com/opencontainers/runtime-spec/specs-go"
@ -469,7 +472,40 @@ func (c *Container) Unpause() error {
// Export exports a container's root filesystem as a tar archive // Export exports a container's root filesystem as a tar archive
// The archive will be saved as a file at the given path // The archive will be saved as a file at the given path
func (c *Container) Export(path string) error { func (c *Container) Export(path string) error {
return ErrNotImplemented c.lock.Lock()
defer c.lock.Unlock()
if err := c.syncContainer(); err != nil {
return err
}
mountPoint := c.state.Mountpoint
if !c.state.Mounted {
mount, err := c.runtime.store.Mount(c.ID(), c.config.MountLabel)
if err != nil {
return errors.Wrapf(err, "error mounting container %q", c.ID())
}
mountPoint = mount
defer func() {
if err := c.runtime.store.Unmount(c.ID()); err != nil {
logrus.Errorf("error unmounting container %q: %v", c.ID(), err)
}
}()
}
input, err := archive.Tar(mountPoint, archive.Uncompressed)
if err != nil {
return errors.Wrapf(err, "error reading container directory %q", c.ID())
}
outFile, err := os.Create(path)
if err != nil {
return errors.Wrapf(err, "error creating file %q", path)
}
defer outFile.Close()
_, err = io.Copy(outFile, input)
return err
} }
// Commit commits the changes between a container and its image, creating a new // Commit commits the changes between a container and its image, creating a new

View File

@ -2,7 +2,6 @@
load helpers load helpers
IMAGE="redis:alpine"
function teardown() { function teardown() {
cleanup_test cleanup_test
} }
@ -12,24 +11,15 @@ function setup() {
} }
@test "kpod export output flag" { @test "kpod export output flag" {
skip "Test needs to be converted to kpod run bash -c" run bash -c "${KPOD_BINARY} ${KPOD_OPTIONS} create $BB ls"
start_crio
run bash -c crioctl pod run bash -c --config "$TESTDATA"/sandbox_config.json
echo "$output"
[ "$status" -eq 0 ]
pod_id="$output"
run bash -c crioctl image pull "$IMAGE"
echo "$output"
[ "$status" -eq 0 ]
run bash -c 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} export -o container.tar "$ctr_id" run bash -c "${KPOD_BINARY} ${KPOD_OPTIONS} export -o container.tar $ctr_id"
echo "$output"
[ "$status" -eq 0 ]
run bash -c "${KPOD_BINARY} ${KPOD_OPTIONS} rm $ctr_id"
echo "$output" echo "$output"
[ "$status" -eq 0 ] [ "$status" -eq 0 ]
cleanup_ctrs
cleanup_pods
stop_crio
rm -f container.tar rm -f container.tar
} }