Merge "Add schema validation to v2 create tenant"
This commit is contained in:
commit
3d9a1f1b97
|
@ -88,15 +88,7 @@ class Tenant(controller.V2Controller):
|
|||
def create_project(self, request, tenant):
|
||||
tenant_ref = self._normalize_dict(tenant)
|
||||
|
||||
if 'name' not in tenant_ref or not tenant_ref['name']:
|
||||
msg = _('Name field is required and cannot be empty')
|
||||
raise exception.ValidationError(message=msg)
|
||||
|
||||
if 'is_domain' in tenant_ref:
|
||||
msg = _('The creation of projects acting as domains is not '
|
||||
'allowed in v2.')
|
||||
raise exception.ValidationError(message=msg)
|
||||
|
||||
validation.lazy_validate(schema.tenant_create, tenant)
|
||||
self.assert_admin(request)
|
||||
|
||||
self.resource_api.ensure_default_domain_exists()
|
||||
|
|
|
@ -13,6 +13,12 @@
|
|||
from keystone.common import validation
|
||||
from keystone.common.validation import parameter_types
|
||||
|
||||
_name_properties = {
|
||||
'type': 'string',
|
||||
'minLength': 1,
|
||||
'maxLength': 64,
|
||||
'pattern': '[\S]+'
|
||||
}
|
||||
|
||||
_project_properties = {
|
||||
'description': validation.nullable(parameter_types.description),
|
||||
|
@ -21,12 +27,7 @@ _project_properties = {
|
|||
'enabled': parameter_types.boolean,
|
||||
'is_domain': parameter_types.boolean,
|
||||
'parent_id': validation.nullable(parameter_types.id_string),
|
||||
'name': {
|
||||
'type': 'string',
|
||||
'minLength': 1,
|
||||
'maxLength': 64,
|
||||
'pattern': '[\S]+'
|
||||
}
|
||||
'name': _name_properties
|
||||
}
|
||||
|
||||
project_create = {
|
||||
|
@ -50,12 +51,7 @@ project_update = {
|
|||
_domain_properties = {
|
||||
'description': validation.nullable(parameter_types.description),
|
||||
'enabled': parameter_types.boolean,
|
||||
'name': {
|
||||
'type': 'string',
|
||||
'minLength': 1,
|
||||
'maxLength': 64,
|
||||
'pattern': '[\S]+'
|
||||
}
|
||||
'name': _name_properties
|
||||
}
|
||||
|
||||
domain_create = {
|
||||
|
@ -74,3 +70,20 @@ domain_update = {
|
|||
'minProperties': 1,
|
||||
'additionalProperties': True
|
||||
}
|
||||
|
||||
_tenant_properties = {
|
||||
'description': validation.nullable(parameter_types.description),
|
||||
'enabled': parameter_types.boolean,
|
||||
'name': _name_properties,
|
||||
'id': validation.nullable(parameter_types.id_string)
|
||||
}
|
||||
|
||||
tenant_create = {
|
||||
'type': 'object',
|
||||
'properties': _tenant_properties,
|
||||
'required': ['name'],
|
||||
'not': {
|
||||
'required': ['is_domain']
|
||||
},
|
||||
'additionalProperties': True
|
||||
}
|
||||
|
|
|
@ -16,6 +16,7 @@ import uuid
|
|||
from keystone.assignment import schema as assignment_schema
|
||||
from keystone.common.validation import validators
|
||||
from keystone import exception
|
||||
from keystone.resource import schema as resource_schema
|
||||
from keystone.tests import unit
|
||||
|
||||
|
||||
|
@ -62,3 +63,71 @@ class RoleValidationTestCase(unit.BaseTestCase):
|
|||
self.assertRaises(exception.SchemaValidationError,
|
||||
self.create_validator.validate,
|
||||
request)
|
||||
|
||||
|
||||
class TenantValidationTestCase(unit.BaseTestCase):
|
||||
"""Test for v2 Tenant API Validation."""
|
||||
|
||||
def setUp(self):
|
||||
super(TenantValidationTestCase, self).setUp()
|
||||
schema_tenant_create = resource_schema.tenant_create
|
||||
self.create_validator = validators.SchemaValidator(
|
||||
schema_tenant_create)
|
||||
|
||||
def test_validate_tenant_create_success(self):
|
||||
request = {
|
||||
'name': uuid.uuid4().hex
|
||||
}
|
||||
self.create_validator.validate(request)
|
||||
|
||||
def test_validate_tenant_create_success_with_empty_description(self):
|
||||
request = {
|
||||
'name': uuid.uuid4().hex,
|
||||
'description': ''
|
||||
}
|
||||
self.create_validator.validate(request)
|
||||
|
||||
def test_validate_tenant_create_success_with_extra_parameters(self):
|
||||
request = {
|
||||
'name': uuid.uuid4().hex,
|
||||
'description': 'Test tenant',
|
||||
'enabled': True,
|
||||
'extra': 'test'
|
||||
}
|
||||
self.create_validator.validate(request)
|
||||
|
||||
def test_validate_tenant_create_failure_with_missing_name(self):
|
||||
request = {
|
||||
'description': 'Test tenant',
|
||||
'enabled': True
|
||||
}
|
||||
self.assertRaises(exception.SchemaValidationError,
|
||||
self.create_validator.validate,
|
||||
request)
|
||||
|
||||
def test_validate_tenant_create_failure_with_empty_name(self):
|
||||
request = {
|
||||
'name': '',
|
||||
'description': uuid.uuid4().hex,
|
||||
'enabled': True
|
||||
}
|
||||
self.assertRaises(exception.SchemaValidationError,
|
||||
self.create_validator.validate,
|
||||
request)
|
||||
|
||||
def test_validate_tenant_create_failure_with_empty_request(self):
|
||||
request = {}
|
||||
self.assertRaises(exception.SchemaValidationError,
|
||||
self.create_validator.validate,
|
||||
request)
|
||||
|
||||
def test_validate_tenant_create_failure_with_is_domain(self):
|
||||
request = {
|
||||
'name': uuid.uuid4().hex,
|
||||
'description': 'Test tenant',
|
||||
'enabled': True,
|
||||
'is_domain': False
|
||||
}
|
||||
self.assertRaises(exception.SchemaValidationError,
|
||||
self.create_validator.validate,
|
||||
request)
|
||||
|
|
Loading…
Reference in New Issue