2015-02-04 16:30:03 +00:00
|
|
|
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,
|
|
|
|
unit_get,
|
2014-06-05 11:59:23 +01:00
|
|
|
)
|
2015-02-04 16:30:03 +00: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
|
2015-02-04 16:30:03 +00:00
|
|
|
from charmhelpers.contrib.openstack.context import (
|
|
|
|
OSContextGenerator,
|
2015-03-25 08:37:29 +00:00
|
|
|
NeutronAPIContext,
|
2015-03-24 13:39:11 +00:00
|
|
|
)
|
2015-02-27 18:25:49 +00:00
|
|
|
from charmhelpers.contrib.openstack.neutron import (
|
2015-03-03 14:24:10 +08:00
|
|
|
parse_vlan_range_mappings,
|
2015-02-04 16:30:03 +00:00
|
|
|
)
|
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):
|
2015-03-24 13:39:11 +00:00
|
|
|
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
|
2014-09-04 10:56:50 +00:00
|
|
|
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
|
2014-06-23 13:50:23 +01:00
|
|
|
# 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:
|
|
|
|
ovs_ctxt['bridge_mappings'] = mappings
|
|
|
|
|
2015-03-03 14:24:10 +08:00
|
|
|
vlan_ranges = config('vlan-ranges')
|
|
|
|
vlan_range_mappings = parse_vlan_range_mappings(config('vlan-ranges'))
|
|
|
|
if vlan_ranges:
|
|
|
|
providers = vlan_range_mappings.keys()
|
|
|
|
ovs_ctxt['network_providers'] = ' '.join(providers)
|
|
|
|
ovs_ctxt['vlan_ranges'] = vlan_ranges
|
|
|
|
|
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 = {}
|
2015-02-20 09:13:08 +00:00
|
|
|
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-02 15:26:32 +00:00
|
|
|
|
|
|
|
|
2015-02-25 13:50:38 +00:00
|
|
|
SHARED_SECRET = "/etc/neutron/secret.txt"
|
2015-02-04 16:30:03 +00:00
|
|
|
|
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
|
|
|
|
|
|
|
|
|
|
|
|
class DVRSharedSecretContext(OSContextGenerator):
|
2015-02-04 16:30:03 +00:00
|
|
|
|
|
|
|
def __call__(self):
|
2015-03-25 08:37:29 +00:00
|
|
|
if NeutronAPIContext()()['enable_dvr']:
|
2015-02-04 16:30:03 +00:00
|
|
|
ctxt = {
|
2015-02-25 13:50:38 +00:00
|
|
|
'shared_secret': get_shared_secret(),
|
2015-02-04 16:30:03 +00:00
|
|
|
'local_ip': resolve_address(),
|
|
|
|
}
|
|
|
|
else:
|
|
|
|
ctxt = {}
|
|
|
|
return ctxt
|