Add proper support for deprecation messages

Add support for warning once about deprecated options. Use that in
the rootwrap options deprecation message, and move it to run_as_root
so that the deprecated message is emitted once and only if used.

Change-Id: I29e39c662b4456256f4c9397f305bfa857972c46
This commit is contained in:
Thierry Carrez 2012-08-08 17:49:44 +02:00
parent 12aae1a072
commit 0b221c9983
4 changed files with 114 additions and 6 deletions

@ -0,0 +1,55 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright (c) 2012 IBM
#
# 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 warnings
from cinder import exception
from cinder import flags
from cinder.openstack.common import cfg
from cinder.openstack.common import log as logging
LOG = logging.getLogger(__name__)
deprecate_opts = [
cfg.BoolOpt('fatal_deprecations',
default=False,
help='make deprecations fatal')
]
FLAGS = flags.FLAGS
FLAGS.register_opts(deprecate_opts)
def _showwarning(message, category, filename, lineno, file=None, line=None):
"""
Redirect warnings into logging.
"""
LOG.warn(str(message))
# Install our warnings handler
warnings.showwarning = _showwarning
def warn(msg=""):
"""
Warn of a deprecated config option that an operator has specified.
This should be added in the code where we've made a change in how
we use some operator changeable parameter to indicate that it will
go away in a future version of OpenStack.
"""
warnings.warn(_("Deprecated Config: %s") % msg)
if FLAGS.fatal_deprecations:
raise exception.DeprecatedConfig(msg=msg)

@ -171,6 +171,10 @@ class CinderException(Exception):
super(CinderException, self).__init__(message) super(CinderException, self).__init__(message)
class DeprecatedConfig(CinderException):
message = _("Fatal call to deprecated config") + " %(msg)s"
class DecryptionFailure(CinderException): class DecryptionFailure(CinderException):
message = _("Failed to decrypt text") message = _("Failed to decrypt text")

@ -0,0 +1,46 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4
#
# Copyright 2010 OpenStack LLC
#
# 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.
from cinder.common import deprecated
from cinder import exception
from cinder import test
class DeprecatedConfigTestCase(test.TestCase):
def setUp(self):
super(DeprecatedConfigTestCase, self).setUp()
self.logbuffer = ""
def local_log(msg):
self.logbuffer = msg
self.stubs.Set(deprecated.LOG, 'warn', local_log)
def test_deprecated(self):
deprecated.warn('test')
self.assertEqual(self.logbuffer, 'Deprecated Config: test')
def test_deprecated_fatal(self):
self.flags(fatal_deprecations=True)
self.assertRaises(exception.DeprecatedConfig,
deprecated.warn, "test2")
self.assertEqual(self.logbuffer, 'Deprecated Config: test2')
def test_deprecated_logs_only_once(self):
deprecated.warn('only once!')
deprecated.warn('only once!')
deprecated.warn('only once!')
self.assertEqual(self.logbuffer, 'Deprecated Config: only once!')

@ -46,6 +46,7 @@ from eventlet import greenthread
from eventlet.green import subprocess from eventlet.green import subprocess
import netaddr import netaddr
from cinder.common import deprecated
from cinder import exception from cinder import exception
from cinder import flags from cinder import flags
from cinder.openstack.common import log as logging from cinder.openstack.common import log as logging
@ -59,12 +60,6 @@ ISO_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S"
PERFECT_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%f" PERFECT_TIME_FORMAT = "%Y-%m-%dT%H:%M:%S.%f"
FLAGS = flags.FLAGS FLAGS = flags.FLAGS
if FLAGS.rootwrap_config is None or FLAGS.root_helper != 'sudo':
LOG.warn(_('The root_helper option (which lets you specify a root '
'wrapper different from cinder-rootwrap, and defaults to '
'using sudo) is now deprecated. You should use the '
'rootwrap_config option instead.'))
def find_config(config_path): def find_config(config_path):
"""Find a configuration file using the given hint. """Find a configuration file using the given hint.
@ -187,6 +182,14 @@ def execute(*cmd, **kwargs):
'to utils.execute: %r') % kwargs) 'to utils.execute: %r') % kwargs)
if run_as_root: if run_as_root:
if FLAGS.rootwrap_config is None or FLAGS.root_helper != 'sudo':
deprecated.warn(_('The root_helper option (which lets you specify '
'a root wrapper different from cinder-rootwrap, '
'and defaults to using sudo) is now deprecated. '
'You should use the rootwrap_config option '
'instead.'))
if (FLAGS.rootwrap_config is not None): if (FLAGS.rootwrap_config is not None):
cmd = ['sudo', 'cinder-rootwrap', cmd = ['sudo', 'cinder-rootwrap',
FLAGS.rootwrap_config] + list(cmd) FLAGS.rootwrap_config] + list(cmd)