diff options
-rw-r--r-- | nova/api/openstack/compute/access_ips.py | 121 | ||||
-rw-r--r-- | nova/api/openstack/compute/extension_info.py | 5 | ||||
-rw-r--r-- | nova/api/openstack/compute/helpers.py | 7 | ||||
-rw-r--r-- | nova/api/openstack/compute/schemas/access_ips.py | 24 | ||||
-rw-r--r-- | nova/api/openstack/compute/schemas/servers.py | 8 | ||||
-rw-r--r-- | nova/api/openstack/compute/servers.py | 49 | ||||
-rw-r--r-- | nova/api/openstack/compute/views/servers.py | 5 | ||||
-rw-r--r-- | nova/api/validation/parameter_types.py | 10 | ||||
-rw-r--r-- | nova/policies/__init__.py | 2 | ||||
-rw-r--r-- | nova/policies/access_ips.py | 36 | ||||
-rw-r--r-- | nova/tests/unit/api/openstack/compute/test_access_ips.py | 282 | ||||
-rw-r--r-- | nova/tests/unit/api/openstack/compute/test_serversV21.py | 10 | ||||
-rw-r--r-- | nova/tests/unit/fake_policy.py | 1 | ||||
-rw-r--r-- | nova/tests/unit/test_policy.py | 2 | ||||
-rw-r--r-- | releasenotes/notes/extensions_remove-37e9d4092981abbe.yaml | 10 | ||||
-rw-r--r-- | setup.cfg | 6 |
16 files changed, 72 insertions, 506 deletions
diff --git a/nova/api/openstack/compute/access_ips.py b/nova/api/openstack/compute/access_ips.py deleted file mode 100644 index 2944ce41f9..0000000000 --- a/nova/api/openstack/compute/access_ips.py +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright 2013 IBM Corp. -# -# 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 nova.api.openstack.compute.schemas import access_ips -from nova.api.openstack import extensions -from nova.api.openstack import wsgi - -ALIAS = "os-access-ips" -authorize = extensions.os_compute_soft_authorizer(ALIAS) - - -class AccessIPsController(wsgi.Controller): - def _extend_server(self, req, server): - db_instance = req.get_db_instance(server['id']) - ip_v4 = db_instance.get('access_ip_v4') - ip_v6 = db_instance.get('access_ip_v6') - server['accessIPv4'] = str(ip_v4) if ip_v4 is not None else '' - server['accessIPv6'] = str(ip_v6) if ip_v6 is not None else '' - - @wsgi.extends - def show(self, req, resp_obj, id): - context = req.environ['nova.context'] - if authorize(context): - server = resp_obj.obj['server'] - self._extend_server(req, server) - - @wsgi.extends - def update(self, req, resp_obj, id, body): - context = req.environ['nova.context'] - if authorize(context): - server = resp_obj.obj['server'] - self._extend_server(req, server) - - @wsgi.extends(action='rebuild') - def rebuild(self, req, resp_obj, id, body): - context = req.environ['nova.context'] - if authorize(context): - server = resp_obj.obj['server'] - self._extend_server(req, server) - - @wsgi.extends - def detail(self, req, resp_obj): - context = req.environ['nova.context'] - if authorize(context): - servers = resp_obj.obj['servers'] - for server in servers: - self._extend_server(req, server) - - -class AccessIPs(extensions.V21APIExtensionBase): - """Access IPs support.""" - - name = "AccessIPs" - alias = ALIAS - version = 1 - v4_key = 'accessIPv4' - v6_key = 'accessIPv6' - - def get_controller_extensions(self): - controller = AccessIPsController() - extension = extensions.ControllerExtension(self, 'servers', - controller) - return [extension] - - def get_resources(self): - return [] - - def _extend_server(self, server_dict, create_kwargs): - """Extends the server create/update/rebuild operations. - - This extends the server create/update/rebuild operations to - add accessIPs into each of these. - """ - if AccessIPs.v4_key in server_dict: - access_ip_v4 = server_dict.get(AccessIPs.v4_key) - if access_ip_v4: - create_kwargs['access_ip_v4'] = access_ip_v4 - else: - create_kwargs['access_ip_v4'] = None - if AccessIPs.v6_key in server_dict: - access_ip_v6 = server_dict.get(AccessIPs.v6_key) - if access_ip_v6: - create_kwargs['access_ip_v6'] = access_ip_v6 - else: - create_kwargs['access_ip_v6'] = None - - # Extend server for the 3 extended points - - # NOTE(sdague): the server create extension point takes 3 args, - # but as we throw away one, our unit tests only provide 2. Make - # arg 3 optional given that we're going to tear all this out soon - # once extensions are gone. - def server_create(self, server_dict, create_kwargs, body_deprecated=None): - self._extend_server(server_dict, create_kwargs) - - def server_update(self, server_dict, update_kwargs): - self._extend_server(server_dict, update_kwargs) - - def server_rebuild(self, server_dict, rebuild_kwargs): - self._extend_server(server_dict, rebuild_kwargs) - - # Extend schema for the 3 extended points - def get_server_create_schema(self, version): - return access_ips.server_create - - def get_server_update_schema(self, version): - return access_ips.server_create - - def get_server_rebuild_schema(self, version): - return access_ips.server_create diff --git a/nova/api/openstack/compute/extension_info.py b/nova/api/openstack/compute/extension_info.py index 64d291db7d..e145d223cb 100644 --- a/nova/api/openstack/compute/extension_info.py +++ b/nova/api/openstack/compute/extension_info.py @@ -108,7 +108,10 @@ v21_to_v2_alias_mapping = { hardcoded_extensions = [ {'name': 'DiskConfig', 'alias': 'os-disk-config', - 'description': 'Disk Management Extension.'} + 'description': 'Disk Management Extension.'}, + {'name': 'AccessIPs', + 'description': 'Access IPs support.', + 'alias': 'os-access-ips'}, ] # V2.1 does not support XML but we need to keep an entry in the diff --git a/nova/api/openstack/compute/helpers.py b/nova/api/openstack/compute/helpers.py index af4f4e3903..fff7c6b6f7 100644 --- a/nova/api/openstack/compute/helpers.py +++ b/nova/api/openstack/compute/helpers.py @@ -17,6 +17,8 @@ from webob import exc from nova.i18n import _ API_DISK_CONFIG = "OS-DCF:diskConfig" +API_ACCESS_V4 = "accessIPv4" +API_ACCESS_V6 = "accessIPv6" def disk_config_from_api(value): @@ -59,3 +61,8 @@ def translate_attributes(server_dict, operation_kwargs): if auto_disk_config_raw is not None: auto_disk_config = disk_config_from_api(auto_disk_config_raw) operation_kwargs['auto_disk_config'] = auto_disk_config + + if API_ACCESS_V4 in server_dict: + operation_kwargs['access_ip_v4'] = server_dict.pop(API_ACCESS_V4) + if API_ACCESS_V6 in server_dict: + operation_kwargs['access_ip_v6'] = server_dict.pop(API_ACCESS_V6) diff --git a/nova/api/openstack/compute/schemas/access_ips.py b/nova/api/openstack/compute/schemas/access_ips.py deleted file mode 100644 index 37d3eea4b1..0000000000 --- a/nova/api/openstack/compute/schemas/access_ips.py +++ /dev/null @@ -1,24 +0,0 @@ -# Copyright 2014 NEC Corporation. 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. - -server_create = { - 'accessIPv4': { - 'type': 'string', - 'format': 'ipv4', - }, - 'accessIPv6': { - 'type': 'string', - 'format': 'ipv6', - } -} diff --git a/nova/api/openstack/compute/schemas/servers.py b/nova/api/openstack/compute/schemas/servers.py index 61b7a005f8..1e7ca1f7f3 100644 --- a/nova/api/openstack/compute/schemas/servers.py +++ b/nova/api/openstack/compute/schemas/servers.py @@ -44,6 +44,8 @@ base_create = { } }, 'OS-DCF:diskConfig': parameter_types.disk_config, + 'accessIPv4': parameter_types.accessIPv4, + 'accessIPv6': parameter_types.accessIPv6, }, 'required': ['name', 'flavorRef'], 'additionalProperties': False, @@ -72,6 +74,8 @@ base_update = { 'properties': { 'name': parameter_types.name, 'OS-DCF:diskConfig': parameter_types.disk_config, + 'accessIPv4': parameter_types.accessIPv4, + 'accessIPv6': parameter_types.accessIPv6, }, 'additionalProperties': False, }, @@ -100,7 +104,9 @@ base_rebuild = { 'adminPass': parameter_types.admin_password, 'metadata': parameter_types.metadata, 'preserve_ephemeral': parameter_types.boolean, - 'OS-DCF:diskConfig': parameter_types.disk_config + 'OS-DCF:diskConfig': parameter_types.disk_config, + 'accessIPv4': parameter_types.accessIPv4, + 'accessIPv6': parameter_types.accessIPv6, }, 'required': ['imageRef'], 'additionalProperties': False, diff --git a/nova/api/openstack/compute/servers.py b/nova/api/openstack/compute/servers.py index 564b29105d..3998209cab 100644 --- a/nova/api/openstack/compute/servers.py +++ b/nova/api/openstack/compute/servers.py @@ -62,8 +62,6 @@ class ServersController(wsgi.Controller): EXTENSION_REBUILD_NAMESPACE = 'nova.api.v21.extensions.server.rebuild' - EXTENSION_UPDATE_NAMESPACE = 'nova.api.v21.extensions.server.update' - _view_builder_class = views_servers.ViewBuilderV21 schema_server_create = schema_servers.base_create @@ -172,17 +170,6 @@ class ServersController(wsgi.Controller): if not list(self.rebuild_extension_manager): LOG.debug("Did not find any server rebuild extensions") - # Look for implementation of extension point of server update - self.update_extension_manager = \ - stevedore.enabled.EnabledExtensionManager( - namespace=self.EXTENSION_UPDATE_NAMESPACE, - check_func=_check_load_extension('server_update'), - invoke_on_load=True, - invoke_kwds={"extension_info": self.extension_info}, - propagate_map_exceptions=True) - if not list(self.update_extension_manager): - LOG.debug("Did not find any server update extensions") - # Look for API schema of server create extension self.create_schema_manager = \ stevedore.enabled.EnabledExtensionManager( @@ -203,26 +190,6 @@ class ServersController(wsgi.Controller): else: LOG.debug("Did not find any server create schemas") - # Look for API schema of server update extension - self.update_schema_manager = \ - stevedore.enabled.EnabledExtensionManager( - namespace=self.EXTENSION_UPDATE_NAMESPACE, - check_func=_check_load_extension('get_server_update_schema'), - invoke_on_load=True, - invoke_kwds={"extension_info": self.extension_info}, - propagate_map_exceptions=True) - if list(self.update_schema_manager): - self.update_schema_manager.map(self._update_extension_schema, - self.schema_server_update_v219, - '2.19') - self.update_schema_manager.map(self._update_extension_schema, - self.schema_server_update, '2.1') - self.update_schema_manager.map(self._update_extension_schema, - self.schema_server_update_v20, - '2.0') - else: - LOG.debug("Did not find any server update schemas") - # Look for API schema of server rebuild extension self.rebuild_schema_manager = \ stevedore.enabled.EnabledExtensionManager( @@ -736,11 +703,6 @@ class ServersController(wsgi.Controller): handler.server_rebuild(rebuild_dict, rebuild_kwargs) - def _update_extension_point(self, ext, update_dict, update_kwargs): - handler = ext.obj - LOG.debug("Running _update_extension_point for %s", ext.obj) - handler.server_update(update_dict, update_kwargs) - def _create_extension_schema(self, ext, create_schema, version): handler = ext.obj LOG.debug("Running _create_extension_schema for %s", ext.obj) @@ -754,13 +716,6 @@ class ServersController(wsgi.Controller): else: create_schema['properties']['server']['properties'].update(schema) - def _update_extension_schema(self, ext, update_schema, version): - handler = ext.obj - LOG.debug("Running _update_extension_schema for %s", ext.obj) - - schema = handler.get_server_update_schema(version) - update_schema['properties']['server']['properties'].update(schema) - def _rebuild_extension_schema(self, ext, rebuild_schema, version): handler = ext.obj LOG.debug("Running _rebuild_extension_schema for %s", ext.obj) @@ -801,10 +756,6 @@ class ServersController(wsgi.Controller): # This is allowed to be None (remove description) update_dict['display_description'] = body['server']['description'] - if list(self.update_extension_manager): - self.update_extension_manager.map(self._update_extension_point, - body['server'], update_dict) - helpers.translate_attributes(body['server'], update_dict) instance = self._get_server(ctxt, req, id, is_detail=True) diff --git a/nova/api/openstack/compute/views/servers.py b/nova/api/openstack/compute/views/servers.py index 9f806cec5c..1370c28464 100644 --- a/nova/api/openstack/compute/views/servers.py +++ b/nova/api/openstack/compute/views/servers.py @@ -284,6 +284,9 @@ class ViewBuilderV21(ViewBuilder): def show(self, request, instance, extend_address=True): """Detailed view of a single instance.""" + ip_v4 = instance.get('access_ip_v4') + ip_v6 = instance.get('access_ip_v6') + server = { "server": { "id": instance["uuid"], @@ -307,6 +310,8 @@ class ViewBuilderV21(ViewBuilder): "updated": utils.isotime(instance["updated_at"]), "addresses": self._get_addresses(request, instance, extend_address), + "accessIPv4": str(ip_v4) if ip_v4 is not None else '', + "accessIPv6": str(ip_v6) if ip_v6 is not None else '', "links": self._get_links(request, instance["uuid"], self._collection_name), diff --git a/nova/api/validation/parameter_types.py b/nova/api/validation/parameter_types.py index 712de2f642..7fada76676 100644 --- a/nova/api/validation/parameter_types.py +++ b/nova/api/validation/parameter_types.py @@ -362,6 +362,16 @@ disk_config = { 'enum': ['AUTO', 'MANUAL'] } +accessIPv4 = { + 'type': 'string', + 'format': 'ipv4', +} + +accessIPv6 = { + 'type': 'string', + 'format': 'ipv6', +} + flavor_param_positive = copy.deepcopy(volume_size) diff --git a/nova/policies/__init__.py b/nova/policies/__init__.py index 66f301ca6b..21d46cfe1d 100644 --- a/nova/policies/__init__.py +++ b/nova/policies/__init__.py @@ -13,7 +13,6 @@ import itertools -from nova.policies import access_ips from nova.policies import admin_actions from nova.policies import admin_password from nova.policies import agents @@ -101,7 +100,6 @@ from nova.policies import volumes_attachments def list_rules(): return itertools.chain( - access_ips.list_rules(), admin_actions.list_rules(), admin_password.list_rules(), agents.list_rules(), diff --git a/nova/policies/access_ips.py b/nova/policies/access_ips.py deleted file mode 100644 index 15b40f161c..0000000000 --- a/nova/policies/access_ips.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright 2016 Cloudbase Solutions Srl -# 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 oslo_policy import policy - -from nova.policies import base - - -BASE_POLICY_NAME = 'os_compute_api:os-access-ips' -POLICY_ROOT = 'os_compute_api:os-access-ips:%s' - - -access_ips_policies = [ - policy.RuleDefault( - name=POLICY_ROOT % 'discoverable', - check_str=base.RULE_ANY), - policy.RuleDefault( - name=BASE_POLICY_NAME, - check_str=base.RULE_ADMIN_OR_OWNER), -] - - -def list_rules(): - return access_ips_policies diff --git a/nova/tests/unit/api/openstack/compute/test_access_ips.py b/nova/tests/unit/api/openstack/compute/test_access_ips.py index 169deb8cb6..6a0e4a0748 100644 --- a/nova/tests/unit/api/openstack/compute/test_access_ips.py +++ b/nova/tests/unit/api/openstack/compute/test_access_ips.py @@ -12,149 +12,22 @@ # License for the specific language governing permissions and limitations # under the License. -from nova.api.openstack.compute import access_ips from nova.api.openstack.compute import extension_info from nova.api.openstack.compute import servers as servers_v21 -from nova.api.openstack import wsgi from nova import exception from nova import test from nova.tests.unit.api.openstack import fakes from nova.tests.unit.image import fake +v4_key = "accessIPv4" +v6_key = "accessIPv6" -class AccessIPsExtTestV21(test.NoDBTestCase): - def setUp(self): - super(AccessIPsExtTestV21, self).setUp() - self.access_ips_ext = access_ips.AccessIPs(None) - - def _test(self, func): - server_dict = {access_ips.AccessIPs.v4_key: '1.1.1.1', - access_ips.AccessIPs.v6_key: 'fe80::'} - create_kwargs = {} - func(server_dict, create_kwargs) - self.assertEqual(create_kwargs, {'access_ip_v4': '1.1.1.1', - 'access_ip_v6': 'fe80::'}) - - def _test_with_ipv4_only(self, func): - server_dict = {access_ips.AccessIPs.v4_key: '1.1.1.1'} - create_kwargs = {} - func(server_dict, create_kwargs) - self.assertEqual(create_kwargs, {'access_ip_v4': '1.1.1.1'}) - - def _test_with_ipv6_only(self, func): - server_dict = {access_ips.AccessIPs.v6_key: 'fe80::'} - create_kwargs = {} - func(server_dict, create_kwargs) - self.assertEqual(create_kwargs, {'access_ip_v6': 'fe80::'}) - - def _test_without_ipv4_and_ipv6(self, func): - server_dict = {} - create_kwargs = {} - func(server_dict, create_kwargs) - self.assertEqual(create_kwargs, {}) - - def _test_with_ipv4_null(self, func): - server_dict = {access_ips.AccessIPs.v4_key: None} - create_kwargs = {} - func(server_dict, create_kwargs) - self.assertEqual(create_kwargs, {'access_ip_v4': None}) - - def _test_with_ipv6_null(self, func): - server_dict = {access_ips.AccessIPs.v6_key: None} - create_kwargs = {} - func(server_dict, create_kwargs) - self.assertEqual(create_kwargs, {'access_ip_v6': None}) - - def _test_with_ipv4_blank(self, func): - server_dict = {access_ips.AccessIPs.v4_key: ''} - create_kwargs = {} - func(server_dict, create_kwargs) - self.assertEqual(create_kwargs, {'access_ip_v4': None}) - - def _test_with_ipv6_blank(self, func): - server_dict = {access_ips.AccessIPs.v6_key: ''} - create_kwargs = {} - func(server_dict, create_kwargs) - self.assertEqual(create_kwargs, {'access_ip_v6': None}) - - def test_server_create(self): - self._test(self.access_ips_ext.server_create) - - def test_server_create_with_ipv4_only(self): - self._test_with_ipv4_only(self.access_ips_ext.server_create) - - def test_server_create_with_ipv6_only(self): - self._test_with_ipv6_only(self.access_ips_ext.server_create) - - def test_server_create_without_ipv4_and_ipv6(self): - self._test_without_ipv4_and_ipv6(self.access_ips_ext.server_create) - - def test_server_create_with_ipv4_null(self): - self._test_with_ipv4_null(self.access_ips_ext.server_create) - - def test_server_create_with_ipv6_null(self): - self._test_with_ipv6_null(self.access_ips_ext.server_create) - - def test_server_create_with_ipv4_blank(self): - self._test_with_ipv4_blank(self.access_ips_ext.server_create) - - def test_server_create_with_ipv6_blank(self): - self._test_with_ipv6_blank(self.access_ips_ext.server_create) - - def test_server_update(self): - self._test(self.access_ips_ext.server_update) - - def test_server_update_with_ipv4_only(self): - self._test_with_ipv4_only(self.access_ips_ext.server_update) - - def test_server_update_with_ipv6_only(self): - self._test_with_ipv6_only(self.access_ips_ext.server_update) - - def test_server_update_without_ipv4_and_ipv6(self): - self._test_without_ipv4_and_ipv6(self.access_ips_ext.server_update) - - def test_server_update_with_ipv4_null(self): - self._test_with_ipv4_null(self.access_ips_ext.server_update) - - def test_server_update_with_ipv6_null(self): - self._test_with_ipv6_null(self.access_ips_ext.server_update) - - def test_server_update_with_ipv4_blank(self): - self._test_with_ipv4_blank(self.access_ips_ext.server_update) - def test_server_update_with_ipv6_blank(self): - self._test_with_ipv6_blank(self.access_ips_ext.server_update) - - def test_server_rebuild(self): - self._test(self.access_ips_ext.server_rebuild) - - def test_server_rebuild_with_ipv4_only(self): - self._test_with_ipv4_only(self.access_ips_ext.server_rebuild) - - def test_server_rebuild_with_ipv6_only(self): - self._test_with_ipv6_only(self.access_ips_ext.server_rebuild) - - def test_server_rebuild_without_ipv4_and_ipv6(self): - self._test_without_ipv4_and_ipv6(self.access_ips_ext.server_rebuild) - - def test_server_rebuild_with_ipv4_null(self): - self._test_with_ipv4_null(self.access_ips_ext.server_rebuild) - - def test_server_rebuild_with_ipv6_null(self): - self._test_with_ipv6_null(self.access_ips_ext.server_rebuild) - - def test_server_rebuild_with_ipv4_blank(self): - self._test_with_ipv4_blank(self.access_ips_ext.server_rebuild) - - def test_server_rebuild_with_ipv6_blank(self): - self._test_with_ipv6_blank(self.access_ips_ext.server_rebuild) - - -class AccessIPsExtAPIValidationTestV21(test.TestCase): +class AccessIPsAPIValidationTestV21(test.TestCase): validation_error = exception.ValidationError def setUp(self): - super(AccessIPsExtAPIValidationTestV21, self).setUp() + super(AccessIPsAPIValidationTestV21, self).setUp() def fake_save(context, **kwargs): pass @@ -176,11 +49,10 @@ class AccessIPsExtAPIValidationTestV21(test.TestCase): self.controller = servers_v21.ServersController( extension_info=ext_info) - # Note(gmann): V2.1 has Access IP as separate extension. This class tests - # calls controller directly so Access IPs will not be present in server - # response. Those are being tested in AccessIPsExtTest class. def _verify_update_access_ip(self, res_dict, params): - pass + for key, value in params.items(): + value = value or '' + self.assertEqual(res_dict['server'][key], value) def _test_create(self, params): body = { @@ -214,173 +86,61 @@ class AccessIPsExtAPIValidationTestV21(test.TestCase): self.controller._action_rebuild(self.req, fakes.FAKE_UUID, body=body) def test_create_server_with_access_ipv4(self): - params = {access_ips.AccessIPs.v4_key: '192.168.0.10'} + params = {v4_key: '192.168.0.10'} self._test_create(params) def test_create_server_with_access_ip_pass_disabled(self): # test with admin passwords disabled See lp bug 921814 self.flags(enable_instance_password=False) - params = {access_ips.AccessIPs.v4_key: '192.168.0.10', - access_ips.AccessIPs.v6_key: '2001:db8::9abc'} + params = {v4_key: '192.168.0.10', + v6_key: '2001:db8::9abc'} res = self._test_create(params) server = res['server'] self.assertNotIn("admin_password", server) def test_create_server_with_invalid_access_ipv4(self): - params = {access_ips.AccessIPs.v4_key: '1.1.1.1.1.1'} + params = {v4_key: '1.1.1.1.1.1'} self.assertRaises(self.validation_error, self._test_create, params) def test_create_server_with_access_ipv6(self): - params = {access_ips.AccessIPs.v6_key: '2001:db8::9abc'} + params = {v6_key: '2001:db8::9abc'} self._test_create(params) def test_create_server_with_invalid_access_ipv6(self): - params = {access_ips.AccessIPs.v6_key: 'fe80:::::::'} + params = {v6_key: 'fe80:::::::'} self.assertRaises(self.validation_error, self._test_create, params) def test_update_server_with_access_ipv4(self): - params = {access_ips.AccessIPs.v4_key: '192.168.0.10'} + params = {v4_key: '192.168.0.10'} self._test_update(params) def test_update_server_with_invalid_access_ipv4(self): - params = {access_ips.AccessIPs.v4_key: '1.1.1.1.1.1'} + params = {v4_key: '1.1.1.1.1.1'} self.assertRaises(self.validation_error, self._test_update, params) def test_update_server_with_access_ipv6(self): - params = {access_ips.AccessIPs.v6_key: '2001:db8::9abc'} + params = {v6_key: '2001:db8::9abc'} self._test_update(params) def test_update_server_with_invalid_access_ipv6(self): - params = {access_ips.AccessIPs.v6_key: 'fe80:::::::'} + params = {v6_key: 'fe80:::::::'} self.assertRaises(self.validation_error, self._test_update, params) def test_rebuild_server_with_access_ipv4(self): - params = {access_ips.AccessIPs.v4_key: '192.168.0.10'} + params = {v4_key: '192.168.0.10'} self._test_rebuild(params) def test_rebuild_server_with_invalid_access_ipv4(self): - params = {access_ips.AccessIPs.v4_key: '1.1.1.1.1.1'} + params = {v4_key: '1.1.1.1.1.1'} self.assertRaises(self.validation_error, self._test_rebuild, params) def test_rebuild_server_with_access_ipv6(self): - params = {access_ips.AccessIPs.v6_key: '2001:db8::9abc'} + params = {v6_key: '2001:db8::9abc'} self._test_rebuild(params) def test_rebuild_server_with_invalid_access_ipv6(self): - params = {access_ips.AccessIPs.v6_key: 'fe80:::::::'} + params = {v6_key: 'fe80:::::::'} self.assertRaises(self.validation_error, self._test_rebuild, params) - - -class AccessIPsControllerTestV21(test.NoDBTestCase): - def setUp(self): - super(AccessIPsControllerTestV21, self).setUp() - self.controller = access_ips.AccessIPsController() - - def _test_with_access_ips(self, func, kwargs={'id': 'fake'}): - req = wsgi.Request({'nova.context': - fakes.FakeRequestContext('fake_user', 'fake', - is_admin=True)}) - instance = {'uuid': 'fake', - 'access_ip_v4': '1.1.1.1', - 'access_ip_v6': 'fe80::'} - req.cache_db_instance(instance) - resp_obj = wsgi.ResponseObject( - {"server": {'id': 'fake'}}) - func(req, resp_obj, **kwargs) - self.assertEqual(resp_obj.obj['server'][access_ips.AccessIPs.v4_key], - '1.1.1.1') - self.assertEqual(resp_obj.obj['server'][access_ips.AccessIPs.v6_key], - 'fe80::') - - def _test_without_access_ips(self, func, kwargs={'id': 'fake'}): - req = wsgi.Request({'nova.context': - fakes.FakeRequestContext('fake_user', 'fake', - is_admin=True)}) - instance = {'uuid': 'fake', - 'access_ip_v4': None, - 'access_ip_v6': None} - req.cache_db_instance(instance) - resp_obj = wsgi.ResponseObject( - {"server": {'id': 'fake'}}) - func(req, resp_obj, **kwargs) - self.assertEqual(resp_obj.obj['server'][access_ips.AccessIPs.v4_key], - '') - self.assertEqual(resp_obj.obj['server'][access_ips.AccessIPs.v6_key], - '') - - def test_show(self): - self._test_with_access_ips(self.controller.show) - - def test_show_without_access_ips(self): - self._test_without_access_ips(self.controller.show) - - def test_detail(self): - req = wsgi.Request({'nova.context': - fakes.FakeRequestContext('fake_user', 'fake', - is_admin=True)}) - instance1 = {'uuid': 'fake1', - 'access_ip_v4': '1.1.1.1', - 'access_ip_v6': 'fe80::'} - instance2 = {'uuid': 'fake2', - 'access_ip_v4': '1.1.1.2', - 'access_ip_v6': 'fe81::'} - req.cache_db_instance(instance1) - req.cache_db_instance(instance2) - resp_obj = wsgi.ResponseObject( - {"servers": [{'id': 'fake1'}, {'id': 'fake2'}]}) - self.controller.detail(req, resp_obj) - self.assertEqual( - resp_obj.obj['servers'][0][access_ips.AccessIPs.v4_key], - '1.1.1.1') - self.assertEqual( - resp_obj.obj['servers'][0][access_ips.AccessIPs.v6_key], - 'fe80::') - self.assertEqual( - resp_obj.obj['servers'][1][access_ips.AccessIPs.v4_key], - '1.1.1.2') - self.assertEqual( - resp_obj.obj['servers'][1][access_ips.AccessIPs.v6_key], - 'fe81::') - - def test_detail_without_access_ips(self): - req = wsgi.Request({'nova.context': - fakes.FakeRequestContext('fake_user', 'fake', - is_admin=True)}) - instance1 = {'uuid': 'fake1', - 'access_ip_v4': None, - 'access_ip_v6': None} - instance2 = {'uuid': 'fake2', - 'access_ip_v4': None, - 'access_ip_v6': None} - req.cache_db_instance(instance1) - req.cache_db_instance(instance2) - resp_obj = wsgi.ResponseObject( - {"servers": [{'id': 'fake1'}, {'id': 'fake2'}]}) - self.controller.detail(req, resp_obj) - self.assertEqual( - resp_obj.obj['servers'][0][access_ips.AccessIPs.v4_key], '') - self.assertEqual( - resp_obj.obj['servers'][0][access_ips.AccessIPs.v6_key], '') - self.assertEqual( - resp_obj.obj['servers'][1][access_ips.AccessIPs.v4_key], '') - self.assertEqual( - resp_obj.obj['servers'][1][access_ips.AccessIPs.v6_key], '') - - def test_update(self): - self._test_with_access_ips(self.controller.update, {'id': 'fake', - 'body': {}}) - - def test_update_without_access_ips(self): - self._test_without_access_ips(self.controller.update, {'id': 'fake', - 'body': {}}) - - def test_rebuild(self): - self._test_with_access_ips(self.controller.rebuild, {'id': 'fake', - 'body': {}}) - - def test_rebuild_without_access_ips(self): - self._test_without_access_ips(self.controller.rebuild, {'id': 'fake', - 'body': {}}) diff --git a/nova/tests/unit/api/openstack/compute/test_serversV21.py b/nova/tests/unit/api/openstack/compute/test_serversV21.py index 2bb49274dd..dcf5ae5171 100644 --- a/nova/tests/unit/api/openstack/compute/test_serversV21.py +++ b/nova/tests/unit/api/openstack/compute/test_serversV21.py @@ -393,6 +393,8 @@ class ServersControllerTest(ControllerTest): }, ], "OS-DCF:diskConfig": "MANUAL", + "accessIPv4": '', + "accessIPv6": '', } } @@ -3697,6 +3699,8 @@ class ServersViewBuilderTest(test.TestCase): }, ], "OS-DCF:diskConfig": "MANUAL", + "accessIPv4": '', + "accessIPv6": '', } } @@ -3774,6 +3778,8 @@ class ServersViewBuilderTest(test.TestCase): "details": "Stock details for test", }, "OS-DCF:diskConfig": "MANUAL", + "accessIPv4": '', + "accessIPv6": '', } } @@ -3927,6 +3933,8 @@ class ServersViewBuilderTest(test.TestCase): }, ], "OS-DCF:diskConfig": "MANUAL", + "accessIPv4": '', + "accessIPv6": '', } } @@ -4001,6 +4009,8 @@ class ServersViewBuilderTest(test.TestCase): }, ], "OS-DCF:diskConfig": "MANUAL", + "accessIPv4": '', + "accessIPv6": '', } } diff --git a/nova/tests/unit/fake_policy.py b/nova/tests/unit/fake_policy.py index add9270c48..7e7f8bb9ba 100644 --- a/nova/tests/unit/fake_policy.py +++ b/nova/tests/unit/fake_policy.py @@ -26,7 +26,6 @@ policy_data = """ "os_compute_api:servers:migrations:force_complete": "", "os_compute_api:servers:migrations:index": "rule:admin_api", "os_compute_api:servers:migrations:show": "rule:admin_api", - "os_compute_api:os-access-ips": "", "os_compute_api:os-admin-actions:inject_network_info": "", "os_compute_api:os-admin-actions:reset_network": "", "os_compute_api:os-admin-actions:reset_state": "", diff --git a/nova/tests/unit/test_policy.py b/nova/tests/unit/test_policy.py index 1b04d7b600..841e4f40c8 100644 --- a/nova/tests/unit/test_policy.py +++ b/nova/tests/unit/test_policy.py @@ -364,7 +364,6 @@ class RealRolePolicyTestCase(test.NoDBTestCase): "os_compute_api:servers:show", "os_compute_api:servers:update", "os_compute_api:servers:create_image:allow_volume_backed", -"os_compute_api:os-access-ips", "os_compute_api:os-admin-password", "os_compute_api:os-attach-interfaces", "os_compute_api:os-certificates:create", @@ -417,7 +416,6 @@ class RealRolePolicyTestCase(test.NoDBTestCase): self.allow_all_rules = ( "os_compute_api:os-quota-sets:defaults", "os_compute_api:extensions:discoverable", -"os_compute_api:os-access-ips:discoverable", "os_compute_api:os-admin-actions:discoverable", "os_compute_api:os-admin-password:discoverable", "os_compute_api:os-aggregates:discoverable", diff --git a/releasenotes/notes/extensions_remove-37e9d4092981abbe.yaml b/releasenotes/notes/extensions_remove-37e9d4092981abbe.yaml index 12a8637d1f..7a8ac5a5d3 100644 --- a/releasenotes/notes/extensions_remove-37e9d4092981abbe.yaml +++ b/releasenotes/notes/extensions_remove-37e9d4092981abbe.yaml @@ -8,9 +8,15 @@ upgrade: shown / accepted. * os_compute_api:os-disk-config - show / accept - ``OS-DCF:diskConfig`` parameter + ``OS-DCF:diskConfig`` parameter on servers + + * os-access-ips - show / accept ``accessIPv4`` and ``accessIPv6`` + parameters on servers The following entry points have been removed * nova.api.v21.extensions.server.resize - allowed accepting - additional parameters on resize requests. + additional parameters on server resize requests. + + * nova.api.v21.extensions.server.update - allowed accepting + additional parameters on server update requests. @@ -65,7 +65,6 @@ console_scripts = nova-xvpvncproxy = nova.cmd.xvpvncproxy:main nova.api.v21.extensions = - access_ips = nova.api.openstack.compute.access_ips:AccessIPs admin_actions = nova.api.openstack.compute.admin_actions:AdminActions admin_password = nova.api.openstack.compute.admin_password:AdminPassword agents = nova.api.openstack.compute.agents:Agents @@ -153,7 +152,6 @@ nova.api.v21.extensions = volumes = nova.api.openstack.compute.volumes:Volumes nova.api.v21.extensions.server.create = - access_ips = nova.api.openstack.compute.access_ips:AccessIPs availability_zone = nova.api.openstack.compute.availability_zone:AvailabilityZone block_device_mapping = nova.api.openstack.compute.block_device_mapping:BlockDeviceMapping block_device_mapping_v1 = nova.api.openstack.compute.block_device_mapping_v1:BlockDeviceMappingV1 @@ -166,13 +164,9 @@ nova.api.v21.extensions.server.create = user_data = nova.api.openstack.compute.user_data:UserData nova.api.v21.extensions.server.rebuild = - access_ips = nova.api.openstack.compute.access_ips:AccessIPs personality = nova.api.openstack.compute.personality:Personality preserve_ephemeral_rebuild = nova.api.openstack.compute.preserve_ephemeral_rebuild:PreserveEphemeralRebuild -nova.api.v21.extensions.server.update = - access_ips = nova.api.openstack.compute.access_ips:AccessIPs - nova.api.v21.test_extensions = basic = nova.tests.unit.api.openstack.compute.basic:Basic microversions = nova.tests.unit.api.openstack.compute.microversions:Microversions |