We have learned core plugin, service plugin and extension in last post. Now let`s review:

Core Plugin

Core plugin manage core resources which are network, subnet, port and subnetpool.

Service Plugin

Service plugin manage higher services.

extension

Extensions are called API Extensions. There are three types of extension

  • resource extension which define new resources
  • action extension which define actions for resource
  • request extension which can add more parameter to request

Normally a new feature will be implemented by extension first. When the feature is stable, the community will move it to official api and may implement it in plugin.

We write our core plugin in the previous post now we are going to write our service plugin.

What is the difference between core plugin and service plugin

Core plugin manage core resource in neutron. The code structure is different from service plugin. But the community are considering transfer core plugin into one kind of service plugin. You will see the trend in code

Design our service plugin

Our service plugin is called "ZOO". This plugin will manage some resource like "tiger". We are going to do API call like CREATE/UPDATE/DELETE/GET tiger with this service plugin.

Write our service plugin

Service plugin must be inherited from the class neutron.services.service_base.ServicePluginBase

Below are my service plugin

from neutron.services import service_base

class ZooPlugin(service_base.ServicePluginBase):
supported_extension_aliases = ["zoo"] def __init__(self):
super(ZooPlugin, self).__init__() def get_plugin_name(self):
return "ZOO" def get_plugin_type(self):
# should be under neutron/plugins/common/constants.py
return "ZOO" def get_plugin_description(self):
return ("ZOO") def create_tiger(self, context, tiger):
return "tiger created" def get_tigers(self, context, filters, fields):
return {}

supported_extension_aliases is necessary since we need an extension to generate the resource.

We only support get_tigers and create_tiger here for simplicity purpose.

Because the plugin is third-party code, so we have to register it under certain entry point so neutron can load it. So our code structure will be like :

[root@liberty-controller01 tmp]# tree zooServicePlugin
zooServicePlugin/
├── setup.py
└── zoo
├── __init__.py
├── zoo_plugin.py

The content of setup.py is like

from setuptools import setup, find_packages

setup(
name='zoo',
version='1.0', packages=find_packages(), entry_points={
'neutron.service_plugins': [
'zoo = zoo.zoo_plugin:ZooPlugin',
],
},
)

The key point here is to register the plugin under neutron.service_plugins namespace.

Write the extension

We have service plugin ready to manage the tiger resource. But we do not have the tiger resource yet. One option is to modify the neutron/api/v2/attribute.py which is not suggested. The recommended way is to generate the resource by extension like below

from neutron.api import extensions
from neutron.api.v2 import base
from neutron import manager EXT_PREFIX = '/zoo'
RESOURCE_NAME = 'tiger'
COLLECTION_NAME = '%ss' % RESOURCE_NAME
RESOURCE_ATTRIBUTE_MAP = {
'tiger': {
'id': {'allow_post': False, 'allow_put': False,
'validate': {'type:uuid': None},
'is_visible': True,
'primary_key': True},
'name': {'allow_post': True,
'allow_put': False,
'is_visible': True,
'default': ''},
'tenant_id': {'allow_post': True, 'allow_put': False,
'required_by_policy': True,
'validate': {'type:string': None},
'is_visible': True}
}
} class Zoo(extensions.ExtensionDescriptor):
@classmethod
def get_name(cls):
return "zoo" @classmethod
def get_alias(cls):
return 'zoo' @classmethod
def get_description(cls):
return "zoo" @classmethod
def get_updated(cls):
return "2017-02-08T10:00:00-00:00" @classmethod
def get_resources(cls):
# This method registers the URL and the dictionary of
# attributes on the neutron-server.
exts = list()
plugin = manager.NeutronManager.get_service_plugins()['ZOO']
resource_name = RESOURCE_NAME
collection_name = COLLECTION_NAME
params = RESOURCE_ATTRIBUTE_MAP.get(resource_name)
controller = base.create_resource(collection_name, resource_name,
plugin, params, allow_bulk=False)
ex = extensions.ResourceExtension(collection_name, controller, path_prefix=EXT_PREFIX)
exts.append(ex)
return exts

The RESOURCE_ATTRIBUTE_MAP is used for define resource tiger. The tenant_id attribute is necessary for auth.

An extension must inherited from extensions.ExtensionDescriptor

get_alias method is really important because plugin will use this value to find the extension. This value must be in the supported_extension_alias of plugin

The get_resources method is necessary for an extension who define new resource. We will see the detail in later post.

Config

Now we have our service plugin and extension we need to install our service plugin by python setup.py install and put the extension under neutron/extensions

Also config the /etc/neutron/neutron.conf

service_plugins = ...,zoo

Restart your neutron server and run below API

curl -g -i  "http://liberty-controller01:9696/v2.0/zoo/tigers" -H "Content-Type: application/json" -H "Accept: application/json" -H "X-Auth-Token:$token"
HTTP/1.1 200 OK
Content-Type: application/json; charset=UTF-8
Content-Length: 14
X-Openstack-Request-Id: req-82ed8ccc-da9d-46d9-8fd9-beb01a24385b
Date: Wed, 08 Feb 2017 11:09:13 GMT {"tigers": []}

It work

how to read openstack code: service plugin的更多相关文章

  1. how to read openstack code: Core plugin and resource extension

    本章我们将写一个自己的core plugin 和一个resource extension来加深理解.(阅读本文的前提是你已经理解了restful以及stevedore等内容) 什么是 core plu ...

  2. Service Plugin / Agent - 每天5分钟玩转 OpenStack(73)

    Core Plugin/Agent 负责管理核心实体:net, subnet 和 port.而对于更高级的网络服务,则由 Service Plugin/Agent 管理.Service Plugin ...

  3. jshint-eclipse: JavaScript Code Quality Plugin for Eclipse

    https://blog.oio.de/2012/03/26/jshint-eclipse-javascript-code-quality-plugin-for-eclipse/   techscou ...

  4. how to read openstack code: loading process

    之前我们了解了neutron的结构,plugin 和 extension等信息.这一章我们看一下neutron如何加载这些plugin和extension.也就是neutron的启动过程.本文涉及的代 ...

  5. how to read openstack code: action extension

    之前我们看过了core plugin, service plugin 还有resource extension. resource extension的作用是定义新的资源.而我们说过还有两种exten ...

  6. how to read openstack code: Neutron architecture

    今天这一章节非常重要.我们知道neutron是一个非常复杂的系统,由很多组件构成.研究这样一个复杂的系统,正确的顺序应该是现在宏观上对其整体结构有所了解,然后再由针对性的对其组件进行深入了解.本章要做 ...

  7. how to read openstack code

    本文的目的不是介绍openstack.我们这里假设你已经知道了openstack是什么,能够做什么.所以目的是介绍如何阅读openstack的代码.通过读代码来进一步学习openstack. 转载要求 ...

  8. OpenStack (1) - Keystone OpenStack Identity Service

    echo deb http://ubuntu-cloud.archive.canonical.com/ubuntu precise-updates/grizzly main >> /etc ...

  9. eclipse启动报错 Problems occurred when invoking code from plug-in: "org.eclipse.jface"

    eclipse在使用中可能会发生错误: Problems occurred when invoking code from plug-in: "org.eclipse.jface" ...

随机推荐

  1. 原创Couldn't read packet: Connection reset by peer 错误排查思路(推荐)

    作为一个运维 不是你懂多少知识才是你的价值 你有幸能遇到多少错误才是你的最大的价值 知识 你有我有大家有  错误我有你没有 这便是我的价值 我遇到一个错误 蛮难遇到的一个错误 所以想分享给大家 下面我 ...

  2. 大数据开发学习之构建Hadoop集群-(0)

    有多种方式来获取hadoop集群,包括从其他人获取或是自行搭建专属集群,抑或是从Cloudera Manager 或apach ambari等管理工具来构建hadoop集群等,但是由自己搭建则可以了解 ...

  3. SQLite – 删除表

    SQLite -删除表 SQLite DROP TABLE语句用于删除一个表定义和所有相关的数据,索引.触发器.约束和规范许可表. 你使用这个命令时必须小心,因为一旦一个表被删除然后表中所有可用的信息 ...

  4. index 定义 v-for 未使用变量 实际是没有 :key="index"

    需要有 :key="index" <Checkbox :label="item.key" :key="index" v-for=&qu ...

  5. json-server && axios

    json-server && axios vue2.0项目实战(3)使用axios发送请求 https://www.cnblogs.com/zhouyangla/p/6753673.h ...

  6. MySQL系列(二)--MySQL存储引擎

    影响数据库性能的因素: 1.硬件环境:CPU.内存.存盘IO.网卡流量等 2.存储引擎的选择 3.数据库参数配置(影响最大) 4.数据库结构设计和SQL语句 MySQL采用插件式存储引擎,可以自行选择 ...

  7. 日常[splay]:水题记——营业额统计

    没错这就是让我深陷splay之中的罪魁祸首,昨天打了一下午结果发现是玄学错误的那个 人生第一棵splay平衡树 题目大意:求一段序列,小于当前元素的最大值和大于当前元素的最小值.从该元素前面的元素找. ...

  8. 【传智播客】Libevent学习笔记(三):事件循环

    目录 00. 目录 01. event_base_loop函数 02. event_base_dispatch函数 03. event_base_loopexit函数 04. event_base_l ...

  9. mybatis-5 手写代理

    @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Select { public St ...

  10. iOS之绘制像素到屏幕

    译注:这篇文章虽然比较长,但是里面的内容还是很有价值的. 像素是如何绘制到屏幕上面的?把数据输出到屏幕的方法有很多,通过调用很多不同的framework和不同的函数.这里我们讲一下这个过程背后的东西. ...