Fuel Nuage Plugin

Nuage Fuel Plugin adds functionality to provide
Nuage SDN for Mirantis Openstack

Change-Id: I488de817a571b88fe0310958a832731d3fece685
This commit is contained in:
Rohan Parulekar 2016-02-09 18:02:51 -05:00
parent 3f66861fc8
commit 2a70f6781c
41 changed files with 1140 additions and 0 deletions

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.

4
README.md Normal file
View File

@ -0,0 +1,4 @@
fuel-plugin-nuage
============
Plugin description

View File

@ -0,0 +1,90 @@
# Copyright 2015 Alcatel-Lucent USA Inc.
#
# 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.
import argparse
import logging
import os
import sys
from uuid import getnode
def dummy(msg):
return msg
import __builtin__
__builtin__.__dict__['_'] = dummy
def get_mac():
mac = getnode()
return ':'.join(("%012X" % mac)[i:i + 2] for i in range(0, 12, 2))
DEFAULT_CMS_NAME = 'OpenStack_' + get_mac()
from restproxy import RESTProxyServer
logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)
logger.addHandler(logging.StreamHandler())
REST_SUCCESS_CODES = range(200, 207)
def init_arg_parser():
parser = argparse.ArgumentParser()
parser.add_argument('--server', action='store', required=True,
help='VSD IP address')
parser.add_argument('--serverauth', action='store', required=True,
help='VSD login username and password')
parser.add_argument('--organization', action='store', required=True,
help='VSD organization')
parser.add_argument('--auth_resource', action='store', required=True,
help='VSD auth resource')
parser.add_argument('--serverssl', action='store', required=True,
help='VSD Server SSL')
parser.add_argument('--base_uri', action='store', required=True,
help='Nuage Base URI')
parser.add_argument('--name', action='store',
default=DEFAULT_CMS_NAME,
help='The name of the CMS to create on VSD')
return parser
def main():
parser = init_arg_parser()
args = parser.parse_args()
try:
restproxy = RESTProxyServer(server=args.server,
base_uri=args.base_uri,
serverssl=args.serverssl,
serverauth=args.serverauth,
auth_resource=args.auth_resource,
organization=args.organization)
except Exception as e:
logger.error('Error in connecting to VSD:%s' % str(e))
sys.exit(1)
response = restproxy.rest_call('POST', "/cms", {'name': args.name})
if response[0] not in REST_SUCCESS_CODES:
logger.error('Failed to create CMS on VSD.')
sys.exit(1)
cms_id = response[3][0]['ID']
cfgfile = open("cms_id.txt",'w')
cfgfile.write(cms_id)
cfgfile.close()
logger.info("CMS ID generated by Nuage VSD: %s", cms_id)
logger.info("CMS ID has also been stored in auto-generated cms_id.txt file")
logger.info("Provide this CMS ID on the Fuel UI before deploying your Openstack environment")
if __name__ == '__main__':
main()

4
deployment_scripts/deploy.sh Executable file
View File

@ -0,0 +1,4 @@
#!/bin/bash
# It's a script which deploys your plugin
echo fuel-plugin-nuage > /tmp/fuel-plugin-nuage

View File

@ -0,0 +1,10 @@
#!/bin/bash
crm resource stop p_neutron-metadata-agent
crm configure delete p_neutron-metadata-agent
crm resource stop p_neutron-dhcp-agent
crm configure delete p_neutron-dhcp-agent
crm resource stop p_neutron-l3-agent
crm configure delete p_neutron-l3-agent

View File

