Make scheduler_hints schema allow list of id

Nova v2.0 API allows a list of server_id, and the corresponding
filter handles it. However, Nova v2.1 API doesn't do that now.
That is backward incompatibile issue.
This patch fixes this issue.

NOTE: Tempest patch Ib3365ac2783a0578c7a1a1e72d9b6c9cfea340f5
      is for reproducing this problem on the gate.
      After this fixing, the Tempest patch can be merged and
      we will be able to block this problem.

Change-Id: I1de7d184c590e84ab1b38880c8d784d38c37b820
Closes-Bug: #1521928
(cherry picked from commit 2841dd3de9)
This commit is contained in:
Ken'ichi Ohmichi 2015-12-18 01:23:47 +00:00 committed by Ken'ichi Ohmichi
parent aa80001314
commit 9d47930c8d
2 changed files with 36 additions and 6 deletions

View File

@ -28,9 +28,16 @@ _hints = {
# uuids where a new server is scheduled on a different host.
# A user can specify one server as string parameter and should
# specify multiple servers as array parameter instead.
'type': ['string', 'array'],
'format': 'uuid',
'items': parameter_types.server_id
'oneOf': [
{
'type': 'string',
'format': 'uuid'
},
{
'type': 'array',
'items': parameter_types.server_id
}
]
},
'same_host': {
# NOTE: The value of 'different_host' is the set of server

View File

@ -73,10 +73,10 @@ class SchedulerHintsTestCaseV21(test.TestCase):
res = req.get_response(self.app)
self.assertEqual(202, res.status_int)
def test_create_server_with_hints(self):
def _test_create_server_with_hint(self, hint):
def fake_create(*args, **kwargs):
self.assertEqual(kwargs['scheduler_hints'], {'group': 'foo'})
self.assertEqual(kwargs['scheduler_hints'], hint)
return ([self.fake_instance], '')
self.stubs.Set(nova.compute.api.API, 'create', fake_create)
@ -90,13 +90,24 @@ class SchedulerHintsTestCaseV21(test.TestCase):
'imageRef': 'cedef40a-ed67-4d10-800e-17455edce175',
'flavorRef': '1',
},
'os:scheduler_hints': {'group': 'foo'},
'os:scheduler_hints': hint,
}
req.body = jsonutils.dumps(body)
res = req.get_response(self.app)
self.assertEqual(202, res.status_int)
def test_create_server_with_group_hint(self):
self._test_create_server_with_hint({'group': 'foo'})
def test_create_server_with_different_host_hint(self):
self._test_create_server_with_hint(
{'different_host': '9c47bf55-e9d8-42da-94ab-7f9e80cd1857'})
self._test_create_server_with_hint(
{'different_host': ['9c47bf55-e9d8-42da-94ab-7f9e80cd1857',
'82412fa6-0365-43a9-95e4-d8b20e00c0de']})
def _create_server_with_scheduler_hints_bad_request(self, param):
req = self._get_request()
req.method = 'POST'
@ -120,6 +131,13 @@ class SchedulerHintsTestCaseV21(test.TestCase):
param = {'group': 'a' * 256}
self._create_server_with_scheduler_hints_bad_request(param)
def test_create_server_with_bad_different_host_hint(self):
param = {'different_host': 'non-server-id'}
self._create_server_with_scheduler_hints_bad_request(param)
param = {'different_host': ['non-server-id01', 'non-server-id02']}
self._create_server_with_scheduler_hints_bad_request(param)
class SchedulerHintsTestCaseV2(SchedulerHintsTestCaseV21):
@ -138,6 +156,11 @@ class SchedulerHintsTestCaseV2(SchedulerHintsTestCaseV21):
# We skip this test for v2.0.
pass
def test_create_server_with_bad_different_host_hint(self):
# NOTE: v2.0 API cannot handle this bad request case now.
# We skip this test for v2.0.
pass
class ServersControllerCreateTestV21(test.TestCase):