Merge "Add schema validation to v2 create tenant"

This commit is contained in:
Jenkins 2016-07-28 03:09:24 +00:00 committed by Gerrit Code Review
commit 3d9a1f1b97
3 changed files with 95 additions and 21 deletions

View File

@ -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()

View File

@ -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
}

View File

@ -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)