Using the YAQL function "difference" leads to the "unhashatable type: dict" error

Bug #1772864 reported by Renat Akhmerov
6
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Mistral
Fix Released
Medium
Unassigned

Bug Description

Running the following example:

---
version: '2.0'

test.yaql_diff:
  output:
    result: <% $.diff %>

  task-defaults:
    on-error:
      - fail

  tasks:
    prepare_data:
      publish:
        old:
          - a: 1
          - b: 2
          - c: 3
        new:
          - b1: 11
          - c: 3
          - d: 4
      on-success:
        - process_data

    process_data:
      publish:
        diff: <% let(new => $.new, old => $.old) -> $new.toSet().difference($old.toSet()) %>

leads to:

test.yaql_diff (c8812e1b-7326-4367-a5de-7ebc3f9db792) [state=ERROR, state_info=Failed to handle action completion [error=Can not evaluate YAQL expression [expression=let(new => $.new, old => $.old) -> $new.toSet().difference($old.toSet()), error=unhashable type: 'dict', data={}], wf=test.yaql_diff, task=process_data, action=std.noop]:
Traceback (most recent call last):
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/yaql_expression.py", line 50, in evaluate
    context=expression_utils.get_yaql_context(data_context)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 168, in evaluate
    return self(utils.NO_VALUE, context, self.engine)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 156, in __call__
    return super(Statement, self).__call__(receiver, context, engine)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 37, in __call__
    return context(self.name, engine, receiver, context)(*self.args)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/contexts.py", line 65, in <lambda>
    data_context, use_convention, function_filter)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 49, in call
    name, all_overloads, engine, receiver, data_context, args, kwargs)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 117, in choose_overload
    args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 117, in <genexpr>
    args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 113, in <lambda>
    and not isinstance(arg, expressions.Constant))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 37, in __call__
    return context(self.name, engine, receiver, context)(*self.args)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/contexts.py", line 65, in <lambda>
    data_context, use_convention, function_filter)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 51, in call
    result = delegate()
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 142, in <lambda>
    return lambda: delegate()
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/specs.py", line 346, in func
    six.iteritems(keyword_args)))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/standard_library/system.py", line 230, in send_context
    return right(left)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/yaqltypes.py", line 293, in func
    engine, args, kwargs)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/yaqltypes.py", line 260, in _call
    result = value(receiver, context, engine)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 37, in __call__
    return context(self.name, engine, receiver, context)(*self.args)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/contexts.py", line 65, in <lambda>
    data_context, use_convention, function_filter)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 49, in call
    name, all_overloads, engine, receiver, data_context, args, kwargs)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 117, in choose_overload
    args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 117, in <genexpr>
    args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 113, in <lambda>
    and not isinstance(arg, expressions.Constant))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 37, in __call__
    return context(self.name, engine, receiver, context)(*self.args)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/contexts.py", line 65, in <lambda>
    data_context, use_convention, function_filter)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 51, in call
    result = delegate()
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 142, in <lambda>
    return lambda: delegate()
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/specs.py", line 346, in func
    six.iteritems(keyword_args)))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/standard_library/system.py", line 63, in op_dot
    return expr(receiver)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/yaqltypes.py", line 293, in func
    engine, args, kwargs)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/yaqltypes.py", line 260, in _call
    result = value(receiver, context, engine)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 37, in __call__
    return context(self.name, engine, receiver, context)(*self.args)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/contexts.py", line 65, in <lambda>
    data_context, use_convention, function_filter)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 51, in call
    result = delegate()
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 142, in <lambda>
    return lambda: delegate()
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/specs.py", line 346, in func
    six.iteritems(keyword_args)))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/standard_library/collections.py", line 1103, in to_set
    return frozenset(collection)
