murano fails on heat deployment with "Dictionary contract cannot have more than one expression key"

Bug #1528238 reported by Tomer Shtilman
12
This bug affects 1 person
Affects Status Importance Assigned to Milestone
Murano
Invalid
High
Stan Lagun
Liberty
Fix Released
High
Stan Lagun
Mitaka
Invalid
High
Stan Lagun

Bug Description

Hi

We are using the following heat template
And its look like there is a map created in the outer level for inner level objects
In this case its look like these two “other_resource” are trying to be inserted into the same map as keys.

heat_template_version: '2014-10-16'
outputs:
  fe-samples-per-vm:
    value: { get_attr: [other_resource, outputs, output_1]}
  fe_alarm-per-vm:
    value: { get_attr: [other_resource, outputs, output_2]}
parameters:
  flavor:
    constraints:
    - {custom_constraint: nova.flavor}
    default: LARGE_1
    type: string
  image:
    constraints:
    - {custom_constraint: glance.image}
    default: centos-6-web-v1
    type: string
  network:
    constraints:
    - {custom_constraint: neutron.network}
    default: PUBLIC_NET_NODE_A
    type: string
resources:
  server:
    properties:
      flavor: {get_param: flavor}
      image: {get_param: image}
      name: server1
      networks:
      - network: {get_param: network}
    type: OS::Nova::Server

murano is failing on "Dictionary contract cannot have more than one expression key”"

stack trace:

Traceback (most recent call last):
  File \"/usr/lib/python2.7/site-packages/murano/common/engine.py\", line 166, in _execute
    obj = executor.load(self.model)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/executor.py\", line 190, in load
    result = self._object_store.load(data.get(constants.DM_OBJECTS), None)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/object_store.py\", line 92, in load
    obj = factory(init_context, **value)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/murano_class.py\", line 240, in initializer
    obj.initialize(init_context, object_store, params)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/murano_object.py\", line 120, in initialize
    self.set_property(property_name, property_value)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/murano_object.py\", line 217, in set_property
    self.real_this, default=default)))
  File \"/usr/lib/python2.7/site-packages/murano/dsl/typespec.py\", line 74, in validate
    return super(PropertySpec, self).validate(*args, **kwargs)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/typespec.py\", line 51, in validate
    this, owner, default)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/type_scheme.py\", line 316, in __call__
    return self._map(data, self._spec, context, '')
  File \"/usr/lib/python2.7/site-packages/murano/dsl/type_scheme.py\", line 303, in _map
    return self._map_list(data, spec, child_context, path)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/type_scheme.py\", line 281, in _map_list
    return tuple(map_func())
  File \"/usr/lib/python2.7/site-packages/murano/dsl/type_scheme.py\", line 279, in map_func
    item, spec_item, context, '{0}[{1}]'.format(path, index))
  File \"/usr/lib/python2.7/site-packages/murano/dsl/type_scheme.py\", line 296, in _map
    return spec(context=child_context)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/yaql_expression.py\", line 82, in __call__
    return self._parsed_expression.evaluate(context=context)
  File \"/usr/lib/python2.7/site-packages/yaql/language/expressions.py\", line 165, in evaluate
    return self(utils.NO_VALUE, context, self.engine)
  File \"/usr/lib/python2.7/site-packages/yaql/language/expressions.py\", line 156, in __call__
    return super(Statement, self).__call__(receiver, context, engine)
  File \"/usr/lib/python2.7/site-packages/yaql/language/expressions.py\", line 37, in __call__
    return context(self.name, engine, receiver, context)(*self.args)
  File \"/usr/lib/python2.7/site-packages/yaql/language/contexts.py\", line 65, in <lambda>
    data_context, use_convention, function_filter)
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 49, in call
    name, all_overloads, engine, receiver, data_context, args, kwargs)
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 117, in choose_overload
    args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 117, in <genexpr>
    args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 113, in <lambda>
    and not isinstance(arg, expressions.Constant))
  File \"/usr/lib/python2.7/site-packages/yaql/language/expressions.py\", line 37, in __call__
    return context(self.name, engine, receiver, context)(*self.args)
  File \"/usr/lib/python2.7/site-packages/yaql/language/contexts.py\", line 65, in <lambda>
    data_context, use_convention, function_filter)
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 49, in call
    name, all_overloads, engine, receiver, data_context, args, kwargs)
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 117, in choose_overload
    args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 117, in <genexpr>
    args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 113, in <lambda>
    and not isinstance(arg, expressions.Constant))
  File \"/usr/lib/python2.7/site-packages/yaql/language/expressions.py\", line 37, in __call__
    return context(self.name, engine, receiver, context)(*self.args)
  File \"/usr/lib/python2.7/site-packages/yaql/language/contexts.py\", line 65, in <lambda>
    data_context, use_convention, function_filter)
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 49, in call
    name, all_overloads, engine, receiver, data_context, args, kwargs)
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 117, in choose_overload
    args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 117, in <genexpr>
    args = tuple(arg_evaluator(i, arg) for i, arg in enumerate(args))
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 113, in <lambda>
    and not isinstance(arg, expressions.Constant))
  File \"/usr/lib/python2.7/site-packages/yaql/language/expressions.py\", line 37, in __call__
    return context(self.name, engine, receiver, context)(*self.args)
  File \"/usr/lib/python2.7/site-packages/yaql/language/contexts.py\", line 65, in <lambda>
    data_context, use_convention, function_filter)
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 51, in call
    result = delegate()
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 142, in <lambda>
    return lambda: delegate()
  File \"/usr/lib/python2.7/site-packages/yaql/language/specs.py\", line 341, in func
    six.iteritems(keyword_args)))
  File \"/usr/lib/python2.7/site-packages/yaql/standard_library/system.py\", line 34, in op_dot
    return expr(receiver)
  File \"/usr/lib/python2.7/site-packages/yaql/language/yaqltypes.py\", line 236, in func
    engine, args, kwargs)
  File \"/usr/lib/python2.7/site-packages/yaql/language/yaqltypes.py\", line 205, in _call
    result = value(receiver, context, engine)
  File \"/usr/lib/python2.7/site-packages/yaql/language/expressions.py\", line 37, in __call__
    return context(self.name, engine, receiver, context)(*self.args)
  File \"/usr/lib/python2.7/site-packages/yaql/language/contexts.py\", line 65, in <lambda>
    data_context, use_convention, function_filter)
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 51, in call
    result = delegate()
  File \"/usr/lib/python2.7/site-packages/yaql/language/runner.py\", line 142, in <lambda>
    return lambda: delegate()
  File \"/usr/lib/python2.7/site-packages/yaql/language/specs.py\", line 341, in func
    six.iteritems(keyword_args)))
  File \"/usr/lib/python2.7/site-packages/murano/dsl/type_scheme.py\", line 177, in class_
    value, owner, root_context, defaults=default)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/object_store.py\", line 92, in load
    obj = factory(init_context, **value)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/murano_class.py\", line 240, in initializer
    obj.initialize(init_context, object_store, params)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/murano_object.py\", line 120, in initialize
    self.set_property(property_name, property_value)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/murano_object.py\", line 217, in set_property
    self.real_this, default=default)))
  File \"/usr/lib/python2.7/site-packages/murano/dsl/typespec.py\", line 74, in validate
    return super(PropertySpec, self).validate(*args, **kwargs)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/typespec.py\", line 51, in validate
    this, owner, default)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/type_scheme.py\", line 316, in __call__
    return self._map(data, self._spec, context, '')
  File \"/usr/lib/python2.7/site-packages/murano/dsl/type_scheme.py\", line 301, in _map
    return self._map_dict(data, spec, child_context, path)
  File \"/usr/lib/python2.7/site-packages/murano/dsl/type_scheme.py\", line 226, in _map_dict
    'Dictionary contract '
