Merge pull request #21980 from Luap99/machine-locking-fixes

more machine locking fixes
This commit is contained in:
openshift-merge-bot[bot]
2024-03-07 16:51:37 +00:00
committed by GitHub
6 changed files with 72 additions and 68 deletions

View File

@ -208,16 +208,11 @@ func initMachine(cmd *cobra.Command, args []string) error {
// return err // return err
// } // }
mc, err := shim.Init(initOpts, provider) err = shim.Init(initOpts, provider)
if err != nil { if err != nil {
return err return err
} }
// TODO callback needed for the configuration file
if err := mc.Write(); err != nil {
return err
}
newMachineEvent(events.Init, events.Event{Name: initOpts.Name}) newMachineEvent(events.Init, events.Event{Name: initOpts.Name})
fmt.Println("Machine init complete") fmt.Println("Machine init complete")

View File

@ -3,8 +3,6 @@
package machine package machine
import ( import (
"fmt"
"github.com/containers/common/pkg/completion" "github.com/containers/common/pkg/completion"
"github.com/containers/common/pkg/strongunits" "github.com/containers/common/pkg/strongunits"
"github.com/containers/podman/v5/cmd/podman/registry" "github.com/containers/podman/v5/cmd/podman/registry"
@ -90,10 +88,6 @@ func init() {
} }
func setMachine(cmd *cobra.Command, args []string) error { func setMachine(cmd *cobra.Command, args []string) error {
var (
err error
)
vmName := defaultMachineName vmName := defaultMachineName
if len(args) > 0 && len(args[0]) > 0 { if len(args) > 0 && len(args[0]) > 0 {
vmName = args[0] vmName = args[0]
@ -113,20 +107,14 @@ func setMachine(cmd *cobra.Command, args []string) error {
setOpts.Rootful = &setFlags.Rootful setOpts.Rootful = &setFlags.Rootful
} }
if cmd.Flags().Changed("cpus") { if cmd.Flags().Changed("cpus") {
mc.Resources.CPUs = setFlags.CPUs setOpts.CPUs = &setFlags.CPUs
setOpts.CPUs = &mc.Resources.CPUs
} }
if cmd.Flags().Changed("memory") { if cmd.Flags().Changed("memory") {
mc.Resources.Memory = strongunits.MiB(setFlags.Memory) newMemory := strongunits.MiB(setFlags.Memory)
setOpts.Memory = &mc.Resources.Memory setOpts.Memory = &newMemory
} }
if cmd.Flags().Changed("disk-size") { if cmd.Flags().Changed("disk-size") {
newDiskSizeGB := strongunits.GiB(setFlags.DiskSize) newDiskSizeGB := strongunits.GiB(setFlags.DiskSize)
if newDiskSizeGB <= mc.Resources.DiskSize {
return fmt.Errorf("new disk size must be larger than %d GB", mc.Resources.DiskSize)
}
mc.Resources.DiskSize = newDiskSizeGB
setOpts.DiskSize = &newDiskSizeGB setOpts.DiskSize = &newDiskSizeGB
} }
if cmd.Flags().Changed("user-mode-networking") { if cmd.Flags().Changed("user-mode-networking") {

View File

@ -12,7 +12,6 @@ import (
"github.com/containers/podman/v5/pkg/machine/env" "github.com/containers/podman/v5/pkg/machine/env"
"github.com/containers/podman/v5/pkg/machine/shim" "github.com/containers/podman/v5/pkg/machine/shim"
"github.com/containers/podman/v5/pkg/machine/vmconfigs" "github.com/containers/podman/v5/pkg/machine/vmconfigs"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -82,19 +81,6 @@ func start(_ *cobra.Command, args []string) error {
fmt.Printf("Starting machine %q\n", vmName) fmt.Printf("Starting machine %q\n", vmName)
} }
// Set starting to true
mc.Starting = true
if err := mc.Write(); err != nil {
logrus.Error(err)
}
// Set starting to false on exit
defer func() {
mc.Starting = false
if err := mc.Write(); err != nil {
logrus.Error(err)
}
}()
if err := shim.Start(mc, provider, dirs, startOpts); err != nil { if err := shim.Start(mc, provider, dirs, startOpts); err != nil {
return err return err
} }

View File

@ -4,14 +4,12 @@ package machine
import ( import (
"fmt" "fmt"
"time"
"github.com/containers/podman/v5/cmd/podman/registry" "github.com/containers/podman/v5/cmd/podman/registry"
"github.com/containers/podman/v5/libpod/events" "github.com/containers/podman/v5/libpod/events"
"github.com/containers/podman/v5/pkg/machine/env" "github.com/containers/podman/v5/pkg/machine/env"
"github.com/containers/podman/v5/pkg/machine/shim" "github.com/containers/podman/v5/pkg/machine/shim"
"github.com/containers/podman/v5/pkg/machine/vmconfigs" "github.com/containers/podman/v5/pkg/machine/vmconfigs"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -59,12 +57,6 @@ func stop(cmd *cobra.Command, args []string) error {
return err return err
} }
// Update last time up
mc.LastUp = time.Now()
if err := mc.Write(); err != nil {
logrus.Errorf("unable to write configuration file: %q", err)
}
fmt.Printf("Machine %q stopped successfully\n", vmName) fmt.Printf("Machine %q stopped successfully\n", vmName)
newMachineEvent(events.Stop, events.Event{Name: vmName}) newMachineEvent(events.Stop, events.Event{Name: vmName})
return nil return nil

View File

@ -15,6 +15,7 @@ import (
machineDefine "github.com/containers/podman/v5/pkg/machine/define" machineDefine "github.com/containers/podman/v5/pkg/machine/define"
"github.com/containers/podman/v5/pkg/machine/env" "github.com/containers/podman/v5/pkg/machine/env"
"github.com/containers/podman/v5/pkg/machine/ignition" "github.com/containers/podman/v5/pkg/machine/ignition"
"github.com/containers/podman/v5/pkg/machine/lock"
"github.com/containers/podman/v5/pkg/machine/proxyenv" "github.com/containers/podman/v5/pkg/machine/proxyenv"
"github.com/containers/podman/v5/pkg/machine/vmconfigs" "github.com/containers/podman/v5/pkg/machine/vmconfigs"
"github.com/containers/podman/v5/utils" "github.com/containers/podman/v5/utils"
@ -66,7 +67,7 @@ func List(vmstubbers []vmconfigs.VMProvider, _ machine.ListOptions) ([]*machine.
return lrs, nil return lrs, nil
} }
func Init(opts machineDefine.InitOptions, mp vmconfigs.VMProvider) (*vmconfigs.MachineConfig, error) { func Init(opts machineDefine.InitOptions, mp vmconfigs.VMProvider) error {
var ( var (
err error err error
imageExtension string imageExtension string
@ -79,21 +80,28 @@ func Init(opts machineDefine.InitOptions, mp vmconfigs.VMProvider) (*vmconfigs.M
dirs, err := env.GetMachineDirs(mp.VMType()) dirs, err := env.GetMachineDirs(mp.VMType())
if err != nil { if err != nil {
return nil, err return err
} }
sshIdentityPath, err := env.GetSSHIdentityPath(machineDefine.DefaultIdentityName) sshIdentityPath, err := env.GetSSHIdentityPath(machineDefine.DefaultIdentityName)
if err != nil { if err != nil {
return nil, err return err
} }
sshKey, err := machine.GetSSHKeys(sshIdentityPath) sshKey, err := machine.GetSSHKeys(sshIdentityPath)
if err != nil { if err != nil {
return nil, err return err
} }
mc, err := vmconfigs.NewMachineConfig(opts, dirs, sshIdentityPath, mp.VMType()) machineLock, err := lock.GetMachineLock(opts.Name, dirs.ConfigDir.GetPath())
if err != nil { if err != nil {
return nil, err return err
}
machineLock.Lock()
defer machineLock.Unlock()
mc, err := vmconfigs.NewMachineConfig(opts, dirs, sshIdentityPath, mp.VMType(), machineLock)
if err != nil {
return err
} }
mc.Version = vmconfigs.MachineConfigVersion mc.Version = vmconfigs.MachineConfigVersion
@ -128,7 +136,7 @@ func Init(opts machineDefine.InitOptions, mp vmconfigs.VMProvider) (*vmconfigs.M
imagePath, err = dirs.DataDir.AppendToNewVMFile(fmt.Sprintf("%s-%s%s", opts.Name, runtime.GOARCH, imageExtension), nil) imagePath, err = dirs.DataDir.AppendToNewVMFile(fmt.Sprintf("%s-%s%s", opts.Name, runtime.GOARCH, imageExtension), nil)
if err != nil { if err != nil {
return nil, err return err
} }
mc.ImagePath = imagePath mc.ImagePath = imagePath
@ -142,7 +150,7 @@ func Init(opts machineDefine.InitOptions, mp vmconfigs.VMProvider) (*vmconfigs.M
// "docker://quay.io/something/someManifest // "docker://quay.io/something/someManifest
if err := mp.GetDisk(opts.Image, dirs, mc); err != nil { if err := mp.GetDisk(opts.Image, dirs, mc); err != nil {
return nil, err return err
} }
callbackFuncs.Add(mc.ImagePath.Delete) callbackFuncs.Add(mc.ImagePath.Delete)
@ -151,7 +159,7 @@ func Init(opts machineDefine.InitOptions, mp vmconfigs.VMProvider) (*vmconfigs.M
ignitionFile, err := mc.IgnitionFile() ignitionFile, err := mc.IgnitionFile()
if err != nil { if err != nil {
return nil, err return err
} }
uid := os.Getuid() uid := os.Getuid()
@ -184,22 +192,22 @@ func Init(opts machineDefine.InitOptions, mp vmconfigs.VMProvider) (*vmconfigs.M
// copy it into the conf dir // copy it into the conf dir
if len(opts.IgnitionPath) > 0 { if len(opts.IgnitionPath) > 0 {
err = ignBuilder.BuildWithIgnitionFile(opts.IgnitionPath) err = ignBuilder.BuildWithIgnitionFile(opts.IgnitionPath)
return nil, err return err
} }
err = ignBuilder.GenerateIgnitionConfig() err = ignBuilder.GenerateIgnitionConfig()
if err != nil { if err != nil {
return nil, err return err
} }
readyIgnOpts, err := mp.PrepareIgnition(mc, &ignBuilder) readyIgnOpts, err := mp.PrepareIgnition(mc, &ignBuilder)
if err != nil { if err != nil {
return nil, err return err
} }
readyUnitFile, err := ignition.CreateReadyUnitFile(mp.VMType(), readyIgnOpts) readyUnitFile, err := ignition.CreateReadyUnitFile(mp.VMType(), readyIgnOpts)
if err != nil { if err != nil {
return nil, err return err
} }
readyUnit := ignition.Unit{ readyUnit := ignition.Unit{
@ -216,7 +224,7 @@ func Init(opts machineDefine.InitOptions, mp vmconfigs.VMProvider) (*vmconfigs.M
// TODO AddSSHConnectionToPodmanSocket could take an machineconfig instead // TODO AddSSHConnectionToPodmanSocket could take an machineconfig instead
if err := connection.AddSSHConnectionsToPodmanSocket(mc.HostUser.UID, mc.SSH.Port, mc.SSH.IdentityPath, mc.Name, mc.SSH.RemoteUsername, opts); err != nil { if err := connection.AddSSHConnectionsToPodmanSocket(mc.HostUser.UID, mc.SSH.Port, mc.SSH.IdentityPath, mc.Name, mc.SSH.RemoteUsername, opts); err != nil {
return nil, err return err
} }
cleanup := func() error { cleanup := func() error {
@ -226,15 +234,15 @@ func Init(opts machineDefine.InitOptions, mp vmconfigs.VMProvider) (*vmconfigs.M
err = mp.CreateVM(createOpts, mc, &ignBuilder) err = mp.CreateVM(createOpts, mc, &ignBuilder)
if err != nil { if err != nil {
return nil, err return err
} }
err = ignBuilder.Build() err = ignBuilder.Build()
if err != nil { if err != nil {
return nil, err return err
} }
return mc, err return mc.Write()
} }
// VMExists looks across given providers for a machine's existence. returns the actual config and found bool // VMExists looks across given providers for a machine's existence. returns the actual config and found bool
@ -358,7 +366,9 @@ func stopLocked(mc *vmconfigs.MachineConfig, mp vmconfigs.VMProvider, dirs *mach
} }
} }
return nil // Update last time up
mc.LastUp = time.Now()
return mc.Write()
} }
func Start(mc *vmconfigs.MachineConfig, mp vmconfigs.VMProvider, dirs *machineDefine.MachineDirs, opts machine.StartOptions) error { func Start(mc *vmconfigs.MachineConfig, mp vmconfigs.VMProvider, dirs *machineDefine.MachineDirs, opts machine.StartOptions) error {
@ -368,6 +378,19 @@ func Start(mc *vmconfigs.MachineConfig, mp vmconfigs.VMProvider, dirs *machineDe
mc.Lock() mc.Lock()
defer mc.Unlock() defer mc.Unlock()
// Set starting to true
mc.Starting = true
if err := mc.Write(); err != nil {
logrus.Error(err)
}
// Set starting to false on exit
defer func() {
mc.Starting = false
if err := mc.Write(); err != nil {
logrus.Error(err)
}
}()
gvproxyPidFile, err := dirs.RuntimeDir.AppendToNewVMFile("gvproxy.pid", nil) gvproxyPidFile, err := dirs.RuntimeDir.AppendToNewVMFile("gvproxy.pid", nil)
if err != nil { if err != nil {
return err return err
@ -485,6 +508,25 @@ func Set(mc *vmconfigs.MachineConfig, mp vmconfigs.VMProvider, opts machineDefin
mc.Lock() mc.Lock()
defer mc.Unlock() defer mc.Unlock()
if err := mc.Refresh(); err != nil {
return fmt.Errorf("reload config: %w", err)
}
if opts.CPUs != nil {
mc.Resources.CPUs = *opts.CPUs
}
if opts.Memory != nil {
mc.Resources.Memory = *opts.Memory
}
if opts.DiskSize != nil {
if *opts.DiskSize <= mc.Resources.DiskSize {
return fmt.Errorf("new disk size must be larger than %d GB", mc.Resources.DiskSize)
}
mc.Resources.DiskSize = *opts.DiskSize
}
if err := mp.SetProviderAttrs(mc, opts); err != nil { if err := mp.SetProviderAttrs(mc, opts); err != nil {
return err return err
} }

View File

@ -18,6 +18,7 @@ import (
"github.com/containers/podman/v5/pkg/machine/lock" "github.com/containers/podman/v5/pkg/machine/lock"
"github.com/containers/podman/v5/pkg/machine/ports" "github.com/containers/podman/v5/pkg/machine/ports"
"github.com/containers/storage/pkg/ioutils" "github.com/containers/storage/pkg/ioutils"
"github.com/containers/storage/pkg/lockfile"
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
@ -42,16 +43,11 @@ var (
type RemoteConnectionType string type RemoteConnectionType string
// NewMachineConfig creates the initial machine configuration file from cli options // NewMachineConfig creates the initial machine configuration file from cli options.
func NewMachineConfig(opts define.InitOptions, dirs *define.MachineDirs, sshIdentityPath string, vmtype define.VMType) (*MachineConfig, error) { func NewMachineConfig(opts define.InitOptions, dirs *define.MachineDirs, sshIdentityPath string, vmtype define.VMType, machineLock *lockfile.LockFile) (*MachineConfig, error) {
mc := new(MachineConfig) mc := new(MachineConfig)
mc.Name = opts.Name mc.Name = opts.Name
mc.dirs = dirs mc.dirs = dirs
machineLock, err := lock.GetMachineLock(opts.Name, dirs.ConfigDir.GetPath())
if err != nil {
return nil, err
}
mc.lock = machineLock mc.lock = machineLock
// Assign Dirs // Assign Dirs
@ -60,6 +56,11 @@ func NewMachineConfig(opts define.InitOptions, dirs *define.MachineDirs, sshIden
return nil, err return nil, err
} }
mc.configPath = cf mc.configPath = cf
// Given that we are locked now and check again that the config file does not exists,
// if it does it means the VM was already created and we should error.
if _, err := os.Stat(cf.Path); err == nil {
return nil, fmt.Errorf("%s: %w", opts.Name, define.ErrVMAlreadyExists)
}
if vmtype != define.QemuVirt && len(opts.USBs) > 0 { if vmtype != define.QemuVirt && len(opts.USBs) > 0 {
return nil, fmt.Errorf("USB host passthrough not supported for %s machines", vmtype) return nil, fmt.Errorf("USB host passthrough not supported for %s machines", vmtype)