1
# Copyright 2014-2015 Canonical Limited.
3
# This file is part of charm-helpers.
5
# charm-helpers is free software: you can redistribute it and/or modify
6
# it under the terms of the GNU Lesser General Public License version 3 as
7
# published by the Free Software Foundation.
9
# charm-helpers is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
# GNU Lesser General Public License for more details.
14
# You should have received a copy of the GNU Lesser General Public License
15
# along with charm-helpers. If not, see <http://www.gnu.org/licenses/>.
17
# Various utilies for dealing with Neutron and the renaming from Quantum.
19
from subprocess import check_output
21
from charmhelpers.core.hookenv import (
27
from charmhelpers.contrib.openstack.utils import os_release
30
def headers_package():
31
"""Ensures correct linux-headers for running kernel are installed,
32
for building DKMS package"""
33
kver = check_output(['uname', '-r']).decode('UTF-8').strip()
34
return 'linux-headers-%s' % kver
36
QUANTUM_CONF_DIR = '/etc/quantum'
40
""" Retrieve the current major kernel version as a tuple e.g. (3, 13) """
41
kver = check_output(['uname', '-r']).decode('UTF-8').strip()
42
kver = kver.split('.')
43
return (int(kver[0]), int(kver[1]))
46
def determine_dkms_package():
47
""" Determine which DKMS package should be used based on kernel version """
48
# NOTE: 3.13 kernels have support for GRE and VXLAN native
49
if kernel_version() >= (3, 13):
52
return ['openvswitch-datapath-dkms']
58
def quantum_plugins():
59
from charmhelpers.contrib.openstack import context
62
'config': '/etc/quantum/plugins/openvswitch/'
63
'ovs_quantum_plugin.ini',
64
'driver': 'quantum.plugins.openvswitch.ovs_quantum_plugin.'
67
context.SharedDBContext(user=config('neutron-database-user'),
68
database=config('neutron-database'),
69
relation_prefix='neutron',
70
ssl_dir=QUANTUM_CONF_DIR)],
71
'services': ['quantum-plugin-openvswitch-agent'],
72
'packages': [[headers_package()] + determine_dkms_package(),
73
['quantum-plugin-openvswitch-agent']],
74
'server_packages': ['quantum-server',
75
'quantum-plugin-openvswitch'],
76
'server_services': ['quantum-server']
79
'config': '/etc/quantum/plugins/nicira/nvp.ini',
80
'driver': 'quantum.plugins.nicira.nicira_nvp_plugin.'
81
'QuantumPlugin.NvpPluginV2',
83
context.SharedDBContext(user=config('neutron-database-user'),
84
database=config('neutron-database'),
85
relation_prefix='neutron',
86
ssl_dir=QUANTUM_CONF_DIR)],
89
'server_packages': ['quantum-server',
90
'quantum-plugin-nicira'],
91
'server_services': ['quantum-server']
95
NEUTRON_CONF_DIR = '/etc/neutron'
98
def neutron_plugins():
99
from charmhelpers.contrib.openstack import context
100
release = os_release('nova-common')
103
'config': '/etc/neutron/plugins/openvswitch/'
104
'ovs_neutron_plugin.ini',
105
'driver': 'neutron.plugins.openvswitch.ovs_neutron_plugin.'
106
'OVSNeutronPluginV2',
108
context.SharedDBContext(user=config('neutron-database-user'),
109
database=config('neutron-database'),
110
relation_prefix='neutron',
111
ssl_dir=NEUTRON_CONF_DIR)],
112
'services': ['neutron-plugin-openvswitch-agent'],
113
'packages': [[headers_package()] + determine_dkms_package(),
114
['neutron-plugin-openvswitch-agent']],
115
'server_packages': ['neutron-server',
116
'neutron-plugin-openvswitch'],
117
'server_services': ['neutron-server']
120
'config': '/etc/neutron/plugins/nicira/nvp.ini',
121
'driver': 'neutron.plugins.nicira.nicira_nvp_plugin.'
122
'NeutronPlugin.NvpPluginV2',
124
context.SharedDBContext(user=config('neutron-database-user'),
125
database=config('neutron-database'),
126
relation_prefix='neutron',
127
ssl_dir=NEUTRON_CONF_DIR)],
130
'server_packages': ['neutron-server',
131
'neutron-plugin-nicira'],
132
'server_services': ['neutron-server']
135
'config': '/etc/neutron/plugins/vmware/nsx.ini',
138
context.SharedDBContext(user=config('neutron-database-user'),
139
database=config('neutron-database'),
140
relation_prefix='neutron',
141
ssl_dir=NEUTRON_CONF_DIR)],
144
'server_packages': ['neutron-server',
145
'neutron-plugin-vmware'],
146
'server_services': ['neutron-server']
149
'config': '/etc/neutron/plugins/cisco/cisco_plugins.ini',
150
'driver': 'neutron.plugins.cisco.network_plugin.PluginV2',
152
context.SharedDBContext(user=config('neutron-database-user'),
153
database=config('neutron-database'),
154
relation_prefix='neutron',
155
ssl_dir=NEUTRON_CONF_DIR)],
157
'packages': [[headers_package()] + determine_dkms_package(),
158
['neutron-plugin-cisco']],
159
'server_packages': ['neutron-server',
160
'neutron-plugin-cisco'],
161
'server_services': ['neutron-server']
164
'config': '/etc/neutron/plugins/ml2/ml2_conf.ini',
165
'driver': 'neutron.plugins.ml2.plugin.Ml2Plugin',
167
context.SharedDBContext(user=config('neutron-database-user'),
168
database=config('neutron-database'),
169
relation_prefix='neutron',
170
ssl_dir=NEUTRON_CONF_DIR)],
171
'services': ['calico-felix',
173
'neutron-dhcp-agent',
174
'nova-api-metadata'],
175
'packages': [[headers_package()] + determine_dkms_package(),
178
'neutron-dhcp-agent',
179
'nova-api-metadata']],
180
'server_packages': ['neutron-server', 'calico-control'],
181
'server_services': ['neutron-server']
184
if release >= 'icehouse':
185
# NOTE: patch in ml2 plugin for icehouse onwards
186
plugins['ovs']['config'] = '/etc/neutron/plugins/ml2/ml2_conf.ini'
187
plugins['ovs']['driver'] = 'neutron.plugins.ml2.plugin.Ml2Plugin'
188
plugins['ovs']['server_packages'] = ['neutron-server',
189
'neutron-plugin-ml2']
190
# NOTE: patch in vmware renames nvp->nsx for icehouse onwards
191
plugins['nvp'] = plugins['nsx']
195
def neutron_plugin_attribute(plugin, attr, net_manager=None):
196
manager = net_manager or network_manager()
197
if manager == 'quantum':
198
plugins = quantum_plugins()
199
elif manager == 'neutron':
200
plugins = neutron_plugins()
202
log("Network manager '%s' does not support plugins." % (manager),
207
_plugin = plugins[plugin]
209
log('Unrecognised plugin for %s: %s' % (manager, plugin), level=ERROR)
218
def network_manager():
220
Deals with the renaming of Quantum to Neutron in H and any situations
221
that require compatability (eg, deploying H with network-manager=quantum,
224
release = os_release('nova-common')
225
manager = config('network-manager').lower()
227
if manager not in ['quantum', 'neutron']:
230
if release in ['essex']:
231
# E does not support neutron
232
log('Neutron networking not supported in Essex.', level=ERROR)
234
elif release in ['folsom', 'grizzly']:
235
# neutron is named quantum in F and G
238
# ensure accurate naming for all releases post-H