【OpenStack源码分析之五】Nova API 的插件管理

Openstack使用 stevedore作为其第三方开发和加载的框架,其使用setuptools的entry points来定义并加载插件。entry point引用的是定义在模块中的对象,比如类、函数、实例等,只要在import模块时能够被创建的对象都可以。

[nova.api.v21.extensions]
remote_consoles = nova.api.openstack.compute.remote_consoles:RemoteConsoles
networks = nova.api.openstack.compute.networks:Networks
consoles = nova.api.openstack.compute.consoles:Consoles
console_auth_tokens = nova.api.openstack.compute.console_auth_tokens:ConsoleAuthTokens
quota_classes = nova.api.openstack.compute.quota_classes:QuotaClasses
images = nova.api.openstack.compute.images:Images
versions = nova.api.openstack.compute.versionsV21:Versions
volumes = nova.api.openstack.compute.volumes:Volumes
server_groups = nova.api.openstack.compute.server_groups:ServerGroups
extension_info = nova.api.openstack.compute.extension_info:ExtensionInfo
baremetal_nodes = nova.api.openstack.compute.baremetal_nodes:BareMetalNodes
security_group_default_rules = nova.api.openstack.compute.security_group_default_rules:SecurityGroupDefaultRules
block_device_mapping = nova.api.openstack.compute.block_device_mapping:BlockDeviceMapping
image_size = nova.api.openstack.compute.image_size:ImageSize
user_data = nova.api.openstack.compute.user_data:UserData
image_metadata = nova.api.openstack.compute.image_metadata:ImageMetadata
cloudpipe = nova.api.openstack.compute.cloudpipe:Cloudpipe
networks_associate = nova.api.openstack.compute.networks_associate:NetworksAssociate
security_groups = nova.api.openstack.compute.security_groups:SecurityGroups
multiple_create = nova.api.openstack.compute.multiple_create:MultipleCreate
tenant_networks = nova.api.openstack.compute.tenant_networks:TenantNetworks
cells = nova.api.openstack.compute.cells:Cells

上面的代码可以看出在Nova api模块要启动的plugin列表。

插件的使用方式

在stevedore中,有三种使用插件的方式:Drivers、Hooks、Extensions
1:Drivers
一个名字对应一个entry point。使用时根据插件的命名空间和名字,定位到单独的插件:
这里写图片描述

2:Hooks,一个名字对应多个entry point。允许同一个命名空间中的插件具有相同的名字,根据给定的命名空间和名字,加载该名字对应的多个插件。
这里写图片描述

3:Extensions,多个名字,多个entry point。给定命名空间,加载该命名空间中所有的插件,当然也允许同一个命名空间中的插件具有相同的名字。
这里写图片描述

Openstack的实现

Openstack 在Rest Call上选择的是第三种方式,通过给定的命名空间 nova.api.v21.extensions,再加上entrypoint名称定为到对应的插件。但是通过前一篇介绍Nova-API启动的文章我们看到Restful URL还会通过APIRouterV21这个WSGI middleware来进行request和应用的处理映射。
这里写图片描述
那么API Router通过哪些Key值来做的映射呢?

#(
#     ('Route path': {
#         'HTTP method: [
#             'Controller',
#             'The method of controller is used to handle this route'
#         ],
#         ...
#     }),
('/flavors', {
        'GET': [flavor_controller, 'index'],
        'POST': [flavor_controller, 'create']
    }),

最终的Route会包含类似信息(path, method, controller, action),正是通过这个组合Key值来寻找对应的Controller。

自定义API

自定义API分为三种可能性,分别如下:
- 在原有的资源上增加函数,例如在servers上增加一个接口,查看虚拟机的资源利用情况
- 添加扩展资源,定义新的扩展资源
- 添加核心资源,定义新的核心资源

对于第一种情况,应该是最简单的,我们想在现有的servers上添加一个接口,意味着在servers的controller中添加一个函数,如何能够正确的添加了,我们需要像下图一样,给该函数添加几个装饰器,其中@wsgi.action装饰器需要起一个短名字,然后再http请求的body中添加一条记录{action:name},这样就OK了。

这里写图片描述

第二种情况下,添加新的扩展资源,我们需要写一个py文件,定义一个class,将其放在nova.api.openstack.compute.contrib目录下面,文件名小写,然后再文件中定义一个class,类名和文件一样,只是首字母大写,该class要继承于ExtensionDescriptor,并且定义四个变量,name,alias,updated,namespace,并且要保证alias不和其他的冲突,唯一性。

  • 1.如果新定义的扩展资源只是扩展以存在的核心资源,需要重写get_controller_extensions方法,该方法需要有一个新的Controller class,该class 继承于所扩展的核心资源的controller,并且该class的成员函数需要添加@wsgi.extends装饰器
  • 2.如果新定义的扩展资源也定义了新的资源,那么需要再定义个属于自己的Controller类,包含,index,create,delete等等函数
  • 3.以上可以二者兼备

这里写图片描述

这里写图片描述

这里写图片描述

对于第三种情况,定义一个新的核心资源,我们需要在nova.api.openstack.compute目录下面创建一个新的py文件,按照servers这样的文件来写一个自己的核心资源,大家可以参考servers.py的方法,还有上面两种方法,最复杂的是在nova.api.openstack.compute.init.py文件中的APIRouter class中使用mapper.resource方法

这里写图片描述

参考文献:
http://www.choudan.net/2013/07/31/OpenStack-API%E5%88%86%E6%9E%90(%E4%B8%89).html
http://blog.csdn.net/gtt116/article/details/51603543

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值