neutron neutron_lbaas 框架下lbaasv2 资源创建逻辑解析

Table of Contents

调用过程分析... 1

单步跟踪调试过程... 1

使用log_helpers.log_method_call的方式查看各个函数调用关系... 6

使用timeutils.time_it的方式查看各个函数的耗时... 6

 

调用过程分析

 

-> neutron/api/v2/base.py: Controller.create

    -> neutron/api/v2/base.py: Controller._create

        -> neutron/api/v2/base.py: Controller.prepare_request_body

        -> neutron/api/v2/base.py: Controller._create: do_create

            -> neutron_lbaas/services/loadbalancer/plugin.py: create_loadbalancer

                -> db.create_loadbalancer

                -> neutron_lbaas/services/loadbalancer/plugin.py: _call_driver_operation

                    -> LOADBALANCERV2:F5Networks:neutron_lbaas.drivers.f5.driver_v2.F5LBaaSV2Driver:default

                        => LoadBalancerManger:create

                -> db.get_loadbalancer

 

单步跟踪调试过程

 

/usr/bin/python2 -m pdb /usr/bin/neutron-server --config-file /usr/share/neutron/neutron-dist.conf --config-dir /usr/share/neutron/server --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugin.ini --config-dir /etc/neutron/conf.d/common --config-dir /etc/neutron/conf.d/neutron-server --log-file /var/log/neutron/server.log

 

b /usr/lib/python2.7/site-packages/neutron/api/v2/base.py:507

b /usr/lib/python2.7/site-packages/neutron_lbaas/services/loadbalancer/plugin.py:371

b /usr/lib/python2.7/site-packages/neutron_lbaas/services/loadbalancer/plugin.py:170

 

b /usr/lib/python2.7/site-packages/neutron/api/v2/base.py:507

 

    430

    431     def create(self, request, body=None, **kwargs):

    432         self._notifier.info(request.context,

    433                             self._resource + '.create.start',

    434                             body)

    435         return self._create(request, body, **kwargs)

    436

    437     @db_api.retry_db_errors

    438     def _create(self, request, body, **kwargs):

    439         """Creates a new instance of the requested entity."""

    440         parent_id = kwargs.get(self._parent_id_name)

    441         body = Controller.prepare_request_body(request.context,

    442                                                body, True,

    443                                                self._resource, self._attr_info,

    444                                                allow_bulk=self._allow_bulk)

    445         action = self._plugin_handlers[self.CREATE]

    446         # Check authz

    447         if self._collection in body:

    448             # Have to account for bulk create

    449             items = body[self._collection]

    450         else:

    451             items = [body]

    452         # Ensure policy engine is initialized

    453         policy.init()

    454         # Store requested resource amounts grouping them by tenant

    455         # This won't work with multiple resources. However because of the

    456         # current structure of this controller there will hardly be more than

    457         # one resource for which reservations are being made

    458         request_deltas = collections.defaultdict(int)

    459         for item in items:

    460             self._validate_network_tenant_ownership(request,

    461                                                     item[self._resource])

    462             policy.enforce(request.context,

    463                            action,

    464                            item[self._resource],

    465                            pluralized=self._collection)

    466             if 'tenant_id' not in item[self._resource]:

    467                 # no tenant_id - no quota check

    468                 continue

    469             tenant_id = item[self._resource]['tenant_id']

    470             request_deltas[tenant_id] += 1

    471         # Quota enforcement

    472         reservations = []

    473         try:

    474             for (tenant, delta) in request_deltas.items():

    475                 reservation = quota.QUOTAS.make_reservation(

    476                     request.context,

    477                     tenant,

    478                     {self._resource: delta},

    479                     self._plugin)

    480                 reservations.append(reservation)

    481         except n_exc.QuotaResourceUnknown as e:

    482             # We don't want to quota this resource

    483             LOG.debug(e)

    ...

    506         def do_create(body, bulk=False, emulated=False):

    507             kwargs = {self._parent_id_name: parent_id} if parent_id else {}

    508             if bulk and not emulated:

    509                 obj_creator = getattr(self._plugin, "%s_bulk" % action)

    510             else:

    511                 obj_creator = getattr(self._plugin, action)

    512             try:

    513                 if emulated:

    514                     return self._emulate_bulk_create(obj_creator, request,

    515                                                      body, parent_id)

    516                 else:

    517                     if self._collection in body:

    518                         # This is weird but fixing it requires changes to the

    519                         # plugin interface

    520                         kwargs.update({self._collection: body})

    521                     else:

    522                         kwargs.update({self._resource: body})

    523                     return obj_creator(request.context, **kwargs)

    524             except Exception:

    525                 # In case of failure the plugin will always raise an

    526                 # exception. Cancel the reservation

    527                 with excutils.save_and_reraise_exception():

    528                     for reservation in reservations:

    529                         quota.QUOTAS.cancel_reservation(

    530                             request.context, reservation.reservation_id)

 