TypeError: unhashable type: 'dict'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/engine/task_handler.py", line 110, in _on_action_complete
    task.on_action_complete(action_ex)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/osprofiler/profiler.py", line 158, in wrapper
    result = f(*args, **kwargs)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/engine/tasks.py", line 381, in on_action_complete
    self.complete(state, state_info)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/osprofiler/profiler.py", line 158, in wrapper
    result = f(*args, **kwargs)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/engine/tasks.py", line 221, in complete
    data_flow.publish_variables(self.task_ex, self.task_spec)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/workflow/data_flow.py", line 215, in publish_variables
    task_ex.published = expr.evaluate_recursively(branch_vars, expr_ctx)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/__init__.py", line 100, in evaluate_recursively
    data[key] = _evaluate_item(data[key], context)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/__init__.py", line 79, in _evaluate_item
    return evaluate(item, context)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/__init__.py", line 71, in evaluate
    return evaluator.evaluate(expression, context)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/yaql_expression.py", line 119, in evaluate
    cls).evaluate(trim_expr, data_context)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/yaql_expression.py", line 73, in evaluate
    ", data=%s]" % (expression, str(e), data_context)
mistral.exceptions.YaqlEvaluationException: Can not evaluate YAQL expression [expression=let(new => $.new, old => $.old) -> $new.toSet().difference($old.toSet()), error=unhashable type: 'dict', data={}]
, output={'old': [{'a': 1}, {'b': 2}, {'c': 3}], 'new': [{'b1': 11}, {'c': 3}, {'d': 4}], 'result': 'Failed to handle action completion [error=Can not evaluate YAQL expression [expression=let(new => $.new, old => $.old) -> $new.toSet().difference($old.toSet()), error=unhashable type: \'dict\', data={}], wf=test.yaql_diff, task=process_data, action=std.noop]:\nTraceback (most recent call last):\n File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/yaql_expression.py", line 50, in evaluate\n context=expression_utils.get_yaql_context(data_context)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 168, in evaluate\n return self(utils.NO_VALUE, context, self.engine)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 156, in __call__\n return super(Statement, self).__call__(receiver, context, engine)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 37, in __call__\n return context(self.name, engine, receiver, context)(*self.args)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/contexts.py", line 65, in <lambda>\n data_context, use_convention, function_filter)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 49, in call\n name, all_overloads, engine, receiver, data_context, args, kwargs)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 117, in choose_overload\n args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 117, in <genexpr>\n args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 113, in <lambda>\n and not isinstance(arg, expressions.Constant))\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 37, in __call__\n return context(self.name, engine, receiver, context)(*self.args)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/contexts.py", line 65, in <lambda>\n data_context, use_convention, function_filter)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 51, in call\n result = delegate()\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 142, in <lambda>\n return lambda: delegate()\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/specs.py", line 346, in func\n six.iteritems(keyword_args)))\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/standard_library/system.py", line 230, in send_context\n return right(left)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/yaqltypes.py", line 293, in func\n engine, args, kwargs)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/yaqltypes.py", line 260, in _call\n result = value(receiver, context, engine)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 37, in __call__\n return context(self.name, engine, receiver, context)(*self.args)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/contexts.py", line 65, in <lambda>\n data_context, use_convention, function_filter)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 49, in call\n name, all_overloads, engine, receiver, data_context, args, kwargs)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 117, in choose_overload\n args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 117, in <genexpr>\n args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 113, in <lambda>\n and not isinstance(arg, expressions.Constant))\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 37, in __call__\n return context(self.name, engine, receiver, context)(*self.args)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/contexts.py", line 65, in <lambda>\n data_context, use_convention, function_filter)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 51, in call\n result = delegate()\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 142, in <lambda>\n return lambda: delegate()\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/specs.py", line 346, in func\n six.iteritems(keyword_args)))\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/standard_library/system.py", line 63, in op_dot\n return expr(receiver)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/yaqltypes.py", line 293, in func\n engine, args, kwargs)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/yaqltypes.py", line 260, in _call\n result = value(receiver, context, engine)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 37, in __call__\n return context(self.name, engine, receiver, context)(*self.args)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/contexts.py", line 65, in <lambda>\n data_context, use_convention, function_filter)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 51, in call\n result = delegate()\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 142, in <lambda>\n return lambda: delegate()\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/specs.py", line 346, in func\n six.iteritems(keyword_args)))\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/standard_library/collections.py", line 1103, in to_set\n return frozenset(collection)\nTypeError: unhashable type: \'dict\'\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/engine/task_handler.py", line 110, in _on_action_complete\n task.on_action_complete(action_ex)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/osprofiler/profiler.py", line 158, in wrapper\n result = f(*args, **kwargs)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/engine/tasks.py", line 381, in on_action_complete\n self.complete(state, state_info)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/osprofiler/profiler.py", line 158, in wrapper\n result = f(*args, **kwargs)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/engine/tasks.py", line 221, in complete\n data_flow.publish_variables(self.task_ex, self.task_spec)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/workflow/data_flow.py", line 215, in publish_variables\n task_ex.published = expr.evaluate_recursively(branch_vars, expr_ctx)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/__init__.py", line 100, in evaluate_recursively\n data[key] = _evaluate_item(data[key], context)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/__init__.py", line 79, in _evaluate_item\n return evaluate(item, context)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/__init__.py", line 71, in evaluate\n return evaluator.evaluate(expression, context)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/yaql_expression.py", line 119, in evaluate\n cls).evaluate(trim_expr, data_context)\n File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/yaql_expression.py", line 73, in evaluate\n ", data=%s]" % (expression, str(e), data_context)\nmistral.exceptions.YaqlEvaluationException: Can not evaluate YAQL expression [expression=let(new => $.new, old => $.old) -> $new.toSet().difference($old.toSet()), error=unhashable type: \'dict\', data={}]\n'}]
 prepare_data [id=667a1e32-7f51-4af3-9f43-dd324f6cf6b2, state=SUCCESS, state_info=None, processed=True, published={'old': [{'a': 1}, {'b': 2}, {'c': 3}], 'new': [{'b1': 11}, {'c': 3}, {'d': 4}]}]
  std.noop [id=2f271f0f-27b5-4eac-a616-040b048f8d73, state=SUCCESS, state_info=None, accepted=True, output={'result': None}]
 process_data [id=399c7374-8987-4dfc-bcc0-e7d0c4d979fc, state=ERROR, state_info=Failed to handle action completion [error=Can not evaluate YAQL expression [expression=let(new => $.new, old => $.old) -> $new.toSet().difference($old.toSet()), error=unhashable type: 'dict', data={}], wf=test.yaql_diff, task=process_data, action=std.noop]:
Traceback (most recent call last):
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/yaql_expression.py", line 50, in evaluate
    context=expression_utils.get_yaql_context(data_context)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 168, in evaluate
    return self(utils.NO_VALUE, context, self.engine)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 156, in __call__
    return super(Statement, self).__call__(receiver, context, engine)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 37, in __call__
    return context(self.name, engine, receiver, context)(*self.args)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/contexts.py", line 65, in <lambda>
    data_context, use_convention, function_filter)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 49, in call
    name, all_overloads, engine, receiver, data_context, args, kwargs)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 117, in choose_overload
    args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 117, in <genexpr>
    args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 113, in <lambda>
    and not isinstance(arg, expressions.Constant))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 37, in __call__
    return context(self.name, engine, receiver, context)(*self.args)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/contexts.py", line 65, in <lambda>
    data_context, use_convention, function_filter)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 51, in call
    result = delegate()
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 142, in <lambda>
    return lambda: delegate()
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/specs.py", line 346, in func
    six.iteritems(keyword_args)))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/standard_library/system.py", line 230, in send_context
    return right(left)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/yaqltypes.py", line 293, in func
    engine, args, kwargs)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/yaqltypes.py", line 260, in _call
    result = value(receiver, context, engine)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 37, in __call__
    return context(self.name, engine, receiver, context)(*self.args)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/contexts.py", line 65, in <lambda>
    data_context, use_convention, function_filter)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 49, in call
    name, all_overloads, engine, receiver, data_context, args, kwargs)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 117, in choose_overload
    args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 117, in <genexpr>
    args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 113, in <lambda>
    and not isinstance(arg, expressions.Constant))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 37, in __call__
    return context(self.name, engine, receiver, context)(*self.args)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/contexts.py", line 65, in <lambda>
    data_context, use_convention, function_filter)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 51, in call
    result = delegate()
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 142, in <lambda>
    return lambda: delegate()
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/specs.py", line 346, in func
    six.iteritems(keyword_args)))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/standard_library/system.py", line 63, in op_dot
    return expr(receiver)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/yaqltypes.py", line 293, in func
    engine, args, kwargs)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/yaqltypes.py", line 260, in _call
    result = value(receiver, context, engine)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/expressions.py", line 37, in __call__
    return context(self.name, engine, receiver, context)(*self.args)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/contexts.py", line 65, in <lambda>
    data_context, use_convention, function_filter)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 51, in call
    result = delegate()
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/runner.py", line 142, in <lambda>
    return lambda: delegate()
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/language/specs.py", line 346, in func
    six.iteritems(keyword_args)))
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/yaql/standard_library/collections.py", line 1103, in to_set
    return frozenset(collection)
