其实上一篇博文中的内容已经涵盖了大部分写Neutron插件的技术问题,这里主要还遗留了一些有关插件的具体实现的问题。
首先,Neutron对最基本的三个资源:Network, Port 和 Subnet 的基本调用都已经定义好了API接口。如果你的插件也需要用到这些资源,最好直接实现它们的接口。API接口的定义可以再 neutron/neutron_plugin_base_v2.py 这个文件中找到,其中每个参数的作用也有比较详细的介绍。对于用不着的资源,直接放任不管就好了,最多下次不小心调用了会发出“该接口没有被实现”的错误,不会有其他影响。这里是一个 Network API 实现的范例,其实它什么也没有做,但是确实是一个有效的接口实现:
from neutron import neutron_plugin_base_v2 class MyNeutronPlugin(neutron_plugin_base_v2.NeutronPluginBaseV2): def __init__(self): pass def create_network(self, context, network): # Create a network by using data from network dictionary # Send back a dictionary to display created network‘s info return network def update_network(self, context, id, network): # Update a created network matched by id with # data in the network dictionary. Send back a # dictionary to display the network‘s updated info return network def get_network(self, context, id, fields=None): network = {} # List information of a specific network matched by id # and return it in a form of dictionary return network def get_networks(self, context, filters=None, fields=None): network = {} # List all networks that are active return network def delete_network(self, context, id): # Delete a specific network matched by id # return back the id of the network. return id
如果在具体实现这些接口的过程中,你有什么不太清楚的地方,有两个地方非常值得参考:一个是 neutron/db/db_base_plugin_v2.py,这个是neutron官方给出的一个基于数据库的实现。它只是操作数据库中的内容,模拟各个资源的创建、修改、删除等操作,但没有在物理机器上做任何改变。第二个地方就是 neutron/plugins 里面收纳的各个公司的插件实现,你可以从中学习到其他公司是怎么写插件的。
在写插件的过程中,通常还会遇到两种问题:一、我想要实现的 Network 还有一些额外的属性,但是现在的模型中不存在,怎么办? 二、我还想实现一些其他的资源,例如Gateway,Router,Firewall 等,怎么办?
这两种问题需要更加复杂的解决方案,属于 Neutron Extension 的范畴,我会在稍后的文章中进行介绍。
怎样写 OpenStack Neutron 的 Plugin (二)
时间: 2024-10-13 20:50:14