Merge "Cinder/Neutron plugins in fuel"
This commit is contained in:
commit
7972b55774
808
specs/6.0/cinder-neutron-plugins-in-fuel.rst
Normal file
808
specs/6.0/cinder-neutron-plugins-in-fuel.rst
Normal file
@ -0,0 +1,808 @@
|
|||||||
|
..
|
||||||
|
This work is licensed under a Creative Commons Attribution 3.0 Unported
|
||||||
|
License.
|
||||||
|
|
||||||
|
http://creativecommons.org/licenses/by/3.0/legalcode
|
||||||
|
|
||||||
|
==========================================
|
||||||
|
Cinder/Neutron plugins in fuel
|
||||||
|
==========================================
|
||||||
|
|
||||||
|
https://blueprints.launchpad.net/fuel/+spec/cinder-neutron-plugins-in-fuel
|
||||||
|
|
||||||
|
Cloud operators want to extend and change behavior of Fuel in order to
|
||||||
|
do that, Fuel should provide plugin mechanism.
|
||||||
|
|
||||||
|
Problem description
|
||||||
|
===================
|
||||||
|
|
||||||
|
Sometimes Fuel user wants to extend Fuel to install Cinder/Neutron
|
||||||
|
plugin. Right now user changes the code of Fuel services rebuilds
|
||||||
|
and adds repositories manually.
|
||||||
|
|
||||||
|
The current approach causes a lot of problems:
|
||||||
|
|
||||||
|
* user has to support all the patches
|
||||||
|
* also he has to apply all the patches manually after Fuel upgrade
|
||||||
|
|
||||||
|
Proposed change
|
||||||
|
================
|
||||||
|
|
||||||
|
List of terms
|
||||||
|
-------------
|
||||||
|
|
||||||
|
* `plugin` - archive which contains all required data, like
|
||||||
|
repositories for ubuntu, centos, metadata file with description
|
||||||
|
of plugin, scripts, etc
|
||||||
|
* `fpb` or `fuel-plugin-builder` - is fuel plugin builder, command
|
||||||
|
line tool which helps user to develop plugin, the code will be
|
||||||
|
in fuel-web repository
|
||||||
|
|
||||||
|
Requirements
|
||||||
|
------------
|
||||||
|
|
||||||
|
* user should be able to install simple Cinder/Neutron
|
||||||
|
plugins, "simple" means that plugin doesn't require
|
||||||
|
additional business logic, user can configure only
|
||||||
|
static data for settings tab
|
||||||
|
* plugin developer in the most cases should know nothing
|
||||||
|
about python/js/css/html
|
||||||
|
* plugin developer should have easy way to test his plugin
|
||||||
|
(he shouldn't reinstall his master node again and again to
|
||||||
|
test his plugin)
|
||||||
|
* plugin should be environment specific, it means that user
|
||||||
|
should be able to enable or disable plugins for specific
|
||||||
|
environment, plugin should be disabled for deployed environments
|
||||||
|
without possibility to enable it
|
||||||
|
|
||||||
|
Plugins constraints
|
||||||
|
-------------------
|
||||||
|
|
||||||
|
For the current release we have the next constraints:
|
||||||
|
|
||||||
|
* plugin cannot change business logic and should not contain
|
||||||
|
any python code
|
||||||
|
* plugin can provide additional attributes for environment, it cannot
|
||||||
|
remove or change existing information which we provide for orchestrator
|
||||||
|
* plugin cannot add new kernel
|
||||||
|
* plugin cannot change provisioning data
|
||||||
|
* user will not be able to enable plugin on deployed environment
|
||||||
|
* plugin cannot change or add new bootstrap image
|
||||||
|
* plugin cannot be uninstalled in the first feature release
|
||||||
|
* plugin cannot change existing database schema
|
||||||
|
* plugins will work on openstack releases after 6.0 Fuel release,
|
||||||
|
plugins won't work on 5.X openstack releases. This constraint
|
||||||
|
is related to changes in MCollective plugins
|
||||||
|
|
||||||
|
Plugins examples
|
||||||
|
----------------
|
||||||
|
|
||||||
|
* Neutron
|
||||||
|
|
||||||
|
* LBaaS https://wiki.openstack.org/wiki/Neutron/LBaaS
|
||||||
|
|
||||||
|
* Cinder
|
||||||
|
|
||||||
|
* GlusterFS http://bit.ly/1BDheDc , we are **not** going
|
||||||
|
to deploy GLusterFS nodes, the plugin will allow user
|
||||||
|
to configure cinder backend to use existed GlusterFS
|
||||||
|
cluster
|
||||||
|
|
||||||
|
Plugin development process
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Plugin developer will be able to develop plugin on his machine,
|
||||||
|
we will specify all requirements for environment, like version
|
||||||
|
of OS and additional dependencies.
|
||||||
|
|
||||||
|
* plugin developer installs all of the dependencies which are mentioned
|
||||||
|
in development document to prepare his env, like python, rpm, createrepo,
|
||||||
|
dpkg-dev
|
||||||
|
* plugin developer installs `fpb` command line tool
|
||||||
|
`pip install fuel-plugin-builder`
|
||||||
|
* plugin developer runs `fpb --create plugin-name`
|
||||||
|
* fpb creates new directory `plugin-name`, where he can see
|
||||||
|
the a basic structure of the plugin with in place documentation
|
||||||
|
* plugin developer adds his packages with all required dependencies
|
||||||
|
for ubuntu and centos
|
||||||
|
* sets the metadata, like version of the plugin, its description,
|
||||||
|
and versions of openstack releases
|
||||||
|
* then he runs `fpb --build plugin-name` from the plugin directory,
|
||||||
|
fpb checks, that all required fields are valid and all
|
||||||
|
required files are there, builds the repositories and generates
|
||||||
|
tar-ball
|
||||||
|
|
||||||
|
Note, `fpb` should provide `--debug` key to turn on debug information.
|
||||||
|
|
||||||
|
Checks and validation
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
`fpb` should perform checks during the plugin build
|
||||||
|
|
||||||
|
* check that metadata is correct
|
||||||
|
* deploymetn_scripts_path is exists for each release
|
||||||
|
* repositories_path is exists for each release
|
||||||
|
* tasks.yaml, check the structure
|
||||||
|
|
||||||
|
Plugin installation process
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
From user point of view:
|
||||||
|
|
||||||
|
* user downloads a fuel plugin
|
||||||
|
* runs `fuel plugins --install fuel-plugin-name-1.0.0.fp`,
|
||||||
|
and plugin is installed
|
||||||
|
|
||||||
|
Install script workflow:
|
||||||
|
|
||||||
|
* check if current fuel version is compatible with the plugin
|
||||||
|
* copy all the files in `/var/www/plugins/plugin_name-plugin_version`
|
||||||
|
* via rest api create plugin in nailgun
|
||||||
|
|
||||||
|
Plugin archive structure
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
This structure should be generated by `fpb` script.
|
||||||
|
|
||||||
|
.. code-block:: text
|
||||||
|
|
||||||
|
.
|
||||||
|
|-- deployment_scripts
|
||||||
|
| `-- deploy.sh
|
||||||
|
|-- environment_config.yaml
|
||||||
|
|-- LICENSE
|
||||||
|
|-- metadata.yaml
|
||||||
|
|-- pre_build_hook
|
||||||
|
|-- README.md
|
||||||
|
|-- repositories
|
||||||
|
| |-- centos
|
||||||
|
| | `-- .gitkeep
|
||||||
|
| `-- ubuntu
|
||||||
|
| `-- .gitkeep
|
||||||
|
`-- tasks.yaml
|
||||||
|
|
||||||
|
Here is detailed description of some of the files:
|
||||||
|
|
||||||
|
**metadata.yaml file**
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
# Plugin name
|
||||||
|
name: fuel_awesome_plugin
|
||||||
|
# Plugin version
|
||||||
|
version: 0.1.0
|
||||||
|
# Description
|
||||||
|
description: Enable to use plugin X for Neutron
|
||||||
|
# Required fuel version
|
||||||
|
fuel_version: '6.0'
|
||||||
|
|
||||||
|
# The plugin is compatible with releases in the list
|
||||||
|
releases:
|
||||||
|
- os: ubuntu
|
||||||
|
version: 2014.2-6.0
|
||||||
|
# User can specify if his plugin is ha compatible or not
|
||||||
|
mode: ['ha', 'multinode']
|
||||||
|
deployment_scripts_path: deployment_scripts/
|
||||||
|
repository_path: repositories/ubuntu
|
||||||
|
- os: centos
|
||||||
|
version: 2014.2-6.0
|
||||||
|
mode: ['ha', 'multinode']
|
||||||
|
deployment_scripts_path: deployment_scripts/
|
||||||
|
repository_path: repositories/centos
|
||||||
|
# If plugin can work with several openstack releases
|
||||||
|
# user can define different directories with packages
|
||||||
|
# and deployment scripts, at the same time he can specify
|
||||||
|
# the same directory for all of the versions, it depends
|
||||||
|
# on plugin implementation
|
||||||
|
- os: centos
|
||||||
|
version: 2014.2-7.0
|
||||||
|
mode: ['multinode']
|
||||||
|
deployment_scripts_path: 7.0/deployment_scripts/
|
||||||
|
repository_path: 7.0/repositories/centos
|
||||||
|
|
||||||
|
# Version of package format
|
||||||
|
package_version: '1.0.0'
|
||||||
|
|
||||||
|
**environment_config.yaml**
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
attributes:
|
||||||
|
fuel_simple_port:
|
||||||
|
value: 2333
|
||||||
|
label: 'Port'
|
||||||
|
description: 'Port which be used for service binding'
|
||||||
|
weight: 25
|
||||||
|
type: "text"
|
||||||
|
|
||||||
|
fuel_simple_host:
|
||||||
|
value: 0.0.0.0
|
||||||
|
label: 'Host'
|
||||||
|
description: 'Host which be used for service binding'
|
||||||
|
weight: 10
|
||||||
|
type: "text"
|
||||||
|
|
||||||
|
|
||||||
|
**tasks format description**
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
# Roles which the task should be applied on
|
||||||
|
- role: ['controller', 'cinder']
|
||||||
|
stage: pre_deployment
|
||||||
|
type: shell
|
||||||
|
parameters:
|
||||||
|
cmd: configure_glusterfs.sh
|
||||||
|
timeout: 42
|
||||||
|
# Task is applied for all roles
|
||||||
|
- role: "*"
|
||||||
|
stage: post_deployment
|
||||||
|
type: puppet
|
||||||
|
parameters:
|
||||||
|
puppet_manifest: cinder_glusterfs.pp
|
||||||
|
puppet_modules: modules
|
||||||
|
timeout: 42
|
||||||
|
|
||||||
|
Directories structure on the master node
|
||||||
|
----------------------------------------
|
||||||
|
|
||||||
|
Directory `/var/www/plugins` which contains all
|
||||||
|
of the plugins, should be mounted to the next containers.
|
||||||
|
|
||||||
|
* rsync - for puppet manifests
|
||||||
|
* nailgun - to extend nailgun
|
||||||
|
* nginx - is required for repositories
|
||||||
|
|
||||||
|
Plugins upgrade
|
||||||
|
---------------
|
||||||
|
|
||||||
|
User wants to be able to upgrade his plugin, if there will be some new
|
||||||
|
plugin with updated version of package or other bug fixes.
|
||||||
|
For the current version we **don't** provide any upgrade mechanism
|
||||||
|
for plugins. In theory we could use this mechanism if openstack patching
|
||||||
|
feature was not experimental.
|
||||||
|
|
||||||
|
Alternatives
|
||||||
|
------------
|
||||||
|
|
||||||
|
There are a lot of alternatives, the best of them are described
|
||||||
|
in `Future improvements` section and will be implemented later.
|
||||||
|
|
||||||
|
Future improvements (not for 6.0)
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
Plugin manager
|
||||||
|
^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Separate services which keeps information about all of the plugins
|
||||||
|
in the system, it should know how to install or delete plugins.
|
||||||
|
We will use this service instead of install script to install the
|
||||||
|
plugins.
|
||||||
|
|
||||||
|
Plugins which change business logic
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Nailgun drivers and hooks which will provide a way to change
|
||||||
|
deployment/provisioning data for orchestrator.
|
||||||
|
Also it will be possible to add new role.
|
||||||
|
|
||||||
|
UI plugins
|
||||||
|
^^^^^^^^^^
|
||||||
|
|
||||||
|
Add new step in wizard, add new tab, for cluster env, add new settings
|
||||||
|
window for node configuration.
|
||||||
|
|
||||||
|
Plugins which implement separate service
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
User will be able to install any service on the master node,
|
||||||
|
the good example of such kind of plugins is OSTF.
|
||||||
|
|
||||||
|
Users requirements for Fuel plugins
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
General use cases:
|
||||||
|
|
||||||
|
* ability to execute custom puppet code during deployment state
|
||||||
|
(ideally on any stage not only as a post deployment step)
|
||||||
|
* ability to execute custom python code in Nailgun
|
||||||
|
|
||||||
|
* Define custom roles and node priorities
|
||||||
|
* Provisioning serialization
|
||||||
|
* Deployment serialization
|
||||||
|
* Post deployment orchestration
|
||||||
|
|
||||||
|
* ability to execute custom java script code
|
||||||
|
* ability to modify UI
|
||||||
|
* ability to add custom deb/rpm packages
|
||||||
|
* ability to change and extend node specific parameters
|
||||||
|
|
||||||
|
More specific use cases:
|
||||||
|
|
||||||
|
* Swift standalone installation: custom roles, priorities, UI changes
|
||||||
|
* Add neutron plugin: custom puppet modules, UI changes
|
||||||
|
* Custom monitoring schema: UI, priorities, puppet
|
||||||
|
* Custom Cinder driver: UI, puppet
|
||||||
|
* Cinder multibackend: UI, puppet
|
||||||
|
* Add package that require reboot: provisioning customization
|
||||||
|
|
||||||
|
Plugins distribution and management
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
* user should be able to define dependencies between plugins,
|
||||||
|
it means that one plugin can require another to be installed
|
||||||
|
* user should be able to define conflicts between plugins,
|
||||||
|
it means that particular plugin cannot be installed on
|
||||||
|
the same master node with another plugin
|
||||||
|
* plugin system should be able recursively retrieve all of
|
||||||
|
the dependency and check that all of the subplugins
|
||||||
|
are compatibele with each other and with the current
|
||||||
|
version of master node
|
||||||
|
* plugins update
|
||||||
|
|
||||||
|
Nodes management hooks
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
* post_node_deletion - execute after node is deleted
|
||||||
|
* pre_node_deletion - execute before node is deleted
|
||||||
|
|
||||||
|
|
||||||
|
fpb command line interface
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
* before build check that packages dependencies are
|
||||||
|
compatibele with openstack releases dependencies,
|
||||||
|
in order to do that, `fpb` should have access to
|
||||||
|
all of the repositories
|
||||||
|
|
||||||
|
Data model impact
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
There will be new model in nailgun, `Plugins` with many to many
|
||||||
|
relation to `Cluster` model.
|
||||||
|
Model for many to many relation `ClustersPlugins` will be used in
|
||||||
|
order to disable or enable plugin for specific environment.
|
||||||
|
|
||||||
|
**Plugins**
|
||||||
|
|
||||||
|
* `id` - unique identificator
|
||||||
|
* `name` - plugin name
|
||||||
|
* `version` - plugin version
|
||||||
|
* `description` - plugin description
|
||||||
|
* `fuel_version` - requires specified fuel version
|
||||||
|
* `openstack_releases` - is a list of strings with releases
|
||||||
|
|
||||||
|
**ClustersPlugins**
|
||||||
|
|
||||||
|
* `id` - record id
|
||||||
|
* `plugins.id` - plugin id
|
||||||
|
* `clusters.id` - cluster id
|
||||||
|
|
||||||
|
REST API impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
**GET /api/v1/plugins/**
|
||||||
|
|
||||||
|
Returns the list of plugins
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "plugin_name",
|
||||||
|
"version": "1.0",
|
||||||
|
"description": "Enable to add X plugin to Neutron",
|
||||||
|
"fuel_version": "6.0",
|
||||||
|
"package_version": "1",
|
||||||
|
"releases": [
|
||||||
|
{
|
||||||
|
"os": "ubuntu",
|
||||||
|
"version": "2014.2-6.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"os": "centos",
|
||||||
|
"version": "2014.2-6.0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
**POST /api/v1/plugins/**
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "plugin_name",
|
||||||
|
"version": "1.0",
|
||||||
|
"description": "Enable to add X plugin to Neutron",
|
||||||
|
"fuel_version": "6.0",
|
||||||
|
"package_version": "1",
|
||||||
|
"releases": [
|
||||||
|
{
|
||||||
|
"os": "ubuntu",
|
||||||
|
"version": "2014.2-6.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"os": "centos",
|
||||||
|
"version": "2014.2-6.0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
**GET /api/v1/plugins/1/**
|
||||||
|
|
||||||
|
Get the information about specific plugin, where 1 is id of the plugin
|
||||||
|
|
||||||
|
.. code-block:: json
|
||||||
|
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"name": "plugin_name",
|
||||||
|
"version": "1.0",
|
||||||
|
"description": "Enable to add X plugin to Neutron",
|
||||||
|
"fuel_version": "6.0",
|
||||||
|
"package_version": "1",
|
||||||
|
"releases": [
|
||||||
|
{
|
||||||
|
"os": "ubuntu",
|
||||||
|
"version": "2014.2-6.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"os": "centos",
|
||||||
|
"version": "2014.2-6.0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
**PATCH /api/v1/plugins/1/**
|
||||||
|
|
||||||
|
Update specified attributes for plugin
|
||||||
|
|
||||||
|
Accepts the same format as response from `GET` request.
|
||||||
|
|
||||||
|
**PUT /api/v1/plugins/1/**
|
||||||
|
|
||||||
|
Update all of the attributes
|
||||||
|
|
||||||
|
Accepts the same format as response from `GET` request.
|
||||||
|
|
||||||
|
**DELETE /api/v1/plugins/1/**
|
||||||
|
|
||||||
|
Remove a plugin from DB, should have validation which
|
||||||
|
returns the error, if plugin is used by some environment.
|
||||||
|
|
||||||
|
Validation should be disabled if plugin deletion is performed
|
||||||
|
with `force` parameter in url. It will be required for development.
|
||||||
|
|
||||||
|
Orchestration (astute) RPC format
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
As it was described above, user specifies the structure like this
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
- role: ['controller', 'cinder']
|
||||||
|
stage: pre_deployment
|
||||||
|
type: shell
|
||||||
|
parameters:
|
||||||
|
cmd: configure_glusterfs.sh
|
||||||
|
timeout: 42
|
||||||
|
- role: *
|
||||||
|
stage: post_deployment
|
||||||
|
type: puppet
|
||||||
|
parameters:
|
||||||
|
puppet_manifest: cinder_glusterfs.pp
|
||||||
|
puppet_modules: modules
|
||||||
|
timeout: 42
|
||||||
|
|
||||||
|
Then nailgun configures this data in the next format
|
||||||
|
|
||||||
|
.. code-block:: yaml
|
||||||
|
|
||||||
|
# This stages should be run after astute yaml for role
|
||||||
|
# and repositories are on the slaves
|
||||||
|
pre_deployment:
|
||||||
|
# Add new repo
|
||||||
|
- # This task will be autogenerated by nailgun
|
||||||
|
type: upload_file
|
||||||
|
uids: [1, 2, 3]
|
||||||
|
priority: 0
|
||||||
|
parameters:
|
||||||
|
path: /etc/apt/sources.list.d/plugin_name-1.0
|
||||||
|
data: the file data
|
||||||
|
# Overwrite already existed file?
|
||||||
|
overwrite: true
|
||||||
|
# Create intermediate directories as required
|
||||||
|
parents: true
|
||||||
|
# File permission
|
||||||
|
permissions: '0644'
|
||||||
|
# User owner
|
||||||
|
user_owner: 'root'
|
||||||
|
# Group owner
|
||||||
|
group_owner: 'root'
|
||||||
|
# What permissions should be set for folder
|
||||||
|
dir_permissions: '0644'
|
||||||
|
- # This task will be autogenerated by nailgun
|
||||||
|
type: sync
|
||||||
|
uids: [1, 2, 3]
|
||||||
|
priority: 1
|
||||||
|
parameters:
|
||||||
|
src: rsync:///var/www/nailgun/plugins/plugin_name-1.0/scripts
|
||||||
|
dst: /etc/fuel/plugins/plugin_name-1.0/scripts
|
||||||
|
- type: shell
|
||||||
|
uids: [1, 2, 3]
|
||||||
|
priority: 10
|
||||||
|
parameters:
|
||||||
|
cmd: configure_glusterfs.sh
|
||||||
|
timeout: 42
|
||||||
|
# This parameter should be autogenerated by nailgun
|
||||||
|
cwd: /etc/fuel/plugins/plugin_name-1.0
|
||||||
|
post_deployment:
|
||||||
|
- type: puppet
|
||||||
|
uids: [1, 2, 3, 4, 5, 6]
|
||||||
|
priority: 20
|
||||||
|
parameters:
|
||||||
|
puppet_manifest: cinder_glusterfs.pp
|
||||||
|
puppet_modules: modules
|
||||||
|
timeout: 42
|
||||||
|
# This parameter should be autogenerated by nailgun
|
||||||
|
cwd: /etc/fuel/plugins/plugin_name-1.0
|
||||||
|
deployment_info:
|
||||||
|
# Here is deployment information in the same format
|
||||||
|
# as it is now
|
||||||
|
|
||||||
|
In the first release orchestrator should **fail deployment** if
|
||||||
|
one of the tasks is not executed successfully.
|
||||||
|
|
||||||
|
Deployment scripts
|
||||||
|
------------------
|
||||||
|
|
||||||
|
Plugin developer can use any bash scripts or
|
||||||
|
puppet manifests in order to perform plugin
|
||||||
|
installation, here is a list of requirements
|
||||||
|
for the scripts
|
||||||
|
|
||||||
|
* if user wants the script to be executed it
|
||||||
|
should has right permission and executable
|
||||||
|
flag
|
||||||
|
* if user uses puppet for plugins installation
|
||||||
|
he should provide puppet manifests and modules
|
||||||
|
in his plugin
|
||||||
|
* scripts should not brake anything if they were
|
||||||
|
run several times
|
||||||
|
|
||||||
|
Nailgun implementation
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Nailgun should provide ability to mix new environment attributes
|
||||||
|
which are required for plugin configuration
|
||||||
|
|
||||||
|
Also nailgun should extend default deployment/patching tasks with tasks
|
||||||
|
for pre and post deployment hooks, where should be specified paths
|
||||||
|
to scripts directory on the master node
|
||||||
|
|
||||||
|
For each plugin nailgun generates separate section with checkbox to
|
||||||
|
show it on UI.
|
||||||
|
|
||||||
|
UI implementation
|
||||||
|
^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
It is not required to add new logic on UI tab, nailgun generates
|
||||||
|
checkbox for each plugin on settings tab, so user can enable or
|
||||||
|
disable particular plugin and configure it.
|
||||||
|
|
||||||
|
Upgrade impact
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Current release
|
||||||
|
^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
Because we don't have any python code in our plugins, plugin will depend on
|
||||||
|
openstack release, we don't delete releases, as result it's not necessary
|
||||||
|
to check if plugin is compatible with the current version of fuel.
|
||||||
|
Also plugin is stored on shared volume which we mount to nailgun container.
|
||||||
|
|
||||||
|
Future releases
|
||||||
|
^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
When we get plugins with python code, in upgrade script we will have to
|
||||||
|
check if plugins are compatible with the new version of fuel, if they
|
||||||
|
aren't compatible, upgrade script should show the message with the list
|
||||||
|
of incompatible plugins and it should fail the upgrade.
|
||||||
|
If user wants to perform upgrade, he should provide the directory with
|
||||||
|
new plugins, which will be updated during the upgrade, or user should
|
||||||
|
delete plugins which he doesn't use.
|
||||||
|
|
||||||
|
Security impact
|
||||||
|
---------------
|
||||||
|
|
||||||
|
This feature has a huge security impact because the user will be able
|
||||||
|
to execute any command on slave nodes.
|
||||||
|
Security is included in acceptance criteria of plugins certification,
|
||||||
|
see `Plugins certification` section.
|
||||||
|
|
||||||
|
Notifications impact
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
Installation script will create notification after plugin is installed.
|
||||||
|
|
||||||
|
Other end user impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
User should be able to disable or enable plugin for specific environment.
|
||||||
|
|
||||||
|
Performance Impact
|
||||||
|
------------------
|
||||||
|
|
||||||
|
**Deployment**
|
||||||
|
|
||||||
|
* there will not be any impacts if user doesn't have enabled plugins
|
||||||
|
* if user has enabled plugins for environment, there will be performance
|
||||||
|
impact, the time of deployment will be increased, the increasing time
|
||||||
|
depends on the way how plugin is written
|
||||||
|
|
||||||
|
**Nailgun**
|
||||||
|
|
||||||
|
* we assume that there will not be any notable performance impact, in hooks
|
||||||
|
we will have to enable merging of custom attributes in case if plugin is
|
||||||
|
enabled for environment, the list of the plugins can be gotten within a
|
||||||
|
single database query
|
||||||
|
|
||||||
|
Also performance is added as acceptance criteria for core plugins,
|
||||||
|
see `Plugins certification` section.
|
||||||
|
|
||||||
|
Other deployer impact
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Plugin developer will be able to execute pre/post deployment hooks for
|
||||||
|
the environment.
|
||||||
|
|
||||||
|
Changes which are required in astute:
|
||||||
|
|
||||||
|
* add several repositories (should be ready, testing is required)
|
||||||
|
* add posibility to rsync specific directories from master to slave
|
||||||
|
* add hooks execution before and after puppet run
|
||||||
|
|
||||||
|
Plugins certification
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
The topic isn't covered by this document, separate document needs
|
||||||
|
to be created.
|
||||||
|
|
||||||
|
Items which should be reviewed during plugin certification:
|
||||||
|
|
||||||
|
* Security review
|
||||||
|
* Performance review
|
||||||
|
* Compatibility with other plugins in core
|
||||||
|
* Plugins upgrade
|
||||||
|
* Check that plugin works fine in case of openstack patching
|
||||||
|
|
||||||
|
After plugin is certified user should be able to add plugin in our
|
||||||
|
plugins repository.
|
||||||
|
|
||||||
|
Cerified plugin code repository
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
User should not follow fuel's workflow in development, as result they
|
||||||
|
can have their own repositories with code
|
||||||
|
|
||||||
|
Cerified plugin repository
|
||||||
|
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
We should provide repository with built plugins where user will be able to
|
||||||
|
download plugin.
|
||||||
|
|
||||||
|
Core plugins
|
||||||
|
------------
|
||||||
|
|
||||||
|
Core plugin is a plugin which is developed and supported by fuel team.
|
||||||
|
They can or cannot be included in an iso. Build system should has
|
||||||
|
config with a list of built-in plugins.
|
||||||
|
|
||||||
|
Fuel CI
|
||||||
|
^^^^^^^
|
||||||
|
|
||||||
|
* generate plugins on each patch to fuel-plugins repository
|
||||||
|
* generate plugins after patch is merged to the master
|
||||||
|
* run system tests with master's plugins
|
||||||
|
|
||||||
|
Developer impact
|
||||||
|
----------------
|
||||||
|
|
||||||
|
Features design impacts:
|
||||||
|
|
||||||
|
* any new feature should be considered to be a plugin
|
||||||
|
* features should be designed to be extendable
|
||||||
|
|
||||||
|
Development impacts:
|
||||||
|
|
||||||
|
* we should try not to break compatibility with plugins, it should be
|
||||||
|
very easy for plugins developer to make migration from previous
|
||||||
|
version of Fuel to new one
|
||||||
|
|
||||||
|
Implementation
|
||||||
|
==============
|
||||||
|
|
||||||
|
Assignee(s)
|
||||||
|
-----------
|
||||||
|
|
||||||
|
Primary assignee:
|
||||||
|
|
||||||
|
* eli@mirantis.com - developer, feature lead
|
||||||
|
* nmarkov@mirantis.com - python developer
|
||||||
|
|
||||||
|
Other contributors:
|
||||||
|
|
||||||
|
* sbogatkin@mirantis.com - deployment engineer
|
||||||
|
* vsharshov@mirantis.com - orchestrator developer
|
||||||
|
* aurlapova@mirantis.com, tleontovich@mirantis.com - QA engineers
|
||||||
|
* skulanov@mirantis.com - devops engineer (plugins distribution)
|
||||||
|
|
||||||
|
Work Items
|
||||||
|
----------
|
||||||
|
|
||||||
|
* Plugin creation tools - creates plugin skeleton, builds the plugin,
|
||||||
|
also it should provide installation script
|
||||||
|
|
||||||
|
* Nailgun - should provide ability to enable/disable plugins
|
||||||
|
for specific environments, also it should read plugin's attributes
|
||||||
|
and merge them on the fly
|
||||||
|
|
||||||
|
* Nailgun/Orchestrator - nailgun should provide post/pre deploy tasks
|
||||||
|
for orchestrator, orchestrator should provide post/pre deploy hooks
|
||||||
|
|
||||||
|
* UI - ability to enable/disable plugin for specific environment
|
||||||
|
|
||||||
|
* Fuel CLI - list/enable/disable/configure plugins for environment
|
||||||
|
|
||||||
|
Dependencies
|
||||||
|
============
|
||||||
|
|
||||||
|
Nailgun dependencies:
|
||||||
|
|
||||||
|
* SQLAlchemy==0.9.4
|
||||||
|
|
||||||
|
Testing
|
||||||
|
=======
|
||||||
|
|
||||||
|
There will be several core plugins, which QA team will be able
|
||||||
|
to install and test.
|
||||||
|
|
||||||
|
For neutron it will be LBaaS plugin, for Cinder it will be GlusterFS backend.
|
||||||
|
|
||||||
|
Also it will be required to have infrastructure, where plugin developer
|
||||||
|
will be able to test his plugins. He should have ability to specify plugin
|
||||||
|
url and the set of plugins, which he would like to run tests with.
|
||||||
|
|
||||||
|
Also we can have core plugins, which should be included in our testing cycle,
|
||||||
|
it means that we should run system tests with plugins, and also run plugins
|
||||||
|
specific tests.
|
||||||
|
|
||||||
|
Documentation Impact
|
||||||
|
====================
|
||||||
|
|
||||||
|
* how to create a plugin
|
||||||
|
* how to test a plugin
|
||||||
|
* how to debug a plugin
|
||||||
|
* how to add a plugin in core repository and how to perform testing
|
||||||
|
* documentation for plugin user, where will be the information where to take
|
||||||
|
a plugin
|
||||||
|
* how to install a plugin
|
||||||
|
|
||||||
|
References
|
||||||
|
==========
|
||||||
|
|
||||||
|
* Nailgun, Ceph as a plugin - https://review.openstack.org/#/c/123840/
|
||||||
|
* Fuel design summit 2014 -
|
||||||
|
https://etherpad.openstack.org/p/fuel-meetup-2014-pluggable-architecture
|
||||||
|
* User customization requests -
|
||||||
|
https://etherpad.openstack.org/p/fuel-plugins-cloud-operators-feedback
|
||||||
|
* Users complaints about fuel customization - http://bit.ly/1rz4X2B
|
||||||
|
* Neutron plugins - https://wiki.openstack.org/wiki/Neutron#Plugins
|
||||||
|
* Cinder plugins - https://wiki.openstack.org/wiki/CinderSupportMatrix
|
||||||
|
* Plugins certification meeting -
|
||||||
|
https://etherpad.openstack.org/p/cinder-neutron-plugins-certification
|
||||||
|
* fuel plugins repository - https://github.com/stackforge/fuel-plugins
|
Loading…
Reference in New Issue
Block a user