mirror of
				https://github.com/apache/cloudstack.git
				synced 2025-10-26 08:42:29 +01:00 
			
		
		
		
	* Use dualzones for ci github actions * Update advdualzone.cfg to be similar to advanced.cfg & fixup test_metrics_api.py * Fixup e2e tests for running with multiple zones * Add e2e tests for listing of accounts, disk_offerings, domains, hosts, service_offerings, storage_pools, volumes * Fixup * another fixup * Add test for listing volumes with tags filter * Add check for existing volumes in test_list_volumes * Wait for volumes to be deleted on cleanup * Filter out volumes in Destroy state before checking the count of volumes
		
			
				
	
	
		
			560 lines
		
	
	
		
			20 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			560 lines
		
	
	
		
			20 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 API listing of service offerings 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,
 | |
|                              DiskOffering,
 | |
|                              VirtualMachine)
 | |
| from marvin.lib.common import (get_domain, list_accounts,
 | |
|                                list_zones, list_clusters, list_hosts)
 | |
| # Import System modules
 | |
| from nose.plugins.attrib import attr
 | |
| 
 | |
| _multiprocess_shared_ = True
 | |
| 
 | |
| 
 | |
| class TestListServiceOfferings(cloudstackTestCase):
 | |
| 
 | |
|     @classmethod
 | |
|     def setUpClass(cls):
 | |
|         testClient = super(TestListServiceOfferings, 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_offerings = ServiceOffering.list(cls.apiclient)
 | |
|         cls.system_service_offerings = ServiceOffering.list(cls.apiclient, issystem=True)
 | |
| 
 | |
|         cls.child_domain_1 = Domain.create(
 | |
|             cls.apiclient,
 | |
|             cls.services["domain"],
 | |
|             parentdomainid=cls.domain.id
 | |
|         )
 | |
|         cls._cleanup.append(cls.child_domain_1)
 | |
| 
 | |
|         cls.account_1 = Account.create(
 | |
|             cls.apiclient,
 | |
|             cls.services["account"],
 | |
|             admin=True,
 | |
|             domainid=cls.domain.id
 | |
|         )
 | |
|         cls._cleanup.append(cls.account_1)
 | |
| 
 | |
|         cls.domainadmin_api_client = testClient.getUserApiClient(
 | |
|             UserName=cls.account_1.user[0].username,
 | |
|             DomainName=cls.domain.name,
 | |
|             type=2
 | |
|         )
 | |
| 
 | |
|         cls.system_offering = ServiceOffering.create(
 | |
|             cls.apiclient,
 | |
|             cls.services["service_offerings"]["tiny"],
 | |
|             issystem=True,
 | |
|             name="custom_system_offering",
 | |
|             systemvmtype="domainrouter"
 | |
|         )
 | |
|         cls._cleanup.append(cls.system_offering)
 | |
| 
 | |
|         cls.service_offering_1 = ServiceOffering.create(
 | |
|             cls.apiclient,
 | |
|             cls.services["service_offerings"]["small"],
 | |
|             cpunumber=2,
 | |
|             cpuspeed=2000,
 | |
|             domainid=cls.child_domain_1.id,
 | |
|             encryptroot=True,
 | |
|             name="custom_offering_1",
 | |
|             zoneid=cls.zone.id
 | |
|         )
 | |
|         cls._cleanup.append(cls.service_offering_1)
 | |
| 
 | |
| 
 | |
|     @classmethod
 | |
|     def tearDownClass(cls):
 | |
|         super(TestListServiceOfferings, cls).tearDownClass()
 | |
| 
 | |
|     @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false")
 | |
|     def test_01_list_service_offerings_cpunumber_filter(self):
 | |
|         """Test list service offerings with cpunumber filter
 | |
|         """
 | |
|         # List all service offerings with cpunumber 1
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             cpunumber=1
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             len(service_offerings) - len(self.service_offerings),
 | |
|             1,
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
|         for service_offering in service_offerings:
 | |
|             self.assertGreaterEqual(
 | |
|                 service_offering.cpunumber,
 | |
|                 1,
 | |
|                 "List ServiceOfferings response has incorrect cpunumber"
 | |
|             )
 | |
| 
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             cpunumber=99999
 | |
|         )
 | |
|         self.assertIsNone(service_offerings, "List ServiceOfferings response is not None")
 | |
| 
 | |
|     @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false")
 | |
|     def test_02_list_service_offerings_cpuspeed_filter(self):
 | |
|         """Test list service offerings with cpuspeed filter
 | |
|         """
 | |
|         # List all service offerings with cpuspeed 1000
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             cpuspeed=1000
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertGreaterEqual(
 | |
|             len(service_offerings),
 | |
|             1,
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
|         for service_offering in service_offerings:
 | |
|             self.assertGreaterEqual(
 | |
|                 service_offering.cpuspeed,
 | |
|                 1000,
 | |
|                 "List ServiceOfferings response has incorrect cpuspeed"
 | |
|             )
 | |
| 
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             cpuspeed=99999
 | |
|         )
 | |
