[ https://issues.apache.org/jira/browse/CLOUDSTACK-9349?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15251929#comment-15251929 ]
ASF GitHub Bot commented on CLOUDSTACK-9349: -------------------------------------------- Github user dmabry commented on a diff in the pull request: https://github.com/apache/cloudstack/pull/1500#discussion_r60584441 --- Diff: test/integration/component/test_volumes.py --- @@ -603,7 +603,144 @@ def test_01_volume_attach_detach(self): "Check the state of VM" ) except Exception as e: - self.fail("Exception occuered: %s" % e) + self.fail("Exception occurred: %s" % e) + return + + @attr(tags=["advanced", "advancedns"], required_hardware="false") + def test_02_root_volume_attach_detach(self): + """Test Root Volume attach/detach to VM + """ + + # Validate the following + # 1. Deploy a VM + # 2. Verify that we are testing a supported hypervisor + # 3. Check for root volume + # 4. Stop VM + # 5. Detach root volume + # 6. Verify root volume detached + # 7. Attach root volume + # 8. Start VM + + # Verify we are using a supported hypervisor + if (self.hypervisor.lower() == 'vmware' + or self.hypervisor.lower() == 'kvm' + or self.hypervisor.lower() == 'simulator' + or self.hypervisor.lower() == 'xenserver'): + + try: + # Check for root volume + root_volume_response = Volume.list( + self.apiclient, + virtualmachineid=self.virtual_machine.id, + type='ROOT', + listall=True + ) + self.assertNotEqual( + root_volume_response, + None, + "Check if root volume exists in ListVolumes" + ) + self.assertEqual( + isinstance(root_volume_response, list), + True, + "Check list volumes response for valid list" + ) + # Grab the root volume for later use + root_volume = root_volume_response[0] + + # Stop VM + self.debug("Stopping the VM: %s" % self.virtual_machine.id) + self.virtual_machine.stop(self.apiclient) + + # Ensure VM is stopped before detaching the root volume + time.sleep(self.services["sleep"]) + + vm_response = VirtualMachine.list( + self.apiclient, + id=self.virtual_machine.id, + ) + vm = vm_response[0] + self.assertEqual( + vm.state, + 'Stopped', + "Check the state of VM" + ) + + # Detach root volume from VM + self.virtual_machine.detach_volume( + self.apiclient, + root_volume + ) + + # Verify that root disk is gone + no_root_volume_response = Volume.list( + self.apiclient, + virtualmachineid=self.virtual_machine.id, + type='ROOT', + listall=True + ) + self.assertEqual( + no_root_volume_response, + None, + "Check if root volume exists in ListVolumes" + ) + + # Attach root volume to VM + self.virtual_machine.attach_volume( + self.apiclient, + root_volume, + 0 + ) + + # Check for root volume + new_root_volume_response = Volume.list( + self.apiclient, + virtualmachineid=self.virtual_machine.id, + type='ROOT', + listall=True + ) + self.assertNotEqual( + new_root_volume_response, + None, + "Check if root volume exists in ListVolumes" + ) + self.assertEqual( + isinstance(new_root_volume_response, list), + True, + "Check list volumes response for valid list" + ) + + # Start VM + self.virtual_machine.start(self.apiclient) + # Sleep to ensure that VM is in ready state + time.sleep(self.services["sleep"]) --- End diff -- Understood. Please see my earlier comment. I was merely following an established pattern that I observed earlier in the code. Please look at the following code taken start at line 547 in test_volumes.py. Does it need to be addressed as well? ` # Reboot VM self.debug("Rebooting the VM: %s" % self.virtual_machine.id) self.virtual_machine.reboot(self.apiclient) # Sleep to ensure that VM is in ready state time.sleep(self.services["sleep"]) vm_response = VirtualMachine.list( self.apiclient, id=self.virtual_machine.id, ) # Verify VM response to check whether VM deployment was successful self.assertEqual( isinstance(vm_response, list), True, "Check list VM response for valid list" ) 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" ) # Stop VM self.virtual_machine.stop(self.apiclient) # Start VM self.virtual_machine.start(self.apiclient) # Sleep to ensure that VM is in ready state time.sleep(self.services["sleep"]) ` > Unable to detach root volume when using Hypervisor Type KVM > ----------------------------------------------------------- > > Key: CLOUDSTACK-9349 > URL: https://issues.apache.org/jira/browse/CLOUDSTACK-9349 > Project: CloudStack > Issue Type: Bug > Security Level: Public(Anyone can view this level - this is the > default.) > Components: Volumes > Affects Versions: 4.5.1, 4.6.2, 4.7.1, 4.8.0, 4.9.0 > Environment: Centos 7 > Reporter: Simon Weller > Priority: Minor > Fix For: 4.7.2 > > > Back in 4.5, support was added in CLOUDSTACK-6284 for detaching root volumes. > The original support was meant to work with Xen, VMware and KVM. > After chatting with fuflo in the Cloudstack irc channel, it was pointed out > that a constraint was not correctly modified in VolumeApiServiceImpl.java to > allow the detach to occur when vm.getHypervisorType() == HypervisorType.KVM. > This is a very useful feature, as it allows us to simulate a snapshot revert > with Ceph by using createVolume sourced from a snapshot, then detaching and > reattaching the root volume (new root volume needs to be attached as > device=0). > I'm going to propose a PR for this shortly -- This message was sent by Atlassian JIRA (v6.3.4#6332)