6
4
from charmhelpers.core.hookenv import (
10
10
from charmhelpers.core.host import (
13
from charmhelpers.contrib.openstack.openstack_utils import (
14
configure_installation_source
14
from charmhelpers.contrib.network.ovs import (
18
from charmhelpers.contrib.openstack.utils import (
19
configure_installation_source,
20
get_os_codename_package,
21
get_os_codename_install_source
23
import charmhelpers.contrib.openstack.context as context
24
import charmhelpers.contrib.openstack.templating as templating
25
import quantum_contexts
26
from collections import OrderedDict
56
"quantum-plugin-openvswitch-agent",
70
OVS: ['openvswitch-datapath-dkms']
74
def get_early_packages():
75
'''Return a list of package for pre-install based on configured plugin'''
76
if config('plugin') in EARLY_PACKAGES:
77
return EARLY_PACKAGES[config('plugin')]
83
'''Return a list of packages for install based on the configured plugin'''
84
return GATEWAY_PKGS[config('plugin')]
67
86
EXT_PORT_CONF = '/etc/init/ext-port.conf'
70
def get_os_version(package=None):
73
pkg = cache[package or 'quantum-common']
75
return apt.upstream_version(pkg.current_ver.ver_str)
80
if get_os_version('quantum-common') >= "2013.1":
81
for plugin in GATEWAY_AGENTS:
82
GATEWAY_AGENTS[plugin].append("quantum-metadata-agent")
87
TEMPLATES = 'templates'
89
QUANTUM_CONF = "/etc/quantum/quantum.conf"
90
L3_AGENT_CONF = "/etc/quantum/l3_agent.ini"
91
DHCP_AGENT_CONF = "/etc/quantum/dhcp_agent.ini"
92
METADATA_AGENT_CONF = "/etc/quantum/metadata_agent.ini"
93
NOVA_CONF = "/etc/nova/nova.conf"
95
SHARED_CONFIG_FILES = {
97
'hook_contexts': [quantum_contexts.QuantumGatewayContext()],
98
'services': ['quantum-dhcp-agent']
100
METADATA_AGENT_CONF: {
101
'hook_contexts': [quantum_contexts.NetworkServiceContext()],
102
'services': ['quantum-metadata-agent']
105
'hook_contexts': [context.AMQPContext(),
106
context.SharedDBContext(),
107
quantum_contexts.NetworkServiceContext(),
108
quantum_contexts.QuantumGatewayContext()],
109
'services': ['nova-api-metadata']
115
'hook_contexts': [context.AMQPContext(),
116
quantum_contexts.QuantumGatewayContext()],
117
'services': ['quantum-l3-agent',
118
'quantum-dhcp-agent',
119
'quantum-metadata-agent',
120
'quantum-plugin-openvswitch-agent']
123
'hook_contexts': [quantum_contexts.NetworkServiceContext()],
124
'services': ['quantum-l3-agent']
126
# TODO: Check to see if this is actually required
128
'hook_contexts': [context.SharedDBContext(),
129
quantum_contexts.QuantumGatewayContext()],
130
'services': ['quantum-plugin-openvswitch-agent']
133
'hook_contexts': [quantum_contexts.ExternalPortContext()],
140
'hook_contexts': [context.AMQPContext()],
141
'services': ['quantum-dhcp-agent', 'quantum-metadata-agent']
146
NVP: NVP_CONFIG_FILES.update(SHARED_CONFIG_FILES),
147
OVS: OVS_CONFIG_FILES.update(SHARED_CONFIG_FILES),
151
def register_configs():
152
''' Register config files with their respective contexts. '''
153
release = get_os_codename_package('quantum-common', fatal=False) or \
155
configs = templating.OSConfigRenderer(templates_dir=TEMPLATES,
156
openstack_release=release)
158
plugin = config('plugin')
159
for conf in CONFIG_FILES[plugin].keys():
160
configs.register(conf, CONFIG_FILES[conf]['hook_contexts'])
167
Determine the correct resource map to be passed to
168
charmhelpers.core.restart_on_change() based on the services configured.
170
:returns: dict: A dictionary mapping config file to lists of services
171
that should be restarted when file changes.
174
for f, ctxt in CONFIG_FILES[config('plugin')].iteritems():
176
for svc in ctxt['services']:
179
_map.append((f, svcs))
180
return OrderedDict(_map)
84
183
DB_USER = "quantum"
85
184
QUANTUM_DB = "quantum"
161
206
secret = secret_file.read().strip()
165
def flush_local_configuration():
166
if os.path.exists('/usr/bin/quantum-netns-cleanup'):
168
"quantum-netns-cleanup",
169
"--config-file=/etc/quantum/quantum.conf"
171
for agent_conf in ['l3_agent.ini', 'dhcp_agent.ini']:
172
agent_cmd = list(cmd)
173
agent_cmd.append('--config-file=/etc/quantum/{}'
175
subprocess.call(agent_cmd)
178
def install_ca(ca_cert):
179
with open('/usr/local/share/ca-certificates/keystone_juju_ca_cert.crt',
181
crt.write(base64.b64decode(ca_cert))
182
subprocess.check_call(['update-ca-certificates', '--fresh'])
184
209
DHCP_AGENT = "DHCP Agent"
185
210
L3_AGENT = "L3 Agent"
188
def reassign_agent_resources(env):
213
def reassign_agent_resources():
189
214
''' Use agent scheduler API to detect down agents and re-schedule '''
190
from quantumclient.v2_0 import client
215
env = quantum_contexts.NetworkServiceContext()()
217
log('Unable to re-assign resources at this time')
220
from quantumclient.v2_0 import client
222
''' Try to import neutronclient instead for havana+ '''
223
from neutronclient.v2_0 import client
191
225
# TODO: Fixup for https keystone
192
226
auth_url = 'http://%(keystone_host)s:%(auth_port)s/v2.0' % env
193
227
quantum = client.Client(username=env['service_username'],
246
def do_openstack_upgrade():
247
configure_installation_source(config('openstack-origin'))
248
plugin = config('plugin')
250
if plugin in GATEWAY_PKGS.keys():
251
pkgs.extend(GATEWAY_PKGS[plugin])
252
if plugin in [OVS, NVP]:
253
pkgs.append('openvswitch-datapath-dkms')
280
def do_openstack_upgrade(configs):
282
Perform an upgrade. Takes care of upgrading packages, rewriting
283
configs, database migrations and potentially any other post-upgrade
286
:param configs: The charms main OSConfigRenderer object.
288
new_src = config('openstack-origin')
289
new_os_rel = get_os_codename_install_source(new_src)
291
log('Performing OpenStack upgrade to %s.' % (new_os_rel))
293
configure_installation_source(new_src)
255
'--option', 'Dpkg::Options::=--force-confold',
256
'--option', 'Dpkg::Options::=--force-confdef'
295
'--option', 'Dpkg::Options::=--force-confnew',
296
'--option', 'Dpkg::Options::=--force-confdef',
258
apt_install(pkgs, options=dpkg_opts, fatal=True)
298
apt_update(fatal=True)
299
apt_install(packages=GATEWAY_PKGS[config('plugin')], options=dpkg_opts,
302
# set CONFIGS to load templates from new release
303
configs.set_release(openstack_release=new_os_rel)
307
def get_host_ip(hostname=None):
311
apt_install('python-dnspython', fatal=True)
313
hostname = hostname or unit_get('private-address')
315
# Test to see if already an IPv4 address
316
socket.inet_aton(hostname)
319
answers = dns.resolver.query(hostname, 'A')
321
return answers[0].address
325
if config('plugin') == OVS:
326
add_bridge(INT_BRIDGE)
327
add_bridge(EXT_BRIDGE)
328
ext_port = config('ext-port')
330
add_bridge_port(EXT_BRIDGE, ext_port)
331
if config('plugin') == NVP:
332
add_bridge(INT_BRIDGE)