@ -0,0 +1,30 @@
#!/usr/bin/env bash
lineno=$(iptables -nvL INPUT --line-numbers | grep "state RELATED,ESTABLISHED" | awk '{print $1}')
iptables -I INPUT $lineno -s 0.0.0.0/0 -p udp -m multiport --dports 4789 -m comment --comment "001 vxlan incoming" -j ACCEPT
lineno=$(iptables -nvL INPUT --line-numbers | grep "state NEW,RELATED,ESTABLISHED" | awk '{print $1}')
iptables -I INPUT $lineno -s 0.0.0.0/0 -p tcp -m multiport --dports 9697 -m comment --comment "Nuage metadata listen port for tenant VM metadata requests on compute" -j ACCEPT
iptables-save > /etc/iptables/rules.v4
out=$(cat /proc/net/bonding/bond0 | grep "Slave Interface" | grep "eth")
if [[ " ${out[*]} " == *"eth"* ]]; then
echo "NIC Bonding exists on Openstack nodes"
bond_intf=$(ifconfig -a | grep "bond" | awk '{print $1}')
for intf in $bond_intf
do
(dhclient $intf) & sleep 10 ; kill $!
done
exit 0
else
echo "No NIC Bonding present on Openstack nodes"
fi
intf_list=$(ifconfig -a | grep "eth" | awk '{print $1}')
for intf in $intf_list
do
(dhclient $intf) & sleep 10 ; kill $!
done

View File

@ -0,0 +1,27 @@
#!/usr/bin/env bash
lineno=$(iptables -nvL INPUT --line-numbers | grep "state NEW,RELATED,ESTABLISHED" | awk '{print $1}')
iptables -I INPUT $lineno -s 0.0.0.0/0 -p tcp -m multiport --dports 8775 -m comment --comment "Nuage Metadata Agent listen port on the controller" -j ACCEPT
iptables-save > /etc/iptables/rules.v4
out=$(cat /proc/net/bonding/bond0 | grep "Slave Interface" | grep "eth")
if [[ " ${out[*]} " == *"eth"* ]]; then
echo "NIC Bonding exists on Openstack nodes"
bond_intf=$(ifconfig -a | grep "bond" | awk '{print $1}')
for intf in $bond_intf
do
(dhclient $intf) & sleep 10 ; kill $!
done
exit 0
else
echo "No NIC Bonding present on Openstack nodes"
fi
intf_list=$(ifconfig -a | grep "eth" | awk '{print $1}')
for intf in $intf_list
do
(dhclient $intf) & sleep 10 ; kill $!
done

View File

@ -0,0 +1,19 @@
$hiera_dir = '/etc/hiera/override'
$plugin_name = 'nuage-openstack-fuel-plugin'
$plugin_yaml = "${plugin_name}.yaml"
file {'/etc/hiera/override':
ensure => directory,
} ->
file { "${hiera_dir}/${plugin_yaml}":
ensure => file,
content => template('nuage/compute.plugins.yaml.erb'),
require => File['/etc/hiera/override']
} ->
file_line {"${plugin_name}_hiera_override":
path => '/etc/hiera.yaml',
line => " - override/${plugin_name}",
after => ' - override/module/%{calling_module}',
}

View File

@ -0,0 +1,20 @@
$hiera_dir = '/etc/hiera/override'
$plugin_name = 'nuage-openstack-fuel-plugin'
$plugin_yaml = "${plugin_name}.yaml"
file {'/etc/hiera/override':
ensure => directory,
} ->
file { "${hiera_dir}/${plugin_yaml}":
ensure => file,
content => "quantum_settings:
predefined_networks: ''",
require => File['/etc/hiera/override']
} ->
file_line {"${plugin_name}_hiera_override":
path => '/etc/hiera.yaml',
line => " - override/${plugin_name}",
after => ' - override/module/%{calling_module}',
}

View File

@ -0,0 +1,2 @@
include nuage
include nuage::compute::configure_vrs

View File

@ -0,0 +1,2 @@
include nuage
include nuage::compute::install_nuage_metadata_agent

View File

@ -0,0 +1,8 @@
include nuage
class { 'nuage::compute::nova':
firewall_driver => 'nova.virt.firewall.NoopFirewallDriver',
security_group_api => 'neutron',
libvirt_vif_driver => 'nova.virt.libvirt.vif.LibvirtGenericVIFDriver',
neutron_ovs_bridge => 'alubr0',
}

View File

