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:
Ashley Cui
2021-04-28 14:18:28 -04:00
parent 476c76f580
commit 53057d5c20
4 changed files with 32 additions and 0 deletions

View File

@ -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)

View File

@ -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

View File

@ -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 {

View File

@ -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
}