DslContractSyntaxError: Dictionary contract cannot have more than one expression key

description: updated
Changed in murano:
milestone: none → mitaka-2
Stan Lagun (slagun)
Changed in murano:
importance: Undecided → High
assignee: nobody → Stan Lagun (slagun)
Stan Lagun (slagun)
Changed in murano:
status: New → In Progress
Stan Lagun (slagun)
no longer affects: murano/liberty
Changed in murano:
milestone: mitaka-2 → 1.0.2
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix proposed to murano (stable/liberty)

Fix proposed to branch: stable/liberty
Review: https://review.openstack.org/260209

Revision history for this message
Stan Lagun (slagun) wrote :

Bug affects Liberty only

Changed in murano:
milestone: 1.0.2 → 1.0.3
Revision history for this message
OpenStack Infra (hudson-openstack) wrote : Fix merged to murano (stable/liberty)

Reviewed: https://review.openstack.org/260209
Committed: https://git.openstack.org/cgit/openstack/murano/commit/?id=4912ccf82ad9545c002d42e0143c03776e25cbd2
Submitter: Jenkins
Branch: stable/liberty

commit 4912ccf82ad9545c002d42e0143c03776e25cbd2
Author: Stan Lagun <email address hidden>
Date: Mon Dec 21 23:35:27 2015 +0300

    Dashes in HOT params caused confusion with expressions

    MuranoPL class generated from HOT template hasn't used
    quote mark for parameter/output names in contracts.
    In result if there was a dash in parameter/output name it
    caused entire string to be interpreted as YAQL expression
    upon load.

    Change-Id: I64cebc1706effbf32d45e014a861699a8bf6984c
    Closes-Bug: #1528238

Revision history for this message
Doug Hellmann (doug-hellmann) wrote : Fix included in openstack/murano 1.0.3

This issue was fixed in the openstack/murano 1.0.3 release.

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

This issue was fixed in the openstack/murano 1.0.3 release.

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.