小例子分析tempest处理流程

继续搞定昨晚tempest的问题,依旧是那个用例

1:关于flavor创建的用例

vim tempest/tempest/api/compute/admin/test_flavors.py
88     @test.attr(type='gate')
89     def test_create_flavor_with_int_id(self):
90         flavor_id = data_utils.rand_int_id(start=10000)
91         new_flavor_id = self._create_flavor(flavor_id)
92         self.assertEqual(new_flavor_id, str(flavor_id))

2:这个用例实际上就为了测试_create_flavor里面的create_flavor

 56     def _create_flavor(self, flavor_id):
 57         # Create a flavor and ensure it is listed
 58         # This operation requires the user to have 'admin' role
 59         flavor_name = data_utils.rand_name(self.flavor_name_prefix)
 60
 61         # Create the flavor
 62         resp, flavor = self.client.create_flavor(flavor_name,
 63                                                  self.ram, self.vcpus,
 64                                                  self.disk,
 65                                                  flavor_id,
 66                                                  ephemeral=self.ephemeral,
 67                                                  swap=self.swap,
 68                                                  rxtx=self.rxtx)
 69         self.addCleanup(self.flavor_clean_up, flavor['id'])
 70         self.assertEqual(200, resp.status)
 71         self.assertEqual(flavor['name'], flavor_name)
 72         self.assertEqual(flavor['vcpus'], self.vcpus)
 73         self.assertEqual(flavor['disk'], self.disk)
 74         self.assertEqual(flavor['ram'], self.ram)
 75         self.assertEqual(flavor['swap'], self.swap)
 76         self.assertEqual(flavor['rxtx_factor'], self.rxtx)
 77         self.assertEqual(flavor['OS-FLV-EXT-DATA:ephemeral'],
 78                          self.ephemeral)
 79         self.assertEqual(flavor['os-flavor-access:is_public'], True)
 80
 81         # Verify flavor is retrieved
 82         resp, flavor = self.client.get_flavor_details(flavor['id'])
 83         self.assertEqual(resp.status, 200)
 84         self.assertEqual(flavor['name'], flavor_name)
 85
 86         return flavor['id']

3:昨晚随意找了找,没找到中间还有这行,self.client也是其它地方传进来的

 26 class FlavorsAdminTestJSON(base.BaseV2ComputeAdminTest):
 27
 28     """
 29     Tests Flavors API Create and Delete that require admin privileges
 30     """
 31
 32     _interface = 'json'
 33
 34     @classmethod
 35     def setUpClass(cls):
 36         super(FlavorsAdminTestJSON, cls).setUpClass()
 37         if not test.is_extension_enabled('FlavorExtraData', 'compute'):
 38             msg = "FlavorExtraData extension not enabled."
 39             raise cls.skipException(msg)
 40
 41         cls.client = cls.os_adm.flavors_client

4:os_adm显然是继承的某个基类的成员,create_flavor就需要从cls.os_adm.flavors_client中找,先看看第一个基类

vim tempest/tempest/api/compute/base.py
236 class BaseV2ComputeAdminTest(BaseV2ComputeTest):
237     """Base test case class for Compute Admin V2 API tests."""
238
239     @classmethod
240     def setUpClass(cls):
241         super(BaseV2ComputeAdminTest, cls).setUpClass()
242         admin_username = cls.config.compute_admin.username
243         admin_password = cls.config.compute_admin.password
244         admin_tenant = cls.config.compute_admin.tenant_name
245         if not (admin_username and admin_password and admin_tenant):
246             msg = ("Missing Compute Admin API credentials "
247                    "in configuration.")
248             raise cls.skipException(msg)
249         if (cls.config.compute.allow_tenant_isolation or
250             cls.force_tenant_isolation is True):
251             creds = cls.isolated_creds.get_admin_creds()
252             admin_username, admin_tenant_name, admin_password = creds
253             cls.os_adm = clients.Manager(username=admin_username,
254                                          password=admin_password,
255                                          tenant_name=admin_tenant_name,
256                                          interface=cls._interface)
257         else:
258             cls.os_adm = clients.ComputeAdminManager(interface=cls._interface)

5:os_adm来自clients.Manager

vim tempest/tempest/clients.py
196 class Manager(object):
197
198     """
199     Top level manager for OpenStack Compute clients
200     """

6:最终想要create_flavor就需要得到clients.Manager.flavors_client,在Manager里找到self.flavors_client,这里就看json输出格式

305         elif interface == 'json':
306             self.certificates_client = CertificatesClientJSON(*client_args)
307             self.certificates_v3_client = CertificatesV3ClientJSON(
308                 *client_args)
309             self.baremetal_client = BaremetalClientJSON(*client_args)
310             self.servers_client = ServersClientJSON(*client_args)
311             self.servers_v3_client = ServersV3ClientJSON(*client_args)
312             self.limits_client = LimitsClientJSON(*client_args)
313             self.images_client = ImagesClientJSON(*client_args)
314             self.keypairs_v3_client = KeyPairsV3ClientJSON(*client_args)
315             self.keypairs_client = KeyPairsClientJSON(*client_args)
316             self.keypairs_v3_client = KeyPairsV3ClientJSON(*client_args)
317             self.quotas_client = QuotasClientJSON(*client_args)
318             self.quotas_v3_client = QuotasV3ClientJSON(*client_args)
319             self.flavors_client = FlavorsClientJSON(*client_args)

7:self.flavors_client来自FlavorsClientJSON,从import中可以看到

 33 from tempest.services.compute.json.flavors_client import FlavorsClientJSON

8:拐了这么多弯,终于确信tempest.services.compute.json.flavors_client就是要找的地方

vim tempest/tempest/services/compute/json/flavors_client.py
 54     def create_flavor(self, name, ram, vcpus, disk, flavor_id, **kwargs):
 55         """Creates a new flavor or instance type."""
 56         post_body = {
 57             'name': name,
 58             'ram': ram,
 59             'vcpus': vcpus,
 60             'disk': disk,
 61             'id': flavor_id,
 62         }
 63         if kwargs.get('ephemeral'):
 64             post_body['OS-FLV-EXT-DATA:ephemeral'] = kwargs.get('ephemeral')
 65         if kwargs.get('swap'):
 66             post_body['swap'] = kwargs.get('swap')
 67         if kwargs.get('rxtx'):
 68             post_body['rxtx_factor'] = kwargs.get('rxtx')
 69         if kwargs.get('is_public'):
 70             post_body['os-flavor-access:is_public'] = kwargs.get('is_public')
 71         post_body = json.dumps({'flavor': post_body})
 72         resp, body = self.post('flavors', post_body, self.headers)
 73
 74         body = json.loads(body)
 75         return resp, body['flavor']

 

最终找到了测试的函数的出处,与昨天直接搜索的地方一致

发表回复