@ -0,0 +1 @@
include nuage::controller::disable_neutron_services

View File

@ -0,0 +1 @@
include nuage::controller::purge_neutron_packages

View File

@ -0,0 +1 @@
include nuage::controller::install_nuage_neutron

View File

@ -0,0 +1,6 @@
include nuage
class { 'nuage::controller::set_nuage_core_plugin':
core_plugin => 'neutron.plugins.nuage.plugin.NuagePlugin',
service_plugins => '',
}

View File

@ -0,0 +1,2 @@
include nuage
include nuage::controller::configure_nuage_plugin

View File

@ -0,0 +1,8 @@
include nuage
class { 'nuage::controller::nova':
firewall_driver => 'nova.virt.firewall.NoopFirewallDriver',
security_group_api => 'neutron',
libvirt_vif_driver => 'nova.virt.libvirt.vif.LibvirtGenericVIFDriver',
neutron_ovs_bridge => 'alubr0',
}

View File

@ -0,0 +1,15 @@
# Copyright 2015 Mirantis, Inc.
#
# 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
include nuage

View File

@ -0,0 +1,55 @@
# Configure the VRS on compute
class nuage::compute::configure_vrs {
include ::nuage::params
package { $::nuage::params::openvswitch_switch:
ensure => 'purged',
} ->
package { $::nuage::params::python_twisted:
ensure => 'present',
} ->
package { $::nuage::params::nuage_openvswitch_switch:
ensure => 'present',
require => Package[$::nuage::params::openvswitch_switch]
}
file { '/etc/default/openvswitch-switch':
require => Package[$::nuage::params::nuage_openvswitch_switch],
notify => Service[$::nuage::params::nuage_openvswitch_switch]
}
File_line<||> ~> Service[$::nuage::params::nuage_openvswitch_switch]
File['/etc/default/openvswitch-switch'] -> File_line<||>
service { $::nuage::params::nuage_openvswitch_switch:
ensure => 'running',
require => Package[$::nuage::params::nuage_openvswitch_switch],
subscribe => File['/etc/default/openvswitch-switch'],
}
file_line { 'openvswitch active controller ip address':
ensure => present,
line => "ACTIVE_CONTROLLER=${nuage::active_controller}",
match => 'ACTIVE_CONTROLLER=',
path => '/etc/default/openvswitch-switch',
}
if $::nuage::backup_controller {
file_line { 'openvswitch backup controller ip address':
ensure => present,
line => "STANDBY_CONTROLLER=${nuage::backup_controller}",
match => 'STANDBY_CONTROLLER=',
path => '/etc/default/openvswitch-switch',
}
}
if $::nuage::pat_to_underlay {
file_line { 'openvswitch uplink interface for pat to underlay':
ensure => present,
line => "NETWORK_UPLINK_INTF=${nuage::network_uplink_intf}",
match => 'NETWORK_UPLINK_INTF=',
path => '/etc/default/openvswitch-switch',
}
}
}

View File

@ -0,0 +1,23 @@
# Install nuage metadata agent packages
class nuage::compute::install_nuage_metadata_agent {
include ::nuage::params
package { $::nuage::params::python_novaclient:
ensure => present,
}
package { $::nuage::params::nuage_metadata_agent:
ensure => present,
require => Package[$::nuage::params::python_novaclient]
} ->
file { '/etc/default/nuage-metadata-agent':
content => template('nuage/nuage-metadata-agent.erb'),
notify => Service[$::nuage::params::nuage_openvswitch_switch],
}
service { $::nuage::params::nuage_openvswitch_switch:
subscribe => File['/etc/default/nuage-metadata-agent'],
}
}

View File

