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

View File

@ -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)

View File

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

View File

@ -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!')

View File

@ -46,6 +46,7 @@ from eventlet import greenthread
from eventlet.green import subprocess
import netaddr
from cinder.common import deprecated
from cinder import exception
from cinder import flags
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"
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):
"""Find a configuration file using the given hint.
@ -187,6 +182,14 @@ def execute(*cmd, **kwargs):
'to utils.execute: %r') % kwargs)
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):
cmd = ['sudo', 'cinder-rootwrap',
FLAGS.rootwrap_config] + list(cmd)