remove access_ips extension
Part of bp:api-no-more-extensions Change-Id: Id48dfdf29bb6b250ad505428bd034074cb611cc1
This commit is contained in:
parent
997b63f740
commit
600480e59d
@ -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
|
@ -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
|
||||
|
@ -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)
|
||||
|
@ -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',
|
||||
}
|
||||
}
|
@ -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,
|
||||
|
@ -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)
|
||||
|
@ -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),
|
||||
|
@ -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)
|
||||
|
||||
|
||||
|
@ -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(),
|
||||
|
@ -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
|
@ -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': {}})
|
||||
|
@ -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": '',
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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": "",
|
||||
|
@ -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",
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user