osbuild-image-test: use --output-directory of osbuild
Switch over to the --output-directory argument of osbuild and stop poking into the osbuild-cache.
This commit is contained in:
parent
fdd7536152
commit
edd7b37ea2
4 changed files with 28 additions and 39 deletions
|
|
@ -4,12 +4,12 @@ package constants
|
||||||
|
|
||||||
import "os/exec"
|
import "os/exec"
|
||||||
|
|
||||||
func GetOsbuildCommand(store string) *exec.Cmd {
|
func GetOsbuildCommand(outputDirectory string) *exec.Cmd {
|
||||||
cmd := exec.Command(
|
cmd := exec.Command(
|
||||||
"python3",
|
"python3",
|
||||||
"-m", "osbuild",
|
"-m", "osbuild",
|
||||||
"--libdir", ".",
|
"--libdir", ".",
|
||||||
"--store", store,
|
"--output-directory", outputDirectory,
|
||||||
"--json",
|
"--json",
|
||||||
"-",
|
"-",
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -4,10 +4,10 @@ package constants
|
||||||
|
|
||||||
import "os/exec"
|
import "os/exec"
|
||||||
|
|
||||||
func GetOsbuildCommand(store string) *exec.Cmd {
|
func GetOsbuildCommand(outputDirectory string) *exec.Cmd {
|
||||||
return exec.Command(
|
return exec.Command(
|
||||||
"osbuild",
|
"osbuild",
|
||||||
"--store", store,
|
"--output-directory", outputDirectory,
|
||||||
"--json",
|
"--json",
|
||||||
"-",
|
"-",
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -169,11 +169,10 @@ func withBootedQemuImage(image string, ns netNS, f func() error) error {
|
||||||
|
|
||||||
// withBootedNspawnImage boots the specified image in the specified namespace
|
// withBootedNspawnImage boots the specified image in the specified namespace
|
||||||
// using nspawn. The VM is killed immediately after function returns.
|
// using nspawn. The VM is killed immediately after function returns.
|
||||||
func withBootedNspawnImage(image, name string, ns netNS, f func() error) error {
|
func withBootedNspawnImage(image string, ns netNS, f func() error) error {
|
||||||
cmd := exec.Command(
|
cmd := exec.Command(
|
||||||
"systemd-nspawn",
|
"systemd-nspawn",
|
||||||
"--boot", "--register=no",
|
"--boot", "--register=no",
|
||||||
"-M", name,
|
|
||||||
"--image", image,
|
"--image", image,
|
||||||
"--network-namespace-path", ns.Path(),
|
"--network-namespace-path", ns.Path(),
|
||||||
)
|
)
|
||||||
|
|
@ -195,11 +194,10 @@ func withBootedNspawnImage(image, name string, ns netNS, f func() error) error {
|
||||||
|
|
||||||
// withBootedNspawnImage boots the specified directory in the specified namespace
|
// withBootedNspawnImage boots the specified directory in the specified namespace
|
||||||
// using nspawn. The VM is killed immediately after function returns.
|
// using nspawn. The VM is killed immediately after function returns.
|
||||||
func withBootedNspawnDirectory(dir, name string, ns netNS, f func() error) error {
|
func withBootedNspawnDirectory(dir string, ns netNS, f func() error) error {
|
||||||
cmd := exec.Command(
|
cmd := exec.Command(
|
||||||
"systemd-nspawn",
|
"systemd-nspawn",
|
||||||
"--boot", "--register=no",
|
"--boot", "--register=no",
|
||||||
"-M", name,
|
|
||||||
"--directory", dir,
|
"--directory", dir,
|
||||||
"--network-namespace-path", ns.Path(),
|
"--network-namespace-path", ns.Path(),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -42,8 +42,8 @@ type testcaseStruct struct {
|
||||||
// mutex to enforce only one osbuild instance run at a time, see below
|
// mutex to enforce only one osbuild instance run at a time, see below
|
||||||
var osbuildMutex sync.Mutex
|
var osbuildMutex sync.Mutex
|
||||||
|
|
||||||
// runOsbuild runs osbuild with the specified manifest and store.
|
// runOsbuild runs osbuild with the specified manifest and output-directory.
|
||||||
func runOsbuild(manifest []byte, store string) (string, error) {
|
func runOsbuild(manifest []byte, outputDirectory string) error {
|
||||||
// Osbuild crashes when multiple instances are run at a time.
|
// Osbuild crashes when multiple instances are run at a time.
|
||||||
// This mutex enforces that there's always just one osbuild instance.
|
// This mutex enforces that there's always just one osbuild instance.
|
||||||
// This should be removed once osbuild is fixed.
|
// This should be removed once osbuild is fixed.
|
||||||
|
|
@ -51,7 +51,7 @@ func runOsbuild(manifest []byte, store string) (string, error) {
|
||||||
osbuildMutex.Lock()
|
osbuildMutex.Lock()
|
||||||
defer osbuildMutex.Unlock()
|
defer osbuildMutex.Unlock()
|
||||||
|
|
||||||
cmd := constants.GetOsbuildCommand(store)
|
cmd := constants.GetOsbuildCommand(outputDirectory)
|
||||||
|
|
||||||
cmd.Stderr = os.Stderr
|
cmd.Stderr = os.Stderr
|
||||||
cmd.Stdin = bytes.NewReader(manifest)
|
cmd.Stdin = bytes.NewReader(manifest)
|
||||||
|
|
@ -64,21 +64,12 @@ func runOsbuild(manifest []byte, store string) (string, error) {
|
||||||
if _, ok := err.(*exec.ExitError); ok {
|
if _, ok := err.(*exec.ExitError); ok {
|
||||||
var formattedOutput bytes.Buffer
|
var formattedOutput bytes.Buffer
|
||||||
_ = json.Indent(&formattedOutput, outBuffer.Bytes(), "", " ")
|
_ = json.Indent(&formattedOutput, outBuffer.Bytes(), "", " ")
|
||||||
return "", fmt.Errorf("running osbuild failed: %s", formattedOutput.String())
|
return fmt.Errorf("running osbuild failed: %s", formattedOutput.String())
|
||||||
}
|
}
|
||||||
return "", fmt.Errorf("running osbuild failed from an unexpected reason: %#v", err)
|
return fmt.Errorf("running osbuild failed from an unexpected reason: %#v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
var result struct {
|
return nil
|
||||||
OutputID string `json:"output_id"`
|
|
||||||
}
|
|
||||||
|
|
||||||
err = json.NewDecoder(&outBuffer).Decode(&result)
|
|
||||||
if err != nil {
|
|
||||||
return "", fmt.Errorf("cannot decode osbuild output: %#v", err)
|
|
||||||
}
|
|
||||||
|
|
||||||
return result.OutputID, nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// testImageInfo runs image-info on image specified by imageImage and
|
// testImageInfo runs image-info on image specified by imageImage and
|
||||||
|
|
@ -200,9 +191,9 @@ func testBootUsingQemu(t *testing.T, imagePath string) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testBootUsingNspawnImage(t *testing.T, imagePath string, outputID string) {
|
func testBootUsingNspawnImage(t *testing.T, imagePath string) {
|
||||||
err := withNetworkNamespace(func(ns netNS) error {
|
err := withNetworkNamespace(func(ns netNS) error {
|
||||||
return withBootedNspawnImage(imagePath, outputID, ns, func() error {
|
return withBootedNspawnImage(imagePath, ns, func() error {
|
||||||
testSSH(t, "localhost", constants.TestPaths.PrivateKey, &ns)
|
testSSH(t, "localhost", constants.TestPaths.PrivateKey, &ns)
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
@ -210,10 +201,10 @@ func testBootUsingNspawnImage(t *testing.T, imagePath string, outputID string) {
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testBootUsingNspawnDirectory(t *testing.T, imagePath string, outputID string) {
|
func testBootUsingNspawnDirectory(t *testing.T, imagePath string) {
|
||||||
err := withNetworkNamespace(func(ns netNS) error {
|
err := withNetworkNamespace(func(ns netNS) error {
|
||||||
return withExtractedTarArchive(imagePath, func(dir string) error {
|
return withExtractedTarArchive(imagePath, func(dir string) error {
|
||||||
return withBootedNspawnDirectory(dir, outputID, ns, func() error {
|
return withBootedNspawnDirectory(dir, ns, func() error {
|
||||||
testSSH(t, "localhost", constants.TestPaths.PrivateKey, &ns)
|
testSSH(t, "localhost", constants.TestPaths.PrivateKey, &ns)
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
|
|
@ -305,16 +296,16 @@ func testBootUsingAzure(t *testing.T, imagePath string) {
|
||||||
// The test passes if the function is able to connect to the image via ssh
|
// The test passes if the function is able to connect to the image via ssh
|
||||||
// in defined number of attempts and systemd-is-running returns running
|
// in defined number of attempts and systemd-is-running returns running
|
||||||
// or degraded status.
|
// or degraded status.
|
||||||
func testBoot(t *testing.T, imagePath string, bootType string, outputID string) {
|
func testBoot(t *testing.T, imagePath string, bootType string) {
|
||||||
switch bootType {
|
switch bootType {
|
||||||
case "qemu":
|
case "qemu":
|
||||||
testBootUsingQemu(t, imagePath)
|
testBootUsingQemu(t, imagePath)
|
||||||
|
|
||||||
case "nspawn":
|
case "nspawn":
|
||||||
testBootUsingNspawnImage(t, imagePath, outputID)
|
testBootUsingNspawnImage(t, imagePath)
|
||||||
|
|
||||||
case "nspawn-extract":
|
case "nspawn-extract":
|
||||||
testBootUsingNspawnDirectory(t, imagePath, outputID)
|
testBootUsingNspawnDirectory(t, imagePath)
|
||||||
|
|
||||||
case "aws":
|
case "aws":
|
||||||
testBootUsingAWS(t, imagePath)
|
testBootUsingAWS(t, imagePath)
|
||||||
|
|
@ -344,7 +335,7 @@ func kvmAvailable() bool {
|
||||||
|
|
||||||
// testImage performs a series of tests specified in the testcase
|
// testImage performs a series of tests specified in the testcase
|
||||||
// on an image
|
// on an image
|
||||||
func testImage(t *testing.T, testcase testcaseStruct, imagePath, outputID string) {
|
func testImage(t *testing.T, testcase testcaseStruct, imagePath string) {
|
||||||
if testcase.ImageInfo != nil {
|
if testcase.ImageInfo != nil {
|
||||||
t.Run("image info", func(t *testing.T) {
|
t.Run("image info", func(t *testing.T) {
|
||||||
testImageInfo(t, imagePath, testcase.ImageInfo)
|
testImageInfo(t, imagePath, testcase.ImageInfo)
|
||||||
|
|
@ -357,7 +348,7 @@ func testImage(t *testing.T, testcase testcaseStruct, imagePath, outputID string
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
t.Run("boot", func(t *testing.T) {
|
t.Run("boot", func(t *testing.T) {
|
||||||
testBoot(t, imagePath, testcase.Boot.Type, outputID)
|
testBoot(t, imagePath, testcase.Boot.Type)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -365,22 +356,22 @@ func testImage(t *testing.T, testcase testcaseStruct, imagePath, outputID string
|
||||||
// runTestcase builds the pipeline specified in the testcase and then it
|
// runTestcase builds the pipeline specified in the testcase and then it
|
||||||
// tests the result
|
// tests the result
|
||||||
func runTestcase(t *testing.T, testcase testcaseStruct) {
|
func runTestcase(t *testing.T, testcase testcaseStruct) {
|
||||||
store, err := ioutil.TempDir("/var/tmp", "osbuild-image-tests-")
|
outputDirectory, err := ioutil.TempDir("/var/tmp", "osbuild-image-tests-*")
|
||||||
require.NoErrorf(t, err, "cannot create temporary store: %#v", err)
|
require.NoErrorf(t, err, "cannot create temporary output directory: %#v", err)
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
err := os.RemoveAll(store)
|
err := os.RemoveAll(outputDirectory)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("cannot remove temporary store: %#v\n", err)
|
log.Printf("cannot remove temporary output directory: %#v\n", err)
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
outputID, err := runOsbuild(testcase.Manifest, store)
|
err = runOsbuild(testcase.Manifest, outputDirectory)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
imagePath := fmt.Sprintf("%s/refs/%s/%s", store, outputID, testcase.ComposeRequest.Filename)
|
imagePath := fmt.Sprintf("%s/%s", outputDirectory, testcase.ComposeRequest.Filename)
|
||||||
|
|
||||||
testImage(t, testcase, imagePath, outputID)
|
testImage(t, testcase, imagePath)
|
||||||
}
|
}
|
||||||
|
|
||||||
// getAllCases returns paths to all testcases in the testcase directory
|
// getAllCases returns paths to all testcases in the testcase directory
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue