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.OS = runtime.GOOS
provider := GetSystemDefaultProvider()
provider, err := GetSystemProvider()
if err != nil {
return nil, err
}
var listOpts machine.ListOptions
listResponse, err := provider.List(listOpts)
if err != nil {

View File

@ -30,7 +30,6 @@ var (
initOptionalFlags = InitOptionalFlags{}
defaultMachineName = machine.DefaultMachineName
now bool
defaultProvider = GetSystemDefaultProvider()
)
// 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
)
provider := defaultProvider
provider, err := GetSystemProvider()
if err != nil {
return err
}
initOpts.Name = defaultMachineName
if len(args) > 0 {
if len(args[0]) > maxMachineNameSize {

View File

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

View File

@ -66,7 +66,10 @@ func list(cmd *cobra.Command, args []string) error {
err error
)
provider := GetSystemDefaultProvider()
provider, err := GetSystemProvider()
if err != nil {
return err
}
listResponse, err = provider.List(opts)
if err != nil {
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) {
suggestions := []string{}
provider := GetSystemDefaultProvider()
provider, err := GetSystemProvider()
if err != nil {
return nil, cobra.ShellCompDirectiveNoFileComp
}
machines, err := provider.List(machine.ListOptions{})
if err != nil {
cobra.CompErrorln(err.Error())

View File

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

View File

@ -4,10 +4,34 @@
package machine
import (
"fmt"
"os"
"github.com/containers/common/pkg/config"
"github.com/containers/podman/v4/pkg/machine"
"github.com/containers/podman/v4/pkg/machine/qemu"
"github.com/sirupsen/logrus"
)
func GetSystemDefaultProvider() machine.VirtProvider {
return qemu.GetVirtualizationProvider()
func GetSystemProvider() (machine.VirtProvider, error) {
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
import (
"fmt"
"os"
"github.com/containers/common/pkg/config"
"github.com/containers/podman/v4/pkg/machine"
"github.com/containers/podman/v4/pkg/machine/hyperv"
"github.com/containers/podman/v4/pkg/machine/wsl"
"github.com/sirupsen/logrus"
)
func GetSystemDefaultProvider() machine.VirtProvider {
// This is a work-around for default provider on windows while
// hyperv is one developer.
// TODO this needs to be changed back
if _, exists := os.LookupEnv("HYPERV"); exists {
return hyperv.GetVirtualizationProvider()
func GetSystemProvider() (machine.VirtProvider, error) {
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.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]
}
provider := GetSystemDefaultProvider()
provider, err := GetSystemProvider()
if err != nil {
return err
}
vm, err = provider.LoadVMByName(vmName)
if err != nil {
return err

View File

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

View File

@ -53,7 +53,10 @@ func ssh(cmd *cobra.Command, args []string) error {
// Set the VM to default
vmName := defaultMachineName
provider := GetSystemDefaultProvider()
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,

View File

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

View File

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

View File

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

View File

@ -10,6 +10,7 @@ import (
"net/url"
"os"
"path/filepath"
"strings"
"time"
"github.com/containers/storage/pkg/homedir"
@ -413,3 +414,20 @@ const (
MachineLocal
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)
}
}