Remove deprecated tenant network APIs

These were deprecated in Newton:

aaebeb05a0

Since this is the last of the deprecated contrib extensions,
we can also deprecate the 'only_contrib' parameter from the
novaclient.client.discover_extensions method.

Change-Id: Ie2e3fdc4e044f6eb304724d16a7d0f1f7ba705fd
This commit is contained in:
Matt Riedemann 2017-03-20 15:54:28 -04:00
parent dee51a0163
commit ac7c96690f
8 changed files with 35 additions and 180 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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