know more if you want, nova API3 and API21

本文深入解析了OpenStack Nova项目的API Router工作原理,包括版本控制、扩展加载机制及配置选项等关键内容。

在nova的paste配置文件中(事实上其他模块也会有这种情况,版本演进的过程中,新的概念会放在新的api version中,同时又兼容老的version,最大程度

的满足不同情况的用户使用):

/v1.1: openstack_compute_api_v2
/v2: openstack_compute_api_v2
/v2.1: openstack_compute_api_v21
/v3: openstack_compute_api_v3


/v1.1和/v2都对应的是nova.api.openstack.compute:APIRouter.factory,前面记录过一遍APIRouter的load情况,来看看/v2.1和/v3:

在nova.api.openstack.compute中APIRouterV3和APIRouterV21的区别很小,二者都是nova.api.openstack.APIRouterV21的子类,

APIRouterV3在__init__中传入了v3mode=True, 因此主要落在APIRouterV21上,我们来trace一下:

在nova.conf中的segment[osapi_v3]中,若定义为disable,则新版本的api不被支持直接返回

        if not CONF.osapi_v3.enabled:
            LOG.info(_LI("V3 API has been disabled by configuration"))
            return

APIRouterV21中定义了blacklist和whitelist,从配置文件的注释中知道:

blacklist:will never load,不被载入

whitelist:  If the list is not empty then a v3 API extension will only be loaded if it exists in this list,只载入的

因此代码中对blacklist和whitelist取交集,若交集不为空,则矛盾了, 实际loading extension时,若既在blacklist又在whitelist,不会被载入

接下来主要有两部分:

part 1:

        self.api_extension_manager = stevedore.enabled.EnabledExtensionManager(
            namespace=self.API_EXTENSION_NAMESPACE,
            check_func=_check_load_extension,
            invoke_on_load=True,
            invoke_kwds={"extension_info": self.loaded_extension_info})

通过stevedore读取entry_points中API_EXTENSION_NAMESPACE(nova.api.v3.extensions)中的entry_point得到extensions,是怎么做到的呢?

trace在stevedore/enabled.py中的EnabledExtensionManager(可自己查看注释找到参数的意义),其父类ExtensionManager在__init__()中:

 extensions = self._load_plugins(invoke_on_load, invoke_args,  invoke_kwds, verify_requirements)

调用子类EnabledExtensionManager的_load_plugins

      ext = super(EnabledExtensionManager, self)._load_one_plugin(
            ep, invoke_on_load, invoke_args, invoke_kwds,
            verify_requirements,
        )
        if ext and not self.check_func(ext): #check_func在这里发挥了作用,在python中函数也是对应,作为参数传入
            LOG.debug('ignoring extension %r', ep.name)
            return None

其中ext为父类方法中的_load_one_plugin得到,返回return Extension(ep.name, ep, plugin, obj),其中obj = plugin(*invoke_args, **invoke_kwds),

对stevedore有兴趣可看看pkg_resource的实现,invoke_kwds对应前面的  invoke_kwds={"extension_info": self.loaded_extension_info,作为load entry point

时的参数传递,参数名为extension_info


nova/api/openstack/compute/plugins/v3下的plugin,都是extensions.V3APIExtensionBase的子类,而extensions.V3APIExtensionBase的初始化函数中:

def __init__(self, extension_info):
        self.extension_info = extension_info #定位去处了

!!不错,这里的extension_info就是nova/api/openstack/compute中APIRouterV21定义的:plugins.LoadedExtensionInfo()

而使用stevedore load extension时候执行:_check_load_extension,会调用self._register_extension(ext),最终所有的extension(plugin)都会

在nova/api/opnestack/compute/plugins/__init__.py中LoadedExtensionInfo的self.extension={}中以:

 self.extensions[alias] = ext

的形式注册。


part 2:

 if list(self.api_extension_manager):
            self.api_extension_manager.map(self._register_resources,
                                           mapper=mapper)
            self.api_extension_manager.map(self._register_controllers)

trace到stevedore的map方法,实际上是对每个由stevedore得到的前面得到的extension进行routes的mapper建立,controller的对应关系建立。


Delphi 12.3 作为一款面向 Windows 平台的集成开发环境,由 Embarcadero Technologies 负责其持续演进。该环境以 Object Pascal 语言为核心,并依托 Visual Component Library(VCL)框架,广泛应用于各类桌面软件、数据库系统及企业级解决方案的开发。在此生态中,Excel4Delphi 作为一个重要的社区开源项目,致力于搭建 Delphi 与 Microsoft Excel 之间的高效桥梁,使开发者能够在自研程序中直接调用 Excel 的文档处理、工作表管理、单元格操作及宏执行等功能。 该项目以库文件与组件包的形式提供,开发者将其集成至 Delphi 工程后,即可通过封装良好的接口实现对 Excel 的编程控制。具体功能涵盖创建与编辑工作簿、格式化单元格、批量导入导出数据,乃至执行内置公式与宏指令等高级操作。这一机制显著降低了在财务分析、报表自动生成、数据整理等场景中实现 Excel 功能集成的技术门槛,使开发者无需深入掌握 COM 编程或 Excel 底层 API 即可完成复杂任务。 使用 Excel4Delphi 需具备基础的 Delphi 编程知识,并对 Excel 对象模型有一定理解。实践中需注意不同 Excel 版本间的兼容性,并严格遵循项目文档进行环境配置与依赖部署。此外,操作过程中应遵循文件访问的最佳实践,例如确保目标文件未被独占锁定,并实施完整的异常处理机制,以防数据损毁或程序意外中断。 该项目的持续维护依赖于 Delphi 开发者社区的集体贡献,通过定期更新以适配新版开发环境与 Office 套件,并修复已发现的问题。对于需要深度融合 Excel 功能的 Delphi 应用而言,Excel4Delphi 提供了经过充分测试的可靠代码基础,使开发团队能更专注于业务逻辑与用户体验的优化,从而提升整体开发效率与软件质量。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值