@ -0,0 +1,26 @@
# Nova parameters for Nuage
class nuage::compute::nova (
$firewall_driver,
$security_group_api,
$libvirt_vif_driver,
$neutron_ovs_bridge,
) {
include ::nuage::params
service { $::nuage::params::nova_compute:
ensure => running,
enable => true,
}
Nova_config<||> ~> Service[$::nuage::params::nova_compute]
#Setting nova.conf parameters on all Openstack nodes
nova_config {
'DEFAULT/firewall_driver': value => $firewall_driver;
'DEFAULT/security_group_api': value => $security_group_api;
'DEFAULT/libvirt_vif_driver' : value => $libvirt_vif_driver;
'neutron/ovs_bridge' : value => $neutron_ovs_bridge;
}
}

View File

@ -0,0 +1,44 @@
# Configure Nuage neutron plugin
class nuage::controller::configure_nuage_plugin {
include ::nuage::params
service { $::nuage::params::neutron_server:
ensure => running,
enable => true,
subscribe => File['/etc/neutron/plugin.ini']
}
package { $::nuage::params::nuage_neutron:
ensure => present,
} ->
file { '/etc/neutron/plugins/nuage':
ensure => directory,
owner => 'root',
group => 'neutron',
mode => '0640'
} ->
file { '/etc/neutron/plugins/nuage/plugin.ini':
ensure => 'present',
require => File['/etc/neutron/plugins/nuage'],
content => template('nuage/plugin.ini.erb'),
} ->
file {'/etc/neutron/plugin.ini':
ensure => link,
target => '/etc/neutron/plugins/nuage/plugin.ini',
require => Package[$::nuage::params::nuage_neutron],
notify => Service[$::nuage::params::neutron_server]
}
if $::nuage::pat_to_underlay {
file_line { 'config flag in nuage plugin file for pat to underlay':
ensure => present,
line => "nuage_pat = default_enabled",
match => 'nuage_pat =',
path => '/etc/neutron/plugins/nuage/plugin.ini',
require => File['/etc/neutron/plugins/nuage/plugin.ini'],
notify => Service[$::nuage::params::neutron_server]
}
}
}

View File

@ -0,0 +1,25 @@
# Disable non-essential neutron services
class nuage::controller::disable_neutron_services {
include ::nuage::params
service { $::nuage::params::neutron_dhcp_agent:
ensure => 'stopped'
}
service { $::nuage::params::neutron_l3_agent:
ensure => 'stopped'
}
service { $::nuage::params::neutron_metadata_agent:
ensure => 'stopped'
}
service { $::nuage::params::neutron_plugin_openvswitch_agent:
ensure => 'stopped'
}
service { $::nuage::params::openvswitch_switch:
ensure => 'stopped'
}
}

View File

@ -0,0 +1,18 @@
# Install Nuage neutron packages
class nuage::controller::install_nuage_neutron {
include ::nuage::params
package { $::nuage::params::nuage_neutron:
ensure => present,
}
package { $::nuage::params::nuage_openstack_neutronclient:
ensure => present,
}
package { $::nuage::params::nuage_python_nuagenetlib:
ensure => present,
}
}

View File

@ -0,0 +1,42 @@
# Nova parameters for Nuage
class nuage::controller::nova (
$firewall_driver,
$security_group_api,
$libvirt_vif_driver,
$neutron_ovs_bridge,
) {
include ::nuage::params
service { $::nuage::params::nova_api:
ensure => running,
enable => true,
}
service { $::nuage::params::nova_scheduler:
ensure => running,
enable => true,
}
service { $::nuage::params::nova_conductor:
ensure => running,
enable => true,
}
Nova_config<||> ~> Service[$::nuage::params::nova_api,
$::nuage::params::nova_scheduler,
$::nuage::params::nova_conductor]
#Setting nova.conf parameters on all Openstack nodes
nova_config {
'DEFAULT/firewall_driver': value => $firewall_driver;
'DEFAULT/security_group_api': value => $security_group_api;
'DEFAULT/libvirt_vif_driver' : value => $libvirt_vif_driver;
'DEFAULT/use_forwarded_for' : value => 'True';
'DEFAULT/instance_name_template' : value => 'inst-%08x';
'DEFAULT/metadata_listen_port' : value => $nuage::nova_metadata_port;
'neutron/ovs_bridge' : value => $neutron_ovs_bridge;
'neutron/service_metadata_proxy' : value => 'True';
}
}

