Import the project

This is really a merge with squash from another repository.  See the
previous history at:
<https://github.com/SmartInfrastructures/fuel-plugin-calamari/tree/pre-gerrit>

Change-Id: Ib989d46ce24398a652cb0218e8db9890cf3590e6
This commit is contained in:
Daniele Pizzolli 2015-11-04 10:48:19 +01:00
parent 6aaede0bfb
commit 6802915d89
56 changed files with 3129 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
.tox
.build
*.pyc
/doc/build/
/fuel-plugin-calamari-*.noarch*.rpm
/fuel-plugin-calamari-*.pdf

202
LICENSE Normal file
View File

@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "{}"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright {yyyy} {name of copyright owner}
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

120
README.md Normal file
View File

@ -0,0 +1,120 @@
fuel-plugin-calamari
====================
Intro
-----
This is an working implementation for a plugin that will install
[calamari console for ceph](https://ceph.com/category/calamari/) on a
os-base node with fuel.
Usage
-----
Please look at the [install guide](doc/source/installation-guide.rst)
and [user guide](doc/source/user-guide.rst).
Version installed
-----------------
The =fuel-camari-plugin= installs the following packages:
- For Ubuntu:
- calamari-clients 1.2.2-32-g931ee58
- calamari-server 1.0.0-1
- diamond 3.1.0
- python-msgpack-python 1.0
- For CentOS:
- calamari-clients 1.3-rc_12_g7d36e29.el6
- calamari-server 1.3.0.1-11_g9fb65ae.el6
- diamond 3.4.67-1.noarch.rpm
- libcairo 1.14.2-alt1
- pycairo 1.8.6-2.1.el6
- supervisor 3.0.el6
Testing
-------
A simple install script tested with the default values of the
[virtualbox
script](https://github.com/stackforge/fuel-main/blob/master/virtualbox/README.md)
is available once the plugin is installed. It requires a clean
environment with at least 4 unallocated nodes.
Run with the following:
```
cd /var/www/nailgun/plugins/fuel-plugin-calamari-1.0/test/
./simple-install
```
Debugging
---------
The following commands may be helpful:
```
# On the controllers and ceph-osd nodes
puppet apply --debug \
--modulepath=/etc/fuel/plugins/fuel-plugin-calamari-1.0/puppet/modules:/etc/puppet/modules \
/etc/fuel/plugins/fuel-plugin-calamari-1.0/puppet/manifests/calamari-agent.pp
# On the calamari node
puppet apply /etc/puppet/modules/osnailyfacter/modular/netconfig/netconfig.pp
puppet apply --debug \
--modulepath=/etc/fuel/plugins/fuel-plugin-calamari-1.0/puppet/modules:/etc/puppet/modules \
/etc/fuel/plugins/fuel-plugin-calamari-1.0/puppet/manifests/calamari-server.pp
```
TODO list
---------
- Salt change the ceph configuration:
Here is the diff in /etc:
diff --git a/ceph/ceph.conf b/ceph/ceph.conf
index 17c676a..cf2f502 100644
--- a/ceph/ceph.conf
+++ b/ceph/ceph.conf
@@ -1,4 +1,5 @@
[global]
+osd crush location hook = /usr/bin/calamari-crush-location
fsid = 783fcc91-e95d-4ce3-b9c2-0a414a4751d3
mon_initial_members = node-1
mon_host = 192.168.0.3
diff --git a/default/diamond b/default/diamond
index deda518..c936044 100644
--- a/default/diamond
+++ b/default/diamond
@@ -9,4 +9,4 @@
# Additional options that are passed to the Daemon.
ENABLE_DIAMOND="yes"
DIAMOND_PID="/var/run/diamond.pid"
-DIAMOND_USER="diamond"
+DIAMOND_USER="root"
- Do the conf changes will step over puppet? How can we manage salt
and puppet to not step on each other?
- Figure out how to do proper testing and CI (we do not have hardware
resources for this)
- Reproducible build of the packages included in the plugin.
- UI: Does make sense to enable the plugin only if there is some ceph
depoyed?
- What happens in case of node ceph node addition?
What happens in case of node ceph node removal?
The puppet code is executed in the new node. But not on the
calamari server. This blueprint addressed the problem:
https://blueprints.launchpad.net/fuel/+spec/fuel-task-notify-other-nodes

View File

@ -0,0 +1 @@
include fuel_plugin_calamari::agent::init

View File

@ -0,0 +1,3 @@
if($::osfamily == 'Redhat') {
include fuel_plugin_calamari::centos_salt::init
}

View File

@ -0,0 +1,3 @@
if 'calamari' == hiera('user_node_name') {
include fuel_plugin_calamari::server::init
}

View File

@ -0,0 +1,5 @@
if 'calamari' == hiera('user_node_name') {
if($::osfamily == 'Redhat') {
include fuel_plugin_calamari::centos_salt::complete_centos
}
}

View File

@ -0,0 +1,3 @@
if($::osfamily == 'Redhat') {
include fuel_plugin_calamari::centos_salt::restart
}

View File

@ -0,0 +1,11 @@
name 'fuel_plugin_calamari'
version '0.1.0'
source 'UNKNOWN'
author 'fuel'
license 'Apache License, Version 2.0'
summary 'UNKNOWN'
description 'UNKNOWN'
project_page 'UNKNOWN'
## Add dependencies, if any:
# dependency 'username/name', '>= 1.2.0'

View File

@ -0,0 +1,16 @@
fuel_plugin_calamari
This is the fuel_plugin_calamari module.
License
-------
Contact
-------
Support
-------
Please log tickets and issues at our [Projects site](https://github.com/stackforge/fuel-plugin-calamari)

View File

@ -0,0 +1,91 @@
"""
Wrap all our salt imports into one module. We do this
to make it clear which parts of the salt API (or internals)
we are touching, and to make it easy to globally handle a
salt ImportError e.g. for building docs in lightweight
environment.
"""
import gevent
import logging
try:
try:
from salt.client import condition_kwarg
except ImportError:
# Salt moved this in 382dd5e
from salt.utils.args import condition_input as condition_kwarg
from salt.client import LocalClient # noqa
from salt.utils.event import MasterEvent # noqa
from salt.key import Key # noqa
from salt.config import master_config # noqa
from salt.utils.master import MasterPillarUtil # noqa
from salt.config import client_config # noqa
try:
from salt.loader import _create_loader
except ImportError:
# Salt removed this in b0e1425
from salt.loader import static_loader as _create_loader
except ImportError:
condition_kwarg = None
LocalClient = None
MasterEvent = None
Key = None
master_config = None
MasterPillarUtil = None
client_config = lambda x: None
_create_loader = None
class SaltEventSource(object):
"""
A wrapper around salt's MasterEvent class that closes and re-opens
the connection if it goes quiet for too long, to ward off mysterious
silent-death of communications (#8144)
"""
# Not a logical timeout, just how long we stick inside a get_event call
POLL_TIMEOUT = 5
# After this long without messages, close and reopen out connection to
# salt-master. Don't want to do this gratuitously because it can drop
# messages during the cutover (lossiness is functionally OK but user
# might notice).
SILENCE_TIMEOUT = 20
def __init__(self, logger, config):
"""
:param config: a salt client_config instance
"""
# getChild isn't in 2.6
self._log = logging.getLogger('.'.join((logger.name, 'salt')))
self._silence_counter = 0
self._config = config
self._master_event = MasterEvent(self._config['sock_dir'])
def _destroy_conn(self, old_ev):
old_ev.destroy()
def get_event(self, *args, **kwargs):
"""
Wrap MasterEvent.get_event
"""
ev = self._master_event.get_event(self.POLL_TIMEOUT, *args, **kwargs)
if ev is None:
self._silence_counter += self.POLL_TIMEOUT
if self._silence_counter > self.SILENCE_TIMEOUT:
self._log.warning("Re-opening connection to salt-master")
self._silence_counter = 0
# Re-open the connection as a precaution against this lack of
# messages being a symptom of a connection that has gone bad.
old_ev = self._master_event
gevent.spawn(lambda: self._destroy_conn(old_ev))
self._master_event = MasterEvent(self._config['sock_dir'])
else:
self._silence_counter = 0
return ev

View File

@ -0,0 +1,34 @@
# Copyright 2015 CREATE-NET
#
# Licensed under the Apache License, Version 2.0 (the "License"); you
# may not use this file except in compliance with the License. You may
# obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing
# permissions and limitations under the License.
class fuel_plugin_calamari::agent::init {
notice('Starting calamari-agent manifest')
include fuel_plugin_calamari::agent::params
package { $fuel_plugin_calamari::agent::params::packages:
ensure => present,
}->
file { $fuel_plugin_calamari::agent::params::salt_file:
ensure => file,
content => "master: ${fuel_plugin_calamari::agent::params::calamari_ip}"
}~>
service{ $fuel_plugin_calamari::agent::params::services:
enable => true,
}
notice('End of calamari-agent manifest')
}

View File

@ -0,0 +1,38 @@
# == Class: fuel_plugin_calamari::agent::params
#
# A basic class for calamari plugin params
#
class fuel_plugin_calamari::agent::params {
if($::osfamily == 'Redhat') {
$salt_file = '/etc/salt/minion'
$packages = ['diamond', 'salt-minion']
$services = ['salt-minion']
} elsif($::osfamily == 'Debian') {
$salt_file = '/etc/salt/minion.d/calamari.conf'
$packages = ['diamond', 'salt-minion']
$services = ['salt-minion']
} else {
fail("Unsupported osfamily ${::osfamily}")
}
# Search for the calamari ip address from user_node_name and use the
# first one
$calamari_nodes = filter_nodes(hiera('nodes'), 'user_node_name', 'calamari')
if size($calamari_nodes) < 1 {
fail('Could not find node "calamari" in the environment')
}
# TODO: figure out if this ip is in the correct network
$calamari_ip = $calamari_nodes[0]['internal_address']
}

View File

@ -0,0 +1,26 @@
# Copyright 2015 CREATE-NET
#
# Licensed under the Apache License, Version 2.0 (the "License"); you
# may not use this file except in compliance with the License. You may
# obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing
# permissions and limitations under the License.
class fuel_plugin_calamari::centos_salt::complete_centos {
exec { 'salt accept keys':
command => 'salt-key --yes --accept-all',
path => '/usr/local/sbin/:/usr/bin:/usr/sbin:/bin/:/sbin/',
}
exec { 'restart cthulhu':
command => 'supervisorctl restart cthulhu',
path => '/usr/local/sbin/:/usr/bin:/usr/sbin:/bin/:/sbin/',
}
}

View File

@ -0,0 +1,31 @@
# Copyright 2015 CREATE-NET
#
# Licensed under the Apache License, Version 2.0 (the "License"); you
# may not use this file except in compliance with the License. You may
# obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing
# permissions and limitations under the License.
class fuel_plugin_calamari::centos_salt::init {
notice('Starting centos_salt manifest')
include fuel_plugin_calamari::centos_salt::params
package { $fuel_plugin_calamari::centos_salt::params::packages:
ensure => present,
}->
service{ $fuel_plugin_calamari::centos_salt::params::services:
enable => true,
}->
exec { 'add_epel_key':
command => '/bin/rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6'
}
notice('End of centos_salt manifest')
}

View File

@ -0,0 +1,19 @@
# == Class: fuel_plugin_calamari::centos_salt::params
#
# A basic class for calamari plugin params
#
class fuel_plugin_calamari::centos_salt::params {
if($::osfamily == 'Redhat') {
$packages = ['epel-release-6-8']
$services = []
} else {
fail("Unsupported osfamily ${::osfamily}")
}
}

View File

@ -0,0 +1,29 @@
# Copyright 2015 CREATE-NET
#
# Licensed under the Apache License, Version 2.0 (the "License"); you
# may not use this file except in compliance with the License. You may
# obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing
# permissions and limitations under the License.
class fuel_plugin_calamari::centos_salt::restart {
notice('Starting salt-minion restart')
#For unknow reason it is needed that salt-minion is restarted after some time
exec { 'sleep':
command => 'sleep 60',
path => '/usr/local/sbin/:/usr/bin:/usr/sbin:/bin/:/sbin/'
}->
exec { 'restart salt-minion':
command => 'service salt-minion restart',
path => '/usr/local/sbin/:/usr/bin:/usr/sbin:/bin/:/sbin/'
}
}

View File

@ -0,0 +1,37 @@
# == Class: fuel_plugin_calamari
#
# Full description of class plugin-calamari here.
#
# === Parameters
#
# Document parameters here.
#
# [*sample_parameter*]
# Explanation of what this parameter affects and what it defaults to.
# e.g. "Specify one or more upstream ntp servers as an array."
#
# === Variables
#
# Here you should define a list of variables that this module would require.
#
# [*sample_variable*]
# Explanation of how this variable affects the funtion of this class and if
# it has a default. e.g. "The parameter enc_ntp_servers must be set by the
# External Node Classifier as a comma separated list of hostnames." (Note,
# global variables should be avoided in favor of class parameters as
# of Puppet 2.6.)
#
# === Examples
#
# class { fuel_plugin_calamari:
# servers => [ 'pool.ntp.org', 'ntp.local.company.com' ],
# }
#
# === Authors
#
# Daniele Pizzolli <daniele.pizzolli@create-net.org>
#
# === Copyright
#
# Copyright 2015 CREATE-NET
#

View File

@ -0,0 +1,116 @@
# Copyright 2015 CREATE-NET
#
# Licensed under the Apache License, Version 2.0 (the "License"); you
# may not use this file except in compliance with the License. You may
# obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing
# permissions and limitations under the License.
class redhat_init{
if($::osfamily == 'Redhat') {
notice('Starting redhat_init')
#Needed for calamari server config
file { '/etc/init.d/postgresql':
ensure => link,
target => '/etc/init.d/postgresql-9.3'
}->
exec { 'init postgres db':
command => 'service postgresql-9.3 initdb',
path => '/usr/local/sbin/:/usr/bin:/usr/sbin:/bin/:/sbin/'
}->
exec { 'start postgres':
command => 'service postgresql-9.3 start',
path => '/usr/local/sbin/:/usr/bin:/usr/sbin:/bin/:/sbin/'
}->
exec { 'start httpd':
command => 'service httpd start',
path => '/usr/local/sbin/:/usr/bin:/usr/sbin:/bin/:/sbin/'
}->
file { 'wrapper_salt':
source => 'puppet:///modules/fuel_plugin_calamari/salt_wrapper.py',
path => '/opt/calamari/venv/lib/python2.6/site-packages/calamari_common-0.1-py2.6.egg/calamari_common/salt_wrapper.py',
recurse => true,
mode => '0777'
}->
file { '/var/lib/pgsql/data':
ensure => 'directory',
owner => 'postgres',
group => 'postgres'
}->
file { '/var/lib/pgsql/data/pg_hba.conf':
ensure => 'link',
target => '/var/lib/pgsql/9.3/data/pg_hba.conf',
owner => 'postgres',
group => 'postgres'
}->
exec { 'postgres trust':
command => 'sed -ir "s/ident/trust/" /var/lib/pgsql/data/pg_hba.conf && sed -ir "s/peer/trust/" /var/lib/pgsql/data/pg_hba.conf && sed -ir "s/ident/trust/" /var/lib/pgsql/9.3/data/pg_hba.conf && sed -ir "s/peer/trust/" /var/lib/pgsql/9.3/data/pg_hba.conf',
path => '/usr/local/sbin/:/usr/bin:/usr/sbin:/bin/:/sbin/'
}->
exec {'restart postgres' :
command => '/etc/init.d/postgresql-9.3 restart',
path =>'/usr/local/sbin/:/usr/bin:/usr/sbin:/bin/:/sbin/'
}
notice('Finish redhat_init')
}
}
class fuel_plugin_calamari::server::init {
notice('Starting calamari-server manifest')
include fuel_plugin_calamari::server::params
package { $fuel_plugin_calamari::server::params::packages:
ensure => present,
}->
# TODO: wait for minion deploy! How? Does the order in tasks.yaml suffice?
exec { 'salt accept keys':
command => 'salt-key --yes --accept-all',
path => '/usr/local/sbin/:/usr/bin:/usr/sbin:/bin/:/sbin/',
# Config of calamari
}->
class {'redhat_init':}
# service { 'db before':
# name => 'postgresql-9.3',
# enable => true,
# }->
# service { 'http before':
# name => 'httpd',
# enable => true,
# }->
# notice('Starting redhat_init')
exec { 'calamari server config':
command => "calamari-ctl initialize --admin-username='${fuel_plugin_calamari::server::params::username}' --admin-password='${fuel_plugin_calamari::server::params::password}' --admin-email='${fuel_plugin_calamari::server::params::email}'",
path => '/usr/local/sbin/:/usr/bin:/usr/sbin:/bin/:/sbin/',
}->
# Restart apache2 to load the correct config (if not we have some
# errors in the gui)
service { $fuel_plugin_calamari::server::params::services:
enable => true,
}
notice('End of calamari-server manifest')
}

View File

@ -0,0 +1,45 @@
# Copyright 2015 CREATE-NET
#
# Licensed under the Apache License, Version 2.0 (the "License"); you
# may not use this file except in compliance with the License. You may
# obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
# implied. See the License for the specific language governing
# permissions and limitations under the License.
# == Class: fuel_plugin_calamari::server::params
#
# A basic class for calamari plugin params
#
class fuel_plugin_calamari::server::params {
if($::osfamily == 'Redhat') {
$packages = ['calamari-server', 'calamari-clients']
$services = ['httpd', 'postgresql-9.3']
} elsif($::osfamily == 'Debian') {
$packages = ['calamari-server', 'calamari-clients']
$services = ['apache2']
} else {
fail("Unsupported osfamily ${::osfamily}")
}
# General configuration
$settings = hiera('fuel-plugin-calamari')
$username = $settings['fuel-plugin-calamari_username']
$password = $settings['fuel-plugin-calamari_password']
$email = $settings['fuel-plugin-calamari_email']
}

View File

@ -0,0 +1,17 @@
dir = File.expand_path(File.dirname(__FILE__))
$LOAD_PATH.unshift File.join(dir, 'lib')
require 'mocha'
require 'puppet'
require 'rspec'
require 'spec/autorun'
Spec::Runner.configure do |config|
config.mock_with :mocha
end
# We need this because the RAL uses 'should' as a method. This
# allows us the same behaviour but with a different method name.
class Object
alias :must :should
end

View File

@ -0,0 +1,12 @@
# The baseline for module testing used by Puppet Labs is that each manifest
# should have a corresponding test manifest that declares that class or defined
# type.
#
# Tests are then run by using puppet apply --noop (to check for compilation
# errors and view a log of events) or by fully applying the test in a virtual
# environment (to compare the resulting system state to the desired state).
#
# Learn more about module testing here:
# http://docs.puppetlabs.com/guides/tests_smoke.html
#
include fuel_plugin_calamari

192
doc/Makefile Normal file
View File

@ -0,0 +1,192 @@
# Makefile for Sphinx documentation
#
# You can set these variables from the command line.
SPHINXOPTS =
SPHINXBUILD = sphinx-build
PAPER =
BUILDDIR = build
# User-friendly check for sphinx-build
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $$?), 1)
$(error The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from http://sphinx-doc.org/)
endif
# Internal variables.
PAPEROPT_a4 = -D latex_paper_size=a4
PAPEROPT_letter = -D latex_paper_size=letter
ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
# the i18n builder cannot share the environment and doctrees with the others
I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) source
.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest coverage gettext
help:
@echo "Please use \`make <target>' where <target> is one of"
@echo " html to make standalone HTML files"
@echo " dirhtml to make HTML files named index.html in directories"
@echo " singlehtml to make a single large HTML file"
@echo " pickle to make pickle files"
@echo " json to make JSON files"
@echo " htmlhelp to make HTML files and a HTML help project"
@echo " qthelp to make HTML files and a qthelp project"
@echo " applehelp to make an Apple Help Book"
@echo " devhelp to make HTML files and a Devhelp project"
@echo " epub to make an epub"
@echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
@echo " latexpdf to make LaTeX files and run them through pdflatex"
@echo " latexpdfja to make LaTeX files and run them through platex/dvipdfmx"
@echo " text to make text files"
@echo " man to make manual pages"
@echo " texinfo to make Texinfo files"
@echo " info to make Texinfo files and run them through makeinfo"
@echo " gettext to make PO message catalogs"
@echo " changes to make an overview of all changed/added/deprecated items"
@echo " xml to make Docutils-native XML files"
@echo " pseudoxml to make pseudoxml-XML files for display purposes"
@echo " linkcheck to check all external links for integrity"
@echo " doctest to run all doctests embedded in the documentation (if enabled)"
@echo " coverage to run coverage check of the documentation (if enabled)"
clean:
rm -rf $(BUILDDIR)/*
html:
$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
dirhtml:
$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
@echo
@echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
singlehtml:
$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
@echo
@echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
pickle:
$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
@echo
@echo "Build finished; now you can process the pickle files."
json:
$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
@echo
@echo "Build finished; now you can process the JSON files."
htmlhelp:
$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
@echo
@echo "Build finished; now you can run HTML Help Workshop with the" \
".hhp project file in $(BUILDDIR)/htmlhelp."
qthelp:
$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
@echo
@echo "Build finished; now you can run "qcollectiongenerator" with the" \
".qhcp project file in $(BUILDDIR)/qthelp, like this:"
@echo "# qcollectiongenerator $(BUILDDIR)/qthelp/fuel-plugin-calamari.qhcp"
@echo "To view the help file:"
@echo "# assistant -collectionFile $(BUILDDIR)/qthelp/fuel-plugin-calamari.qhc"
applehelp:
$(SPHINXBUILD) -b applehelp $(ALLSPHINXOPTS) $(BUILDDIR)/applehelp
@echo
@echo "Build finished. The help book is in $(BUILDDIR)/applehelp."
@echo "N.B. You won't be able to view it unless you put it in" \
"~/Library/Documentation/Help or install it in your application" \
"bundle."
devhelp:
$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
@echo
@echo "Build finished."
@echo "To view the help file:"
@echo "# mkdir -p $$HOME/.local/share/devhelp/fuel-plugin-calamari"
@echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/fuel-plugin-calamari"
@echo "# devhelp"
epub:
$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
@echo
@echo "Build finished. The epub file is in $(BUILDDIR)/epub."
latex:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo
@echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
@echo "Run \`make' in that directory to run these through (pdf)latex" \
"(use \`make latexpdf' here to do that automatically)."
latexpdf:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through pdflatex..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
latexpdfja:
$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
@echo "Running LaTeX files through platex and dvipdfmx..."
$(MAKE) -C $(BUILDDIR)/latex all-pdf-ja
@echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
text:
$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
@echo
@echo "Build finished. The text files are in $(BUILDDIR)/text."
man:
$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
@echo
@echo "Build finished. The manual pages are in $(BUILDDIR)/man."
texinfo:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo
@echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
@echo "Run \`make' in that directory to run these through makeinfo" \
"(use \`make info' here to do that automatically)."
info:
$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
@echo "Running Texinfo files through makeinfo..."
make -C $(BUILDDIR)/texinfo info
@echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
gettext:
$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
@echo
@echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
changes:
$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
@echo
@echo "The overview file is in $(BUILDDIR)/changes."
linkcheck:
$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
@echo
@echo "Link check complete; look for any errors in the above output " \
"or in $(BUILDDIR)/linkcheck/output.txt."
doctest:
$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
@echo "Testing of doctests in the sources finished, look at the " \
"results in $(BUILDDIR)/doctest/output.txt."
coverage:
$(SPHINXBUILD) -b coverage $(ALLSPHINXOPTS) $(BUILDDIR)/coverage
@echo "Testing of coverage in the sources finished, look at the " \
"results in $(BUILDDIR)/coverage/python.txt."
xml:
$(SPHINXBUILD) -b xml $(ALLSPHINXOPTS) $(BUILDDIR)/xml
@echo
@echo "Build finished. The XML files are in $(BUILDDIR)/xml."
pseudoxml:
$(SPHINXBUILD) -b pseudoxml $(ALLSPHINXOPTS) $(BUILDDIR)/pseudoxml
@echo
@echo "Build finished. The pseudo-XML files are in $(BUILDDIR)/pseudoxml."

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

291
doc/source/conf.py Normal file
View File

@ -0,0 +1,291 @@
# -*- coding: utf-8 -*-
#
# fuel-plugin-calamari documentation build configuration file, created by
# sphinx-quickstart on Tue Jul 14 11:04:14 2015.
#
# This file is execfile()d with the current directory set to its
# containing dir.
#
# Note that not all possible configuration values are present in this
# autogenerated file.
#
# All configuration values have a default; values that are commented out
# serve to show the default.
import sys
import os
import shlex
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
# documentation root, use os.path.abspath to make it absolute, like shown here.
#sys.path.insert(0, os.path.abspath('.'))
# -- General configuration ------------------------------------------------
# If your documentation needs a minimal Sphinx version, state it here.
#needs_sphinx = '1.0'
# Add any Sphinx extension module names here, as strings. They can be
# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom
# ones.
extensions = [
'sphinx.ext.intersphinx',
'sphinx.ext.todo',
]
# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']
# The suffix(es) of source filenames.
# You can specify multiple suffix as a list of string:
# source_suffix = ['.rst', '.md']
source_suffix = '.rst'
# The encoding of source files.
#source_encoding = 'utf-8-sig'
# The master toctree document.
master_doc = 'index'
# General information about the project.
project = u'fuel-plugin-calamari'
copyright = u'2015, Daniele Pizzolli'
author = u'Daniele Pizzolli'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
version = '1.1.0'
# The full version, including alpha/beta/rc tags.
release = '1.1.0'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
#
# This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases.
language = None
# There are two options for replacing |today|: either, you set today to some
# non-false value, then it is used:
#today = ''
# Else, today_fmt is used as the format for a strftime call.
#today_fmt = '%B %d, %Y'
# List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files.
exclude_patterns = []
# The reST default role (used for this markup: `text`) to use for all
# documents.
#default_role = None
# If true, '()' will be appended to :func: etc. cross-reference text.
#add_function_parentheses = True
# If true, the current module name will be prepended to all description
# unit titles (such as .. function::).
#add_module_names = True
# If true, sectionauthor and moduleauthor directives will be shown in the
# output. They are ignored by default.
#show_authors = False
# The name of the Pygments (syntax highlighting) style to use.
pygments_style = 'sphinx'
# A list of ignored prefixes for module index sorting.
#modindex_common_prefix = []
# If true, keep warnings as "system message" paragraphs in the built documents.
#keep_warnings = False
# If true, `todo` and `todoList` produce output, else they produce nothing.
todo_include_todos = True
# -- Options for HTML output ----------------------------------------------
# The theme to use for HTML and HTML Help pages. See the documentation for
# a list of builtin themes.
html_theme = 'alabaster'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
#html_theme_options = {}
# Add any paths that contain custom themes here, relative to this directory.
#html_theme_path = []
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
#html_title = None
# A shorter title for the navigation bar. Default is the same as html_title.
#html_short_title = None
# The name of an image file (relative to this directory) to place at the top
# of the sidebar.
#html_logo = None
# The name of an image file (within the static path) to use as favicon of the
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
# pixels large.
#html_favicon = None
# Add any paths that contain custom static files (such as style sheets) here,
# relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css".
html_static_path = ['_static']
# Add any extra paths that contain custom files (such as robots.txt or
# .htaccess) here, relative to this directory. These files are copied
# directly to the root of the documentation.
#html_extra_path = []
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
# using the given strftime format.
#html_last_updated_fmt = '%b %d, %Y'
# If true, SmartyPants will be used to convert quotes and dashes to
# typographically correct entities.
#html_use_smartypants = True
# Custom sidebar templates, maps document names to template names.
#html_sidebars = {}
# Additional templates that should be rendered to pages, maps page names to
# template names.
#html_additional_pages = {}
# If false, no module index is generated.
#html_domain_indices = True
# If false, no index is generated.
#html_use_index = True
# If true, the index is split into individual pages for each letter.
#html_split_index = False
# If true, links to the reST sources are added to the pages.
#html_show_sourcelink = True
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
#html_show_sphinx = True
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
#html_show_copyright = True
# If true, an OpenSearch description file will be output, and all pages will
# contain a <link> tag referring to it. The value of this option must be the
# base URL from which the finished HTML is served.
#html_use_opensearch = ''
# This is the file name suffix for HTML files (e.g. ".xhtml").
#html_file_suffix = None
# Language to be used for generating the HTML full-text search index.
# Sphinx supports the following languages:
# 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja'
# 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr'
#html_search_language = 'en'
# A dictionary with options for the search language support, empty by default.
# Now only 'ja' uses this config value
#html_search_options = {'type': 'default'}
# The name of a javascript file (relative to the configuration directory) that
# implements a search results scorer. If empty, the default will be used.
#html_search_scorer = 'scorer.js'
# Output file base name for HTML help builder.
htmlhelp_basename = 'fuel-plugin-calamaridoc'
# -- Options for LaTeX output ---------------------------------------------
latex_elements = {
# The paper size ('letterpaper' or 'a4paper').
#'papersize': 'letterpaper',
# The font size ('10pt', '11pt' or '12pt').
#'pointsize': '10pt',
# Additional stuff for the LaTeX preamble.
#'preamble': '',
# Latex figure (float) alignment
#'figure_align': 'htbp',
}
# Grouping the document tree into LaTeX files. List of tuples
# (source start file, target name, title,
# author, documentclass [howto, manual, or own class]).
latex_documents = [
(master_doc, ''.join(('fuel-plugin-calamari-', version, '.tex')), u'fuel-plugin-calamari Documentation',
u'Daniele Pizzolli', 'manual'),
]
# The name of an image file (relative to this directory) to place at the top of
# the title page.
#latex_logo = None
# For "manual" documents, if this is true, then toplevel headings are parts,
# not chapters.
#latex_use_parts = False
# If true, show page references after internal links.
#latex_show_pagerefs = False
# If true, show URL addresses after external links.
#latex_show_urls = False
# Documents to append as an appendix to all manuals.
#latex_appendices = []
# If false, no module index is generated.
#latex_domain_indices = True
# -- Options for manual page output ---------------------------------------
# One entry per manual page. List of tuples
# (source start file, name, description, authors, manual section).
man_pages = [
(master_doc, 'fuel-plugin-calamari', u'fuel-plugin-calamari Documentation',
[author], 1)
]
# If true, show URL addresses after external links.
#man_show_urls = False
# -- Options for Texinfo output -------------------------------------------
# Grouping the document tree into Texinfo files. List of tuples
# (source start file, target name, title, author,
# dir menu entry, description, category)
texinfo_documents = [
(master_doc, 'fuel-plugin-calamari', u'fuel-plugin-calamari Documentation',
author, 'fuel-plugin-calamari', 'One line description of project.',
'Miscellaneous'),
]
# Documents to append as an appendix to all manuals.
#texinfo_appendices = []
# If false, no module index is generated.
#texinfo_domain_indices = True
# How to display URL addresses: 'footnote', 'no', or 'inline'.
#texinfo_show_urls = 'footnote'
# If true, do not generate a @detailmenu in the "Top" node's menu.
#texinfo_no_detailmenu = False
# Example configuration for intersphinx: refer to the Python standard library.
intersphinx_mapping = {'https://docs.python.org/': None}

26
doc/source/index.rst Normal file
View File

@ -0,0 +1,26 @@
.. fuel-plugin-calamari documentation master file, created by
sphinx-quickstart on Tue Jul 14 11:04:14 2015.
You can adapt this file completely to your liking, but it should at least
contain the root `toctree` directive.
Welcome to fuel-plugin-calamari's documentation!
================================================
Contents:
.. toctree::
:maxdepth: 2
installation-guide
user-guide
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

View File

@ -0,0 +1,61 @@
Installation Guide
==================
Prerequisites
+++++++++++++
+----------------------------------+-----------------+
| Requirement | Version/Comment |
+==================================+=================+
| Mirantis OpenStack compatility | 6.1 or higher |
+----------------------------------+-----------------+
| Distribution Supported | Ubuntu |
+----------------------------------+-----------------+
Where to download the plugin
++++++++++++++++++++++++++++
The plugin in not yet distribuited as package. You have to build it
yourself.
The code is hosted by `SmartInfrastructures
<https://github.com/SmartInfrastructures/fuel-plugin-calamari>`_ But
it will be moved on `stackforge
<https://github.com/stackforge/fuel-plugin-calamari>`_ soon.
How to build the plugin
+++++++++++++++++++++++
Please refer to the `Fuel Plugins wiki
<https://wiki.openstack.org/wiki/Fuel/Plugins>`_ to build the plugin
by yourself, version 2.0.0 (or higher) of the Fuel Plugin Builder is
required.
.. code:: bash
git clone https://github.com/SmartInfrastructures/fuel-plugin-calamari.git
cd fuel-plugin-calamari
fuel-plugin-builder --build .
How to install the plugin
+++++++++++++++++++++++++
Copy the plugin file to the Fuel Master node.
.. code:: bash
scp fuel-plugin-calamari*rpm root@<Fuel Master node IP address>:
Install the plugin using the fuel command line:
.. code:: bash
ssh root@<Fuel Master node IP address>
fuel plugins --install fuel-plugin-calamari*.rpm
Verify that the plugin is installed correctly:
.. code:: bash
fuel plugins --list

50
doc/source/user-guide.rst Normal file
View File

@ -0,0 +1,50 @@
User Guide
==========
Intro
+++++
- Create a new environment with the Fuel UI wizard. At the moment
only the Ubuntu distribution is supported.
- Click on the Settings tab of the Fuel web UI.
For fuel version 7.0: select the “Calamari Installer” tab, enable
the plugin by clicking on the “Calamari Installer” checkbox and
fill-in the required fiels:
.. image:: _static/settings-calamari_fuel70.png
:alt: A screen-shot of the Calamari Settings UI
:scale: 90%
- For fuel version 6.1: scroll down the page, select the calamari
plugin check-box and fill-in the required fields. The interface
looks like the following:
.. image:: _static/settings-calamari.png
:alt: A screen-shot of the Calamari Settings UI
:scale: 90%
- Go to the nodes page.
- Add a base-os node and rename the base-os host as “calamari”:
.. image:: _static/calamari-name.png
:alt: A screen-shot of the Calamari host name
:scale: 90%
- Some minutes after the deploy is ready (currently the Fuel UI
display "Ready" on the nodes, even some plugin has not yet finished)
you can browse the calamari interface on the calamari server. You
have to figure out the address of the server from the network info
pop-up:
.. image:: _static/calamari-ip.png
:alt: A screen-shot of the Calamari host IP
:scale: 90%
How to use the plugin
+++++++++++++++++++++
Have a look to the still rough `calamari documentation
<https://ceph.com/category/calamari/>`_.

28
environment_config.yaml Normal file
View File

@ -0,0 +1,28 @@
attributes:
fuel-plugin-calamari_username:
value: "admin"
label: "Admin Username"
description: "Calamari Admin Username"
weight: 25
type: "text"
regex:
source: '^[\S]{4,}$'
error: "You must provide an username with at least 4 characters"
fuel-plugin-calamari_password:
value: "admin"
label: "Admin Password"
description: "Calamari Admin Password"
weight: 25
type: "password"
regex:
source: '^[\S]{4,}$'
error: "You must provide a password with at least 4 characters"
fuel-plugin-calamari_email:
value: "admin@localhost.invalid"
label: "Admin Email"
description: "Calamari Admin Email"
weight: 40
type: "text"
regex:
source: '^\S+@\S+$'
error: "Invalid email"

39
metadata.yaml Normal file
View File

@ -0,0 +1,39 @@
# Plugin name
name: fuel-plugin-calamari
# Human-readable name for your plugin
title: Calamari Installer
# Plugin version
version: '1.1.0'
# Description
description: "An installer for Calamari: a management and monitoring system for Ceph storage cluster"
# Required fuel version
fuel_version: ['6.1', '7.0']
# Specify license of your plugin
licenses: ['Apache License Version 2.0']
# Specify author or company name
authors: ['CREATE-NET']
# A link to the plugin's page
homepage: 'https://github.com/stackforge/fuel-plugin-calamari'
# Specify a group which your plugin implements, possible options:
# network, storage, storage::cinder, storage::glance, hypervisor
groups: ['storage']
# The plugin is compatible with releases in the list
releases:
- os: ubuntu
version: 2014.2-6.1
mode: ['ha', 'multinode']
deployment_scripts_path: deployment_scripts/
repository_path: repositories/ubuntu
- os: centos
version: 2014.2-6.1
mode: ['ha', 'multinode']
deployment_scripts_path: deployment_scripts/
repository_path: repositories/centos
- os: ubuntu
version: 2015.1.0-7.0
mode: ['ha', 'multinode']
deployment_scripts_path: deployment_scripts/
repository_path: repositories/ubuntu
# Version of plugin package
package_version: '2.0.0'

5
pre_build_hook Executable file
View File

@ -0,0 +1,5 @@
#!/bin/bash
# Add here any the actions which are required before plugin build
# like packages building, packages downloading from mirrors and so on.
# The script should return 0 if there were no errors.

View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

Binary file not shown.

Binary file not shown.

Binary file not shown.

246
specs/calamari.rst Normal file
View File

@ -0,0 +1,246 @@
.. -*- coding: utf-8 -*-
..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
===================
Calamari: a Ceph UI
===================
Include the URL of your launchpad blueprint:
https://blueprints.launchpad.net/fuel/+spec/fuel-plugin-calamari
We would like to develop a plugin to install Calamari in the next release of
Fuel (7.0). Calamari is a management and monitoring service for Ceph.
Calamari is composed by monitoring agents, a server-side and a client-side
components.
In more depth Calamari consists of three major components:
- Data collection agents running on each Ceph Storage Cluster host.
- The REST API running on one host (also called calamari server).
- The Calamari web application running on one host (also called calamari
client).
Problem description
===================
In this section we describe the main steps that a user should perform for
installing Calamari. We suppose that:
- Ceph OSD is selected by User.
- Calamari agent will be installed on the Ceph OSD nodes.
- Calamari server and Calamari web application (GUI) will be installed on a
new base-os node.
Calamari installation
---------------------
- Actor: User
- Pre-Conditions: the User has already created a new environment and he has
configured a Ceph cluster.
- Post-Conditions: Calamari is correctly working.
Flow:
- The User assigns base-os role to an unallocated node.
- The User renames this node as Calamari
- The User configures in Settings tab the Ceph section.
- The User configures in Settings tab the Calamari section.
- The User deploys the environment.
Proposed change
===============
We would like develop a new Fuel plugin in order to install Calamari [1]_.
Our proposal considers the following aspects:
- Install Calamari server (REST API) and client (web application) on a new node
with the base-os role.
- The plugin installs also the required agents on each Ceph OSD node. The
collected information will be pushed to Calamari server.
- The communication among agents and server will use the OpenStack management
network.
- There will be a configuration switch to make the REST API and web application
of Calamari available on the public interface (if the base-os support this
already).
- No load balance for HA in the first implementation. This topic will be
explored in the future.
Planned improvements
--------------------
- Possibility to install Calamari on a controller node.
- Configure Calamari to use Keystone as the authentication backend.
- User session sharing between Calamari and the OpenStack dashboard.
Alternatives
------------
None. The aim is to provide monitoring and management for Ceph. There are
more general monitoring solution like Zabbix [2]_, LMA collector [3]_ and
Elasticsearch-Kibana [4]_ plugins.
Data model impact
-----------------
None
REST API impact
---------------
None
Upgrade impact
--------------
None.
Security impact
---------------
The default admin user name and password for the web interface will be
configured in the setting tab of the Fuel UI.
In the Fuel UI will be possible to allow the deploy of the REST API and web
application on the public network.
Notifications impact
--------------------
There will be a deployment successful message displaying the text pointing to
the URL of the web application.
We can also add some info to the `Post Deployment Dashboard
<https://review.openstack.org/#/c/180181/>`_ once it is implemented.
Other end user impact
---------------------
None
Performance Impact
------------------
None
Other deployer impact
---------------------
In the source tree of calamari there are Vagrantfile and scripts to build the
packages for Ubuntu 14.04, Centos and RHEL.
There is a `guide on building packages
<http://calamari.readthedocs.org/en/latest/development/building_packages.html>`_.
Developer impact
----------------
None
Infrastructure impact
---------------------
The agent impact on Ceph servers and on the network should be negligible.
Implementation
==============
Assignee(s)
-----------
Primary assignee:
Alessandro Martellone <amartellone@create-net.org>
Other contributors:
Daniele Pizzolli <dpizzolli@create-net.org>
Work Items
----------
Task name: Calamari installation recipe
Task description: write a puppet module in order to install Calamari server
and configure properly all nodes to monitor.
Assignees: Alessandro Martellone, Daniele Pizzolli.
Task name: include the latest version of Calamari package
Task description: include in the plugin repositories the required packages.
Assignees: Dmytro Iurchenko, Alessandro Martellone,
Daniele Pizzolli.
Dependencies
============
- Fuel 6.1 or higher.
- Base-os node role.
Nice to have, but not essential:
- `Post Deployment Dashboard <https://review.openstack.org/#/c/180181/>`_
- `Role as a plugin <https://review.openstack.org/#/c/143690/>`_
Testing
=======
Acceptance criteria:
- Diamond [5]_ and salt-minion services are installed and running on
all OSD and Controller nodes.
- Salt-master is installed and running on the node named 'calamari' and
salt-keys command lists all OSD and Controller node hosts in
'Accepted Keys' section.
- Calamari REST API is available on the node named 'calamari' [6]_.
- User can authenticate via REST API [7]_.
- The cluster description provided by Calamari REST API [8]_ is correct.
- Calamari UI is available on 'calamari' node on HTTP default port.
Documentation Impact
====================
None. It will be a Fuel plugin with its own documentation.
References
==========
.. [1] http://calamari.readthedocs.org/en/latest/operations/server_install.html
.. [2] https://docs.mirantis.com/fuel-dev/develop/addition_examples.html
.. [3] https://github.com/stackforge/fuel-plugin-lma-collector
.. [4] https://github.com/stackforge/fuel-plugin-elasticsearch-kibana
.. [5] https://github.com/ceph/Diamond
.. [6] http://ceph.com/calamari/docs/calamari_rest/index.html
.. [7] http://ceph.com/calamari/docs/calamari_rest/authentication.html
.. [8] http://ceph.com/calamari/docs/calamari_rest/resources/resources.html#clusterviewset

54
tasks.yaml Normal file
View File

@ -0,0 +1,54 @@
- role: ['controller', 'primary-controller', 'ceph-osd']
stage: post_deployment/6000
type: puppet
parameters:
puppet_manifest: puppet/manifests/calamari-salt.pp
puppet_modules: "puppet/modules/:/etc/puppet/modules/"
timeout: 600
- role: ['controller', 'primary-controller', 'ceph-osd']
stage: post_deployment/6001
type: puppet
parameters:
puppet_manifest: puppet/manifests/calamari-agent.pp
puppet_modules: "puppet/modules/:/etc/puppet/modules/"
timeout: 600
- role: ['base-os']
stage: post_deployment/6002
type: shell
parameters:
cmd: if hiera user_node_name | egrep '^calamari$'; then puppet apply /etc/puppet/modules/osnailyfacter/modular/netconfig/netconfig.pp; fi
timeout: 720
- role: ['base-os']
stage: post_deployment/6003
type: puppet
parameters:
puppet_manifest: puppet/manifests/calamari-salt.pp
puppet_modules: "puppet/modules/:/etc/puppet/modules/"
timeout: 720
- role: ['base-os']
stage: post_deployment/6004
type: puppet
parameters:
puppet_manifest: puppet/manifests/calamari-server.pp
puppet_modules: "puppet/modules/:/etc/puppet/modules/"
timeout: 720
- role: ['controller', 'primary-controller', 'ceph-osd']
stage: post_deployment/6005
type: puppet
parameters:
puppet_manifest: puppet/manifests/restart-salt.pp
puppet_modules: "puppet/modules/:/etc/puppet/modules/"
timeout: 720
- role: ['base-os']
stage: post_deployment/6006
type: puppet
parameters:
puppet_manifest: puppet/manifests/complete-centos.pp
puppet_modules: "puppet/modules/:/etc/puppet/modules/"
timeout: 720

View File

@ -0,0 +1,570 @@
editable:
access:
email:
description: Email address for Administrator
label: Email
regex:
error: Invalid email
source: ^\S+@\S+$
type: text
value: admin@localhost
weight: 40
metadata:
label: Access
weight: 10
password:
description: Password for Administrator
label: Password
regex:
error: Empty password
source: \S
type: password
value: admin
weight: 20
tenant:
description: Tenant (project) name for Administrator
label: Tenant
regex:
error: Invalid tenant name
source: ^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?![Gg]uest$)(?!.*
+.*$).+
type: text
value: admin
weight: 30
user:
description: Username for Administrator
label: Username
regex:
error: Invalid username
source: ^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?![Gg]uest$)(?!.*
+.*$).+
type: text
value: admin
weight: 10
additional_components:
ceilometer:
description: If selected, Ceilometer component will be installed
label: Install Ceilometer
type: checkbox
value: false
weight: 40
heat:
description: ''
label: ''
type: hidden
value: true
weight: 30
metadata:
label: Additional Components
weight: 20
mongo:
description: If selected, You can use external Mongo DB as ceilometer backend
label: Use external Mongo DB
restrictions:
- settings:additional_components.ceilometer.value == false
type: checkbox
value: false
weight: 40
murano:
description: If selected, Murano component will be installed
label: Install Murano
restrictions:
- cluster:net_provider != 'neutron'
type: checkbox
value: false
weight: 20
sahara:
description: If selected, Sahara component will be installed
label: Install Sahara
type: checkbox
value: false
weight: 10
common:
auth_key:
description: Public key(s) to include in authorized_keys on deployed nodes
label: Public Key
type: textarea
value: ''
weight: 70
auto_assign_floating_ip:
description: If selected, OpenStack will automatically assign a floating IP
to a new instance
label: Auto assign floating IP
restrictions:
- action: hide
condition: cluster:net_provider == 'neutron'
type: checkbox
value: false
weight: 40
debug:
description: Debug logging mode provides more information, but requires more
disk space.
label: OpenStack debug logging
type: checkbox
value: false
weight: 20
libvirt_type:
label: Hypervisor type
type: radio
value: qemu
values:
- data: kvm
description: Choose this type of hypervisor if you run OpenStack on hardware
label: KVM
- data: qemu
description: Choose this type of hypervisor if you run OpenStack on virtual
hosts.
label: QEMU
weight: 30
metadata:
label: Common
weight: 30
nova_quota:
description: Quotas are used to limit CPU and memory usage for tenants. Enabling
quotas will increase load on the Nova database.
label: Nova quotas
type: checkbox
value: false
weight: 25
puppet_debug:
description: Debug puppet logging mode provides more information, but requires
more disk space.
label: Puppet debug logging
type: checkbox
value: true
weight: 20
resume_guests_state_on_host_boot:
description: Whether to resume previous guests state when the host reboots.
If enabled, this option causes guests assigned to the host to resume their
previous state. If the guest was running a restart will be attempted when
nova-compute starts. If the guest was not running previously, a restart will
not be attempted.
label: Resume guests state on host boot
type: checkbox
value: true
weight: 60
use_cow_images:
description: For most cases you will want qcow format. If it's disabled, raw
image format will be used to run VMs. OpenStack with raw format currently
does not support snapshotting.
label: Use qcow format for images
type: checkbox
value: true
weight: 50
use_vcenter:
type: hidden
value: false
weight: 30
corosync:
group:
description: ''
label: Group
type: text
value: 226.94.1.1
weight: 10
metadata:
label: Corosync
restrictions:
- action: hide
condition: 'true'
weight: 50
port:
description: ''
label: Port
type: text
value: '12000'
weight: 20
verified:
description: Set True only if multicast is configured correctly on router.
label: Need to pass network verification.
type: checkbox
value: false
weight: 10
external_dns:
dns_list:
description: List of upstream DNS servers, separated by comma
label: DNS list
regex:
error: Invalid IP address list
source: ^\*$|^(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3}(?:\s*,\s*(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3})*$
type: text
value: 8.8.8.8
weight: 10
metadata:
label: Host OS DNS Servers
weight: 90
external_mongo:
hosts_ip:
description: IP Addresses of MongoDB. Use comma to split IPs
label: MongoDB hosts IP
regex:
error: Invalid hosts ip sequence
source: ^(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?),)*((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
type: text
value: ''
weight: 30
metadata:
label: External MongoDB
restrictions:
- action: hide
condition: settings:additional_components.mongo.value == false
weight: 20
mongo_db_name:
description: Mongo database name
label: Database name
regex:
error: Invalid database name
source: ^\w+$
type: text
value: ceilometer
weight: 30
mongo_password:
description: Mongo database password
label: Password
regex:
error: Password contains spaces
source: ^\S*$
type: password
value: ceilometer
weight: 30
mongo_replset:
description: Name for Mongo replication set
label: Replset
type: text
value: ''
weight: 30
mongo_user:
description: Mongo database username
label: Username
regex:
error: Empty username
source: ^\w+$
type: text
value: ceilometer
weight: 30
external_ntp:
metadata:
label: Host OS NTP Servers
weight: 100
ntp_list:
description: List of upstream NTP servers, separated by comma
label: NTP server list
regex:
error: Invalid NTP server list
source: ^\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(?:\.\d{1,3}){3})\s*(?:,\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(\.\d{1,3}){3})\s*)*$
type: text
value: 0.pool.ntp.org, 1.pool.ntp.org, 2.pool.ntp.org
weight: 10
fuel-plugin-calamari:
fuel-plugin-calamari_email:
description: Calamari Admin Email
label: Admin Email
regex:
error: Invalid email
source: ^\S+@\S+$
type: text
value: admin@localhost.invalid
weight: 40
fuel-plugin-calamari_password:
description: Calamari Admin Password
label: Admin Password
regex:
error: You must provide a password with at least 4 characters
source: ^[\S]{4,}$
type: password
value: admin
weight: 25
fuel-plugin-calamari_username:
description: Calamari Admin Username
label: Admin Username
regex:
error: You must provide an username with at least 4 characters
source: ^[\S]{4,}$
type: text
value: admin
weight: 25
metadata:
enabled: true
label: Calamari Installer
plugin_id: 4
toggleable: true
weight: 70
kernel_params:
kernel:
description: Default kernel parameters
label: Initial parameters
type: text
value: console=ttyS0,9600 console=tty0 biosdevname=0 crashkernel=none rootdelay=90
nomodeset
weight: 45
metadata:
label: Kernel parameters
weight: 40
murano_settings:
metadata:
label: Murano Settings
restrictions:
- action: hide
condition: settings:additional_components.murano.value == false
weight: 20
murano_repo_url:
description: ''
label: Murano Repository URL
type: text
value: http://storage.apps.openstack.org/
weight: 10
neutron_mellanox:
metadata:
enabled: true
label: Mellanox Neutron components
restrictions:
- action: hide
condition: not ('experimental' in version:feature_groups)
toggleable: false
weight: 50
plugin:
label: Mellanox drivers and SR-IOV plugin
type: radio
value: disabled
values:
- data: disabled
description: If selected, Mellanox drivers, Neutron and Cinder plugin will
not be installed.
label: Mellanox drivers and plugins disabled
restrictions:
- settings:storage.iser.value == true
- data: drivers_only
description: If selected, Mellanox Ethernet drivers will be installed to support
networking over Mellanox NIC. Mellanox Neutron plugin will not be installed.
label: Install only Mellanox drivers
restrictions:
- settings:common.libvirt_type.value != 'kvm'
- data: ethernet
description: If selected, both Mellanox Ethernet drivers and Mellanox network
acceleration (Neutron) plugin will be installed.
label: Install Mellanox drivers and SR-IOV plugin
restrictions:
- settings:common.libvirt_type.value != 'kvm' or not (cluster:net_provider
== 'neutron' and networking_parameters:segmentation_type == 'vlan')
weight: 60
vf_num:
description: Note that one virtual function will be reserved to the storage
network, in case of choosing iSER.
label: Number of virtual NICs
restrictions:
- settings:neutron_mellanox.plugin.value != 'ethernet'
type: text
value: '16'
weight: 70
provision:
metadata:
label: Provision
weight: 80
method:
description: Which provision method to use for this cluster.
label: Provision method
type: radio
value: image
values:
- data: image
description: Copying pre-built images on a disk.
label: Image
- data: cobbler
description: Install from scratch using anaconda or debian-installer.
label: (DEPRECATED) Classic (use anaconda or debian-installer)
public_network_assignment:
assign_to_all_nodes:
description: When disabled, public network will be assigned to controllers only
label: Assign public network to all nodes
type: checkbox
value: false
weight: 10
metadata:
label: Public network assignment
restrictions:
- action: hide
condition: cluster:net_provider != 'neutron'
weight: 50
repo_setup:
metadata:
always_editable: true
label: Repositories
weight: 50
repos:
description: 'To create a local repository mirror on the Fuel master node, please
follow the instructions provided by running "fuel-package-updates --help"
on the Fuel master node.
Please make sure your Fuel master node has Internet access to the repository
before attempting to create a mirror.
For more details, please refer to the documentation (https://docs.mirantis.com/openstack/fuel/fuel-6.1/reference-architecture.html#fuel-rep-mirror).
'
extra_priority: null
type: custom_repo_configuration
value:
- name: mos
priority: null
type: rpm
uri: http://10.20.0.2:8080/2014.2.2-6.1/centos/x86_64
- name: mos-updates
priority: null
type: rpm
uri: http://mirror.fuel-infra.org/mos/centos-6/mos6.1/updates
- name: Auxiliary
priority: 15
type: rpm
uri: http://10.20.0.2:8080/2014.2.2-6.1/centos/auxiliary
storage:
ephemeral_ceph:
description: Configures Nova to store ephemeral volumes in RBD. This works best
if Ceph is enabled for volumes and images, too. Enables live migration of
all types of Ceph backed VMs (without this option, live migration will only
work with VMs launched from Cinder volumes).
label: Ceph RBD for ephemeral volumes (Nova)
type: checkbox
value: true
weight: 75
images_ceph:
description: Configures Glance to use the Ceph RBD backend to store images.
If enabled, this option will prevent Swift from installing.
label: Ceph RBD for images (Glance)
restrictions:
- settings:storage.images_vcenter.value == true: Only one Glance backend could
be selected.
type: checkbox
value: true
weight: 30
images_vcenter:
description: Configures Glance to use the vCenter/ESXi backend to store images.
If enabled, this option will prevent Swift from installing.
label: VMWare vCenter/ESXi datastore for images (Glance)
restrictions:
- action: hide
condition: settings:common.use_vcenter.value != true
- condition: settings:storage.images_ceph.value == true
message: Only one Glance backend could be selected.
type: checkbox
value: false
weight: 35
iser:
description: 'High performance block storage: Cinder volumes over iSER protocol
(iSCSI over RDMA). This feature requires SR-IOV capabilities in the NIC, and
will use a dedicated virtual function for the storage network.'
label: iSER protocol for volumes (Cinder)
restrictions:
- settings:storage.volumes_lvm.value != true or settings:common.libvirt_type.value
!= 'kvm'
- action: hide
condition: not ('experimental' in version:feature_groups)
type: checkbox
value: false
weight: 11
metadata:
label: Storage
weight: 60
objects_ceph:
description: Configures RadosGW front end for Ceph RBD. This exposes S3 and
Swift API Interfaces. If enabled, this option will prevent Swift from installing.
label: Ceph RadosGW for objects (Swift API)
restrictions:
- settings:storage.images_ceph.value == false
type: checkbox
value: false
weight: 80
osd_pool_size:
description: Configures the default number of object replicas in Ceph. This
number must be equal to or lower than the number of deployed 'Storage - Ceph
OSD' nodes.
label: Ceph object replication factor
regex:
error: Invalid number
source: ^[1-9]\d*$
type: text
value: '2'
weight: 85
volumes_ceph:
description: Configures Cinder to store volumes in Ceph RBD images.
label: Ceph RBD for volumes (Cinder)
restrictions:
- settings:storage.volumes_lvm.value == true
type: checkbox
value: true
weight: 20
volumes_lvm:
description: It is recommended to have at least one Storage - Cinder LVM node.
label: Cinder LVM over iSCSI for volumes
restrictions:
- settings:storage.volumes_ceph.value == true
type: checkbox
value: false
weight: 10
syslog:
metadata:
label: Syslog
weight: 50
syslog_port:
description: Remote syslog port
label: Port
regex:
error: Invalid Syslog port
source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$
type: text
value: '514'
weight: 20
syslog_server:
description: Remote syslog hostname
label: Hostname
type: text
value: ''
weight: 10
syslog_transport:
label: Syslog transport protocol
type: radio
value: tcp
values:
- data: udp
description: ''
label: UDP
- data: tcp
description: ''
label: TCP
weight: 30
use_fedora_lt:
kernel:
label: Select kernel
type: radio
value: default_kernel
values:
- data: default_kernel
description: Install default 2.6.32 kernel.
label: CentOS default kernel
- data: fedora_lt_kernel
description: 'EXPERIMENTAL: Install the Fedora 3.10 longterm kernel instead
of the default 2.6.32 kernel. This kernel may not work with all hardware
platforms, use with caution.'
label: Fedora LT kernel
weight: 55
metadata:
label: Use Fedora longterm kernel
weight: 50
workloads_collector:
enabled:
type: hidden
value: true
metadata:
label: Workloads Collector User
restrictions:
- action: hide
condition: 'true'
weight: 10
password:
type: password
value: nTpksPyC
tenant:
type: text
value: services
user:
type: text
value: fuel_stats_user

View File

@ -0,0 +1,591 @@
editable:
access:
email:
description: Email address for Administrator
label: Email
regex:
error: Invalid email
source: ^\S+@\S+$
type: text
value: admin@localhost
weight: 40
metadata:
label: Access
weight: 10
password:
description: Password for Administrator
label: Password
regex:
error: Empty password
source: \S
type: password
value: admin
weight: 20
tenant:
description: Tenant (project) name for Administrator
label: Tenant
regex:
error: Invalid tenant name
source: ^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?![Gg]uest$)(?!.*
+.*$).+
type: text
value: admin
weight: 30
user:
description: Username for Administrator
label: Username
regex:
error: Invalid username
source: ^(?!services$)(?!nova$)(?!glance$)(?!keystone$)(?!neutron$)(?!cinder$)(?!swift$)(?!ceph$)(?![Gg]uest$)(?!.*
+.*$).+
type: text
value: admin
weight: 10
additional_components:
ceilometer:
description: If selected, Ceilometer component will be installed
label: Install Ceilometer
type: checkbox
value: false
weight: 40
heat:
description: ''
label: ''
type: hidden
value: true
weight: 30
metadata:
label: Additional Components
weight: 20
mongo:
description: If selected, You can use external Mongo DB as ceilometer backend
label: Use external Mongo DB
restrictions:
- settings:additional_components.ceilometer.value == false
type: checkbox
value: false
weight: 40
murano:
description: If selected, Murano component will be installed
label: Install Murano
restrictions:
- cluster:net_provider != 'neutron'
type: checkbox
value: false
weight: 20
sahara:
description: If selected, Sahara component will be installed
label: Install Sahara
type: checkbox
value: false
weight: 10
common:
auth_key:
description: Public key(s) to include in authorized_keys on deployed nodes
label: Public Key
type: textarea
value: ''
weight: 70
auto_assign_floating_ip:
description: If selected, OpenStack will automatically assign a floating IP
to a new instance
label: Auto assign floating IP
restrictions:
- action: hide
condition: cluster:net_provider == 'neutron'
type: checkbox
value: false
weight: 40
debug:
description: Debug logging mode provides more information, but requires more
disk space.
label: OpenStack debug logging
type: checkbox
value: false
weight: 20
libvirt_type:
label: Hypervisor type
type: radio
value: qemu
values:
- data: kvm
description: Choose this type of hypervisor if you run OpenStack on hardware
label: KVM
- data: qemu
description: Choose this type of hypervisor if you run OpenStack on virtual
hosts.
label: QEMU
weight: 30
metadata:
label: Common
weight: 30
nova_quota:
description: Quotas are used to limit CPU and memory usage for tenants. Enabling
quotas will increase load on the Nova database.
label: Nova quotas
type: checkbox
value: false
weight: 25
puppet_debug:
description: Debug puppet logging mode provides more information, but requires
more disk space.
label: Puppet debug logging
type: checkbox
value: true
weight: 20
resume_guests_state_on_host_boot:
description: Whether to resume previous guests state when the host reboots.
If enabled, this option causes guests assigned to the host to resume their
previous state. If the guest was running a restart will be attempted when
nova-compute starts. If the guest was not running previously, a restart will
not be attempted.
label: Resume guests state on host boot
type: checkbox
value: true
weight: 60
use_cow_images:
description: For most cases you will want qcow format. If it's disabled, raw
image format will be used to run VMs. OpenStack with raw format currently
does not support snapshotting.
label: Use qcow format for images
type: checkbox
value: true
weight: 50
use_vcenter:
type: hidden
value: false
weight: 30
corosync:
group:
description: ''
label: Group
type: text
value: 226.94.1.1
weight: 10
metadata:
label: Corosync
restrictions:
- action: hide
condition: 'true'
weight: 50
port:
description: ''
label: Port
type: text
value: '12000'
weight: 20
verified:
description: Set True only if multicast is configured correctly on router.
label: Need to pass network verification.
type: checkbox
value: false
weight: 10
external_dns:
dns_list:
description: List of upstream DNS servers, separated by comma
label: DNS list
regex:
error: Invalid IP address list
source: ^\*$|^(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3}(?:\s*,\s*(?:\d|1?\d\d|2[0-4]\d|25[0-5])(?:\.(?:\d|1?\d\d|2[0-4]\d|25[0-5])){3})*$
type: text
value: 8.8.8.8
weight: 10
metadata:
label: Host OS DNS Servers
weight: 90
external_mongo:
hosts_ip:
description: IP Addresses of MongoDB. Use comma to split IPs
label: MongoDB hosts IP
regex:
error: Invalid hosts ip sequence
source: ^(((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?),)*((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$
type: text
value: ''
weight: 30
metadata:
label: External MongoDB
restrictions:
- action: hide
condition: settings:additional_components.mongo.value == false
weight: 20
mongo_db_name:
description: Mongo database name
label: Database name
regex:
error: Invalid database name
source: ^\w+$
type: text
value: ceilometer
weight: 30
mongo_password:
description: Mongo database password
label: Password
regex:
error: Password contains spaces
source: ^\S*$
type: password
value: ceilometer
weight: 30
mongo_replset:
description: Name for Mongo replication set
label: Replset
type: text
value: ''
weight: 30
mongo_user:
description: Mongo database username
label: Username
regex:
error: Empty username
source: ^\w+$
type: text
value: ceilometer
weight: 30
external_ntp:
metadata:
label: Host OS NTP Servers
weight: 100
ntp_list:
description: List of upstream NTP servers, separated by comma
label: NTP server list
regex:
error: Invalid NTP server list
source: ^\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(?:\.\d{1,3}){3})\s*(?:,\s*(?:(?:\w+(?:-+\w+)*\.)+[a-z]+|\d{1,3}(\.\d{1,3}){3})\s*)*$
type: text
value: 0.pool.ntp.org, 1.pool.ntp.org, 2.pool.ntp.org
weight: 10
fuel-plugin-calamari:
fuel-plugin-calamari_email:
description: Calamari Admin Email
label: Admin Email
regex:
error: Invalid email
source: ^\S+@\S+$
type: text
value: admin@localhost.invalid
weight: 40
fuel-plugin-calamari_password:
description: Calamari Admin Password
label: Admin Password
regex:
error: You must provide a password with at least 4 characters
source: ^[\S]{4,}$
type: password
value: admin
weight: 25
fuel-plugin-calamari_username:
description: Calamari Admin Username
label: Admin Username
regex:
error: You must provide an username with at least 4 characters
source: ^[\S]{4,}$
type: text
value: admin
weight: 25
metadata:
enabled: true
label: Calamari Installer
plugin_id: 4
toggleable: true
weight: 70
kernel_params:
kernel:
description: Default kernel parameters
label: Initial parameters
type: text
value: console=ttyS0,9600 console=tty0 net.ifnames=0 biosdevname=0 rootdelay=90
nomodeset
weight: 45
metadata:
label: Kernel parameters
weight: 40
murano_settings:
metadata:
label: Murano Settings
restrictions:
- action: hide
condition: settings:additional_components.murano.value == false
weight: 20
murano_repo_url:
description: ''
label: Murano Repository URL
type: text
value: http://storage.apps.openstack.org/
weight: 10
neutron_mellanox:
metadata:
enabled: true
label: Mellanox Neutron components
restrictions:
- action: hide
condition: not ('experimental' in version:feature_groups)
toggleable: false
weight: 50
plugin:
label: Mellanox drivers and SR-IOV plugin
type: radio
value: disabled
values:
- data: disabled
description: If selected, Mellanox drivers, Neutron and Cinder plugin will
not be installed.
label: Mellanox drivers and plugins disabled
restrictions:
- settings:storage.iser.value == true
- data: drivers_only
description: If selected, Mellanox Ethernet drivers will be installed to support
networking over Mellanox NIC. Mellanox Neutron plugin will not be installed.
label: Install only Mellanox drivers
restrictions:
- settings:common.libvirt_type.value != 'kvm'
- data: ethernet
description: If selected, both Mellanox Ethernet drivers and Mellanox network
acceleration (Neutron) plugin will be installed.
label: Install Mellanox drivers and SR-IOV plugin
restrictions:
- settings:common.libvirt_type.value != 'kvm' or not (cluster:net_provider
== 'neutron' and networking_parameters:segmentation_type == 'vlan')
weight: 60
vf_num:
description: Note that one virtual function will be reserved to the storage
network, in case of choosing iSER.
label: Number of virtual NICs
restrictions:
- settings:neutron_mellanox.plugin.value != 'ethernet'
type: text
value: '16'
weight: 70
provision:
metadata:
label: Provision
weight: 80
method:
description: Which provision method to use for this cluster.
label: Provision method
type: radio
value: image
values:
- data: image
description: Copying pre-built images on a disk.
label: Image
- data: cobbler
description: Install from scratch using anaconda or debian-installer.
label: (DEPRECATED) Classic (use anaconda or debian-installer)
public_network_assignment:
assign_to_all_nodes:
description: When disabled, public network will be assigned to controllers only
label: Assign public network to all nodes
type: checkbox
value: false
weight: 10
metadata:
label: Public network assignment
restrictions:
- action: hide
condition: cluster:net_provider != 'neutron'
weight: 50
repo_setup:
metadata:
always_editable: true
label: Repositories
weight: 50
repos:
description: 'Please note: the first repository will be considered the operating
system mirror that will be used during node provisioning.
To create a local repository mirror on the Fuel master node, please follow
the instructions provided by running "fuel-createmirror --help" on the Fuel
master node.
Please make sure your Fuel master node has Internet access to the repository
before attempting to create a mirror.
For more details, please refer to the documentation (https://docs.mirantis.com/openstack/fuel/fuel-6.1/operations.html#external-ubuntu-ops).
'
extra_priority: null
type: custom_repo_configuration
value:
- name: ubuntu
priority: null
section: main universe multiverse
suite: trusty
type: deb
uri: http://archive.ubuntu.com/ubuntu/
- name: ubuntu-updates
priority: null
section: main universe multiverse
suite: trusty-updates
type: deb
uri: http://archive.ubuntu.com/ubuntu/
- name: ubuntu-security
priority: null
section: main universe multiverse
suite: trusty-security
type: deb
uri: http://archive.ubuntu.com/ubuntu/
- name: mos
priority: 1050
section: main restricted
suite: mos6.1
type: deb
uri: http://10.20.0.2:8080/2014.2.2-6.1/ubuntu/x86_64
- name: mos-updates
priority: 1050
section: main restricted
suite: mos6.1-updates
type: deb
uri: http://mirror.fuel-infra.org/mos/ubuntu/
- name: mos-security
priority: 1050
section: main restricted
suite: mos6.1-security
type: deb
uri: http://mirror.fuel-infra.org/mos/ubuntu/
- name: mos-holdback
priority: 1100
section: main restricted
suite: mos6.1-holdback
type: deb
uri: http://mirror.fuel-infra.org/mos/ubuntu/
- name: Auxiliary
priority: 1150
section: main restricted
suite: auxiliary
type: deb
uri: http://10.20.0.2:8080/2014.2.2-6.1/ubuntu/auxiliary
storage:
ephemeral_ceph:
description: Configures Nova to store ephemeral volumes in RBD. This works best
if Ceph is enabled for volumes and images, too. Enables live migration of
all types of Ceph backed VMs (without this option, live migration will only
work with VMs launched from Cinder volumes).
label: Ceph RBD for ephemeral volumes (Nova)
type: checkbox
value: true
weight: 75
images_ceph:
description: Configures Glance to use the Ceph RBD backend to store images.
If enabled, this option will prevent Swift from installing.
label: Ceph RBD for images (Glance)
restrictions:
- settings:storage.images_vcenter.value == true: Only one Glance backend could
be selected.
type: checkbox
value: true
weight: 30
images_vcenter:
description: Configures Glance to use the vCenter/ESXi backend to store images.
If enabled, this option will prevent Swift from installing.
label: VMWare vCenter/ESXi datastore for images (Glance)
restrictions:
- action: hide
condition: settings:common.use_vcenter.value != true
- condition: settings:storage.images_ceph.value == true
message: Only one Glance backend could be selected.
type: checkbox
value: false
weight: 35
iser:
description: 'High performance block storage: Cinder volumes over iSER protocol
(iSCSI over RDMA). This feature requires SR-IOV capabilities in the NIC, and
will use a dedicated virtual function for the storage network.'
label: iSER protocol for volumes (Cinder)
restrictions:
- settings:storage.volumes_lvm.value != true or settings:common.libvirt_type.value
!= 'kvm'
- action: hide
condition: not ('experimental' in version:feature_groups)
type: checkbox
value: false
weight: 11
metadata:
label: Storage
weight: 60
objects_ceph:
description: Configures RadosGW front end for Ceph RBD. This exposes S3 and
Swift API Interfaces. If enabled, this option will prevent Swift from installing.
label: Ceph RadosGW for objects (Swift API)
restrictions:
- settings:storage.images_ceph.value == false
type: checkbox
value: false
weight: 80
osd_pool_size:
description: Configures the default number of object replicas in Ceph. This
number must be equal to or lower than the number of deployed 'Storage - Ceph
OSD' nodes.
label: Ceph object replication factor
regex:
error: Invalid number
source: ^[1-9]\d*$
type: text
value: '2'
weight: 85
volumes_ceph:
description: Configures Cinder to store volumes in Ceph RBD images.
label: Ceph RBD for volumes (Cinder)
restrictions:
- settings:storage.volumes_lvm.value == true
type: checkbox
value: true
weight: 20
volumes_lvm:
description: It is recommended to have at least one Storage - Cinder LVM node.
label: Cinder LVM over iSCSI for volumes
restrictions:
- settings:storage.volumes_ceph.value == true
type: checkbox
value: false
weight: 10
syslog:
metadata:
label: Syslog
weight: 50
syslog_port:
description: Remote syslog port
label: Port
regex:
error: Invalid Syslog port
source: ^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$
type: text
value: '514'
weight: 20
syslog_server:
description: Remote syslog hostname
label: Hostname
type: text
value: ''
weight: 10
syslog_transport:
label: Syslog transport protocol
type: radio
value: tcp
values:
- data: udp
description: ''
label: UDP
- data: tcp
description: ''
label: TCP
weight: 30
workloads_collector:
enabled:
type: hidden
value: true
metadata:
label: Workloads Collector User
restrictions:
- action: hide
condition: 'true'
weight: 10
password:
type: password
value: tuFojcL6
tenant:
type: text
value: services
user:
type: text
value: fuel_stats_user

81
test/simple-install Executable file
View File

@ -0,0 +1,81 @@
#!/bin/sh
set -x
set -u
# This is a simple script to automate the deploy of the plugin used
# for testing until we have a full CI
# Run it on the master node after copying the plugin into this
# directory
# This is a work in progress
MASTER_IP="10.20.0.2"
MASTER_ADDR="http://10.20.0.2:8000"
MASTER_USER="admin"
MASTER_PASS="admin"
MASTER_SSH_USER="root"
MASTER_SSH_PASS="r00tme"
# 1 means redhat (usually)!
# 2 means ubuntu (usually)!
RELEASE_ID="2"
# keep in sync with release id!
RELEASE_NAME="ubuntu"
# scp fuel-plugin-calamari-*.noarch.rpm ${MASTER_IP}:
# ssh ${MASTER_SSH_USER}@${MASTER_IP}:
fuel plugins --install fuel-plugin-calamari-*.noarch.rpm
# Create a new env
# rel 2 means ubuntu (usually)!
fuel env create --name test1 --rel ${RELEASE_ID} --mode ha --net neutron --nst gre
# Get the new (the last) env id
FUEL_ENV=`fuel env | sed -ne '3,$p' | cut -d '|' -f 1 | sort -rn | head -n1 | tr -d ' '`
# Get the first node (we assume all nodes are for ours and unallocated)
FIRST_NODE=`fuel node | sed -ne '3,$p' | cut -d '|' -f 1 | sort -n | head -n1 | tr -d ' '`
# Get the CALAMARI_PLUGIN_ID, for settings workaround
CALAMARI_PLUGIN_ID=`fuel plugins | sed -ne '3,$p' | grep fuel-plugin-calamari | cut -d '|' -f 1 | sort -n | head -n1 | tr -d ' '`
# Upload network settings
if [ -e 'network_default.yaml' ]
then
cp network_default.yaml network_${FUEL_ENV}.yaml
fuel --env $FUEL_ENV network upload
rm network_${FUEL_ENV}.yaml
fi
# Copy the default settings for the env with proper plugin id assuming
# that calamari is the only plugin enabled here!
sed -e "s/plugin_id:.*/plugin_id: $CALAMARI_PLUGIN_ID/" < settings_default_${RELEASE_NAME}.yaml > settings_${FUEL_ENV}.yaml
# Upload the settings
fuel --env $FUEL_ENV settings upload
# Remove the temp file for the env
rm settings_${FUEL_ENV}.yaml
# Add the nodes
fuel node set --env $FUEL_ENV --node $FIRST_NODE --role controller
fuel node set --env $FUEL_ENV --node $(($FIRST_NODE + 1)) --role compute,ceph-osd
fuel node set --env $FUEL_ENV --node $(($FIRST_NODE + 2)) --role compute,ceph-osd
fuel node set --env $FUEL_ENV --node $(($FIRST_NODE + 3)) --role base-os
# Workaround for setting the base-os name to calamari (there is no api yet)
AUTH=`curl -s -H "Content-Type: application/json" -X POST -d '{"auth":{"passwordCredentials":{"username":"admin","password":"admin"},"tenantName":"admin"}}' ${MASTER_ADDR}/keystone/v2.0/tokens | python -c 'import sys, json; j=json.load(sys.stdin); print j["access"]["token"]["id"]'`
curl -s -H "X-Auth-Token: $AUTH" -X PUT -d '{"name":"calamari"}' ${MASTER_ADDR}/api/nodes/$(($FIRST_NODE + 3))
# Node provisioning
fuel --env $FUEL_ENV node --provision --node $FIRST_NODE,$(($FIRST_NODE + 1)),$(($FIRST_NODE + 2)),$(($FIRST_NODE + 3))
# Wait for provisioning to complete
sleep 5;
while fuel node | grep -q provisioning; do date ; sleep 10; done
# Node deploy
fuel --env $FUEL_ENV node --deploy --node $FIRST_NODE,$(($FIRST_NODE + 1)),$(($FIRST_NODE + 2)),$(($FIRST_NODE + 3))

30
wip/python-msgpack-python Normal file
View File

@ -0,0 +1,30 @@
### Build me with the command
### equivs-build python-msgpack-python
### Commented entries have reasonable defaults.
### Uncomment to edit them.
# Source: <source package name; defaults to package name>
Section: misc
Priority: optional
# Homepage: <enter URL here; no default>
Standards-Version: 3.9.2
Package: python-msgpack-python
# Version: <enter version here; defaults to 1.0>
# Maintainer: Your Name <yourname@example.com>
# Pre-Depends: <comma-separated list of packages>
# Depends: <comma-separated list of packages>
# Recommends: <comma-separated list of packages>
# Suggests: <comma-separated list of packages>
# Provides: <comma-separated list of packages>
# Replaces: <comma-separated list of packages>
# Architecture: all
# Copyright: <copyright file; defaults to GPL2>
# Changelog: <changelog file; defaults to a generic changelog>
# Readme: <README.Debian file; defaults to a generic one>
# Extra-Files: <comma-separated list of additional files for the doc directory>
# Files: <pair of space-separated paths; First is file to include, second is destination>
# <more pairs, if there's more than one file to include. Notice the starting space>
Description: Fake package to satisfy calamari-server_1.0.0-1 dependecies
No long description
.
No second par