對於v3 api新增新資源,以現有擴充套件資源keypairs為例進行說明
#nova/api/openstack/compute/plugins/v3/keypairs.py
alias = 'os-keypairs'
class keypairs(extensions.v3apiextensionbase):
"""keypair support."""
name = "keypairs"
alias = alias
version = 1
def get_resources(self):
resources = [
extensions.resourceextension(alias,
keypaircontroller())]
return resources
#對於v3 api,對核心資源的擴充套件,所需要做的僅僅是在get_controller_extensions()
#中返回該核心資源的擴充套件,並不需要對核心資源的實現做任何修改。對於核心資源,
#其get_controller_extensions()會返回空
def get_controller_extensions(self):
controller = controller()
extension = extensions.controllerextension(self, 'servers', controller)
return [extension]
# use nova.api.extensions.server.extensions entry point to modify
# server create kwargs
# note(gmann): this function is not supposed to use 'body_deprecated_param'
# parameter as this is placed to handle scheduler_hint extension for v2.1.
def server_create(self, server_dict, create_kwargs, body_deprecated_param):
create_kwargs['key_name'] = server_dict.get('key_name')
那麼,v3 api如何避免對核心資源servers的create操作的修改?
#nova/api/openstack/compute/plugins/v3/servers.py
class serverscontroller(wsgi.controller):
"""the server api base controller class for the openstack api."""
#在核心資源servers對應的controller中,引入了三個entry points的命名空間,
#分別對應三個將被擴充套件資源所修改的操作create、rebuild、update
extension_create_namespace = 'nova.api.v3.extensions.server.create'
extension_rebuild_namespace = 'nova.api.v3.extensions.server.rebuild'
extension_update_namespace = 'nova.api.v3.extensions.server.update'
def __init__(self, **kwargs):
#初始化時,根據setup.cfg的定義,從之前引入的命名空間中載入所有的資源
self.create_extension_manager = \
stevedore.enabled.enabledextensionmanager(
namespace=self.extension_create_namespace,
check_func=_check_load_extension('server_create'),
invoke_on_load=true,
invoke_kwds=,
propagate_map_exceptions=true)
if not list(self.create_extension_manager):
log.debug("did not find any server create extensions")
def create(self, req, body):
#servers的create操作使用map()函式依次呼叫各個擴充套件資源的server_create()函式
#去修改create_kwargs,最終的create_kwargs會被用來建立虛擬機器
if list(self.create_extension_manager):
self.create_extension_manager.map(self._create_extension_point,
server_dict, create_kwargs, body)
此外,因為v3使用stevdore載入各個api外掛程式,我們還需要在setup.cfg檔案中增加相應的entry point:
nova.api.v3.extensions =
keypairs = nova.api.openstack.compute.plugins.v3.keypairs:keypairs
nova.api.v3.extensions.server.create =
keypairs_create = nova.api.openstack.compute.plugins.v3.keypairs:keypairs
ABP學習 之 如何新增API
乙個後端系統最重要的當然是提供api給前端呼叫。那麼應用abp模板的project,應該如何新增api呢?雖然傳統方式新增的api不會在swagger ui列出 但可通過http host controllname method 直接訪問。namespace mylearningproject.my...
如何給框架新增API介面日誌
前言 用的公司的框架,是mvc框架,看了下裡面的日誌基類,是操作日誌,對增刪改進行記錄,誇張的是一張業務的資料表 需要一張專門的日誌表進行記錄,就是說你寫個更新,新增的方法都必須寫一遍操作日誌,看了,不多,6行。不懂為什麼要這樣做,api 簡潔萬歲!於是果斷在生命週期中插入介面日誌。思路1 一次插入...
如何使用 CSS3 新增投影
本主題將向你介紹如何使用 windows internet explorer 9 和 cascading style sheets,level 3 css3 向布局元素的外部或內部新增投影。你甚至可以為使用 internet explorer 9 中新提供的圓角支援所建立的圓角曲線新增陰影。本主題包...