View File

@ -0,0 +1,26 @@
# Purge non-essential neutron packages
class nuage::controller::purge_neutron_packages {
include ::nuage::params
package { $::nuage::params::neutron_dhcp_agent:
ensure => 'purged'
}
package { $::nuage::params::neutron_l3_agent:
ensure => 'purged'
}
package { $::nuage::params::neutron_metadata_agent:
ensure => 'purged'
}
package { $::nuage::params::neutron_plugin_openvswitch_agent:
ensure => 'purged'
}
package { $::nuage::params::openvswitch_switch:
ensure => 'purged'
}
}

View File

@ -0,0 +1,14 @@
#Set neutron core plugin to nuage
class nuage::controller::set_nuage_core_plugin (
$core_plugin,
$service_plugins,
) {
#Setting core plugin to be Nuage and disabling service plugins
neutron_config {
'DEFAULT/core_plugin' : value => $core_plugin;
'DEFAULT/service_plugins': value => $service_plugins;
}
}

View File

@ -0,0 +1,33 @@
# Parameters for configuring Nuage Fuel plugin
class nuage {
$settings = hiera('nuage-openstack-fuel-plugin')
$nova_settings=hiera('nova')
$neutron_settings=hiera_hash('quantum_settings', {})
$nova_auth_ip=hiera('management_vip')
$net_partition_name = $settings['nuage_net_partition_name']
$vsd_ip = $settings['nuage_vsd_ip']
$vsd_username = $settings['nuage_vsd_username']
$vsd_password = $settings['nuage_vsd_password']
$vsd_organization = $settings['nuage_vsd_organization']
$base_uri_version = $settings['nuage_base_uri_version']
$active_controller = $settings['nuage_active_vsc_ip']
$backup_controller = $settings['nuage_backup_vsc_ip']
## Metadata settings
$metadata_port = $settings['metadata_port']
$nova_metadata_port = $settings['nova_metadata_port']
$nova_region_name = $settings['nova_region_name']
$nova_api_endpoint_type = $settings['nova_api_endpoint_type']
$metadata_secret=$neutron_settings['metadata']['metadata_proxy_shared_secret']
$nova_os_password = $nova_settings['user_password']
$nova_client_version = '2'
$nova_os_username = 'nova'
$nova_os_tenant_name = 'services'
$metadata_agent_start_with_ovs = 'true'
$nuage_cms_id = $settings['nuage_cms_id']
$pat_to_underlay = $settings['pat_to_underlay']
$network_uplink_intf = $settings['pat_to_underlay_uplink_intf']
}

View File

@ -0,0 +1,50 @@
# OS specific parameters for the nuage plugin
class nuage::params {
if ($::osfamily == 'Redhat') {
$nova_api = 'nova-api'
$nova_scheduler = 'nova-scheduler'
$nova_conductor = 'nova-conductor'
$nova_compute = 'nova-compute'
$neutron_dhcp_agent = 'neutron-dhcp-agent'
$neutron_l3_agent = 'neutron-l3-agent'
$neutron_metadata_agent = 'neutron-metadata-agent'
$neutron_plugin_openvswitch_agent = 'neutron-openvswitch-agent'
$neutron_server = 'neutron-server'
$openvswitch_switch = 'openvswitch'
$python_novaclient = 'python-novaclient'
$python_twisted = 'python-twisted'
$nuage_neutron = 'nuage-neutron'
$nuage_metadata_agent = 'nuage-metadata-agent'
$nuage_openstack_neutronclient = 'nuage-openstack-neutronclient'
$nuage_python_nuagenetlib = 'nuagenetlib'
$nuage_openvswitch_switch = 'nuage-openvswitch'
} elsif($::osfamily == 'Debian') {
$nova_api = 'nova-api'
$nova_scheduler = 'nova-scheduler'
$nova_conductor = 'nova-conductor'
$nova_compute = 'nova-compute'
$neutron_dhcp_agent = 'neutron-dhcp-agent'
$neutron_l3_agent = 'neutron-l3-agent'
$neutron_metadata_agent = 'neutron-metadata-agent'
$neutron_plugin_openvswitch_agent = 'neutron-plugin-openvswitch-agent'
$neutron_server = 'neutron-server'
$openvswitch_switch = 'openvswitch-switch'
$python_novaclient = 'python-novaclient'
$python_twisted = 'python-twisted'
$nuage_neutron = 'nuage-openstack-neutron'
$nuage_metadata_agent = 'nuage-metadata-agent'
$nuage_openstack_neutronclient = 'nuage-openstack-neutronclient'
$nuage_python_nuagenetlib = 'nuagenetlib'
$nuage_openvswitch_switch = 'nuage-openvswitch-switch'
}
}

View File

@ -0,0 +1 @@
openstack::network::agents: []

View File

@ -0,0 +1,30 @@
# Copyright (C) 2014, Nuage Networks
# METADATA_PORT: TCP Port to listen for metadata server requests
# (metadata_port in neutron.conf)
METADATA_PORT=<%= scope.lookupvar('nuage::metadata_port') %>
# NOVA_METADATA_IP: IP address used by Nova metadata server
# (nova_metadata_ip in neutron.conf)
NOVA_METADATA_IP=<%= scope.lookupvar('nuage::nova_auth_ip') %>
# NOVA_METADATA_PORT: TCP Port used by Nova metadata server
# (metadata_listen_port in nova.conf or nova_metadata_port in neutron.conf)
NOVA_METADATA_PORT=<%= scope.lookupvar('nuage::nova_metadata_port') %>
# METADATA_PROXY_SHARED_SECRET: Shared secret to sign the instance-id
# request. Must match metadata_proxy_shared_secret in nova.conf
METADATA_PROXY_SHARED_SECRET="<%= scope.lookupvar('nuage::metadata_secret') %>"
# NOVA_CLIENT_VERSION:
NOVA_CLIENT_VERSION=<%= scope.lookupvar('nuage::nova_client_version') %>
# NOVA_OS_USERNAME:
NOVA_OS_USERNAME=<%= scope.lookupvar('nuage::nova_os_username') %>
# NOVA_OS_PASSWORD:
NOVA_OS_PASSWORD=<%= scope.lookupvar('nuage::nova_os_password') %>
# NOVA_OS_TENANT_NAME:
NOVA_OS_TENANT_NAME=<%= scope.lookupvar('nuage::nova_os_tenant_name') %>
# NOVA_OS_AUTH_URL:
NOVA_OS_AUTH_URL=http://<%= scope.lookupvar('nuage::nova_auth_ip') %>:5000/v2.0
# NUAGE_METADATA_AGENT_START_WITH_OVS: if nuage-metadata-agent needs to be
# started with nuage-openvswitch-switch
NUAGE_METADATA_AGENT_START_WITH_OVS=<%= scope.lookupvar('nuage::metadata_agent_start_with_ovs') %>
# NOVA_API_ENDPOINT_TYPE: one of publicURL, internalURL, adminURL
NOVA_API_ENDPOINT_TYPE=<%= scope.lookupvar('nuage::nova_api_endpoint_type') %>
# NOVA_REGION_NAME:
NOVA_REGION_NAME=<%= scope.lookupvar('nuage::nova_region_name') %>

View File

@ -0,0 +1,17 @@
[RESTPROXY]
# Desired Name of VSD Organization/Enterprise to use when net-partition
# is not specified
default_net_partition_name = <%= scope.lookupvar('nuage::net_partition_name') %>
# Hostname or IP address and port for connection to VSD server
server = <%= scope.lookupvar('nuage::vsd_ip') %>
# VSD Username and password for OpenStack plugin connection
# User must belong to CSP Root group and CSP CMS group
serverauth = <%= scope.lookupvar('nuage::vsd_username') %>:<%= scope.lookupvar('nuage::vsd_password') %>
### Do not change the below options for standard installs
organization = <%= scope.lookupvar('nuage::vsd_organization') %>
auth_resource = /me
serverssl = True
base_uri = /nuage/api/<%= scope.lookupvar('nuage::base_uri_version') %>
cms_id = <%= scope.lookupvar('nuage::nuage_cms_id') %>
nuage_pat = default_disabled