TypeError: unhashable type: 'dict'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/engine/task_handler.py", line 110, in _on_action_complete
    task.on_action_complete(action_ex)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/osprofiler/profiler.py", line 158, in wrapper
    result = f(*args, **kwargs)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/engine/tasks.py", line 381, in on_action_complete
    self.complete(state, state_info)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/.tox/py35/lib/python3.5/site-packages/osprofiler/profiler.py", line 158, in wrapper
    result = f(*args, **kwargs)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/engine/tasks.py", line 221, in complete
    data_flow.publish_variables(self.task_ex, self.task_spec)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/workflow/data_flow.py", line 215, in publish_variables
    task_ex.published = expr.evaluate_recursively(branch_vars, expr_ctx)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/__init__.py", line 100, in evaluate_recursively
    data[key] = _evaluate_item(data[key], context)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/__init__.py", line 79, in _evaluate_item
    return evaluate(item, context)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/__init__.py", line 71, in evaluate
    return evaluator.evaluate(expression, context)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/yaql_expression.py", line 119, in evaluate
    cls).evaluate(trim_expr, data_context)
  File "/Users/renat/workspace/openstack/mistral_group/mistral/mistral/expressions/yaql_expression.py", line 73, in evaluate
    ", data=%s]" % (expression, str(e), data_context)
