142 lines
4.4 KiB
Python
Raw Normal View History

import os
import uuid
2014-06-05 11:59:23 +01:00
from charmhelpers.core.hookenv import (
2014-06-19 10:56:25 +01:00
config,
relation_get,
relation_ids,
related_units,
2014-06-19 10:56:25 +01:00
unit_get,
2014-06-05 11:59:23 +01:00
)
from charmhelpers.contrib.openstack.ip import resolve_address
2014-06-05 11:59:23 +01:00
from charmhelpers.contrib.openstack import context
from charmhelpers.contrib.openstack.utils import get_host_ip
2014-06-27 14:04:10 +01:00
from charmhelpers.contrib.network.ip import get_address_in_network
from charmhelpers.contrib.openstack.context import (
OSContextGenerator,
2015-03-25 08:37:29 +00:00
NeutronAPIContext,
)
2014-06-05 11:59:23 +01:00
2014-06-19 10:56:25 +01:00
2014-06-05 11:59:23 +01:00
class OVSPluginContext(context.NeutronContext):
interfaces = []
@property
def plugin(self):
return 'ovs'
@property
def network_manager(self):
return 'neutron'
@property
def neutron_security_groups(self):
if config('disable-security-groups'):
return False
2015-03-25 08:37:29 +00:00
neutron_api_settings = NeutronAPIContext()()
2014-09-04 15:18:06 +00:00
return neutron_api_settings['neutron_security_groups']
2014-06-05 11:59:23 +01:00
def ovs_ctxt(self):
# In addition to generating config context, ensure the OVS service
# is running and the OVS bridge exists. Also need to ensure
# local_ip points to actual IP, not hostname.
ovs_ctxt = super(OVSPluginContext, self).ovs_ctxt()
if not ovs_ctxt:
return {}
2014-06-05 14:16:54 +00:00
conf = config()
2014-06-27 14:04:10 +01:00
ovs_ctxt['local_ip'] = \
get_address_in_network(config('os-data-network'),
get_host_ip(unit_get('private-address')))
2015-03-25 08:37:29 +00:00
neutron_api_settings = NeutronAPIContext()()
2014-09-04 15:18:06 +00:00
ovs_ctxt['neutron_security_groups'] = self.neutron_security_groups
ovs_ctxt['l2_population'] = neutron_api_settings['l2_population']
2015-03-25 08:37:29 +00:00
ovs_ctxt['distributed_routing'] = neutron_api_settings['enable_dvr']
2014-10-02 14:02:42 +00:00
ovs_ctxt['overlay_network_type'] = \
neutron_api_settings['overlay_network_type']
2014-06-23 12:49:58 +01:00
# TODO: We need to sort out the syslog and debug/verbose options as a
# general context helper
2014-06-05 14:16:54 +00:00
ovs_ctxt['use_syslog'] = conf['use-syslog']
2014-06-17 15:31:03 +01:00
ovs_ctxt['verbose'] = conf['verbose']
ovs_ctxt['debug'] = conf['debug']
2015-02-10 15:25:42 +00:00
2015-02-11 13:43:17 +00:00
net_dev_mtu = neutron_api_settings.get('network_device_mtu')
2015-02-10 15:25:42 +00:00
if net_dev_mtu:
2015-02-11 14:24:39 +00:00
# neutron.conf
ovs_ctxt['network_device_mtu'] = net_dev_mtu
# ml2 conf
2015-02-10 15:25:42 +00:00
ovs_ctxt['veth_mtu'] = net_dev_mtu
2015-02-11 16:31:04 +00:00
mappings = config('bridge-mappings')
if mappings:
2015-04-10 17:21:20 +01:00
ovs_ctxt['bridge_mappings'] = ','.join(mappings.split())
2015-02-11 16:31:04 +00:00
flat_providers = config('flat-network-providers')
if flat_providers:
ovs_ctxt['network_providers'] = ','.join(flat_providers.split())
2015-03-03 14:24:10 +08:00
vlan_ranges = config('vlan-ranges')
if vlan_ranges:
2015-04-10 16:42:06 +01:00
ovs_ctxt['vlan_ranges'] = ','.join(vlan_ranges.split())
2015-03-03 14:24:10 +08:00
2014-06-05 11:59:23 +01:00
return ovs_ctxt
2015-02-02 13:31:39 +00:00
class L3AgentContext(OSContextGenerator):
def __call__(self):
2015-03-25 08:37:29 +00:00
neutron_api_settings = NeutronAPIContext()()
2015-02-02 13:31:39 +00:00
ctxt = {}
if neutron_api_settings['enable_dvr']:
2015-02-02 13:31:39 +00:00
ctxt['agent_mode'] = 'dvr'
else:
ctxt['agent_mode'] = 'legacy'
return ctxt
2015-02-25 13:50:38 +00:00
SHARED_SECRET = "/etc/neutron/secret.txt"
2015-02-25 13:50:38 +00:00
def get_shared_secret():
secret = None
if not os.path.exists(SHARED_SECRET):
secret = str(uuid.uuid4())
with open(SHARED_SECRET, 'w') as secret_file:
secret_file.write(secret)
else:
with open(SHARED_SECRET, 'r') as secret_file:
secret = secret_file.read().strip()
return secret
2015-09-08 13:17:28 +01:00
class SharedSecretContext(OSContextGenerator):
def __call__(self):
if NeutronAPIContext()()['enable_dvr'] or \
config('enable-local-dhcp-and-metadata'):
ctxt = {
2015-02-25 13:50:38 +00:00
'shared_secret': get_shared_secret(),
'local_ip': resolve_address(),
}
else:
ctxt = {}
return ctxt
class APIIdentityServiceContext(context.IdentityServiceContext):
def __init__(self):
super(APIIdentityServiceContext,
self).__init__(rel_name='neutron-plugin-api')
def __call__(self):
ctxt = super(APIIdentityServiceContext, self).__call__()
if not ctxt:
return
for rid in relation_ids('neutron-plugin-api'):
for unit in related_units(rid):
rdata = relation_get(rid=rid, unit=unit)
ctxt['region'] = rdata.get('region')
if ctxt['region']:
return ctxt
return ctxt