Add validation on 'with-items' input
Partially implements blueprint mistral-with-items Change-Id: I5c2446133ab6447ffd8f9c6336b11cc8fb340804
This commit is contained in:
parent
6472c74a04
commit
3202940f1a
@ -89,6 +89,10 @@ class WorkflowInputException(MistralException):
|
|||||||
http_code = 400
|
http_code = 400
|
||||||
|
|
||||||
|
|
||||||
|
class InputException(MistralException):
|
||||||
|
http_code = 400
|
||||||
|
|
||||||
|
|
||||||
class ApplicationContextNotFoundException(MistralException):
|
class ApplicationContextNotFoundException(MistralException):
|
||||||
http_code = 400
|
http_code = 400
|
||||||
message = "Application context not found"
|
message = "Application context not found"
|
||||||
|
@ -15,6 +15,7 @@
|
|||||||
# limitations under the License.
|
# limitations under the License.
|
||||||
|
|
||||||
from mistral.db.v2.sqlalchemy import models
|
from mistral.db.v2.sqlalchemy import models
|
||||||
|
from mistral import exceptions as exc
|
||||||
from mistral.tests import base
|
from mistral.tests import base
|
||||||
from mistral.workbook.v2 import tasks
|
from mistral.workbook.v2 import tasks
|
||||||
from mistral.workflow import utils
|
from mistral.workflow import utils
|
||||||
@ -115,3 +116,40 @@ class WithItemsCalculationsTest(base.BaseTest):
|
|||||||
],
|
],
|
||||||
action_input_collection
|
action_input_collection
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def test_calculate_input_wrong_array_length(self):
|
||||||
|
with_items_input = {
|
||||||
|
'name_info': [
|
||||||
|
{'name': 'John'},
|
||||||
|
{'name': 'Ivan'},
|
||||||
|
{'name': 'Mistral'}
|
||||||
|
],
|
||||||
|
'server_info': [
|
||||||
|
'server1',
|
||||||
|
'server2'
|
||||||
|
]
|
||||||
|
}
|
||||||
|
exception = self.assertRaises(
|
||||||
|
exc.InputException,
|
||||||
|
with_items.calc_input,
|
||||||
|
with_items_input
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertIn("the same length", exception.message)
|
||||||
|
|
||||||
|
def test_calculate_input_not_list(self):
|
||||||
|
with_items_input = {
|
||||||
|
'name_info': [
|
||||||
|
{'name': 'John'},
|
||||||
|
{'name': 'Ivan'},
|
||||||
|
{'name': 'Mistral'}
|
||||||
|
],
|
||||||
|
'server_info': 'some_string'
|
||||||
|
}
|
||||||
|
exception = self.assertRaises(
|
||||||
|
exc.InputException,
|
||||||
|
with_items.calc_input,
|
||||||
|
with_items_input
|
||||||
|
)
|
||||||
|
|
||||||
|
self.assertIn("List type", exception.message)
|
||||||
|
@ -14,6 +14,7 @@
|
|||||||
|
|
||||||
import copy
|
import copy
|
||||||
|
|
||||||
|
from mistral import exceptions as exc
|
||||||
from mistral import expressions as expr
|
from mistral import expressions as expr
|
||||||
|
|
||||||
|
|
||||||
@ -112,6 +113,8 @@ def calc_input(with_items_input):
|
|||||||
:param with_items_input: Dict containing mapped variables to their arrays.
|
:param with_items_input: Dict containing mapped variables to their arrays.
|
||||||
:return: list containing dicts of each action input.
|
:return: list containing dicts of each action input.
|
||||||
"""
|
"""
|
||||||
|
validate_input(with_items_input)
|
||||||
|
|
||||||
action_input_collection = []
|
action_input_collection = []
|
||||||
|
|
||||||
for key, value in with_items_input.items():
|
for key, value in with_items_input.items():
|
||||||
@ -126,6 +129,22 @@ def calc_input(with_items_input):
|
|||||||
return action_input_collection
|
return action_input_collection
|
||||||
|
|
||||||
|
|
||||||
|
def validate_input(with_items_input):
|
||||||
|
# Take only mapped values and check them.
|
||||||
|
values = with_items_input.values()
|
||||||
|
|
||||||
|
if not all([isinstance(v, list) for v in values]):
|
||||||
|
raise exc.InputException(
|
||||||
|
"Wrong input format for: %s. List type is"
|
||||||
|
" expected for each value." % with_items_input)
|
||||||
|
|
||||||
|
required_len = len(values[0])
|
||||||
|
if not all(len(v) == required_len for v in values):
|
||||||
|
raise exc.InputException(
|
||||||
|
"Wrong input format for: %s. All arrays must"
|
||||||
|
" have the same length." % with_items_input)
|
||||||
|
|
||||||
|
|
||||||
def _get_output_key(task_spec):
|
def _get_output_key(task_spec):
|
||||||
return (task_spec.get_publish().keys()[0]
|
return (task_spec.get_publish().keys()[0]
|
||||||
if task_spec.get_publish() else None)
|
if task_spec.get_publish() else None)
|
||||||
|
Loading…
Reference in New Issue
Block a user