Podman Machine AppleHV CI fixes

This PR contains several fixes that allow the applehv podman tests run
to completion.

Signed-off-by: Brent Baude <baude@redhat.com>
This commit is contained in:
Brent Baude
2024-02-04 15:02:35 -06:00
committed by Brent Baude
parent d5eb8f3b71
commit f23b144c60
7 changed files with 161 additions and 70 deletions

View File

@ -442,50 +442,50 @@ alt_build_task:
# Confirm building the remote client, natively on a Mac OS-X VM.
# osx_alt_build_task:
# name: "OSX Cross"
# alias: osx_alt_build
# # Docs: ./contrib/cirrus/CIModes.md
# only_if: *no_rhel_release # RHEL never releases podman mac installer binary
# depends_on:
# - build
# persistent_worker: &mac_pw
# labels:
# os: darwin
# arch: arm64
# purpose: prod
# env: &mac_env
# CIRRUS_SHELL: "/bin/bash" # sh is the default
# CIRRUS_WORKING_DIR: "$HOME/ci/task-${CIRRUS_TASK_ID}" # Isolation: $HOME will be set to "ci" dir.
# # Prevent cache-pollution fron one task to the next.
# GOPATH: "$CIRRUS_WORKING_DIR/.go"
# GOCACHE: "$CIRRUS_WORKING_DIR/.go/cache"
# GOENV: "$CIRRUS_WORKING_DIR/.go/support"
# GOSRC: "$HOME/ci/task-${CIRRUS_TASK_ID}"
# # This host is/was shared with potentially many other CI tasks.
# # The previous task may have been canceled or aborted.
# prep_script: &mac_cleanup "contrib/cirrus/mac_cleanup.sh"
# lint_script:
# - make lint || true # TODO: Enable when code passes check
# basic_build_script:
# - make .install.ginkgo
# - make podman-remote
# - make podman-mac-helper
# build_amd64_script:
# - make podman-remote-release-darwin_amd64.zip
# build_arm64_script:
# - make podman-remote-release-darwin_arm64.zip
# build_pkginstaller_script:
# - cd contrib/pkginstaller
# - make ARCH=amd64 NO_CODESIGN=1 pkginstaller
# - make ARCH=aarch64 NO_CODESIGN=1 pkginstaller
# # Produce a new repo.tbz artifact for consumption by dependent tasks.
# repo_prep_script: *repo_prep
# repo_artifacts: *repo_artifacts
# # This host is/was shared with potentially many other CI tasks.
# # Ensure nothing is left running while waiting for the next task.
# always:
# task_cleanup_script: *mac_cleanup
osx_alt_build_task:
name: "OSX Cross"
alias: osx_alt_build
# Docs: ./contrib/cirrus/CIModes.md
only_if: *no_rhel_release # RHEL never releases podman mac installer binary
depends_on:
- build
persistent_worker: &mac_pw
labels:
os: darwin
arch: arm64
purpose: prod
env: &mac_env
CIRRUS_SHELL: "/bin/bash" # sh is the default
CIRRUS_WORKING_DIR: "$HOME/ci/task-${CIRRUS_TASK_ID}" # Isolation: $HOME will be set to "ci" dir.
# Prevent cache-pollution fron one task to the next.
GOPATH: "$CIRRUS_WORKING_DIR/.go"
GOCACHE: "$CIRRUS_WORKING_DIR/.go/cache"
GOENV: "$CIRRUS_WORKING_DIR/.go/support"
GOSRC: "$HOME/ci/task-${CIRRUS_TASK_ID}"
# This host is/was shared with potentially many other CI tasks.
# The previous task may have been canceled or aborted.
prep_script: &mac_cleanup "contrib/cirrus/mac_cleanup.sh"
lint_script:
- make lint || true # TODO: Enable when code passes check
basic_build_script:
- make .install.ginkgo
- make podman-remote
- make podman-mac-helper
build_amd64_script:
- make podman-remote-release-darwin_amd64.zip
build_arm64_script:
- make podman-remote-release-darwin_arm64.zip
build_pkginstaller_script:
- cd contrib/pkginstaller
- make ARCH=amd64 NO_CODESIGN=1 pkginstaller
- make ARCH=aarch64 NO_CODESIGN=1 pkginstaller
# Produce a new repo.tbz artifact for consumption by dependent tasks.
repo_prep_script: *repo_prep
repo_artifacts: *repo_artifacts
# This host is/was shared with potentially many other CI tasks.
# Ensure nothing is left running while waiting for the next task.
always:
task_cleanup_script: *mac_cleanup
# Build freebsd release natively on a FreeBSD VM.
#freebsd_alt_build_task:
@ -875,6 +875,7 @@ podman_machine_mac_task:
# main_script: ".\\repo\\contrib\\cirrus\\win-podman-machine-main.ps1"
<<<<<<< HEAD
#podman_machine_mac_task:
# name: *std_name_fmt
# alias: podman_machine_mac
@ -919,6 +920,51 @@ podman_machine_mac_task:
# always:
# task_cleanup_script: *mac_cleanup
>>>>>>> 0ff0e1dfe8 ([CI:MACHINE]Podman5 QEMU refactor)
=======
podman_machine_mac_task:
name: *std_name_fmt
alias: podman_machine_mac
only_if: *not_tag_branch_build_docs
depends_on:
- osx_alt_build
- local_integration_test
- remote_integration_test
- container_integration_test
- rootless_integration_test
persistent_worker: *mac_pw
env:
<<: *mac_env
# Consumed by podman-machine ginkgo tests
CONTAINERS_MACHINE_PROVIDER: "applehv"
# TODO: Should not require a special image, for now it does.
# Simply remove the line below when a mac image is GA.
# MACHINE_IMAGE: "https://fedorapeople.org/groups/podman/testing/applehv/arm64/fedora-coreos-38.20230925.dev.0-applehv.aarch64.raw.gz"
# Values necessary to populate std_name_fmt alias
TEST_FLAVOR: "machine-mac"
DISTRO_NV: "darwin"
PRIV_NAME: "rootless" # intended use-case
clone_script: # artifacts from osx_alt_build_task
- mkdir -p $CIRRUS_WORKING_DIR
- cd $CIRRUS_WORKING_DIR
- $ARTCURL/OSX%20Cross/repo/repo.tbz
- tar xjf repo.tbz
# This host is/was shared with potentially many other CI tasks.
# The previous task may have been canceled or aborted.
prep_script: *mac_cleanup
setup_script: "contrib/cirrus/mac_setup.sh"
env_script: "contrib/cirrus/mac_env.sh"
# TODO: Timeout bumped b/c initial image download (~5min) and VM
# resize (~2min) causes test-timeout (90s default). Should
# tests deal with this internally?
smoke_test_script:
- MACHINE_TEST_TIMEOUT=500 make localmachine FOCUS_FILE="basic_test.go"
test_script:
- make localmachine
# This host is/was shared with potentially many other CI tasks.
# Ensure nothing is left running while waiting for the next task.
always:
task_cleanup_script: *mac_cleanup
>>>>>>> 09f119d4a6 (Podman Machine AppleHV CI fixes)
# Always run subsequent to integration tests. While parallelism is lost
# with runtime, debugging system-test failures can be more challenging
@ -1123,7 +1169,7 @@ success_task:
- bindings
- swagger
- alt_build
#- osx_alt_build
- osx_alt_build
#- freebsd_alt_build
#- win_installer
- docker-py_test
@ -1138,7 +1184,7 @@ success_task:
- podman_machine_aarch64
#- podman_machine_windows
# TODO: Issue #20853; Tests mostly fail then timeout after an hour.
# - podman_machine_mac
- podman_machine_mac
- local_system_test
- local_system_test_aarch64
- remote_system_test

