diff --git a/sahara/service/validations/clusters.py b/sahara/service/validations/clusters.py index 50314222..b34bc4a2 100644 --- a/sahara/service/validations/clusters.py +++ b/sahara/service/validations/clusters.py @@ -35,7 +35,7 @@ def _build_cluster_schema(): }, "user_keypair_id": { "type": "string", - "format": "valid_name", + "format": "valid_keypair_name", }, "cluster_template_id": { "type": "string", diff --git a/sahara/tests/unit/service/validation/test_cluster_create_validation.py b/sahara/tests/unit/service/validation/test_cluster_create_validation.py index 64e15dd7..5417c97f 100644 --- a/sahara/tests/unit/service/validation/test_cluster_create_validation.py +++ b/sahara/tests/unit/service/validation/test_cluster_create_validation.py @@ -122,16 +122,6 @@ class TestClusterCreateValidation(u.ValidationTestCase): ) def test_cluster_create_v_keypair_type(self): - self._assert_create_object_validation( - data={ - 'name': "test-name", - 'plugin_name': "vanilla", - 'hadoop_version': "1.2.1", - 'user_keypair_id': '1' - }, - bad_req_i=(1, 'VALIDATION_ERROR', - "'1' is not a 'valid_name'") - ) self._assert_create_object_validation( data={ 'name': "test-name", @@ -139,7 +129,7 @@ class TestClusterCreateValidation(u.ValidationTestCase): 'hadoop_version': "1.2.1", 'user_keypair_id': '!'}, bad_req_i=(1, 'VALIDATION_ERROR', - "'!' is not a 'valid_name'") + "'!' is not a 'valid_keypair_name'") ) def test_cluster_create_v_image_exists(self): diff --git a/sahara/tests/unit/utils/test_api_validator.py b/sahara/tests/unit/utils/test_api_validator.py index 8c7766b5..4e30f74f 100644 --- a/sahara/tests/unit/utils/test_api_validator.py +++ b/sahara/tests/unit/utils/test_api_validator.py @@ -172,8 +172,8 @@ class ApiValidatorTest(testtools.TestCase): self._validate_success(schema, "hadoop-examples-1.2.1.jar") self._validate_success(schema, "hadoop-examples-1.2.1") self._validate_success(schema, "hadoop-examples-1.2.1.") - self._validate_failure(schema, "1") - self._validate_failure(schema, "1a") + self._validate_success(schema, "1") + self._validate_success(schema, "1a") self._validate_success(schema, "a1") self._validate_success(schema, "A1") self._validate_success(schema, "A1B") @@ -182,6 +182,43 @@ class ApiValidatorTest(testtools.TestCase): self._validate_success(schema, "a._.b") self._validate_success(schema, "a_") self._validate_success(schema, "a-b-001") + self._validate_failure(schema, "-aaaa-bbbb") + self._validate_failure(schema, ".aaaa-bbbb") + + self._validate_failure(schema, None) + self._validate_failure(schema, 1) + self._validate_failure(schema, ["1"]) + + def test_validate_valid_keypair_name(self): + schema = { + "type": "string", + "format": "valid_keypair_name", + } + + self._validate_success(schema, "abcd") + self._validate_success(schema, "abcd123") + self._validate_success(schema, "abcd-123") + self._validate_success(schema, "abcd_123") + self._validate_success(schema, "_123") + self._validate_success(schema, "a" * 64) + self._validate_failure(schema, "") + self._validate_failure(schema, "hadoop-examples-1.2.1.jar") + self._validate_failure(schema, "hadoop-examples-1.2.1") + self._validate_failure(schema, "hadoop-examples-1.2.1.") + self._validate_success(schema, "1") + self._validate_success(schema, "1a") + self._validate_success(schema, "a1") + self._validate_success(schema, "A1") + self._validate_success(schema, "A1B") + self._validate_failure(schema, "a.b") + self._validate_failure(schema, "a..b") + self._validate_failure(schema, "a._.b") + self._validate_success(schema, "a_") + self._validate_success(schema, "a-b-001") + self._validate_success(schema, "-aaaa-bbbb") + self._validate_success(schema, "-aaaa bbbb") + self._validate_success(schema, " -aaaa bbbb") + self._validate_failure(schema, ".aaaa-bbbb") self._validate_failure(schema, None) self._validate_failure(schema, 1) diff --git a/sahara/utils/api_validator.py b/sahara/utils/api_validator.py index 792e586b..c278754a 100644 --- a/sahara/utils/api_validator.py +++ b/sahara/utils/api_validator.py @@ -40,7 +40,18 @@ def validate_name_format(entry): # shoud fail type validation return True - res = re.match(r"^[a-zA-Z][a-zA-Z0-9\-_\.]*$", entry) + res = re.match(r"^[a-zA-Z0-9][a-zA-Z0-9\-_\.]*$", entry) + return res is not None + + +@jsonschema.FormatChecker.cls_checks('valid_keypair_name') +def validate_keypair_name_format(entry): + if not isinstance(entry, six.string_types): + # should fail type validation + return True + + # this follows the validation put forth by nova for keypair names + res = re.match(r'^[a-zA-Z0-9\-_ ]+$', entry) return res is not None