Introduce helper for checking args deprecation

This patch introduces `_check_arguments` methods for processing deprecation
workflow of novaclient.client.Client entry-point.

Also, this patch adds a proper warning messages for 'auth_plugin',
'auth_system' arguments, which were removed previously

Change-Id: I7ee210c08f4126b267572c5428511451aeb17260
This commit is contained in:
Andrey Kurilin 2016-12-02 19:07:03 +02:00 committed by Andrey Kurilin
parent 330516543b
commit bf09ad844e
2 changed files with 75 additions and 10 deletions

View File

@ -825,6 +825,32 @@ def get_client_class(version):
return client_class
def _check_arguments(kwargs, release, deprecated_name, right_name=None):
"""Process deprecation of arguments.
Checks presence of deprecated argument in kwargs, prints proper warning
message, renames key to right one it needed.
"""
if deprecated_name in kwargs:
msg = _LW("The '%(old)s' argument is deprecated in %(release)s and "
"its use may result in errors in future releases.") % {
"old": deprecated_name, "release": release}
if right_name:
if right_name in kwargs:
msg += _LW(" As '%(new)s' is provided, the '%(old)s' argument "
"will be ignored.") % {"old": deprecated_name,
"new": right_name}
kwargs.pop(deprecated_name)
else:
msg += _LW(" Use '%s' instead.") % right_name
kwargs[right_name] = kwargs.pop(deprecated_name)
else:
# just ignore it
kwargs.pop(deprecated_name)
warnings.warn(msg)
def Client(version, username=None, api_key=None, project_id=None,
auth_url=None, **kwargs):
"""Initialize client object based on given version.
@ -847,6 +873,10 @@ def Client(version, username=None, api_key=None, project_id=None,
session API. See "The novaclient Python API" page at
python-novaclient's doc.
"""
_check_arguments(kwargs, "Ocata", "auth_plugin")
_check_arguments(kwargs, "Ocata", "auth_system")
api_version, client_class = _get_client_class_and_version(version)
kwargs.pop("direct_use", None)
return client_class(username=username, api_key=api_key,

View File

@ -13,7 +13,7 @@
# License for the specific language governing permissions and limitations
# under the License.
import copy
import logging
import fixtures
@ -478,16 +478,16 @@ class SessionClientTest(utils.TestCase):
'compute')
class DiscoverExtensionTest(utils.TestCase):
class ClientsUtilsTest(utils.TestCase):
@mock.patch("novaclient.client._discover_via_entry_points")
@mock.patch("novaclient.client._discover_via_contrib_path")
@mock.patch("novaclient.client._discover_via_python_path")
@mock.patch("novaclient.extension.Extension")
def test_discover_all(self, mock_extension,
mock_discover_via_python_path,
mock_discover_via_contrib_path,
mock_discover_via_entry_points):
def test_discover_extensions_all(self, mock_extension,
mock_discover_via_python_path,
mock_discover_via_contrib_path,
mock_discover_via_entry_points):
def make_gen(start, end):
def f(*args, **kwargs):
for i in range(start, end):
@ -513,10 +513,9 @@ class DiscoverExtensionTest(utils.TestCase):
@mock.patch("novaclient.client._discover_via_contrib_path")
@mock.patch("novaclient.client._discover_via_python_path")
@mock.patch("novaclient.extension.Extension")
def test_discover_only_contrib(self, mock_extension,
mock_discover_via_python_path,
mock_discover_via_contrib_path,
mock_discover_via_entry_points):
def test_discover_extensions_only_contrib(
self, mock_extension, mock_discover_via_python_path,
mock_discover_via_contrib_path, mock_discover_via_entry_points):
mock_discover_via_contrib_path.return_value = [("name", "module")]
version = novaclient.api_versions.APIVersion("2.0")
@ -526,3 +525,39 @@ class DiscoverExtensionTest(utils.TestCase):
self.assertFalse(mock_discover_via_python_path.called)
self.assertFalse(mock_discover_via_entry_points.called)
mock_extension.assert_called_once_with("name", "module")
@mock.patch("novaclient.client.warnings")
def test__check_arguments(self, mock_warnings):
release = "Coolest"
# no reference
novaclient.client._check_arguments({}, release=release,
deprecated_name="foo")
self.assertFalse(mock_warnings.warn.called)
novaclient.client._check_arguments({}, release=release,
deprecated_name="foo",
right_name="bar")
self.assertFalse(mock_warnings.warn.called)
# with alternative
original_kwargs = {"foo": "text"}
actual_kwargs = copy.copy(original_kwargs)
self.assertEqual(original_kwargs, actual_kwargs)
novaclient.client._check_arguments(actual_kwargs, release=release,
deprecated_name="foo",
right_name="bar")
self.assertNotEqual(original_kwargs, actual_kwargs)
self.assertEqual({"bar": original_kwargs["foo"]}, actual_kwargs)
self.assertTrue(mock_warnings.warn.called)
mock_warnings.warn.reset_mock()
# without alternative
original_kwargs = {"foo": "text"}
actual_kwargs = copy.copy(original_kwargs)
self.assertEqual(original_kwargs, actual_kwargs)
novaclient.client._check_arguments(actual_kwargs, release=release,
deprecated_name="foo")
self.assertNotEqual(original_kwargs, actual_kwargs)
self.assertEqual({}, actual_kwargs)
self.assertTrue(mock_warnings.warn.called)