b /usr/lib/python2.7/site-packages/neutron_lbaas/services/loadbalancer/plugin.py:371

 

    370     def create_loadbalancer(self, context, loadbalancer):

    371         loadbalancer = loadbalancer.get('loadbalancer')

    372         if loadbalancer['flavor_id'] != n_constants.ATTR_NOT_SPECIFIED:

    373             self._insert_provider_name_from_flavor(context, loadbalancer)

    374         else:

    375             del loadbalancer['flavor_id']

    376         provider_name = self._get_provider_name(loadbalancer)

    377         driver = self.drivers[provider_name]

    378         lb_db = self.db.create_loadbalancer(

    379             context, loadbalancer,

    380             allocate_vip=not driver.load_balancer.allocates_vip)

    381         self.service_type_manager.add_resource_association(

    382             context,

    383             constants.LOADBALANCERV2,

    384             provider_name, lb_db.id)

    385         create_method = (driver.load_balancer.create_and_allocate_vip

    386                          if driver.load_balancer.allocates_vip

    387                          else driver.load_balancer.create)

    388         try:

    389             self._call_driver_operation(context, create_method, lb_db)

    390         except (lbaas_agentschedulerv2.NoEligibleLbaasAgent,

    391                 lbaas_agentschedulerv2.NoActiveLbaasAgent) as no_agent:

    392             self.db.delete_loadbalancer(context, lb_db.id)

    393             raise no_agent

    394         return self.db.get_loadbalancer(context, lb_db.id).to_api_dict()

 

b /usr/lib/python2.7/site-packages/neutron_lbaas/services/loadbalancer/plugin.py:170

 

    168     def _call_driver_operation(self, context, driver_method, db_entity,

    169                                old_db_entity=None, **kwargs):

    170         manager_method = "%s.%s" % (driver_method.__self__.__class__.__name__,

    171                                     driver_method.__name__)

    172         LOG.info("Calling driver operation %s" % manager_method)

    173         try:

    174             if old_db_entity:

    175                 driver_method(context, old_db_entity, db_entity, **kwargs)

    176             else:

    177                 driver_method(context, db_entity, **kwargs)

    178         # catching and reraising agent issues

    179         except (lbaas_agentschedulerv2.NoEligibleLbaasAgent,

    180                 lbaas_agentschedulerv2.NoActiveLbaasAgent) as no_agent:

    181             raise no_agent

    182         # Pass these exceptions through to neutron

    183         except (exceptions.ConflictException,

    184                 exceptions.NotFoundException,

    185                 exceptions.NotAuthorizedException,

    186                 exceptions.BadRequestException,

    187                 exceptions.ServiceUnavailableException):

    188             raise

    189         except Exception as e:

    190             LOG.exception("There was an error in the driver")

    191             self._handle_driver_error(context, db_entity)

    192             raise loadbalancerv2.DriverError(msg=e)

 

使用log_helpers.log_method_call的方式查看各个函数调用关系

 

    neutron/api/v2/base.py:24:from oslo_log import helpers as log_helpers

    neutron/api/v2/base.py:432:    @log_helpers.log_method_call

    neutron/api/v2/base.py:508:        @log_helpers.log_method_call

    Binary file neutron/api/v2/base.pyc matches

    neutron_lbaas/services/loadbalancer/plugin.py:33:from oslo_log import helpers as log_helpers

    neutron_lbaas/services/loadbalancer/plugin.py:371:    @log_helpers.log_method_call

 

使用timeutils.time_it的方式查看各个函数的耗时

 

    neutron/api/v2/base.py:28:from oslo_utils import timeutils

    neutron/api/v2/base.py:433:    @timeutils.time_it(LOG)

    neutron/api/v2/base.py:510:        @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:33:from oslo_utils import timeutils

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:65:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:215:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:223:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:248:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:254:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:280:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:341:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:370:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:377:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:389:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:402:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:408:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:415:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:420:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:538:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:572:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:597:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:603:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:610:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:615:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:652:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:671:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:709:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:726:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:732:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:737:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:754:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:762:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:768:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:776:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:781:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:787:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:803:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:812:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:820:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:829:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:834:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:842:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:852:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:859:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:892:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:921:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:930:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:935:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:942:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:957:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:981:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:987:    @timeutils.time_it(LOG)

    neutron_lbaas/db/loadbalancer/loadbalancer_dbv2.py:995:    @timeutils.time_it(LOG)

    neutron_lbaas/services/loadbalancer/plugin.py:36:from oslo_utils import timeutils

    neutron_lbaas/services/loadbalancer/plugin.py:170:    @timeutils.time_it(LOG)

    neutron_lbaas/services/loadbalancer/plugin.py:373:    @timeutils.time_it(LOG)

    neutron_lbaas/services/loadbalancer/plugin.py:401:    @timeutils.time_it(LOG)

    neutron_lbaas/services/loadbalancer/plugin.py:551:    @timeutils.time_it(LOG)

    neutron_lbaas/services/loadbalancer/plugin.py:670:    @timeutils.time_it(LOG)

    neutron_lbaas/services/loadbalancer/plugin.py:771:    @timeutils.time_it(LOG)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值