View File

@ -0,0 +1,12 @@
#!/usr/bin/env bash
source ~/openrc
neutron net-list
if [ "$?" = "0" ]; then
echo "Neutron successfully started with Nuage Plugin"
exit 0
else
echo "Neutron failed to start with Nuage Plugin"
exit 1
fi

19
deployment_tasks.yaml Normal file
View File

@ -0,0 +1,19 @@
- id: controller-hiera-override
type: puppet
groups: [primary-controller, controller]
required_for: [globals]
requires: [hiera]
parameters:
puppet_manifest: puppet/manifests/controller-hiera-override.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 720
- id: compute-hiera-override
type: puppet
groups: ['compute']
required_for: [globals]
requires: [hiera]
parameters:
puppet_manifest: puppet/manifests/compute-hiera-override.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 720

115
environment_config.yaml Normal file
View File

@ -0,0 +1,115 @@
attributes:
# Show Nuage plugin option only in supported network config
metadata:
restrictions:
- condition: "not (cluster:net_provider == 'neutron' and networking_parameters:segmentation_type == 'vlan')"
message: "Please use Neutron with VLAN segmentation, the only network type supported with Nuage plugin."
nuage_net_partition_name:
value: ''
label: 'Nuage Net Partition name'
description: 'Nuage Net Partition name for VSD'
weight: 20
type: "text"
nuage_vsd_ip:
value: ''
label: 'VSD IP address'
description: 'VSD Management IP address'
weight: 30
type: "text"
regex:
source: '(^(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))((:8443)|(:443))$'
error: "Valid format for VSD IP is VSD-IP:8443 for standalone VSD and VSD-IP:443 for clustered VSD"
nuage_vsd_username:
value: ''
label: 'VSD username'
description: 'VSD user'
weight: 40
type: "text"
nuage_vsd_password:
value: ''
label: 'VSD password'
description: 'VSD password'
weight: 50
type: "text"
nuage_vsd_organization:
value: ''
label: 'VSD organization name'
description: 'VSD organization'
weight: 60
type: "text"
nuage_base_uri_version:
value: ''
label: 'Nuage base uri version'
description: 'Nuage base uri version number'
weight: 70
type: "text"
regex:
source: '^(v[0-9]{1})_(([0-9]{1}))$'
error: "Invalid base URI version. Example of valid base uri version : v3_2 for VSP release 3.2"
nuage_active_vsc_ip:
value: ''
label: 'Active VSC IP address'
description: 'Active VSC IP address'
weight: 80
type: "text"
regex:
source: '^(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])'
error: "Invalid Active VSC IP address"
nuage_backup_vsc_ip:
value: ''
label: 'Backup VSC IP address'
description: 'Backup VSC IP address'
weight: 90
type: "text"
regex:
source: '(^(?:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]))|\s+'
error: "Invalid Standby VSC IP address"
metadata_port:
value: '9697'
label: 'Nuage Metadata agent port number'
description: 'Nuage Metadata agent port number'
weight: 100
type: "text"
nova_metadata_port:
value: '8775'
label: 'Nova metadata port number'
description: 'Nova metadata port number'
weight: 110
type: "text"
nova_region_name:
value: 'RegionOne'
label: 'Nova Region Name'
description: 'Nova Region name'
weight: 120
type: "text"
nuage_cms_id:
value: ''
label: 'Nuage CMS ID'
description: 'Nuage CMS ID'
weight: 130
type: "text"
pat_to_underlay:
value: false
label: "PAT to Underlay"
description: "If selected, PAT to underlay feature will be enabled"
weight: 140
type: "checkbox"
pat_to_underlay_uplink_intf:
value: 'br-mgmt'
label: 'Uplink Interface for PAT to Underlay feature'
description: 'Provide an uplink interface only if PAT to Underlay feature enabled'
weight: 150
type: "text"
nova_api_endpoint_type:
type: "radio"
weight: 160
value: "publicURL"
label: "Nova API endpoint type"
description: "Select Nova API endpoint type"
values:
- data: "publicURL"
label: "publicURL"
- data: "internalURL"
label: "internalURL"
- data: "adminURL"
label: "adminURL"

