mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
Merge release branch 4.8 to master
* 4.8: Removed sleeps and used validateList as requested. Added required_hardware="false" attr above test_02_root_volume_attach_detach Modified test_volumes.py to include a hypervisor test for root attach/detach testing Let hypervisor type KVM and Simulator detach root volumes. Updated test_volumes.py to include a test for detaching and reattaching a root volume from a vm. I also had to update base.py to allow attach_volume to have the parameter deviceid to be passed as needed.
This commit is contained in:
commit
a5ee4432e7
@ -1744,8 +1744,8 @@ public class VolumeApiServiceImpl extends ManagerBase implements VolumeApiServic
|
||||
}
|
||||
|
||||
private void validateRootVolumeDetachAttach(VolumeVO volume, UserVmVO vm) {
|
||||
if (!(vm.getHypervisorType() == HypervisorType.XenServer || vm.getHypervisorType() == HypervisorType.VMware)) {
|
||||
throw new InvalidParameterValueException("Root volume detach is allowed for hypervisor type " + HypervisorType.XenServer + " only");
|
||||
if (!(vm.getHypervisorType() == HypervisorType.XenServer || vm.getHypervisorType() == HypervisorType.VMware || vm.getHypervisorType() == HypervisorType.KVM || vm.getHypervisorType() == HypervisorType.Simulator)) {
|
||||
throw new InvalidParameterValueException("Root volume detach is not supported for hypervisor type " + vm.getHypervisorType() );
|
||||
}
|
||||
if (!(vm.getState() == State.Stopped) || (vm.getState() == State.Destroyed)) {
|
||||
throw new InvalidParameterValueException("Root volume detach can happen only when vm is in states: " + State.Stopped.toString() + " or " + State.Destroyed.toString());
|
||||
|
||||
@ -603,7 +603,140 @@ class TestAttachDetachVolume(cloudstackTestCase):
|
||||
"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.assertEqual(
|
||||
validateList(root_volume_response)[0],
|
||||
PASS,
|
||||
"Invalid response returned for root volume 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)
|
||||
|
||||
vm_response = VirtualMachine.list(
|
||||
self.apiclient,
|
||||
id=self.virtual_machine.id,
|
||||
)
|
||||
|
||||
# Ensure that vm_response is a valid list
|
||||
self.assertEqual(
|
||||
validateList(vm_response)[0],
|
||||
PASS,
|
||||
"Invalid response returned for vm_response list"
|
||||
)
|
||||
|
||||
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
|
||||
)
|
||||
|
||||
# Ensure that new_root_volume_response is a valid list
|
||||
self.assertEqual(
|
||||
validateList(new_root_volume_response)[0],
|
||||
PASS,
|
||||
"Invalid response returned for new_root_volume_response list"
|
||||
)
|
||||
|
||||
# Start VM
|
||||
self.virtual_machine.start(self.apiclient)
|
||||
|
||||
vm_response = VirtualMachine.list(
|
||||
self.apiclient,
|
||||
id=self.virtual_machine.id,
|
||||
)
|
||||
|
||||
# Verify VM response to check whether VM deployment was successful
|
||||
self.assertEqual(
|
||||
validateList(vm_response)[0],
|
||||
PASS,
|
||||
"Invalid response returned for vm_response list during VM start up"
|
||||
)
|
||||
|
||||
vm = vm_response[0]
|
||||
self.assertEqual(
|
||||
vm.state,
|
||||
'Running',
|
||||
"Ensure the state of VM is running"
|
||||
)
|
||||
|
||||
except Exception as e:
|
||||
self.fail("Exception occurred: %s" % e)
|
||||
|
||||
else:
|
||||
self.skipTest("Root Volume attach/detach is not supported on %s " % self.hypervisor)
|
||||
return
|
||||
|
||||
|
||||
|
||||
@ -667,11 +667,15 @@ class VirtualMachine:
|
||||
})
|
||||
apiclient.migrateVirtualMachineWithVolume(cmd)
|
||||
|
||||
def attach_volume(self, apiclient, volume):
|
||||
def attach_volume(self, apiclient, volume, deviceid=None):
|
||||
"""Attach volume to instance"""
|
||||
cmd = attachVolume.attachVolumeCmd()
|
||||
cmd.id = volume.id
|
||||
cmd.virtualmachineid = self.id
|
||||
|
||||
if deviceid is not None:
|
||||
cmd.deviceid = deviceid
|
||||
|
||||
return apiclient.attachVolume(cmd)
|
||||
|
||||
def detach_volume(self, apiclient, volume):
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user