Enable 'null' value for user_data in V2.1 API

The legacy v2 API allow the 'null' value for user_data. Unfortunately
the v2.1 API didn't match that in the input validation. This patch
enables 'null' value, at sametime, it enables for v2.1 compat mode
also.

Conflicts:
        api-ref/source/parameters.yaml

NOTE(mriedem): The conflict is due to the api-ref parameters file
not existing until Newton. It's just a note in the docs on the
user_data parameter and isn't required for this backport.

Change-Id: Iae614035efd4b37c214754ad12b17ca224b8fd92
Closes-Bug: #1582911
(cherry picked from commit 22c87390a3)
This commit is contained in:
He Jie Xu
2016-05-19 11:04:10 +08:00
committed by Matt Riedemann
parent a2058ea8de
commit 2024387ecc
4 changed files with 32 additions and 1 deletions

View File

@@ -18,3 +18,13 @@ server_create = {
'format': 'base64'
},
}
server_create_v20 = {
'user_data': {
'oneOf': [
{'type': 'string', 'format': 'base64'},
{'type': 'null'},
],
},
}

View File

@@ -39,4 +39,6 @@ class UserData(extensions.V21APIExtensionBase):
create_kwargs['user_data'] = server_dict.get(ATTRIBUTE_NAME)
def get_server_create_schema(self, version):
if version == '2.0':
return schema_user_data.server_create_v20
return schema_user_data.server_create

View File

@@ -48,6 +48,10 @@ def _validate_base64_format(instance):
base64.decodestring(instance)
except base64.binascii.Error:
return False
except TypeError:
# The name must be string type. If instance isn't string type, the
# TypeError will be raised at here.
return False
return True

View File

@@ -16,6 +16,7 @@
import base64
import datetime
import mock
import uuid
from oslo_config import cfg
@@ -135,7 +136,7 @@ class ServersControllerCreateTest(test.TestCase):
fake_method)
def _test_create_extra(self, params, no_image=False,
override_controller=None):
override_controller=None, legacy_v2=False):
image_uuid = 'c905cedb-7281-47e4-8a62-f26bc5fc4c77'
server = dict(name='server_test', imageRef=image_uuid, flavorRef=2)
if no_image:
@@ -146,6 +147,8 @@ class ServersControllerCreateTest(test.TestCase):
req.method = 'POST'
req.body = jsonutils.dump_as_bytes(body)
req.headers["content-type"] = "application/json"
if legacy_v2:
req.set_legacy_v2()
if override_controller:
server = override_controller.create(req, body=body).obj['server']
else:
@@ -187,3 +190,15 @@ class ServersControllerCreateTest(test.TestCase):
params = {user_data.ATTRIBUTE_NAME: value}
self.assertRaises(exception.ValidationError,
self._test_create_extra, params)
@mock.patch('nova.compute.api.API.create')
def test_create_instance_with_none_allowd_for_v20_compat_mode(self,
mock_create):
def create(context, *args, **kwargs):
self.assertIsNone(kwargs['user_data'])
return ([fakes.stub_instance_obj(context)], None)
mock_create.side_effect = create
params = {user_data.ATTRIBUTE_NAME: None}
self._test_create_extra(params, legacy_v2=True)