919
class NeutronPortContext(OSContextGenerator):
920
NIC_PREFIXES = ['eth', 'bond']
922
def resolve_ports(self, ports):
923
"""Resolve NICs not yet bound to bridge(s)
925
If hwaddress provided then returns resolved hwaddress otherwise NIC.
932
for nic in list_nics(self.NIC_PREFIXES):
933
hwaddr = get_nic_hwaddr(nic)
934
hwaddr_to_nic[hwaddr] = nic
935
addresses = get_ipv4_addr(nic, fatal=False)
936
addresses += get_ipv6_addr(iface=nic, fatal=False)
937
hwaddr_to_ip[hwaddr] = addresses
940
mac_regex = re.compile(r'([0-9A-F]{2}[:-]){5}([0-9A-F]{2})', re.I)
942
if re.match(mac_regex, entry):
943
# NIC is in known NICs and does NOT hace an IP address
944
if entry in hwaddr_to_nic and not hwaddr_to_ip[entry]:
945
# If the nic is part of a bridge then don't use it
946
if is_bridge_member(hwaddr_to_nic[entry]):
949
# Entry is a MAC address for a valid interface that doesn't
950
# have an IP address assigned yet.
951
resolved.append(hwaddr_to_nic[entry])
953
# If the passed entry is not a MAC address, assume it's a valid
954
# interface, and that the user put it there on purpose (we can
955
# trust it to be the real external network).
956
resolved.append(entry)
886
961
class OSConfigFlagContext(OSContextGenerator):
887
962
"""Provides support for user-defined config flags.
1104
1179
sysctl_create(sysctl_dict,
1105
1180
'/etc/sysctl.d/50-{0}.conf'.format(charm_name()))
1106
1181
return {'sysctl': sysctl_dict}
1184
class NeutronAPIContext(OSContextGenerator):
1186
Inspects current neutron-plugin-api relation for neutron settings. Return
1187
defaults if it is not present.
1189
interfaces = ['neutron-plugin-api']
1192
self.neutron_defaults = {
1194
'rel_key': 'l2-population',
1197
'overlay_network_type': {
1198
'rel_key': 'overlay-network-type',
1201
'neutron_security_groups': {
1202
'rel_key': 'neutron-security-groups',
1205
'network_device_mtu': {
1206
'rel_key': 'network-device-mtu',
1210
'rel_key': 'enable-dvr',
1214
'rel_key': 'enable-l3ha',
1218
ctxt = self.get_neutron_options({})
1219
for rid in relation_ids('neutron-plugin-api'):
1220
for unit in related_units(rid):
1221
rdata = relation_get(rid=rid, unit=unit)
1222
if 'l2-population' in rdata:
1223
ctxt.update(self.get_neutron_options(rdata))
1227
def get_neutron_options(self, rdata):
1229
for nkey in self.neutron_defaults.keys():
1230
defv = self.neutron_defaults[nkey]['default']
1231
rkey = self.neutron_defaults[nkey]['rel_key']
1232
if rkey in rdata.keys():
1233
if type(defv) is bool:
1234
settings[nkey] = bool_from_string(rdata[rkey])
1236
settings[nkey] = rdata[rkey]
1238
settings[nkey] = defv
1242
class ExternalPortContext(NeutronPortContext):
1246
ports = config('ext-port')
1248
ports = [p.strip() for p in ports.split()]
1249
ports = self.resolve_ports(ports)
1251
ctxt = {"ext_port": ports[0]}
1252
napi_settings = NeutronAPIContext()()
1253
mtu = napi_settings.get('network_device_mtu')
1255
ctxt['ext_port_mtu'] = mtu
1260
class DataPortContext(NeutronPortContext):
1263
ports = config('data-port')
1265
portmap = parse_data_port_mappings(ports)
1266
ports = portmap.values()
1267
resolved = self.resolve_ports(ports)
1268
normalized = {get_nic_hwaddr(port): port for port in resolved
1269
if port not in ports}
1270
normalized.update({port: port for port in resolved
1273
return {bridge: normalized[port] for bridge, port in
1274
six.iteritems(portmap) if port in normalized.keys()}
1279
class PhyNICMTUContext(DataPortContext):
1283
mappings = super(PhyNICMTUContext, self).__call__()
1284
if mappings and mappings.values():
1285
ports = mappings.values()
1286
napi_settings = NeutronAPIContext()()
1287
mtu = napi_settings.get('network_device_mtu')
1289
ctxt["devs"] = '\\n'.join(ports)
1295
class NetworkServiceContext(OSContextGenerator):
1297
def __init__(self, rel_name='quantum-network-service'):
1298
self.rel_name = rel_name
1299
self.interfaces = [rel_name]
1302
for rid in relation_ids(self.rel_name):
1303
for unit in related_units(rid):
1304
rdata = relation_get(rid=rid, unit=unit)
1306
'keystone_host': rdata.get('keystone_host'),
1307
'service_port': rdata.get('service_port'),
1308
'auth_port': rdata.get('auth_port'),
1309
'service_tenant': rdata.get('service_tenant'),
1310
'service_username': rdata.get('service_username'),
1311
'service_password': rdata.get('service_password'),
1312
'quantum_host': rdata.get('quantum_host'),
1313
'quantum_port': rdata.get('quantum_port'),
1314
'quantum_url': rdata.get('quantum_url'),
1315
'region': rdata.get('region'),
1317
rdata.get('service_protocol') or 'http',
1319
rdata.get('auth_protocol') or 'http',
1321
if context_complete(ctxt):