View File

@ -5,6 +5,7 @@ import (
"bufio"
"compress/gzip"
"errors"
"fmt"
"io"
"os"
"os/exec"
@ -41,26 +42,52 @@ func Decompress(localPath *define.VMFile, uncompressedPath string) error {
if strings.HasSuffix(localPath.GetPath(), ".zip") {
isZip = true
}
prefix := "Copying uncompressed file"
compressionType := archive.DetectCompression(sourceFile)
if compressionType != archive.Uncompressed || isZip {
prefix = "Extracting compressed file"
}
prefix := "Extracting compressed file"
prefix += ": " + filepath.Base(uncompressedPath)
if compressionType == archive.Xz {
switch compressionType {
case archive.Xz:
return decompressXZ(prefix, localPath.GetPath(), uncompressedFileWriter)
}
case archive.Uncompressed:
if isZip && runtime.GOOS == "windows" {
return decompressZip(prefix, localPath.GetPath(), uncompressedFileWriter)
}
// Unfortunately GZ is not sparse capable. Lets handle it differently
if compressionType == archive.Gzip && runtime.GOOS == "darwin" {
// here we should just do a copy
dstFile, err := os.Open(localPath.GetPath())
if err != nil {
return err
}
fmt.Printf("Copying uncompressed file %q to %q/n", localPath.GetPath(), dstFile.Name())
_, err = CopySparse(uncompressedFileWriter, dstFile)
return err
case archive.Gzip:
if runtime.GOOS == "darwin" {
return decompressGzWithSparse(prefix, localPath, uncompressedPath)
}
fallthrough
default:
return decompressEverythingElse(prefix, localPath.GetPath(), uncompressedFileWriter)
}
// if compressionType != archive.Uncompressed || isZip {
// prefix = "Extracting compressed file"
// }
// prefix += ": " + filepath.Base(uncompressedPath)
// if compressionType == archive.Xz {
// return decompressXZ(prefix, localPath.GetPath(), uncompressedFileWriter)
// }
// if isZip && runtime.GOOS == "windows" {
// return decompressZip(prefix, localPath.GetPath(), uncompressedFileWriter)
// }
// Unfortunately GZ is not sparse capable. Lets handle it differently
// if compressionType == archive.Gzip && runtime.GOOS == "darwin" {
// return decompressGzWithSparse(prefix, localPath, uncompressedPath)
// }
// return decompressEverythingElse(prefix, localPath.GetPath(), uncompressedFileWriter)
}
// Will error out if file without .Xz already exists
// Maybe extracting then renaming is a good idea here..
// depends on Xz: not pre-installed on mac, so it becomes a brew dependency

View File

@ -33,6 +33,4 @@ Note: To run specific test files, add the test files to the end of the winmake c
### Apple Hypervisor
1. `make podman-remote`
1. `export CONTAINERS_MACHINE_PROVIDER="applehv"`
1. `export MACHINE_IMAGE="https://fedorapeople.org/groups/podman/testing/applehv/arm64/fedora-coreos-38.20230925.dev.0-applehv.aarch64.raw.gz"`
1. `make localmachine` (Add `FOCUS_FILE=basic_test.go` to only run basic test)

View File

@ -7,6 +7,7 @@ import (
"os"
"path"
"path/filepath"
"runtime"
"strings"
"testing"
"time"
@ -96,9 +97,11 @@ var _ = BeforeSuite(func() {
if err != nil {
Fail(fmt.Sprintf("unable to create vmfile %q: %v", fqImageName+compressionExtension, err))
}
compressionStart := time.Now()
if err := compression.Decompress(diskImage, fqImageName); err != nil {
Fail(fmt.Sprintf("unable to decompress image file: %q", err))
}
GinkgoWriter.Println("compression took: ", time.Since(compressionStart))
} else {
Fail(fmt.Sprintf("unable to check for cache image: %q", err))
}
@ -140,20 +143,34 @@ func setup() (string, *machineTestBuilder) {
if err != nil {
Fail(fmt.Sprintf("failed to create machine test: %q", err))
}
f, err := os.Open(fqImageName)
src, err := os.Open(fqImageName)
if err != nil {
Fail(fmt.Sprintf("failed to open file %s: %q", fqImageName, err))
}
defer func() {
if err := src.Close(); err != nil {
Fail(fmt.Sprintf("failed to close src reader %q: %q", src.Name(), err))
}
}()
mb.imagePath = filepath.Join(homeDir, suiteImageName)
n, err := os.Create(mb.imagePath)
dest, err := os.Create(mb.imagePath)
if err != nil {
Fail(fmt.Sprintf("failed to create file %s: %q", mb.imagePath, err))
}
if _, err := io.Copy(n, f); err != nil {
defer func() {
if err := dest.Close(); err != nil {
Fail(fmt.Sprintf("failed to close destination file %q: %q", dest.Name(), err))
}
}()
fmt.Printf("--> copying %q to %q/n", src.Name(), dest.Name())
if runtime.GOOS != "darwin" {
if _, err := io.Copy(dest, src); err != nil {
Fail(fmt.Sprintf("failed to copy %ss to %s: %q", fqImageName, mb.imagePath, err))
}
if err := n.Close(); err != nil {
Fail(fmt.Sprintf("failed to close image copy handler: %q", err))
} else {
if _, err := compression.CopySparse(dest, src); err != nil {
Fail(fmt.Sprintf("failed to copy %q to %q: %q", src.Name(), dest.Name(), err))
}
}
return homeDir, mb
}

View File

@ -23,6 +23,9 @@ var _ = Describe("podman machine proxy settings propagation", func() {
})
It("ssh to running machine and check proxy settings", func() {
// TODO the proxy test is currently failing on applehv. FIX ME
skipIfVmtype(define.AppleHvVirt, "TODO: this test fails on applehv")
// https://github.com/containers/podman/issues/20129
if testProvider.VMType() == define.HyperVVirt {
Skip("proxy settings not yet supported")

View File

@ -26,6 +26,6 @@ func (s *StdDiskPull) Get() error {
// could not find disk
return err
}
logrus.Debugf("decompressing %s to %s", s.inputPath.GetPath(), s.finalPath.GetPath())
logrus.Debugf("decompressing (if needed) %s to %s", s.inputPath.GetPath(), s.finalPath.GetPath())
return compression.Decompress(s.inputPath, s.finalPath.GetPath())
}

View File

@ -61,7 +61,7 @@ func (d *DiskFromURL) Get() error {
if err := d.pull(); err != nil {
return err
}
logrus.Debugf("decompressing %s to %s", d.tempLocation.GetPath(), d.finalPath.GetPath())
logrus.Debugf("decompressing (if needed) %s to %s", d.tempLocation.GetPath(), d.finalPath.GetPath())
return compression.Decompress(d.tempLocation, d.finalPath.GetPath())
}