openstack如何扩展API之二:扩展原有核心API

(文章来自作者维护的社区微信公众号【虚拟化云计算】)
目前有两个微信群《kvm虚拟化》和《openstack》,扫描二维码点击“云-交流”,进群交流提问
openstack使用stevedore的插件机制,来提供了扩展接口功能(openstack官方称为Extending the API)。有了插件机制,我们在开发新的OpenStack功能时,通过扩展接口功能,在不改变openstack核心代码的前提下,就可以实现对OpenStack的功能扩展。
 
openstack中使用stevedore扩展接口可以分为三个步骤:声明插件,实现插件,注册插件。

 

1. 声明插件
在setup.cfg中声明插件的入口entry_points。(最终安装到了entry_points.txt)
[nova.api.v21.extensions]
extended_test = nova.api.openstack.compute.extended_test:ExtendedTest

 

2. 实现插件

所有实现的插件都放在nova/api/openstack/compute中。实现了V21APIExtensionBase的子类。

例如新建一个:

api/openstack/compute/extended_test.py

from nova.api.openstack import extensions
from nova.api.openstack import wsgi

ALIAS = 'os-extended-test'

class TestServerController(wsgi.Controller):
    def _extend_server(self, server, instance):
        server['test'] = 'hello test'

    @wsgi.extends
    def show(self, req, resp_obj, id):
        server = resp_obj.obj['server']
        instance = req.get_db_instance(server['id'])
        self._extend_server(server, instance)

    @wsgi.extends
    def detail(self, req, resp_obj):
        servers = list(resp_obj.obj['servers'])
        for server in servers:
            instance = req.get_db_instance(server['id'])
            self._extend_server(server, instance)

class ExtendedTest(extensions.V21APIExtensionBase):
    """extended test support."""
    name = "ExtendedTest"
    alias = ALIAS
    version = 1

    def get_resources(self):
        return []

    def get_controller_extensions(self):
        server_extension = extensions.ControllerExtension(
            self, 'servers', TestServerController())
        return [server_extension]

3. 注册插件

插件的注册不需要我们再实现,openstack已经使用stevedore实现了。

Nova API启动过程中会加载api-paste.ini中定义的应用osapi_compute:

[app:osapi_compute_app_v21]
paste.app_factory = nova.api.openstack.compute:APIRouterV21.factory

在APIRouterV21初始化时注册了extension。

 

最后验证一下效果:

# nova show Ubuntu-12-04

 

这里我们在没有修改servers的核心api的条件下扩展了nova show对应的api。给虚拟机添加了一个属性test。

 

附:

如果想通过nova list-extensions命令查看到我们扩展的api还要进行下面的工作。

首先添加文件:

policies/extended_test.py

from oslo_policy import policy
from nova.policies import base

BASE_POLICY_NAME = 'os_compute_api:os-extended-test'
POLICY_ROOT = 'os_compute_api:os-extended-test:%s'

extended_test_policies = [
    policy.RuleDefault(
        name=BASE_POLICY_NAME,
        check_str=base.RULE_ADMIN_API),
    policy.RuleDefault(
        name=POLICY_ROOT % 'create',
        check_str=base.RULE_ANY),
    policy.RuleDefault(
        name=POLICY_ROOT % 'discoverable',
        check_str=base.RULE_ANY),
    policy.RuleDefault(
        name=POLICY_ROOT % 'show',
        check_str=base.RULE_ANY),
]

def list_rules():
    return extended_test_policies

 

其次修改文件俺
policies/__init__.py
from nova.policies import extended_common

......

def list_rules():

    return itertools.chain(

        ......

        extended_common.list_rules(),

        ......      

 

 

 

最后查看是否能够查看到
# nova list-extensions
| ExtendedTest     | extended test support.                       | os-extended-test      | 2014-12-03T00:00:00Z |

 

 

====================================================================
关注微信公众号【虚拟化云计算】,阅读更多虚拟化云计算知识,纯技术干货更新不停。
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值