# Copyright 2011 VMware, Inc.
# All Rights Reserved.
#
#    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.

# If ../neutron/__init__.py exists, add ../ to Python search path, so that
# it will override what happens to be installed in /usr/(local/)lib/python...

import logging as sys_logging
import os
import sys

from oslo_config import cfg
from oslo_reports import guru_meditation_report as gmr
from oslo_reports import opts as gmr_opts

from neutron._i18n import _
from neutron.common import config
from neutron import version

# NOTE(annp): These environment variables are required for deploying
# neutron-api under mod_wsgi. Currently, these variables are set as DevStack's
# default. If you intend to use other tools for deploying neutron-api under
# mod_wsgi, you should export these variables with your values.

NEUTRON_CONF = 'neutron.conf'
NEUTRON_CONF_DIR = '/etc/neutron/'
NEUTRON_PLUGIN_CONF = 'plugins/ml2/ml2_conf.ini'


def _get_config_files(env=None):
    if env is None:
        env = os.environ
    dirname = env.get('OS_NEUTRON_CONFIG_DIR', NEUTRON_CONF_DIR).strip()

    files = [s.strip() for s in
             env.get('OS_NEUTRON_CONFIG_FILES', '').split(';') if s.strip()]

    if not files:
        files = [NEUTRON_CONF, NEUTRON_PLUGIN_CONF]

    return [os.path.join(dirname, fname) for fname in files]


def _init_configuration():
    # the configuration will be read into the cfg.CONF global data structure
    conf_files = _get_config_files()
    config.register_common_config_options()
    config.init(sys.argv[1:], default_config_files=conf_files)
    config.setup_logging()
    config.set_config_defaults()
    if not cfg.CONF.config_file:
        sys.exit(_("ERROR: Unable to find configuration file via the default"
                   " search paths (~/.neutron/, ~/, /etc/neutron/, /etc/) and"
                   " the '--config-file' option!"))


def boot_server(server_func):
    # During the call to gmr.TextGuruMeditation.setup_autorun(), Guru
    # Meditation Report tries to start logging.
    # Set a handler here to accommodate this.
    # NOTE(amorin) This was introduced to mitigate bug #1532053 which seems
    # not triggered anymore.
    # But, while fixing bug #2021814 we decided to be conservative and keep
    # this to avoid any further side effect.
    logger = sys_logging.getLogger(None)
    if not logger.handlers:
        logger.addHandler(sys_logging.StreamHandler())

    _version_string = version.version_info.release_string()
    _init_configuration()
    gmr_opts.set_defaults(cfg.CONF)
    gmr.TextGuruMeditation.setup_autorun(version=_version_string,
                                         conf=cfg.CONF)
    try:
        return server_func()
    except KeyboardInterrupt:
        pass
    except RuntimeError as e:
        sys.exit(_("ERROR: %s") % e)
