Select Linux test images by architecture
This commit is contained in:
parent
d118199424
commit
f3493a427f
|
|
@ -30,7 +30,7 @@ jobs:
|
|||
|
||||
test-linux:
|
||||
name: Test (Linux)
|
||||
runs-on: ubuntu-24.04-arm
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 60
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
|
|
@ -53,10 +53,10 @@ jobs:
|
|||
run: |
|
||||
curl --fail --location --retry 3 \
|
||||
--output "$RUNNER_TEMP/cloud-hypervisor" \
|
||||
https://github.com/cloud-hypervisor/cloud-hypervisor/releases/latest/download/cloud-hypervisor-static-aarch64
|
||||
https://github.com/cloud-hypervisor/cloud-hypervisor/releases/latest/download/cloud-hypervisor-static
|
||||
chmod +x "$RUNNER_TEMP/cloud-hypervisor"
|
||||
- name: Pre-pull default Vetu image
|
||||
run: vetu pull ghcr.io/cirruslabs/ubuntu:latest
|
||||
run: vetu pull ghcr.io/cirruslabs/ubuntu-amd64:24.04
|
||||
- name: Run tests
|
||||
run: go test -v -count=1 ./...
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,35 @@
|
|||
package imageconstant
|
||||
|
||||
const (
|
||||
DefaultMacosImage = "ghcr.io/cirruslabs/macos-tahoe-base:latest"
|
||||
DefaultLinuxImage = "ghcr.io/cirruslabs/ubuntu:latest"
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
v1 "github.com/cirruslabs/orchard/pkg/resource/v1"
|
||||
)
|
||||
|
||||
const (
|
||||
DefaultMacosImage = "ghcr.io/cirruslabs/macos-tahoe-base:latest"
|
||||
DefaultLinuxAMD64Image = "ghcr.io/cirruslabs/ubuntu-amd64:24.04"
|
||||
DefaultLinuxARM64Image = "ghcr.io/cirruslabs/ubuntu:24.04"
|
||||
)
|
||||
|
||||
func DefaultImage(os v1.OS, architecture v1.Architecture) (string, error) {
|
||||
switch os {
|
||||
case v1.OSDarwin:
|
||||
if architecture != v1.ArchitectureARM64 {
|
||||
return "", fmt.Errorf("no default image for %s/%s", os, architecture)
|
||||
}
|
||||
|
||||
return DefaultMacosImage, nil
|
||||
case v1.OSLinux:
|
||||
switch architecture {
|
||||
case v1.ArchitectureAMD64:
|
||||
return DefaultLinuxAMD64Image, nil
|
||||
case v1.ArchitectureARM64:
|
||||
return DefaultLinuxARM64Image, nil
|
||||
default:
|
||||
return "", fmt.Errorf("no default image for %s/%s", os, architecture)
|
||||
}
|
||||
default:
|
||||
return "", fmt.Errorf("no default image for %s/%s", os, architecture)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,78 @@
|
|||
package imageconstant_test
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/cirruslabs/orchard/internal/imageconstant"
|
||||
v1 "github.com/cirruslabs/orchard/pkg/resource/v1"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestDefaultImage(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
os v1.OS
|
||||
architecture v1.Architecture
|
||||
expected string
|
||||
}{
|
||||
{
|
||||
name: "macOS ARM64",
|
||||
os: v1.OSDarwin,
|
||||
architecture: v1.ArchitectureARM64,
|
||||
expected: imageconstant.DefaultMacosImage,
|
||||
},
|
||||
{
|
||||
name: "Linux AMD64",
|
||||
os: v1.OSLinux,
|
||||
architecture: v1.ArchitectureAMD64,
|
||||
expected: imageconstant.DefaultLinuxAMD64Image,
|
||||
},
|
||||
{
|
||||
name: "Linux ARM64",
|
||||
os: v1.OSLinux,
|
||||
architecture: v1.ArchitectureARM64,
|
||||
expected: imageconstant.DefaultLinuxARM64Image,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
actual, err := imageconstant.DefaultImage(test.os, test.architecture)
|
||||
|
||||
require.NoError(t, err)
|
||||
require.Equal(t, test.expected, actual)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
func TestDefaultImageRejectsUnsupportedPlatforms(t *testing.T) {
|
||||
tests := []struct {
|
||||
name string
|
||||
os v1.OS
|
||||
architecture v1.Architecture
|
||||
}{
|
||||
{
|
||||
name: "unsupported OS",
|
||||
os: v1.OS("windows"),
|
||||
architecture: v1.ArchitectureAMD64,
|
||||
},
|
||||
{
|
||||
name: "unsupported Linux architecture",
|
||||
os: v1.OSLinux,
|
||||
architecture: v1.Architecture("riscv64"),
|
||||
},
|
||||
{
|
||||
name: "unsupported macOS architecture",
|
||||
os: v1.OSDarwin,
|
||||
architecture: v1.ArchitectureAMD64,
|
||||
},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
t.Run(test.name, func(t *testing.T) {
|
||||
_, err := imageconstant.DefaultImage(test.os, test.architecture)
|
||||
|
||||
require.Error(t, err)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
|
@ -2,6 +2,7 @@ package platformdependent
|
|||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"runtime"
|
||||
|
||||
"github.com/cirruslabs/orchard/internal/imageconstant"
|
||||
|
|
@ -13,20 +14,29 @@ import (
|
|||
)
|
||||
|
||||
func VM(name string) *v1.VM {
|
||||
hostOS, hostArchitecture, err := hostPlatform()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
image, err := imageconstant.DefaultImage(hostOS, hostArchitecture)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
vm := &v1.VM{
|
||||
Meta: v1.Meta{
|
||||
Name: name,
|
||||
},
|
||||
Image: imageconstant.DefaultMacosImage,
|
||||
Image: image,
|
||||
CPU: 4,
|
||||
Memory: 8 * 1024,
|
||||
Headless: true,
|
||||
}
|
||||
|
||||
if runtime.GOOS == "linux" {
|
||||
vm.Image = imageconstant.DefaultLinuxImage
|
||||
vm.OS = v1.OSLinux
|
||||
vm.Arch = v1.Architecture(runtime.GOARCH)
|
||||
if hostOS == v1.OSLinux {
|
||||
vm.OS = hostOS
|
||||
vm.Arch = hostArchitecture
|
||||
vm.Runtime = v1.RuntimeVetu
|
||||
}
|
||||
|
||||
|
|
@ -34,26 +44,54 @@ func VM(name string) *v1.VM {
|
|||
}
|
||||
|
||||
func CloneDefaultImage(ctx context.Context, logger *zap.SugaredLogger, destination string) error {
|
||||
var err error
|
||||
hostOS, hostArchitecture, err := hostPlatform()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if runtime.GOOS == "linux" {
|
||||
_, _, err = vetu.Vetu(ctx, logger, "clone", imageconstant.DefaultLinuxImage, destination)
|
||||
} else {
|
||||
_, _, err = tart.Tart(ctx, logger, "clone", imageconstant.DefaultMacosImage, destination)
|
||||
image, err := imageconstant.DefaultImage(hostOS, hostArchitecture)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
switch hostOS {
|
||||
case v1.OSLinux:
|
||||
_, _, err = vetu.Vetu(ctx, logger, "clone", image, destination)
|
||||
case v1.OSDarwin:
|
||||
_, _, err = tart.Tart(ctx, logger, "clone", image, destination)
|
||||
default:
|
||||
return fmt.Errorf("unsupported host OS: %q", hostOS)
|
||||
}
|
||||
|
||||
return err
|
||||
}
|
||||
|
||||
func ListVMs(ctx context.Context, logger *zap.SugaredLogger) ([]vmmanager.VMInfo, error) {
|
||||
var vms []vmmanager.VMInfo
|
||||
var err error
|
||||
|
||||
if runtime.GOOS == "linux" {
|
||||
vms, err = vetu.List(ctx, logger)
|
||||
} else {
|
||||
vms, err = tart.List(ctx, logger)
|
||||
hostOS, _, err := hostPlatform()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return vms, err
|
||||
switch hostOS {
|
||||
case v1.OSLinux:
|
||||
return vetu.List(ctx, logger)
|
||||
case v1.OSDarwin:
|
||||
return tart.List(ctx, logger)
|
||||
default:
|
||||
return nil, fmt.Errorf("unsupported host OS: %q", hostOS)
|
||||
}
|
||||
}
|
||||
|
||||
func hostPlatform() (v1.OS, v1.Architecture, error) {
|
||||
hostOS, err := v1.NewOSFromString(runtime.GOOS)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
hostArchitecture, err := v1.NewArchitectureFromString(runtime.GOARCH)
|
||||
if err != nil {
|
||||
return "", "", err
|
||||
}
|
||||
|
||||
return hostOS, hostArchitecture, nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue