99 lines
2.1 KiB
Go
99 lines
2.1 KiB
Go
|
package validation
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
"os/exec"
|
||
|
"path/filepath"
|
||
|
"testing"
|
||
|
|
||
|
"github.com/mrunalp/fileutils"
|
||
|
"github.com/opencontainers/runtime-tools/generate"
|
||
|
"github.com/satori/go.uuid"
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
runtime = "runc"
|
||
|
)
|
||
|
|
||
|
func init() {
|
||
|
runtime = os.Getenv("RUNTIME")
|
||
|
}
|
||
|
|
||
|
func runtimeValidate(runtime string, g *generate.Generator) error {
|
||
|
// Find the runtime binary in the PATH
|
||
|
runtimePath, err := exec.LookPath(runtime)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// Setup a temporary test directory
|
||
|
tmpDir, err := ioutil.TempDir("", "ocitest")
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer os.RemoveAll(tmpDir)
|
||
|
|
||
|
// Create bundle directory for the test container
|
||
|
bundleDir := tmpDir + "/busybox"
|
||
|
if err := os.MkdirAll(bundleDir, 0755); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// Untar the root fs
|
||
|
untarCmd := exec.Command("tar", "-xf", "../rootfs.tar.gz", "-C", bundleDir)
|
||
|
output, err := untarCmd.CombinedOutput()
|
||
|
if err != nil {
|
||
|
fmt.Println(string(output))
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// Copy the runtimetest binary to the rootfs
|
||
|
err = fileutils.CopyFile("../runtimetest", filepath.Join(bundleDir, "runtimetest"))
|
||
|
|
||
|
// Generate test configuration
|
||
|
err = g.SaveToFile(filepath.Join(bundleDir, "config.json"), generate.ExportOptions{})
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
// TODO: Use a library to split run into create/start
|
||
|
// Launch the OCI runtime
|
||
|
containerID := uuid.NewV4()
|
||
|
runtimeCmd := exec.Command(runtimePath, "run", containerID.String())
|
||
|
runtimeCmd.Dir = bundleDir
|
||
|
runtimeCmd.Stdin = os.Stdin
|
||
|
runtimeCmd.Stdout = os.Stdout
|
||
|
runtimeCmd.Stderr = os.Stderr
|
||
|
if err = runtimeCmd.Run(); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
func getDefaultGenerator() *generate.Generator {
|
||
|
g := generate.New()
|
||
|
g.SetRootPath(".")
|
||
|
g.SetProcessArgs([]string{"/runtimetest"})
|
||
|
return &g
|
||
|
}
|
||
|
|
||
|
func TestValidateBasic(t *testing.T) {
|
||
|
g := getDefaultGenerator()
|
||
|
|
||
|
if err := runtimeValidate(runtime, g); err != nil {
|
||
|
t.Errorf("%s failed validation: %v", runtime, err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestValidateSysctls(t *testing.T) {
|
||
|
g := getDefaultGenerator()
|
||
|
g.AddLinuxSysctl("net.ipv4.ip_forward", "1")
|
||
|
|
||
|
if err := runtimeValidate(runtime, g); err != nil {
|
||
|
t.Errorf("%s failed validation: %v", runtime, err)
|
||
|
}
|
||
|
}
|