Integrate containers/storage
Use containers/storage to store images, pod sandboxes, and containers. A pod sandbox's infrastructure container has the same ID as the pod to which it belongs, and all containers also keep track of their pod's ID. The container configuration that we build using the data in a CreateContainerRequest is stored in the container's ContainerDirectory and ContainerRunDirectory. We catch SIGTERM and SIGINT, and when we receive either, we gracefully exit the grpc loop. If we also think that there aren't any container filesystems in use, we attempt to do a clean shutdown of the storage driver. The test harness now waits for ocid to exit before attempting to delete the storage root directory. Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
This commit is contained in:
parent
caee4a99c9
commit
c0333b102b
29 changed files with 637 additions and 372 deletions
|
@ -4,13 +4,9 @@ import (
|
|||
"bytes"
|
||||
"fmt"
|
||||
"io"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"syscall"
|
||||
|
||||
"github.com/Sirupsen/logrus"
|
||||
)
|
||||
|
||||
// ExecCmd executes a command with args and returns its output as a string along
|
||||
|
@ -54,74 +50,7 @@ func Prctl(option int, arg2, arg3, arg4, arg5 uintptr) (err error) {
|
|||
return
|
||||
}
|
||||
|
||||
// CreateFakeRootfs creates a fake rootfs for test.
|
||||
func CreateFakeRootfs(dir string, image string) error {
|
||||
if len(image) <= 9 || image[:9] != "docker://" {
|
||||
return fmt.Errorf("CreateFakeRootfs only support docker images currently")
|
||||
}
|
||||
|
||||
rootfs := filepath.Join(dir, "rootfs")
|
||||
if err := os.MkdirAll(rootfs, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// docker export $(docker create image[9:]) | tar -C rootfs -xf -
|
||||
return dockerExport(image[9:], rootfs)
|
||||
}
|
||||
|
||||
// CreateInfraRootfs creates a rootfs similar to CreateFakeRootfs, but only
|
||||
// copies a single binary from the host into the rootfs. This is all done
|
||||
// without Docker, and is only used currently for the pause container which is
|
||||
// required for all sandboxes.
|
||||
func CreateInfraRootfs(dir string, src string) error {
|
||||
rootfs := filepath.Join(dir, "rootfs")
|
||||
if err := os.MkdirAll(rootfs, 0755); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
dest := filepath.Join(rootfs, filepath.Base(src))
|
||||
logrus.Debugf("copying infra rootfs binary: %v -> %v", src, dest)
|
||||
|
||||
in, err := os.OpenFile(src, os.O_RDONLY, 0755)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer in.Close()
|
||||
|
||||
out, err := os.OpenFile(dest, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0755)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer out.Close()
|
||||
|
||||
if _, err := io.Copy(out, in); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return out.Sync()
|
||||
}
|
||||
|
||||
func dockerExport(image string, rootfs string) error {
|
||||
out, err := ExecCmd("docker", "create", image)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
container := out[:strings.Index(out, "\n")]
|
||||
|
||||
cmd := fmt.Sprintf("docker export %s | tar -C %s -xf -", container, rootfs)
|
||||
if _, err := ExecCmd("/bin/bash", "-c", cmd); err != nil {
|
||||
err1 := dockerRemove(container)
|
||||
if err1 == nil {
|
||||
return err
|
||||
}
|
||||
return fmt.Errorf("%v; %v", err, err1)
|
||||
}
|
||||
|
||||
return dockerRemove(container)
|
||||
}
|
||||
|
||||
func dockerRemove(container string) error {
|
||||
_, err := ExecCmd("docker", "rm", container)
|
||||
return err
|
||||
// StatusToExitCode converts wait status code to an exit code
|
||||
func StatusToExitCode(status int) int {
|
||||
return ((status) & 0xff00) >> 8
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue