
所有实现的插件都放在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
from nova.policies import extended_common
......
def list_rules():
return itertools.chain(
......
extended_common.list_rules(),
......