mistral.exceptions.YaqlEvaluationException: Can not evaluate YAQL expression [expression=let(new => $.new, old => $.old) -> $new.toSet().difference($old.toSet()), error=unhashable type: 'dict', data={}]
, processed=False, published={}]
  std.noop [id=46757c39-863e-421b-acb1-98b38d43efd0, state=SUCCESS, state_info=None, accepted=True, output={'result': None}]

Changed in mistral:
milestone: none → rocky-2
importance: Undecided → Medium
status: New → Confirmed
Revision history for this message
Renat Akhmerov (rakhmerov) wrote :

Ok, the problem is in toSet(). We can't add dicts to a set.

Revision history for this message
Renat Akhmerov (rakhmerov) wrote :

But it somehow works in YAQL CLI v 1.1.3. So the problem is in Mistral.

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Related fix proposed to mistral (master)

Related fix proposed to branch: master
Review: https://review.openstack.org/570712

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Change abandoned on mistral (master)

Change abandoned by Renat Akhmerov (<email address hidden>) on branch: master
Review: https://review.openstack.org/570712
Reason: This change will be part of https://review.openstack.org/#/c/477816/

Revision history for this message
OpenStack Infra (hudson-openstack) wrote :

Change abandoned by Renat Akhmerov (<email address hidden>) on branch: master
Review: https://review.openstack.org/571091
Reason: Will be part of https://review.openstack.org/#/c/477816/

Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix merged to mistral (master)

Reviewed: https://review.openstack.org/477816
Committed: https://git.openstack.org/cgit/openstack/mistral/commit/?id=fe0d4410824f627017ef3202398ce9bd6230f9d1
Submitter: Zuul
Branch: master

commit fe0d4410824f627017ef3202398ce9bd6230f9d1
Author: Xavier Hardy <email address hidden>
Date: Tue Jun 27 10:23:01 2017 +0200

    Add YAQL engine options

    Change-Id: I2e2c85c8be90ee62c8f37f002e21098f17ba6f5c
    Closes-Bug: #1700572
    Closes-Bug: #1772864

Changed in mistral:
status: Confirmed → Fix Released
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix included in openstack/mistral 7.0.0.0b2

This issue was fixed in the openstack/mistral 7.0.0.0b2 development milestone.

To post a comment you must log in.
This report contains Public information  
Everyone can see this information.

Other bug subscribers

Remote bug watches

Bug watches keep track of this bug in other bug trackers.