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: