From 919dce1315f71cdbdc547ff00357b0b2302f36cf Mon Sep 17 00:00:00 2001 From: Brent Baude Date: Fri, 25 Aug 2023 13:11:38 -0500 Subject: [PATCH] Plumbing to run machine tests with hyperv this pr has the basic plumbing that allows the e2e machine tests to run with the hyperv provider. it requires a special fcos image right now because gvforwarder was not in the upstream fcos images for hyperv. changed the way "provider" is set; moved GetProvider functions to pkg/machine/provider. provider is now set at the machine level. Signed-off-by: Brent Baude --- cmd/podman/compose.go | 4 +-- cmd/podman/machine/info.go | 6 +--- cmd/podman/machine/init.go | 6 +--- cmd/podman/machine/inspect.go | 7 ++--- cmd/podman/machine/list.go | 6 +--- cmd/podman/machine/machine.go | 15 ++++++++- cmd/podman/machine/os/manager.go | 6 ++-- cmd/podman/machine/rm.go | 6 +--- cmd/podman/machine/set.go | 7 ++--- cmd/podman/machine/ssh.go | 6 +--- cmd/podman/machine/start.go | 7 +---- cmd/podman/machine/stop.go | 7 ++--- cmd/podman/system/reset_machine.go | 4 +-- pkg/machine/e2e/README.md | 19 ++++++++++++ pkg/machine/e2e/config_linux_test.go | 3 ++ pkg/machine/e2e/config_test.go | 2 +- pkg/machine/e2e/config_windows_test.go | 3 ++ pkg/machine/e2e/machine_test.go | 31 +++++++++++++------ .../machine/provider}/platform.go | 4 +-- .../machine/provider}/platform_darwin.go | 4 +-- .../machine/provider}/platform_windows.go | 4 +-- 21 files changed, 86 insertions(+), 71 deletions(-) create mode 100644 pkg/machine/e2e/README.md create mode 100644 pkg/machine/e2e/config_linux_test.go create mode 100644 pkg/machine/e2e/config_windows_test.go rename {cmd/podman/machine => pkg/machine/provider}/platform.go (92%) rename {cmd/podman/machine => pkg/machine/provider}/platform_darwin.go (93%) rename {cmd/podman/machine => pkg/machine/provider}/platform_windows.go (92%) diff --git a/cmd/podman/compose.go b/cmd/podman/compose.go index 8f507e63c783..1dde686a4642 100644 --- a/cmd/podman/compose.go +++ b/cmd/podman/compose.go @@ -16,9 +16,9 @@ import ( "text/template" "github.com/containers/common/pkg/config" - cmdMachine "github.com/containers/podman/v4/cmd/podman/machine" "github.com/containers/podman/v4/cmd/podman/registry" "github.com/containers/podman/v4/pkg/machine" + "github.com/containers/podman/v4/pkg/machine/provider" "github.com/sirupsen/logrus" "github.com/spf13/cobra" "github.com/spf13/pflag" @@ -155,7 +155,7 @@ func composeDockerHost() (string, error) { return strings.TrimSuffix(connection.URI, parsedConnection.Path), nil } - machineProvider, err := cmdMachine.GetSystemProvider() + machineProvider, err := provider.Get() if err != nil { return "", fmt.Errorf("getting machine provider: %w", err) } diff --git a/cmd/podman/machine/info.go b/cmd/podman/machine/info.go index fab6e329a958..110ce3e90816 100644 --- a/cmd/podman/machine/info.go +++ b/cmd/podman/machine/info.go @@ -28,7 +28,7 @@ var ( Use: "info [options]", Short: "Display machine host info", Long: infoDescription, - PersistentPreRunE: rootlessOnly, + PersistentPreRunE: machinePreRunE, RunE: info, Args: validate.NoArgs, ValidArgsFunction: completion.AutocompleteNone, @@ -101,10 +101,6 @@ func hostInfo() (*entities.MachineHostInfo, error) { host.Arch = runtime.GOARCH host.OS = runtime.GOOS - provider, err := GetSystemProvider() - if err != nil { - return nil, err - } var listOpts machine.ListOptions listResponse, err := provider.List(listOpts) if err != nil { diff --git a/cmd/podman/machine/init.go b/cmd/podman/machine/init.go index a8da908a1b09..38b3f2d42481 100644 --- a/cmd/podman/machine/init.go +++ b/cmd/podman/machine/init.go @@ -19,7 +19,7 @@ var ( Use: "init [options] [NAME]", Short: "Initialize a virtual machine", Long: "Initialize a virtual machine", - PersistentPreRunE: rootlessOnly, + PersistentPreRunE: machinePreRunE, RunE: initMachine, Args: cobra.MaximumNArgs(1), Example: `podman machine init podman-machine-default`, @@ -128,10 +128,6 @@ func initMachine(cmd *cobra.Command, args []string) error { vm machine.VM ) - provider, err := GetSystemProvider() - if err != nil { - return err - } initOpts.Name = defaultMachineName if len(args) > 0 { if len(args[0]) > maxMachineNameSize { diff --git a/cmd/podman/machine/inspect.go b/cmd/podman/machine/inspect.go index 893cb228a0fb..47b34fe03249 100644 --- a/cmd/podman/machine/inspect.go +++ b/cmd/podman/machine/inspect.go @@ -19,7 +19,7 @@ var ( Use: "inspect [options] [MACHINE...]", Short: "Inspect an existing machine", Long: "Provide details on a managed virtual machine", - PersistentPreRunE: rootlessOnly, + PersistentPreRunE: machinePreRunE, RunE: inspect, Example: `podman machine inspect myvm`, ValidArgsFunction: autocompleteMachine, @@ -51,10 +51,7 @@ func inspect(cmd *cobra.Command, args []string) error { args = append(args, defaultMachineName) } vms := make([]machine.InspectInfo, 0, len(args)) - provider, err := GetSystemProvider() - if err != nil { - return err - } + for _, vmName := range args { vm, err := provider.LoadVMByName(vmName) if err != nil { diff --git a/cmd/podman/machine/list.go b/cmd/podman/machine/list.go index 0198c611406e..70acab54d994 100644 --- a/cmd/podman/machine/list.go +++ b/cmd/podman/machine/list.go @@ -28,7 +28,7 @@ var ( Aliases: []string{"ls"}, Short: "List machines", Long: "List managed virtual machines.", - PersistentPreRunE: rootlessOnly, + PersistentPreRunE: machinePreRunE, RunE: list, Args: validate.NoArgs, ValidArgsFunction: completion.AutocompleteNone, @@ -66,10 +66,6 @@ func list(cmd *cobra.Command, args []string) error { err error ) - provider, err := GetSystemProvider() - if err != nil { - return err - } listResponse, err = provider.List(opts) if err != nil { return fmt.Errorf("listing vms: %w", err) diff --git a/cmd/podman/machine/machine.go b/cmd/podman/machine/machine.go index 7c13f24c583b..959f8008b6ca 100644 --- a/cmd/podman/machine/machine.go +++ b/cmd/podman/machine/machine.go @@ -17,6 +17,7 @@ import ( "github.com/containers/podman/v4/cmd/podman/validate" "github.com/containers/podman/v4/libpod/events" "github.com/containers/podman/v4/pkg/machine" + provider2 "github.com/containers/podman/v4/pkg/machine/provider" "github.com/containers/podman/v4/pkg/util" "github.com/sirupsen/logrus" "github.com/spf13/cobra" @@ -39,6 +40,9 @@ var ( RunE: validate.SubCommandExists, } ) +var ( + provider machine.VirtProvider +) func init() { registry.Commands = append(registry.Commands, registry.CliCommand{ @@ -46,6 +50,15 @@ func init() { }) } +func machinePreRunE(c *cobra.Command, args []string) error { + var err error + provider, err = provider2.Get() + if err != nil { + return err + } + return rootlessOnly(c, args) +} + // autocompleteMachineSSH - Autocomplete machine ssh command. func autocompleteMachineSSH(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { if len(args) == 0 { @@ -64,7 +77,7 @@ func autocompleteMachine(cmd *cobra.Command, args []string, toComplete string) ( func getMachines(toComplete string) ([]string, cobra.ShellCompDirective) { suggestions := []string{} - provider, err := GetSystemProvider() + provider, err := provider2.Get() if err != nil { return nil, cobra.ShellCompDirectiveNoFileComp } diff --git a/cmd/podman/machine/os/manager.go b/cmd/podman/machine/os/manager.go index 4d4af9b5bffd..608cf0da0a00 100644 --- a/cmd/podman/machine/os/manager.go +++ b/cmd/podman/machine/os/manager.go @@ -10,9 +10,9 @@ import ( "strings" machineconfig "github.com/containers/common/pkg/machine" - "github.com/containers/podman/v4/cmd/podman/machine" pkgMachine "github.com/containers/podman/v4/pkg/machine" pkgOS "github.com/containers/podman/v4/pkg/machine/os" + "github.com/containers/podman/v4/pkg/machine/provider" ) type ManagerOpts struct { @@ -48,11 +48,11 @@ func machineOSManager(opts ManagerOpts) (pkgOS.Manager, error) { if opts.VMName == "" { vmName = pkgMachine.DefaultMachineName } - provider, err := machine.GetSystemProvider() + p, err := provider.Get() if err != nil { return nil, err } - vm, err := provider.LoadVMByName(vmName) + vm, err := p.LoadVMByName(vmName) if err != nil { return nil, err } diff --git a/cmd/podman/machine/rm.go b/cmd/podman/machine/rm.go index a928cd70dca7..64d7bb17c968 100644 --- a/cmd/podman/machine/rm.go +++ b/cmd/podman/machine/rm.go @@ -20,7 +20,7 @@ var ( Use: "rm [options] [MACHINE]", Short: "Remove an existing machine", Long: "Remove a managed virtual machine ", - PersistentPreRunE: rootlessOnly, + PersistentPreRunE: machinePreRunE, RunE: rm, Args: cobra.MaximumNArgs(1), Example: `podman machine rm podman-machine-default`, @@ -62,10 +62,6 @@ func rm(_ *cobra.Command, args []string) error { vmName = args[0] } - provider, err := GetSystemProvider() - if err != nil { - return err - } vm, err = provider.LoadVMByName(vmName) if err != nil { return err diff --git a/cmd/podman/machine/set.go b/cmd/podman/machine/set.go index 25cc2d1de337..df73486c04a5 100644 --- a/cmd/podman/machine/set.go +++ b/cmd/podman/machine/set.go @@ -18,7 +18,7 @@ var ( Use: "set [options] [NAME]", Short: "Set a virtual machine setting", Long: "Set an updatable virtual machine setting", - PersistentPreRunE: rootlessOnly, + PersistentPreRunE: machinePreRunE, RunE: setMachine, Args: cobra.MaximumNArgs(1), Example: `podman machine set --rootful=false`, @@ -89,10 +89,7 @@ func setMachine(cmd *cobra.Command, args []string) error { if len(args) > 0 && len(args[0]) > 0 { vmName = args[0] } - provider, err := GetSystemProvider() - if err != nil { - return err - } + vm, err = provider.LoadVMByName(vmName) if err != nil { return err diff --git a/cmd/podman/machine/ssh.go b/cmd/podman/machine/ssh.go index ab5912c69b08..c2407f2265c1 100644 --- a/cmd/podman/machine/ssh.go +++ b/cmd/podman/machine/ssh.go @@ -20,7 +20,7 @@ var ( Use: "ssh [options] [NAME] [COMMAND [ARG ...]]", Short: "SSH into an existing machine", Long: "SSH into a managed virtual machine ", - PersistentPreRunE: rootlessOnly, + PersistentPreRunE: machinePreRunE, RunE: ssh, Example: `podman machine ssh podman-machine-default podman machine ssh myvm echo hello`, @@ -53,10 +53,6 @@ func ssh(cmd *cobra.Command, args []string) error { // Set the VM to default vmName := defaultMachineName - provider, err := GetSystemProvider() - if err != nil { - return err - } // If len is greater than 0, it means we may have been // provided the VM name. If so, we check. The VM name, diff --git a/cmd/podman/machine/start.go b/cmd/podman/machine/start.go index c95e15e206b9..42675bd6d47b 100644 --- a/cmd/podman/machine/start.go +++ b/cmd/podman/machine/start.go @@ -17,7 +17,7 @@ var ( Use: "start [options] [MACHINE]", Short: "Start an existing machine", Long: "Start a managed virtual machine ", - PersistentPreRunE: rootlessOnly, + PersistentPreRunE: machinePreRunE, RunE: start, Args: cobra.MaximumNArgs(1), Example: `podman machine start podman-machine-default`, @@ -53,11 +53,6 @@ func start(_ *cobra.Command, args []string) error { vmName = args[0] } - provider, err := GetSystemProvider() - if err != nil { - return err - } - vm, err = provider.LoadVMByName(vmName) if err != nil { return err diff --git a/cmd/podman/machine/stop.go b/cmd/podman/machine/stop.go index 88be864c5465..612e3ae9a6d4 100644 --- a/cmd/podman/machine/stop.go +++ b/cmd/podman/machine/stop.go @@ -17,7 +17,7 @@ var ( Use: "stop [MACHINE]", Short: "Stop an existing machine", Long: "Stop a managed virtual machine ", - PersistentPreRunE: rootlessOnly, + PersistentPreRunE: machinePreRunE, RunE: stop, Args: cobra.MaximumNArgs(1), Example: `podman machine stop podman-machine-default`, @@ -42,10 +42,7 @@ func stop(cmd *cobra.Command, args []string) error { if len(args) > 0 && len(args[0]) > 0 { vmName = args[0] } - provider, err := GetSystemProvider() - if err != nil { - return err - } + vm, err = provider.LoadVMByName(vmName) if err != nil { return err diff --git a/cmd/podman/system/reset_machine.go b/cmd/podman/system/reset_machine.go index 4994b422b6bc..fef5c75937a3 100644 --- a/cmd/podman/system/reset_machine.go +++ b/cmd/podman/system/reset_machine.go @@ -4,11 +4,11 @@ package system import ( - cmdMach "github.com/containers/podman/v4/cmd/podman/machine" + p "github.com/containers/podman/v4/pkg/machine/provider" ) func resetMachine() error { - provider, err := cmdMach.GetSystemProvider() + provider, err := p.Get() if err != nil { return err } diff --git a/pkg/machine/e2e/README.md b/pkg/machine/e2e/README.md new file mode 100644 index 000000000000..9f430b1460ae --- /dev/null +++ b/pkg/machine/e2e/README.md @@ -0,0 +1,19 @@ +# Working README for running the machine tests + + +## Linux + +### QEMU + +`make localmachine` + +## Microsoft Windows + +### HyperV + +1. Open a powershell as admin +2. $env:CONTAINERS_MACHINE_PROVIDER="hyperv" +3. $env:MACHINE_IMAGE="https://fedorapeople.org/groups/podman/testing/hyperv/fedora-coreos-38.20230830.dev.0-hyperv.x86_64.vhdx.zip" +4. `./test/tools/build/ginkgo.exe -vv --tags "remote exclude_graphdriver_btrfs btrfs_noversion exclude_graphdriver_devicemapper containers_image_openpgp remote" -timeout=90m --trace --no-color pkg/machine/e2e/. ` + +Note: Add `--focus-file "basic_test.go" ` to only run basic test diff --git a/pkg/machine/e2e/config_linux_test.go b/pkg/machine/e2e/config_linux_test.go new file mode 100644 index 000000000000..f07121a90f93 --- /dev/null +++ b/pkg/machine/e2e/config_linux_test.go @@ -0,0 +1,3 @@ +package e2e_test + +const podmanBinary = "../../../bin/podman-remote" diff --git a/pkg/machine/e2e/config_test.go b/pkg/machine/e2e/config_test.go index 321d2766783e..540d0f30bc7b 100644 --- a/pkg/machine/e2e/config_test.go +++ b/pkg/machine/e2e/config_test.go @@ -97,7 +97,7 @@ func newMB() (*machineTestBuilder, error) { if err != nil { return nil, err } - mb.podmanBinary = filepath.Join(cwd, "../../../bin/podman-remote") + mb.podmanBinary = filepath.Join(cwd, podmanBinary) if os.Getenv("PODMAN_BINARY") != "" { mb.podmanBinary = os.Getenv("PODMAN_BINARY") } diff --git a/pkg/machine/e2e/config_windows_test.go b/pkg/machine/e2e/config_windows_test.go new file mode 100644 index 000000000000..6fa5cdd80e06 --- /dev/null +++ b/pkg/machine/e2e/config_windows_test.go @@ -0,0 +1,3 @@ +package e2e_test + +const podmanBinary = "../../../bin/windows/podman.exe" diff --git a/pkg/machine/e2e/machine_test.go b/pkg/machine/e2e/machine_test.go index df80ca196852..b392fb2838e5 100644 --- a/pkg/machine/e2e/machine_test.go +++ b/pkg/machine/e2e/machine_test.go @@ -12,7 +12,7 @@ import ( "time" "github.com/containers/podman/v4/pkg/machine" - "github.com/containers/podman/v4/pkg/machine/qemu" + "github.com/containers/podman/v4/pkg/machine/provider" . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) @@ -26,7 +26,7 @@ const ( ) var ( - tmpDir = "/var/tmp" + tmpDir = os.TempDir() fqImageName string suiteImageName string ) @@ -44,28 +44,39 @@ func TestMachine(t *testing.T) { } var _ = BeforeSuite(func() { - dd, err := qemu.VirtualizationProvider().NewDownload("") + testProvider, err := provider.Get() if err != nil { - Fail("unable to create new download") + Fail("unable to create testProvider") } - fcd, err := dd.GetFCOSDownload(defaultStream) + + downloadLocation := os.Getenv("MACHINE_IMAGE") + + dd, err := testProvider.NewDownload("") if err != nil { - Fail("unable to get virtual machine image") + Fail("unable to create new download") + } + if len(downloadLocation) < 1 { + fcd, err := dd.GetFCOSDownload(defaultStream) + if err != nil { + Fail("unable to get virtual machine image") + } + downloadLocation = fcd.Location } - suiteImageName = strings.TrimSuffix(path.Base(fcd.Location), ".xz") + compressionExtension := fmt.Sprintf(".%s", testProvider.Compression().String()) + suiteImageName = strings.TrimSuffix(path.Base(downloadLocation), compressionExtension) fqImageName = filepath.Join(tmpDir, suiteImageName) if _, err := os.Stat(fqImageName); err != nil { if os.IsNotExist(err) { - getMe, err := url2.Parse(fcd.Location) + getMe, err := url2.Parse(downloadLocation) if err != nil { Fail(fmt.Sprintf("unable to create url for download: %q", err)) } now := time.Now() - if err := machine.DownloadVMImage(getMe, suiteImageName, fqImageName+".xz"); err != nil { + if err := machine.DownloadVMImage(getMe, suiteImageName, fqImageName+compressionExtension); err != nil { Fail(fmt.Sprintf("unable to download machine image: %q", err)) } GinkgoWriter.Println("Download took: ", time.Since(now).String()) - if err := machine.Decompress(fqImageName+".xz", fqImageName); err != nil { + if err := machine.Decompress(fqImageName+compressionExtension, fqImageName); err != nil { Fail(fmt.Sprintf("unable to decompress image file: %q", err)) } } else { diff --git a/cmd/podman/machine/platform.go b/pkg/machine/provider/platform.go similarity index 92% rename from cmd/podman/machine/platform.go rename to pkg/machine/provider/platform.go index 71b978e0bf9a..184242358dcc 100644 --- a/cmd/podman/machine/platform.go +++ b/pkg/machine/provider/platform.go @@ -1,6 +1,6 @@ //go:build (amd64 && !windows && amd64 && !darwin) || (arm64 && !windows && arm64 && !darwin) || (amd64 && darwin) -package machine +package provider import ( "fmt" @@ -12,7 +12,7 @@ import ( "github.com/sirupsen/logrus" ) -func GetSystemProvider() (machine.VirtProvider, error) { +func Get() (machine.VirtProvider, error) { cfg, err := config.Default() if err != nil { return nil, err diff --git a/cmd/podman/machine/platform_darwin.go b/pkg/machine/provider/platform_darwin.go similarity index 93% rename from cmd/podman/machine/platform_darwin.go rename to pkg/machine/provider/platform_darwin.go index c3b6b9cd2228..bba742066159 100644 --- a/cmd/podman/machine/platform_darwin.go +++ b/pkg/machine/provider/platform_darwin.go @@ -1,6 +1,6 @@ //go:build darwin && arm64 -package machine +package provider import ( "fmt" @@ -13,7 +13,7 @@ import ( "github.com/sirupsen/logrus" ) -func GetSystemProvider() (machine.VirtProvider, error) { +func Get() (machine.VirtProvider, error) { cfg, err := config.Default() if err != nil { return nil, err diff --git a/cmd/podman/machine/platform_windows.go b/pkg/machine/provider/platform_windows.go similarity index 92% rename from cmd/podman/machine/platform_windows.go rename to pkg/machine/provider/platform_windows.go index 82b34e3c334e..ffa390aabd42 100644 --- a/cmd/podman/machine/platform_windows.go +++ b/pkg/machine/provider/platform_windows.go @@ -1,4 +1,4 @@ -package machine +package provider import ( "fmt" @@ -11,7 +11,7 @@ import ( "github.com/sirupsen/logrus" ) -func GetSystemProvider() (machine.VirtProvider, error) { +func Get() (machine.VirtProvider, error) { cfg, err := config.Default() if err != nil { return nil, err