From 173173e7b8b634aab90279587d8d6513c92b7913 Mon Sep 17 00:00:00 2001 From: Hongbin Lu Date: Sun, 17 Mar 2019 16:39:11 +0000 Subject: [PATCH] Add validation for capsule template The capsule API allows users sending plain text as the capsule's template (because gophercloud is doing that). However, if the template is sent as plain text, the schema validation is unexpected skipped. This commit adds validation for plain text template. Change-Id: I77a18b2ebd7663962ffdfcebadac493fb74d5723 --- zun/api/controllers/v1/capsules.py | 6 ++++ .../unit/api/controllers/v1/test_capsules.py | 29 ++++++++++--------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/zun/api/controllers/v1/capsules.py b/zun/api/controllers/v1/capsules.py index f7f4e6c1f..cfcbe009c 100644 --- a/zun/api/controllers/v1/capsules.py +++ b/zun/api/controllers/v1/capsules.py @@ -21,9 +21,11 @@ from zun.api.controllers import base from zun.api.controllers import link from zun.api.controllers.v1 import collection from zun.api.controllers.v1.schemas import capsules as schema +from zun.api.controllers.v1.schemas import parameter_types from zun.api.controllers.v1.views import capsules_view as view from zun.api import utils as api_utils from zun.api import validation +from zun.api.validation import validators from zun.common import consts from zun.common import exception from zun.common.i18n import _ @@ -62,6 +64,10 @@ def check_capsule_template(tpl): except Exception as e: raise exception.FailedParseStringToJson(e) + validator = validators.SchemaValidator( + parameter_types.capsule_template) + validator.validate(tpl_json) + kind_field = tpl_json.get('kind') if kind_field not in ['capsule', 'Capsule']: raise exception.InvalidCapsuleTemplate("kind fields need to be " diff --git a/zun/tests/unit/api/controllers/v1/test_capsules.py b/zun/tests/unit/api/controllers/v1/test_capsules.py index 07f15a6ad..eee7f640d 100644 --- a/zun/tests/unit/api/controllers/v1/test_capsules.py +++ b/zun/tests/unit/api/controllers/v1/test_capsules.py @@ -27,21 +27,22 @@ class TestCheckCapsuleTemplate(api_base.FunctionalTest): with self.assertRaisesRegex( exception.InvalidCapsuleTemplate, "kind fields need to " "be set as capsule or Capsule"): - params = ({"kind": "test", "spec": {"containers": []}}) + params = ({"kind": "test", "metadata": {}, + "spec": {"containers": []}}) capsules.check_capsule_template(params) with self.assertRaisesRegex( exception.InvalidCapsuleTemplate, "No Spec found"): - params = ({"kind": "capsule"}) + params = ({"kind": "capsule", "metadata": {}}) capsules.check_capsule_template(params) with self.assertRaisesRegex( exception.InvalidCapsuleTemplate, "No valid containers field"): - params = ({"kind": "capsule", "spec": {}}) + params = ({"kind": "capsule", "metadata": {}, "spec": {}}) capsules.check_capsule_template(params) - params = ({"kind": "capsule", "spec": { + params = ({"kind": "capsule", "metadata": {}, "spec": { "containers": [{"image": "test1"}], "restartPolicy": "Always", }}) spec_content, tpl_json = capsules.check_capsule_template(params) @@ -49,23 +50,25 @@ class TestCheckCapsuleTemplate(api_base.FunctionalTest): def test_check_capsule_template_unicode(self): with self.assertRaisesRegex( - exception.InvalidCapsuleTemplate, "kind fields need to " - "be set as capsule or Capsule"): - params = (u'{"kind": "test", "spec": {"containers": []}}') + exception.SchemaValidationError, + "Invalid input for field 'kind'"): + params = (u'{"kind": "test", "metadata": {}, ' + '"spec": {"containers": []}}') capsules.check_capsule_template(params) with self.assertRaisesRegex( - exception.InvalidCapsuleTemplate, "No Spec found"): - params = (u'{"kind": "capsule"}') + exception.SchemaValidationError, + "'spec' is a required property"): + params = (u'{"kind": "capsule", "metadata": {}}') capsules.check_capsule_template(params) with self.assertRaisesRegex( - exception.InvalidCapsuleTemplate, - "No valid containers field"): - params = (u'{"kind": "capsule", "spec": {}}') + exception.SchemaValidationError, + "Invalid input for field 'spec'"): + params = (u'{"kind": "capsule", "spec": {}, "metadata": {}}') capsules.check_capsule_template(params) - params = (u'{"kind": "capsule", "spec": {' + params = (u'{"kind": "capsule", "metadata": {}, "spec": {' u'"containers": [{"image": "test1"}],' u'"restartPolicy": "Always"}}') spec_content, tpl_json = capsules.check_capsule_template(params)