You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ra...@apache.org on 2017/04/18 09:48:47 UTC
[cloudstack] 01/01: Merge release branch 4.9 to master
This is an automated email from the ASF dual-hosted git repository.
rajani pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
commit d96b3cd19c1657e1048b418a0125127ff7ad02e1
Merge: b8dd08c 41b7eee
Author: Rajani Karuturi <ra...@accelerite.com>
AuthorDate: Tue Apr 18 15:17:00 2017 +0530
Merge release branch 4.9 to master
* 4.9:
CLOUDSTACK-9876: Removed test test_01_test_vm_volume_snapshot as we no longer have that restriction and now after fix for CLOUDSTACK-8663 we allow VM and volume snapshots to exist together
test/integration/smoke/test_vm_snapshots.py | 124 +---------------------------
1 file changed, 1 insertion(+), 123 deletions(-)
diff --cc test/integration/smoke/test_vm_snapshots.py
index ce1d038,9295ec1..4bfe66a
--- a/test/integration/smoke/test_vm_snapshots.py
+++ b/test/integration/smoke/test_vm_snapshots.py
@@@ -288,376 -277,3 +286,256 @@@ class TestVmSnapshot(cloudstackTestCase
None,
"Check list vm snapshot has be deleted"
)
+
- class TestSnapshots(cloudstackTestCase):
-
- @classmethod
- def setUpClass(cls):
- try:
- cls._cleanup = []
- cls.testClient = super(TestSnapshots, cls).getClsTestClient()
- cls.api_client = cls.testClient.getApiClient()
- cls.services = cls.testClient.getParsedTestDataConfig()
- cls.unsupportedHypervisor = False
- cls.hypervisor = cls.testClient.getHypervisorInfo()
- if cls.hypervisor.lower() in (KVM.lower(), "hyperv", "lxc", XEN_SERVER.lower()):
- cls.unsupportedHypervisor = True
- return
- # Get Domain, Zone, Template
- cls.domain = get_domain(cls.api_client)
- cls.zone = get_zone(
- cls.api_client,
- cls.testClient.getZoneForTests())
- cls.template = get_template(
- cls.api_client,
- cls.zone.id,
- cls.services["ostype"]
- )
- if cls.zone.localstorageenabled:
- cls.storagetype = 'local'
- cls.services["service_offerings"][
- "tiny"]["storagetype"] = 'local'
- else:
- cls.storagetype = 'shared'
- cls.services["service_offerings"][
- "tiny"]["storagetype"] = 'shared'
-
- cls.services['mode'] = cls.zone.networktype
- cls.services["virtual_machine"]["hypervisor"] = cls.hypervisor
- cls.services["virtual_machine"]["zoneid"] = cls.zone.id
- cls.services["virtual_machine"]["template"] = cls.template.id
- cls.services["custom_volume"]["zoneid"] = cls.zone.id
- # Creating Disk offering, Service Offering and Account
- cls.service_offering = ServiceOffering.create(
- cls.api_client,
- cls.services["service_offerings"]["tiny"]
- )
- cls._cleanup.append(cls.service_offering)
- cls.account = Account.create(
- cls.api_client,
- cls.services["account"],
- domainid=cls.domain.id
- )
- cls._cleanup.append(cls.account)
- except Exception as e:
- cls.tearDownClass()
- raise Exception("Warning: Exception in setup : %s" % e)
- return
-
- def setUp(self):
-
- self.apiclient = self.testClient.getApiClient()
- self.dbclient = self.testClient.getDbConnection()
- self.cleanup = []
-
- if self.unsupportedHypervisor:
- self.skipTest("Skipping test because unsupported\
- hypervisor %s" % self.hypervisor)
-
- def tearDown(self):
- # Clean up, terminate the created resources
- cleanup_resources(self.apiclient, self.cleanup)
- return
-
- @classmethod
- def tearDownClass(cls):
- try:
- cleanup_resources(cls.api_client, cls._cleanup)
- except Exception as e:
- raise Exception("Warning: Exception during cleanup : %s" % e)
-
- return
-
- @attr(tags=["advanced", "basic", "smoke"], required_hardware="true")
- def test_01_test_vm_volume_snapshot(self):
- """
- @Desc: Test that Volume snapshot for root volume is not allowed
- when VM snapshot is present for the VM
- @Steps:
- 1: Deploy a VM and create a VM snapshot for VM
- 2: Try to create snapshot for the root volume of the VM,
- It should expect Exception
- """
-
- # Creating Virtual Machine
- virtual_machine = VirtualMachine.create(
- self.apiclient,
- self.services["virtual_machine"],
- accountid=self.account.name,
- domainid=self.account.domainid,
- serviceofferingid=self.service_offering.id,
- )
-
- VmSnapshot.create(
- self.apiclient,
- virtual_machine.id,
- )
-
- volumes = Volume.list(self.apiclient,
- virtualmachineid=virtual_machine.id,
- type="ROOT",
- listall=True)
-
- self.assertEqual(validateList(volumes)[0], PASS,
- "Failed to get root volume of the VM")
-
- volume = volumes[0]
-
- with self.assertRaises(Exception):
- Snapshot.create(self.apiclient,
- volume_id=volume.id)
-
- return
-
+class Utils:
+
+ def __init__(self):
+ self.added_service_offerings = {
+ 'testOffering1' : {'displaytext': 'Test Offering 1', 'cpuspeed': 600, 'cpunumber': 1, 'name': 'Test Offering 1', 'memory': 256},
+ 'testOffering2' : {'displaytext': 'Test Offering 2', 'cpuspeed': 600, 'cpunumber': 2, 'name': 'Test Offering 2', 'memory': 512}
+ }
+
+class TestChangeServiceOfferingForVmWithSnapshots(cloudstackTestCase):
+
+ @classmethod
+ def setUpClass(cls):
+ try:
+ cls._cleanup = []
+ cls.testClient = super(TestChangeServiceOfferingForVmWithSnapshots, cls).getClsTestClient()
+ cls.api_client = cls.testClient.getApiClient()
+ cls.services = cls.testClient.getParsedTestDataConfig()
+ cls.hypervisor = cls.testClient.getHypervisorInfo()
+ cls.unsupportedHypervisor = False
+ if cls.hypervisor.lower() in (KVM.lower(), "hyperv", "lxc"):
+ cls.unsupportedHypervisor = True
+ return
+
+ cls.domain = get_domain(cls.api_client)
+ cls.zone = get_zone(
+ cls.api_client,
+ cls.testClient.getZoneForTests()
+ )
+ cls.services["small"]["zoneid"] = cls.zone.id
+ cls.template = get_template(
+ cls.api_client,
+ cls.zone.id,
+ cls.services["ostype"]
+ )
+ if cls.template == FAILED:
+ assert False, "get_template() failed to return template\
+ with description %s" % cls.services["ostype"]
+
+ test_offerings = Utils().added_service_offerings
+ for offering in test_offerings:
+ cls.services["service_offerings"][offering] = test_offerings[offering]
+
+ # Create 2 different service offerings
+ cls.service_offering_1 = ServiceOffering.create(
+ cls.api_client,
+ cls.services["service_offerings"]["testOffering1"]
+ )
+ cls._cleanup.append(cls.service_offering_1)
+
+ cls.service_offering_2 = ServiceOffering.create(
+ cls.api_client,
+ cls.services["service_offerings"]["testOffering2"]
+ )
+ cls._cleanup.append(cls.service_offering_2)
+
+ cls.account = Account.create(
+ cls.api_client,
+ cls.services["account"],
+ domainid=cls.domain.id
+ )
+ cls._cleanup.append(cls.account)
+
+ except Exception as e:
+ cls.tearDownClass()
+ raise Exception("Warning: Exception in setup : %s" % e)
+ return
+
+ def setUp(self):
+ self.apiclient = self.testClient.getApiClient()
+ self.dbclient = self.testClient.getDbConnection()
+ self.cleanup = []
+
+ if self.unsupportedHypervisor:
+ self.skipTest("Skipping test because unsupported hypervisor\
+ %s" % self.hypervisor)
+
+ def tearDown(self):
+ # Clean up, terminate the created resources
+ cleanup_resources(self.apiclient, self.cleanup)
+ return
+
+ @classmethod
+ def tearDownClass(cls):
+ try:
+ cleanup_resources(cls.api_client, cls._cleanup)
+ except Exception as e:
+ raise Exception("Warning: Exception during cleanup : %s" % e)
+
+ return
+
+ def wait_vm_start(self, apiclient, vmid, timeout, sleep):
+ while timeout:
+ vms = VirtualMachine.list(apiclient, id=vmid)
+ vm_list_validation_result = validateList(vms)
+ if vm_list_validation_result[0] == PASS and vm_list_validation_result[1].state == RUNNING:
+ return timeout
+ time.sleep(sleep)
+ timeout = timeout - 1
+
+ return timeout
+
+ def checkCPUAndMemory(self, ssh, service_offering):
+ 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.debug(
+ "CPU count: %s, CPU Speed: %s, Mem Info: %s" % (cpu_cnt, cpu_speed, total_mem)
+ )
+ self.assertAlmostEqual(
+ int(cpu_cnt),
+ service_offering.cpunumber,
+ "Check CPU Count for service offering"
+ )
+
+ range = 40
+ if self.hypervisor.lower() == "hyperv":
+ range = 200
+ self.assertTrue(
+ isAlmostEqual(int(int(total_mem) / 1024),
+ int(service_offering.memory),
+ range=range
+ ),
+ "Check Memory(kb) for service offering"
+ )
+
+ @attr(tags=["advanced", "smoke"], required_hardware="true")
+ def test_change_service_offering_for_vm_with_snapshots(self):
+ """Test to change service offering for instances with vm snapshots
+ """
+
+ # 1) Create Virtual Machine using service offering 1
+ self.debug("Creating VM using Service Offering 1")
+ virtual_machine = VirtualMachine.create(
+ self.apiclient,
+ self.services["small"],
+ accountid=self.account.name,
+ domainid=self.account.domainid,
+ templateid=self.template.id,
+ zoneid=self.zone.id,
+ hypervisor=self.hypervisor,
+ mode=self.zone.networktype,
+ serviceofferingid=self.service_offering_1.id
+ )
+
+ # Verify Service OFfering 1 CPU cores and memory
+ try:
+ ssh_client = virtual_machine.get_ssh_client(reconnect=True)
+ self.checkCPUAndMemory(ssh_client, self.service_offering_1)
+ except Exception as e:
+ self.fail("SSH failed for virtual machine: %s - %s" % (virtual_machine.ipaddress, e))
+
+ # 2) Take VM Snapshot
+ self.debug("Taking VM Snapshot for VM - ID: %s" % virtual_machine.id)
+ vm_snapshot = VmSnapshot.create(
+ self.apiclient,
+ virtual_machine.id,
+ )
+
+ # 3) Stop Virtual Machine
+ self.debug("Stopping VM - ID: %s" % virtual_machine.id)
+ try:
+ virtual_machine.stop(self.apiclient)
+ except Exception as e:
+ self.fail("Failed to stop VM: %s" % e)
+
+ # 4) Change service offering for VM with snapshots from Service Offering 1 to Service Offering 2
+ self.debug("Changing service offering from Service Offering 1 to Service Offering 2 for VM - ID: %s" % virtual_machine.id)
+ virtual_machine.change_service_offering(self.apiclient, self.service_offering_2.id)
+
+ # 5) Start VM
+ self.debug("Starting VM - ID: %s" % virtual_machine.id)
+ try:
+ virtual_machine.start(self.apiclient)
+ except Exception as e:
+ self.fail("Failed to start virtual machine: %s, %s" % (virtual_machine.name, e))
+
+ # Wait for vm to start
+ timeout = self.wait_vm_start(self.apiclient, virtual_machine.id, self.services["timeout"],
+ self.services["sleep"])
+ if timeout == 0:
+ self.fail("The virtual machine %s failed to start even after %s minutes"
+ % (virtual_machine.name, self.services["timeout"]))
+
+ list_vm_response = list_virtual_machines(
+ self.apiclient,
+ id=virtual_machine.id
+ )
+ self.assertEqual(
+ isinstance(list_vm_response, list),
+ True,
+ "Check list response returns a valid list"
+ )
+ self.assertNotEqual(
+ len(list_vm_response),
+ 0,
+ "Check VM avaliable in List Virtual Machines"
+ )
+ self.assertEqual(
+ list_vm_response[0].state,
+ "Running",
+ "Check virtual machine is in running state"
+ )
+ self.assertEqual(
+ list_vm_response[0].id,
+ virtual_machine.id,
+ "Check virtual machine id"
+ )
+
+ # 6) Verify service offering has changed
+ try:
+ ssh_client_2 = virtual_machine.get_ssh_client(reconnect=True)
+ self.checkCPUAndMemory(ssh_client_2, self.service_offering_2)
+ except Exception as e:
+ self.fail("SSH failed for virtual machine: %s - %s" % (virtual_machine.ipaddress, e))
+
+ # 7) Stop Virtual Machine
+ self.debug("Stopping VM - ID: %s" % virtual_machine.id)
+ try:
+ virtual_machine.stop(self.apiclient)
+ except Exception as e:
+ self.fail("Failed to stop VM: %s" % e)
+
+ # 8) Revert to VM Snapshot
+ self.debug("Revert to vm snapshot: %s" % vm_snapshot.id)
+ try:
+ VmSnapshot.revertToSnapshot(
+ self.apiclient,
+ vm_snapshot.id
+ )
+ except Exception as e:
+ self.fail("Failed to revert to VM Snapshot: %s - %s" % (vm_snapshot.id, e))
+
+ # 9) Start VM
+ self.debug("Starting VM - ID: %s" % virtual_machine.id)
+ try:
+ virtual_machine.start(self.apiclient)
+ except Exception as e:
+ self.fail("Failed to start virtual machine: %s, %s" % (virtual_machine.name, e))
+
+ # 10) Verify service offering has changed to Service Offering 1 (from VM Snapshot)
+ try:
+ ssh_client_3 = virtual_machine.get_ssh_client(reconnect=True)
+ self.checkCPUAndMemory(ssh_client_3, self.service_offering_1)
+ except Exception as e:
+ self.fail("SSH failed for virtual machine: %s - %s" % (virtual_machine.ipaddress, e))
+
+ return
--
To stop receiving notification emails like this one, please contact
"commits@cloudstack.apache.org" <co...@cloudstack.apache.org>.