diff options
author | Vishvananda Ishaya <vishvananda@gmail.com> | 2011-09-23 12:08:23 -0700 |
---|---|---|
committer | Vishvananda Ishaya <vishvananda@gmail.com> | 2011-09-28 11:36:19 -0700 |
commit | a870dfae7da2df1e51a9066bf0583c3ab86690e8 (patch) | |
tree | 10d0a6b9341c8ac6d1b3e0b70d4f045382027562 | |
parent | ebec34e374bd9ec5354e3648a6e8f3ce26c951b5 (diff) | |
download | nova-a870dfae7da2df1e51a9066bf0583c3ab86690e8.tar.gz nova-a870dfae7da2df1e51a9066bf0583c3ab86690e8.tar.xz nova-a870dfae7da2df1e51a9066bf0583c3ab86690e8.zip |
Add nova-all to run all services
* Cleans up service for objectstore and vncproxy
* Fixes virt.fake to be runnable via a flag
Change-Id: I18e05a4d727bbbd3481063623dc3b6ad52e233d4
-rwxr-xr-x | bin/nova-all | 80 | ||||
-rwxr-xr-x | bin/nova-objectstore | 12 | ||||
-rwxr-xr-x | bin/nova-vncproxy | 76 | ||||
-rw-r--r-- | nova/objectstore/s3server.py | 7 | ||||
-rw-r--r-- | nova/virt/fake.py | 2 | ||||
-rw-r--r-- | nova/vnc/auth.py | 5 | ||||
-rw-r--r-- | nova/vnc/server.py | 96 |
7 files changed, 190 insertions, 88 deletions
diff --git a/bin/nova-all b/bin/nova-all new file mode 100755 index 000000000..497195bda --- /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 757301c24..957de821f 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 8e75451cb..9b44a95ea 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 = "<policy-file-request/>" - if expected_command in fd.read(len(expected_command) + 1): - LOG.info(_("Received valid flash socket policy request")) - fd.write('<?xml version="1.0"?><cross-domain-policy><allow-' - 'access-from domain="*" to-ports="%d" /></cross-' - 'domain-policy>' % (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 1ab47b034..485cc3cde 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 60cc43b01..2c5b12237 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 ce5e10388..b96dc595e 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 000000000..cad8696f1 --- /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 = "<policy-file-request/>" + if expected_command in fd.read(len(expected_command) + 1): + LOG.info(_("Received valid flash socket policy request")) + fd.write('<?xml version="1.0"?><cross-domain-policy><allow-' + 'access-from domain="*" to-ports="%d" /></cross-' + 'domain-policy>' % (FLAGS.vncproxy_port)) + fd.flush() + socket.close() |