diff --git a/bin/nova-all b/bin/nova-all new file mode 100755 index 000000000000..497195bda9b8 --- /dev/null +++ b/bin/nova-all @@ -0,0 +1,80 @@ +#!/usr/bin/env python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright 2011 OpenStack, LLC +# 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 All nova services. + +This script attempts to start all the nova services in one process. Each +service is started in its own greenthread. Please note that exceptions and +sys.exit() on the starting of a service are logged and the script will +continue attempting to launch the rest of the services. + +""" + +import eventlet +eventlet.monkey_patch() + +import os +import sys + + +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) + + +from nova import flags +from nova import log as logging +from nova import service +from nova import utils +from nova.vnc import server +from nova.objectstore import s3server + + +if __name__ == '__main__': + utils.default_flagfile() + flags.FLAGS(sys.argv) + logging.setup() + utils.monkey_patch() + servers = [] + # nova-api + for api in flags.FLAGS.enabled_apis: + try: + servers.append(service.WSGIService(api)) + except (Exception, SystemExit): + logging.exception(_('Failed to load %s') % '%s-api' % api) + # nova-vncproxy + try: + servers.append(server.get_wsgi_server()) + except (Exception, SystemExit): + logging.exception(_('Failed to load %s') % 'vncproxy-wsgi') + # nova-objectstore + try: + servers.append(s3server.get_wsgi_server()) + except (Exception, SystemExit): + logging.exception(_('Failed to load %s') % 'objectstore-wsgi') + for binary in ['nova-vncproxy', 'nova-compute', 'nova-volume', + 'nova-network', 'nova-scheduler', 'nova-vsa']: + try: + servers.append(service.Service.create(binary=binary)) + except (Exception, SystemExit): + logging.exception(_('Failed to load %s' % binary)) + service.serve(*servers) + service.wait() diff --git a/bin/nova-objectstore b/bin/nova-objectstore index 757301c24ddc..957de821f8c8 100755 --- a/bin/nova-objectstore +++ b/bin/nova-objectstore @@ -38,22 +38,14 @@ from nova import flags from nova import log as logging from nova import service from nova import utils -from nova import wsgi from nova.objectstore import s3server -FLAGS = flags.FLAGS - - if __name__ == '__main__': utils.default_flagfile() - FLAGS(sys.argv) + flags.FLAGS(sys.argv) logging.setup() utils.monkey_patch() - router = s3server.S3Application(FLAGS.buckets_path) - server = wsgi.Server("S3 Objectstore", - router, - port=FLAGS.s3_port, - host=FLAGS.s3_host) + server = s3server.get_wsgi_server() service.serve(server) service.wait() diff --git a/bin/nova-vncproxy b/bin/nova-vncproxy index 8e75451cb205..9b44a95ea2ce 100755 --- a/bin/nova-vncproxy +++ b/bin/nova-vncproxy @@ -35,85 +35,15 @@ from nova import flags from nova import log as logging from nova import service from nova import utils -from nova import wsgi -from nova import version -from nova.vnc import auth -from nova.vnc import proxy +from nova.vnc import server -LOG = logging.getLogger('nova.vncproxy') - - -FLAGS = flags.FLAGS -flags.DEFINE_string('vncproxy_wwwroot', '/var/lib/nova/noVNC/', - 'Full path to noVNC directory') -flags.DEFINE_boolean('vnc_debug', False, - 'Enable debugging features, like token bypassing') -flags.DEFINE_integer('vncproxy_port', 6080, - 'Port that the VNC proxy should bind to') -flags.DEFINE_string('vncproxy_host', '0.0.0.0', - 'Address that the VNC proxy should bind to') -flags.DEFINE_integer('vnc_token_ttl', 300, - 'How many seconds before deleting tokens') -flags.DEFINE_string('vncproxy_manager', 'nova.vnc.auth.VNCProxyAuthManager', - 'Manager for vncproxy auth') - -flags.DEFINE_flag(flags.HelpFlag()) -flags.DEFINE_flag(flags.HelpshortFlag()) -flags.DEFINE_flag(flags.HelpXMLFlag()) - - -def handle_flash_socket_policy(socket): - LOG.info(_("Received connection on flash socket policy port")) - - fd = socket.makefile('rw') - expected_command = "" - if expected_command in fd.read(len(expected_command) + 1): - LOG.info(_("Received valid flash socket policy request")) - fd.write('' % (FLAGS.vncproxy_port)) - fd.flush() - socket.close() - if __name__ == "__main__": utils.default_flagfile() - FLAGS(sys.argv) + flags.FLAGS(sys.argv) logging.setup() - LOG.audit(_("Starting nova-vncproxy node (version %s)"), - version.version_string_with_vcs()) - - if not (os.path.exists(FLAGS.vncproxy_wwwroot) and - os.path.exists(FLAGS.vncproxy_wwwroot + '/vnc_auto.html')): - LOG.info(_("Missing vncproxy_wwwroot (version %s)"), - FLAGS.vncproxy_wwwroot) - LOG.info(_("You need a slightly modified version of noVNC " - "to work with the nova-vnc-proxy")) - LOG.info(_("Check out the most recent nova noVNC code: %s"), - "git://github.com/sleepsonthefloor/noVNC.git") - LOG.info(_("And drop it in %s"), FLAGS.vncproxy_wwwroot) - exit(1) - - app = proxy.WebsocketVNCProxy(FLAGS.vncproxy_wwwroot) - - LOG.audit(_("Allowing access to the following files: %s"), - app.get_whitelist()) - - with_logging = auth.LoggingMiddleware(app) - - if FLAGS.vnc_debug: - with_auth = proxy.DebugMiddleware(with_logging) - else: - with_auth = auth.VNCNovaAuthMiddleware(with_logging) - - wsgi_server = wsgi.Server("VNC Proxy", - with_auth, - host=FLAGS.vncproxy_host, - port=FLAGS.vncproxy_port) - wsgi_server.start_tcp(handle_flash_socket_policy, - 843, - host=FLAGS.vncproxy_host) + wsgi_server = server.get_wsgi_server() server = service.Service.create(binary='nova-vncproxy') service.serve(wsgi_server, server) service.wait() diff --git a/nova/objectstore/s3server.py b/nova/objectstore/s3server.py index 1ab47b0349c3..485cc3cde96e 100644 --- a/nova/objectstore/s3server.py +++ b/nova/objectstore/s3server.py @@ -55,6 +55,13 @@ flags.DEFINE_string('buckets_path', '$state_path/buckets', 'path to s3 buckets') +def get_wsgi_server(): + return wsgi.Server("S3 Objectstore", + S3Application(FLAGS.buckets_path), + port=FLAGS.s3_port, + host=FLAGS.s3_host) + + class S3Application(wsgi.Router): """Implementation of an S3-like storage server based on local files. diff --git a/nova/virt/fake.py b/nova/virt/fake.py index 60cc43b01ffa..2c5b12237110 100644 --- a/nova/virt/fake.py +++ b/nova/virt/fake.py @@ -35,7 +35,7 @@ from nova.virt import driver LOG = logging.getLogger('nova.compute.disk') -def get_connection(_): +def get_connection(_=None): # The read_only parameter is ignored. return FakeConnection.instance() diff --git a/nova/vnc/auth.py b/nova/vnc/auth.py index ce5e10388eca..b96dc595eed8 100644 --- a/nova/vnc/auth.py +++ b/nova/vnc/auth.py @@ -22,19 +22,16 @@ import time import urlparse import webob -from webob import Request - from nova import context from nova import flags from nova import log as logging from nova import manager from nova import rpc from nova import utils -from nova import wsgi from nova import vnc -LOG = logging.getLogger('nova.vnc-proxy') +LOG = logging.getLogger('nova.vncproxy') FLAGS = flags.FLAGS diff --git a/nova/vnc/server.py b/nova/vnc/server.py new file mode 100644 index 000000000000..cad8696f1a3b --- /dev/null +++ b/nova/vnc/server.py @@ -0,0 +1,96 @@ +#!/usr/bin/env python +# vim: tabstop=4 shiftwidth=4 softtabstop=4 + +# Copyright (c) 2010 Openstack, LLC. +# 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. + +"""Auth Components for VNC Console.""" + +import os +import sys + +from nova import flags +from nova import log as logging +from nova import version +from nova import wsgi +from nova.vnc import auth +from nova.vnc import proxy + + +LOG = logging.getLogger('nova.vncproxy') +FLAGS = flags.FLAGS +flags.DEFINE_string('vncproxy_wwwroot', '/var/lib/nova/noVNC/', + 'Full path to noVNC directory') +flags.DEFINE_boolean('vnc_debug', False, + 'Enable debugging features, like token bypassing') +flags.DEFINE_integer('vncproxy_port', 6080, + 'Port that the VNC proxy should bind to') +flags.DEFINE_string('vncproxy_host', '0.0.0.0', + 'Address that the VNC proxy should bind to') +flags.DEFINE_integer('vnc_token_ttl', 300, + 'How many seconds before deleting tokens') +flags.DEFINE_string('vncproxy_manager', 'nova.vnc.auth.VNCProxyAuthManager', + 'Manager for vncproxy auth') + + +def get_wsgi_server(): + LOG.audit(_("Starting nova-vncproxy node (version %s)"), + version.version_string_with_vcs()) + + if not (os.path.exists(FLAGS.vncproxy_wwwroot) and + os.path.exists(FLAGS.vncproxy_wwwroot + '/vnc_auto.html')): + LOG.info(_("Missing vncproxy_wwwroot (version %s)"), + FLAGS.vncproxy_wwwroot) + LOG.info(_("You need a slightly modified version of noVNC " + "to work with the nova-vnc-proxy")) + LOG.info(_("Check out the most recent nova noVNC code: %s"), + "git://github.com/sleepsonthefloor/noVNC.git") + LOG.info(_("And drop it in %s"), FLAGS.vncproxy_wwwroot) + sys.exit(1) + + app = proxy.WebsocketVNCProxy(FLAGS.vncproxy_wwwroot) + + LOG.audit(_("Allowing access to the following files: %s"), + app.get_whitelist()) + + with_logging = auth.LoggingMiddleware(app) + + if FLAGS.vnc_debug: + with_auth = proxy.DebugMiddleware(with_logging) + else: + with_auth = auth.VNCNovaAuthMiddleware(with_logging) + + wsgi_server = wsgi.Server("VNC Proxy", + with_auth, + host=FLAGS.vncproxy_host, + port=FLAGS.vncproxy_port) + wsgi_server.start_tcp(handle_flash_socket_policy, + 843, + host=FLAGS.vncproxy_host) + return wsgi_server + + +def handle_flash_socket_policy(socket): + LOG.info(_("Received connection on flash socket policy port")) + + fd = socket.makefile('rw') + expected_command = "" + if expected_command in fd.read(len(expected_command) + 1): + LOG.info(_("Received valid flash socket policy request")) + fd.write('' % (FLAGS.vncproxy_port)) + fd.flush() + socket.close()