~canonical-sysadmins/charms/trusty/nova-compute/smt-off-ppc64el

« back to all changes in this revision

Viewing changes to hooks/charmhelpers/contrib/openstack/context.py

  • Committer: Liam Young
  • Date: 2015-04-01 15:13:54 UTC
  • mfrom: (79.3.29 nova-compute)
  • Revision ID: liam.young@canonical.com-20150401151354-ygf2jf3a3qpl50ug
[james-page, r=gnuoy] Add 0mq support

Show diffs side-by-side

added added

removed removed

Lines of Context:
47
47
)
48
48
 
49
49
from charmhelpers.core.sysctl import create as sysctl_create
 
50
from charmhelpers.core.strutils import bool_from_string
50
51
 
51
52
from charmhelpers.core.host import (
52
53
    list_nics,
67
68
)
68
69
from charmhelpers.contrib.openstack.neutron import (
69
70
    neutron_plugin_attribute,
 
71
    parse_data_port_mappings,
70
72
)
71
73
from charmhelpers.contrib.openstack.ip import (
72
74
    resolve_address,
82
84
    is_bridge_member,
83
85
)
84
86
from charmhelpers.contrib.openstack.utils import get_host_ip
85
 
 
86
87
CA_CERT_PATH = '/usr/local/share/ca-certificates/keystone_juju_ca_cert.crt'
87
88
ADDRESS_TYPES = ['admin', 'internal', 'public']
88
89
 
1162
1163
            sysctl_create(sysctl_dict,
1163
1164
                          '/etc/sysctl.d/50-{0}.conf'.format(charm_name()))
1164
1165
        return {'sysctl': sysctl_dict}
 
1166
 
 
1167
 
 
1168
class NeutronAPIContext(OSContextGenerator):
 
1169
    '''
 
1170
    Inspects current neutron-plugin-api relation for neutron settings. Return
 
1171
    defaults if it is not present.
 
1172
    '''
 
1173
    interfaces = ['neutron-plugin-api']
 
1174
 
 
1175
    def __call__(self):
 
1176
        self.neutron_defaults = {
 
1177
            'l2_population': {
 
1178
                'rel_key': 'l2-population',
 
1179
                'default': False,
 
1180
            },
 
1181
            'overlay_network_type': {
 
1182
                'rel_key': 'overlay-network-type',
 
1183
                'default': 'gre',
 
1184
            },
 
1185
            'neutron_security_groups': {
 
1186
                'rel_key': 'neutron-security-groups',
 
1187
                'default': False,
 
1188
            },
 
1189
            'network_device_mtu': {
 
1190
                'rel_key': 'network-device-mtu',
 
1191
                'default': None,
 
1192
            },
 
1193
            'enable_dvr': {
 
1194
                'rel_key': 'enable-dvr',
 
1195
                'default': False,
 
1196
            },
 
1197
            'enable_l3ha': {
 
1198
                'rel_key': 'enable-l3ha',
 
1199
                'default': False,
 
1200
            },
 
1201
        }
 
1202
        ctxt = self.get_neutron_options({})
 
1203
        for rid in relation_ids('neutron-plugin-api'):
 
1204
            for unit in related_units(rid):
 
1205
                rdata = relation_get(rid=rid, unit=unit)
 
1206
                if 'l2-population' in rdata:
 
1207
                    ctxt.update(self.get_neutron_options(rdata))
 
1208
 
 
1209
        return ctxt
 
1210
 
 
1211
    def get_neutron_options(self, rdata):
 
1212
        settings = {}
 
1213
        for nkey in self.neutron_defaults.keys():
 
1214
            defv = self.neutron_defaults[nkey]['default']
 
1215
            rkey = self.neutron_defaults[nkey]['rel_key']
 
1216
            if rkey in rdata.keys():
 
1217
                if type(defv) is bool:
 
1218
                    settings[nkey] = bool_from_string(rdata[rkey])
 