30
metadata.yaml Normal file
View File

@ -0,0 +1,30 @@
# Plugin name
name: nuage-openstack-fuel-plugin
# Human-readable name for your plugin
title: Fuel Nuage plugin
# Plugin version
version: '1.0.0'
# Description
description: Nuage plugin for Fuel provides the functionality to add Nuage SDN for Mirantis OpenStack
# Required fuel version
fuel_version: ['7.0']
# Specify license of your plugin
licenses: ['Apache License Version 2.0']
# Specify author or company name
authors: ['Rohan Parulekar, Vishal Patil']
# A link to the plugin's page
homepage: 'https://github.com/stackforge/fuel-plugins'
# Specify a group which your plugin implements, possible options:
# network, storage, storage::cinder, storage::glance, hypervisor
groups: []
# The plugin is compatible with releases in the list
releases:
- os: ubuntu
version: 2015.1.0-7.0
mode: ['ha']
deployment_scripts_path: deployment_scripts/
repository_path: repositories/ubuntu
# Version of plugin package
package_version: '3.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

View File

103
tasks.yaml Normal file
View File

@ -0,0 +1,103 @@
- role: ['primary-controller']
stage: post_deployment/6001
type: shell
parameters:
cmd: sudo bash ./disable_pacemaker_neutron_services.sh
timeout: 720
fail_on_error: false
- role: ['primary-controller','controller']
stage: post_deployment/6002
type: shell
parameters:
cmd: sudo bash ./pre_controller_setup.sh
timeout: 720
fail_on_error: false
- role: ['compute']
stage: post_deployment/6003
type: shell
parameters:
cmd: sudo bash ./pre_compute_setup.sh
timeout: 720
fail_on_error: false
- role: ['primary-controller','controller']
stage: post_deployment/6004
type: puppet
parameters:
puppet_manifest: puppet/manifests/site-controller-post-1.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 720
- role: ['primary-controller','controller']
stage: post_deployment/6005
type: puppet
parameters:
puppet_manifest: puppet/manifests/site-controller-post-2.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 720
- role: ['primary-controller','controller']
stage: post_deployment/6006
type: puppet
parameters:
puppet_manifest: puppet/manifests/site-controller-post-3.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 720
- role: ['primary-controller','controller']
stage: post_deployment/6007
type: puppet
parameters:
puppet_manifest: puppet/manifests/site-controller-post-4.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 720
- role: ['primary-controller','controller']
stage: post_deployment/6008
type: puppet
parameters:
puppet_manifest: puppet/manifests/site-controller-post-5.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 720
- role: ['primary-controller','controller']
stage: post_deployment/6009
type: puppet
parameters:
puppet_manifest: puppet/manifests/site-controller-post-6.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 720
- role: ['compute']
stage: post_deployment/6010
type: puppet
parameters:
puppet_manifest: puppet/manifests/site-compute-post-1.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 720
- role: ['compute']
stage: post_deployment/6011
type: puppet
parameters:
puppet_manifest: puppet/manifests/site-compute-post-2.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 720
- role: ['compute']
stage: post_deployment/6012
type: puppet
parameters:
puppet_manifest: puppet/manifests/site-compute-post-3.pp
puppet_modules: puppet/modules:/etc/puppet/modules
timeout: 720
- role: ['primary-controller','controller']
stage: post_deployment/6013
type: shell
parameters:
cmd: sudo bash ./test_neutron_setup_with_nuage_plugin.sh
timeout: 720
fail_on_error: true