From 5b349b4e8920913fb46e0ca8972a54ef09cbf097 Mon Sep 17 00:00:00 2001 From: akihito-inoh Date: Thu, 6 Jul 2017 15:38:49 +0000 Subject: [PATCH] Replace voluptuous with JSONSchema to validate change_node_power_state Now in watcher,both JSONSchema and voluptuous are used to validate JSON payloads. We want to remove voluptuous and Use JSONSchema as our only JSON validation tool to keep consistence and also to make it easier to expose the validation schema through our API in future work. In this patch, we replace voluptuous with JSONSchema to validate the change_node_power_state action in watcher applier. Partially Implements: blueprint jsonschema-validation Change-Id: If9ffe5e0b107e0da5673247e4d5ec9917790827f --- .../actions/change_node_power_state.py | 35 +++++++++++++------ .../actions/test_change_node_power_state.py | 27 ++++---------- 2 files changed, 31 insertions(+), 31 deletions(-) diff --git a/watcher/applier/actions/change_node_power_state.py b/watcher/applier/actions/change_node_power_state.py index 431612b5f..703cb1c84 100644 --- a/watcher/applier/actions/change_node_power_state.py +++ b/watcher/applier/actions/change_node_power_state.py @@ -18,8 +18,7 @@ # import enum -import six -import voluptuous +import jsonschema from watcher._i18n import _ from watcher.applier.actions import base @@ -53,15 +52,29 @@ class ChangeNodePowerState(base.BaseAction): @property def schema(self): - return voluptuous.Schema({ - voluptuous.Required(self.RESOURCE_ID): - voluptuous.All( - voluptuous.Any(*six.string_types), - voluptuous.Length(min=1)), - voluptuous.Required(self.STATE): - voluptuous.Any(*[NodeState.POWERON.value, - NodeState.POWEROFF.value]), - }) + return { + 'type': 'object', + 'properties': { + 'resource_id': { + 'type': 'string', + "minlength": 1 + }, + 'state': { + 'type': 'string', + 'enum': [NodeState.POWERON.value, + NodeState.POWEROFF.value] + } + }, + 'required': ['resource_id', 'state'], + 'additionalProperties': False, + } + + def validate_parameters(self): + try: + jsonschema.validate(self.input_parameters, self.schema) + return True + except jsonschema.ValidationError as e: + raise e @property def node_uuid(self): diff --git a/watcher/tests/applier/actions/test_change_node_power_state.py b/watcher/tests/applier/actions/test_change_node_power_state.py index bca0f21bb..ca6099595 100644 --- a/watcher/tests/applier/actions/test_change_node_power_state.py +++ b/watcher/tests/applier/actions/test_change_node_power_state.py @@ -15,8 +15,8 @@ from __future__ import unicode_literals +import jsonschema import mock -import voluptuous from watcher.applier.actions import base as baction from watcher.applier.actions import change_node_power_state @@ -59,34 +59,21 @@ class TestChangeNodePowerState(base.TestCase): self.action.input_parameters = { baction.BaseAction.RESOURCE_ID: COMPUTE_NODE, self.action.STATE: 'error'} - exc = self.assertRaises( - voluptuous.Invalid, self.action.validate_parameters) - self.assertEqual( - [(['state'], voluptuous.ScalarInvalid)], - [([str(p) for p in e.path], type(e)) for e in exc.errors]) + self.assertRaises(jsonschema.ValidationError, + self.action.validate_parameters) def test_parameters_resource_id_empty(self, mock_ironic, mock_nova): self.action.input_parameters = { self.action.STATE: change_node_power_state.NodeState.POWERON.value, } - exc = self.assertRaises( - voluptuous.Invalid, self.action.validate_parameters) - self.assertEqual( - [(['resource_id'], voluptuous.RequiredFieldInvalid)], - [([str(p) for p in e.path], type(e)) for e in exc.errors]) + self.assertRaises(jsonschema.ValidationError, + self.action.validate_parameters) def test_parameters_applies_add_extra(self, mock_ironic, mock_nova): self.action.input_parameters = {"extra": "failed"} - exc = self.assertRaises( - voluptuous.Invalid, self.action.validate_parameters) - self.assertEqual( - sorted([(['resource_id'], voluptuous.RequiredFieldInvalid), - (['state'], voluptuous.RequiredFieldInvalid), - (['extra'], voluptuous.Invalid)], - key=lambda x: str(x[0])), - sorted([([str(p) for p in e.path], type(e)) for e in exc.errors], - key=lambda x: str(x[0]))) + self.assertRaises(jsonschema.ValidationError, + self.action.validate_parameters) def test_change_service_state_pre_condition(self, mock_ironic, mock_nova): try: