mirror of https://github.com/containers/podman.git
No longer support deprecated legacy QEMU machine structures
Removes the `MachineVMV1` and `MonitorV1` structures that have been deprecated for a long enough period of time that it makes sense to no longer support them. Results in the removal of deprecated `getSocketAndPid` as well. The migration code was added in commit `6e0e1cbddd5e1c5dff51215ad2b41a99d890fad8` and made it into release `v4.1.0` [NO NEW TESTS NEEDED] Signed-off-by: Jake Correnti <jakecorrenti+github@proton.me>
This commit is contained in:
parent
ee5f582fbc
commit
2b95700bca
|
@ -19,6 +19,12 @@ import (
|
||||||
"github.com/sirupsen/logrus"
|
"github.com/sirupsen/logrus"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// defaultQMPTimeout is the timeout duration for the
|
||||||
|
// qmp monitor interactions.
|
||||||
|
defaultQMPTimeout = 2 * time.Second
|
||||||
|
)
|
||||||
|
|
||||||
type QEMUVirtualization struct {
|
type QEMUVirtualization struct {
|
||||||
machine.Virtualization
|
machine.Virtualization
|
||||||
}
|
}
|
||||||
|
@ -238,14 +244,8 @@ func getVMInfos() ([]*machine.ListResponse, error) {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = json.Unmarshal(b, vm)
|
if err = json.Unmarshal(b, vm); err != nil {
|
||||||
if err != nil {
|
return err
|
||||||
// Checking if the file did not unmarshal because it is using
|
|
||||||
// the deprecated config file format.
|
|
||||||
migrateErr := migrateVM(fullPath, b, vm)
|
|
||||||
if migrateErr != nil {
|
|
||||||
return migrateErr
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
listEntry := new(machine.ListResponse)
|
listEntry := new(machine.ListResponse)
|
||||||
|
|
||||||
|
@ -400,53 +400,3 @@ func VirtualizationProvider() machine.VirtProvider {
|
||||||
machine.NewVirtualization(define.Qemu, compression.Xz, define.Qcow, vmtype),
|
machine.NewVirtualization(define.Qemu, compression.Xz, define.Qcow, vmtype),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deprecated: MachineVMV1 is being deprecated in favor a more flexible and informative
|
|
||||||
// structure
|
|
||||||
type MachineVMV1 struct {
|
|
||||||
// CPUs to be assigned to the VM
|
|
||||||
CPUs uint64
|
|
||||||
// The command line representation of the qemu command
|
|
||||||
CmdLine []string
|
|
||||||
// Mounts is the list of remote filesystems to mount
|
|
||||||
Mounts []machine.Mount
|
|
||||||
// IdentityPath is the fq path to the ssh priv key
|
|
||||||
IdentityPath string
|
|
||||||
// IgnitionFilePath is the fq path to the .ign file
|
|
||||||
IgnitionFilePath string
|
|
||||||
// ImageStream is the update stream for the image
|
|
||||||
ImageStream string
|
|
||||||
// ImagePath is the fq path to
|
|
||||||
ImagePath string
|
|
||||||
// Memory in megabytes assigned to the vm
|
|
||||||
Memory uint64
|
|
||||||
// Disk size in gigabytes assigned to the vm
|
|
||||||
DiskSize uint64
|
|
||||||
// Name of the vm
|
|
||||||
Name string
|
|
||||||
// SSH port for user networking
|
|
||||||
Port int
|
|
||||||
// QMPMonitor is the qemu monitor object for sending commands
|
|
||||||
QMPMonitor Monitorv1
|
|
||||||
// RemoteUsername of the vm user
|
|
||||||
RemoteUsername string
|
|
||||||
// Whether this machine should run in a rootful or rootless manner
|
|
||||||
Rootful bool
|
|
||||||
// UID is the numerical id of the user that called machine
|
|
||||||
UID int
|
|
||||||
}
|
|
||||||
|
|
||||||
type Monitorv1 struct {
|
|
||||||
// Address portion of the qmp monitor (/tmp/tmp.sock)
|
|
||||||
Address string
|
|
||||||
// Network portion of the qmp monitor (unix)
|
|
||||||
Network string
|
|
||||||
// Timeout in seconds for qmp monitor transactions
|
|
||||||
Timeout time.Duration
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
// defaultQMPTimeout is the timeout duration for the
|
|
||||||
// qmp monitor interactions.
|
|
||||||
defaultQMPTimeout = 2 * time.Second
|
|
||||||
)
|
|
||||||
|
|
|
@ -107,90 +107,6 @@ type Monitor struct {
|
||||||
Timeout time.Duration
|
Timeout time.Duration
|
||||||
}
|
}
|
||||||
|
|
||||||
// migrateVM takes the old configuration structure and migrates it
|
|
||||||
// to the new structure and writes it to the filesystem
|
|
||||||
func migrateVM(configPath string, config []byte, vm *MachineVM) error {
|
|
||||||
fmt.Printf("Migrating machine %q\n", vm.Name)
|
|
||||||
var old MachineVMV1
|
|
||||||
err := json.Unmarshal(config, &old)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Looks like we loaded the older structure; now we need to migrate
|
|
||||||
// from the old structure to the new structure
|
|
||||||
_, pidFile, err := vm.getSocketandPid()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
pidFilePath := define.VMFile{Path: pidFile}
|
|
||||||
qmpMonitor := Monitor{
|
|
||||||
Address: define.VMFile{Path: old.QMPMonitor.Address},
|
|
||||||
Network: old.QMPMonitor.Network,
|
|
||||||
Timeout: old.QMPMonitor.Timeout,
|
|
||||||
}
|
|
||||||
socketPath, err := getRuntimeDir()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
virtualSocketPath := filepath.Join(socketPath, "podman", vm.Name+"_ready.sock")
|
|
||||||
readySocket := define.VMFile{Path: virtualSocketPath}
|
|
||||||
|
|
||||||
vm.HostUser = machine.HostUser{}
|
|
||||||
vm.ImageConfig = machine.ImageConfig{}
|
|
||||||
vm.ResourceConfig = machine.ResourceConfig{}
|
|
||||||
vm.SSHConfig = machine.SSHConfig{}
|
|
||||||
|
|
||||||
ignitionFilePath, err := define.NewMachineFile(old.IgnitionFilePath, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
imagePath, err := define.NewMachineFile(old.ImagePath, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// setReadySocket will stick the entry into the new struct
|
|
||||||
symlink := vm.Name + "_ready.sock"
|
|
||||||
if err := machine.SetSocket(&vm.ReadySocket, machine.ReadySocketPath(socketPath+"/podman/", vm.Name), &symlink); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
vm.CPUs = old.CPUs
|
|
||||||
vm.CmdLine = old.CmdLine
|
|
||||||
vm.DiskSize = old.DiskSize
|
|
||||||
vm.IdentityPath = old.IdentityPath
|
|
||||||
vm.IgnitionFile = *ignitionFilePath
|
|
||||||
vm.ImagePath = *imagePath
|
|
||||||
vm.ImageStream = old.ImageStream
|
|
||||||
vm.Memory = old.Memory
|
|
||||||
vm.Mounts = old.Mounts
|
|
||||||
vm.Name = old.Name
|
|
||||||
vm.PidFilePath = pidFilePath
|
|
||||||
vm.Port = old.Port
|
|
||||||
vm.QMPMonitor = qmpMonitor
|
|
||||||
vm.ReadySocket = readySocket
|
|
||||||
vm.RemoteUsername = old.RemoteUsername
|
|
||||||
vm.Rootful = old.Rootful
|
|
||||||
vm.UID = old.UID
|
|
||||||
|
|
||||||
// Back up the original config file
|
|
||||||
if err := os.Rename(configPath, configPath+".orig"); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Write the config file
|
|
||||||
if err := vm.writeConfig(); err != nil {
|
|
||||||
// If the config file fails to be written, put the original
|
|
||||||
// config file back before erroring
|
|
||||||
if renameError := os.Rename(configPath+".orig", configPath); renameError != nil {
|
|
||||||
logrus.Warn(renameError)
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
// Remove the backup file
|
|
||||||
return os.Remove(configPath + ".orig")
|
|
||||||
}
|
|
||||||
|
|
||||||
// addMountsToVM converts the volumes passed through the CLI into the specified
|
// addMountsToVM converts the volumes passed through the CLI into the specified
|
||||||
// volume driver and adds them to the machine
|
// volume driver and adds them to the machine
|
||||||
func (v *MachineVM) addMountsToVM(opts machine.InitOptions) error {
|
func (v *MachineVM) addMountsToVM(opts machine.InitOptions) error {
|
||||||
|
@ -1398,22 +1314,6 @@ func (v *MachineVM) setPIDSocket() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deprecated: getSocketandPid is being replaced by setPIDSocket and
|
|
||||||
// machinefiles.
|
|
||||||
func (v *MachineVM) getSocketandPid() (string, string, error) {
|
|
||||||
rtPath, err := getRuntimeDir()
|
|
||||||
if err != nil {
|
|
||||||
return "", "", err
|
|
||||||
}
|
|
||||||
if isRootful() {
|
|
||||||
rtPath = "/run"
|
|
||||||
}
|
|
||||||
socketDir := filepath.Join(rtPath, "podman")
|
|
||||||
pidFile := filepath.Join(socketDir, fmt.Sprintf("%s.pid", v.Name))
|
|
||||||
qemuSocket := filepath.Join(socketDir, fmt.Sprintf("qemu_%s.sock", v.Name))
|
|
||||||
return qemuSocket, pidFile, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func checkSockInUse(sock string) bool {
|
func checkSockInUse(sock string) bool {
|
||||||
if info, err := os.Stat(sock); err == nil && info.Mode()&fs.ModeSocket == fs.ModeSocket {
|
if info, err := os.Stat(sock); err == nil && info.Mode()&fs.ModeSocket == fs.ModeSocket {
|
||||||
_, err = net.DialTimeout("unix", dockerSock, dockerConnectTimeout)
|
_, err = net.DialTimeout("unix", dockerSock, dockerConnectTimeout)
|
||||||
|
@ -1444,14 +1344,7 @@ func (v *MachineVM) update() error {
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
err = json.Unmarshal(b, v)
|
return json.Unmarshal(b, v)
|
||||||
if err != nil {
|
|
||||||
err = migrateVM(v.ConfigPath.GetPath(), b, v)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (v *MachineVM) writeConfig() error {
|
func (v *MachineVM) writeConfig() error {
|
||||||
|
|
Loading…
Reference in New Issue