nova-api中ExtensionManager的构造

nova/api/openstack/__init__.py

APIRouter类:
def __init__(self, ext_mgr=None, init_only=None):
    if ext_mgr is None:
        if self.ExtensionManager:
            ext_mgr = self.ExtensionManager()
        else:
            raise Exception(_("Must specify an ExtensionManager class"))
    ...

其中的ExtensionManager由子类nova/api/openstack/computer/__init__.py中的APIRouter指定为nova/api/openstack/computer/extensions.py中的ExtensionManager类,下面看其构造函数:

class ExtensionManager(base_extensions.ExtensionManager):
    def __init__(self):
        LOG.audit(_(‘Initializing extension manager.‘))
        self.cls_list = CONF.osapi_compute_extension
        self.extensions = {}
        self.sorted_ext_list = []
        self._load_extensions()

其中self.cls_list是扩展包的引导类列表,此处为[nova.api.openstack.compute.contrib.standard_extensions]。接着看self._load_extensions()的内容,由于ExtensionManager的类继承关系,该函数为nova.api.openstack. extensions ExtensionManager的函数,内容如下:

def _load_extensions(self):
    extensions = list(self.cls_list)
    for ext_factory in extensions:
        try:
            self.load_extension(ext_factory)
        except Exception as exc:
            LOG.warn(_(‘Failed to load extension %(ext_factory)s: ‘
                       ‘%(exc)s‘),
                     {‘ext_factory‘: ext_factory, ‘exc‘: exc})

其中self.load_extension函数内容如下:

def load_extension(self, ext_factory):
    LOG.debug(_("Loading extension %s"), ext_factory)
    if isinstance(ext_factory, basestring):
        factory = importutils.import_class(ext_factory)
    else:
        factory = ext_factory
    LOG.debug(_("Calling extension factory %s"), ext_factory)
    factory(self)

整个过程就是调用nova.api.openstack.compute.contrib.standard_extensions。接下来看standard_extensions函数,内容如下:

def standard_extensions(ext_mgr):
    extensions.load_standard_extensions(ext_mgr, LOG, __path__, __package__)

其中extensions为nova.api.openstack.extensions,看load_standard_extensions内容如下:

def load_standard_extensions(ext_mgr, logger, path, package, ext_list=None):
    our_dir = path[0]
    for dirpath, dirnames, filenames in os.walk(our_dir):
        relpath = os.path.relpath(dirpath, our_dir)
        if relpath == ‘.‘:
            relpkg = ‘‘
        else:
            relpkg = ‘.%s‘ % ‘.‘.join(relpath.split(os.sep))
        for fname in filenames:
            root, ext = os.path.splitext(fname)
            if ext != ‘.py‘ or root == ‘__init__‘:
                continue
            classname = "%s%s" % (root[0].upper(), root[1:])
            classpath = ("%s%s.%s.%s" %
                         (package, relpkg, root, classname))
            if ext_list is not None and classname not in ext_list:
                logger.debug("Skipping extension: %s" % classpath)
                continue
            try:
                ext_mgr.load_extension(classpath)
            except Exception as exc:
                logger.warn(_(‘Failed to load extension %(classpath)s: ‘
                              ‘%(exc)s‘),
                            {‘classpath‘: classpath, ‘exc‘: exc})
        ...

实际上也就是调用之前ExtensionManager的 load_extension函数加载模块,并构造模块中与模块名对应的类,由于这些类都是nova.api.openstack.extensions.ExtensionDescriptor的子类,且看其__init__函数:

def __init__(self, ext_mgr):
    ext_mgr.register(self)
    self.ext_mgr = ext_mgr

  可知构造这些扩展类会在ExtensionManager中进行注册,注册过程就是在ExtensionManag中将扩展类的实例存入ExtensionManager的extensions列表中,对应的key为扩展类的alias。

  综上所述,ExtensionManager的构造就是对其中的self.cls_list进行加载调用,self.cls_list包含扩展包的引导类或引导函数,此处为nova.api.openstack.compute.contrib.standard_extensions,该引导函数负责加载扩展包中模块,并构造相应的类实例,这些类实例在构造时会向ExtensionManager进行注册。

时间: 2024-10-12 22:46:46

nova-api中ExtensionManager的构造的相关文章

nova api源码分析(二)

