From 5e183321183d55a0b5eb27bba174f0e7c2c099e8 Mon Sep 17 00:00:00 2001 From: Gaurav Aradhye Date: Fri, 2 May 2014 13:54:50 +0530 Subject: [PATCH] CLOUDSTACK-6257: Adding function to check the VM state (cherry picked from commit 6598167bedb1f00e9d1efc12b82999f8e822d5d6) --- tools/marvin/marvin/codes.py | 5 ++++ tools/marvin/marvin/lib/base.py | 45 ++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/tools/marvin/marvin/codes.py b/tools/marvin/marvin/codes.py index 28e907cbcd8..98299fa9af0 100644 --- a/tools/marvin/marvin/codes.py +++ b/tools/marvin/marvin/codes.py @@ -31,6 +31,11 @@ """ RUNNING = "Running" +STOPPED = "Stopped" +STOPPING = "Stopping" +STARTING = "Starting" +DESTROYED = "Destroyed" +EXPUNGING = "Expunging" RECURRING = "RECURRING" ENABLED = "Enabled" NETWORK_OFFERING = "network_offering" diff --git a/tools/marvin/marvin/lib/base.py b/tools/marvin/marvin/lib/base.py index ca7fdc6f124..b70789f8b53 100644 --- a/tools/marvin/marvin/lib/base.py +++ b/tools/marvin/marvin/lib/base.py @@ -22,7 +22,9 @@ import marvin from utils import is_server_ssh_ready, random_gen from marvin.cloudstackAPI import * -from marvin.codes import FAILED, PASS +from marvin.codes import (FAILED, FAIL, PASS, RUNNING, STOPPED, + STARTING, DESTROYED, EXPUNGING, + STOPPING) from marvin.cloudstackException import GetDetailExceptionInfo from marvin.lib.utils import validateList # Import System modules @@ -222,6 +224,16 @@ class User: class VirtualMachine: """Manage virtual machine lifecycle""" + '''Class level variables''' + # Variables denoting VM state - start + STOPPED = STOPPED + RUNNING = RUNNING + DESTROYED = DESTROYED + EXPUNGING = EXPUNGING + STOPPING = STOPPING + STARTING = STARTING + # Varibles denoting VM state - end + def __init__(self, items, services): self.__dict__.update(items) if "username" in services: @@ -471,6 +483,10 @@ class VirtualMachine: if forced: cmd.forced = forced apiclient.stopVirtualMachine(cmd) + response = self.getState(apiclient, VirtualMachine.STOPPED) + if response[0] == FAIL: + raise Exception(response[1]) + return def reboot(self, apiclient): """Reboot the instance""" @@ -522,6 +538,33 @@ class VirtualMachine: ) return self.ssh_client + def getState(self, apiclient, state, timeout=600): + """List VM and check if its state is as expected + @returnValue - List[Result, Reason] + 1) Result - FAIL if there is any exception + in the operation or VM state does not change + to expected state in given time else PASS + 2) Reason - Reason for failure""" + + returnValue = [FAIL, "VM state not trasited to %s,\ + operation timed out" % state] + + while timeout>0: + try: + vms = VirtualMachine.list(apiclient, id=self.id, listAll=True) + validationresult = validateList(vms) + if validationresult[0] == FAIL: + raise Exception("VM list validation failed: %s" % validationresult[2]) + elif str(vms[0].state).lower() == str(state).lower(): + returnValue = [PASS, None] + break + except Exception as e: + returnValue = [FAIL, e] + break + time.sleep(60) + timeout -= 60 + return returnValue + def resetSshKey(self, apiclient, **kwargs): """Resets SSH key"""