def setUpClass(cls): testClient = super(TestConcurrentSnapshots, cls).getClsTestClient() cls.apiclient = testClient.getApiClient() cls.testdata = testClient.getParsedTestDataConfig() cls.hypervisor = cls.testClient.getHypervisorInfo() # Get Zone, Domain and templates cls.domain = get_domain(cls.apiclient) cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests()) cls.template = get_template( cls.apiclient, cls.zone.id, cls.testdata["ostype"]) cls._cleanup = [] cls.vm_pool = [] cls.snapshotSupported = True if cls.hypervisor.lower() in ["hyperv", "lxc"]: cls.snapshotSupported = False return # Set sleep time as per Snapshot Recurring Policy - HOURLY cls.sleep_time_for_hourly_policy = 60 * 60 * 1 cls.mgtSvrDetails = cls.config.__dict__["mgtSvr"][0].__dict__ try: # Create an account cls.account = Account.create( cls.apiclient, cls.testdata["account"], domainid=cls.domain.id ) cls._cleanup.append(cls.account) # Create user api client of the account cls.userapiclient = testClient.getUserApiClient( UserName=cls.account.name, DomainName=cls.account.domain ) # Create Service offering cls.service_offering = ServiceOffering.create( cls.apiclient, cls.testdata["service_offering"], ) cls._cleanup.append(cls.service_offering) for i in range(4): cls.vm = VirtualMachine.create( cls.apiclient, cls.testdata["small"], templateid=cls.template.id, accountid=cls.account.name, domainid=cls.account.domainid, serviceofferingid=cls.service_offering.id, zoneid=cls.zone.id, mode=cls.zone.networktype ) cls.vm_pool.append(cls.vm) cls._cleanup.append(cls.vm) cls.checksum_pool = [] cls.root_pool = [] cls.snapshot_pool = [] cls.rec_policy_pool = [] for vm in cls.vm_pool: root_volumes = list_volumes( cls.apiclient, virtualmachineid=vm.id, type='ROOT', listall=True ) checksum_root = createChecksum( cls.testdata, vm, root_volumes[0], "rootdiskdevice") cls.checksum_pool.append(checksum_root) cls.root_pool.append(root_volumes[0]) try: cls.pools = StoragePool.list(cls.apiclient, zoneid=cls.zone.id) except Exception as e: raise unittest.SkipTest(e) except Exception as e: cls.tearDownClass() raise e return
def test_01_volume_snapshot(self): """ Test Volume (root) Snapshot # 1. Deploy a VM on primary storage and . # 2. Take snapshot on root disk # 3. Verify the snapshot's entry in the "snapshots" table and presence of the corresponding snapshot on the Secondary Storage # 4. Create Template from the Snapshot and Deploy a VM using the Template # 5. Log in to the VM from template and make verify the contents of the ROOT disk matches with the snapshot. # 6. Delete Snapshot and Deploy a Linux VM from the Template and verify the successful deployment of the VM. # 7. Create multiple snapshots on the same volume and Check the integrity of all the snapshots by creating a template from the snapshot and deploying a Vm from it and delete one of the snapshots # 8. Verify that the original checksum matches with the checksum of VM's created from remaning snapshots # 9. Make verify the contents of the ROOT disk matches with the snapshot # 10.Verify that Snapshot of both DATA and ROOT volume should succeed when snapshot of Data disk of a VM is taken when snapshot of ROOT volume of VM is in progress # 11.Create snapshot of data disk and verify the original checksum matches with the volume created from snapshot # 12.Verify that volume's state should not change when snapshot of a DATA volume is taken that is attached to a VM # 13.Verify that volume's state should not change when snapshot of a DATA volume is taken that is not attached to a VM # 14.Verify that create Snapshot with quiescevm=True should succeed # 15.revertSnapshot() to revert VM to a specified Volume snapshot for root volume """ # Step 1 # Get ROOT Volume Id root_volumes_cluster_list = list_volumes(self.apiclient, virtualmachineid=self.vm_1.id, type='ROOT', listall=True) root_volume_cluster = root_volumes_cluster_list[0] disk_volumes_cluster_list = list_volumes(self.apiclient, virtualmachineid=self.vm_1.id, type='DATADISK', listall=True) data_disk = disk_volumes_cluster_list[0] root_vol_state = root_volume_cluster.state ckecksum_random_root_cluster = createChecksum( service=self.testdata, virtual_machine=self.vm_1, disk=root_volume_cluster, disk_type="rootdiskdevice") self.vm_1.stop(self.apiclient) root_vol_snap = Snapshot.create(self.apiclient, root_volume_cluster.id) self.assertEqual(root_vol_snap.state, "BackedUp", "Check if the snapshot state is correct ") self.assertEqual(root_vol_state, root_volume_cluster.state, "Check if volume state has changed") self.vm_1.start(self.apiclient) # Step 2 snapshot_list = list_snapshots(self.apiclient, id=root_vol_snap.id) self.assertNotEqual(snapshot_list, None, "Check if result exists in list item call") self.assertEqual(snapshot_list[0].id, root_vol_snap.id, "Check resource id in list resources call") self.assertTrue( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, root_vol_snap.id)) events = list_events(self.apiclient, account=self.account.name, domainid=self.account.domainid, type='SNAPSHOT.CREATE') event_list_validation_result = validateList(events) self.assertEqual( event_list_validation_result[0], PASS, "event list validation failed due to %s" % event_list_validation_result[2]) self.debug("Events list contains event SNAPSHOT.CREATE") qresultset = self.dbclient.execute( "select * from event where type='SNAPSHOT.CREATE' AND \ description like '%%%s%%' AND state='Completed';" % root_volume_cluster.id) event_validation_result = validateList(qresultset) self.assertEqual( event_validation_result[0], PASS, "event list validation failed due to %s" % event_validation_result[2]) self.assertNotEqual(len(qresultset), 0, "Check DB Query result set") qresult = str(qresultset) self.assertEqual( qresult.count('SNAPSHOT.CREATE') > 0, True, "Check SNAPSHOT.CREATE event in events table") #Usage_Event qresultset = self.dbclient.execute( "select * from usage_event where type='SNAPSHOT.CREATE' AND \ resource_name='%s'" % root_vol_snap.name) usage_event_validation_result = validateList(qresultset) self.assertEqual( usage_event_validation_result[0], PASS, "event list validation failed due to %s" % usage_event_validation_result[2]) self.assertNotEqual(len(qresultset), 0, "Check DB Query result set") self.assertEqual( self.dbclient.execute( "select size from usage_event where type='SNAPSHOT.CREATE' AND \ resource_name='%s'" % root_vol_snap.name)[0][0], root_vol_snap.physicalsize) # Step 3 # create template from snapshot root_vol_snap templateFromSnapshot = Template.create_from_snapshot( self.apiclient, root_vol_snap, self.testdata["template_2"]) self.assertNotEqual(templateFromSnapshot, None, "Check if result exists in list item call") vm_from_temp = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=templateFromSnapshot.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, mode=self.zone.networktype) self.assertNotEqual(vm_from_temp, None, "Check if result exists in list item call") compareChecksum(self.apiclient, service=self.testdata, original_checksum=ckecksum_random_root_cluster, disk_type="rootdiskdevice", virt_machine=vm_from_temp) vm_from_temp.delete(self.apiclient) # Step 4 root_vol_snap.delete(self.userapiclient) self.assertEqual( list_snapshots( self.apiclient, volumeid=root_volume_cluster.id, ), None, "Snapshot list should be empty") events = list_events(self.apiclient, account=self.account.name, domainid=self.account.domainid, type='SNAPSHOT.DELETE') event_list_validation_result = validateList(events) self.assertEqual( event_list_validation_result[0], PASS, "event list validation failed due to %s" % event_list_validation_result[2]) self.debug("Events list contains event SNAPSHOT.DELETE") self.debug("select id from account where uuid = '%s';" % self.account.id) qresultset = self.dbclient.execute( "select id from account where uuid = '%s';" % self.account.id) account_validation_result = validateList(qresultset) self.assertEqual( account_validation_result[0], PASS, "event list validation failed due to %s" % account_validation_result[2]) self.assertNotEqual(len(qresultset), 0, "Check DB Query result set") qresult = qresultset[0] account_id = qresult[0] qresultset = self.dbclient.execute( "select * from event where type='SNAPSHOT.DELETE' AND \ account_id='%s' AND state='Completed';" % account_id) delete_snap_validation_result = validateList(qresultset) self.assertEqual( delete_snap_validation_result[0], PASS, "event list validation failed due to %s" % delete_snap_validation_result[2]) self.assertNotEqual(len(qresultset), 0, "Check DB Query result set") qresult = str(qresultset) self.assertEqual( qresult.count('SNAPSHOT.DELETE') > 0, True, "Check SNAPSHOT.DELETE event in events table") # Step 5 # delete snapshot and deploy vm from snapshot vm_from_temp_2 = VirtualMachine.create( self.userapiclient, self.testdata["small"], templateid=templateFromSnapshot.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, mode=self.zone.networktype) self.assertNotEqual(vm_from_temp_2, None, "Check if result exists in list item call") # Step 6: compareChecksum(self.apiclient, service=self.testdata, original_checksum=ckecksum_random_root_cluster, disk_type="rootdiskdevice", virt_machine=vm_from_temp_2) vm_from_temp_2.delete(self.apiclient) # Step 7 # Multiple Snapshots self.vm_1.stop(self.apiclient) snaps = [] for i in range(2): root_vol_snap = Snapshot.create(self.apiclient, root_volume_cluster.id) self.assertEqual( root_vol_snap.state, "BackedUp", "Check if the data vol snapshot state is correct ") snaps.append(root_vol_snap) templateFromSnapshot = Template.create_from_snapshot( self.apiclient, root_vol_snap, self.testdata["template_2"]) self.assertNotEqual(templateFromSnapshot, None, "Check if result exists in list item call") vm_from_temp = VirtualMachine.create( self.userapiclient, self.testdata["small"], templateid=templateFromSnapshot.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, mode=self.zone.networktype) self.assertNotEqual(vm_from_temp, None, "Check if result exists in list item call") compareChecksum(self.apiclient, service=self.testdata, original_checksum=ckecksum_random_root_cluster, disk_type="rootdiskdevice", virt_machine=vm_from_temp) vm_from_temp.delete(self.apiclient) templateFromSnapshot.delete(self.apiclient) self.vm_1.start(self.apiclient) delete_snap = snaps.pop(1) delete_snap.delete(self.apiclient) self.assertEqual(Snapshot.list(self.apiclient, id=delete_snap.id), None, "Snapshot list should be empty") # Step 8 for snap in snaps: templateFromSnapshot = Template.create_from_snapshot( self.apiclient, snap, self.testdata["template_2"]) self.assertNotEqual(templateFromSnapshot, None, "Check if result exists in list item call") vm_from_temp = VirtualMachine.create( self.userapiclient, self.testdata["small"], templateid=templateFromSnapshot.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, mode=self.zone.networktype) self.assertNotEqual(vm_from_temp, None, "Check if result exists in list item call") compareChecksum(self.apiclient, service=self.testdata, original_checksum=ckecksum_random_root_cluster, disk_type="rootdiskdevice", virt_machine=vm_from_temp) templateFromSnapshot.delete(self.apiclient) vm_from_temp.delete(self.apiclient) for snap in snaps: snap.delete(self.apiclient) # Step 9 ckecksum_root_cluster = createChecksum(service=self.testdata, virtual_machine=self.vm_1, disk=root_volume_cluster, disk_type="rootdiskdevice") self.vm_1.stop(self.apiclient) root_vol_snap_2 = Snapshot.create(self.apiclient, root_volume_cluster.id) self.assertEqual(root_vol_snap_2.state, "BackedUp", "Check if the data vol snapshot state is correct ") snap_list_validation_result = validateList(events) self.assertEqual( snap_list_validation_result[0], PASS, "snapshot list validation failed due to %s" % snap_list_validation_result[2]) self.assertNotEqual(snapshot_list, None, "Check if result exists in list item call") templateFromSnapshot = Template.create_from_snapshot( self.apiclient, root_vol_snap_2, self.testdata["template_2"]) self.debug("create template event comlites with template %s name" % templateFromSnapshot.name) self.assertNotEqual(templateFromSnapshot, None, "Check if result exists in list item call") vm_from_temp_2 = VirtualMachine.create( self.userapiclient, self.testdata["small"], templateid=templateFromSnapshot.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, mode=self.zone.networktype) self.assertNotEqual(vm_from_temp_2, None, "Check if result exists in list item call") compareChecksum(self.apiclient, service=self.testdata, original_checksum=ckecksum_root_cluster, disk_type="rootdiskdevice", virt_machine=vm_from_temp_2) vm_from_temp_2.delete(self.apiclient) # Step 10 # Take snapshot of Data disk of a VM , when snapshot of ROOT volume of # VM is in progress try: self.vm_1.stop(self.apiclient) t1 = Thread(target=Snapshot.create, args=(self.apiclient, root_volume_cluster.id)) t2 = Thread(target=Snapshot.create, args=(self.apiclient, data_disk.id)) t1.start() t2.start() t1.join() t2.join() except: self.debug("Error: unable to start thread") # Step 11 # Data Disk self.vm_1.start(self.apiclient) ckecksum_data_disk = createChecksum(service=self.testdata, virtual_machine=self.vm_1, disk=data_disk, disk_type="datadiskdevice_1") data_vol_state = data_disk.state self.vm_1.stop(self.apiclient) data_vol_snap = Snapshot.create(self.apiclient, data_disk.id) self.assertEqual(data_vol_snap.state, "BackedUp", "Check if the data vol snapshot state is correct ") self.assertEqual(data_vol_state, data_disk.state, "Check if volume state has changed") data_snapshot_list = list_snapshots(self.apiclient, id=data_vol_snap.id) self.assertNotEqual(data_snapshot_list, None, "Check if result exists in list item call") self.assertEqual(data_snapshot_list[0].id, data_vol_snap.id, "Check resource id in list resources call") self.assertTrue( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, data_vol_snap.id)) events = list_events(self.apiclient, account=self.account.name, domainid=self.account.domainid, type='SNAPSHOT.CREATE') event_list_validation_result = validateList(events) self.assertEqual( event_list_validation_result[0], PASS, "event list validation failed due to %s" % event_list_validation_result[2]) self.debug("Events list contains event SNAPSHOT.CREATE") self.testdata["volume"]["zoneid"] = self.zone.id volumeFromSnap = Volume.create_from_snapshot( self.apiclient, data_vol_snap.id, self.testdata["volume"], account=self.account.name, domainid=self.account.domainid, ) self.assertTrue( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, data_vol_snap.id)) new_vm = VirtualMachine.create( self.userapiclient, self.testdata["small"], templateid=self.template.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, mode=self.zone.networktype) new_vm.attach_volume(self.apiclient, volumeFromSnap) new_vm.reboot(self.apiclient) compareChecksum(self.apiclient, service=self.testdata, original_checksum=ckecksum_data_disk, disk_type="datadiskdevice_1", virt_machine=new_vm) # Step 12 data_volume_2 = Volume.create(self.apiclient, self.testdata["volume"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, diskofferingid=self.disk_offering.id) self.vm_1.start(self.apiclient) self.vm_1.attach_volume(self.userapiclient, data_volume_2) self.vm_1.reboot(self.apiclient) self.vm_1.stop(self.apiclient) data_vol_snap_1 = Snapshot.create(self.apiclient, data_volume_2.id) self.assertEqual(data_vol_snap_1.state, "BackedUp", "Check if the snapshot state is correct ") data_disk_2_list = Volume.list(self.userapiclient, listall=self.testdata["listall"], id=data_volume_2.id) self.vm_1.start(self.apiclient) checksum_data_2 = createChecksum(service=self.testdata, virtual_machine=self.vm_1, disk=data_disk_2_list[0], disk_type="datadiskdevice_2") # Step 13 self.vm_1.detach_volume(self.apiclient, data_volume_2) self.vm_1.reboot(self.apiclient) prev_state = data_volume_2.state data_vol_snap_2 = Snapshot.create(self.apiclient, data_volume_2.id) self.assertEqual(data_vol_snap_2.state, prev_state, "Check if the volume state is correct ") data_snapshot_list_2 = list_snapshots(self.apiclient, id=data_vol_snap_2.id) self.assertNotEqual(data_snapshot_list_2, None, "Check if result exists in list item call") self.assertEqual(data_snapshot_list_2[0].id, data_vol_snap_2.id, "Check resource id in list resources call") self.testdata["volume"]["zoneid"] = self.zone.id volumeFromSnap_2 = Volume.create_from_snapshot( self.apiclient, data_vol_snap_2.id, self.testdata["volume"], account=self.account.name, domainid=self.account.domainid, ) self.vm_2.attach_volume(self.userapiclient, volumeFromSnap_2) self.vm_2.reboot(self.apiclient) data_disk_2_list = Volume.list(self.userapiclient, listall=self.testdata["listall"], id=volumeFromSnap_2.id) compareChecksum(self.apiclient, service=self.testdata, original_checksum=checksum_data_2, disk_type="datadiskdevice_2", virt_machine=self.vm_2) # Step 14 self.vm_1.stop(self.apiclient) with self.assertRaises(Exception): root_vol_snap.revertVolToSnapshot(self.apiclient) # Step 15 root_snap = Snapshot.create(self.apiclient, root_volume_cluster.id) with self.assertRaises(Exception): root_snap.revertVolToSnapshot(self.apiclient) return
def test_01_volume_snapshot(self): """ Test Volume (root) Snapshot # 1. Deploy a VM on primary storage and . # 2. Take snapshot on root disk # 3. Verify the snapshot's entry in the "snapshots" table and presence of the corresponding snapshot on the Secondary Storage # 4. Create Template from the Snapshot and Deploy a VM using the Template # 5. Log in to the VM from template and make verify the contents of the ROOT disk matches with the snapshot. # 6. Delete Snapshot and Deploy a Linux VM from the Template and verify the successful deployment of the VM. # 7. Create multiple snapshots on the same volume and Check the integrity of all the snapshots by creating a template from the snapshot and deploying a Vm from it and delete one of the snapshots # 8. Verify that the original checksum matches with the checksum of VM's created from remaning snapshots # 9. Make verify the contents of the ROOT disk matches with the snapshot # 10.Verify that Snapshot of both DATA and ROOT volume should succeed when snapshot of Data disk of a VM is taken when snapshot of ROOT volume of VM is in progress # 11.Create snapshot of data disk and verify the original checksum matches with the volume created from snapshot # 12.Verify that volume's state should not change when snapshot of a DATA volume is taken that is attached to a VM # 13.Verify that volume's state should not change when snapshot of a DATA volume is taken that is not attached to a VM # 14.Verify that create Snapshot with quiescevm=True should succeed # 15.revertSnapshot() to revert VM to a specified Volume snapshot for root volume """ # Step 1 # Get ROOT Volume Id root_volumes_cluster_list = list_volumes( self.apiclient, virtualmachineid=self.vm_1.id, type='ROOT', listall=True ) root_volume_cluster = root_volumes_cluster_list[0] disk_volumes_cluster_list = list_volumes( self.apiclient, virtualmachineid=self.vm_1.id, type='DATADISK', listall=True ) data_disk = disk_volumes_cluster_list[0] root_vol_state = root_volume_cluster.state ckecksum_random_root_cluster = createChecksum( service=self.testdata, virtual_machine=self.vm_1, disk=root_volume_cluster, disk_type="rootdiskdevice") self.vm_1.stop(self.apiclient) root_vol_snap = Snapshot.create( self.apiclient, root_volume_cluster.id) self.assertEqual( root_vol_snap.state, "BackedUp", "Check if the snapshot state is correct " ) self.assertEqual( root_vol_state, root_volume_cluster.state, "Check if volume state has changed" ) self.vm_1.start(self.apiclient) # Step 2 snapshot_list = list_snapshots( self.apiclient, id=root_vol_snap.id ) self.assertNotEqual( snapshot_list, None, "Check if result exists in list item call" ) self.assertEqual( snapshot_list[0].id, root_vol_snap.id, "Check resource id in list resources call" ) self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, root_vol_snap.id)) events = list_events( self.apiclient, account=self.account.name, domainid=self.account.domainid, type='SNAPSHOT.CREATE') event_list_validation_result = validateList(events) self.assertEqual( event_list_validation_result[0], PASS, "event list validation failed due to %s" % event_list_validation_result[2]) self.debug("Events list contains event SNAPSHOT.CREATE") qresultset = self.dbclient.execute( "select * from event where type='SNAPSHOT.CREATE' AND \ description like '%%%s%%' AND state='Completed';" % root_volume_cluster.id) event_validation_result = validateList(qresultset) self.assertEqual( event_validation_result[0], PASS, "event list validation failed due to %s" % event_validation_result[2]) self.assertNotEqual( len(qresultset), 0, "Check DB Query result set" ) qresult = str(qresultset) self.assertEqual( qresult.count('SNAPSHOT.CREATE') > 0, True, "Check SNAPSHOT.CREATE event in events table" ) #Usage_Event qresultset = self.dbclient.execute( "select * from usage_event where type='SNAPSHOT.CREATE' AND \ resource_name='%s'" % root_vol_snap.name) usage_event_validation_result = validateList(qresultset) self.assertEqual( usage_event_validation_result[0], PASS, "event list validation failed due to %s" % usage_event_validation_result[2]) self.assertNotEqual( len(qresultset), 0, "Check DB Query result set" ) self.assertEqual( self.dbclient.execute("select size from usage_event where type='SNAPSHOT.CREATE' AND \ resource_name='%s'" % root_vol_snap.name)[0][0], root_vol_snap.physicalsize) # Step 3 # create template from snapshot root_vol_snap templateFromSnapshot = Template.create_from_snapshot( self.apiclient, root_vol_snap, self.testdata["template_2"]) self.assertNotEqual( templateFromSnapshot, None, "Check if result exists in list item call" ) vm_from_temp = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=templateFromSnapshot.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, mode=self.zone.networktype ) self.assertNotEqual( vm_from_temp, None, "Check if result exists in list item call" ) compareChecksum( self.apiclient, service=self.testdata, original_checksum=ckecksum_random_root_cluster, disk_type="rootdiskdevice", virt_machine=vm_from_temp ) vm_from_temp.delete(self.apiclient) # Step 4 root_vol_snap.delete(self.userapiclient) self.assertEqual( list_snapshots( self.apiclient, volumeid=root_volume_cluster.id, ), None, "Snapshot list should be empty") events = list_events( self.apiclient, account=self.account.name, domainid=self.account.domainid, type='SNAPSHOT.DELETE') event_list_validation_result = validateList(events) self.assertEqual( event_list_validation_result[0], PASS, "event list validation failed due to %s" % event_list_validation_result[2]) self.debug("Events list contains event SNAPSHOT.DELETE") self.debug("select id from account where uuid = '%s';" % self.account.id) qresultset = self.dbclient.execute( "select id from account where uuid = '%s';" % self.account.id ) account_validation_result = validateList(qresultset) self.assertEqual( account_validation_result[0], PASS, "event list validation failed due to %s" % account_validation_result[2]) self.assertNotEqual( len(qresultset), 0, "Check DB Query result set" ) qresult = qresultset[0] account_id = qresult[0] qresultset = self.dbclient.execute( "select * from event where type='SNAPSHOT.DELETE' AND \ account_id='%s' AND state='Completed';" % account_id) delete_snap_validation_result = validateList(qresultset) self.assertEqual( delete_snap_validation_result[0], PASS, "event list validation failed due to %s" % delete_snap_validation_result[2]) self.assertNotEqual( len(qresultset), 0, "Check DB Query result set" ) qresult = str(qresultset) self.assertEqual( qresult.count('SNAPSHOT.DELETE') > 0, True, "Check SNAPSHOT.DELETE event in events table" ) # Step 5 # delete snapshot and deploy vm from snapshot vm_from_temp_2 = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=templateFromSnapshot.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, mode=self.zone.networktype ) self.assertNotEqual( vm_from_temp_2, None, "Check if result exists in list item call" ) # Step 6: compareChecksum( self.apiclient, service=self.testdata, original_checksum=ckecksum_random_root_cluster, disk_type="rootdiskdevice", virt_machine=vm_from_temp_2 ) vm_from_temp_2.delete(self.apiclient) # Step 7 # Multiple Snapshots self.vm_1.stop(self.apiclient) snaps = [] for i in range(2): root_vol_snap = Snapshot.create( self.apiclient, root_volume_cluster.id) self.assertEqual( root_vol_snap.state, "BackedUp", "Check if the data vol snapshot state is correct " ) snaps.append(root_vol_snap) templateFromSnapshot = Template.create_from_snapshot( self.apiclient, root_vol_snap, self.testdata["template_2"]) self.assertNotEqual( templateFromSnapshot, None, "Check if result exists in list item call" ) vm_from_temp = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=templateFromSnapshot.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, mode=self.zone.networktype ) self.assertNotEqual( vm_from_temp, None, "Check if result exists in list item call" ) compareChecksum( self.apiclient, service=self.testdata, original_checksum=ckecksum_random_root_cluster, disk_type="rootdiskdevice", virt_machine=vm_from_temp ) vm_from_temp.delete(self.apiclient) templateFromSnapshot.delete(self.apiclient) self.vm_1.start(self.apiclient) delete_snap = snaps.pop(1) delete_snap.delete(self.apiclient) self.assertEqual( Snapshot.list( self.apiclient, id=delete_snap.id ), None, "Snapshot list should be empty") # Step 8 for snap in snaps: templateFromSnapshot = Template.create_from_snapshot( self.apiclient, snap, self.testdata["template_2"]) self.assertNotEqual( templateFromSnapshot, None, "Check if result exists in list item call" ) vm_from_temp = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=templateFromSnapshot.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, mode=self.zone.networktype ) self.assertNotEqual( vm_from_temp, None, "Check if result exists in list item call" ) compareChecksum( self.apiclient, service=self.testdata, original_checksum=ckecksum_random_root_cluster, disk_type="rootdiskdevice", virt_machine=vm_from_temp ) templateFromSnapshot.delete(self.apiclient) vm_from_temp.delete(self.apiclient) for snap in snaps: snap.delete(self.apiclient) # Step 9 ckecksum_root_cluster = createChecksum( service=self.testdata, virtual_machine=self.vm_1, disk=root_volume_cluster, disk_type="rootdiskdevice") self.vm_1.stop(self.apiclient) root_vol_snap_2 = Snapshot.create( self.apiclient, root_volume_cluster.id) self.assertEqual( root_vol_snap_2.state, "BackedUp", "Check if the data vol snapshot state is correct " ) snap_list_validation_result = validateList(events) self.assertEqual( snap_list_validation_result[0], PASS, "snapshot list validation failed due to %s" % snap_list_validation_result[2]) self.assertNotEqual( snapshot_list, None, "Check if result exists in list item call" ) templateFromSnapshot = Template.create_from_snapshot( self.apiclient, root_vol_snap_2, self.testdata["template_2"]) self.debug( "create template event comlites with template %s name" % templateFromSnapshot.name) self.assertNotEqual( templateFromSnapshot, None, "Check if result exists in list item call" ) vm_from_temp_2 = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=templateFromSnapshot.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, mode=self.zone.networktype ) self.assertNotEqual( vm_from_temp_2, None, "Check if result exists in list item call" ) compareChecksum( self.apiclient, service=self.testdata, original_checksum=ckecksum_root_cluster, disk_type="rootdiskdevice", virt_machine=vm_from_temp_2 ) vm_from_temp_2.delete(self.apiclient) # Step 10 # Take snapshot of Data disk of a VM , when snapshot of ROOT volume of # VM is in progress try: self.vm_1.stop(self.apiclient) t1 = Thread( target=Snapshot.create, args=( self.apiclient, root_volume_cluster.id )) t2 = Thread( target=Snapshot.create, args=( self.apiclient, data_disk.id )) t1.start() t2.start() t1.join() t2.join() except: self.debug("Error: unable to start thread") # Step 11 # Data Disk self.vm_1.start(self.apiclient) ckecksum_data_disk = createChecksum( service=self.testdata, virtual_machine=self.vm_1, disk=data_disk, disk_type="datadiskdevice_1") data_vol_state = data_disk.state self.vm_1.stop(self.apiclient) data_vol_snap = Snapshot.create( self.apiclient, data_disk.id) self.assertEqual( data_vol_snap.state, "BackedUp", "Check if the data vol snapshot state is correct " ) self.assertEqual( data_vol_state, data_disk.state, "Check if volume state has changed" ) data_snapshot_list = list_snapshots( self.apiclient, id=data_vol_snap.id ) self.assertNotEqual( data_snapshot_list, None, "Check if result exists in list item call" ) self.assertEqual( data_snapshot_list[0].id, data_vol_snap.id, "Check resource id in list resources call" ) self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, data_vol_snap.id)) events = list_events( self.apiclient, account=self.account.name, domainid=self.account.domainid, type='SNAPSHOT.CREATE') event_list_validation_result = validateList(events) self.assertEqual( event_list_validation_result[0], PASS, "event list validation failed due to %s" % event_list_validation_result[2]) self.debug("Events list contains event SNAPSHOT.CREATE") volumeFromSnap = Volume.create_from_snapshot( self.apiclient, data_vol_snap.id, self.testdata["volume"], account=self.account.name, domainid=self.account.domainid, zoneid=self.zone.id ) self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, data_vol_snap.id)) new_vm = VirtualMachine.create( self.userapiclient, self.testdata["small"], templateid=self.template.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, mode=self.zone.networktype ) new_vm.attach_volume( self.apiclient, volumeFromSnap ) new_vm.reboot(self.apiclient) compareChecksum( self.apiclient, service=self.testdata, original_checksum=ckecksum_data_disk, disk_type="datadiskdevice_1", virt_machine=new_vm ) # Step 12 data_volume_2 = Volume.create( self.apiclient, self.testdata["volume"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, diskofferingid=self.disk_offering.id ) self.vm_1.start(self.apiclient) self.vm_1.attach_volume( self.userapiclient, data_volume_2 ) self.vm_1.reboot(self.apiclient) self.vm_1.stop(self.apiclient) data_vol_snap_1 = Snapshot.create( self.apiclient, data_volume_2.id) self.assertEqual( data_vol_snap_1.state, "BackedUp", "Check if the snapshot state is correct " ) data_disk_2_list = Volume.list( self.userapiclient, listall=self.testdata["listall"], id=data_volume_2.id ) self.vm_1.start(self.apiclient) checksum_data_2 = createChecksum( service=self.testdata, virtual_machine=self.vm_1, disk=data_disk_2_list[0], disk_type="datadiskdevice_2") # Step 13 self.vm_1.detach_volume(self.apiclient, data_volume_2) self.vm_1.reboot(self.apiclient) prev_state = data_volume_2.state data_vol_snap_2 = Snapshot.create( self.apiclient, data_volume_2.id) self.assertEqual( data_vol_snap_2.state, prev_state, "Check if the volume state is correct " ) data_snapshot_list_2 = list_snapshots( self.apiclient, id=data_vol_snap_2.id ) self.assertNotEqual( data_snapshot_list_2, None, "Check if result exists in list item call" ) self.assertEqual( data_snapshot_list_2[0].id, data_vol_snap_2.id, "Check resource id in list resources call" ) volumeFromSnap_2 = Volume.create_from_snapshot( self.apiclient, data_vol_snap_2.id, self.testdata["volume"], account=self.account.name, domainid=self.account.domainid, zoneid=self.zone.id ) self.vm_2.attach_volume( self.userapiclient, volumeFromSnap_2 ) self.vm_2.reboot(self.apiclient) data_disk_2_list = Volume.list( self.userapiclient, listall=self.testdata["listall"], id=volumeFromSnap_2.id ) compareChecksum( self.apiclient, service=self.testdata, original_checksum=checksum_data_2, disk_type="datadiskdevice_2", virt_machine=self.vm_2 ) # Step 14 self.vm_1.stop(self.apiclient) with self.assertRaises(Exception): root_vol_snap.revertVolToSnapshot(self.apiclient) # Step 15 root_snap = Snapshot.create( self.apiclient, root_volume_cluster.id) with self.assertRaises(Exception): root_snap.revertVolToSnapshot(self.apiclient) return
def test_02_snapshot_size_check(self): """ Check Snapshots size in database 1. Create file on ROOT disk of deployed VM. 2. Create Snapshot of ROOT disk. 3. Check if physiacal_size parameter of snapshot_store_ref table has physical size of snapshot """ if self.hypervisor.lower() not in ["xenserver", "vmware"]: self.skipTest("Test not to be run on %s" % self.hypervisor) root_volumes_list = list_volumes(self.apiclient, virtualmachineid=self.vm.id, type=ROOT, listall=True) status = validateList(root_volumes_list) self.assertEqual(status[0], PASS, "Check listVolumes response for ROOT Disk") root_volume = root_volumes_list[0] # Get Secondary Storage Value from Database qryresult_before_snapshot = self.dbclient.execute( " select id, account_name, secondaryStorageTotal\ from account_view where account_name = '%s';" % self.account.name) self.assertNotEqual( len(qryresult_before_snapshot), 0, "Check sql query to return SecondaryStorageTotal of account") storage_qry_result_old = qryresult_before_snapshot[0] secondary_storage_old = storage_qry_result_old[2] createChecksum(self.testdata, self.vm, root_volume, "rootdiskdevice") time.sleep(30) root_vol_snapshot = Snapshot.create(self.apiclient, root_volume.id) snapshots_list = Snapshot.list(self.apiclient, id=root_vol_snapshot.id) status = validateList(snapshots_list) self.assertEqual(status[0], PASS, "Check listSnapshots response") # Verify Snapshot state self.assertEqual( snapshots_list[0].state.lower() in [ BACKED_UP, ], True, "Snapshot state is not as expected. It is %s" % snapshots_list[0].state) self.assertEqual( snapshots_list[0].volumeid, root_volume.id, "Snapshot volume id is not matching with the vm's volume id") qryresult_snp_id = self.dbclient.execute("select id\ from snapshots where uuid = '%s';" % snapshots_list[0].id) self.assertNotEqual( len(qryresult_snp_id), 0, "Check sql query to return physical size of the snapshot") snp_id_result = qryresult_snp_id[0] snp_id = snp_id_result[0] qryresult_physical_size = self.dbclient.execute( " select id, store_id, physical_size\ from snapshot_store_ref where snapshot_id = '%s' \ and store_role='Image';" % snp_id) self.assertNotEqual( len(qryresult_physical_size), 0, "Check sql query to return SecondaryStorageTotal of account") snapshot_physical_size_result = qryresult_physical_size[0] snapshot_physical_size = snapshot_physical_size_result[2] # Step 3 qryresult_after_snapshot = self.dbclient.execute( " select id, account_name, secondaryStorageTotal\ from account_view where account_name = '%s';" % self.account.name) self.assertNotEqual( len(qryresult_after_snapshot), 0, "Check sql query to return SecondaryStorageTotal of account") storage_qry_result_from_database = qryresult_after_snapshot[0] secondary_storage_new = storage_qry_result_from_database[2] secondary_storage_after_snapshot = secondary_storage_new - \ secondary_storage_old self.assertEqual( snapshot_physical_size, secondary_storage_after_snapshot, "Check if physical_size attribute of snapshot_store_ref table \ stores correct value") return
def test_01_delta_snapshots(self): """ Delta Snapshots 1. Create file on ROOT disk of deployed VM. 2. Create Snapshot of ROOT disk. 3. Verify secondary storage count. 4. Check integrity of Full Snapshot. 5. Delete delta snaphshot and check integrity of\ remaining snapshots. 6. Delete full snapshot and verify it is deleted from\ secondary storage. """ checksum_created = [] full_snapshot_count = 0 delta_snapshot_count = 0 # Mulitply delta max value by 2 to set loop counter # to create 2 Snapshot chains snapshot_loop_count = int(self.delta_max) * 2 # Get ROOT Volume root_volumes_list = list_volumes( self.apiclient, virtualmachineid=self.vm.id, type=ROOT, listall=True ) status = validateList(root_volumes_list) self.assertEqual( status[0], PASS, "Check listVolumes response for ROOT Disk") root_volume = root_volumes_list[0] # Get Secondary Storage Value from Database qryresult_before_snapshot = self.dbclient.execute( " select id, account_name, secondaryStorageTotal\ from account_view where account_name = '%s';" % self.account.name) self.assertNotEqual( len(qryresult_before_snapshot), 0, "Check sql query to return SecondaryStorageTotal of account") storage_qry_result_old = qryresult_before_snapshot[0] secondary_storage_old = storage_qry_result_old[2] # Create Snapshots for i in range(snapshot_loop_count): # Step 1 checksum_root = createChecksum( self.testdata, self.vm, root_volume, "rootdiskdevice") time.sleep(30) checksum_created.append(checksum_root) # Step 2 root_vol_snapshot = Snapshot.create( self.apiclient, root_volume.id) self.snapshots_created.append(root_vol_snapshot) snapshots_list = Snapshot.list(self.apiclient, id=root_vol_snapshot.id) status = validateList(snapshots_list) self.assertEqual(status[0], PASS, "Check listSnapshots response") # Verify Snapshot state self.assertEqual( snapshots_list[0].state.lower() in [ BACKED_UP, ], True, "Snapshot state is not as expected. It is %s" % snapshots_list[0].state ) self.assertEqual( snapshots_list[0].volumeid, root_volume.id, "Snapshot volume id is not matching with the vm's volume id") # Step 3 qryresult_after_snapshot = self.dbclient.execute( " select id, account_name, secondaryStorageTotal\ from account_view where account_name = '%s';" % self.account.name) self.assertNotEqual( len(qryresult_after_snapshot), 0, "Check sql query to return SecondaryStorageTotal of account") storage_qry_result_from_database = qryresult_after_snapshot[0] secondary_storage_from_database = storage_qry_result_from_database[ 2] snapshot_size = snapshots_list[0].physicalsize secondary_storage_after_snapshot = secondary_storage_old + \ snapshot_size # Reset full_snapshot_count to 0 before start of new snapshot chain if delta_snapshot_count == (int(self.delta_max) - 1): full_snapshot_count = 0 delta_snapshot_count = 0 # Full Snapshot of each Snapshot chain if full_snapshot_count == 0: full_snapshot_count += 1 full_snapshot_size = snapshot_size # Check secondary storage count for Full Snapshots self.assertEqual( secondary_storage_from_database, secondary_storage_after_snapshot, "Secondary storage count after full snapshot\ should be incremented by size of snapshot.") # Step 4 checkIntegrityOfSnapshot( self, snapshots_list[0], checksum_root, disk_type=DATA) else: # Delta Snapshot of each Snapshot chain delta_snapshot_count += 1 delta_snapshot_size = snapshot_size # Check secondary storage count for Delta Snapshots self.assertTrue(delta_snapshot_size < full_snapshot_size, "Delta Snapshot size should be less than\ Full Snapshot.") self.assertEqual( secondary_storage_from_database, secondary_storage_after_snapshot, "Secondary storage count after delta snapshot\ should be incremented by size of snapshot.") secondary_storage_old = secondary_storage_from_database # Step 5 # Check in Secondary Storage- Snapshots: S1, S2, S3 are present for i in range(int(self.delta_max)): self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshots_created[i].id), "Check: Snapshot is not on Secondary Storage.") # Delete S2 Snapshot.delete(self.snapshots_created[1], self.apiclient) snapshots_list = Snapshot.list(self.apiclient, id=self.snapshots_created[1].id) status = validateList(snapshots_list) self.assertEqual(status[0], FAIL, "Snapshots Not Deleted.") # Check integrity of Snapshots for S1 and S3 checkIntegrityOfSnapshot( self, self.snapshots_created[0], checksum_created[0], disk_type=DATA) checkIntegrityOfSnapshot( self, self.snapshots_created[2], checksum_created[2], disk_type=DATA) # Delete S3 Snapshot.delete(self.snapshots_created[2], self.apiclient) snapshots_list = Snapshot.list(self.apiclient, id=self.snapshots_created[2].id) status = validateList(snapshots_list) self.assertEqual(status[0], FAIL, "Snapshots Not Deleted.") # Check in Secondary Storage - Snapshots: S2, S3 are deleted self.assertFalse( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshots_created[2].id), "Check: Snapshot 2 is still on Secondary Storage. Not Deleted.") self.assertFalse( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshots_created[1].id), "Check: Snapshot 3 is still on Secondary Storage. Not Deleted.") # Restore Snapshots for S1 checkIntegrityOfSnapshot( self, self.snapshots_created[0], checksum_created[0], disk_type=DATA) # Step 6 # Delete S1 Snapshot.delete(self.snapshots_created[0], self.apiclient) snapshots_list = Snapshot.list(self.apiclient, id=self.snapshots_created[0].id) status = validateList(snapshots_list) self.assertEqual(status[0], FAIL, "Snapshots Not Deleted.") # Check in Secondary Storage - Snapshots: All - S1, S2, S3 are deleted self.assertFalse( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshots_created[2].id), "Check: Snapshot 3 is still on Secondary Storage. Not Deleted.") self.assertFalse( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshots_created[1].id), "Check: Snapshot 2 is still on Secondary Storage. Not Deleted.") self.assertFalse( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshots_created[0].id), "Check: Snapshot 1 is still on Secondary Storage. Not Deleted.") return
def test_02_snapshot_size_check(self): """ Check Snapshots size in database 1. Create file on ROOT disk of deployed VM. 2. Create Snapshot of ROOT disk. 3. Check if physiacal_size parameter of snapshot_store_ref table has physical size of snapshot """ if self.hypervisor.lower() not in ["xenserver", "vmware"]: self.skipTest("Test not to be run on %s" % self.hypervisor) root_volumes_list = list_volumes( self.apiclient, virtualmachineid=self.vm.id, type=ROOT, listall=True ) status = validateList(root_volumes_list) self.assertEqual( status[0], PASS, "Check listVolumes response for ROOT Disk") root_volume = root_volumes_list[0] # Get Secondary Storage Value from Database qryresult_before_snapshot = self.dbclient.execute( " select id, account_name, secondaryStorageTotal\ from account_view where account_name = '%s';" % self.account.name) self.assertNotEqual( len(qryresult_before_snapshot), 0, "Check sql query to return SecondaryStorageTotal of account") storage_qry_result_old = qryresult_before_snapshot[0] secondary_storage_old = storage_qry_result_old[2] createChecksum( self.testdata, self.vm, root_volume, "rootdiskdevice") time.sleep(30) root_vol_snapshot = Snapshot.create( self.apiclient, root_volume.id) snapshots_list = Snapshot.list(self.apiclient, id=root_vol_snapshot.id) status = validateList(snapshots_list) self.assertEqual(status[0], PASS, "Check listSnapshots response") # Verify Snapshot state self.assertEqual( snapshots_list[0].state.lower() in [ BACKED_UP, ], True, "Snapshot state is not as expected. It is %s" % snapshots_list[0].state ) self.assertEqual( snapshots_list[0].volumeid, root_volume.id, "Snapshot volume id is not matching with the vm's volume id") qryresult_snp_id = self.dbclient.execute( "select id\ from snapshots where uuid = '%s';" % snapshots_list[0].id) self.assertNotEqual( len(qryresult_snp_id), 0, "Check sql query to return physical size of the snapshot") snp_id_result = qryresult_snp_id[0] snp_id = snp_id_result[0] qryresult_physical_size = self.dbclient.execute( " select id, store_id, physical_size\ from snapshot_store_ref where snapshot_id = '%s' \ and store_role='Image';" % snp_id) self.assertNotEqual( len(qryresult_physical_size), 0, "Check sql query to return SecondaryStorageTotal of account") snapshot_physical_size_result = qryresult_physical_size[0] snapshot_physical_size = snapshot_physical_size_result[ 2] # Step 3 qryresult_after_snapshot = self.dbclient.execute( " select id, account_name, secondaryStorageTotal\ from account_view where account_name = '%s';" % self.account.name) self.assertNotEqual( len(qryresult_after_snapshot), 0, "Check sql query to return SecondaryStorageTotal of account") storage_qry_result_from_database = qryresult_after_snapshot[0] secondary_storage_new = storage_qry_result_from_database[ 2] secondary_storage_after_snapshot = secondary_storage_new - \ secondary_storage_old self.assertEqual( snapshot_physical_size, secondary_storage_after_snapshot, "Check if physical_size attribute of snapshot_store_ref table \ stores correct value" ) return
def test_01_delta_snapshots(self): """ Delta Snapshots 1. Create file on ROOT disk of deployed VM. 2. Create Snapshot of ROOT disk. 3. Verify secondary storage count. 4. Check integrity of Full Snapshot. 5. Delete delta snaphshot and check integrity of\ remaining snapshots. 6. Delete full snapshot and verify it is deleted from\ secondary storage. """ checksum_created = [] full_snapshot_count = 0 delta_snapshot_count = 0 # Mulitply delta max value by 2 to set loop counter # to create 2 Snapshot chains snapshot_loop_count = int(self.delta_max) * 2 # Get ROOT Volume root_volumes_list = list_volumes(self.apiclient, virtualmachineid=self.vm.id, type=ROOT, listall=True) status = validateList(root_volumes_list) self.assertEqual(status[0], PASS, "Check listVolumes response for ROOT Disk") root_volume = root_volumes_list[0] # Get Secondary Storage Value from Database qryresult_before_snapshot = self.dbclient.execute( " select id, account_name, secondaryStorageTotal\ from account_view where account_name = '%s';" % self.account.name) self.assertNotEqual( len(qryresult_before_snapshot), 0, "Check sql query to return SecondaryStorageTotal of account") storage_qry_result_old = qryresult_before_snapshot[0] secondary_storage_old = storage_qry_result_old[2] # Create Snapshots for i in range(snapshot_loop_count): # Step 1 checksum_root = createChecksum(self.testdata, self.vm, root_volume, "rootdiskdevice") time.sleep(30) checksum_created.append(checksum_root) # Step 2 root_vol_snapshot = Snapshot.create(self.apiclient, root_volume.id) self.snapshots_created.append(root_vol_snapshot) snapshots_list = Snapshot.list(self.apiclient, id=root_vol_snapshot.id) status = validateList(snapshots_list) self.assertEqual(status[0], PASS, "Check listSnapshots response") # Verify Snapshot state self.assertEqual( snapshots_list[0].state.lower() in [ BACKED_UP, ], True, "Snapshot state is not as expected. It is %s" % snapshots_list[0].state) self.assertEqual( snapshots_list[0].volumeid, root_volume.id, "Snapshot volume id is not matching with the vm's volume id") # Step 3 qryresult_after_snapshot = self.dbclient.execute( " select id, account_name, secondaryStorageTotal\ from account_view where account_name = '%s';" % self.account.name) self.assertNotEqual( len(qryresult_after_snapshot), 0, "Check sql query to return SecondaryStorageTotal of account") storage_qry_result_from_database = qryresult_after_snapshot[0] secondary_storage_from_database = storage_qry_result_from_database[ 2] snapshot_size = snapshots_list[0].physicalsize secondary_storage_after_snapshot = secondary_storage_old + \ snapshot_size # Reset full_snapshot_count to 0 before start of new snapshot chain if delta_snapshot_count == (int(self.delta_max) - 1): full_snapshot_count = 0 delta_snapshot_count = 0 # Full Snapshot of each Snapshot chain if full_snapshot_count == 0: full_snapshot_count += 1 full_snapshot_size = snapshot_size # Check secondary storage count for Full Snapshots self.assertEqual( secondary_storage_from_database, secondary_storage_after_snapshot, "Secondary storage count after full snapshot\ should be incremented by size of snapshot.") # Step 4 checkIntegrityOfSnapshot(self, snapshots_list[0], checksum_root, disk_type=DATA) else: # Delta Snapshot of each Snapshot chain delta_snapshot_count += 1 delta_snapshot_size = snapshot_size # Check secondary storage count for Delta Snapshots self.assertTrue( delta_snapshot_size < full_snapshot_size, "Delta Snapshot size should be less than\ Full Snapshot.") self.assertEqual( secondary_storage_from_database, secondary_storage_after_snapshot, "Secondary storage count after delta snapshot\ should be incremented by size of snapshot.") secondary_storage_old = secondary_storage_from_database # Step 5 # Check in Secondary Storage- Snapshots: S1, S2, S3 are present for i in range(int(self.delta_max)): self.assertTrue( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshots_created[i].id), "Check: Snapshot is not on Secondary Storage.") # Delete S2 Snapshot.delete(self.snapshots_created[1], self.apiclient) snapshots_list = Snapshot.list(self.apiclient, id=self.snapshots_created[1].id) status = validateList(snapshots_list) self.assertEqual(status[0], FAIL, "Snapshots Not Deleted.") # Check integrity of Snapshots for S1 and S3 checkIntegrityOfSnapshot(self, self.snapshots_created[0], checksum_created[0], disk_type=DATA) checkIntegrityOfSnapshot(self, self.snapshots_created[2], checksum_created[2], disk_type=DATA) # Delete S3 Snapshot.delete(self.snapshots_created[2], self.apiclient) snapshots_list = Snapshot.list(self.apiclient, id=self.snapshots_created[2].id) status = validateList(snapshots_list) self.assertEqual(status[0], FAIL, "Snapshots Not Deleted.") # Check in Secondary Storage - Snapshots: S2, S3 are deleted self.assertFalse( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshots_created[2].id), "Check: Snapshot 2 is still on Secondary Storage. Not Deleted.") self.assertFalse( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshots_created[1].id), "Check: Snapshot 3 is still on Secondary Storage. Not Deleted.") # Restore Snapshots for S1 checkIntegrityOfSnapshot(self, self.snapshots_created[0], checksum_created[0], disk_type=DATA) # Step 6 # Delete S1 Snapshot.delete(self.snapshots_created[0], self.apiclient) snapshots_list = Snapshot.list(self.apiclient, id=self.snapshots_created[0].id) status = validateList(snapshots_list) self.assertEqual(status[0], FAIL, "Snapshots Not Deleted.") # Check in Secondary Storage - Snapshots: All - S1, S2, S3 are deleted self.assertFalse( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshots_created[2].id), "Check: Snapshot 3 is still on Secondary Storage. Not Deleted.") self.assertFalse( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshots_created[1].id), "Check: Snapshot 2 is still on Secondary Storage. Not Deleted.") self.assertFalse( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshots_created[0].id), "Check: Snapshot 1 is still on Secondary Storage. Not Deleted.") return