|         self.assertIsNone(service_offerings, "List ServiceOfferings response is not None")
 | |
| 
 | |
|     @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false")
 | |
|     def test_03_list_service_offerings_memory_filter(self):
 | |
|         """Test list service offerings with memory filter
 | |
|         """
 | |
|         # List all service offerings with memory 256
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             memory=256
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertGreaterEqual(
 | |
|             len(service_offerings),
 | |
|             1,
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
|         for service_offering in service_offerings:
 | |
|             self.assertGreaterEqual(
 | |
|                 service_offering.memory,
 | |
|                 256,
 | |
|                 "List ServiceOfferings response has incorrect memory"
 | |
|             )
 | |
| 
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             memory=99999
 | |
|         )
 | |
|         self.assertIsNone(service_offerings, "List ServiceOfferings response is not None")
 | |
| 
 | |
|     @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false")
 | |
|     def test_04_list_service_offerings_domainid_filter(self):
 | |
|         """Test list service offerings with domainid filter
 | |
|         """
 | |
|         # List all service offerings with domainid
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             domainid=self.domain.id
 | |
|         )
 | |
|         self.assertIsNone(
 | |
|             service_offerings,
 | |
|             "List ServiceOfferings response is not None"
 | |
|         )
 | |
| 
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             domainid=self.child_domain_1.id
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             len(service_offerings),
 | |
|             1,
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
|         for service_offering in service_offerings:
 | |
|             self.assertEqual(
 | |
|                 service_offering.domainid,
 | |
|                 self.child_domain_1.id,
 | |
|                 "List ServiceOfferings response has incorrect domainid"
 | |
|             )
 | |
| 
 | |
|     @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false")
 | |
|     def test_05_list_service_offerings_encryptroot_filter(self):
 | |
|         """Test list service offerings with encryptroot filter
 | |
|         """
 | |
|         # List all service offerings with encryptroot True
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             encryptroot=True
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertGreaterEqual(
 | |
|             len(service_offerings),
 | |
|             1,
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
|         for service_offering in service_offerings:
 | |
|             self.assertTrue(
 | |
|                 service_offering.encryptroot,
 | |
|                 "List ServiceOfferings response has incorrect encryptroot"
 | |
|             )
 | |
| 
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             encryptroot=False
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertGreaterEqual(
 | |
|             len(service_offerings),
 | |
|             1,
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
|         for service_offering in service_offerings:
 | |
|             self.assertFalse(
 | |
|                 service_offering.encryptroot,
 | |
|                 "List ServiceOfferings response has incorrect encryptroot"
 | |
|             )
 | |
| 
 | |
|     @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false")
 | |
|     def test_06_list_service_offerings_id_filter(self):
 | |
|         """Test list service offerings with id filter
 | |
|         """
 | |
|         # List all service offerings with id
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             id=self.system_offering.id
 | |
|         )
 | |
|         self.assertIsNone(
 | |
|             service_offerings,
 | |
|             "List ServiceOfferings response is not None"
 | |
|         )
 | |
| 
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             id=self.service_offering_1.id
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             len(service_offerings),
 | |
|             1,
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             service_offerings[0].id,
 | |
|             self.service_offering_1.id,
 | |
|             "List ServiceOfferings response has incorrect id"
 | |
|         )
 | |
| 
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             id=-1
 | |
|         )
 | |
|         self.assertIsNone(service_offerings, "List ServiceOfferings response is not None")
 | |
| 
 | |
|     @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false")
 | |
|     def test_07_list_service_offerings_isrecursive_filter(self):
 | |
|         """Test list service offerings with isrecursive filter
 | |
|         """
 | |
|         # List all service offerings with listall True
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.domainadmin_api_client,
 | |
|             isrecursive=True
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             len(service_offerings),
 | |
|             len(self.service_offerings) + 1,
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
| 
 | |
|         # List all service offerings with isrecursive False
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.domainadmin_api_client,
 | |
|             isrecursive=False
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertGreaterEqual(
 | |
|             len(service_offerings),
 | |
|             len(self.service_offerings),
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
| 
 | |
|     @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false")
 | |
|     def test_08_list_service_offerings_issystem_filter(self):
 | |
|         """Test list service offerings with issystem filter
 | |
|         """
 | |
|         # List all service offerings with issystem True
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             issystem=True
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             len(service_offerings),
 | |
|             len(self.system_service_offerings) + 1,
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
|         for service_offering in service_offerings:
 | |
|             self.assertTrue(
 | |
|                 service_offering.issystem,
 | |
|                 "List ServiceOfferings response has incorrect issystem"
 | |
|             )
 | |
| 
 | |
|         # List all service offerings with issystem False
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             issystem=False
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             len(service_offerings),
 | |
|             len(self.service_offerings) + 1,
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
|         for service_offering in service_offerings:
 | |
|             self.assertFalse(
 | |
|                 service_offering.issystem,
 | |
|                 "List ServiceOfferings response has incorrect issystem"
 | |
|             )
 | |
| 
 | |
|     @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false")
 | |
|     def test_09_list_service_offerings_keyword_filter(self):
 | |
|         """Test list service offerings with keyword filter
 | |
|         """
 | |
|         # List all service offerings with keyword
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             keyword=self.system_offering.name
 | |
|         )
 | |
