Implement machine provider selection

GetSystemDefaultProvider reworked to fetch provider value from
the config file.

Additional environment variable CONTAINERS_MACHINE_PROVIDER is
supported to override the config for testing purposes.

Signed-off-by: Arthur Sengileyev <arthur.sengileyev@gmail.com>
This commit is contained in:
Arthur Sengileyev
2023-01-15 19:12:37 +02:00
parent 19152fa349
commit b5ef9555ab
15 changed files with 118 additions and 22 deletions

View File

@ -101,7 +101,10 @@ func hostInfo() (*entities.MachineHostInfo, error) {
host.Arch = runtime.GOARCH host.Arch = runtime.GOARCH
host.OS = runtime.GOOS host.OS = runtime.GOOS
provider := GetSystemDefaultProvider() provider, err := GetSystemProvider()
if err != nil {
return nil, err
}
var listOpts machine.ListOptions var listOpts machine.ListOptions
listResponse, err := provider.List(listOpts) listResponse, err := provider.List(listOpts)
if err != nil { if err != nil {

View File

@ -30,7 +30,6 @@ var (
initOptionalFlags = InitOptionalFlags{} initOptionalFlags = InitOptionalFlags{}
defaultMachineName = machine.DefaultMachineName defaultMachineName = machine.DefaultMachineName
now bool now bool
defaultProvider = GetSystemDefaultProvider()
) )
// Flags which have a meaning when unspecified that differs from the flag default // Flags which have a meaning when unspecified that differs from the flag default
@ -129,7 +128,10 @@ func initMachine(cmd *cobra.Command, args []string) error {
vm machine.VM vm machine.VM
) )
provider := defaultProvider provider, err := GetSystemProvider()
if err != nil {
return err
}
initOpts.Name = defaultMachineName initOpts.Name = defaultMachineName
if len(args) > 0 { if len(args) > 0 {
if len(args[0]) > maxMachineNameSize { if len(args[0]) > maxMachineNameSize {

View File

@ -51,7 +51,10 @@ func inspect(cmd *cobra.Command, args []string) error {
args = append(args, defaultMachineName) args = append(args, defaultMachineName)
} }
vms := make([]machine.InspectInfo, 0, len(args)) vms := make([]machine.InspectInfo, 0, len(args))
provider := GetSystemDefaultProvider() provider, err := GetSystemProvider()
if err != nil {
return err
}
for _, vmName := range args { for _, vmName := range args {
vm, err := provider.LoadVMByName(vmName) vm, err := provider.LoadVMByName(vmName)
if err != nil { if err != nil {

View File

@ -66,7 +66,10 @@ func list(cmd *cobra.Command, args []string) error {
err error err error
) )
provider := GetSystemDefaultProvider() provider, err := GetSystemProvider()
if err != nil {
return err
}
listResponse, err = provider.List(opts) listResponse, err = provider.List(opts)
if err != nil { if err != nil {
return fmt.Errorf("listing vms: %w", err) return fmt.Errorf("listing vms: %w", err)

View File

@ -64,7 +64,10 @@ func autocompleteMachine(cmd *cobra.Command, args []string, toComplete string) (
func getMachines(toComplete string) ([]string, cobra.ShellCompDirective) { func getMachines(toComplete string) ([]string, cobra.ShellCompDirective) {
suggestions := []string{} suggestions := []string{}
provider := GetSystemDefaultProvider() provider, err := GetSystemProvider()
if err != nil {
return nil, cobra.ShellCompDirectiveNoFileComp
}
machines, err := provider.List(machine.ListOptions{}) machines, err := provider.List(machine.ListOptions{})
if err != nil { if err != nil {
cobra.CompErrorln(err.Error()) cobra.CompErrorln(err.Error())

View File

@ -48,7 +48,10 @@ func machineOSManager(opts ManagerOpts) (pkgOS.Manager, error) {
if opts.VMName == "" { if opts.VMName == "" {
vmName = pkgMachine.DefaultMachineName vmName = pkgMachine.DefaultMachineName
} }
provider := machine.GetSystemDefaultProvider() provider, err := machine.GetSystemProvider()
if err != nil {
return nil, err
}
vm, err := provider.LoadVMByName(vmName) vm, err := provider.LoadVMByName(vmName)
if err != nil { if err != nil {
return nil, err return nil, err

View File

@ -4,10 +4,34 @@
package machine package machine
import ( import (
"fmt"
"os"
"github.com/containers/common/pkg/config"
"github.com/containers/podman/v4/pkg/machine" "github.com/containers/podman/v4/pkg/machine"
"github.com/containers/podman/v4/pkg/machine/qemu" "github.com/containers/podman/v4/pkg/machine/qemu"
"github.com/sirupsen/logrus"
) )
func GetSystemDefaultProvider() machine.VirtProvider { func GetSystemProvider() (machine.VirtProvider, error) {
return qemu.GetVirtualizationProvider() cfg, err := config.Default()
if err != nil {
return nil, err
}
provider := cfg.Machine.Provider
if providerOverride, found := os.LookupEnv("CONTAINERS_MACHINE_PROVIDER"); found {
provider = providerOverride
}
resolvedVMType, err := machine.ParseVMType(provider, machine.QemuVirt)
if err != nil {
return nil, err
}
logrus.Debugf("Using Podman machine with `%s` virtualization provider", resolvedVMType.String())
switch resolvedVMType {
case machine.QemuVirt:
return qemu.GetVirtualizationProvider(), nil
default:
return nil, fmt.Errorf("unsupported virtualization provider: `%s`", resolvedVMType.String())
}
} }

View File

@ -1,19 +1,37 @@
package machine package machine
import ( import (
"fmt"
"os" "os"
"github.com/containers/common/pkg/config"
"github.com/containers/podman/v4/pkg/machine" "github.com/containers/podman/v4/pkg/machine"
"github.com/containers/podman/v4/pkg/machine/hyperv" "github.com/containers/podman/v4/pkg/machine/hyperv"
"github.com/containers/podman/v4/pkg/machine/wsl" "github.com/containers/podman/v4/pkg/machine/wsl"
"github.com/sirupsen/logrus"
) )
func GetSystemDefaultProvider() machine.VirtProvider { func GetSystemProvider() (machine.VirtProvider, error) {
// This is a work-around for default provider on windows while cfg, err := config.Default()
// hyperv is one developer. if err != nil {
// TODO this needs to be changed back return nil, err
if _, exists := os.LookupEnv("HYPERV"); exists { }
return hyperv.GetVirtualizationProvider() provider := cfg.Machine.Provider
if providerOverride, found := os.LookupEnv("CONTAINERS_MACHINE_PROVIDER"); found {
provider = providerOverride
}
resolvedVMType, err := machine.ParseVMType(provider, machine.WSLVirt)
if err != nil {
return nil, err
}
logrus.Debugf("Using Podman machine with `%s` virtualization provider", resolvedVMType.String())
switch resolvedVMType {
case machine.WSLVirt:
return wsl.GetWSLProvider(), nil
case machine.HyperVVirt:
return hyperv.GetVirtualizationProvider(), nil
default:
return nil, fmt.Errorf("unsupported virtualization provider: `%s`", resolvedVMType.String())
} }
return wsl.GetWSLProvider()
} }

View File

@ -63,7 +63,10 @@ func rm(_ *cobra.Command, args []string) error {
vmName = args[0] vmName = args[0]
} }
provider := GetSystemDefaultProvider() provider, err := GetSystemProvider()
if err != nil {
return err
}
vm, err = provider.LoadVMByName(vmName) vm, err = provider.LoadVMByName(vmName)
if err != nil { if err != nil {
return err return err

View File

@ -89,7 +89,10 @@ func setMachine(cmd *cobra.Command, args []string) error {
if len(args) > 0 && len(args[0]) > 0 { if len(args) > 0 && len(args[0]) > 0 {
vmName = args[0] vmName = args[0]
} }
provider := GetSystemDefaultProvider() provider, err := GetSystemProvider()
if err != nil {
return err
}
vm, err = provider.LoadVMByName(vmName) vm, err = provider.LoadVMByName(vmName)
if err != nil { if err != nil {
return err return err

View File

@ -53,7 +53,10 @@ func ssh(cmd *cobra.Command, args []string) error {
// Set the VM to default // Set the VM to default
vmName := defaultMachineName vmName := defaultMachineName
provider := GetSystemDefaultProvider() provider, err := GetSystemProvider()
if err != nil {
return err
}
// If len is greater than 0, it means we may have been // If len is greater than 0, it means we may have been
// provided the VM name. If so, we check. The VM name, // provided the VM name. If so, we check. The VM name,

View File

@ -53,7 +53,11 @@ func start(_ *cobra.Command, args []string) error {
vmName = args[0] vmName = args[0]
} }
provider := GetSystemDefaultProvider() provider, err := GetSystemProvider()
if err != nil {
return err
}
vm, err = provider.LoadVMByName(vmName) vm, err = provider.LoadVMByName(vmName)
if err != nil { if err != nil {
return err return err

View File

@ -42,7 +42,10 @@ func stop(cmd *cobra.Command, args []string) error {
if len(args) > 0 && len(args[0]) > 0 { if len(args) > 0 && len(args[0]) > 0 {
vmName = args[0] vmName = args[0]
} }
provider := GetSystemDefaultProvider() provider, err := GetSystemProvider()
if err != nil {
return err
}
vm, err = provider.LoadVMByName(vmName) vm, err = provider.LoadVMByName(vmName)
if err != nil { if err != nil {
return err return err

View File

@ -8,6 +8,9 @@ import (
) )
func resetMachine() error { func resetMachine() error {
provider := cmdMach.GetSystemDefaultProvider() provider, err := cmdMach.GetSystemProvider()
if err != nil {
return err
}
return provider.RemoveAndCleanMachines() return provider.RemoveAndCleanMachines()
} }

View File

@ -10,6 +10,7 @@ import (
"net/url" "net/url"
"os" "os"
"path/filepath" "path/filepath"
"strings"
"time" "time"
"github.com/containers/storage/pkg/homedir" "github.com/containers/storage/pkg/homedir"
@ -413,3 +414,20 @@ const (
MachineLocal MachineLocal
DockerGlobal DockerGlobal
) )
func ParseVMType(input string, emptyFallback VMType) (VMType, error) {
switch strings.TrimSpace(strings.ToLower(input)) {
case "qemu":
return QemuVirt, nil
case "wsl":
return WSLVirt, nil
case "applehv":
return AppleHvVirt, nil
case "hyperv":
return HyperVVirt, nil
case "":
return emptyFallback, nil
default:
return QemuVirt, fmt.Errorf("unknown VMType `%s`", input)
}
}