text: #    Copyright (c) 2015 Mirantis, Inc.
  #
  #    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 os
  
  from oslo_config import cfg
  from oslo_log import log as logging
  from paste import deploy
  
  from murano.common.i18n import _
  
  CONF = cfg.CONF
  
  
  def _get_deployment_flavor():
      """Retrieve the paste_deploy.flavor config item
  
         Retrieve the paste_deploy.flavor config item, formatted appropriately
         for appending to the application name.
      """
      flavor = CONF.paste_deploy.flavor
      return '' if not flavor else ('-' + flavor)
  
  
  def _get_paste_config_path():
      paste_suffix = '-paste.ini'
      conf_suffix = '.conf'
      if CONF.config_file:
          # Assume paste config is in a paste.ini file corresponding
          # to the last config file
          path = CONF.config_file[-1].replace(conf_suffix, paste_suffix)
      else:
          path = CONF.prog + '-paste.ini'
      return CONF.find_file(os.path.basename(path))
  
  
  def _get_deployment_config_file():
      """Retrieve the deployment_config_file config item
  
         Retrieve the deployment_config_file config item, formatted as an
         absolute pathname.
      """
      path = CONF.paste_deploy.config_file
      if not path:
          path = _get_paste_config_path()
      if not path:
          msg = _("Unable to locate paste config file for %s.") % CONF.prog
          raise RuntimeError(msg)
      return os.path.abspath(path)
  
  
  def load_paste_app(app_name=None):
      """Builds and returns a WSGI app from a paste config file.
  
      We assume the last config file specified in the supplied ConfigOpts
      object is the paste config file.
  
      :param app_name: name of the application to load
  
      :raises RuntimeError when config file cannot be located or application
              cannot be loaded from config file
      """
      if app_name is None:
          app_name = CONF.prog
  
      # append the deployment flavor to the application name,
      # in order to identify the appropriate paste pipeline
      app_name += _get_deployment_flavor()
  
      conf_file = _get_deployment_config_file()
  
      try:
          logger = logging.getLogger(__name__)
          logger.debug("Loading {app_name} from {conf_file}".format(
              conf_file=conf_file, app_name=app_name))
  
          app = deploy.loadapp("config:%s" % conf_file, name=app_name)
  
          return app
      except (LookupError, ImportError) as e:
          msg = _("Unable to load %(app_name)s from configuration file"
                  " %(conf_file)s. \nGot: %(e)r") % {'conf_file': conf_file,
                                                     'app_name': app_name,
                                                     'e': e}
          logger.error(msg)
          raise RuntimeError(msg)
  