1219
                else:
 
1220
                    settings[nkey] = rdata[rkey]
 
1221
            else:
 
1222
                settings[nkey] = defv
 
1223
        return settings
 
1224
 
 
1225
 
 
1226
class ExternalPortContext(NeutronPortContext):
 
1227
 
 
1228
    def __call__(self):
 
1229
        ctxt = {}
 
1230
        ports = config('ext-port')
 
1231
        if ports:
 
1232
            ports = [p.strip() for p in ports.split()]
 
1233
            ports = self.resolve_ports(ports)
 
1234
            if ports:
 
1235
                ctxt = {"ext_port": ports[0]}
 
1236
                napi_settings = NeutronAPIContext()()
 
1237
                mtu = napi_settings.get('network_device_mtu')
 
1238
                if mtu:
 
1239
                    ctxt['ext_port_mtu'] = mtu
 
1240
 
 
1241
        return ctxt
 
1242
 
 
1243
 
 
1244
class DataPortContext(NeutronPortContext):
 
1245
 
 
1246
    def __call__(self):
 
1247
        ports = config('data-port')
 
1248
        if ports:
 
1249
            portmap = parse_data_port_mappings(ports)
 
1250
            ports = portmap.values()
 
1251
            resolved = self.resolve_ports(ports)
 
1252
            normalized = {get_nic_hwaddr(port): port for port in resolved
 
1253
                          if port not in ports}
 
1254
            normalized.update({port: port for port in resolved
 
1255
                               if port in ports})
 
1256
            if resolved:
 
1257
                return {bridge: normalized[port] for bridge, port in
 
1258
                        six.iteritems(portmap) if port in normalized.keys()}
 
1259
 
 
1260
        return None
 
1261
 
 
1262
 
 
1263
class PhyNICMTUContext(DataPortContext):
 
1264
 
 
1265
    def __call__(self):
 
1266
        ctxt = {}
 
1267
        mappings = super(PhyNICMTUContext, self).__call__()
 
1268
        if mappings and mappings.values():
 
1269
            ports = mappings.values()
 
1270
            napi_settings = NeutronAPIContext()()
 
1271
            mtu = napi_settings.get('network_device_mtu')
 
1272
            if mtu:
 
1273
                ctxt["devs"] = '\\n'.join(ports)
 
1274
                ctxt['mtu'] = mtu
 
1275
 
 
1276
        return ctxt
 
1277
 
 
1278
 
 
1279
class NetworkServiceContext(OSContextGenerator):
 
1280
 
 
1281
    def __init__(self, rel_name='quantum-network-service'):
 
1282
        self.rel_name = rel_name
 
1283
        self.interfaces = [rel_name]
 
1284
 
 
1285
    def __call__(self):
 
1286
        for rid in relation_ids(self.rel_name):
 
1287
            for unit in related_units(rid):
 
1288
                rdata = relation_get(rid=rid, unit=unit)
 
1289
                ctxt = {
 
1290
                    'keystone_host': rdata.get('keystone_host'),
 
1291
                    'service_port': rdata.get('service_port'),
 
1292
                    'auth_port': rdata.get('auth_port'),
 
1293
                    'service_tenant': rdata.get('service_tenant'),
 
1294
                    'service_username': rdata.get('service_username'),
 
1295
                    'service_password': rdata.get('service_password'),
 
1296
                    'quantum_host': rdata.get('quantum_host'),
 
1297
                    'quantum_port': rdata.get('quantum_port'),
 
1298
                    'quantum_url': rdata.get('quantum_url'),
 
1299
                    'region': rdata.get('region'),
 
1300
                    'service_protocol':
 
1301
                    rdata.get('service_protocol') or 'http',
 
1302
                    'auth_protocol':
 
1303
                    rdata.get('auth_protocol') or 'http',
 
1304
                }
 
1305
                if context_complete(ctxt):
 
1306
                    return ctxt
 
1307
        return {}