summaryrefslogtreecommitdiff
path: root/nova/debugger.py
diff options
context:
space:
mode:
authorMark McLoughlin <markmc@redhat.com>2014-02-18 07:48:07 +0000
committerMark McLoughlin <markmc@redhat.com>2014-03-25 06:44:50 -0400
commit0861fc2d22ae40b82dfe6fc0469db84339464923 (patch)
treec65125cab8a23507d4527887bd294925f45b13b4 /nova/debugger.py
parentf5eb59b89741b31ba51ca8a485a13e3fcb796728 (diff)
downloadnova-0861fc2d22ae40b82dfe6fc0469db84339464923.tar.gz
Re-work how debugger CLI opts are registered
CLI options must be registered before the command line is parsed or a cfg.ArgsAlreadyParsedError is raised. Since commit 2cbea24 we are registering two 'remote_debug' arguments in nova.service. In commit b506529, we see a hack being added to ensure that nova.service is imported and the CLI opts registered before config.parse_args() is called. To clean this up somewhat, refactor all the elements of this remote debugger support into nova.debugger. Avoid importing modules at module import time since we need to import this before monkey patching. Add a function for registering the CLI options just before config.parse_args() is called. And fail gracefully if the CLI options aren't registered when we called debugger.init(). Note that because the options aren't registered at module import time any more, the config generator doesn't pick them up. However, that's actually a good thing since this support doesn't work if you enable it via config files since debugger.enabled() only looks at the command line. DocImpact: remote_debug options are not available via the config file, only via the command line. Change-Id: I97f747a2fb9222137203657df1d86ba89f3219e2
Diffstat (limited to 'nova/debugger.py')
-rw-r--r--nova/debugger.py80
1 files changed, 80 insertions, 0 deletions
diff --git a/nova/debugger.py b/nova/debugger.py
new file mode 100644
index 0000000000..77ca74188d
--- /dev/null
+++ b/nova/debugger.py
@@ -0,0 +1,80 @@
+# Copyright 2010 United States Government as represented by the
+# Administrator of the National Aeronautics and Space Administration.
+# Copyright 2011 Justin Santa Barbara
+# 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.
+
+# NOTE(markmc): this is imported before monkey patching in nova.cmd
+# so we avoid extra imports here
+
+import sys
+
+
+def enabled():
+ return ('--remote_debug-host' in sys.argv and
+ '--remote_debug-port' in sys.argv)
+
+
+def register_cli_opts():
+ from oslo.config import cfg
+
+ cli_opts = [
+ cfg.StrOpt('host',
+ help='Debug host (IP or name) to connect. Note '
+ 'that using the remote debug option changes how '
+ 'Nova uses the eventlet library to support async IO. '
+ 'This could result in failures that do not occur '
+ 'under normal operation. Use at your own risk.'),
+
+ cfg.IntOpt('port',
+ help='Debug port to connect. Note '
+ 'that using the remote debug option changes how '
+ 'Nova uses the eventlet library to support async IO. '
+ 'This could result in failures that do not occur '
+ 'under normal operation. Use at your own risk.')
+
+ ]
+
+ cfg.CONF.register_cli_opts(cli_opts, 'remote_debug')
+
+
+def init():
+ from oslo.config import cfg
+ CONF = cfg.CONF
+
+ # NOTE(markmc): gracefully handle the CLI options not being registered
+ if 'remote_debug' not in CONF:
+ return
+
+ if not (CONF.remote_debug.host and CONF.remote_debug.port):
+ return
+
+ from nova.openstack.common.gettextutils import _
+ from nova.openstack.common import log as logging
+ LOG = logging.getLogger(__name__)
+
+ LOG.debug(_('Listening on %(host)s:%(port)s for debug connection'),
+ {'host': CONF.remote_debug.host,
+ 'port': CONF.remote_debug.port})
+
+ from pydev import pydevd
+ pydevd.settrace(host=CONF.remote_debug.host,
+ port=CONF.remote_debug.port,
+ stdoutToServer=False,
+ stderrToServer=False)
+
+ LOG.warn(_('WARNING: Using the remote debug option changes how '
+ 'Nova uses the eventlet library to support async IO. This '
+ 'could result in failures that do not occur under normal '
+ 'operation. Use at your own risk.'))