mirror of
https://github.com/containers/podman.git
synced 2025-05-20 00:27:03 +08:00
Merge pull request #18976 from jakecorrenti/fully-deprecate-machinevmv1-monitorv1
No longer support deprecated legacy QEMU machine structures
This commit is contained in:
@ -19,6 +19,12 @@ import (
|
||||
"github.com/sirupsen/logrus"
|
||||
)
|
||||
|
||||
var (
|
||||
// defaultQMPTimeout is the timeout duration for the
|
||||
// qmp monitor interactions.
|
||||
defaultQMPTimeout = 2 * time.Second
|
||||
)
|
||||
|
||||
type QEMUVirtualization struct {
|
||||
machine.Virtualization
|
||||
}
|
||||
@ -238,14 +244,8 @@ func getVMInfos() ([]*machine.ListResponse, error) {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = json.Unmarshal(b, vm)
|
||||
if err != nil {
|
||||
// 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
|
||||
}
|
||||
if err = json.Unmarshal(b, vm); err != nil {
|
||||
return err
|
||||
}
|
||||
listEntry := new(machine.ListResponse)
|
||||
|
||||
@ -400,53 +400,3 @@ func VirtualizationProvider() machine.VirtProvider {
|
||||
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
|
||||
}
|
||||
|
||||
// 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
|
||||
// volume driver and adds them to the machine
|
||||
func (v *MachineVM) addMountsToVM(opts machine.InitOptions) error {
|
||||
@ -1398,22 +1314,6 @@ func (v *MachineVM) setPIDSocket() error {
|
||||
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 {
|
||||
if info, err := os.Stat(sock); err == nil && info.Mode()&fs.ModeSocket == fs.ModeSocket {
|
||||
_, err = net.DialTimeout("unix", dockerSock, dockerConnectTimeout)
|
||||
@ -1444,14 +1344,7 @@ func (v *MachineVM) update() error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = json.Unmarshal(b, v)
|
||||
if err != nil {
|
||||
err = migrateVM(v.ConfigPath.GetPath(), b, v)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return err
|
||||
return json.Unmarshal(b, v)
|
||||
}
|
||||
|
||||
func (v *MachineVM) writeConfig() error {
|
||||
|
Reference in New Issue
Block a user