转载于:http://www.it165.net/pro/html/201407/17020.html (经过部分编辑) 一.使用到的库或组件如下: paste.deploy 用来解析/etc/nova/api-paste.ini文件,加载用于服务的wsgi app.它的功能有: 1.api-paste.ini中配置多个wsgi app,deploy可根据传入的app name加载指定的wsgi app: deploy.loadapp("config:/etc/nova/api-paste.in

Entity Framework 6 Recipes 2nd Edition(9-3)译->找出Web API中发生了什么变化

9-3. 找出Web API中发生了什么变化 问题 想通过基于REST的Web API服务对数据库进行插入,删除和修改对象图,而不必为每个实体类编写单独的更新方法. 此外, 用EF6的Code Frist实现数据访问管理. 本例,我们模拟一个N层场景,用单独的客户端(控制台应用)来调用单独的基于REST服务的Web网站(WEB API应用) . 注意:每层使用单独的Visual Studio 解决方案, 这样更方便配置.调试和模拟一个N层应用. 假设有一个如Figure 9-3所示的旅行社和预订

nova api源码分析(一)

说明: 源码版本:H版 参考文档:http://www.choudan.net/2013/12/09/OpenStack-WSGI-APP%E5%AD%A6%E4%B9%A0.html 一.前奏 nova api本身作为一个WSGI服务器,对外提供HTTP请求服务,对内调用nova的其他模块响应相应的HTTP请求.分为两大部分,一是创建该服务器时加载的app,这个用来处理请求:一是服务器本身的启动与运行. 目录结构如下: 首先,nova api是作为一个WSGI服务,肯定要查看它的启动过程,查看

【ASP.NET Web API教程】4.3 ASP.NET Web API中的异常处理

参考页面: http://www.yuanjiaocheng.net/webapi/create-crud-api-1-delete.html http://www.yuanjiaocheng.net/webapi/Consume-web-api.html http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-get.html http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-po

OpenStack Mitaka Nova API 接口扩展之instance_resize

# Mitaka NOVA API 接口开发 背景: OpenStack官方默认Resize接口支持local storage 不是很好,问题很多,因此重新定 制Resize接口,实现云主机套餐变更,比之前的接口提高了很多时间 ### 配置 Resize 路由 vim /usr/lib/python2.7/site-packages/nova-13.1.0-py2.7.egg-info/entry_points.txt  [nova.api.v21.extensions]          in

在ASP.NET Core Web API中为RESTful服务增加对HAL的支持

HAL(Hypertext Application Language,超文本应用语言)是一种RESTful API的数据格式风格,为RESTful API的设计提供了接口规范,同时也降低了客户端与服务端接口的耦合度.很多当今流行的RESTful API开发框架,包括Spring REST,也都默认支持HAL规范,当RESTful API被调用后,服务端就会返回ContentType为application/hal+json的JSON内容,例如: { "_links": { "

Asp.Net Web Api中使用Swagger

关于swagger 设计是API开发的基础.Swagger使API设计变得轻而易举,为开发人员.架构师和产品所有者提供了易于使用的工具. 官方网址:https://swagger.io/solutions/api-design/ 在没有接触Swagger之前,使用Web Api的时候,我们都是使用word文档提供接口说明的,比较尬,使用文档不方便的地方太多了,比如,当时使用的时候是可以马上找到的,但是时间久了,你就不记得了,找不到了,比如,调试的时候,出现问题,你就不知道到底是使用方的问题,还是

用pdb.set_trace()设断点,跟nova/api/openstack/compute/servers.py - detail() 流程

由 curl -s -H "X-Auth-Token: $OS_TOKEN" http://192.168.153.128:8774/v2.1/servers/detail | python -m json.tool 命令: 得到结果: { "servers": []       注:因为servers是核心资源,所有返回为空.} 1/opt/stack/nova/nova/api/openstack/compute/servers.py(210)detail()

论Node在构建超媒体API中的作用

论Node在构建超媒体API中的作用 作者:chszs,转载需注明. 博客主页:http://blog.csdn.net/chszs 超媒体即Hypermedia,是一种採用非线性网状结构对块状多媒体信息(包含文本.图像.视频等)进行组织和管理的技术.超媒体的概念类似于早期的超文本.超文本的本质是在文本内容加上链接.这样就构成了超文本.超媒体也类似. 不管是超媒体还是超文本.使用的传输协议都是HTTP,这意味着超媒体能够被全部的浏览器所接受. 而描写叙述超媒体的类型我们使用MIME. MIME即