怎样写 OpenStack Neutron 的 Extension (三)
通过上几章的介绍,我们现在的 myplugin 文件夹看上去应该是这样的:
- neutron/
- plugins/
- myplugin/
- __init__.py
- plugin.py
- extensions/
- __init__.py
- myextension.py
- db/
- __init__.py
- db.py
- models.py
我们的plugin.py看上去应该是类似这样的:
from neutron import neutron_plugin_base_v2
class MyPlugin(neutron_plugin_base_v2.NeutronPluginBaseV2): def __init__(self): pass [...]
def create_myextension(self, context, myextension): return myextension def update_myextension(self, context, id, myextension): return myextension def get_myextension(self, context, id, fields=None): myextension = {} return myextension def get_myextensions(self, context, filters=None, fields=None): myextensions = {} return myextensions def delete_myextension(self, context, id): return id
[...]
这些方法需要进一步的定义来做一些有实际意义的事情,这里我只是做一个最简单的举例说明。在有了上述这些文件之后,其实整个 plugin 以及 extension 的后台就已经搞定了,只是这个时候还没有任何途径来使用这些定义好的方法。所以接下来我们需要在 neutronclient 中增加一些对应的方法。
neutronclient 是一个 CLI 客户端,可以用来与 neutron 互动。每一个 OpenStack 的 project 如 nova,neutron 等都有一个类似的自己的 CLI client。首先,我们需要在 CLI 中显示关于 myextension 的命令,这个可以在 neutronclient/shell.py 中设置。这个文件有一个属性叫做 COMMAND_V2,所有可以使用的命令都以 key-value pair 的形式存储在这个变量中:
from neutronclient.neutron.v2_0.myextension import extension as my_ext
COMMAND_V2 = { 'net-list': network.ListNetwork, 'net-external-list': network.ListExternalNetwork, 'net-show': network.ShowNetwork, 'net-create': network.CreateNetwork, 'net-delete': network.DeleteNetwork, 'net-update': network.UpdateNetwork, ...
'myextension-list': my_ext.ListExtension,
'myextension-show': my_ext.ShowExtension,
'myextension-create': my_ext.CreateExtension,
'myextension-delete': my_ext.DeleteExtension,
'myextension-update': my_ext.UpdateExtension,
...
}
下一步就需要去 neutronclient/neutron/v2_0 中新建一个文件夹 myextension,并在其中新建两个文件: __init__.py 和 extension.py,其结构如下:
- neutronclient/
- neutron/
- v2_0/
- myextension/
- __init__.py
- extension.py
然后再 extension.py 中分别定义五个class:List/Show/Create/Delete/UpdateExtension。这部分内容会在下一篇文章中进行介绍。
作者:好大一片云
博客地址:http://www.cnblogs.com/zhutianshi/
转载声明:可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明,谢谢合作!
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.