100 lines
2.9 KiB
Python
100 lines
2.9 KiB
Python
# Copyright (c) 2015, A10 Networks
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
# implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
import importlib
|
|
import os
|
|
|
|
from oslo_config import cfg
|
|
from oslo_log import log as logging
|
|
from six.moves import configparser as ConfigParser
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
class NeutronModules(object):
|
|
|
|
MODULES = {
|
|
'neutron_fwaas': {
|
|
'alembic-name': 'fwaas',
|
|
},
|
|
'neutron_lbaas': {
|
|
'alembic-name': 'lbaas',
|
|
},
|
|
'neutron_vpnaas': {
|
|
'alembic-name': 'vpnaas',
|
|
},
|
|
}
|
|
|
|
def __init__(self):
|
|
self.repos = {}
|
|
for repo in self.MODULES:
|
|
self.repos[repo] = {}
|
|
self.repos[repo]['mod'] = self._import_or_none(repo)
|
|
self.repos[repo]['ini'] = None
|
|
|
|
def _import_or_none(self, module):
|
|
try:
|
|
return importlib.import_module(module)
|
|
except ImportError:
|
|
return None
|
|
|
|
def installed_list(self):
|
|
z = filter(lambda k: self.repos[k]['mod'] is not None, self.repos)
|
|
LOG.debug("NeutronModules related repos installed = %s", z)
|
|
return z
|
|
|
|
def module(self, module):
|
|
return self.repos[module]['mod']
|
|
|
|
def alembic_name(self, module):
|
|
return self.MODULES[module]['alembic-name']
|
|
|
|
# Return an INI parser for the child module. oslo.config is a bit too
|
|
# magical in its INI loading, and in one notable case, we need to merge
|
|
# together the [service_providers] section across at least four
|
|
# repositories.
|
|
def ini(self, module):
|
|
if self.repos[module]['ini'] is None:
|
|
neutron_dir = None
|
|
try:
|
|
neutron_dir = cfg.CONF.config_dir
|
|
except cfg.NoSuchOptError:
|
|
pass
|
|
|
|
if neutron_dir is None:
|
|
neutron_dir = '/etc/neutron'
|
|
|
|
ini = ConfigParser.SafeConfigParser()
|
|
ini_path = os.path.join(neutron_dir, '%s.conf' % module)
|
|
if os.path.exists(ini_path):
|
|
ini.read(ini_path)
|
|
|
|
self.repos[module]['ini'] = ini
|
|
|
|
return self.repos[module]['ini']
|
|
|
|
def service_providers(self, module):
|
|
ini = self.ini(module)
|
|
|
|
sp = []
|
|
try:
|
|
for name, value in ini.items('service_providers'):
|
|
if name == 'service_provider':
|
|
sp.append(value)
|
|
except ConfigParser.NoSectionError:
|
|
pass
|
|
|
|
return sp
|