diff --git a/novaclient/client.py b/novaclient/client.py index aac0e8eb2..4d3f0f387 100644 --- a/novaclient/client.py +++ b/novaclient/client.py @@ -171,23 +171,20 @@ def _construct_http_client(api_version=None, **kwargs) -def discover_extensions(version, only_contrib=False): - """Returns the list of extensions, which can be discovered by python path, - contrib path and by entry-point 'novaclient.extension'. - - :param version: api version - :type version: str or novaclient.api_versions.APIVersion - :param only_contrib: search only in contrib directory or not - :type only_contrib: bool +def discover_extensions(*args, **kwargs): + """Returns the list of extensions, which can be discovered by python path + and by entry-point 'novaclient.extension'. """ - if not isinstance(version, api_versions.APIVersion): - version = api_versions.get_api_version(version) - if only_contrib: - chain = _discover_via_contrib_path(version) - else: - chain = itertools.chain(_discover_via_python_path(), - _discover_via_contrib_path(version), - _discover_via_entry_points()) + # TODO(mriedem): Remove support for 'only_contrib' in Queens. + if 'only_contrib' in kwargs and kwargs['only_contrib']: + warnings.warn(_LW('Discovering extensions only by contrib path is no ' + 'longer supported since all contrib extensions ' + 'have either been made required or removed. The ' + 'only_contrib argument is deprecated and will be ' + 'removed in a future release.')) + return [] + chain = itertools.chain(_discover_via_python_path(), + _discover_via_entry_points()) return [ext.Extension(name, module) for name, module in chain] @@ -204,16 +201,6 @@ def _discover_via_python_path(): yield name, module -def _discover_via_contrib_path(version): - if version.ver_major == 2: - modules = {"tenant_networks": "novaclient.v2.contrib.tenant_networks"} - - for name, module_name in modules.items(): - module_loader = pkgutil.get_loader(module_name) - module = module_loader.load_module(module_name) - yield name, module - - def _discover_via_entry_points(): for ep in pkg_resources.iter_entry_points('novaclient.extension'): name = ep.name diff --git a/novaclient/tests/unit/test_client.py b/novaclient/tests/unit/test_client.py index 4f739888a..81d6d56e8 100644 --- a/novaclient/tests/unit/test_client.py +++ b/novaclient/tests/unit/test_client.py @@ -78,12 +78,10 @@ class SessionClientTest(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_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): @@ -92,36 +90,34 @@ class ClientsUtilsTest(utils.TestCase): return f mock_discover_via_python_path.side_effect = make_gen(0, 3) - mock_discover_via_contrib_path.side_effect = make_gen(3, 5) - mock_discover_via_entry_points.side_effect = make_gen(5, 6) + mock_discover_via_entry_points.side_effect = make_gen(3, 4) version = novaclient.api_versions.APIVersion("2.0") result = novaclient.client.discover_extensions(version) - self.assertEqual([mock.call("name-%s" % i, i) for i in range(0, 6)], + self.assertEqual([mock.call("name-%s" % i, i) for i in range(0, 4)], mock_extension.call_args_list) mock_discover_via_python_path.assert_called_once_with() - mock_discover_via_contrib_path.assert_called_once_with(version) mock_discover_via_entry_points.assert_called_once_with() - self.assertEqual([mock_extension()] * 6, result) + self.assertEqual([mock_extension()] * 4, result) + @mock.patch('novaclient.client.warnings') @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_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")] + mock_discover_via_entry_points, mock_warnings): version = novaclient.api_versions.APIVersion("2.0") - novaclient.client.discover_extensions(version, only_contrib=True) - mock_discover_via_contrib_path.assert_called_once_with(version) + self.assertEqual([], novaclient.client.discover_extensions( + version, only_contrib=True)) self.assertFalse(mock_discover_via_python_path.called) self.assertFalse(mock_discover_via_entry_points.called) - mock_extension.assert_called_once_with("name", "module") + self.assertFalse(mock_extension.called) + self.assertTrue(mock_warnings.warn.called) @mock.patch("novaclient.client.warnings") def test__check_arguments(self, mock_warnings): diff --git a/novaclient/tests/unit/test_discover.py b/novaclient/tests/unit/test_discover.py index 44f3a49ef..c03c1d0fd 100644 --- a/novaclient/tests/unit/test_discover.py +++ b/novaclient/tests/unit/test_discover.py @@ -49,25 +49,19 @@ class DiscoverTest(utils.TestCase): def mock_discover_via_python_path(): yield 'foo', imp.new_module('foo') - def mock_discover_via_contrib_path(version): - yield 'bar', imp.new_module('bar') - def mock_discover_via_entry_points(): yield 'baz', imp.new_module('baz') @mock.patch.object(client, '_discover_via_python_path', mock_discover_via_python_path) - @mock.patch.object(client, - '_discover_via_contrib_path', - mock_discover_via_contrib_path) @mock.patch.object(client, '_discover_via_entry_points', mock_discover_via_entry_points) def test(): extensions = client.discover_extensions('1.1') - self.assertEqual(3, len(extensions)) - names = sorted(['foo', 'bar', 'baz']) + self.assertEqual(2, len(extensions)) + names = sorted(['foo', 'baz']) sorted_extensions = sorted(extensions, key=lambda ext: ext.name) for i in range(len(names)): ext = sorted_extensions[i] diff --git a/novaclient/tests/unit/v2/contrib/__init__.py b/novaclient/tests/unit/v2/contrib/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/novaclient/tests/unit/v2/contrib/test_tenant_networks.py b/novaclient/tests/unit/v2/contrib/test_tenant_networks.py deleted file mode 100644 index ba3998beb..000000000 --- a/novaclient/tests/unit/v2/contrib/test_tenant_networks.py +++ /dev/null @@ -1,54 +0,0 @@ -# Copyright 2012 OpenStack Foundation -# 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. - -from novaclient import api_versions -from novaclient import extension -from novaclient.tests.unit import utils -from novaclient.tests.unit.v2 import fakes -from novaclient.v2.contrib import tenant_networks - - -class TenantNetworkExtensionTests(utils.TestCase): - - def setUp(self): - super(TenantNetworkExtensionTests, self).setUp() - extensions = [ - extension.Extension(tenant_networks.__name__.split(".")[-1], - tenant_networks), - ] - self.cs = fakes.FakeClient(api_versions.APIVersion("2.0"), - extensions=extensions) - - def test_list_tenant_networks(self): - nets = self.cs.tenant_networks.list() - self.assert_request_id(nets, fakes.FAKE_REQUEST_ID_LIST) - self.cs.assert_called('GET', '/os-tenant-networks') - self.assertGreater(len(nets), 0) - - def test_get_tenant_network(self): - net = self.cs.tenant_networks.get(1) - self.assert_request_id(net, fakes.FAKE_REQUEST_ID_LIST) - self.cs.assert_called('GET', '/os-tenant-networks/1') - - def test_create_tenant_networks(self): - net = self.cs.tenant_networks.create(label="net", - cidr="10.0.0.0/24") - self.assert_request_id(net, fakes.FAKE_REQUEST_ID_LIST) - self.cs.assert_called('POST', '/os-tenant-networks') - - def test_delete_tenant_networks(self): - ret = self.cs.tenant_networks.delete(1) - self.assert_request_id(ret, fakes.FAKE_REQUEST_ID_LIST) - self.cs.assert_called('DELETE', '/os-tenant-networks/1') diff --git a/novaclient/tests/unit/v2/fakes.py b/novaclient/tests/unit/v2/fakes.py index ef5c6014b..47673d965 100644 --- a/novaclient/tests/unit/v2/fakes.py +++ b/novaclient/tests/unit/v2/fakes.py @@ -2329,27 +2329,6 @@ class FakeSessionClient(base_client.SessionClient): def delete_servers_1234_tags(self, **kw): return (204, {}, None) - def get_os_tenant_networks(self): - return (200, FAKE_RESPONSE_HEADERS, { - 'networks': [{"label": "1", "cidr": "10.0.0.0/24", - 'project_id': '4ffc664c198e435e9853f2538fbcd7a7', - 'id': '1'}]}) - - def get_os_tenant_networks_1(self, **kw): - return (200, FAKE_RESPONSE_HEADERS, { - 'network': {"label": "1", "cidr": "10.0.0.0/24", - 'project_id': '4ffc664c198e435e9853f2538fbcd7a7', - 'id': '1'}}) - - def post_os_tenant_networks(self, **kw): - return (201, FAKE_RESPONSE_HEADERS, { - 'network': {"label": "1", "cidr": "10.0.0.0/24", - 'project_id': '4ffc664c198e435e9853f2538fbcd7a7', - 'id': '1'}}) - - def delete_os_tenant_networks_1(self, **kw): - return (204, FAKE_RESPONSE_HEADERS, None) - def post_os_assisted_volume_snapshots(self, **kw): return (202, FAKE_RESPONSE_HEADERS, {'snapshot': {'id': 'blah', 'volumeId': '1'}}) diff --git a/novaclient/v2/contrib/tenant_networks.py b/novaclient/v2/contrib/tenant_networks.py deleted file mode 100644 index b7a39b9d6..000000000 --- a/novaclient/v2/contrib/tenant_networks.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright 2013 OpenStack Foundation -# -# 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 novaclient import api_versions -from novaclient import base - - -class TenantNetwork(base.Resource): - def delete(self): - """ - DEPRECATED: Delete this project network. - - :returns: An instance of novaclient.base.TupleWithMeta - """ - return self.manager.delete(network=self) - - -class TenantNetworkManager(base.ManagerWithFind): - """DEPRECATED""" - resource_class = base.Resource - - @api_versions.deprecated_after('2.35') - def list(self): - """DEPRECATED""" - return self._list('/os-tenant-networks', 'networks') - - @api_versions.deprecated_after('2.35') - def get(self, network): - """DEPRECATED""" - return self._get('/os-tenant-networks/%s' % base.getid(network), - 'network') - - @api_versions.deprecated_after('2.35') - def delete(self, network): - """ - DEPRECATED: Delete a specified project network. - - :param network: a project network to delete - :returns: An instance of novaclient.base.TupleWithMeta - """ - return self._delete('/os-tenant-networks/%s' % base.getid(network)) - - @api_versions.deprecated_after('2.35') - def create(self, label, cidr): - """DEPRECATED""" - body = {'network': {'label': label, 'cidr': cidr}} - return self._create('/os-tenant-networks', body, 'network') diff --git a/releasenotes/notes/pike-rm-deprecated-net-272aeb62b329a5bc.yaml b/releasenotes/notes/pike-rm-deprecated-net-272aeb62b329a5bc.yaml index e2d9d7bf1..2d71a7f6c 100644 --- a/releasenotes/notes/pike-rm-deprecated-net-272aeb62b329a5bc.yaml +++ b/releasenotes/notes/pike-rm-deprecated-net-272aeb62b329a5bc.yaml @@ -51,3 +51,14 @@ upgrade: * nova tenant-network-delete * nova tenant-network-list * nova tenant-network-show + + Along with the following python API bindings:: + + * novaclient.v2.contrib.tenant_networks + +deprecations: + - | + The ``only_contrib`` parameter for the + ``novaclient.client.discover_extensions`` method is deprecated and now + results in an empty list returned since all contrib extensions are either + required or have been removed. \ No newline at end of file