def test_04_delete_snapshot(self): """Test Delete Snapshot """ # 1. Snapshot the Volume # 2. Delete the snapshot # 3. Verify snapshot is removed by calling List Snapshots API # 4. Verify snapshot was removed from image store self.debug("Creating volume under account: %s" % self.account.name) volume = Volume.create( self.apiclient, self.services["volume"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, diskofferingid=self.disk_offering.id, ) self.debug("Created volume: %s" % volume.id) self.debug("Attaching volume to vm: %s" % self.virtual_machine.id) self.virtual_machine.attach_volume(self.apiclient, volume) self.debug("Volume attached to vm") volumes = list_volumes(self.apiclient, virtualmachineid=self.virtual_machine.id, type="DATADISK", id=volume.id) self.assertEqual(isinstance(volumes, list), True, "Check list response returns a valid list") snapshot = Snapshot.create( self.apiclient, volumes[0].id, account=self.account.name, domainid=self.account.domainid ) snapshot.delete(self.apiclient) snapshots = list_snapshots(self.apiclient, id=snapshot.id) self.assertEqual(snapshots, None, "Check if result exists in list item call") self.assertFalse(is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) return
def test_05_snapshot_events(self): """Test snapshot events """ # Validate the following # 1. Perform snapshot on the root disk of this VM and check the events/alerts. # 2. delete the snapshots and check the events/alerts # 3. listEvents() shows created/deleted snapshot events # Get the Root disk of VM volumes = list_volumes(self.apiclient, virtualmachineid=self.virtual_machine.id, type="ROOT", listall=True) self.assertEqual(isinstance(volumes, list), True, "Check list response returns a valid list") volume = volumes[0] # Create a snapshot from the ROOTDISK snapshot = Snapshot.create(self.apiclient, volume.id) self.debug("Snapshot created with ID: %s" % snapshot.id) snapshots = list_snapshots(self.apiclient, id=snapshot.id) self.assertEqual(isinstance(snapshots, list), True, "Check list response returns a valid list") self.assertNotEqual(snapshots, None, "Check if result exists in list snapshots call") self.assertEqual(snapshots[0].id, snapshot.id, "Check snapshot id in list resources call") snapshot.delete(self.apiclient) # Sleep to ensure that snapshot is deleted properly time.sleep(self.services["sleep"]) events = list_events( self.apiclient, account=self.account.name, domainid=self.account.domainid, type="SNAPSHOT.DELETE" ) self.assertEqual(isinstance(events, list), True, "Check list response returns a valid list") self.assertNotEqual(events, None, "Check if event exists in list events call") self.assertIn(events[0].state, ["Completed", "Scheduled"], "Check events state in list events call") return
def test_02_snapshot_data_disk(self): """Test Snapshot Data Disk """ volume = list_volumes( self.apiclient, virtualmachineid=self.virtual_machine_with_disk.id, type='DATADISK', listall=True) self.assertEqual(isinstance(volume, list), True, "Check list response returns a valid list") self.debug("Creating a Snapshot from data volume: %s" % volume[0].id) snapshot = Snapshot.create(self.apiclient, volume[0].id, account=self.account.name, domainid=self.account.domainid) snapshots = list_snapshots(self.apiclient, id=snapshot.id) self.assertEqual(isinstance(snapshots, list), True, "Check list response returns a valid list") self.assertNotEqual(snapshots, None, "Check if result exists in list item call") self.assertEqual(snapshots[0].id, snapshot.id, "Check resource id in list resources call") self.assertTrue( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) return
def test_01_snapshot_root_disk(self): """Test Snapshot Root Disk """ # Validate the following # 1. listSnapshots should list the snapshot that was created. # 2. verify that secondary storage NFS share contains # the reqd volume under # /secondary/snapshots//$account_id/$volumeid/$snapshot_uuid # 3. verify backup_snap_id was non null in the `snapshots` table # 4. Verify that zoneid is returned in listSnapshots API response volumes = list_volumes( self.apiclient, virtualmachineid=self.virtual_machine_with_disk.id, type='ROOT', listall=True) snapshot = Snapshot.create(self.apiclient, volumes[0].id, account=self.account.name, domainid=self.account.domainid) self.cleanup.append(snapshot) self.debug("Snapshot created: ID - %s" % snapshot.id) snapshots = list_snapshots(self.apiclient, id=snapshot.id) self.assertEqual(isinstance(snapshots, list), True, "Check list response returns a valid list") self.assertNotEqual(snapshots, None, "Check if result exists in list item call") self.assertEqual(snapshots[0].id, snapshot.id, "Check resource id in list resources call") self.assertIsNotNone(snapshots[0].zoneid, "Zone id is not none in listSnapshots") self.assertEqual(snapshots[0].zoneid, self.zone.id, "Check zone id in the list snapshots") self.debug( "select backup_snap_id, account_id, volume_id from snapshots where uuid = '%s';" % str(snapshot.id)) qresultset = self.dbclient.execute( "select backup_snap_id, account_id, volume_id from snapshots where uuid = '%s';" % str(snapshot.id)) self.assertNotEqual(len(qresultset), 0, "Check DB Query result set") qresult = qresultset[0] snapshot_uuid = qresult[0] # backup_snap_id = snapshot UUID self.assertNotEqual(str(snapshot_uuid), 'NULL', "Check if backup_snap_id is not null") self.assertTrue( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) return
def test_04_snapshot_limit(self): """Test snapshot limit in snapshot policies """ # Validate the following # 1. Perform hourly recurring snapshot on the root disk of VM and keep # the maxsnapshots as 1 # 2. listSnapshots should list the snapshot that was created # snapshot folder in secondary storage should contain only one # snapshot image(/secondary/snapshots/$accountid/$volumeid/) # Get the Root disk of VM volumes = list_volumes(self.apiclient, virtualmachineid=self.virtual_machine.id, type="ROOT", listall=True) self.assertEqual(isinstance(volumes, list), True, "Check list response returns a valid list") volume = volumes[0] # Create a snapshot policy recurring_snapshot = SnapshotPolicy.create(self.apiclient, volume.id, self.services["recurring_snapshot"]) self.cleanup.append(recurring_snapshot) snapshot_policy = list_snapshot_policy(self.apiclient, id=recurring_snapshot.id, volumeid=volume.id) self.assertEqual(isinstance(snapshot_policy, list), True, "Check list response returns a valid list") self.assertNotEqual(snapshot_policy, None, "Check if result exists in list item call") self.assertEqual( snapshot_policy[0].id, recurring_snapshot.id, "Check recurring snapshot id in list resources call" ) self.assertEqual( snapshot_policy[0].maxsnaps, self.services["recurring_snapshot"]["maxsnaps"], "Check interval type in list resources call", ) # Sleep for (maxsnaps+1) hours to verify # only maxsnaps snapshots are retained time.sleep((int(self.services["recurring_snapshot"]["maxsnaps"]) + 1) * 3600) # Verify the snapshot was created or not snapshots = list_snapshots( self.apiclient, volumeid=volume.id, intervaltype=self.services["recurring_snapshot"]["intervaltype"], snapshottype="RECURRING", listall=True, ) self.assertEqual(isinstance(snapshots, list), True, "Check list response returns a valid list") self.assertEqual( len(snapshots), self.services["recurring_snapshot"]["maxsnaps"], "Check maximum number of recurring snapshots retained", ) snapshot = snapshots[0] # Sleep to ensure that snapshot is reflected in sec storage time.sleep(self.services["sleep"]) self.assertTrue(is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) return
def test_01_test_vm_volume_snapshot(self): """ @Desc: Test that Volume snapshot for root volume is 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 not fail """ # 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") snapshot = Snapshot.create( self.apiclient, volumes[0].id, account=self.account.name, domainid=self.account.domainid ) self.debug("Snapshot created: ID - %s" % snapshot.id) snapshots = list_snapshots( self.apiclient, id=snapshot.id ) self.assertEqual( validateList(snapshots)[0], PASS, "Invalid snapshot list" ) self.assertEqual( snapshots[0].id, snapshot.id, "Check resource id in list resources call" ) return
def test_02_accountSnapshotClean(self): """Test snapshot cleanup after account deletion """ # Validate the following # 1. listAccounts API should list out the newly created account # 2. listVirtualMachines() command should return the deployed VM. # State of this VM should be "Running" # 3. a)listSnapshots should list the snapshot that was created. # b)verify that secondary storage NFS share contains the reqd volume # under /secondary/snapshots/$accountid/$volumeid/$snapshot_id # 4. a)listAccounts should not list account that is deleted # b) snapshot image($snapshot_id) should be deleted from the # /secondary/snapshots/$accountid/$volumeid/ try: accounts = list_accounts(self.apiclient, id=self.account.id) self.assertEqual(isinstance(accounts, list), True, "Check list response returns a valid list") self.assertNotEqual(len(accounts), 0, "Check list Accounts response") # Verify the snapshot was created or not snapshots = list_snapshots(self.apiclient, id=self.snapshot.id) self.assertEqual(isinstance(snapshots, list), True, "Check list response returns a valid list") self.assertNotEqual(snapshots, None, "No such snapshot %s found" % self.snapshot.id) self.assertEqual(snapshots[0].id, self.snapshot.id, "Check snapshot id in list resources call") self.assertTrue( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshot.id), "Snapshot was not found on NFS") except Exception as e: self._cleanup.append(self.account) self.fail("Exception occured: %s" % e) self.debug("Deleting account: %s" % self.account.name) # Delete account self.account.delete(self.apiclient) # Wait for account cleanup interval wait_for_cleanup(self.apiclient, configs=["account.cleanup.interval"]) with self.assertRaises(Exception): accounts = list_accounts(self.apiclient, id=self.account.id) self.assertFalse( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshot.id), "Snapshot was still found on NFS after account gc") return
def test_02_snapshot_data_disk(self): """Test Snapshot Data Disk """ if self.hypervisor.lower() in ['hyperv']: self.skipTest("Snapshots feature is not supported on Hyper-V") volume = list_volumes( self.apiclient, virtualmachineid=self.virtual_machine_with_disk.id, type='DATADISK', listall=True ) self.assertEqual( isinstance(volume, list), True, "Check list response returns a valid list" ) self.debug("Creating a Snapshot from data volume: %s" % volume[0].id) snapshot = Snapshot.create( self.apiclient, volume[0].id, account=self.account.name, domainid=self.account.domainid ) snapshots = list_snapshots( self.apiclient, id=snapshot.id ) self.assertEqual( isinstance(snapshots, list), True, "Check list response returns a valid list" ) self.assertNotEqual( snapshots, None, "Check if result exists in list item call" ) self.assertEqual( snapshots[0].id, snapshot.id, "Check resource id in list resources call" ) self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) return
def test_02_delete_all_snapshots(self): """Test to delete snapshots """ snapshots = list_snapshots(self.apiclient) if snapshots is not None: for s in snapshots: try: if s.state == 'BackedUp': cmd = deleteSnapshot.deleteSnapshotCmd() cmd.id = s.id self.apiclient.deleteSnapshot(cmd) except Exception as e: continue
def test_13_move_across_subdomain_vm_snapshot(self): """Test as domain admin, stop a VM from subdomain1 and attempt to move it to subdomain2 """ # Validate the following: # 1. deploy VM in sub subdomain1 with snapshot. # 3. assignVirtualMachine to subdomain2 self.create_vm(self.sdomain_account_user1['account'], self.sdomain_account_user1['domain'], snapshot=True) self.virtual_machine.assign_virtual_machine(self.apiclient, self.sdomain_account_user2['account'].name ,self.sdomain_account_user2['domain'].id) snapshots = list_snapshots(self.apiclient, id=self.snapshot.id) self.assertEqual(snapshots, None, "Snapshots stil present for a vm in domain")
def test_05_snapshots_per_project(self): """Test Snapshot limit per project """ # Validate the following # 1. set max no of snapshots per project to 1. # 2. Create one snapshot in the project. Snapshot should be # successfully created # 5. Try to create another snapshot in this project. It should give # user an appropriate error and an alert should be generated. if self.hypervisor.lower() in ["hyperv"]: raise self.skipTest("Snapshots feature is not supported on Hyper-V") self.debug("Updating snapshot resource limits for project: %s" % self.project.id) # Set usage_vm=1 for Account 1 update_resource_limit(self.apiclient, 3, max=1, projectid=self.project.id) # Snapshot self.debug("Deploying VM for account: %s" % self.account.name) virtual_machine_1 = VirtualMachine.create( self.apiclient, self.services["server"], templateid=self.template.id, serviceofferingid=self.service_offering.id, projectid=self.project.id, ) self.cleanup.append(virtual_machine_1) # Verify VM state self.assertEqual(virtual_machine_1.state, "Running", "Check VM state is Running or not") # Get the Root disk of VM volumes = list_volumes( self.apiclient, virtualmachineid=virtual_machine_1.id, projectid=self.project.id, type="ROOT" ) self.assertEqual(isinstance(volumes, list), True, "Check for list volume response return valid data") self.debug("Creating snapshot from volume: %s" % volumes[0].id) # Create a snapshot from the ROOTDISK snapshot_1 = Snapshot.create(self.apiclient, volumes[0].id, projectid=self.project.id) self.cleanup.append(snapshot_1) # list snapshots snapshots = list_snapshots(self.apiclient, projectid=self.project.id) self.debug("snapshots list: %s" % snapshots) self.assertEqual(validateList(snapshots)[0], PASS, "Snapshots list validation failed") self.assertEqual(len(snapshots), 1, "Snapshots list should have exactly one entity") # Exception should be raised for second snapshot with self.assertRaises(Exception): Snapshot.create(self.apiclient, volumes[0].id, projectid=self.project.id) return
def test_01_snapshot_data_disk(self): """Test Snapshot Data Disk """ volume = list_volumes( self.apiclient, virtualmachineid=self.virtual_machine_with_disk.id, type='DATADISK', listall=True ) self.assertEqual( isinstance(volume, list), True, "Check list response returns a valid list" ) self.debug("Creating a Snapshot from data volume: %s" % volume[0].id) snapshot = Snapshot.create( self.apiclient, volume[0].id, account=self.account.name, domainid=self.account.domainid, asyncbackup=True ) snapshots = list_snapshots( self.apiclient, id=snapshot.id ) self.assertEqual( isinstance(snapshots, list), True, "Check list response returns a valid list" ) self.assertNotEqual( snapshots, None, "Check if result exists in list item call" ) self.assertEqual( snapshots[0].id, snapshot.id, "Check resource id in list resources call" ) self.assertEqual( snapshot.state, "BackingUp", "Check resource state in list resources call" ) return
def test_13_move_across_subdomain_vm_snapshot(self): """Test as domain admin, stop a VM from subdomain1 and attempt to move it to subdomain2 """ # Validate the following: # 1. deploy VM in sub subdomain1 with snapshot. # 3. assignVirtualMachine to subdomain2 if self.hypervisor.lower() in ['hyperv', 'lxc']: self.skipTest("Snapshots feature is not supported on %s" % self.hypervisor) self.create_vm(self.sdomain_account_user1['account'], self.sdomain_account_user1['domain'], snapshot=True) self.virtual_machine.assign_virtual_machine(self.apiclient, self.sdomain_account_user2['account'].name ,self.sdomain_account_user2['domain'].id) snapshots = list_snapshots(self.apiclient, id=self.snapshot.id) self.assertEqual(snapshots, None, "Snapshots stil present for a vm in domain")
def get_Snapshots_For_Account(self, account, domainid): try: snapshots = list_snapshots(self.apiclient, account=account, domainid=domainid, listall=True, key='type', value='manual') self.debug("List Snapshots result : %s" % snapshots) self.assertEqual(isinstance(snapshots, list), True, "List snapshots shall return a valid list") return snapshots except Exception as e: self.fail("Failed to fetch snapshots for account: %s - %s" % (account, e))
def test_05_snapshot_events(self): """Test snapshot events """ # Validate the following # 1. Perform snapshot on the root disk of this VM and # check the events/alerts. # 2. delete the snapshots and check the events/alerts # 3. listEvents() shows created/deleted snapshot events if self.hypervisor.lower() in ['hyperv']: self.skipTest("Snapshots feature is not supported on Hyper-V") # Get the Root disk of VM volumes = list_volumes(self.apiclient, virtualmachineid=self.virtual_machine.id, type='ROOT', listall=True) self.assertEqual(isinstance(volumes, list), True, "Check list response returns a valid list") volume = volumes[0] # Create a snapshot from the ROOTDISK snapshot = Snapshot.create(self.apiclient, volume.id) self.debug("Snapshot created with ID: %s" % snapshot.id) snapshots = list_snapshots(self.apiclient, id=snapshot.id) self.assertEqual(isinstance(snapshots, list), True, "Check list response returns a valid list") self.assertNotEqual(snapshots, None, "Check if result exists in list snapshots call") self.assertEqual(snapshots[0].id, snapshot.id, "Check snapshot id in list resources call") snapshot.delete(self.apiclient) # Sleep to ensure that snapshot is deleted properly time.sleep(self.services["sleep"]) events = list_events(self.apiclient, account=self.account.name, domainid=self.account.domainid, type='SNAPSHOT.DELETE') self.assertEqual(isinstance(events, list), True, "Check list response returns a valid list") self.assertNotEqual(events, None, "Check if event exists in list events call") self.assertIn(events[0].state, ['Completed', 'Scheduled'], "Check events state in list events call") return
def test_04_delete_snapshot(self): """Test Delete Snapshot """ # 1. Snapshot the Volume # 2. Delete the snapshot # 3. Verify snapshot is removed by calling List Snapshots API # 4. Verify snapshot was removed from image store if self.hypervisor.lower() in ['hyperv']: self.skipTest("Snapshots feature is not supported on Hyper-V") self.debug("Creating volume under account: %s" % self.account.name) volume = Volume.create(self.apiclient, self.services["volume"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, diskofferingid=self.disk_offering.id) self.debug("Created volume: %s" % volume.id) self.debug("Attaching volume to vm: %s" % self.virtual_machine.id) self.virtual_machine.attach_volume(self.apiclient, volume) self.debug("Volume attached to vm") volumes = list_volumes(self.apiclient, virtualmachineid=self.virtual_machine.id, type='DATADISK', id=volume.id) self.assertEqual(isinstance(volumes, list), True, "Check list response returns a valid list") snapshot = Snapshot.create(self.apiclient, volumes[0].id, account=self.account.name, domainid=self.account.domainid) snapshot.delete(self.apiclient) snapshots = list_snapshots(self.apiclient, id=snapshot.id) self.assertEqual(snapshots, None, "Check if result exists in list item call") self.assertFalse( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) return
def get_Snapshots_For_Account(self, account, domainid): try: snapshots = list_snapshots( self.apiclient, account=account, domainid=domainid, listall=True, key='type', value='manual' ) self.debug("List Snapshots result : %s" % snapshots) self.assertEqual( isinstance(snapshots, list), True, "List snapshots shall return a valid list" ) return snapshots except Exception as e: self.fail("Failed to fetch snapshots for account: %s - %s" % (account, e))
def test_01_create_template_snampshot(self): builtin_info = get_builtin_template_info(self.apiclient, self.zone.id) self.services["templates"][0]["url"] = builtin_info[0] self.services["templates"][0]["hypervisor"] = builtin_info[1] self.services["templates"][0]["format"] = builtin_info[2] # Register new template template = Template.register( self.apiclient, self.services["templates"][0], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, hypervisor=self.hypervisor, details=[{"keyboard":"us","nicAdapter":"e1000","rootDiskController":"scsi"}] ) self.debug( "Registered a template of format: %s with ID: %s" % ( self.services["templates"][0]["format"], template.id )) # Wait for template to download template.download(self.apiclient) self.cleanup.append(template) # Wait for template status to be changed across time.sleep(self.services["sleep"]) timeout = self.services["timeout"] while True: list_template_response = Template.list( self.apiclient, templatefilter='all', id=template.id, zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid) if isinstance(list_template_response, list): break elif timeout == 0: raise Exception("List template failed!") time.sleep(5) timeout = timeout - 1 # Verify template response to check whether template added successfully self.assertEqual( isinstance(list_template_response, list), True, "Check for list template response return valid data" ) self.assertNotEqual( len(list_template_response), 0, "Check template available in List Templates" ) template_response = list_template_response[0] self.assertEqual( template_response.isready, True, "Template state is not ready, it is %s" % template_response.isready ) self.assertIsNotNone( template_response.details, "Template details is %s" % template_response.details ) # Deploy new virtual machine using template virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], templateid=template.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, mode=self.services["mode"] ) self.debug("creating an instance with template ID: %s" % template.id) vm_response = VirtualMachine.list(self.apiclient, id=virtual_machine.id, account=self.account.name, domainid=self.account.domainid) self.assertEqual( isinstance(vm_response, list), True, "Check for list VMs response after VM deployment" ) # Verify VM response to check whether VM deployment was successful self.assertNotEqual( len(vm_response), 0, "Check VMs available in List VMs response" ) vm = vm_response[0] self.assertEqual( vm.state, 'Running', "Check the state of VM created from Template" ) volumes = list_volumes( self.apiclient, virtualmachineid=vm.id, type='ROOT', listall=True ) snapshot = Snapshot.create( self.apiclient, volumes[0].id, account=self.account.name, domainid=self.account.domainid ) time.sleep(self.services["sleep"]) self.cleanup.append(snapshot) self.debug("Snapshot created: ID - %s" % snapshot.id) snapshots = list_snapshots( self.apiclient, id=snapshot.id ) self.assertEqual( isinstance(snapshots, list), True, "Check list response returns a valid list" ) self.assertNotEqual( snapshots, None, "Check if result exists in list item call" ) self.assertEqual( snapshots[0].id, snapshot.id, "Check resource id in list resources call" ) virtual_machine.delete(self.apiclient, expunge=False) list_vm_response = VirtualMachine.list( 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" ) template = Template.create_from_snapshot( self.apiclient, snapshot, self.services["template"] ) self.cleanup.append(template) # Verify created template templates = Template.list( self.apiclient , templatefilter=self.services["template"]["templatefilter"], id=template.id ) self.assertNotEqual( templates, None, "Check if result exists in list item call" ) self.assertEqual( templates[0].id, template.id, "Check new template id in list resources call" ) self.assertIsNotNone( templates[0].details, "Template details is %s" % template_response.details ) return
def test_02_host_maintenance_mode_with_activities(self): """Test host maintenance mode with activities """ # Validate the following # 1. Create Vms. Acquire IP. Create port forwarding & load balancing # rules for Vms. # 2. While activities are ongoing: Create snapshots, recurring # snapshots, create templates, download volumes, Host 1: put to # maintenance mode. All Vms should failover to Host 2 in cluster # Vms should be in running state. All port forwarding rules and # load balancing Rules should work. # 3. After failover to Host 2 succeeds, deploy Vms. Deploy Vms on host # 2 should succeed. All ongoing activities in step 3 should succeed # 4. Host 1: cancel maintenance mode. # 5. While activities are ongoing: Create snapshots, recurring # snapshots, create templates, download volumes, Host 2: put to # maintenance mode. All Vms should failover to Host 1 in cluster. # 6. After failover to Host 1 succeeds, deploy VMs. Deploy Vms on # host 1 should succeed. All ongoing activities in step 6 should # succeed. hosts = Host.list( self.apiclient, zoneid=self.zone.id, resourcestate='Enabled', type='Routing' ) self.assertEqual( isinstance(hosts, list), True, "List hosts should return valid host response" ) if len(hosts) < 2: self.skipTest("There must be at least 2 hosts present in cluster") self.debug("Checking HA with hosts: %s, %s" % ( hosts[0].name, hosts[1].name )) self.debug("Deploying VM in account: %s" % self.account.name) # Spawn an instance in that network virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) vms = VirtualMachine.list( self.apiclient, id=virtual_machine.id, listall=True ) self.assertEqual( isinstance(vms, list), True, "List VMs should return valid response for deployed VM" ) self.assertNotEqual( len(vms), 0, "List VMs should return valid response for deployed VM" ) vm = vms[0] self.debug("Deployed VM on host: %s" % vm.hostid) self.assertEqual( vm.state, "Running", "Deployed VM should be in RUnning state" ) networks = Network.list( self.apiclient, account=self.account.name, domainid=self.account.domainid, listall=True ) self.assertEqual( isinstance(networks, list), True, "List networks should return valid list for the account" ) network = networks[0] self.debug("Associating public IP for account: %s" % self.account.name) public_ip = PublicIPAddress.create( self.apiclient, accountid=self.account.name, zoneid=self.zone.id, domainid=self.account.domainid, networkid=network.id ) self.debug("Associated %s with network %s" % ( public_ip.ipaddress.ipaddress, network.id )) self.debug("Creating PF rule for IP address: %s" % public_ip.ipaddress.ipaddress) NATRule.create( self.apiclient, virtual_machine, self.services["natrule"], ipaddressid=public_ip.ipaddress.id ) self.debug("Creating LB rule on IP with NAT: %s" % public_ip.ipaddress.ipaddress) # Create Load Balancer rule on IP already having NAT rule lb_rule = LoadBalancerRule.create( self.apiclient, self.services["lbrule"], ipaddressid=public_ip.ipaddress.id, accountid=self.account.name ) self.debug("Created LB rule with ID: %s" % lb_rule.id) # Should be able to SSH VM try: self.debug("SSH into VM: %s" % virtual_machine.id) virtual_machine.get_ssh_client( ipaddress=public_ip.ipaddress.ipaddress) except Exception as e: self.fail("SSH Access failed for %s: %s" % (virtual_machine.ipaddress, e) ) # Get the Root disk of VM volumes = list_volumes( self.apiclient, virtualmachineid=virtual_machine.id, type='ROOT', listall=True ) volume = volumes[0] self.debug( "Root volume of VM(%s): %s" % ( virtual_machine.name, volume.name )) # Create a snapshot from the ROOTDISK self.debug("Creating snapshot on ROOT volume: %s" % volume.name) snapshot = Snapshot.create(self.apiclient, volumes[0].id) self.debug("Snapshot created: ID - %s" % snapshot.id) snapshots = list_snapshots( self.apiclient, id=snapshot.id, listall=True ) self.assertEqual( isinstance(snapshots, list), True, "Check list response returns a valid list" ) self.assertNotEqual( snapshots, None, "Check if result exists in list snapshots call" ) self.assertEqual( snapshots[0].id, snapshot.id, "Check snapshot id in list resources call" ) # Generate template from the snapshot self.debug("Generating template from snapshot: %s" % snapshot.name) template = Template.create_from_snapshot( self.apiclient, snapshot, self.services["templates"] ) self.debug("Created template from snapshot: %s" % template.id) templates = list_templates( self.apiclient, templatefilter=self.services["templates"]["templatefilter"], id=template.id ) self.assertEqual( isinstance(templates, list), True, "List template call should return the newly created template" ) self.assertEqual( templates[0].isready, True, "The newly created template should be in ready state" ) first_host = vm.hostid self.debug("Enabling maintenance mode for host %s" % vm.hostid) cmd = prepareHostForMaintenance.prepareHostForMaintenanceCmd() cmd.id = first_host self.apiclient.prepareHostForMaintenance(cmd) self.debug("Waiting for SSVMs to come up") wait_for_ssvms( self.apiclient, zoneid=self.zone.id, podid=self.pod.id, ) timeout = self.services["timeout"] # Poll and check state of VM while it migrates from one host to another while True: vms = VirtualMachine.list( self.apiclient, id=virtual_machine.id, listall=True ) self.assertEqual( isinstance(vms, list), True, "List VMs should return valid response for deployed VM" ) self.assertNotEqual( len(vms), 0, "List VMs should return valid response for deployed VM" ) vm = vms[0] self.debug("VM 1 state: %s" % vm.state) if vm.state in ["Stopping", "Stopped", "Running", "Starting", "Migrating"]: if vm.state == "Running": break else: time.sleep(self.services["sleep"]) timeout = timeout - 1 else: self.fail( "VM migration from one-host-to-other failed\ while enabling maintenance" ) second_host = vm.hostid self.assertEqual( vm.state, "Running", "VM should be in Running state after enabling host maintenance" ) # Should be able to SSH VM try: self.debug("SSH into VM: %s" % virtual_machine.id) virtual_machine.get_ssh_client( ipaddress=public_ip.ipaddress.ipaddress) except Exception as e: self.fail("SSH Access failed for %s: %s" % (virtual_machine.ipaddress, e) ) self.debug("Deploying VM in account: %s" % self.account.name) # Spawn an instance on other host virtual_machine_2 = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) vms = VirtualMachine.list( self.apiclient, id=virtual_machine_2.id, listall=True ) self.assertEqual( isinstance(vms, list), True, "List VMs should return valid response for deployed VM" ) self.assertNotEqual( len(vms), 0, "List VMs should return valid response for deployed VM" ) vm = vms[0] self.debug("Deployed VM on host: %s" % vm.hostid) self.debug("VM 2 state: %s" % vm.state) self.assertEqual( vm.state, "Running", "Deployed VM should be in Running state" ) self.debug("Canceling host maintenance for ID: %s" % first_host) cmd = cancelHostMaintenance.cancelHostMaintenanceCmd() cmd.id = first_host self.apiclient.cancelHostMaintenance(cmd) self.debug("Maintenance mode canceled for host: %s" % first_host) # Get the Root disk of VM volumes = list_volumes( self.apiclient, virtualmachineid=virtual_machine_2.id, type='ROOT', listall=True ) volume = volumes[0] self.debug( "Root volume of VM(%s): %s" % ( virtual_machine_2.name, volume.name )) # Create a snapshot from the ROOTDISK self.debug("Creating snapshot on ROOT volume: %s" % volume.name) snapshot = Snapshot.create(self.apiclient, volumes[0].id) self.debug("Snapshot created: ID - %s" % snapshot.id) snapshots = list_snapshots( self.apiclient, id=snapshot.id, listall=True ) self.assertEqual( isinstance(snapshots, list), True, "Check list response returns a valid list" ) self.assertNotEqual( snapshots, None, "Check if result exists in list snapshots call" ) self.assertEqual( snapshots[0].id, snapshot.id, "Check snapshot id in list resources call" ) # Generate template from the snapshot self.debug("Generating template from snapshot: %s" % snapshot.name) template = Template.create_from_snapshot( self.apiclient, snapshot, self.services["templates"] ) self.debug("Created template from snapshot: %s" % template.id) templates = list_templates( self.apiclient, templatefilter=self.services["templates"]["templatefilter"], id=template.id ) self.assertEqual( isinstance(templates, list), True, "List template call should return the newly created template" ) self.assertEqual( templates[0].isready, True, "The newly created template should be in ready state" ) self.debug("Enabling maintenance mode for host %s" % second_host) cmd = prepareHostForMaintenance.prepareHostForMaintenanceCmd() cmd.id = second_host self.apiclient.prepareHostForMaintenance(cmd) self.debug("Maintenance mode enabled for host: %s" % second_host) self.debug("Waiting for SSVMs to come up") wait_for_ssvms( self.apiclient, zoneid=self.zone.id, podid=self.pod.id, ) # Poll and check the status of VMs timeout = self.services["timeout"] while True: vms = VirtualMachine.list( self.apiclient, account=self.account.name, domainid=self.account.domainid, listall=True ) self.assertEqual( isinstance(vms, list), True, "List VMs should return valid response for deployed VM" ) self.assertNotEqual( len(vms), 0, "List VMs should return valid response for deployed VM" ) vm = vms[0] self.debug( "VM state after enabling maintenance on first host: %s" % vm.state) if vm.state in ["Stopping", "Stopped", "Running", "Starting", "Migrating"]: if vm.state == "Running": break else: time.sleep(self.services["sleep"]) timeout = timeout - 1 else: self.fail( "VM migration from one-host-to-other failed\ while enabling maintenance" ) # Poll and check the status of VMs timeout = self.services["timeout"] while True: vms = VirtualMachine.list( self.apiclient, account=self.account.name, domainid=self.account.domainid, listall=True ) self.assertEqual( isinstance(vms, list), True, "List VMs should return valid response for deployed VM" ) self.assertNotEqual( len(vms), 0, "List VMs should return valid response for deployed VM" ) vm = vms[1] self.debug( "VM state after enabling maintenance on first host: %s" % vm.state) if vm.state in ["Stopping", "Stopped", "Running", "Starting", "Migrating"]: if vm.state == "Running": break else: time.sleep(self.services["sleep"]) timeout = timeout - 1 else: self.fail( "VM migration from one-host-to-other failed\ while enabling maintenance" ) for vm in vms: self.debug( "VM states after enabling maintenance mode on host: %s - %s" % (first_host, vm.state)) self.assertEqual( vm.state, "Running", "Deployed VM should be in Running state" ) # Spawn an instance on other host virtual_machine_3 = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) vms = VirtualMachine.list( self.apiclient, id=virtual_machine_3.id, listall=True ) self.assertEqual( isinstance(vms, list), True, "List VMs should return valid response for deployed VM" ) self.assertNotEqual( len(vms), 0, "List VMs should return valid response for deployed VM" ) vm = vms[0] self.debug("Deployed VM on host: %s" % vm.hostid) self.debug("VM 3 state: %s" % vm.state) self.assertEqual( vm.state, "Running", "Deployed VM should be in Running state" ) self.debug("Canceling host maintenance for ID: %s" % second_host) cmd = cancelHostMaintenance.cancelHostMaintenanceCmd() cmd.id = second_host self.apiclient.cancelHostMaintenance(cmd) self.debug("Maintenance mode canceled for host: %s" % second_host) self.debug("Waiting for SSVMs to come up") wait_for_ssvms( self.apiclient, zoneid=self.zone.id, podid=self.pod.id, ) return
def test_01_snapshot_root_disk(self): """Test Snapshot Root Disk """ # Validate the following # 1. listSnapshots should list the snapshot that was created. # 2. verify that secondary storage NFS share contains # the reqd volume under # /secondary/snapshots//$account_id/$volumeid/$snapshot_uuid # 3. verify backup_snap_id was non null in the `snapshots` table # 4. Verify that zoneid is returned in listSnapshots API response volumes = list_volumes( self.apiclient, virtualmachineid=self.virtual_machine_with_disk.id, type='ROOT', listall=True ) snapshot = Snapshot.create( self.apiclient, volumes[0].id, account=self.account.name, domainid=self.account.domainid ) self.cleanup.append(snapshot) self.debug("Snapshot created: ID - %s" % snapshot.id) snapshots = list_snapshots( self.apiclient, id=snapshot.id ) self.assertEqual( isinstance(snapshots, list), True, "Check list response returns a valid list" ) self.assertNotEqual( snapshots, None, "Check if result exists in list item call" ) self.assertEqual( snapshots[0].id, snapshot.id, "Check resource id in list resources call" ) self.assertIsNotNone(snapshots[0].zoneid, "Zone id is not none in listSnapshots") self.assertEqual( snapshots[0].zoneid, self.zone.id, "Check zone id in the list snapshots" ) self.debug( "select backup_snap_id, account_id, volume_id from snapshots where uuid = '%s';" % str(snapshot.id) ) qresultset = self.dbclient.execute( "select backup_snap_id, account_id, volume_id from snapshots where uuid = '%s';" % str(snapshot.id) ) self.assertNotEqual( len(qresultset), 0, "Check DB Query result set" ) qresult = qresultset[0] snapshot_uuid = qresult[0] # backup_snap_id = snapshot UUID self.assertNotEqual( str(snapshot_uuid), 'NULL', "Check if backup_snap_id is not null" ) self.assertTrue(is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) return
def test_01_create__snapshot_new_resized_rootvolume_size(self): """Test create snapshot on resized root volume # Validate the following # 1. Deploy a VM without any disk offering (only root disk) # 2. Perform(resize) of the root volume # 3. Perform snapshot on resized volume """ # deploy a vm try: if self.updateclone: self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], accountid=self.parentd_admin.name, domainid=self.parent_domain.id, serviceofferingid=self.services_offering_vmware.id, mode=self.zone.networktype) else: self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], accountid=self.parentd_admin.name, domainid=self.parent_domain.id, serviceofferingid=self.service_offering.id, mode=self.zone.networktype) # listVirtual machine list_vms = VirtualMachine.list(self.apiclient, id=self.virtual_machine.id) self.debug( "Verify listVirtualMachines response for virtual machine: %s" % self.virtual_machine.id) res = validateList(list_vms) self.assertNotEqual(res[2], INVALID_INPUT, "Invalid list response") vm = list_vms[0] self.assertEqual(vm.id, self.virtual_machine.id, "Virtual Machine ids do not match") self.assertEqual(vm.name, self.virtual_machine.name, "Virtual Machine names do not match") self.assertEqual(vm.state, "Running", msg="VM is not in Running state") result = self.chk_volume_resize(self.apiclient, vm) if result: # get root vol from created vm, verify it is correct size list_volume_response = Volume.list( self.apiclient, virtualmachineid=self.virtual_machine.id, type='ROOT', listall='True') res = validateList(list_volume_response) self.assertNotEqual( res[2], INVALID_INPUT, "listVolumes returned invalid object in response") rootvolume = list_volume_response[0] self.debug("Creating a Snapshot from root volume: " "%s" % rootvolume.id) snapshot = Snapshot.create(self.apiclient, rootvolume.id, account=self.parentd_admin.name, domainid=self.parent_domain.id) snapshots = list_snapshots(self.apiclient, id=snapshot.id) res = validateList(snapshots) self.assertNotEqual(res[2], INVALID_INPUT, "Invalid list response") self.assertEqual(snapshots[0].id, snapshot.id, "Check resource id in list resources call") else: self.debug("Volume resize is failed") except Exception as e: raise Exception("Exception while performing" " the snapshot on resized root volume" " test case: %s" % e) self.cleanup.append(self.virtual_machine) self.cleanup.append(snapshot) return
def test_01_concurrent_snapshots(self): """Concurrent Snapshots 1. Create snapshot on 2 new VMs in parallel and check 1. all snapshot jobs are running 2. listSnapshots should list all the snapshots 3. Verify secondary_storage NFS share contains the required volume under /secondary/snapshots/$accountid/$volumeid/$snapshot_uuid. 4. Verify backup_snap_id was non null in "snapshots"table 2. Perform step 1 for all the 4 VM's. 3. Verify that VM gets migrated when snapshot is in pregress for the VM. 4. Verify that snapshots get created when VM's are stoped in between snapshot creation. 5. Perform live Migration then stop all the VM's after that verify that snapshot creation success . 6. Verify success of snapshots creation in case: Stop the running VM while performing concurrent snapshot on volumes 7. Verify success of snapshots creation in case: Start Migration of VM's and then Stop the running VM then performing concurrent snapshot on volumes """ # Step 1 try: create_snapshot_thread_1 = Thread( target=CreateSnapshot, args=( self, self.root_pool[0], False)) create_snapshot_thread_2 = Thread( target=CreateSnapshot, args=( self, self.root_pool[1], False)) create_snapshot_thread_1.start() create_snapshot_thread_2.start() create_snapshot_thread_1.join() create_snapshot_thread_2.join() except: self.debug("Error: unable to start thread") snapshots = list_snapshots( self.apiclient, account=self.account.name, domainid=self.account.domainid, listall=True ) for snapshot in self.snapshot_pool: self.assertTrue(snapshot.id in any( s.id) for s in snapshots) for snapshot in self.snapshot_pool: self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) for snapshot in self.snapshot_pool: snapshot.delete(self.apiclient) self.snapshot_pool = [] # Step 2 thread_pool = [] for i in range(4): try: create_snapshot_thread_1 = Thread( target=CreateSnapshot, args=( self, self.root_pool[i], False)) thread_pool.append(create_snapshot_thread_1) except Exception as e: raise Exception( "Warning: Exception unable to start thread : %s" % e) for thread in thread_pool: thread.start() for thread in thread_pool: thread.join() snapshots = list_snapshots( self.apiclient, account=self.account.name, domainid=self.account.domainid, listall=True ) for snapshot in self.snapshot_pool: self.assertTrue(snapshot.id in any( s.id) for s in snapshots) for snapshot in self.snapshot_pool: self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) for snapshot in self.snapshot_pool: snapshot.delete(self.apiclient) self.snapshot_pool = [] # Step 3 # Recurring snapshot try: create_snapshot_thread_1 = Thread( target=CreateSnapshot, args=( self, self.root_pool[0], True)) create_snapshot_thread_2 = Thread( target=CreateSnapshot, args=( self, self.root_pool[1], True)) create_snapshot_thread_1.start() create_snapshot_thread_2.start() create_snapshot_thread_1.join() create_snapshot_thread_2.join() except: self.debug("Error: unable to start thread") for rec_snap in self.rec_policy_pool: list_snapshots_policy_1 = list_snapshot_policy( self.apiclient, id=rec_snap.id, ) list_validation = validateList(list_snapshots_policy_1) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) time.sleep(self.sleep_time_for_hourly_policy) snapshots = list_snapshots( self.apiclient, account=self.account.name, domainid=self.account.domainid, listall=True ) for snapshot in self.snapshot_pool: self.assertTrue(snapshot.id in any( s.id) for s in snapshots) for snapshot in self.snapshot_pool: self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) for snapshot in self.snapshot_pool: snapshot.delete(self.apiclient) self.snapshot_pool = [] for rec_snap_pol in self.rec_policy_pool: rec_snap_pol.delete(self.apiclient) self.rec_policy_pool = [] # Step 4 thread_pool = [] for i in range(4): try: create_snapshot_thread_1 = Thread( target=CreateSnapshot, args=( self, self.root_pool[i], True)) thread_pool.append(create_snapshot_thread_1) except Exception as e: raise Exception( "Warning: Exception unable to start thread : %s" % e) for thread in thread_pool: thread.start() for thread in thread_pool: thread.join() for rec_snap in self.rec_policy_pool: list_snapshots_policy_1 = list_snapshot_policy( self.apiclient, id=rec_snap.id, ) list_validation_1 = validateList(list_snapshots_policy_1) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation_1[2]) time.sleep(self.sleep_time_for_hourly_policy) for snapshot in self.snapshot_pool: self.assertTrue(snapshot.id in any( s.id) for s in snapshots) for snapshot in self.snapshot_pool: self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) for snapshot in self.snapshot_pool: snapshot.delete(self.apiclient) self.snapshot_pool = [] for rec_snap_pol in self.rec_policy_pool: rec_snap_pol.delete(self.apiclient) self.rec_policy_pool = [] # Step 5 try: thread_pool = [] for i in range(4): create_snapshot_thread_1 = Thread( target=CreateSnapshot, args=( self, self.root_pool[i], False)) thread_pool.append(create_snapshot_thread_1) destinationHost = Host.listForMigration( self.apiclient, virtualmachineid=self.vm_pool[3].id) migrate_volume_thread_1 = Thread(target=MigrateRootVolume, args=(self, self.vm_pool[3], destinationHost[0])) thread_pool.append(migrate_volume_thread_1) for thread in thread_pool: thread.start() for thread in thread_pool: thread.join() except Exception as e: raise Exception( "Warning: Exception unable to start thread : %s" % e) snapshots = list_snapshots( self.apiclient, account=self.account.name, domainid=self.account.domainid, listall=True ) for snapshot in self.snapshot_pool: self.assertTrue(snapshot.id in any( s.id) for s in snapshots) for snapshot in self.snapshot_pool: self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) for snapshot in self.snapshot_pool: snapshot.delete(self.apiclient) self.snapshot_pool = [] # Step 6 try: thread_pool = [] for i in range(4): create_snapshot_thread_1 = Thread( target=CreateSnapshot, args=( self, self.root_pool[i], False)) thread_pool.append(create_snapshot_thread_1) stop_vm_thread_1 = Thread(target=self.StopVM, args=(self.vm_pool, )) thread_pool.append(stop_vm_thread_1) for thread in thread_pool: thread.start() for thread in thread_pool: thread.join() except Exception as e: raise Exception( "Warning: Exception unable to start thread : %s" % e) snapshots = list_snapshots( self.apiclient, account=self.account.name, domainid=self.account.domainid, listall=True ) for snapshot in self.snapshot_pool: self.assertTrue(snapshot.id in any( s.id) for s in snapshots) for snapshot in self.snapshot_pool: self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) for snapshot in self.snapshot_pool: snapshot.delete(self.apiclient) self.snapshot_pool = [] # Step 7 thread_pool = [] try: for i in range(2): destinationHost = Host.listForMigration( self.apiclient, virtualmachineid=self.vm_pool[i].id) migrate_volume_thread_1 = Thread(target=MigrateRootVolume, args=(self, self.vm_pool[i], destinationHost[0])) thread_pool.append(migrate_volume_thread_1) for thread in thread_pool: thread.start() for thread in thread_pool: thread.join() for vm in self.vm_pool: if vm.state != "Stopped": vm.stop(self.apiclient) thread_pool = [] for vm in self.vm_pool[:2]: create_snapshot_thread_1 = Thread( target=CreateSnapshot, args=( self, self.root_pool[0], False)) thread_pool.append(create_snapshot_thread_1) for thread in thread_pool: thread.start() for thread in thread_pool: thread.join() except: self.debug("Error: unable to start thread") snapshots = list_snapshots( self.apiclient, account=self.account.name, domainid=self.account.domainid, listall=True ) for snapshot in self.snapshot_pool: self.assertTrue(snapshot.id in any( s.id) for s in snapshots) for snapshot in self.snapshot_pool: self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) for snapshot in self.snapshot_pool: snapshot.delete(self.apiclient) self.snapshot_pool = []
def test_03_volume_rec_snapshot(self): """ Test Volume (root) Snapshot # 1. For snapshot.delta.max > maxsnaps verify that when number of snapshot exceeds maxsnaps value previous snapshot should get deleted from database but remain on secondary storage and when the value exceeds snapshot.delta.max the snapshot should get deleted from secondary storage """ if self.hypervisor.lower() != "xenserver": self.skipTest("Skip test for hypervisor other than Xenserver") # Step 1 self.testdata["recurring_snapshot"]["intervaltype"] = 'HOURLY' self.testdata["recurring_snapshot"]["schedule"] = 1 recurring_snapshot_root = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) Configurations.update(self.apiclient, name="snapshot.delta.max", value="3") list_snapshots_policy = list_snapshot_policy( self.apiclient, id=recurring_snapshot_root.id, volumeid=self.volume[0].id) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) timeout = self.testdata["timeout"] while True: snapshots = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"] ["intervaltype"], snapshottype='RECURRING', listall=True) if isinstance(snapshots, list): break elif timeout == 0: raise Exception("List snapshots API call failed.") time.sleep(3600 * 2) snapshots_2 = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True) self.assertTrue(snapshots[0] not in snapshots_2) for snapshot in snapshots_2: snapshots.append(snapshot) time.sleep(360) self.assertEqual( self.dbclient.execute( "select status from snapshots where uuid='%s'" % snapshots[0].id)[0][0], "Destroyed") self.assertTrue( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, snapshots[0].id)) time.sleep(3600) snapshots_3 = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True) self.assertTrue(snapshots[1] not in snapshots_3) snapshots.append(snapshots_3[1]) time.sleep(180) self.assertEqual( self.dbclient.execute( "select status from snapshots where uuid='%s'" % snapshots[1].id)[0][0], "Destroyed") for snapshot in [snapshots[0], snapshots[1]]: self.assertTrue( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) time.sleep(3600) snapshots_4 = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True) self.assertTrue(snapshots[2] not in snapshots_4) snapshots.append(snapshots_4[1]) time.sleep(180) self.assertEqual( self.dbclient.execute( "select status from snapshots where uuid='%s'" % snapshots[2].id)[0][0], "Destroyed") for snapshot in [snapshots[0], snapshots[1], snapshots[2]]: self.assertFalse( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) return
def test_01_create__snapshot_new_resized_rootvolume_size(self): """Test create snapshot on resized root volume # Validate the following # 1. Deploy a VM without any disk offering (only root disk) # 2. Perform(resize) of the root volume # 3. Perform snapshot on resized volume """ # deploy a vm try: if self.updateclone: self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], accountid=self.parentd_admin.name, domainid=self.parent_domain.id, serviceofferingid=self.services_offering_vmware.id, mode=self.zone.networktype ) else: self.virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], accountid=self.parentd_admin.name, domainid=self.parent_domain.id, serviceofferingid=self.service_offering.id, mode=self.zone.networktype ) # listVirtual machine list_vms = VirtualMachine.list(self.apiclient, id=self.virtual_machine.id) self.debug( "Verify listVirtualMachines response for virtual machine: %s" % self.virtual_machine.id ) res = validateList(list_vms) self.assertNotEqual(res[2], INVALID_INPUT, "Invalid list response") vm = list_vms[0] self.assertEqual( vm.id, self.virtual_machine.id, "Virtual Machine ids do not match" ) self.assertEqual( vm.name, self.virtual_machine.name, "Virtual Machine names do not match" ) self.assertEqual( vm.state, "Running", msg="VM is not in Running state" ) result = self.chk_volume_resize(self.apiclient, vm) if result: # get root vol from created vm, verify it is correct size list_volume_response = Volume.list( self.apiclient, virtualmachineid= self.virtual_machine.id, type='ROOT', listall='True' ) res = validateList(list_volume_response) self.assertNotEqual(res[2], INVALID_INPUT, "listVolumes returned invalid object in response") rootvolume = list_volume_response[0] self.debug("Creating a Snapshot from root volume: " "%s" % rootvolume.id) snapshot = Snapshot.create( self.apiclient, rootvolume.id, account=self.parentd_admin.name, domainid=self.parent_domain.id ) snapshots = list_snapshots( self.apiclient, id=snapshot.id ) res = validateList(snapshots) self.assertNotEqual(res[2], INVALID_INPUT, "Invalid list response") self.assertEqual( snapshots[0].id, snapshot.id, "Check resource id in list resources call" ) else: self.debug("Volume resize is failed") except Exception as e: raise Exception("Exception while performing" " the snapshot on resized root volume" " test case: %s" % e) self.cleanup.append(self.virtual_machine) self.cleanup.append(snapshot) return
def test_03_snapshot_detachedDisk(self): """Test snapshot from detached disk """ # Validate the following # 1. login in VM and write some data on data disk(use fdisk to # partition datadisk,fdisk, and make filesystem using # mkfs.ext3) # 2. Detach the data disk and write some data on data disk # 3. perform the snapshot on the detached volume # 4. listvolumes with VM id shouldn't show the detached volume # 5. listSnapshots should list the snapshot that was created # 6. verify backup_snap_id was non null in the `snapshots` table volumes = list_volumes(self.apiclient, virtualmachineid=self.virtual_machine.id, type='DATADISK', listall=True) self.assertEqual(isinstance(volumes, list), True, "Check list response returns a valid list") volume = volumes[0] random_data_0 = random_gen(size=100) random_data_1 = random_gen(size=100) try: ssh_client = self.virtual_machine.get_ssh_client() # Format partition using ext3 format_volume_to_ext3( ssh_client, self.services["volume"][self.hypervisor]["datadiskdevice_1"]) cmds = [ "mkdir -p %s" % self.services["paths"]["mount_dir"], "mount %s1 %s" % (self.services["volume"][self.hypervisor]["datadiskdevice_1"], self.services["paths"]["mount_dir"]), "pushd %s" % self.services["paths"]["mount_dir"], "mkdir -p %s/{%s,%s} " % (self.services["paths"]["sub_dir"], self.services["paths"]["sub_lvl_dir1"], self.services["paths"]["sub_lvl_dir2"]), "echo %s > %s/%s/%s" % (random_data_0, self.services["paths"]["sub_dir"], self.services["paths"]["sub_lvl_dir1"], self.services["paths"]["random_data"]), "echo %s > %s/%s/%s" % (random_data_1, self.services["paths"]["sub_dir"], self.services["paths"]["sub_lvl_dir2"], self.services["paths"]["random_data"]), "sync", "umount %s" % (self.services["paths"]["mount_dir"]), ] for c in cmds: self.debug(ssh_client.execute(c)) # detach volume from VM cmd = detachVolume.detachVolumeCmd() cmd.id = volume.id self.apiclient.detachVolume(cmd) # Create snapshot from detached volume snapshot = Snapshot.create(self.apiclient, volume.id) volumes = list_volumes(self.apiclient, virtualmachineid=self.virtual_machine.id, type='DATADISK', listall=True) self.assertEqual(volumes, None, "Check Volume is detached") # Verify the snapshot was created or not snapshots = list_snapshots(self.apiclient, id=snapshot.id) self.assertNotEqual( snapshots, None, "Check if result exists in list snapshots call") self.assertEqual(snapshots[0].id, snapshot.id, "Check snapshot id in list resources call") except Exception as e: self.fail("SSH failed for VM with IP: %s - %s" % (self.virtual_machine.ssh_ip, e)) qresultset = self.dbclient.execute( "select id from snapshots where uuid = '%s';" % snapshot.id) self.assertNotEqual(len(qresultset), 0, "Check DB Query result set") qresult = qresultset[0] self.assertNotEqual(str(qresult[0]), 'NULL', "Check if backup_snap_id is not null") return
def test_01_volume_snapshot(self): """ Test Volume (root) Snapshot # 1. Create Hourly, Daily,Weekly recurring snapshot policy for ROOT disk and Verify the presence of the corresponding snapshots on the Secondary Storage # 2. Delete the snapshot policy and verify the entry as Destroyed in snapshot_schedule # 3. Verify that maxsnaps should not consider manual snapshots for deletion # 4. Snapshot policy should reflect the correct timezone # 5. Verify that listSnapshotPolicies() should return all snapshot policies that belong to the account (both manual and recurring snapshots) # 6. Verify that listSnapshotPolicies() should not return snapshot policies that have been deleted # 7. Verify that snapshot should not be created for VM in Destroyed state # 8. Verify that snapshot should get created after resuming the VM # 9. Verify that All the recurring policies associated with the VM should be deleted after VM get destroyed. """ # Step 1 self.testdata["recurring_snapshot"]["intervaltype"] = 'HOURLY' recurring_snapshot = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) # ListSnapshotPolicy should return newly created policy list_snapshots_policy = list_snapshot_policy( self.apiclient, id=recurring_snapshot.id, volumeid=self.volume[0].id) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) timeout = self.testdata["timeout"] while True: snapshots = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"] ["intervaltype"], snapshottype='RECURRING', listall=True) if isinstance(snapshots, list): break elif timeout == 0: raise Exception("List snapshots API call failed.") for snapshot in snapshots: self.assertEqual( self.dbclient.execute( "select type_description from snapshots where name='%s'" % snapshot.name)[0][0], "HOURLY") time.sleep(180) for snapshot in snapshots: self.assertTrue( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) recurring_snapshot.delete(self.apiclient) self.assertEqual( self.dbclient.execute( "select * from snapshot_policy where uuid='%s'" % recurring_snapshot.id), []) self.testdata["recurring_snapshot"]["intervaltype"] = 'DAILY' self.testdata["recurring_snapshot"]["schedule"] = '00:00' recurring_snapshot_daily = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) list_snapshots_policy_daily = list_snapshot_policy( self.apiclient, id=recurring_snapshot_daily.id, volumeid=self.volume[0].id) list_validation = validateList(list_snapshots_policy_daily) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) snap_db_daily = self.dbclient.execute( "select * from snapshot_policy where uuid='%s'" % recurring_snapshot_daily.id) validation_result_1 = validateList(snap_db_daily) self.assertEqual( validation_result_1[0], PASS, "snapshot_policy list validation failed due to %s" % validation_result_1[2]) self.assertNotEqual(len(snap_db_daily), 0, "Check DB Query result set") recurring_snapshot_daily.delete(self.apiclient) self.assertEqual( self.dbclient.execute( "select * from snapshot_policy where uuid='%s'" % recurring_snapshot_daily.id), []) self.testdata["recurring_snapshot"]["intervaltype"] = 'WEEKLY' self.testdata["recurring_snapshot"]["schedule"] = '00:00:1' recurring_snapshot_weekly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) list_snapshots_policy_weekly = list_snapshot_policy( self.apiclient, id=recurring_snapshot_weekly.id, volumeid=self.volume[0].id) list_validation = validateList(list_snapshots_policy_weekly) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) snap_sch_2 = self.dbclient.execute( "select * from snapshot_policy where uuid='%s'" % recurring_snapshot_weekly.id) validation_result_2 = validateList(snap_sch_2) self.assertEqual( validation_result_2[0], PASS, "snapshot_policy list validation failed due to %s" % validation_result_2[2]) self.assertNotEqual(len(snap_sch_2), 0, "Check DB Query result set") recurring_snapshot_weekly.delete(self.apiclient) self.assertEqual( self.dbclient.execute( "select * from snapshot_policy where uuid='%s'" % recurring_snapshot_weekly.id), []) self.testdata["recurring_snapshot"]["intervaltype"] = 'MONTHLY' self.testdata["recurring_snapshot"]["schedule"] = '00:00:1' recurring_snapshot_monthly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) list_snapshots_policy_monthly = list_snapshot_policy( self.apiclient, id=recurring_snapshot_monthly.id, volumeid=self.volume[0].id) list_validation = validateList(list_snapshots_policy_monthly) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) snap_sch_3 = self.dbclient.execute( "select * from snapshot_policy where uuid='%s'" % recurring_snapshot_monthly.id) validation_result = validateList(snap_sch_3) self.assertEqual( validation_result[0], PASS, "snapshot_policy list validation failed due to %s" % validation_result[2]) self.assertNotEqual(len(snap_sch_3), 0, "Check DB Query result set") recurring_snapshot_monthly.delete(self.apiclient) self.assertEqual( self.dbclient.execute( "select * from snapshot_policy where uuid='%s'" % recurring_snapshot_weekly.id), []) snapshots = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True) # Step 3 self.testdata["recurring_snapshot"]["intervaltype"] = 'HOURLY' self.testdata["recurring_snapshot"]["schedule"] = 1 recurring_snapshot_1 = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) # ListSnapshotPolicy should return newly created policy list_snapshots_policy = list_snapshot_policy( self.apiclient, id=recurring_snapshot_1.id, volumeid=self.volume[0].id) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) timeout = self.testdata["timeout"] while True: snapshots = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"] ["intervaltype"], snapshottype='RECURRING', listall=True) if isinstance(snapshots, list): break elif timeout == 0: raise Exception("List snapshots API call failed.") snap_to_delete = snapshots[0] time.sleep((self.testdata["recurring_snapshot"]["maxsnaps"]) * 3600) snapshots_1 = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True) self.assertTrue(snap_to_delete not in snapshots_1) time.sleep(360) self.assertEqual( self.dbclient.execute( "select status from snapshots where uuid='%s'" % snap_to_delete.id)[0][0], "Destroyed") self.assertFalse( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, snap_to_delete.id)) # Step 4 recurring_snapshot = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) # ListSnapshotPolicy should return newly created policy list_snapshots_policy = list_snapshot_policy( self.apiclient, id=recurring_snapshot.id, volumeid=self.volume[0].id) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) time.sleep(180) snap_time_hourly = self.dbclient.execute( "select scheduled_timestamp from \ snapshot_schedule where uuid='%s'" % recurring_snapshot.id) self.debug("Timestamp for hourly snapshot %s" % snap_time_hourly) recurring_snapshot.delete(self.apiclient) self.testdata["recurring_snapshot"]["intervaltype"] = 'DAILY' self.testdata["recurring_snapshot"]["schedule"] = '00:00' recurring_snapshot_daily = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) list_snapshots_policy_daily = list_snapshot_policy( self.apiclient, id=recurring_snapshot_daily.id, volumeid=self.volume[0].id) list_validation = validateList(list_snapshots_policy_daily) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) time.sleep(180) snap_time_daily = self.dbclient.execute( "select scheduled_timestamp from \ snapshot_schedule where uuid='%s'" % recurring_snapshot_daily.id) self.debug("Timestamp for daily snapshot %s" % snap_time_daily) recurring_snapshot_daily.delete(self.apiclient) self.testdata["recurring_snapshot"]["intervaltype"] = 'WEEKLY' self.testdata["recurring_snapshot"]["schedule"] = '00:00:1' recurring_snapshot_weekly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) list_snapshots_policy_weekly = list_snapshot_policy( self.apiclient, id=recurring_snapshot_weekly.id, volumeid=self.volume[0].id) list_validation = validateList(list_snapshots_policy_weekly) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) time.sleep(180) snap_time_weekly = self.dbclient.execute( "select scheduled_timestamp from \ snapshot_schedule where uuid='%s'" % recurring_snapshot_weekly.id) self.debug("Timestamp for monthly snapshot %s" % snap_time_weekly) recurring_snapshot_weekly.delete(self.apiclient) self.testdata["recurring_snapshot"]["intervaltype"] = 'MONTHLY' self.testdata["recurring_snapshot"]["schedule"] = '00:00:1' recurring_snapshot_monthly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) list_snapshots_policy_monthly = list_snapshot_policy( self.apiclient, id=recurring_snapshot_monthly.id, volumeid=self.volume[0].id) list_validation = validateList(list_snapshots_policy_monthly) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) time.sleep(180) snap_time_monthly = self.dbclient.execute( "select scheduled_timestamp from \ snapshot_schedule where uuid='%s'" % recurring_snapshot_monthly.id) self.debug("Timestamp for monthly snapshot %s" % snap_time_monthly) recurring_snapshot_monthly.delete(self.apiclient) # Step 5 self.testdata["recurring_snapshot"]["intervaltype"] = 'HOURLY' self.testdata["recurring_snapshot"]["schedule"] = 1 recurring_snapshot_hourly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) self.testdata["recurring_snapshot"]["intervaltype"] = 'MONTHLY' self.testdata["recurring_snapshot"]["schedule"] = '00:00:1' recurring_snapshot_monthly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) list_snapshots_policy = list_snapshot_policy( self.apiclient, volumeid=self.volume[0].id) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) for rec in [recurring_snapshot_hourly, recurring_snapshot_monthly]: self.assertTrue(rec.id in any(policy['id']) for policy in list_snapshots_policy) recurring_snapshot_hourly.delete(self.apiclient) recurring_snapshot_monthly.delete(self.apiclient) # Step 6 self.testdata["recurring_snapshot"]["intervaltype"] = 'HOURLY' self.testdata["recurring_snapshot"]["schedule"] = 1 recurring_snapshot_hourly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) self.testdata["recurring_snapshot"]["intervaltype"] = 'MONTHLY' self.testdata["recurring_snapshot"]["schedule"] = '00:00:1' recurring_snapshot_monthly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) recurring_snapshot_monthly.delete(self.apiclient) list_snapshots_policy = list_snapshot_policy( self.apiclient, volumeid=self.volume[0].id) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) self.assertTrue(recurring_snapshot_hourly.id in any(policy['id']) for policy in list_snapshots_policy) self.assertTrue(recurring_snapshot_monthly.id not in any(policy['id']) for policy in list_snapshots_policy) # Step 7 self.testdata["recurring_snapshot"]["intervaltype"] = 'HOURLY' self.testdata["recurring_snapshot"]["schedule"] = 1 recurring_snapshot = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) # ListSnapshotPolicy should return newly created policy list_snapshots_policy = list_snapshot_policy( self.apiclient, id=recurring_snapshot.id, volumeid=self.volume[0].id) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) timeout = self.testdata["timeout"] while True: snapshots = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"] ["intervaltype"], snapshottype='RECURRING', listall=True) if isinstance(snapshots, list): break elif timeout == 0: raise Exception("List snapshots API call failed.") self.vm_1.delete(self.apiclient, expunge=False) time.sleep(3600) snapshot_list = Snapshot.list(self.apiclient, volumeid=self.volume[0].id) list_validation = validateList(snapshot_list) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) self.assertEqual( len(snapshot_list), 1, "Verify that snapsot is not created after VM deletion") # Step 8 self.vm_1.recover(self.apiclient) time.sleep(3600) snapshot_list = Snapshot.list(self.apiclient, volumeid=self.volume[0].id) self.assertEqual( len(snapshot_list), 2, "Verify that snapsot is not created after VM deletion") # Step 9 self.vm_1.delete(self.apiclient) time.sleep(180) with self.assertRaises(Exception): list_snapshots_policy = list_snapshot_policy( self.apiclient, volumeid=self.volume[0].id)
def test_01_createVM_snapshotTemplate(self): """Test create VM, Snapshot and Template """ # Validate the following # 1. Deploy VM using default template, small service offering # and small data disk offering. # 2. Perform snapshot on the root disk of this VM. # 3. Create a template from snapshot. # 4. Create a instance from above created template. # 5. listSnapshots should list the snapshot that was created. # 6. verify that secondary storage NFS share contains the reqd # volume under /secondary/snapshots/$accountid/ # $volumeid/$snapshot_uuid # 7. verify backup_snap_id was non null in the `snapshots` table # 8. listTemplates() should return the newly created Template, # and check for template state as READY" # 9. listVirtualMachines() command should return the deployed VM. # State of this VM should be Running. # Create Virtual Machine if self.hypervisor.lower() in ['hyperv']: self.skipTest("Snapshots feature is not supported on Hyper-V") userapiclient = self.testClient.getUserApiClient( UserName=self.account.name, DomainName=self.account.domain) self.virtual_machine = VirtualMachine.create( userapiclient, self.services["server"], templateid=self.template.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.debug("Created VM with ID: %s" % self.virtual_machine.id) # Get the Root disk of VM volumes = list_volumes( userapiclient, virtualmachineid=self.virtual_machine.id, type='ROOT', listall=True ) volume = volumes[0] # Create a snapshot from the ROOTDISK snapshot = Snapshot.create(userapiclient, volume.id) self.debug("Snapshot created: ID - %s" % snapshot.id) self.cleanup.append(snapshot) snapshots = list_snapshots( userapiclient, id=snapshot.id ) self.assertEqual( isinstance(snapshots, list), True, "Check list response returns a valid list" ) self.assertNotEqual( snapshots, None, "Check if result exists in list snapshots call" ) self.assertEqual( snapshots[0].id, snapshot.id, "Check snapshot id in list resources call" ) self.debug( "select backup_snap_id, account_id, volume_id from snapshots where uuid = '%s';" % snapshot.id) snapshot_uuid = snapshot.id # Generate template from the snapshot template = Template.create_from_snapshot( userapiclient, snapshot, self.services["templates"] ) self.debug("Created template from snapshot: %s" % template.id) self.cleanup.append(template) templates = list_templates( userapiclient, templatefilter=self.services["templates"]["templatefilter"], id=template.id ) self.assertNotEqual( templates, None, "Check if result exists in list item call" ) self.assertEqual( templates[0].isready, True, "Check new template state in list templates call" ) # Deploy new virtual machine using template new_virtual_machine = VirtualMachine.create( userapiclient, self.services["server"], templateid=template.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id ) self.debug("Created VM with ID: %s from template: %s" % ( new_virtual_machine.id, template.id )) self.cleanup.append(new_virtual_machine) # Newly deployed VM should be 'Running' virtual_machines = list_virtual_machines( userapiclient, id=new_virtual_machine.id, account=self.account.name, domainid=self.account.domainid ) self.assertEqual( isinstance(virtual_machines, list), True, "Check list response returns a valid list" ) self.assertNotEqual( len(virtual_machines), 0, "Check list virtual machines response" ) for virtual_machine in virtual_machines: self.assertEqual( virtual_machine.state, 'Running', "Check list VM response for Running state" ) self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snapshot_uuid)) 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_disable_enable_zone(self): """disable enable zone 1. Disable zone and verify following things: For admin user: 1. Should be create to start/stop exsiting vms 2. Should be create to deploy new vm, snapshot,volume, template,iso in the same zone For Non-admin user: 1. Should be create to start/stop exsiting vms 2. Should not be create to deploy new vm, snapshot,volume, template,iso in the same zone 2. Enable the above disabled zone and verify that: -All users should be create to deploy new vm, snapshot,volume,template,iso in the same zone 3. Try to delete the zone and it should fail with error message: -"The zone is not deletable because there are servers running in this zone" """ # Step 1 vm_user = 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 ) vm_root = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=self.template.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id ) cmd = updateZone.updateZoneCmd() cmd.id = self.zone.id cmd.allocationstate = DISABLED self.apiclient.updateZone(cmd) zoneList = Zone.list(self.apiclient, id=self.zone.id) self.assertEqual(zoneList[0].allocationstate, DISABLED, "Check if the zone is in disabled state" ) # Both user and admin vms shoul be running self.assertEqual(vm_user.state, RUNNING, "Verify that the user vm is running") self.assertEqual(vm_root.state, RUNNING, "Verify that the admin vm is running") vm_root.stop(self.apiclient) vm_user.stop(self.apiclient) root_state = self.dbclient.execute( "select state from vm_instance where name='%s'" % vm_root.name)[0][0] user_state = self.dbclient.execute( "select state from vm_instance where name='%s'" % vm_user.name)[0][0] self.assertEqual(root_state, STOPPED, "verify that vm is Stopped") self.assertEqual(user_state, STOPPED, "verify that vm is stopped") root_volume = list_volumes( self.userapiclient, virtualmachineid=vm_root.id, type='ROOT', listall=True ) snap = Snapshot.create( self.apiclient, root_volume[0].id) self.assertNotEqual(snap, None, "Verify that admin should be \ able to create snapshot") snapshots = list_snapshots( self.apiclient, volumeid=root_volume[0].id, listall=True) template_from_snapshot = Template.create_from_snapshot( self.apiclient, snapshots[0], self.testdata["privatetemplate"]) self.assertNotEqual( template_from_snapshot, None, "Verify that admin should be able to create template" ) builtin_info = get_builtin_template_info(self.apiclient, self.zone.id) self.testdata["privatetemplate"]["url"] = builtin_info[0] self.testdata["privatetemplate"]["hypervisor"] = builtin_info[1] self.testdata["privatetemplate"]["format"] = builtin_info[2] template_regis = Template.register( self.apiclient, self.testdata["privatetemplate"], zoneid=self.zone.id) self.assertNotEqual( template_regis, None, "Check if template gets created" ) self.assertNotEqual( template_from_snapshot, None, "Check if template gets created" ) data_volume = 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.assertNotEqual( data_volume, None, "Check if volume gets created" ) ISO = Iso.create( self.apiclient, self.testdata["iso2"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, ) self.assertNotEqual( ISO, None, "Check if volume gets created" ) # non-admin user should fail to create vm, snap, temp etc with self.assertRaises(Exception): 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 ) root_volume = list_volumes( self.userapiclient, virtualmachineid=vm_user.id, type='ROOT', listall=True ) with self.assertRaises(Exception): snap = Snapshot.create( self.userapiclient, root_volume[0].id) with self.assertRaises(Exception): Template.register( self.userapiclient, self.testdata["privatetemplate"], zoneid=self.zone.id) with self.assertRaises(Exception): Volume.create( self.userapiclient, self.testdata["volume"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, diskofferingid=self.disk_offering.id ) with self.assertRaises(Exception): ISO = Iso.create( self.userapiclient, self.testdata["iso2"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, ) # Step 2 cmd.allocationstate = ENABLED self.apiclient.updateZone(cmd) # After enabling the zone all users should be able to add new VM, # volume, template and iso root_vm_new = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=self.template.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id ) self.assertNotEqual(root_vm_new, None, "Verify that admin should create new VM") snap = Snapshot.create( self.apiclient, root_volume[0].id) self.assertNotEqual(snap, None, "Verify that admin should snashot") snapshots = list_snapshots( self.apiclient, volumeid=root_volume[0].id, listall=True) template_from_snapshot = Template.create_from_snapshot( self.apiclient, snapshots[0], self.testdata["privatetemplate"]) self.assertNotEqual( template_from_snapshot, None, "Check if template gets created" ) template_regis = Template.register( self.apiclient, self.testdata["privatetemplate"], zoneid=self.zone.id) self.assertNotEqual( template_regis, None, "Check if template gets created" ) self.assertNotEqual( template_from_snapshot, None, "Check if template gets created" ) data_volume = 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.assertNotEqual( data_volume, None, "Check if volume gets created" ) ISO = Iso.create( self.apiclient, self.testdata["iso2"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, ) self.assertNotEqual( ISO, None, "Check if volume gets created" ) root_vm_new.delete(self.apiclient) # Non root user user_vm_new = 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 ) self.assertNotEqual(user_vm_new, None, "Verify that admin should create new VM") snap = Snapshot.create( self.userapiclient, root_volume[0].id) self.assertNotEqual(snap, None, "Verify that admin should snashot") snapshots = list_snapshots( self.userapiclient, volumeid=root_volume[0].id, listall=True) template_regis = Template.register( self.userapiclient, self.testdata["privatetemplate"], zoneid=self.zone.id) self.assertNotEqual( template_regis, None, "Check if template gets created" ) self.assertNotEqual( template_from_snapshot, None, "Check if template gets created" ) data_volume = Volume.create( self.userapiclient, self.testdata["volume"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, diskofferingid=self.disk_offering.id ) self.assertNotEqual( data_volume, None, "Check if volume gets created" ) ISO = Iso.create( self.userapiclient, self.testdata["iso2"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, ) self.assertNotEqual( ISO, None, "Check if volume gets created" ) user_vm_new.delete(self.apiclient) # Step 3 # Deletion of zone should fail if vm,volume is present on the zone with self.assertRaises(Exception): self.zone.delete(self.apiclient) return
def test_01_disable_enable_pod(self): """disable enable Pod 1. Disable pod and verify following things: For admin user: -- Should be able to create new vm, snapshot, volume,template,iso in the same pod For Non-admin user: -- Should not be able to create new vm, snapshot, volume,template,iso in the same pod 2. Enable the above disabled pod and verify that: -All users should be able to create new vm, snapshot, volume,template,iso in the same pod 3. Try to delete the pod and it should fail with error message: - "The pod is not deletable because there are servers running in this pod" """ # Step 1 vm_user = 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, ) vm_root = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=self.template.id, accountid=self.admin_account.name, domainid=self.admin_account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, ) cmd = updatePod.updatePodCmd() cmd.id = self.pod.id cmd.allocationstate = DISABLED self.apiclient.updatePod(cmd) podList = Pod.list(self.apiclient, id=self.pod.id) self.assertEqual(podList[0].allocationstate, DISABLED, "Check if the pod is in disabled state") self.assertEqual(vm_user.state.lower(), "running", "Verify that the user vm is running") self.assertEqual(vm_root.state.lower(), "running", "Verify that the admin vm is running") VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=self.template.id, accountid=self.admin_account.name, domainid=self.admin_account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, ) root_volume = list_volumes(self.apiclient, virtualmachineid=vm_root.id, type="ROOT", listall=True) self.assertEqual(validateList(root_volume)[0], PASS, "list snapshot is empty for volume id %s" % vm_root.id) if self.snapshotSupported: Snapshot.create(self.apiclient, root_volume[0].id) snapshots = list_snapshots(self.apiclient, volumeid=root_volume[0].id, listall=True) self.assertEqual( validateList(snapshots)[0], PASS, "list snapshot is empty for volume id %s" % root_volume[0].id ) Template.create_from_snapshot(self.apiclient, snapshots[0], self.testdata["privatetemplate"]) builtin_info = get_builtin_template_info(self.apiclient, self.zone.id) self.testdata["privatetemplate"]["url"] = builtin_info[0] self.testdata["privatetemplate"]["hypervisor"] = builtin_info[1] self.testdata["privatetemplate"]["format"] = builtin_info[2] Template.register(self.apiclient, self.testdata["privatetemplate"], zoneid=self.zone.id) Volume.create( self.apiclient, self.testdata["volume"], zoneid=self.zone.id, account=self.admin_account.name, domainid=self.admin_account.domainid, diskofferingid=self.disk_offering.id, ) Iso.create( self.apiclient, self.testdata["iso2"], zoneid=self.zone.id, account=self.admin_account.name, domainid=self.admin_account.domainid, ) with self.assertRaises(Exception): 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, ) root_volume = list_volumes(self.userapiclient, virtualmachineid=vm_user.id, type="ROOT", listall=True) self.assertEqual(validateList(root_volume)[0], PASS, "list volume is empty for volume id %s" % vm_user.id) if self.snapshotSupported: Snapshot.create(self.userapiclient, root_volume[0].id) Template.register(self.userapiclient, self.testdata["privatetemplate"], zoneid=self.zone.id) Volume.create( self.userapiclient, self.testdata["volume"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, diskofferingid=self.disk_offering.id, ) Iso.create( self.userapiclient, self.testdata["iso2"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, ) # Step 2 cmd.allocationstate = ENABLED self.apiclient.updatePod(cmd) podList = Pod.list(self.apiclient, id=self.pod.id) self.assertEqual(podList[0].allocationstate, ENABLED, "Check if the pod is in enabled state") root_vm_new = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=self.template.id, accountid=self.admin_account.name, domainid=self.admin_account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, ) self.assertEqual( root_vm_new.state.lower(), "running", "Verify that admin should be able \ to create new VM", ) if self.snapshotSupported: Snapshot.create(self.apiclient, root_volume[0].id) snapshots = list_snapshots(self.apiclient, volumeid=root_volume[0].id, listall=True) self.assertEqual( validateList(snapshots)[0], PASS, "list snapshot is empty for volume id %s" % root_volume[0].id ) Template.create_from_snapshot(self.apiclient, snapshots[0], self.testdata["privatetemplate"]) Template.register(self.apiclient, self.testdata["privatetemplate"], zoneid=self.zone.id) Volume.create( self.apiclient, self.testdata["volume"], zoneid=self.zone.id, account=self.admin_account.name, domainid=self.admin_account.domainid, diskofferingid=self.disk_offering.id, ) Iso.create( self.apiclient, self.testdata["iso2"], zoneid=self.zone.id, account=self.admin_account.name, domainid=self.admin_account.domainid, ) # Non root user user_vm_new = 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, ) self.assertEqual(user_vm_new.state.lower(), "running", "Verify that admin should create new VM") if self.snapshotSupported: Snapshot.create(self.userapiclient, root_volume[0].id) snapshots = list_snapshots(self.userapiclient, volumeid=root_volume[0].id, listall=True) self.assertEqual( validateList(snapshots)[0], PASS, "list snapshot is empty for volume id %s" % root_volume[0].id ) Template.register(self.userapiclient, self.testdata["privatetemplate"], zoneid=self.zone.id) Volume.create( self.userapiclient, self.testdata["volume"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, diskofferingid=self.disk_offering.id, ) Iso.create( self.userapiclient, self.testdata["iso2"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, ) user_vm_new.delete(self.apiclient) # Step 3 # Deletion of zone should fail if resources are running on the zone with self.assertRaises(Exception): self.pod.delete(self.apiclient) return
def test_01_disable_enable_cluster(self): """disable enable cluster 1. Disable cluster and verify following things: For admin user: --Should be able to create new vm, snapshot, volume,template,iso in the same cluster For Non-admin user: --Should not be able create new vm, snapshot, volume,template,iso in the same cluster 2. Enable the above disabled cluster and verify that: -All users should be create to deploy new vm, snapshot, volume,template,iso in the same cluster 3. Disable the managestate of the cluster and verify that: --Host in the cluster should get disconnected --VM's in the cluster are ping-able and ssh to --Creation of new VM in the cluster should fail 4. Enable the managestate of the cluster and verify that: --Hosts in the cluster get connected --VM's in the cluster are accessible 5. Try to delete the cluster and it should fail with error message: -"The cluster is not deletable because there are servers running in this cluster" """ # Step 1 vm_user = 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, ) self.vm_list.append(vm_user) vm_root = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=self.template.id, accountid=self.admin_account.name, domainid=self.admin_account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, mode=self.zone.networktype, ) self.vm_list.append(vm_root) cmd = updateCluster.updateClusterCmd() cmd.id = self.cluster.id cmd.allocationstate = DISABLED self.apiclient.updateCluster(cmd) clusterList = Cluster.list(self.apiclient, id=self.cluster.id) self.assertEqual(clusterList[0].allocationstate, DISABLED, "Check if the cluster is in disabled state") # Verify the existing vms should be running self.assertEqual(vm_user.state.lower(), "running", "Verify that the user vm is running") self.assertEqual(vm_root.state.lower(), "running", "Verify that the root vm is running") VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=self.template.id, accountid=self.admin_account.name, domainid=self.admin_account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, ) root_volume = list_volumes(self.apiclient, virtualmachineid=vm_root.id, type="ROOT", listall=True) self.assertEqual( validateList(root_volume)[0], PASS, "list root volume response is empty for volume id %s" % vm_root.id ) if self.snapshotSupported: Snapshot.create(self.apiclient, root_volume[0].id) snapshots = list_snapshots(self.apiclient, volumeid=root_volume[0].id, listall=True) self.assertEqual( validateList(snapshots)[0], PASS, "list snapshot is empty for volume id %s" % root_volume[0].id ) Template.create_from_snapshot(self.apiclient, snapshots[0], self.testdata["privatetemplate"]) builtin_info = get_builtin_template_info(self.apiclient, self.zone.id) self.testdata["privatetemplate"]["url"] = builtin_info[0] self.testdata["privatetemplate"]["hypervisor"] = builtin_info[1] self.testdata["privatetemplate"]["format"] = builtin_info[2] Template.register(self.apiclient, self.testdata["privatetemplate"], zoneid=self.zone.id) Volume.create( self.apiclient, self.testdata["volume"], zoneid=self.zone.id, account=self.admin_account.name, domainid=self.admin_account.domainid, diskofferingid=self.disk_offering.id, ) Iso.create( self.apiclient, self.testdata["iso2"], zoneid=self.zone.id, account=self.admin_account.name, domainid=self.admin_account.domainid, ) # non-admin user should fail to create vm, snap, temp etc with self.assertRaises(Exception): 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, ) root_volume = list_volumes(self.userapiclient, virtualmachineid=vm_user.id, type="ROOT", listall=True) self.assertEqual( validateList(root_volume)[0], PASS, "list root volume response is empty for volume id %s" % vm_user.id ) if self.snapshotSupported: Snapshot.create(self.userapiclient, root_volume[0].id) Template.register(self.userapiclient, self.testdata["privatetemplate"], zoneid=self.zone.id) Volume.create( self.userapiclient, self.testdata["volume"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, diskofferingid=self.disk_offering.id, ) Iso.create( self.userapiclient, self.testdata["iso2"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, ) # Step 2 cmd.allocationstate = ENABLED self.apiclient.updateCluster(cmd) clusterList = Cluster.list(self.apiclient, id=self.cluster.id) self.assertEqual(clusterList[0].allocationstate, ENABLED, "Check if the cluster is in disabled state") # After enabling the zone all users should be able to add new VM, # volume, templatee and iso root_vm_new = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=self.template.id, accountid=self.admin_account.name, domainid=self.admin_account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, ) self.assertEqual(root_vm_new.state.lower(), "running", "Verify that admin should create new VM") if self.snapshotSupported: Snapshot.create(self.apiclient, root_volume[0].id) # Non root user user_vm_new = 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, ) self.assertEqual(user_vm_new.state.lower(), "running", "Verify that admin should create new VM") if self.snapshotSupported: Snapshot.create(self.userapiclient, root_volume[0].id) # Step 3 cmd = updateCluster.updateClusterCmd() cmd.id = self.cluster.id cmd.managedstate = "Unmanaged" self.apiclient.updateCluster(cmd) clusterList = Cluster.list(self.apiclient, id=self.cluster.id) self.assertEqual( clusterList[0].managedstate.lower(), "unmanaged", "Check if the cluster is in unmanaged state" ) # Hosts in the cluster takes some time to go into disconnected state time.sleep(60) hostList = Host.list(self.apiclient, clusterid=self.cluster.id) for host in hostList: self.assertEqual(host.state.lower(), "disconnected", "Check if host in the cluster gets disconnected") exception_list = [] for vm in self.vm_list: try: SshClient(vm.ssh_ip, vm.ssh_port, vm.username, vm.password) except Exception as e: exception_list.append(e) self.assertEqual(len(exception_list), 0, "Check if vm's are accesible") # non-admin user should fail to create vm, snap, temp etc with self.assertRaises(Exception): 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, ) root_volume = list_volumes(self.userapiclient, virtualmachineid=vm_user.id, type="ROOT", listall=True) if self.snapshotSupported: with self.assertRaises(Exception): Snapshot.create(self.userapiclient, root_volume[0].id) Template.register(self.userapiclient, self.testdata["privatetemplate"], zoneid=self.zone.id) # Step 4 cmd.managedstate = "Managed" self.apiclient.updateCluster(cmd) # After changing the cluster's managestate to Managed hosts in the # cluster takes some time to come back to Up state time.sleep(120) hostList = Host.list(self.apiclient, clusterid=self.cluster.id) for host in hostList: self.assertEqual(host.state.lower(), "up", "Check if host in the cluster gets up") vm_root.stop(self.apiclient) vm_user.stop(self.apiclient) root_state = self.dbclient.execute("select state from vm_instance where name='%s'" % vm_root.name)[0][0] user_state = self.dbclient.execute("select state from vm_instance where name='%s'" % vm_user.name)[0][0] self.assertEqual(root_state, "Stopped", "verify that vm should stop") self.assertEqual(user_state, "Stopped", "verify that vm should stop") root_vm_new = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=self.template.id, accountid=self.admin_account.name, domainid=self.admin_account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, ) self.assertEqual(root_vm_new.state.lower(), "running", "Verify that admin should create new VM") # Step 5 # Deletion of zone should fail if resources are running on the zone with self.assertRaises(Exception): self.pod.delete(self.apiclient) return
def test_03_snapshot_detachedDisk(self): """Test snapshot from detached disk """ # Validate the following # 1. login in VM and write some data on data disk(use fdisk to # partition datadisk,fdisk, and make filesystem using # mkfs.ext3) # 2. Detach the data disk and write some data on data disk # 3. perform the snapshot on the detached volume # 4. listvolumes with VM id shouldn't show the detached volume # 5. listSnapshots should list the snapshot that was created # 6. verify backup_snap_id was non null in the `snapshots` table if self.hypervisor.lower() in ['hyperv']: self.skipTest("Snapshots feature is not supported on Hyper-V") volumes = list_volumes( self.apiclient, virtualmachineid=self.virtual_machine.id, type='DATADISK', listall=True ) self.assertEqual( isinstance(volumes, list), True, "Check list response returns a valid list" ) volume = volumes[0] random_data_0 = random_gen(size=100) random_data_1 = random_gen(size=100) try: ssh_client = self.virtual_machine.get_ssh_client() # Format partition using ext3 format_volume_to_ext3( ssh_client, self.services["volume"][self.hypervisor]["datadiskdevice_1"] ) cmds = [ "mkdir -p %s" % self.services["paths"]["mount_dir"], "mount %s1 %s" % (self.services["volume"][ self.hypervisor]["datadiskdevice_1"], self.services["paths"]["mount_dir"]), "pushd %s" % self.services["paths"]["mount_dir"], "mkdir -p %s/{%s,%s} " % (self.services["paths"]["sub_dir"], self.services["paths"]["sub_lvl_dir1"], self.services["paths"]["sub_lvl_dir2"]), "echo %s > %s/%s/%s" % (random_data_0, self.services["paths"]["sub_dir"], self.services["paths"]["sub_lvl_dir1"], self.services["paths"]["random_data"]), "echo %s > %s/%s/%s" % (random_data_1, self.services["paths"]["sub_dir"], self.services["paths"]["sub_lvl_dir2"], self.services["paths"]["random_data"]), "sync", "umount %s" % (self.services["paths"]["mount_dir"]), ] for c in cmds: self.debug(ssh_client.execute(c)) # detach volume from VM cmd = detachVolume.detachVolumeCmd() cmd.id = volume.id self.apiclient.detachVolume(cmd) # Create snapshot from detached volume snapshot = Snapshot.create(self.apiclient, volume.id) volumes = list_volumes( self.apiclient, virtualmachineid=self.virtual_machine.id, type='DATADISK', listall=True ) self.assertEqual( volumes, None, "Check Volume is detached" ) # Verify the snapshot was created or not snapshots = list_snapshots( self.apiclient, id=snapshot.id ) self.assertNotEqual( snapshots, None, "Check if result exists in list snapshots call" ) self.assertEqual( snapshots[0].id, snapshot.id, "Check snapshot id in list resources call" ) except Exception as e: self.fail("SSH failed for VM with IP: %s - %s" % (self.virtual_machine.ssh_ip, e)) qresultset = self.dbclient.execute( "select id from snapshots where uuid = '%s';" % snapshot.id ) self.assertNotEqual( len(qresultset), 0, "Check DB Query result set" ) qresult = qresultset[0] self.assertNotEqual( str(qresult[0]), 'NULL', "Check if backup_snap_id is not null" ) return
def test_01_disable_enable_zone(self): """disable enable zone 1. Disable zone and verify following things: For admin user: 1. Should be create to start/stop exsiting vms 2. Should be create to deploy new vm, snapshot,volume, template,iso in the same zone For Non-admin user: 1. Should be create to start/stop exsiting vms 2. Should not be create to deploy new vm, snapshot,volume, template,iso in the same zone 2. Enable the above disabled zone and verify that: -All users should be create to deploy new vm, snapshot,volume,template,iso in the same zone 3. Try to delete the zone and it should fail with error message: -"The zone is not deletable because there are servers running in this zone" """ # Step 1 vm_user = 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, ) vm_root = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=self.template.id, accountid=self.admin_account.name, domainid=self.admin_account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, ) cmd = updateZone.updateZoneCmd() cmd.id = self.zone.id cmd.allocationstate = DISABLED self.apiclient.updateZone(cmd) zoneList = Zone.list(self.apiclient, id=self.zone.id) self.assertEqual(zoneList[0].allocationstate, DISABLED, "Check if the zone is in disabled state") # Both user and admin vms shoul be running self.assertEqual(vm_user.state.lower(), "running", "Verify that the user vm is running") self.assertEqual(vm_root.state.lower(), "running", "Verify that the admin vm is running") vm_root.stop(self.apiclient) vm_user.stop(self.apiclient) root_state = self.dbclient.execute("select state from vm_instance where name='%s'" % vm_root.name)[0][0] user_state = self.dbclient.execute("select state from vm_instance where name='%s'" % vm_user.name)[0][0] self.assertEqual(root_state.lower(), "stopped", "verify that vm is Stopped") self.assertEqual(user_state.lower(), "stopped", "verify that vm is stopped") root_volume = list_volumes(self.apiclient, virtualmachineid=vm_root.id, type="ROOT", listall=True) self.assertEqual(validateList(root_volume)[0], PASS, "list volume is empty for vmid %s" % vm_root.id) root_vm_new = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=self.template.id, accountid=self.admin_account.name, domainid=self.admin_account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, ) self.assertEqual(root_vm_new.state.lower(), "running", "Verify that admin should create new VM") if self.snapshotSupported: Snapshot.create(self.apiclient, root_volume[0].id) snapshots = list_snapshots(self.apiclient, volumeid=root_volume[0].id, listall=True) self.assertEqual( validateList(snapshots)[0], PASS, "list snapshot is empty for volume id %s" % root_volume[0].id ) Template.create_from_snapshot(self.apiclient, snapshots[0], self.testdata["privatetemplate"]) builtin_info = get_builtin_template_info(self.apiclient, self.zone.id) self.testdata["privatetemplate"]["url"] = builtin_info[0] self.testdata["privatetemplate"]["hypervisor"] = builtin_info[1] self.testdata["privatetemplate"]["format"] = builtin_info[2] """ //commenting it for now will uncomment once expected behaviour is known Template.register( self.apiclient, self.testdata["privatetemplate"], zoneid=self.zone.id) """ Volume.create( self.apiclient, self.testdata["volume"], zoneid=self.zone.id, account=self.admin_account.name, domainid=self.admin_account.domainid, diskofferingid=self.disk_offering.id, ) """ //commenting it for now will uncomment once expected behaviour is known Iso.create( self.apiclient, self.testdata["iso2"], zoneid=self.zone.id, account=self.admin_account.name, domainid=self.admin_account.domainid, ) """ # non-admin user should fail to create vm, snap, temp etc with self.assertRaises(Exception): 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, ) root_volume = list_volumes(self.userapiclient, virtualmachineid=vm_user.id, type="ROOT", listall=True) self.assertEqual(validateList(root_volume)[0], PASS, "list volume is empty for vmid id %s" % vm_user.id) if self.snapshotSupported: with self.assertRaises(Exception): Snapshot.create(self.userapiclient, root_volume[0].id) with self.assertRaises(Exception): Template.register(self.userapiclient, self.testdata["privatetemplate"], zoneid=self.zone.id) with self.assertRaises(Exception): Volume.create( self.userapiclient, self.testdata["volume"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, diskofferingid=self.disk_offering.id, ) with self.assertRaises(Exception): Iso.create( self.userapiclient, self.testdata["iso2"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, ) # Step 2 cmd.allocationstate = ENABLED self.apiclient.updateZone(cmd) # After enabling the zone all users should be able to add new VM, # volume, template and iso root_vm_new = VirtualMachine.create( self.apiclient, self.testdata["small"], templateid=self.template.id, accountid=self.admin_account.name, domainid=self.admin_account.domainid, serviceofferingid=self.service_offering.id, zoneid=self.zone.id, ) self.assertEqual(root_vm_new.state.lower(), "running", "Verify that admin should create new VM") if self.snapshotSupported: Snapshot.create(self.apiclient, root_volume[0].id) snapshots = list_snapshots(self.apiclient, volumeid=root_volume[0].id, listall=True) self.assertEqual( validateList(snapshots)[0], PASS, "list snapshot is empty for volume id %s" % root_volume[0].id ) Template.create_from_snapshot(self.apiclient, snapshots[0], self.testdata["privatetemplate"]) Template.register(self.apiclient, self.testdata["privatetemplate"], zoneid=self.zone.id) Volume.create( self.apiclient, self.testdata["volume"], zoneid=self.zone.id, account=self.admin_account.name, domainid=self.admin_account.domainid, diskofferingid=self.disk_offering.id, ) Iso.create( self.apiclient, self.testdata["iso2"], zoneid=self.zone.id, account=self.admin_account.name, domainid=self.admin_account.domainid, ) # Non root user user_vm_new = 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, ) self.assertEqual(user_vm_new.state.lower(), "running", "Verify that admin should create new VM") if self.snapshotSupported: Snapshot.create(self.userapiclient, root_volume[0].id) snapshots = list_snapshots(self.userapiclient, volumeid=root_volume[0].id, listall=True) self.assertEqual( validateList(snapshots)[0], PASS, "list snapshot is empty for volume id %s" % root_volume[0].id ) Template.register(self.userapiclient, self.testdata["privatetemplate"], zoneid=self.zone.id) Volume.create( self.userapiclient, self.testdata["volume"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, diskofferingid=self.disk_offering.id, ) Iso.create( self.userapiclient, self.testdata["iso2"], zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, ) # Step 3 # Deletion of zone should fail if vm,volume is present on the zone with self.assertRaises(Exception): self.zone.delete(self.apiclient) return
def test_05_snapshots_per_project(self): """Test Snapshot limit per project """ # Validate the following # 1. set max no of snapshots per project to 1. # 2. Create one snapshot in the project. Snapshot should be # successfully created # 5. Try to create another snapshot in this project. It should give # user an appropriate error and an alert should be generated. if self.hypervisor.lower() in ['hyperv']: raise self.skipTest("Snapshots feature is not supported on Hyper-V") self.debug( "Updating snapshot resource limits for project: %s" % self.project.id) # Set usage_vm=1 for Account 1 update_resource_limit( self.apiclient, 3, # Snapshot max=1, projectid=self.project.id ) self.debug("Deploying VM for account: %s" % self.account.name) virtual_machine_1 = VirtualMachine.create( self.apiclient, self.services["server"], templateid=self.template.id, serviceofferingid=self.service_offering.id, projectid=self.project.id ) self.cleanup.append(virtual_machine_1) # Verify VM state self.assertEqual( virtual_machine_1.state, 'Running', "Check VM state is Running or not" ) # Get the Root disk of VM volumes = list_volumes( self.apiclient, virtualmachineid=virtual_machine_1.id, projectid=self.project.id, type='ROOT' ) self.assertEqual( isinstance(volumes, list), True, "Check for list volume response return valid data" ) self.debug("Creating snapshot from volume: %s" % volumes[0].id) # Create a snapshot from the ROOTDISK snapshot_1 = Snapshot.create(self.apiclient, volumes[0].id, projectid=self.project.id ) self.cleanup.append(snapshot_1) #list snapshots snapshots = list_snapshots(self.apiclient, projectid=self.project.id) self.debug("snapshots list: %s" % snapshots) self.assertEqual(validateList(snapshots)[0], PASS, "Snapshots list validation failed") self.assertEqual(len(snapshots), 1, "Snapshots list should have exactly one entity") # Exception should be raised for second snapshot with self.assertRaises(Exception): Snapshot.create(self.apiclient, volumes[0].id, projectid=self.project.id ) return
def test_01_createVM_snapshotTemplate(self): """Test create VM, Snapshot and Template """ # Validate the following # 1. Deploy VM using default template, small service offering # and small data disk offering. # 2. Perform snapshot on the root disk of this VM. # 3. Create a template from snapshot. # 4. Create a instance from above created template. # 5. listSnapshots should list the snapshot that was created. # 6. verify that secondary storage NFS share contains the reqd # volume under /secondary/snapshots/$accountid/ # $volumeid/$snapshot_uuid # 7. verify backup_snap_id was non null in the `snapshots` table # 8. listTemplates() should return the newly created Template, # and check for template state as READY" # 9. listVirtualMachines() command should return the deployed VM. # State of this VM should be Running. # Create Virtual Machine userapiclient = self.testClient.getUserApiClient( UserName=self.account.name, DomainName=self.account.domain) self.virtual_machine = VirtualMachine.create( userapiclient, self.services["server"], templateid=self.template.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id) self.debug("Created VM with ID: %s" % self.virtual_machine.id) # Get the Root disk of VM volumes = list_volumes(userapiclient, virtualmachineid=self.virtual_machine.id, type='ROOT', listall=True) volume = volumes[0] # Create a snapshot from the ROOTDISK snapshot = Snapshot.create(userapiclient, volume.id) self.debug("Snapshot created: ID - %s" % snapshot.id) self.cleanup.append(snapshot) snapshots = list_snapshots(userapiclient, id=snapshot.id) self.assertEqual(isinstance(snapshots, list), True, "Check list response returns a valid list") self.assertNotEqual(snapshots, None, "Check if result exists in list snapshots call") self.assertEqual(snapshots[0].id, snapshot.id, "Check snapshot id in list resources call") self.debug( "select backup_snap_id, account_id, volume_id from snapshots where uuid = '%s';" % snapshot.id) snapshot_uuid = snapshot.id # Generate template from the snapshot template = Template.create_from_snapshot(userapiclient, snapshot, self.services["templates"]) self.debug("Created template from snapshot: %s" % template.id) self.cleanup.append(template) templates = list_templates( userapiclient, templatefilter=self.services["templates"]["templatefilter"], id=template.id) self.assertNotEqual(templates, None, "Check if result exists in list item call") self.assertEqual(templates[0].isready, True, "Check new template state in list templates call") # Deploy new virtual machine using template new_virtual_machine = VirtualMachine.create( userapiclient, self.services["server"], templateid=template.id, accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id) self.debug("Created VM with ID: %s from template: %s" % (new_virtual_machine.id, template.id)) self.cleanup.append(new_virtual_machine) # Newly deployed VM should be 'Running' virtual_machines = list_virtual_machines( userapiclient, id=new_virtual_machine.id, account=self.account.name, domainid=self.account.domainid) self.assertEqual(isinstance(virtual_machines, list), True, "Check list response returns a valid list") self.assertNotEqual(len(virtual_machines), 0, "Check list virtual machines response") for virtual_machine in virtual_machines: self.assertEqual(virtual_machine.state, 'Running', "Check list VM response for Running state") self.assertTrue( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, snapshot_uuid)) return
def test_02_volume_max_snapshot(self): """ Test Volume Snapshot # 1. Create Hourly reccuring snapshot policy with maxsnaps=2 verify that when 3rd snapshot is taken first snapshot gets deleted """ if self.hypervisor.lower() not in ["kvm", "vmware"]: self.skipTest("Skip test for hypervisor other than KVM and VMWare") # Step 1 self.testdata["recurring_snapshot"]["intervaltype"] = 'HOURLY' self.testdata["recurring_snapshot"]["schedule"] = 1 recurring_snapshot_1 = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"]) # ListSnapshotPolicy should return newly created policy list_snapshots_policy = list_snapshot_policy( self.apiclient, id=recurring_snapshot_1.id, volumeid=self.volume[0].id) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) timeout = self.testdata["timeout"] while True: snapshots = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"] ["intervaltype"], snapshottype='RECURRING', listall=True) if isinstance(snapshots, list): break elif timeout == 0: raise Exception("List snapshots API call failed.") snap_to_delete = snapshots[0] time.sleep((self.testdata["recurring_snapshot"]["maxsnaps"]) * 3600) snapshots_1 = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True) self.assertTrue(snap_to_delete not in snapshots_1) time.sleep(360) self.assertEqual( self.dbclient.execute( "select status from snapshots where uuid='%s'" % snap_to_delete.id)[0][0], "Destroyed") self.assertFalse( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, snap_to_delete.id)) # DATA DISK recurring_snapshot_data = SnapshotPolicy.create( self.apiclient, self.data_volume[0].id, self.testdata["recurring_snapshot"]) # ListSnapshotPolicy should return newly created policy list_snapshots_policy = list_snapshot_policy( self.apiclient, id=recurring_snapshot_data.id, volumeid=self.data_volume[0].id) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) timeout = self.testdata["timeout"] while True: snapshots = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"] ["intervaltype"], snapshottype='RECURRING', listall=True) if isinstance(snapshots, list): break elif timeout == 0: raise Exception("List snapshots API call failed.") data_snap_to_delete = snapshots[0] time.sleep((self.testdata["recurring_snapshot"]["maxsnaps"]) * 3600) data_snapshots_1 = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True) self.assertTrue(data_snap_to_delete not in data_snapshots_1) time.sleep(360) self.assertEqual( self.dbclient.execute( "select status from snapshots where uuid='%s'" % snap_to_delete.id)[0][0], "Destroyed") self.assertFalse( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, data_snap_to_delete.id))
def test_recurring_snapshot_data_disk(self): """Test Recurring Snapshot data Disk """ # 1. Create snapshot policy for data disk # 2. ListSnapshot policy should return newly created policy # 3. Verify only most recent number (maxsnaps) snapshots retailed volume = list_volumes( self.apiclient, virtualmachineid=self.virtual_machine_with_disk.id, type='DATADISK', listall=True ) self.assertEqual( isinstance(volume, list), True, "Check list response returns a valid list" ) recurring_snapshot = SnapshotPolicy.create( self.apiclient, volume[0].id, self.services["recurring_snapshot"] ) self.cleanup.append(recurring_snapshot) # ListSnapshotPolicy should return newly created policy list_snapshots_policy = list_snapshot_policy( self.apiclient, id=recurring_snapshot.id, volumeid=volume[0].id ) self.assertEqual( isinstance(list_snapshots_policy, list), True, "Check list response returns a valid list" ) self.assertNotEqual( list_snapshots_policy, None, "Check if result exists in list item call" ) snapshots_policy = list_snapshots_policy[0] self.assertEqual( snapshots_policy.id, recurring_snapshot.id, "Check recurring snapshot id in list resources call" ) self.assertEqual( snapshots_policy.maxsnaps, self.services["recurring_snapshot"]["maxsnaps"], "Check interval type in list resources call" ) max_snapshots = self.services["recurring_snapshot"]["maxsnaps"] # Sleep for (maxsnaps) hours to verify only maxsnaps snapshots are # retained time.sleep( (max_snapshots * 2) * 3600 ) timeout = self.services["timeout"] while True: snapshots = list_snapshots( self.apiclient, volumeid=volume[0].id, intervaltype=self.services["recurring_snapshot"] ["intervaltype"], snapshottype='RECURRING', listall=True) if isinstance(snapshots, list): break elif timeout == 0: raise Exception("List snapshots API call failed.") time.sleep(1) timeout = timeout - 1 self.assertEqual( isinstance(snapshots, list), True, "Check list response returns a valid list" ) self.assertEqual( len(snapshots), max_snapshots, "Check maximum number of recurring snapshots retained" ) return
def test_02_accountSnapshotClean(self): """Test snapshot cleanup after account deletion """ # Validate the following # 1. listAccounts API should list out the newly created account # 2. listVirtualMachines() command should return the deployed VM. # State of this VM should be "Running" # 3. a)listSnapshots should list the snapshot that was created. # b)verify that secondary storage NFS share contains the reqd volume # under /secondary/snapshots/$accountid/$volumeid/$snapshot_id # 4. a)listAccounts should not list account that is deleted # b) snapshot image($snapshot_id) should be deleted from the # /secondary/snapshots/$accountid/$volumeid/ try: accounts = list_accounts( self.apiclient, id=self.account.id ) self.assertEqual( isinstance(accounts, list), True, "Check list response returns a valid list" ) self.assertNotEqual( len(accounts), 0, "Check list Accounts response" ) # Verify the snapshot was created or not snapshots = list_snapshots( self.apiclient, id=self.snapshot.id ) self.assertEqual( isinstance(snapshots, list), True, "Check list response returns a valid list" ) self.assertNotEqual( snapshots, None, "No such snapshot %s found" % self.snapshot.id ) self.assertEqual( snapshots[0].id, self.snapshot.id, "Check snapshot id in list resources call" ) self.assertTrue(is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshot.id), "Snapshot was not found on NFS") except Exception as e: self._cleanup.append(self.account) self.fail("Exception occured: %s" % e) self.debug("Deleting account: %s" % self.account.name) # Delete account self.account.delete(self.apiclient) # Wait for account cleanup interval wait_for_cleanup(self.apiclient, configs=["account.cleanup.interval"]) with self.assertRaises(Exception): accounts = list_accounts( self.apiclient, id=self.account.id ) self.assertFalse(is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, self.snapshot.id), "Snapshot was still found on NFS after account gc") 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_03_volume_rec_snapshot(self): """ Test Volume (root) Snapshot # 1. For snapshot.delta.max > maxsnaps verify that when number of snapshot exceeds maxsnaps value previous snapshot should get deleted from database but remain on secondary storage and when the value exceeds snapshot.delta.max the snapshot should get deleted from secondary storage """ if self.hypervisor.lower() != "xenserver": self.skipTest("Skip test for hypervisor other than Xenserver") # Step 1 self.testdata["recurring_snapshot"]["intervaltype"] = 'HOURLY' self.testdata["recurring_snapshot"]["schedule"] = 1 recurring_snapshot_root = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) Configurations.update(self.apiclient, name="snapshot.delta.max", value="3" ) list_snapshots_policy = list_snapshot_policy( self.apiclient, id=recurring_snapshot_root.id, volumeid=self.volume[0].id ) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) timeout = self.testdata["timeout"] while True: snapshots = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata[ "recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True ) if isinstance(snapshots, list): break elif timeout == 0: raise Exception("List snapshots API call failed.") time.sleep(3600 * 2) snapshots_2 = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True ) self.assertTrue(snapshots[0] not in snapshots_2) for snapshot in snapshots_2: snapshots.append(snapshot) time.sleep(360) self.assertEqual( self.dbclient.execute( "select status from snapshots where uuid='%s'" % snapshots[0].id)[0][0], "Destroyed" ) self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snapshots[0].id)) time.sleep(3600) snapshots_3 = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True ) self.assertTrue(snapshots[1] not in snapshots_3) snapshots.append(snapshots_3[1]) time.sleep(180) self.assertEqual( self.dbclient.execute( "select status from snapshots where uuid='%s'" % snapshots[1].id)[0][0], "Destroyed" ) for snapshot in [snapshots[0], snapshots[1]]: self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) time.sleep(3600) snapshots_4 = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True ) self.assertTrue(snapshots[2] not in snapshots_4) snapshots.append(snapshots_4[1]) time.sleep(180) self.assertEqual( self.dbclient.execute( "select status from snapshots where uuid='%s'" % snapshots[2].id)[0][0], "Destroyed" ) for snapshot in [snapshots[0], snapshots[1], snapshots[2]]: self.assertFalse( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) return
def test_01_snapshot_root_disk(self): """Test Snapshot Root Disk """ # Validate the following # 1. Account List should list the accounts that was existed. # 2. List Volumes # 3. Create Snapshot From the volume[0] from volume list # 4. List Snapshots # 5. Create Volume V1,V2,V3 from Snapshot List[0] # 6. Verify that Async Job id's status # 7. List all the volumes # 8. Add Volumes V1,V2,V3 to cleanup # 9. Check list response returns a valid list # 10. Check if result exists in list item call # 1. Account List should list the accounts that was existed. account_list = Account.list( self.apiclient, listAll = True, roleType ='Admin' ); # 2. List Volumes volumes = list_volumes( self.apiclient, virtualmachineid=self.virtual_machine_with_disk.id, type='ROOT', listall=True ) # 3. Create Snapshot From the volume[0] from volume list snapshot = Snapshot.create( self.apiclient, volumes[0].id, account=self.account.name, domainid=self.account.domainid ) #self._cleanup.append(snapshot) self.debug("Snapshot created: ID - %s" % snapshot.id) # 4. List Snapshots snapshots = list_snapshots( self.apiclient,listall=True ) # 5. Create Volume V1,V2,V3 from Snapshot List[0] services = {"diskname": "Vol", "zoneid": self.zone.id, "size": 10, "ispublic": True} vol1_jobId = self.create_from_snapshot( self.apiclient,snapshots[0].id, services, account_list[0].name, account_list[0].domainid ); vol2_jobId = self.create_from_snapshot( self.apiclient, snapshots[0].id, services, account_list[0].name, account_list[0].domainid ); vol3_jobId = self.create_from_snapshot( self.apiclient, snapshots[0].id, services, account_list[0].name, account_list[0].domainid ); # 6. Verify that Async Job id's status self.query_async_job(self.apiclient, vol1_jobId.jobid) self.query_async_job(self.apiclient, vol2_jobId.jobid) self.query_async_job(self.apiclient, vol3_jobId.jobid) # 7. List all the volumes list_volume_response = Volume.list( self.apiclient, type="DATADISK", account=account_list[0].name, domainid=account_list[0].domainid ) # 8. Add Volumes V1,V2,V3 to cleanup self.cleanup.append(list_volume_response[0]); self.cleanup.append(list_volume_response[1]); self.cleanup.append(list_volume_response[2]); # 9. Check list response returns a valid list self.assertEqual( isinstance(list_volume_response, list), True, "Check list response returns a valid list" ) # 10.Check if result exists in list item call self.assertNotEqual( list_volume_response, None, "Check if result exists in list item call" ) self.assertIsNotNone(snapshots[0].zoneid, "Zone id is not none in listSnapshots") self.assertEqual( snapshots[0].zoneid, self.zone.id, "Check zone id in the list snapshots" ) return
def _verify_snapshot_belongs_to_volume(self, snapshot_id, volume_id): snapshot = list_snapshots(self.apiClient, id=snapshot_id)[0] self.assertEqual( snapshot.volumeid, volume_id, TestOnlineStorageMigration. _snapshot_not_associated_with_correct_volume)
def test_recurring_snapshot_data_disk(self): """Test Recurring Snapshot data Disk """ # 1. Create snapshot policy for data disk # 2. ListSnapshot policy should return newly created policy # 3. Verify only most recent number (maxsnaps) snapshots retailed volume = list_volumes( self.apiclient, virtualmachineid=self.virtual_machine_with_disk.id, type='DATADISK', listall=True) self.assertEqual(isinstance(volume, list), True, "Check list response returns a valid list") recurring_snapshot = SnapshotPolicy.create( self.apiclient, volume[0].id, self.services["recurring_snapshot"]) self.cleanup.append(recurring_snapshot) # ListSnapshotPolicy should return newly created policy list_snapshots_policy = list_snapshot_policy(self.apiclient, id=recurring_snapshot.id, volumeid=volume[0].id) self.assertEqual(isinstance(list_snapshots_policy, list), True, "Check list response returns a valid list") self.assertNotEqual(list_snapshots_policy, None, "Check if result exists in list item call") snapshots_policy = list_snapshots_policy[0] self.assertEqual(snapshots_policy.id, recurring_snapshot.id, "Check recurring snapshot id in list resources call") self.assertEqual(snapshots_policy.maxsnaps, self.services["recurring_snapshot"]["maxsnaps"], "Check interval type in list resources call") max_snapshots = self.services["recurring_snapshot"]["maxsnaps"] # Sleep for (maxsnaps) hours to verify only maxsnaps snapshots are # retained time.sleep((max_snapshots * 2) * 3600) timeout = self.services["timeout"] while True: snapshots = list_snapshots( self.apiclient, volumeid=volume[0].id, intervaltype=self.services["recurring_snapshot"] ["intervaltype"], snapshottype='RECURRING', listall=True) if isinstance(snapshots, list): break elif timeout == 0: raise Exception("List snapshots API call failed.") time.sleep(1) timeout = timeout - 1 self.assertEqual(isinstance(snapshots, list), True, "Check list response returns a valid list") self.assertEqual( len(snapshots), max_snapshots, "Check maximum number of recurring snapshots retained") return
def test_01_volume_snapshot(self): """ Test Volume (root) Snapshot # 1. Create Hourly, Daily,Weekly recurring snapshot policy for ROOT disk and Verify the presence of the corresponding snapshots on the Secondary Storage # 2. Delete the snapshot policy and verify the entry as Destroyed in snapshot_schedule # 3. Verify that maxsnaps should not consider manual snapshots for deletion # 4. Snapshot policy should reflect the correct timezone # 5. Verify that listSnapshotPolicies() should return all snapshot policies that belong to the account (both manual and recurring snapshots) # 6. Verify that listSnapshotPolicies() should not return snapshot policies that have been deleted # 7. Verify that snapshot should not be created for VM in Destroyed state # 8. Verify that snapshot should get created after resuming the VM # 9. Verify that All the recurring policies associated with the VM should be deleted after VM get destroyed. """ # Step 1 self.testdata["recurring_snapshot"]["intervaltype"] = 'HOURLY' recurring_snapshot = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) # ListSnapshotPolicy should return newly created policy list_snapshots_policy = list_snapshot_policy( self.apiclient, id=recurring_snapshot.id, volumeid=self.volume[0].id ) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) timeout = self.testdata["timeout"] while True: snapshots = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata[ "recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True ) if isinstance(snapshots, list): break elif timeout == 0: raise Exception("List snapshots API call failed.") for snapshot in snapshots: self.assertEqual( self.dbclient.execute( "select type_description from snapshots where name='%s'" % snapshot.name)[0][0], "HOURLY" ) time.sleep(180) for snapshot in snapshots: self.assertTrue( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) recurring_snapshot.delete(self.apiclient) self.assertEqual( self.dbclient.execute( "select * from snapshot_policy where uuid='%s'" % recurring_snapshot.id), [] ) self.testdata["recurring_snapshot"]["intervaltype"] = 'DAILY' self.testdata["recurring_snapshot"]["schedule"] = '00:00' recurring_snapshot_daily = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) list_snapshots_policy_daily = list_snapshot_policy( self.apiclient, id=recurring_snapshot_daily.id, volumeid=self.volume[0].id ) list_validation = validateList(list_snapshots_policy_daily) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) snap_db_daily = self.dbclient.execute( "select * from snapshot_policy where uuid='%s'" % recurring_snapshot_daily.id) validation_result_1 = validateList(snap_db_daily) self.assertEqual( validation_result_1[0], PASS, "snapshot_policy list validation failed due to %s" % validation_result_1[2]) self.assertNotEqual( len(snap_db_daily), 0, "Check DB Query result set" ) recurring_snapshot_daily.delete(self.apiclient) self.assertEqual( self.dbclient.execute( "select * from snapshot_policy where uuid='%s'" % recurring_snapshot_daily.id), [] ) self.testdata["recurring_snapshot"]["intervaltype"] = 'WEEKLY' self.testdata["recurring_snapshot"]["schedule"] = '00:00:1' recurring_snapshot_weekly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) list_snapshots_policy_weekly = list_snapshot_policy( self.apiclient, id=recurring_snapshot_weekly.id, volumeid=self.volume[0].id ) list_validation = validateList(list_snapshots_policy_weekly) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) snap_sch_2 = self.dbclient.execute( "select * from snapshot_policy where uuid='%s'" % recurring_snapshot_weekly.id) validation_result_2 = validateList(snap_sch_2) self.assertEqual( validation_result_2[0], PASS, "snapshot_policy list validation failed due to %s" % validation_result_2[2]) self.assertNotEqual( len(snap_sch_2), 0, "Check DB Query result set" ) recurring_snapshot_weekly.delete(self.apiclient) self.assertEqual( self.dbclient.execute( "select * from snapshot_policy where uuid='%s'" % recurring_snapshot_weekly.id), [] ) self.testdata["recurring_snapshot"]["intervaltype"] = 'MONTHLY' self.testdata["recurring_snapshot"]["schedule"] = '00:00:1' recurring_snapshot_monthly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) list_snapshots_policy_monthly = list_snapshot_policy( self.apiclient, id=recurring_snapshot_monthly.id, volumeid=self.volume[0].id ) list_validation = validateList(list_snapshots_policy_monthly) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) snap_sch_3 = self.dbclient.execute( "select * from snapshot_policy where uuid='%s'" % recurring_snapshot_monthly.id) validation_result = validateList(snap_sch_3) self.assertEqual( validation_result[0], PASS, "snapshot_policy list validation failed due to %s" % validation_result[2]) self.assertNotEqual( len(snap_sch_3), 0, "Check DB Query result set" ) recurring_snapshot_monthly.delete(self.apiclient) self.assertEqual( self.dbclient.execute( "select * from snapshot_policy where uuid='%s'" % recurring_snapshot_weekly.id), [] ) snapshots = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True ) # Step 3 self.testdata["recurring_snapshot"]["intervaltype"] = 'HOURLY' self.testdata["recurring_snapshot"]["schedule"] = 1 recurring_snapshot_1 = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) # ListSnapshotPolicy should return newly created policy list_snapshots_policy = list_snapshot_policy( self.apiclient, id=recurring_snapshot_1.id, volumeid=self.volume[0].id ) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) timeout = self.testdata["timeout"] while True: snapshots = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata[ "recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True ) if isinstance(snapshots, list): break elif timeout == 0: raise Exception("List snapshots API call failed.") snap_to_delete = snapshots[0] time.sleep( (self.testdata["recurring_snapshot"]["maxsnaps"]) * 3600 ) snapshots_1 = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True ) self.assertTrue(snap_to_delete not in snapshots_1) time.sleep(360) self.assertEqual( self.dbclient.execute( "select status from snapshots where uuid='%s'" % snap_to_delete.id)[0][0], "Destroyed" ) self.assertFalse( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snap_to_delete.id)) # Step 4 recurring_snapshot = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) # ListSnapshotPolicy should return newly created policy list_snapshots_policy = list_snapshot_policy( self.apiclient, id=recurring_snapshot.id, volumeid=self.volume[0].id ) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) time.sleep(180) snap_time_hourly = self.dbclient.execute( "select scheduled_timestamp from \ snapshot_schedule where uuid='%s'" % recurring_snapshot.id) self.debug("Timestamp for hourly snapshot %s" % snap_time_hourly) recurring_snapshot.delete(self.apiclient) self.testdata["recurring_snapshot"]["intervaltype"] = 'DAILY' self.testdata["recurring_snapshot"]["schedule"] = '00:00' recurring_snapshot_daily = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) list_snapshots_policy_daily = list_snapshot_policy( self.apiclient, id=recurring_snapshot_daily.id, volumeid=self.volume[0].id ) list_validation = validateList(list_snapshots_policy_daily) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) time.sleep(180) snap_time_daily = self.dbclient.execute( "select scheduled_timestamp from \ snapshot_schedule where uuid='%s'" % recurring_snapshot_daily.id) self.debug("Timestamp for daily snapshot %s" % snap_time_daily) recurring_snapshot_daily.delete(self.apiclient) self.testdata["recurring_snapshot"]["intervaltype"] = 'WEEKLY' self.testdata["recurring_snapshot"]["schedule"] = '00:00:1' recurring_snapshot_weekly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) list_snapshots_policy_weekly = list_snapshot_policy( self.apiclient, id=recurring_snapshot_weekly.id, volumeid=self.volume[0].id ) list_validation = validateList(list_snapshots_policy_weekly) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) time.sleep(180) snap_time_weekly = self.dbclient.execute( "select scheduled_timestamp from \ snapshot_schedule where uuid='%s'" % recurring_snapshot_weekly.id) self.debug("Timestamp for monthly snapshot %s" % snap_time_weekly) recurring_snapshot_weekly.delete(self.apiclient) self.testdata["recurring_snapshot"]["intervaltype"] = 'MONTHLY' self.testdata["recurring_snapshot"]["schedule"] = '00:00:1' recurring_snapshot_monthly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) list_snapshots_policy_monthly = list_snapshot_policy( self.apiclient, id=recurring_snapshot_monthly.id, volumeid=self.volume[0].id ) list_validation = validateList(list_snapshots_policy_monthly) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) time.sleep(180) snap_time_monthly = self.dbclient.execute( "select scheduled_timestamp from \ snapshot_schedule where uuid='%s'" % recurring_snapshot_monthly.id) self.debug("Timestamp for monthly snapshot %s" % snap_time_monthly) recurring_snapshot_monthly.delete(self.apiclient) # Step 5 self.testdata["recurring_snapshot"]["intervaltype"] = 'HOURLY' self.testdata["recurring_snapshot"]["schedule"] = 1 recurring_snapshot_hourly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) self.testdata["recurring_snapshot"]["intervaltype"] = 'MONTHLY' self.testdata["recurring_snapshot"]["schedule"] = '00:00:1' recurring_snapshot_monthly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) list_snapshots_policy = list_snapshot_policy( self.apiclient, volumeid=self.volume[0].id ) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) for rec in [recurring_snapshot_hourly, recurring_snapshot_monthly]: self.assertTrue( rec.id in any( policy['id']) for policy in list_snapshots_policy) recurring_snapshot_hourly.delete(self.apiclient) recurring_snapshot_monthly.delete(self.apiclient) # Step 6 self.testdata["recurring_snapshot"]["intervaltype"] = 'HOURLY' self.testdata["recurring_snapshot"]["schedule"] = 1 recurring_snapshot_hourly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) self.testdata["recurring_snapshot"]["intervaltype"] = 'MONTHLY' self.testdata["recurring_snapshot"]["schedule"] = '00:00:1' recurring_snapshot_monthly = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) recurring_snapshot_monthly.delete(self.apiclient) list_snapshots_policy = list_snapshot_policy( self.apiclient, volumeid=self.volume[0].id ) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) self.assertTrue( recurring_snapshot_hourly.id in any( policy['id']) for policy in list_snapshots_policy) self.assertTrue( recurring_snapshot_monthly.id not in any( policy['id']) for policy in list_snapshots_policy) # Step 7 self.testdata["recurring_snapshot"]["intervaltype"] = 'HOURLY' self.testdata["recurring_snapshot"]["schedule"] = 1 recurring_snapshot = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) # ListSnapshotPolicy should return newly created policy list_snapshots_policy = list_snapshot_policy( self.apiclient, id=recurring_snapshot.id, volumeid=self.volume[0].id ) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) timeout = self.testdata["timeout"] while True: snapshots = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata[ "recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True ) if isinstance(snapshots, list): break elif timeout == 0: raise Exception("List snapshots API call failed.") self.vm_1.delete(self.apiclient, expunge=False) time.sleep(3600) snapshot_list = Snapshot.list( self.apiclient, volumeid=self.volume[0].id ) list_validation = validateList(snapshot_list) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) self.assertEqual(len(snapshot_list), 1, "Verify that snapsot is not created after VM deletion" ) # Step 8 self.vm_1.recover(self.apiclient) time.sleep(3600) snapshot_list = Snapshot.list( self.apiclient, volumeid=self.volume[0].id ) self.assertEqual(len(snapshot_list), 2, "Verify that snapsot is not created after VM deletion" ) # Step 9 self.vm_1.delete(self.apiclient) time.sleep(180) with self.assertRaises(Exception): list_snapshots_policy = list_snapshot_policy( self.apiclient, volumeid=self.volume[0].id )
def test_04_snapshot_limit(self): """Test snapshot limit in snapshot policies """ # Validate the following # 1. Perform hourly recurring snapshot on the root disk of VM and keep # the maxsnapshots as 1 # 2. listSnapshots should list the snapshot that was created # snapshot folder in secondary storage should contain only one # snapshot image(/secondary/snapshots/$accountid/$volumeid/) # Get the Root disk of VM volumes = list_volumes(self.apiclient, virtualmachineid=self.virtual_machine.id, type='ROOT', listall=True) self.assertEqual(isinstance(volumes, list), True, "Check list response returns a valid list") volume = volumes[0] # Create a snapshot policy recurring_snapshot = SnapshotPolicy.create( self.apiclient, volume.id, self.services["recurring_snapshot"]) self.cleanup.append(recurring_snapshot) snapshot_policy = list_snapshot_policy(self.apiclient, id=recurring_snapshot.id, volumeid=volume.id) self.assertEqual(isinstance(snapshot_policy, list), True, "Check list response returns a valid list") self.assertNotEqual(snapshot_policy, None, "Check if result exists in list item call") self.assertEqual(snapshot_policy[0].id, recurring_snapshot.id, "Check recurring snapshot id in list resources call") self.assertEqual(snapshot_policy[0].maxsnaps, self.services["recurring_snapshot"]["maxsnaps"], "Check interval type in list resources call") # Sleep for (maxsnaps+1) hours to verify # only maxsnaps snapshots are retained time.sleep( (int(self.services["recurring_snapshot"]["maxsnaps"]) + 1) * 3600) # Verify the snapshot was created or not snapshots = list_snapshots( self.apiclient, volumeid=volume.id, intervaltype=\ self.services["recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True ) self.assertEqual(isinstance(snapshots, list), True, "Check list response returns a valid list") self.assertEqual( len(snapshots), self.services["recurring_snapshot"]["maxsnaps"], "Check maximum number of recurring snapshots retained") snapshot = snapshots[0] # Sleep to ensure that snapshot is reflected in sec storage time.sleep(self.services["sleep"]) self.assertTrue( is_snapshot_on_nfs(self.apiclient, self.dbclient, self.config, self.zone.id, snapshot.id)) return
def test_02_host_maintenance_mode_with_activities(self): """Test host maintenance mode with activities """ # Validate the following # 1. Create Vms. Acquire IP. Create port forwarding & load balancing # rules for Vms. # 2. While activities are ongoing: Create snapshots, recurring # snapshots, create templates, download volumes, Host 1: put to # maintenance mode. All Vms should failover to Host 2 in cluster # Vms should be in running state. All port forwarding rules and # load balancing Rules should work. # 3. After failover to Host 2 succeeds, deploy Vms. Deploy Vms on host # 2 should succeed. All ongoing activities in step 3 should succeed # 4. Host 1: cancel maintenance mode. # 5. While activities are ongoing: Create snapshots, recurring # snapshots, create templates, download volumes, Host 2: put to # maintenance mode. All Vms should failover to Host 1 in cluster. # 6. After failover to Host 1 succeeds, deploy VMs. Deploy Vms on # host 1 should succeed. All ongoing activities in step 6 should # succeed. hosts = Host.list(self.apiclient, zoneid=self.zone.id, resourcestate='Enabled', type='Routing') self.assertEqual(isinstance(hosts, list), True, "List hosts should return valid host response") if len(hosts) < 2: self.skipTest("There must be at least 2 hosts present in cluster") self.debug("Checking HA with hosts: %s, %s" % (hosts[0].name, hosts[1].name)) self.debug("Deploying VM in account: %s" % self.account.name) # Spawn an instance in that network virtual_machine = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id) vms = VirtualMachine.list(self.apiclient, id=virtual_machine.id, listall=True) self.assertEqual( isinstance(vms, list), True, "List VMs should return valid response for deployed VM") self.assertNotEqual( len(vms), 0, "List VMs should return valid response for deployed VM") vm = vms[0] self.debug("Deployed VM on host: %s" % vm.hostid) self.assertEqual(vm.state, "Running", "Deployed VM should be in RUnning state") networks = Network.list(self.apiclient, account=self.account.name, domainid=self.account.domainid, listall=True) self.assertEqual( isinstance(networks, list), True, "List networks should return valid list for the account") network = networks[0] self.debug("Associating public IP for account: %s" % self.account.name) public_ip = PublicIPAddress.create(self.apiclient, accountid=self.account.name, zoneid=self.zone.id, domainid=self.account.domainid, networkid=network.id) self.debug("Associated %s with network %s" % (public_ip.ipaddress.ipaddress, network.id)) self.debug("Creating PF rule for IP address: %s" % public_ip.ipaddress.ipaddress) NATRule.create(self.apiclient, virtual_machine, self.services["natrule"], ipaddressid=public_ip.ipaddress.id) self.debug("Creating LB rule on IP with NAT: %s" % public_ip.ipaddress.ipaddress) # Create Load Balancer rule on IP already having NAT rule lb_rule = LoadBalancerRule.create(self.apiclient, self.services["lbrule"], ipaddressid=public_ip.ipaddress.id, accountid=self.account.name) self.debug("Created LB rule with ID: %s" % lb_rule.id) # Should be able to SSH VM try: self.debug("SSH into VM: %s" % virtual_machine.id) virtual_machine.get_ssh_client( ipaddress=public_ip.ipaddress.ipaddress) except Exception as e: self.fail("SSH Access failed for %s: %s" % (virtual_machine.ipaddress, e)) # Get the Root disk of VM volumes = list_volumes(self.apiclient, virtualmachineid=virtual_machine.id, type='ROOT', listall=True) volume = volumes[0] self.debug("Root volume of VM(%s): %s" % (virtual_machine.name, volume.name)) # Create a snapshot from the ROOTDISK self.debug("Creating snapshot on ROOT volume: %s" % volume.name) snapshot = Snapshot.create(self.apiclient, volumes[0].id) self.debug("Snapshot created: ID - %s" % snapshot.id) snapshots = list_snapshots(self.apiclient, id=snapshot.id, listall=True) self.assertEqual(isinstance(snapshots, list), True, "Check list response returns a valid list") self.assertNotEqual(snapshots, None, "Check if result exists in list snapshots call") self.assertEqual(snapshots[0].id, snapshot.id, "Check snapshot id in list resources call") # Generate template from the snapshot self.debug("Generating template from snapshot: %s" % snapshot.name) template = Template.create_from_snapshot(self.apiclient, snapshot, self.services["templates"]) self.debug("Created template from snapshot: %s" % template.id) templates = list_templates( self.apiclient, templatefilter=self.services["templates"]["templatefilter"], id=template.id) self.assertEqual( isinstance(templates, list), True, "List template call should return the newly created template") self.assertEqual( templates[0].isready, True, "The newly created template should be in ready state") first_host = vm.hostid self.debug("Enabling maintenance mode for host %s" % vm.hostid) cmd = prepareHostForMaintenance.prepareHostForMaintenanceCmd() cmd.id = first_host self.apiclient.prepareHostForMaintenance(cmd) self.debug("Waiting for SSVMs to come up") wait_for_ssvms( self.apiclient, zoneid=self.zone.id, podid=self.pod.id, ) timeout = self.services["timeout"] # Poll and check state of VM while it migrates from one host to another while True: vms = VirtualMachine.list(self.apiclient, id=virtual_machine.id, listall=True) self.assertEqual( isinstance(vms, list), True, "List VMs should return valid response for deployed VM") self.assertNotEqual( len(vms), 0, "List VMs should return valid response for deployed VM") vm = vms[0] self.debug("VM 1 state: %s" % vm.state) if vm.state in [ "Stopping", "Stopped", "Running", "Starting", "Migrating" ]: if vm.state == "Running": break else: time.sleep(self.services["sleep"]) timeout = timeout - 1 else: self.fail("VM migration from one-host-to-other failed\ while enabling maintenance") second_host = vm.hostid self.assertEqual( vm.state, "Running", "VM should be in Running state after enabling host maintenance") # Should be able to SSH VM try: self.debug("SSH into VM: %s" % virtual_machine.id) virtual_machine.get_ssh_client( ipaddress=public_ip.ipaddress.ipaddress) except Exception as e: self.fail("SSH Access failed for %s: %s" % (virtual_machine.ipaddress, e)) self.debug("Deploying VM in account: %s" % self.account.name) # Spawn an instance on other host virtual_machine_2 = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id) vms = VirtualMachine.list(self.apiclient, id=virtual_machine_2.id, listall=True) self.assertEqual( isinstance(vms, list), True, "List VMs should return valid response for deployed VM") self.assertNotEqual( len(vms), 0, "List VMs should return valid response for deployed VM") vm = vms[0] self.debug("Deployed VM on host: %s" % vm.hostid) self.debug("VM 2 state: %s" % vm.state) self.assertEqual(vm.state, "Running", "Deployed VM should be in Running state") self.debug("Canceling host maintenance for ID: %s" % first_host) cmd = cancelHostMaintenance.cancelHostMaintenanceCmd() cmd.id = first_host self.apiclient.cancelHostMaintenance(cmd) self.debug("Maintenance mode canceled for host: %s" % first_host) # Get the Root disk of VM volumes = list_volumes(self.apiclient, virtualmachineid=virtual_machine_2.id, type='ROOT', listall=True) volume = volumes[0] self.debug("Root volume of VM(%s): %s" % (virtual_machine_2.name, volume.name)) # Create a snapshot from the ROOTDISK self.debug("Creating snapshot on ROOT volume: %s" % volume.name) snapshot = Snapshot.create(self.apiclient, volumes[0].id) self.debug("Snapshot created: ID - %s" % snapshot.id) snapshots = list_snapshots(self.apiclient, id=snapshot.id, listall=True) self.assertEqual(isinstance(snapshots, list), True, "Check list response returns a valid list") self.assertNotEqual(snapshots, None, "Check if result exists in list snapshots call") self.assertEqual(snapshots[0].id, snapshot.id, "Check snapshot id in list resources call") # Generate template from the snapshot self.debug("Generating template from snapshot: %s" % snapshot.name) template = Template.create_from_snapshot(self.apiclient, snapshot, self.services["templates"]) self.debug("Created template from snapshot: %s" % template.id) templates = list_templates( self.apiclient, templatefilter=self.services["templates"]["templatefilter"], id=template.id) self.assertEqual( isinstance(templates, list), True, "List template call should return the newly created template") self.assertEqual( templates[0].isready, True, "The newly created template should be in ready state") self.debug("Enabling maintenance mode for host %s" % second_host) cmd = prepareHostForMaintenance.prepareHostForMaintenanceCmd() cmd.id = second_host self.apiclient.prepareHostForMaintenance(cmd) self.debug("Maintenance mode enabled for host: %s" % second_host) self.debug("Waiting for SSVMs to come up") wait_for_ssvms( self.apiclient, zoneid=self.zone.id, podid=self.pod.id, ) # Poll and check the status of VMs timeout = self.services["timeout"] while True: vms = VirtualMachine.list(self.apiclient, account=self.account.name, domainid=self.account.domainid, listall=True) self.assertEqual( isinstance(vms, list), True, "List VMs should return valid response for deployed VM") self.assertNotEqual( len(vms), 0, "List VMs should return valid response for deployed VM") vm = vms[0] self.debug( "VM state after enabling maintenance on first host: %s" % vm.state) if vm.state in [ "Stopping", "Stopped", "Running", "Starting", "Migrating" ]: if vm.state == "Running": break else: time.sleep(self.services["sleep"]) timeout = timeout - 1 else: self.fail("VM migration from one-host-to-other failed\ while enabling maintenance") # Poll and check the status of VMs timeout = self.services["timeout"] while True: vms = VirtualMachine.list(self.apiclient, account=self.account.name, domainid=self.account.domainid, listall=True) self.assertEqual( isinstance(vms, list), True, "List VMs should return valid response for deployed VM") self.assertNotEqual( len(vms), 0, "List VMs should return valid response for deployed VM") vm = vms[1] self.debug( "VM state after enabling maintenance on first host: %s" % vm.state) if vm.state in [ "Stopping", "Stopped", "Running", "Starting", "Migrating" ]: if vm.state == "Running": break else: time.sleep(self.services["sleep"]) timeout = timeout - 1 else: self.fail("VM migration from one-host-to-other failed\ while enabling maintenance") for vm in vms: self.debug( "VM states after enabling maintenance mode on host: %s - %s" % (first_host, vm.state)) self.assertEqual(vm.state, "Running", "Deployed VM should be in Running state") # Spawn an instance on other host virtual_machine_3 = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], accountid=self.account.name, domainid=self.account.domainid, serviceofferingid=self.service_offering.id) vms = VirtualMachine.list(self.apiclient, id=virtual_machine_3.id, listall=True) self.assertEqual( isinstance(vms, list), True, "List VMs should return valid response for deployed VM") self.assertNotEqual( len(vms), 0, "List VMs should return valid response for deployed VM") vm = vms[0] self.debug("Deployed VM on host: %s" % vm.hostid) self.debug("VM 3 state: %s" % vm.state) self.assertEqual(vm.state, "Running", "Deployed VM should be in Running state") self.debug("Canceling host maintenance for ID: %s" % second_host) cmd = cancelHostMaintenance.cancelHostMaintenanceCmd() cmd.id = second_host self.apiclient.cancelHostMaintenance(cmd) self.debug("Maintenance mode canceled for host: %s" % second_host) self.debug("Waiting for SSVMs to come up") wait_for_ssvms( self.apiclient, zoneid=self.zone.id, podid=self.pod.id, ) return
def test_02_volume_max_snapshot(self): """ Test Volume Snapshot # 1. Create Hourly reccuring snapshot policy with maxsnaps=2 verify that when 3rd snapshot is taken first snapshot gets deleted """ if self.hypervisor.lower() not in ["kvm", "vmware"]: self.skipTest("Skip test for hypervisor other than KVM and VMWare") # Step 1 self.testdata["recurring_snapshot"]["intervaltype"] = 'HOURLY' self.testdata["recurring_snapshot"]["schedule"] = 1 recurring_snapshot_1 = SnapshotPolicy.create( self.apiclient, self.volume[0].id, self.testdata["recurring_snapshot"] ) # ListSnapshotPolicy should return newly created policy list_snapshots_policy = list_snapshot_policy( self.apiclient, id=recurring_snapshot_1.id, volumeid=self.volume[0].id ) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) timeout = self.testdata["timeout"] while True: snapshots = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata[ "recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True ) if isinstance(snapshots, list): break elif timeout == 0: raise Exception("List snapshots API call failed.") snap_to_delete = snapshots[0] time.sleep( (self.testdata["recurring_snapshot"]["maxsnaps"]) * 3600 ) snapshots_1 = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True ) self.assertTrue(snap_to_delete not in snapshots_1) time.sleep(360) self.assertEqual( self.dbclient.execute( "select status from snapshots where uuid='%s'" % snap_to_delete.id)[0][0], "Destroyed" ) self.assertFalse( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, snap_to_delete.id)) # DATA DISK recurring_snapshot_data = SnapshotPolicy.create( self.apiclient, self.data_volume[0].id, self.testdata["recurring_snapshot"] ) # ListSnapshotPolicy should return newly created policy list_snapshots_policy = list_snapshot_policy( self.apiclient, id=recurring_snapshot_data.id, volumeid=self.data_volume[0].id ) list_validation = validateList(list_snapshots_policy) self.assertEqual( list_validation[0], PASS, "snapshot list validation failed due to %s" % list_validation[2]) timeout = self.testdata["timeout"] while True: snapshots = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata[ "recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True ) if isinstance(snapshots, list): break elif timeout == 0: raise Exception("List snapshots API call failed.") data_snap_to_delete = snapshots[0] time.sleep( (self.testdata["recurring_snapshot"]["maxsnaps"]) * 3600 ) data_snapshots_1 = list_snapshots( self.apiclient, volumeid=self.volume[0].id, intervaltype=self.testdata["recurring_snapshot"]["intervaltype"], snapshottype='RECURRING', listall=True ) self.assertTrue(data_snap_to_delete not in data_snapshots_1) time.sleep(360) self.assertEqual( self.dbclient.execute( "select status from snapshots where uuid='%s'" % snap_to_delete.id)[0][0], "Destroyed" ) self.assertFalse( is_snapshot_on_nfs( self.apiclient, self.dbclient, self.config, self.zone.id, data_snap_to_delete.id))