Implement query param schema for GET hypervisor(2.33)
GET hypervisor API accept query param for paging since microversion 2.33. This commit adds json schema to validating the valid query parameters. There is no change in API behaviour and additionalProperty is kept True for backward compatibility. Partially implements blueprint json-schema-validation-for-query-param Change-Id: I0e8cf3ebd34ef93d6fa5da5cbcd5bde94c85138d
This commit is contained in:
parent
e05718ff51
commit
291f407a49
@ -204,6 +204,7 @@ class HypervisorsController(wsgi.Controller):
|
||||
return self._index(req, limit=limit, marker=marker, links=True)
|
||||
|
||||
@wsgi.Controller.api_version("2.33", "2.52") # noqa
|
||||
@validation.query_schema(hyper_schema.list_query_schema_v233)
|
||||
@extensions.expected_errors((400))
|
||||
def index(self, req):
|
||||
limit, marker = common.get_limit_and_marker(req)
|
||||
@ -233,6 +234,7 @@ class HypervisorsController(wsgi.Controller):
|
||||
return self._detail(req, limit=limit, marker=marker, links=True)
|
||||
|
||||
@wsgi.Controller.api_version("2.33", "2.52") # noqa
|
||||
@validation.query_schema(hyper_schema.list_query_schema_v233)
|
||||
@extensions.expected_errors((400))
|
||||
def detail(self, req):
|
||||
limit, marker = common.get_limit_and_marker(req)
|
||||
|
@ -14,6 +14,15 @@
|
||||
|
||||
from nova.api.validation import parameter_types
|
||||
|
||||
list_query_schema_v233 = {
|
||||
'type': 'object',
|
||||
'properties': parameter_types.pagination_parameters,
|
||||
# NOTE(gmann): This is kept True to keep backward compatibility.
|
||||
# As of now Schema validation stripped out the additional parameters and
|
||||
# does not raise 400. In microversion 2.53, the additional parameters
|
||||
# are not allowed.
|
||||
'additionalProperties': True
|
||||
}
|
||||
|
||||
list_query_schema_v253 = {
|
||||
'type': 'object',
|
||||
|
@ -846,6 +846,63 @@ class HypervisorsTestV233(HypervisorsTestV228):
|
||||
self.assertRaises(exc.HTTPBadRequest,
|
||||
self.controller.index, req)
|
||||
|
||||
def test_index_pagination_with_invalid_non_int_limit(self):
|
||||
req = self._get_request(True,
|
||||
'/v2/1234/os-hypervisors?limit=-9')
|
||||
self.assertRaises(exception.ValidationError,
|
||||
self.controller.index, req)
|
||||
|
||||
def test_index_pagination_with_invalid_string_limit(self):
|
||||
req = self._get_request(True,
|
||||
'/v2/1234/os-hypervisors?limit=abc')
|
||||
self.assertRaises(exception.ValidationError,
|
||||
self.controller.index, req)
|
||||
|
||||
def test_index_duplicate_query_parameters_with_invalid_string_limit(self):
|
||||
req = self._get_request(
|
||||
True,
|
||||
'/v2/1234/os-hypervisors/?limit=1&limit=abc')
|
||||
self.assertRaises(exception.ValidationError,
|
||||
self.controller.index, req)
|
||||
|
||||
def test_index_duplicate_query_parameters_validation(self):
|
||||
expected = [{
|
||||
'hypervisor_hostname': 'hyper2',
|
||||
'id': 2,
|
||||
'state': 'up',
|
||||
'status': 'enabled'}
|
||||
]
|
||||
params = {
|
||||
'limit': 1,
|
||||
'marker': 1,
|
||||
}
|
||||
|
||||
for param, value in params.items():
|
||||
req = self._get_request(
|
||||
use_admin_context=True,
|
||||
url='/os-hypervisors?marker=1&%s=%s&%s=%s' %
|
||||
(param, value, param, value))
|
||||
result = self.controller.index(req)
|
||||
self.assertEqual(expected, result['hypervisors'])
|
||||
|
||||
def test_index_pagination_with_additional_filter(self):
|
||||
expected = {
|
||||
'hypervisors': [
|
||||
{'hypervisor_hostname': 'hyper2',
|
||||
'id': 2,
|
||||
'state': 'up',
|
||||
'status': 'enabled'}
|
||||
],
|
||||
'hypervisors_links': [
|
||||
{'href': 'http://localhost/v2/hypervisors?limit=1&marker=2',
|
||||
'rel': 'next'}
|
||||
]
|
||||
}
|
||||
req = self._get_request(
|
||||
True, '/v2/1234/os-hypervisors?limit=1&marker=1&additional=3')
|
||||
result = self.controller.index(req)
|
||||
self.assertEqual(expected, result)
|
||||
|
||||
def test_detail_pagination(self):
|
||||
req = self._get_request(
|
||||
True, '/v2/1234/os-hypervisors/detail?limit=1&marker=1')
|
||||
@ -893,6 +950,106 @@ class HypervisorsTestV233(HypervisorsTestV228):
|
||||
self.assertRaises(exc.HTTPBadRequest,
|
||||
self.controller.detail, req)
|
||||
|
||||
def test_detail_pagination_with_invalid_string_limit(self):
|
||||
req = self._get_request(True,
|
||||
'/v2/1234/os-hypervisors/detail?limit=abc')
|
||||
self.assertRaises(exception.ValidationError,
|
||||
self.controller.detail, req)
|
||||
|
||||
def test_detail_duplicate_query_parameters_with_invalid_string_limit(self):
|
||||
req = self._get_request(
|
||||
True,
|
||||
'/v2/1234/os-hypervisors/detail?limit=1&limit=abc')
|
||||
self.assertRaises(exception.ValidationError,
|
||||
self.controller.detail, req)
|
||||
|
||||
def test_detail_duplicate_query_parameters_validation(self):
|
||||
expected = [
|
||||
{'cpu_info': {'arch': 'x86_64',
|
||||
'features': [],
|
||||
'model': '',
|
||||
'topology': {'cores': 1,
|
||||
'sockets': 1,
|
||||
'threads': 1},
|
||||
'vendor': 'fake'},
|
||||
'current_workload': 2,
|
||||
'disk_available_least': 100,
|
||||
'free_disk_gb': 125,
|
||||
'free_ram_mb': 5120,
|
||||
'host_ip': netaddr.IPAddress('2.2.2.2'),
|
||||
'hypervisor_hostname': 'hyper2',
|
||||
'hypervisor_type': 'xen',
|
||||
'hypervisor_version': 3,
|
||||
'id': 2,
|
||||
'local_gb': 250,
|
||||
'local_gb_used': 125,
|
||||
'memory_mb': 10240,
|
||||
'memory_mb_used': 5120,
|
||||
'running_vms': 2,
|
||||
'service': {'disabled_reason': None,
|
||||
'host': 'compute2',
|
||||
'id': 2},
|
||||
'state': 'up',
|
||||
'status': 'enabled',
|
||||
'vcpus': 4,
|
||||
'vcpus_used': 2}
|
||||
]
|
||||
|
||||
params = {
|
||||
'limit': 1,
|
||||
'marker': 1,
|
||||
}
|
||||
|
||||
for param, value in params.items():
|
||||
req = self._get_request(
|
||||
use_admin_context=True,
|
||||
url='/os-hypervisors/detail?marker=1&%s=%s&%s=%s' %
|
||||
(param, value, param, value))
|
||||
result = self.controller.detail(req)
|
||||
self.assertEqual(expected, result['hypervisors'])
|
||||
|
||||
def test_detail_pagination_with_additional_filter(self):
|
||||
link = 'http://localhost/v2/hypervisors/detail?limit=1&marker=2'
|
||||
expected = {
|
||||
'hypervisors': [
|
||||
{'cpu_info': {'arch': 'x86_64',
|
||||
'features': [],
|
||||
'model': '',
|
||||
'topology': {'cores': 1,
|
||||
'sockets': 1,
|
||||
'threads': 1},
|
||||
'vendor': 'fake'},
|
||||
'current_workload': 2,
|
||||
'disk_available_least': 100,
|
||||
'free_disk_gb': 125,
|
||||
'free_ram_mb': 5120,
|
||||
'host_ip': netaddr.IPAddress('2.2.2.2'),
|
||||
'hypervisor_hostname': 'hyper2',
|
||||
'hypervisor_type': 'xen',
|
||||
'hypervisor_version': 3,
|
||||
'id': 2,
|
||||
'local_gb': 250,
|
||||
'local_gb_used': 125,
|
||||
'memory_mb': 10240,
|
||||
'memory_mb_used': 5120,
|
||||
'running_vms': 2,
|
||||
'service': {'disabled_reason': None,
|
||||
'host': 'compute2',
|
||||
'id': 2},
|
||||
'state': 'up',
|
||||
'status': 'enabled',
|
||||
'vcpus': 4,
|
||||
'vcpus_used': 2}
|
||||
],
|
||||
'hypervisors_links': [{
|
||||
'href': link,
|
||||
'rel': 'next'}]
|
||||
}
|
||||
req = self._get_request(
|
||||
True, '/v2/1234/os-hypervisors/detail?limit=1&marker=1&unknown=2')
|
||||
result = self.controller.detail(req)
|
||||
self.assertEqual(expected, result)
|
||||
|
||||
|
||||
class HypervisorsTestV252(HypervisorsTestV233):
|
||||
"""This is a boundary test to make sure 2.52 works like 2.33."""
|
||||
@ -1231,6 +1388,30 @@ class HypervisorsTestV253(HypervisorsTestV252):
|
||||
self.assertRaises(exc.HTTPBadRequest,
|
||||
self.controller.detail, req)
|
||||
|
||||
def test_detail_pagination_with_additional_filter(self):
|
||||
req = self._get_request(
|
||||
True, '/v2/1234/os-hypervisors/detail?limit=1&marker=9&unknown=2')
|
||||
self.assertRaises(exception.ValidationError,
|
||||
self.controller.detail, req)
|
||||
|
||||
def test_detail_duplicate_query_parameters_validation(self):
|
||||
"""Tests that the list Detail query parameter schema enforces only a
|
||||
single entry for any query parameter.
|
||||
"""
|
||||
params = {
|
||||
'limit': 1,
|
||||
'marker': uuids.marker,
|
||||
'hypervisor_hostname_pattern': 'foo',
|
||||
'with_servers': 'true'
|
||||
}
|
||||
for param, value in params.items():
|
||||
req = self._get_request(
|
||||
use_admin_context=True,
|
||||
url='/os-hypervisors/detail?%s=%s&%s=%s' %
|
||||
(param, value, param, value))
|
||||
self.assertRaises(exception.ValidationError,
|
||||
self.controller.detail, req)
|
||||
|
||||
def test_index_pagination(self):
|
||||
"""Tests index paging with uuid markers."""
|
||||
req = self._get_request(
|
||||
@ -1259,7 +1440,13 @@ class HypervisorsTestV253(HypervisorsTestV252):
|
||||
self.assertRaises(exc.HTTPBadRequest,
|
||||
self.controller.index, req)
|
||||
|
||||
def test_list_duplicate_query_parameters_validation(self):
|
||||
def test_index_pagination_with_additional_filter(self):
|
||||
req = self._get_request(
|
||||
True, '/v2/1234/os-hypervisors/?limit=1&marker=9&unknown=2')
|
||||
self.assertRaises(exception.ValidationError,
|
||||
self.controller.index, req)
|
||||
|
||||
def test_index_duplicate_query_parameters_validation(self):
|
||||
"""Tests that the list query parameter schema enforces only a single
|
||||
entry for any query parameter.
|
||||
"""
|
||||
|
Loading…
x
Reference in New Issue
Block a user