Nova v3 API如何新增新資源

2021-08-17 11:22:56 字數 2898 閱讀 3698

對於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 中新提供的圓角支援所建立的圓角曲線新增陰影。本主題包...