cloudstack/tools/testClient/testcase/BVT-tests/test_vm_life_cycle.py

527 lines
20 KiB
Python

# -*- encoding: utf-8 -*-
#
# Copyright (c) 2011 Citrix. All rights reserved.
#
""" BVT tests for Virtual Machine Life Cycle
"""
#Import Local Modules
from cloudstackTestCase import *
from cloudstackAPI import *
from settings import *
import remoteSSHClient
from utils import *
from base import *
#Import System modules
import time
services = TEST_VM_LIFE_CYCLE_SERVICES
class TestDeployVM(cloudstackTestCase):
def setUp(self):
self.apiclient = self.testClient.getApiClient()
self.dbclient = self.testClient.getDbConnection()
def test_deploy_vm(self):
"""Test Deploy Virtual Machine
"""
self.virtual_machine = VirtualMachine.create(self.apiclient, services["small"])
#Validate the following:
# 1. Virtual Machine is accessible via SSH
# 2. listVirtualMachines returns accurate information
# 3. The Cloud Database contains the valid information
self.debug("Verify SSH Access for virtual machine: %s" %self.virtual_machine.id)
try:
self.virtual_machine.get_ssh_client()
except Exception as e:
self.fail("SSH Access failed for %s: %s" %(self.virtual_machine.ipaddress, e))
cmd = listVirtualMachines.listVirtualMachinesCmd()
cmd.id = self.virtual_machine.id
list_vm_response = self.apiclient.listVirtualMachines(cmd)
self.debug("Verify listVirtualMachines response for virtual machine: %s" %self.virtual_machine.id)
self.assertNotEqual(
len(list_vm_response),
0,
"Check VM avaliable in List Virtual Machines"
)
self.assertEqual(
list_vm_response[0].id,
self.virtual_machine.id,
"Check virtual machine id in listVirtualMachines"
)
self.assertEqual(
list_vm_response[0].displayname,
self.virtual_machine.displayname,
"Check virtual machine displayname in listVirtualMachines"
)
self.debug("Verify the database entry for virtual machine: %s" %self.virtual_machine.id)
self.debug("select id, state, private_ip_address from vm_instance where id = %s;" %self.virtual_machine.id)
qresultset = self.dbclient.execute("select id, state, private_ip_address from vm_instance where id = %s;" %self.virtual_machine.id)
self.assertNotEqual(
len(qresultset),
0,
"Check DB Query result set"
)
qresult = qresultset[0]
self.assertEqual(
qresult[0],
self.virtual_machine.id,
"Compare virtual machine id with database record"
)
self.assertEqual(
qresult[1],
'Running',
"Check virtual machine state in the database"
)
self.assertEqual(
qresult[2],
self.virtual_machine.ipaddress,
"Check IP Address in the database"
)
return
def tearDown(self):
try:
self.virtual_machine.delete(self.apiclient)
except Exception as e:
self.debug("Warning! Exception in tearDown: %s" %e)
class TestVMLifeCycle(cloudstackTestCase):
@classmethod
def setUpClass(cls):
cls.api_client = fetch_api_client()
#create small and large servers
cls.small_virtual_machine = VirtualMachine.create(
cls.api_client,
TEST_VM_LIFE_CYCLE_SERVICES["small"]
)
cls.medium_virtual_machine = VirtualMachine.create(
cls.api_client,
TEST_VM_LIFE_CYCLE_SERVICES["medium"]
)
def setUp(self):
self.apiclient = self.testClient.getApiClient()
self.dbclient = self.testClient.getDbConnection()
def test_01_stop_vm(self):
"""Test Stop Virtual Machine
"""
cmd = stopVirtualMachine.stopVirtualMachineCmd()
cmd.id = self.small_virtual_machine.id
self.api_client.stopVirtualMachine(cmd)
#Wait before server has be successfully stopped
self.debug("Verify SSH Access for virtual machine: %s,%s" %(self.small_virtual_machine.id, self.small_virtual_machine.ipaddress))
time.sleep(30)
with self.assertRaises(Exception):
remoteSSHClient.remoteSSHClient(
self.small_virtual_machine.ipaddress,
self.small_virtual_machine.ssh_port,
self.small_virtual_machine.username,
self.small_virtual_machine.password
)
cmd = listVirtualMachines.listVirtualMachinesCmd()
cmd.id = self.small_virtual_machine.id
list_vm_response = self.api_client.listVirtualMachines(cmd)
self.assertNotEqual(
len(list_vm_response),
0,
"Check VM avaliable in List Virtual Machines"
)
self.assertEqual(
list_vm_response[0].state,
"Stopped",
"Check virtual machine is in stopped state"
)
self.debug("Verify the database entry for virtual machine: %s" %self.small_virtual_machine.id)
self.debug("select state from vm_instance where id = %s;" %self.small_virtual_machine.id)
qresultset = self.dbclient.execute("select state from vm_instance where id = %s;" %self.small_virtual_machine.id)
self.assertNotEqual(
len(qresultset),
0,
"Check DB Query result set"
)
qresult = qresultset[0]
self.assertEqual(
qresult[0],
"Stopped",
"Compare virtual machine state with database record"
)
return
def test_02_start_vm(self):
"""Test Start Virtual Machine
"""
cmd = startVirtualMachine.startVirtualMachineCmd()
cmd.id = self.small_virtual_machine.id
self.apiclient.startVirtualMachine(cmd)
cmd = listVirtualMachines.listVirtualMachinesCmd()
cmd.id = self.small_virtual_machine.id
list_vm_response = self.apiclient.listVirtualMachines(cmd)
self.assertNotEqual(
len(list_vm_response),
0,
"Check VM avaliable in List Virtual Machines"
)
self.debug("Verify listVirtualMachines response for virtual machine: %s" %self.small_virtual_machine.id)
self.assertEqual(
list_vm_response[0].state,
"Running",
"Check virtual machine is in running state"
)
self.debug("Verify SSH Access for virtual machine: %s" %self.small_virtual_machine.id)
try:
self.small_virtual_machine.get_ssh_client()
except Exception as e:
self.fail("SSH Access failed for %s: %s" %(self.small_virtual_machine.ipaddress, e))
self.debug("Verify the database entry for virtual machine: %s" %self.small_virtual_machine.id)
self.debug("select state from vm_instance where id = %s;" %self.small_virtual_machine.id)
qresultset = self.dbclient.execute("select state from vm_instance where id = %s;" %self.small_virtual_machine.id)
self.assertNotEqual(
len(qresultset),
0,
"Check DB Query result set"
)
qresult = qresultset[0]
self.assertEqual(
qresult[0],
'Running',
"Compare virtual machine state with database record"
)
return
def test_03_reboot_vm(self):
"""Test Reboot Virtual Machine
"""
cmd = rebootVirtualMachine.rebootVirtualMachineCmd()
cmd.id = self.small_virtual_machine.id
self.apiclient.rebootVirtualMachine(cmd)
cmd = listVirtualMachines.listVirtualMachinesCmd()
cmd.id = self.small_virtual_machine.id
list_vm_response = self.apiclient.listVirtualMachines(cmd)
self.assertNotEqual(
len(list_vm_response),
0,
"Check VM avaliable in List Virtual Machines"
)
self.debug("Verify SSH Access for virtual machine: %s" %self.small_virtual_machine.id)
try:
self.small_virtual_machine.get_ssh_client()
except Exception as e:
self.fail("SSH Access failed for %s: %s" %(self.small_virtual_machine.ipaddress, e))
self.assertEqual(
list_vm_response[0].state,
"Running",
"Check virtual machine is in running state"
)
return
def test_04_change_offering_medium(self):
"""Change Offering to a medium capacity
"""
cmd = stopVirtualMachine.stopVirtualMachineCmd()
cmd.id = self.small_virtual_machine.id
self.apiclient.stopVirtualMachine(cmd)
#Sleep for 60 seconds to ensure the machine has stopped
time.sleep(60)
cmd = changeServiceForVirtualMachine.changeServiceForVirtualMachineCmd()
cmd.id = self.small_virtual_machine.id
cmd.serviceofferingid = services["service_offerings"]["medium"]["id"]
self.apiclient.changeServiceForVirtualMachine(cmd)
cmd = startVirtualMachine.startVirtualMachineCmd()
cmd.id = self.small_virtual_machine.id
self.apiclient.startVirtualMachine(cmd)
try:
ssh = self.small_virtual_machine.get_ssh_client()
except Exception as e:
self.fail("SSH Access failed for %s: %s" %(self.small_virtual_machine.ipaddress, e))
cpuinfo = ssh.execute("cat /proc/cpuinfo")
cpu_cnt = len([i for i in cpuinfo if "processor" in i])
#'cpu MHz\t\t: 2660.499'
cpu_speed = [i for i in cpuinfo if "cpu MHz" in i][0].split()[3]
meminfo = ssh.execute("cat /proc/meminfo")
#MemTotal: 1017464 kB
total_mem = [i for i in meminfo if "MemTotal" in i][0].split()[1]
self.assertEqual(
cpu_cnt,
services["service_offerings"]["medium"]["cpunumber"],
"Check CPU Count for medium offering"
)
self.assertEqual(
cpu_speed,
services["service_offerings"]["medium"]["cpuspeed"],
"Check CPU Speed for medium offering"
)
self.assertEqual(
total_mem,
services["service_offerings"]["medium"]["memory"],
"Check Memory(kb) for medium offering"
)
def test_05_change_offering_small(self):
"""Change Offering to a small capacity
"""
cmd = stopVirtualMachine.stopVirtualMachineCmd()
cmd.id = self.medium_virtual_machine.id
self.apiclient.stopVirtualMachine(cmd)
#Sleep before the changes are reflected
time.sleep(60)
cmd = changeServiceForVirtualMachine.changeServiceForVirtualMachineCmd()
cmd.id = self.medium_virtual_machine.id
cmd.serviceofferingid = services["service_offerings"]["small"]["id"]
self.apiclient.changeServiceForVirtualMachine(cmd)
cmd = startVirtualMachine.startVirtualMachineCmd()
cmd.id = self.medium_virtual_machine.id
self.apiclient.startVirtualMachine(cmd)
try:
ssh = self.medium_virtual_machine.get_ssh_client()
except Exception as e:
self.fail("SSH Access failed for %s: %s" %(self.medium_virtual_machine.ipaddress, e))
cpuinfo = ssh.execute("cat /proc/cpuinfo")
cpu_cnt = len([i for i in cpuinfo if "processor" in i])
#'cpu MHz\t\t: 2660.499'
cpu_speed = [i for i in cpuinfo if "cpu MHz" in i ][0].split()[3]
meminfo = ssh.execute("cat /proc/meminfo")
#MemTotal: 1017464 kB
total_mem = [i for i in meminfo if "MemTotal" in i][0].split()[1]
self.assertEqual(
cpu_cnt,
services["service_offerings"]["small"]["cpunumber"],
"Check CPU Count for small offering"
)
self.assertEqual(
cpu_speed,
services["service_offerings"]["small"]["cpuspeed"],
"Check CPU Speed for small offering"
)
self.assertEqual(
total_mem,
services["service_offerings"]["small"]["memory"],
"Check Memory(kb) for small offering"
)
def test_06_destroy_vm(self):
"""Test destroy Virtual Machine
"""
cmd = destroyVirtualMachine.destroyVirtualMachineCmd()
cmd.id = self.small_virtual_machine.id
self.apiclient.destroyVirtualMachine(cmd)
self.debug("Verify SSH Access for virtual machine: %s" %self.small_virtual_machine.id)
with self.assertRaises(Exception):
remoteSSHClient.remoteSSHClient(
self.small_virtual_machine.ipaddress,
self.small_virtual_machine.ssh_port,
self.small_virtual_machine.username,
self.small_virtual_machine.password
)
cmd = listVirtualMachines.listVirtualMachinesCmd()
cmd.id = self.small_virtual_machine.id
list_vm_response = self.apiclient.listVirtualMachines(cmd)
self.assertNotEqual(
len(list_vm_response),
0,
"Check VM avaliable in List Virtual Machines"
)
self.assertEqual(
list_vm_response[0].state,
"Destroyed",
"Check virtual machine is in destroyed state"
)
self.debug("Verify the database entry for virtual machine: %s" %self.small_virtual_machine.id)
self.debug("select state from vm_instance where id = %s;" %self.small_virtual_machine.id)
qresultset = self.dbclient.execute("select state from vm_instance where id = %s;" %self.small_virtual_machine.id)
self.assertNotEqual(
len(qresultset),
0,
"Check DB Query result set"
)
qresult = qresultset[0]
self.assertEqual(
qresult[0],
'Destroyed',
"Compare virtual machine state with database record"
)
return
def test_07_restore_vm(self):
"""Test recover Virtual Machine
"""
cmd = recoverVirtualMachine.recoverVirtualMachineCmd()
cmd.id = self.small_virtual_machine.id
self.apiclient.recoverVirtualMachine(cmd)
cmd = listVirtualMachines.listVirtualMachinesCmd()
cmd.id = self.small_virtual_machine.id
list_vm_response = self.apiclient.listVirtualMachines(cmd)
cmd = listVirtualMachines.listVirtualMachinesCmd()
cmd.id = self.small_virtual_machine.id
list_vm_response = self.apiclient.listVirtualMachines(cmd)
self.assertNotEqual(
len(list_vm_response),
0,
"Check VM avaliable in List Virtual Machines"
)
self.assertEqual(
list_vm_response[0].state,
"Stopped",
"Check virtual machine is in Stopped state"
)
self.debug("Verify the database entry for virtual machine: %s" %self.small_virtual_machine.id)
self.debug("select state from vm_instance where id = %s;" %self.small_virtual_machine.id)
qresultset = self.dbclient.execute("select state from vm_instance where id = %s;" %self.small_virtual_machine.id)
self.assertNotEqual(
len(qresultset),
0,
"Check DB Query result set"
)
qresult = qresultset[0]
self.assertEqual(
qresult[0],
'Stopped',
"Compare virtual_machine state with database record"
)
return
def test_08_expunge_vm(self):
"""Test destroy(expunge) Virtual Machine
"""
cmd = destroyVirtualMachine.destroyVirtualMachineCmd()
cmd.id = self.small_virtual_machine.id
self.apiclient.destroyVirtualMachine(cmd)
cmd = listVirtualMachines.listVirtualMachinesCmd()
cmd.id = self.small_virtual_machine.id
timeout = 50
while True :
list_vm_response = self.apiclient.listVirtualMachines(cmd)
if not list_vm_response:
break;
else:
if timeout == 0:
break
time.sleep(100)
timeout = timeout - 1
self.assertEqual(
list_vm_response,
None,
"Check Expunged virtual machine is listVirtualMachines"
)
self.debug("Verify the database entry for virtual machine: %s" %self.small_virtual_machine.id)
self.debug("select state from vm_instance where id = %s;" %self.small_virtual_machine.id)
qresultset = self.dbclient.execute("select state from vm_instance where id = %s;" %self.small_virtual_machine.id)
self.assertNotEqual(
len(qresultset),
0,
"Check DB Query result set"
)
qresult = qresultset[0]
self.assertEqual(
qresult[0],
"Expunging",
"Check virtual machine state in VM_INSTANCES table"
)
self.debug("select instance_id from nics where instance_id = %s;" %self.small_virtual_machine.id)
qresultset = self.dbclient.execute("select instance_id from nics where instance_id = %s;" %self.small_virtual_machine.id)
qresult = qresultset[0]
self.assertEqual(
len(qresult),
0,
"Check virtual_machine entry in NICS table"
)
self.debug("select instance_id from volumes where instance_id = %s;" %self.small_virtual_machine.id)
qresultset = self.dbclient.execute("select instance_id from volumes where instance_id = %s;" %self.small_virtual_machine.id)
qresult = qresultset[0]
self.assertEqual(
len(qresult),
0,
"Check virtual machine entry in VOLUMES table"
)
return