# 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 API listing of volumes with different filters """ # Import Local Modules from marvin.cloudstackTestCase import cloudstackTestCase from marvin.codes import FAILED from marvin.lib.base import (Account, Domain, Volume, ServiceOffering, Tag, DiskOffering, VirtualMachine) from marvin.lib.common import (get_domain, list_accounts, list_zones, list_clusters, list_hosts, get_suitable_test_template) # Import System modules from nose.plugins.attrib import attr _multiprocess_shared_ = True class TestListVolumes(cloudstackTestCase): @classmethod def setUpClass(cls): testClient = super(TestListVolumes, cls).getClsTestClient() cls.apiclient = testClient.getApiClient() cls.services = testClient.getParsedTestDataConfig() cls.hypervisor = testClient.getHypervisorInfo() cls.domain = get_domain(cls.apiclient) cls.zones = list_zones(cls.apiclient) cls.zone = cls.zones[0] cls.clusters = list_clusters(cls.apiclient) cls.cluster = cls.clusters[0] cls.hosts = list_hosts(cls.apiclient) cls.account = list_accounts(cls.apiclient, name="admin")[0] 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["template"]["ostypeid"] = template.ostypeid cls.services["template_2"]["ostypeid"] = template.ostypeid cls.services["ostypeid"] = template.ostypeid 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) # Create VM cls.virtual_machine = VirtualMachine.create( cls.apiclient, cls.services["virtual_machine"], templateid=template.id, accountid=cls.account.name, domainid=cls.account.domainid, clusterid=cls.cluster.id, serviceofferingid=cls.service_offering.id, mode=cls.services["mode"] ) cls.child_domain = Domain.create( cls.apiclient, cls.services["domain"]) cls._cleanup.append(cls.child_domain) cls.child_account = Account.create( cls.apiclient, cls.services["account"], admin=True, domainid=cls.child_domain.id) cls._cleanup.append(cls.child_account) cls.vol_1 = Volume.create(cls.apiclient, cls.services["volume"], zoneid=cls.zone.id, account=cls.account.name, domainid=cls.account.domainid, diskofferingid=cls.disk_offering.id) cls._cleanup.append(cls.vol_1) cls.vol_1 = cls.virtual_machine.attach_volume( cls.apiclient, cls.vol_1 ) cls._cleanup.append(cls.virtual_machine) Tag.create(cls.apiclient, cls.vol_1.id, "Volume", {"abc": "xyz"}) cls.vol_2 = Volume.create(cls.apiclient, cls.services["volume"], zoneid=cls.zone.id, account=cls.account.name, domainid=cls.account.domainid, diskofferingid=cls.disk_offering.id) cls._cleanup.append(cls.vol_2) cls.vol_3 = Volume.create(cls.apiclient, cls.services["volume"], zoneid=cls.zone.id, account=cls.child_account.name, domainid=cls.child_account.domainid, diskofferingid=cls.disk_offering.id) cls._cleanup.append(cls.vol_3) @classmethod def tearDownClass(cls): super(TestListVolumes, cls).tearDownClass() @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_01_list_volumes_account_domain_filter(self): """Test listing Volumes with account & domain filter """ list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len(list_volume_response), 3, "ListVolumes response expected 3 Volumes, received %s" % len(list_volume_response) ) list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, account=self.child_account.name, domainid=self.child_account.domainid ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len(list_volume_response), 1, "ListVolumes response expected 1 Volume, received %s" % len(list_volume_response) ) @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_02_list_volumes_diskofferingid_filter(self): """Test listing Volumes with diskofferingid filter """ list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid, diskofferingid=self.disk_offering.id ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len(list_volume_response), 2, "ListVolumes response expected 2 Volumes, received %s" % len(list_volume_response) ) @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_03_list_volumes_id_filter(self): """Test listing Volumes with id filter """ list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, id=self.vol_1.id ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len(list_volume_response), 1, "ListVolumes response expected 1 Volume, received %s" % len(list_volume_response) ) self.assertEqual( list_volume_response[0].id, self.vol_1.id, "ListVolumes response expected Volume with id %s, received %s" % (self.vol_1.id, list_volume_response[0].id) ) @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_04_list_volumes_ids_filter(self): """Test listing Volumes with ids filter """ list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, ids=[self.vol_1.id, self.vol_2.id, self.vol_3.id] ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len(list_volume_response), 2, "ListVolumes response expected 2 Volumes, received %s" % len(list_volume_response) ) self.assertIn(list_volume_response[0].id, [self.vol_1.id, self.vol_2.id], "ListVolumes response Volume 1 not in list") self.assertIn(list_volume_response[1].id, [self.vol_1.id, self.vol_2.id], "ListVolumes response Volume 2 not in list") @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_05_list_volumes_isrecursive(self): """Test listing Volumes with isrecursive filter """ list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, isrecursive=True, domainid=self.account.domainid ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len([v for v in list_volume_response if v.state != "Destroy"]), 4, "ListVolumes response expected 4 Volumes, received %s" % len(list_volume_response) ) list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, isrecursive=False, domainid=self.account.domainid ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len([v for v in list_volume_response if v.state != "Destroy"]), 3, "ListVolumes response expected 3 Volumes, received %s" % len(list_volume_response) ) @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_06_list_volumes_keyword_filter(self): """Test listing Volumes with keyword filter """ list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, keyword=self.services["volume"]["diskname"] ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len(list_volume_response), 2, "ListVolumes response expected 2 Volumes, received %s" % len(list_volume_response) ) self.assertIn( list_volume_response[0].id, [self.vol_1.id, self.vol_2.id], "ListVolumes response Volume 1 not in list") self.assertIn(list_volume_response[1].id, [self.vol_1.id, self.vol_2.id], "ListVolumes response Volume 2 not in list") @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_07_list_volumes_listall(self): """Test listing Volumes with listall filter """ list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, listall=True ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len([v for v in list_volume_response if v.state != "Destroy"]), 4, "ListVolumes response expected 4 Volumes, received %s" % len(list_volume_response) ) list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, listall=False ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len([v for v in list_volume_response if v.state != "Destroy"]), 3, "ListVolumes response expected 3 Volumes, received %s" % len(list_volume_response) ) @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_08_listsystemvms(self): list_volumes_response = Volume.list( self.apiclient, zoneid=self.zone.id, listsystemvms=True ) self.assertEqual( isinstance(list_volumes_response, list), True, "List Volume response is not a valid list" ) self.assertGreater( len(list_volumes_response), 3, "ListVolumes response expected more than 3 Volumes, received %s" % len(list_volumes_response) ) @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_09_list_volumes_name_filter(self): """Test listing Volumes with name filter """ list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, name=self.vol_1.name ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len(list_volume_response), 1, "ListVolumes response expected 1 Volumes, received %s" % len(list_volume_response) ) self.assertEqual( list_volume_response[0].id, self.vol_1.id, "ListVolumes response expected Volume with id %s, received %s" % (self.vol_1.id, list_volume_response[0].id) ) self.assertEqual( list_volume_response[0].name, self.vol_1.name, "ListVolumes response expected Volume with name %s, received %s" % ( self.vol_1.name, list_volume_response[0].name) ) @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_10_list_volumes_podid_filter(self): """Test listing Volumes with podid filter """ list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, podid=self.vol_1.podid ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertGreater( len(list_volume_response), 1, "ListVolumes response expected more than 1 Volume, received %s" % len(list_volume_response) ) self.assertIn(self.vol_1.id, [volume.id for volume in list_volume_response], "ListVolumes response expected Volume with id %s" % self.vol_1.id) @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_11_list_volumes_state_filter(self): """Test listing Volumes with state filter """ list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, state="Ready" ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len(list_volume_response), 2, "ListVolumes response expected 2 Volumes, received %s" % len(list_volume_response) ) self.assertIn(self.vol_1.id, [volume.id for volume in list_volume_response], "ListVolumes response expected Volume with id %s" % self.vol_1.id) list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, state="Allocated" ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len(list_volume_response), 1, "ListVolumes response expected 1 Volumes, received %s" % len(list_volume_response) ) self.assertEqual(self.vol_2.id, list_volume_response[0].id, "ListVolumes response expected Volume with id %s" % self.vol_3.id) @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_12_list_volumes_storageid_filter(self): """Test listing Volumes with storageid filter """ list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, storageid=self.vol_1.storageid ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertGreaterEqual( len(list_volume_response), 1, "ListVolumes response expected 1 or more Volumes, received %s" % len(list_volume_response) ) self.assertIn(self.vol_1.id, [volume.id for volume in list_volume_response], "ListVolumes response expected Volume with id %s" % self.vol_1.id) @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_13_list_volumes_type_filter(self): """Test listing Volumes with type filter """ list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, type="DATADISK" ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len(list_volume_response), 2, "ListVolumes response expected 2 Volumes, received %s" % len(list_volume_response) ) self.assertIn(self.vol_1.id, [volume.id for volume in list_volume_response], "ListVolumes response expected Volume with id %s" % self.vol_1.id) list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, type="ROOT" ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len(list_volume_response), 1, "ListVolumes response expected 1 Volumes, received %s" % len(list_volume_response) ) self.assertNotIn(list_volume_response[0].id, [self.vol_1.id, self.vol_2.id], "ListVolumes response expected ROOT Volume") @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_14_list_volumes_virtualmachineid_filter(self): """Test listing Volumes with virtualmachineid filter """ list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id, virtualmachineid=self.vol_1.virtualmachineid ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len(list_volume_response), 2, "ListVolumes response expected 2 Volumes, received %s" % len(list_volume_response) ) self.assertIn(self.vol_1.id, [volume.id for volume in list_volume_response], "ListVolumes response expected Volume with id %s" % self.vol_1.id) @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_15_list_volumes_zoneid_filter(self): """Test listing Volumes with zoneid filter """ list_volume_response = Volume.list( self.apiclient, zoneid=self.zones[0].id ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len(list_volume_response), 3, "ListVolumes response expected 3 Volumes, received %s" % len(list_volume_response) ) if len(self.zones) > 1: list_volume_response = Volume.list( self.apiclient, zoneid=self.zones[1].id ) self.assertIsNone(list_volume_response, "List Volume response is not None") @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_16_list_volumes_tags_filter(self): """Test listing Volumes with tags filter """ list_volume_response = Volume.list( self.apiclient, tags=[{"key": "abc", "value": "xyz"}] ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertEqual( len(list_volume_response), 1, "ListVolumes response expected 1 or more Volumes, received %s" % len(list_volume_response) ) self.assertEqual( list_volume_response[0].id, self.vol_1.id, "ListVolumes response expected Volume with id %s, received %s" % (self.vol_1.id, list_volume_response[0].id) ) self.assertEqual( list_volume_response[0].tags[0]["key"], "abc", "ListVolumes response expected Volume with tag key abc, received %s" % list_volume_response[0].tags[0]["key"] ) self.assertEqual( list_volume_response[0].tags[0]["value"], "xyz", "ListVolumes response expected Volume with tag value xyz, received %s" % list_volume_response[0].tags[0]["value"] ) list_volume_response = Volume.list( self.apiclient, tags=[{"key": "abc", "value": "xyz1"}] ) self.assertIsNone(list_volume_response, "List Volume response is not None") with self.assertRaises(Exception): list_volume_response = Volume.list( self.apiclient, tags=[{"key": None, "value": None}] ) @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false") def test_17_list_volumes_no_filter(self): """Test listing Volumes with no filter """ list_volume_response = Volume.list( self.apiclient, zoneid=self.zone.id ) self.assertTrue( isinstance(list_volume_response, list), "List Volume response is not a valid list" ) self.assertGreaterEqual( len(list_volume_response), 3, "ListVolumes response expected 3 or more Volumes, received %s" % len(list_volume_response) ) self.assertIn(self.vol_1.id, [volume.id for volume in list_volume_response], "ListVolumes response expected Volume with id %s" % self.vol_1.id)