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
This commit is contained in:
Hongbin Lu 2019-03-17 16:39:11 +00:00
parent 5af5601f83
commit 173173e7b8
2 changed files with 22 additions and 13 deletions

View File

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

View File

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