从前几篇的文章中我可以知道neutron plugin分core plugin和service plugin两种,而core plugin来说我们一般不添加,大部分都是添加service plugin,所以,这篇文章主要讲述怎么添加一个service plugin
代码目录:/neutron/services
在上面的目录下 新增一个文件夹,这里命名为testing
目前代码目录:/neutorn/service/testing
这个文件夹要做成一个模块,所以要新建一个 _ init _.py文件。还有一个就是plugin实现功能文件testing_plugin.py
所以 现在testing文件夹下面最基本的要有上面提到的两个文件。
testing_plugin.py文件的实现:
import random
import time
from neutron.db import api as db_api
from neutron.services import service_base
from neutron.db import testing_db
from oslo_db import exception as db_exc
from oslo_log import log as logging
from sqlalchemy.orm import session as se
from neutron.plugins.common import constants
LOG = logging.getLogger(__name__)
class TestingPlugin(testing_db.TestdbMinxin,service_base.ServicePluginBase):
supported_extension_aliases = ['testing']
path_prefix = "/testing"
def get_plugin_description(self):
return "testing plugin"
@classmethod
def get_plugin_type(cls):
return constants.TESTING
~
类名就与文件名相似,去掉下划线,组合单词首字母大写
如果要对数据库有操作,就要在/neutron/db/目录下新建一个db文件,我这里是test_db.py, 里面有个TestdbMinxin的类,这些后面讲extension的时候会讲到,详细会在下篇文章讲解。
supported_ extension_aliases = [“network-ip-availability”]
上面这行代码的意思就是本plugin支持哪些extension
这个可有可无
这里还有在/neutron/extension目录下创建一个py文件的,这个文件的功能就是要做到创建controller了,具体的放在下一篇文章中讲解。
service plugin都是从entry-point文件中加载的,所以要添加service plugin就要在这个文件下添加内容
[neutron.service_plugins]
auto_allocate = neutron.services.auto_allocate.plugin:Plugin
dummy = neutron.tests.unit.dummy_plugin:DummyServicePlugin
flavors = neutron.services.flavors.flavors_plugin:FlavorsPlugin
loki = neutron.services.loki.loki_plugin:LokiPlugin
metering = neutron.services.metering.metering_plugin:MeteringPlugin
network_ip_availability = neutron.services.network_ip_availability.plugin:NetworkIPAvailabilityPlugin
qos = neutron.services.qos.qos_plugin:QoSPlugin
revisions = neutron.services.revisions.revision_plugin:RevisionPlugin
router = neutron.services.l3_router.l3_router_plugin:L3RouterPlugin
segments = neutron.services.segments.plugin:Plugin
tag = neutron.services.tag.tag_plugin:TagPlugin
timestamp = neutron.services.timestamp.timestamp_plugin:TimeStampPlugin
trunk = neutron.services.trunk.plugin:TrunkPlugin
testing = neutron.services.testing.testing_plugin.TestingPlugin
将我们的testing添加到entry_point.txt的[neutron.service_plugins]的最后面
最后重启neutron-server服务就能看到testing的extension加载了
查看neutron-server.log,发现并没有plugin加载,怎么回事??
细心看过上一篇的同学可能知道问题所在了,
加载plugin还需要修改一个地方
方法一
代码目录:/neutron/plugins/common/constants.py
# Neutron well-known service type constants:
DUMMY = "DUMMY"
LOADBALANCER = "LOADBALANCER"
LOADBALANCERV2 = "LOADBALANCERV2"
FIREWALL = "FIREWALL"
VPN = "VPN"
METERING = "METERING"
FLAVORS = "FLAVORS"
QOS = "QOS"
TESTING = "TESTING"
# Maps extension alias to service type that
# can be implemented by the core plugin.
EXT_TO_SERVICE_MAPPING = {
'dummy': DUMMY,
'lbaas': LOADBALANCER,
'lbaasv2': LOADBALANCERV2,
'fwaas': FIREWALL,
'aas': VPN,
'metering': METERING,
'router': constants.L3,
'qos': QOS,
'testing': TESTING
}
# Maps default service plugins entry points to their extension aliases
DEFAULT_SERVICE_PLUGINS = {
'auto_allocate': 'auto-allocated-topology',
'tag': 'tag',
'timestamp': 'timestamp',
'network_ip_availability': 'network-ip-availability',
'flavors': 'flavors',
'revisions': 'revisions',
'testing' : 'testing',
}
在DEFAULT_SERVICE_PLUGINS后面加上我们的testing,要与entry_points.txt文件的名字一样。
方法二
修改neutron.conf的配置文件,新增service plugin
service_plugins = neutron.services.l3_router.l3_router_plugin.L3RouterPlugin,
neutron.services.metering.metering_plugin.MeteringPlugin,neutron.services.testing.testing_plugin.TestingPlugin
后面再看看日志就有了
这一篇讲了如何加plugin,在代码上面还有一个extension在,这个会在下一篇讲解,如何添加extension