|         self.assertIsNone(
 | |
|             service_offerings,
 | |
|             "List ServiceOfferings response is not None"
 | |
|         )
 | |
| 
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             keyword=self.service_offering_1.name
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             len(service_offerings),
 | |
|             1,
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             service_offerings[0].name,
 | |
|             self.service_offering_1.name,
 | |
|             "List ServiceOfferings response has incorrect name"
 | |
|         )
 | |
| 
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             keyword="invalid"
 | |
|         )
 | |
|         self.assertIsNone(service_offerings, "List ServiceOfferings response is not None")
 | |
| 
 | |
|     @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false")
 | |
|     def test_10_list_service_offerings_name_filter(self):
 | |
|         """Test list service offerings with name filter
 | |
|         """
 | |
|         # List all service offerings with name
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             name=self.system_offering.name
 | |
|         )
 | |
|         self.assertIsNone(
 | |
|             service_offerings,
 | |
|             "List ServiceOfferings response is not None"
 | |
|         )
 | |
| 
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             name=self.system_offering.name,
 | |
|             issystem=True
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             len(service_offerings),
 | |
|             1,
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             service_offerings[0].name,
 | |
|             self.system_offering.name,
 | |
|             "List ServiceOfferings response has incorrect name"
 | |
|         )
 | |
| 
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             name=self.service_offering_1.name
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             len(service_offerings),
 | |
|             1,
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             service_offerings[0].name,
 | |
|             self.service_offering_1.name,
 | |
|             "List ServiceOfferings response has incorrect name"
 | |
|         )
 | |
| 
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             name="invalid"
 | |
|         )
 | |
|         self.assertIsNone(service_offerings, "List ServiceOfferings response is not None")
 | |
| 
 | |
|     @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false")
 | |
|     def test_11_list_service_offerings_systemvmtype_filter(self):
 | |
|         """Test list service offerings with systemvmtype filter
 | |
|         """
 | |
|         # List all service offerings with systemvmtype domainrouter
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             systemvmtype="domainrouter"
 | |
|         )
 | |
|         self.assertIsNone(
 | |
|             service_offerings,
 | |
|             "List ServiceOfferings response is not None"
 | |
|         )
 | |
| 
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             systemvmtype="domainrouter",
 | |
|             issystem=True
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertGreaterEqual(
 | |
|             len(service_offerings),
 | |
|             1,
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
|         for service_offering in service_offerings:
 | |
|             self.assertEqual(
 | |
|                 service_offering.systemvmtype,
 | |
|                 "domainrouter",
 | |
|                 "List ServiceOfferings response has incorrect systemvmtype"
 | |
|             )
 | |
| 
 | |
|     @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="false")
 | |
|     def test_12_list_service_offerings_zoneid_filter(self):
 | |
|         """Test list service offerings with zoneid filter
 | |
|         """
 | |
|         service_offerings = ServiceOffering.list(
 | |
|             self.apiclient,
 | |
|             zoneid=self.zone.id
 | |
|         )
 | |
|         self.assertTrue(
 | |
|             isinstance(service_offerings, list),
 | |
|             "List ServiceOfferings response is not a valid list"
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             len(service_offerings),
 | |
|             len(self.service_offerings) + 1,
 | |
|             "List ServiceOfferings response is empty"
 | |
|         )
 | |
|         for service_offering in service_offerings:
 | |
|             self.assertTrue(
 | |
|                 service_offering.zoneid is None or service_offering.zoneid == self.zone.id,
 | |
|                 "List ServiceOfferings response has incorrect zoneid"
 | |
|             )
 | |
| 
 | |
|         if len(self.zones) > 1:
 | |
|             service_offerings = ServiceOffering.list(
 | |
|                 self.apiclient,
 | |
|                 zoneid=self.zones[1].id
 | |
|             )
 | |
|             if service_offerings is not None:
 | |
|                 self.assertTrue(
 | |
|                     isinstance(service_offerings, list),
 | |
|                     "List ServiceOfferings response is not a valid list"
 | |
|                 )
 | |
|                 self.assertEqual(
 | |
|                     len(service_offerings),
 | |
|                     len(self.service_offerings),
 | |
|                     "List ServiceOfferings response is empty"
 | |
|                 )
 |