remove access_ips extension

Part of bp:api-no-more-extensions

Change-Id: Id48dfdf29bb6b250ad505428bd034074cb611cc1
This commit is contained in:
Sean Dague 2016-06-20 16:49:44 -04:00
parent 997b63f740
commit 600480e59d
16 changed files with 72 additions and 506 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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
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)
v4_key = "accessIPv4"
v6_key = "accessIPv6"
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': {}})

View File

@ -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": '',
}
}

View File

@ -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": "",

View File

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

View File

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

View File

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