mirror of
https://github.com/containers/podman.git
synced 2025-05-21 17:16:22 +08:00
Check if another VM is running on machine start
Only one VM can be up at a time. If another VM is running, or the current VM is running, error out on a podman machine start [NO TESTS NEEDED] Signed-off-by: Ashley Cui <acui@redhat.com>
This commit is contained in:
@ -7,6 +7,7 @@ import (
|
|||||||
"github.com/containers/podman/v3/pkg/domain/entities"
|
"github.com/containers/podman/v3/pkg/domain/entities"
|
||||||
"github.com/containers/podman/v3/pkg/machine"
|
"github.com/containers/podman/v3/pkg/machine"
|
||||||
"github.com/containers/podman/v3/pkg/machine/qemu"
|
"github.com/containers/podman/v3/pkg/machine/qemu"
|
||||||
|
"github.com/pkg/errors"
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -40,6 +41,18 @@ func start(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]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We only have qemu VM's for now
|
||||||
|
active, activeName, err := qemu.CheckActiveVM()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if active {
|
||||||
|
if vmName == activeName {
|
||||||
|
return errors.Wrapf(machine.ErrVMAlreadyRunning, "cannot start VM %s", vmName)
|
||||||
|
}
|
||||||
|
return errors.Wrapf(machine.ErrMultipleActiveVM, "cannot start VM %s. VM %s is currently running", vmName, activeName)
|
||||||
|
}
|
||||||
switch vmType {
|
switch vmType {
|
||||||
default:
|
default:
|
||||||
vm, err = qemu.LoadVMByName(vmName)
|
vm, err = qemu.LoadVMByName(vmName)
|
||||||
|
@ -14,6 +14,9 @@ Podman on MacOS requires a virtual machine. This is because containers are Linux
|
|||||||
containers do not run on any other OS because containers' core functionality are
|
containers do not run on any other OS because containers' core functionality are
|
||||||
tied to the Linux kernel.
|
tied to the Linux kernel.
|
||||||
|
|
||||||
|
Only one Podman managed VM can be active at a time. If a VM is already running,
|
||||||
|
`podman machine start` will return an error.
|
||||||
|
|
||||||
**podman machine start** starts a Linux virtual machine where containers are run.
|
**podman machine start** starts a Linux virtual machine where containers are run.
|
||||||
|
|
||||||
## OPTIONS
|
## OPTIONS
|
||||||
|
@ -30,6 +30,8 @@ var (
|
|||||||
DefaultIgnitionUserName = "core"
|
DefaultIgnitionUserName = "core"
|
||||||
ErrNoSuchVM = errors.New("VM does not exist")
|
ErrNoSuchVM = errors.New("VM does not exist")
|
||||||
ErrVMAlreadyExists = errors.New("VM already exists")
|
ErrVMAlreadyExists = errors.New("VM already exists")
|
||||||
|
ErrVMAlreadyRunning = errors.New("VM already running")
|
||||||
|
ErrMultipleActiveVM = errors.New("only one VM can be active at a time")
|
||||||
)
|
)
|
||||||
|
|
||||||
type Download struct {
|
type Download struct {
|
||||||
|
@ -519,3 +519,17 @@ func IsValidVMName(name string) (bool, error) {
|
|||||||
}
|
}
|
||||||
return false, nil
|
return false, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CheckActiveVM checks if there is a VM already running
|
||||||
|
func CheckActiveVM() (bool, string, error) {
|
||||||
|
vms, err := GetVMInfos()
|
||||||
|
if err != nil {
|
||||||
|
return false, "", errors.Wrap(err, "error checking VM active")
|
||||||
|
}
|
||||||
|
for _, vm := range vms {
|
||||||
|
if vm.Running {
|
||||||
|
return true, vm.Name, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false, "", nil
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user