mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
* ScaleIO/PowerFlex smoke tests improvements, and some fixes * Fix test_volumes.py, encrypted volume size check (for powerflex volumes) * Fix test_over_provisioning.py (over provisioning supported for powerflex) * Update vm snapshot tests * Update volume size delta in primary storage resource count for user vm volumes only The VR volumes resource count for PowerFlex volumes is updated here, resulting in resource count discrepancy (which is re-calculated through ResourceCountCheckTask later, and skips the VR volumes) * Fix test_import_unmanage_volumes.py (unsupported for powerflex) * Fix test_sharedfs_lifecycle.py (volume size check for powerflex) * Update powerflex.connect.on.demand config default to true
188 lines
6.8 KiB
Python
188 lines
6.8 KiB
Python
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The ASF licenses this file
|
|
# to you under the Apache License, Version 2.0 (the
|
|
# "License"); you may not use this file except in compliance
|
|
# with the License. You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing,
|
|
# software distributed under the License is distributed on an
|
|
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
|
|
# KIND, either express or implied. See the License for the
|
|
# specific language governing permissions and limitations
|
|
# under the License.
|
|
""" Tests for importVolume and unmanageVolume APIs
|
|
"""
|
|
# Import Local Modules
|
|
from marvin.cloudstackAPI import unmanageVolume, listVolumesForImport, importVolume
|
|
from marvin.cloudstackTestCase import cloudstackTestCase, unittest
|
|
from marvin.codes import FAILED
|
|
from marvin.lib.base import (Account,
|
|
Domain,
|
|
Volume,
|
|
ServiceOffering,
|
|
DiskOffering,
|
|
VirtualMachine)
|
|
from marvin.lib.common import (get_domain,
|
|
get_zone,
|
|
get_suitable_test_template,
|
|
list_volumes,
|
|
list_storage_pools)
|
|
|
|
# Import System modules
|
|
from nose.plugins.attrib import attr
|
|
|
|
_multiprocess_shared_ = True
|
|
|
|
|
|
class TestImportAndUnmanageVolumes(cloudstackTestCase):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
testClient = super(TestImportAndUnmanageVolumes, cls).getClsTestClient()
|
|
cls.apiclient = testClient.getApiClient()
|
|
cls.testdata = cls.testClient.getParsedTestDataConfig()
|
|
|
|
cls.services = testClient.getParsedTestDataConfig()
|
|
cls.hypervisor = testClient.getHypervisorInfo()
|
|
if cls.testClient.getHypervisorInfo().lower() != "kvm":
|
|
raise unittest.SkipTest("This is only available for KVM")
|
|
|
|
cls.domain = get_domain(cls.apiclient)
|
|
cls.zone = get_zone(cls.apiclient)
|
|
cls._cleanup = []
|
|
|
|
cls.service_offering = ServiceOffering.create(
|
|
cls.apiclient,
|
|
cls.services["service_offerings"]["tiny"]
|
|
)
|
|
cls._cleanup.append(cls.service_offering)
|
|
|
|
template = get_suitable_test_template(
|
|
cls.apiclient,
|
|
cls.zone.id,
|
|
cls.services["ostype"],
|
|
cls.hypervisor
|
|
)
|
|
if template == FAILED:
|
|
assert False, "get_test_template() failed to return template"
|
|
|
|
cls.services["virtual_machine"]["zoneid"] = cls.zone.id
|
|
cls.services["mode"] = cls.zone.networktype
|
|
|
|
cls.disk_offering = DiskOffering.create(cls.apiclient,
|
|
cls.services["disk_offering"])
|
|
cls._cleanup.append(cls.disk_offering)
|
|
|
|
cls.test_domain = Domain.create(
|
|
cls.apiclient,
|
|
cls.services["domain"])
|
|
cls._cleanup.append(cls.test_domain)
|
|
|
|
cls.test_account = Account.create(
|
|
cls.apiclient,
|
|
cls.services["account"],
|
|
admin=True,
|
|
domainid=cls.test_domain.id)
|
|
cls._cleanup.append(cls.test_account)
|
|
|
|
# Create VM
|
|
cls.virtual_machine = VirtualMachine.create(
|
|
cls.apiclient,
|
|
cls.services["virtual_machine"],
|
|
templateid=template.id,
|
|
accountid=cls.test_account.name,
|
|
domainid=cls.test_account.domainid,
|
|
serviceofferingid=cls.service_offering.id,
|
|
mode=cls.services["mode"]
|
|
)
|
|
cls._cleanup.append(cls.virtual_machine)
|
|
|
|
cls.virtual_machine.stop(cls.apiclient, forced=True)
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
super(TestImportAndUnmanageVolumes, cls).tearDownClass()
|
|
|
|
@attr(tags=['advanced', 'basic', 'sg'], required_hardware=False)
|
|
def test_01_detach_unmanage_import_volume(self):
|
|
"""Test attach/detach/unmanage/import volume
|
|
"""
|
|
|
|
volumes = list_volumes(
|
|
self.apiclient,
|
|
virtualmachineid=self.virtual_machine.id,
|
|
type='ROOT',
|
|
listall=True
|
|
)
|
|
volume = volumes[0]
|
|
volume_pool_response = list_storage_pools(
|
|
self.apiclient,
|
|
id=volume.storageid
|
|
)
|
|
volume_pool = volume_pool_response[0]
|
|
if volume_pool.type.lower() == "powerflex":
|
|
self.skipTest("This test is not supported for storage pool type %s on hypervisor KVM" % volume_pool.type)
|
|
|
|
# Create DATA volume
|
|
volume = Volume.create(
|
|
self.apiclient,
|
|
self.testdata["volume"],
|
|
zoneid=self.zone.id,
|
|
account=self.test_account.name,
|
|
domainid=self.test_account.domainid,
|
|
diskofferingid=self.disk_offering.id
|
|
)
|
|
|
|
# Attach and Detach volume
|
|
try:
|
|
self.virtual_machine.attach_volume(self.apiclient, volume)
|
|
except Exception as e:
|
|
self.fail("Attach volume failed with Exception: %s" % e)
|
|
|
|
self.virtual_machine.detach_volume(self.apiclient, volume)
|
|
|
|
# List volume by id
|
|
volumes = Volume.list(self.apiclient,
|
|
id = volume.id)
|
|
self.assertTrue(isinstance(volumes, list),
|
|
"listVolumes response should return a valid list"
|
|
)
|
|
self.assertTrue(len(volumes) > 0,
|
|
"listVolumes response should return a non-empty list"
|
|
)
|
|
volume = volumes[0]
|
|
|
|
# Unmanage volume
|
|
cmd = unmanageVolume.unmanageVolumeCmd()
|
|
cmd.id = volume.id
|
|
self.apiclient.unmanageVolume(cmd)
|
|
|
|
# List VMs for import
|
|
cmd = listVolumesForImport.listVolumesForImportCmd()
|
|
cmd.storageid = volume.storageid
|
|
volumesForImport = self.apiclient.listVolumesForImport(cmd)
|
|
self.assertTrue(isinstance(volumesForImport, list),
|
|
"Check listVolumesForImport response returns a valid list"
|
|
)
|
|
|
|
# Import volume
|
|
cmd = importVolume.importVolumeCmd()
|
|
cmd.storageid = volume.storageid
|
|
cmd.path = volume.path
|
|
self.apiclient.importVolume(cmd)
|
|
|
|
# List volume by name
|
|
volumes = Volume.list(self.apiclient,
|
|
storageid = volume.storageid,
|
|
name=volume.path)
|
|
self.assertTrue(isinstance(volumes, list),
|
|
"listVolumes response should return a valid list"
|
|
)
|
|
self.assertTrue(len(volumes) > 0,
|
|
"listVolumes response should return a non-empty list"
|
|
)
|