2491c2484f
* get rid of the --use_lockout flag since it will be specified in paste config (Example line is commented out in etc/nova-api.conf, factory is in place) * remove old nova-api binary and promote nova-api-paste * change how we store ec2 parameters to bin the the ApiRequest * get rid of Router, since paste.urlmap is equally effective (Requestify now gets passed the name of the controller requests are to.)
110 lines
3.7 KiB
Python
Executable File
110 lines
3.7 KiB
Python
Executable File
#!/usr/bin/env python
|
|
# pylint: disable-msg=C0103
|
|
# vim: tabstop=4 shiftwidth=4 softtabstop=4
|
|
|
|
# Copyright 2010 United States Government as represented by the
|
|
# Administrator of the National Aeronautics and Space Administration.
|
|
# 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.
|
|
|
|
"""Starter script for Nova API."""
|
|
|
|
import gettext
|
|
import logging
|
|
import os
|
|
import sys
|
|
|
|
from paste import deploy
|
|
|
|
# If ../nova/__init__.py exists, add ../ to Python search path, so that
|
|
# it will override what happens to be installed in /usr/(local/)lib/python...
|
|
possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),
|
|
os.pardir,
|
|
os.pardir))
|
|
if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
|
sys.path.insert(0, possible_topdir)
|
|
|
|
gettext.install('nova', unicode=1)
|
|
|
|
from nova import flags
|
|
from nova import wsgi
|
|
|
|
LOG = logging.getLogger('nova.api')
|
|
LOG.setLevel(logging.DEBUG)
|
|
LOG.addHandler(logging.StreamHandler())
|
|
|
|
FLAGS = flags.FLAGS
|
|
|
|
API_ENDPOINTS = ['ec2', 'openstack']
|
|
|
|
|
|
def load_configuration(paste_config):
|
|
"""Load the paste configuration from the config file and return it."""
|
|
config = None
|
|
# Try each known name to get the global DEFAULTS, which will give ports
|
|
for name in API_ENDPOINTS:
|
|
try:
|
|
config = deploy.appconfig("config:%s" % paste_config, name=name)
|
|
except LookupError:
|
|
pass
|
|
if config:
|
|
verbose = config.get('verbose', None)
|
|
if verbose:
|
|
FLAGS.verbose = int(verbose) == 1
|
|
if FLAGS.verbose:
|
|
logging.getLogger().setLevel(logging.DEBUG)
|
|
return config
|
|
LOG.debug(_("Paste config at %s has no secion for known apis"),
|
|
paste_config)
|
|
print _("Paste config at %s has no secion for any known apis") % \
|
|
paste_config
|
|
os.exit(1)
|
|
|
|
|
|
def launch_api(paste_config_file, section, server, port, host):
|
|
"""Launch an api server from the specified port and IP."""
|
|
LOG.debug(_("Launching %s api on %s:%s"), section, host, port)
|
|
app = deploy.loadapp('config:%s' % paste_config_file, name=section)
|
|
server.start(app, int(port), host)
|
|
|
|
|
|
def run_app(paste_config_file):
|
|
LOG.debug(_("Using paste.deploy config at: %s"), configfile)
|
|
config = load_configuration(paste_config_file)
|
|
LOG.debug(_("Configuration: %r"), config)
|
|
server = wsgi.Server()
|
|
ip = config.get('host', '0.0.0.0')
|
|
for api in API_ENDPOINTS:
|
|
port = config.get("%s_port" % api, None)
|
|
if not port:
|
|
continue
|
|
host = config.get("%s_host" % api, ip)
|
|
launch_api(configfile, api, server, port, host)
|
|
LOG.debug(_("All api servers launched, now waiting"))
|
|
server.wait()
|
|
|
|
|
|
if __name__ == '__main__':
|
|
FLAGS(sys.argv)
|
|
configfiles = ['/etc/nova/nova-api.conf']
|
|
if os.path.exists(os.path.join(possible_topdir, 'nova', '__init__.py')):
|
|
configfiles.insert(0,
|
|
os.path.join(possible_topdir, 'etc', 'nova-api.conf'))
|
|
for configfile in configfiles:
|
|
if os.path.exists(configfile):
|
|
run_app(configfile)
|
|
break
|
|
else:
|
|
LOG.debug(_("Skipping missing configuration: %s"), configfile)
|