neutron 添加extension
环境:
ocata版本
neutron-10.0.5
python-neutronclient-6.1.1
horizon-11.0.4
主要讲述如何在ocata版本的openstack网络模块neutron中添加extension。
流程图
先看一张从dashboard到neutron相应组件api的流程图
整个流程大致就是这样:
dashboard(shell)–>neutronclient–>neutron-server–>plugin–>agent
详细的流程讲解这里不作展开,只做相应步骤的代码添加,详细的讲解会在后续的文章提及。
我们这里讲解的是如何添加extension,当然就是要在/neutron/extension目录添加我们的py文件,这里的例子是对
数据库表格的操作
#neutron-server
这一步是对neutron-server访问数据库的操作分析。
如何新增数据库表 请看这里https://blog.youkuaiyun.com/energysober/article/details/80289394
##步骤一 添加extensions/test.py
下面时分段讲解
头文件
安装需要添加,不同版本可能存在文件的变动
from neutron_lib.api import extensions as api_extensions
from neutron_lib.plugins import directory
from neutron_lib.db import constants as db_const
from neutron_lib import exceptions as nexception
from neutron.quota import resource_registry
from neutron._i18n import _
from neutron.api import extensions
from neutron.api.v2 import base
添加RESOURCE_ATTRIBUTE_MAP
`
TESTS = 'tests'
RESOURCE_ATTRIBUTE_MAP = {
TESTS: {
'id': {'allow_post': False, 'allow_put': False,
'validate': {'type:uuid': None},
'is_visible': True, 'primary_key': True},
'pid': {'allow_post': True, 'allow_put': True,
'validate': {'type:uuid': None},
'is_visible': True},
'project_id': {'allow_post': True, 'allow_put': True
'validate': {'type:string': db_const.PROJECT_ID_FIELD_SIZE},
'is_visible': True},
'name': {'allow_post': True, 'allow_put': False,
'validate': {'type:string': db_const.NAME_FIELD_SIZE},
'default': '',
'is_visible': True},
},`
这个RESOURCE_ATTRIBUTE_MAP 很重要,不可缺少,这里面的字段就是之后你的create、delete、update、get等操作的对象。在这里也就是数据库所有的字段
上面的id由于是调用uuidutils.generate_uuid()生成(步骤四),所以这里设置为False
allow_post : 是否允许post请求
vaildate : 指定类型等
is_visible : 返回信息中是否有此字段
ps:详细的解释请看/neutron/api/v2/attributes.py的注释
添加cl `class Test(api_extensions.ExtensionDescriptor): “”“Agent management extension.”""
@classmethod
def get_name(cls):
return "test"
@classmethod
def get_alias(cls):
return "test"
@classmethod
def get_description(cls):
return "curd a test ."
@classmethod
def get_namespace(cls):
return "http://docs.openstack.org/ext/agent/api/v2.0"
@classmethod
def get_updated(cls):
return "2018-05-10T10:00:00-00:00"
@classmethod
def get_resources(cls):
"""Returns Ext Resources."""
plugin = directory.get_plugin()
resource_registry.register_resource_by_name(TESTS)
params = RESOURCE_ATTRIBUTE_MAP.get(TESTS)
controller = base.create_resource(TESTS,
TEST,
plugin, params,
allow_bulk=True,
allow_pagination=True,
allow_sorting=True)
ex = extensions.ResourceExtension(GROUPS, controller)
return [ex]
def get_extended_resources(self, version):
if version == "2.0":
return RESOURCE_ATTRIBUTE_MAP
else:
return {}
<