mirror of https://github.com/containers/podman.git
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:
parent
91b406ea4a
commit
2a3934f1da
|
@ -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,
|
|
||||||
container: container,
|
|
||||||
}
|
|
||||||
|
|
||||||
return exportContainer(store, opts)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 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 {
|
if err != nil {
|
||||||
return errors.Wrapf(err, "error finding container %q", opts.container)
|
return errors.Wrapf(err, "error looking up container %q", args[0])
|
||||||
}
|
|
||||||
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)
|
return ctr.Export(output)
|
||||||
if err != nil {
|
|
||||||
return errors.Wrapf(err, "error creating file %q", opts.output)
|
|
||||||
}
|
|
||||||
defer outFile.Close()
|
|
||||||
|
|
||||||
_, err = io.Copy(outFile, input)
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue