)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"32ee3e813b20c91120cb0ffaf6c660562ea4aae6","unresolved":false,"context_lines":[{"line_number":29,"context_line":"If one of the extra arguments does not match with a key or a valid"},{"line_number":30,"context_line":"index, an empty string is returned."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"As a bonus track the Fn::GetAttr support was removed from the HOT"},{"line_number":33,"context_line":"templates."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Change-Id: Ia7361fbd10611cc796bd90e781f4ae387c970dbd"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"AAAAUH%2F9tKM%3D","line":32,"updated":"2014-02-04 19:59:08.000000000","message":"It doesn\u0027t really matter now, but for future reference this probably belonged in a separate patch.","commit_id":"d246508752829f17d81eccc234252207acf2b7eb"}],"doc/source/template_guide/hot_spec.rst":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"c3313c6b6336ec97a3efe18cbc62d8c935fd5c45","unresolved":false,"context_lines":[{"line_number":479,"context_line":""},{"line_number":480,"context_line":"::"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"  get_attr: [ \u003cresource ID\u003e, \u003cattribute name\u003e, \u003cattribute name\u003e, ... ]"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"resource ID"},{"line_number":485,"context_line":"    This parameter specifies the resource for which the attributes shall be"}],"source_content_type":"text/x-rst","patch_set":6,"id":"AAAAUH%2F%2BzgU%3D","line":482,"updated":"2014-01-21 22:39:33.000000000","message":"get_attr: [ \u003cresource ID\u003e, \u003cattribute name\u003e, \u003ckey 1\u003e, \u003ckey 2\u003e... ]","commit_id":"c747db9aa21acb273dbb503b0353a8aaa1b9131b"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"a8df32cf863ec41ac4bcbd0e86971f945de67970","unresolved":false,"context_lines":[{"line_number":479,"context_line":""},{"line_number":480,"context_line":"::"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"  get_attr: [ \u003cresource ID\u003e, \u003cattribute name\u003e, \u003cattribute name\u003e, ... ]"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"resource ID"},{"line_number":485,"context_line":"    This parameter specifies the resource for which the attributes shall be"}],"source_content_type":"text/x-rst","patch_set":6,"id":"AAAAUH%2F%2By5s%3D","line":482,"in_reply_to":"AAAAUH%2F%2BzgU%3D","updated":"2014-01-22 02:52:13.000000000","message":"Done","commit_id":"c747db9aa21acb273dbb503b0353a8aaa1b9131b"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"c3313c6b6336ec97a3efe18cbc62d8c935fd5c45","unresolved":false,"context_lines":[{"line_number":488,"context_line":"attribute name"},{"line_number":489,"context_line":"    The first attribute name is required and it specifies the attribute to be"},{"line_number":490,"context_line":"    resolved. The additional ones are optional, and they allow to navigate up"},{"line_number":491,"context_line":"    the attribute tree in order to find the nested matching names given."},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"Some examples of how to use the get_attr function are shown below:"},{"line_number":494,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"AAAAUH%2F%2BzgQ%3D","line":491,"updated":"2014-01-21 22:39:33.000000000","message":"How about:\n\nThe attribute name is required as it specifies the attribute to be resolved. If the attribute returns complex data structure such as a list or a map, then subsequent keys can be specified which navigate the data structure to return the desired value.","commit_id":"c747db9aa21acb273dbb503b0353a8aaa1b9131b"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"a8df32cf863ec41ac4bcbd0e86971f945de67970","unresolved":false,"context_lines":[{"line_number":488,"context_line":"attribute name"},{"line_number":489,"context_line":"    The first attribute name is required and it specifies the attribute to be"},{"line_number":490,"context_line":"    resolved. The additional ones are optional, and they allow to navigate up"},{"line_number":491,"context_line":"    the attribute tree in order to find the nested matching names given."},{"line_number":492,"context_line":""},{"line_number":493,"context_line":"Some examples of how to use the get_attr function are shown below:"},{"line_number":494,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"AAAAUH%2F%2By5o%3D","line":491,"in_reply_to":"AAAAUH%2F%2BzgQ%3D","updated":"2014-01-22 02:52:13.000000000","message":"Done","commit_id":"c747db9aa21acb273dbb503b0353a8aaa1b9131b"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"e204736f3331d8043c39b909f17c97839e0b8edf","unresolved":false,"context_lines":[{"line_number":479,"context_line":""},{"line_number":480,"context_line":"::"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"  get_attr: [ \u003cresource ID\u003e, \u003cattribute name\u003e, \u003ckey 1\u003e, \u003ckey 2\u003e... ]"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"resource ID"},{"line_number":485,"context_line":"    This parameter specifies the resource for which the attributes shall be"}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAAUH%2F%2Bv68%3D","line":482,"updated":"2014-01-22 15:36:30.000000000","message":"We should specify that each argument after attribute_name is optional and could be a key or an index.  Maybe like this:\n\n get_attr:\n - \u003cresource ID\u003e\n - \u003cattribute name\u003e\n - \u003ckey/index 1\u003e (optional)\n - \u003ckey/index 2\u003e (optional)\n - ...","commit_id":"b41e0c8fc1c03bdad2b4d97d9275a004ba754bc4"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"4421ca8e0959ffe760fe950e5ca25eb602ff0698","unresolved":false,"context_lines":[{"line_number":479,"context_line":""},{"line_number":480,"context_line":"::"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"  get_attr: [ \u003cresource ID\u003e, \u003cattribute name\u003e, \u003ckey 1\u003e, \u003ckey 2\u003e... ]"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"resource ID"},{"line_number":485,"context_line":"    This parameter specifies the resource for which the attributes shall be"}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAAUH%2F%2BvhY%3D","line":482,"in_reply_to":"AAAAUH%2F%2Bv68%3D","updated":"2014-01-22 16:15:48.000000000","message":"Done","commit_id":"b41e0c8fc1c03bdad2b4d97d9275a004ba754bc4"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"e204736f3331d8043c39b909f17c97839e0b8edf","unresolved":false,"context_lines":[{"line_number":488,"context_line":"attribute name"},{"line_number":489,"context_line":"    The attribute name is required as it specifies the attribute "},{"line_number":490,"context_line":"    to be resolved. If the attribute returns complex data structure"},{"line_number":491,"context_line":"    such as a list or a map, then subsequent keys can be specified"},{"line_number":492,"context_line":"    which navigate the data structure to return the desired value."},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"Some examples of how to use the get_attr function are shown below:"}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAAUH%2F%2Bv54%3D","line":491,"updated":"2014-01-22 15:36:30.000000000","message":"How about: \"subsequent keys or indexes\"","commit_id":"b41e0c8fc1c03bdad2b4d97d9275a004ba754bc4"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"4421ca8e0959ffe760fe950e5ca25eb602ff0698","unresolved":false,"context_lines":[{"line_number":488,"context_line":"attribute name"},{"line_number":489,"context_line":"    The attribute name is required as it specifies the attribute "},{"line_number":490,"context_line":"    to be resolved. If the attribute returns complex data structure"},{"line_number":491,"context_line":"    such as a list or a map, then subsequent keys can be specified"},{"line_number":492,"context_line":"    which navigate the data structure to return the desired value."},{"line_number":493,"context_line":""},{"line_number":494,"context_line":"Some examples of how to use the get_attr function are shown below:"}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAAUH%2F%2BvhU%3D","line":491,"in_reply_to":"AAAAUH%2F%2Bv54%3D","updated":"2014-01-22 16:15:48.000000000","message":"Done","commit_id":"b41e0c8fc1c03bdad2b4d97d9275a004ba754bc4"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"e204736f3331d8043c39b909f17c97839e0b8edf","unresolved":false,"context_lines":[{"line_number":507,"context_line":"    instance_private_ip:"},{"line_number":508,"context_line":"      description: Private IP address of the deployed compute instance"},{"line_number":509,"context_line":"      value: { get_attr: [my_instance, networks, private, 0] }"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"get_resource"},{"line_number":513,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAAUH%2F%2BvoE%3D","line":510,"updated":"2014-01-22 15:36:30.000000000","message":"How about:\n\nIn this example, if the networks attribute contained the following data:\n\n {\"public\": [\"2001:0db8:0000:0000:0000:ff00:0042:8329\", \"1.2.3.4\"],\n  \"private\": [\"10.0.0.1\"]}\n\nthen the value of the get_attr function would resolve to \"10.0.0.1\".","commit_id":"b41e0c8fc1c03bdad2b4d97d9275a004ba754bc4"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"4421ca8e0959ffe760fe950e5ca25eb602ff0698","unresolved":false,"context_lines":[{"line_number":507,"context_line":"    instance_private_ip:"},{"line_number":508,"context_line":"      description: Private IP address of the deployed compute instance"},{"line_number":509,"context_line":"      value: { get_attr: [my_instance, networks, private, 0] }"},{"line_number":510,"context_line":""},{"line_number":511,"context_line":""},{"line_number":512,"context_line":"get_resource"},{"line_number":513,"context_line":"------------"}],"source_content_type":"text/x-rst","patch_set":7,"id":"AAAAUH%2F%2BvhQ%3D","line":510,"in_reply_to":"AAAAUH%2F%2BvoE%3D","updated":"2014-01-22 16:15:48.000000000","message":"Done","commit_id":"b41e0c8fc1c03bdad2b4d97d9275a004ba754bc4"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"97c48f43b88c1f50a85324327094de8abc6d69fc","unresolved":false,"context_lines":[{"line_number":492,"context_line":"    the template (see also :ref:`hot_spec_resources`)."},{"line_number":493,"context_line":"attribute name"},{"line_number":494,"context_line":"    The attribute name is required as it specifies the attribute "},{"line_number":495,"context_line":"    to be resolved. If the attribute returns complex data structure"},{"line_number":496,"context_line":"    such as a list or a map, then subsequent keys or indexes can be specified"},{"line_number":497,"context_line":"    which navigate the data structure to return the desired value."},{"line_number":498,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAAUH%2F%2BMIs%3D","line":495,"updated":"2014-01-29 09:11:15.000000000","message":"Minor correction:\n\nIf the attribute returns a complex data structure ...\n\ni.e. the \u0027a\u0027 before data structure","commit_id":"9c344bf000910f6ca641438aaa14fcac58dc8e09"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"b67b051c0341802892d5eaa8a7466e8a973d77df","unresolved":false,"context_lines":[{"line_number":492,"context_line":"    the template (see also :ref:`hot_spec_resources`)."},{"line_number":493,"context_line":"attribute name"},{"line_number":494,"context_line":"    The attribute name is required as it specifies the attribute "},{"line_number":495,"context_line":"    to be resolved. If the attribute returns complex data structure"},{"line_number":496,"context_line":"    such as a list or a map, then subsequent keys or indexes can be specified"},{"line_number":497,"context_line":"    which navigate the data structure to return the desired value."},{"line_number":498,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAAUH%2F%2BIjg%3D","line":495,"in_reply_to":"AAAAUH%2F%2BKg4%3D","updated":"2014-01-29 20:44:25.000000000","message":"Done","commit_id":"9c344bf000910f6ca641438aaa14fcac58dc8e09"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"dcf9583a3c9988c32549ff34241ab0e47513bd75","unresolved":false,"context_lines":[{"line_number":492,"context_line":"    the template (see also :ref:`hot_spec_resources`)."},{"line_number":493,"context_line":"attribute name"},{"line_number":494,"context_line":"    The attribute name is required as it specifies the attribute "},{"line_number":495,"context_line":"    to be resolved. If the attribute returns complex data structure"},{"line_number":496,"context_line":"    such as a list or a map, then subsequent keys or indexes can be specified"},{"line_number":497,"context_line":"    which navigate the data structure to return the desired value."},{"line_number":498,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"AAAAUH%2F%2BKg4%3D","line":495,"in_reply_to":"AAAAUH%2F%2BMIs%3D","updated":"2014-01-29 15:08:50.000000000","message":"Good catch Thomas. I won\u0027t -1 because of it, but I won\u0027t +2 because it is here either. 1 less piece of churn in the code if we can fix this before merge.","commit_id":"9c344bf000910f6ca641438aaa14fcac58dc8e09"}],"heat/engine/hot.py":[{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"edd26398b227322c73ce4e951e5f16a2c9642ab3","unresolved":false,"context_lines":[{"line_number":204,"context_line":"                        (r.UPDATE, r.IN_PROGRESS),"},{"line_number":205,"context_line":"                        (r.UPDATE, r.COMPLETE)):"},{"line_number":206,"context_line":"                    rsrc_attr \u003d args[1]"},{"line_number":207,"context_line":"                    attr \u003d r.FnGetAtt(rsrc_attr)"},{"line_number":208,"context_line":"                    for inner_attr in args[2:]:"},{"line_number":209,"context_line":"                        if hasattr(attr, str(inner_attr)):"},{"line_number":210,"context_line":"                            attr \u003d getattr(attr, inner_attr)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FD7U%3D","line":207,"updated":"2014-01-17 20:16:07.000000000","message":"I think below this line needs a separate try block, so that there can be a different response for KeyError/IndexError","commit_id":"fea9a79661ed2d30772146b7d68a3a3744082aa2"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"edd26398b227322c73ce4e951e5f16a2c9642ab3","unresolved":false,"context_lines":[{"line_number":211,"context_line":"                        else:"},{"line_number":212,"context_line":"                            attr \u003d attr[inner_attr]"},{"line_number":213,"context_line":"                    return attr"},{"line_number":214,"context_line":"            except (KeyError, AttributeError, TypeError, IndexError):"},{"line_number":215,"context_line":"                raise exception.InvalidTemplateAttribute(resource\u003dresource,"},{"line_number":216,"context_line":"                                                         key\u003dargs[1:])"},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAUH%2F%2FD5w%3D","line":214,"updated":"2014-01-17 20:16:07.000000000","message":"If you look at template.py resolve_select, if the structure doesn\u0027t contain the key or index then \u0027\u0027 is returned. This is because get_attr gets resolved many times before it can return a value, so raising an error when the data doesn\u0027t exist causes a problem.\n\nHere it might be enough to return \u0027\u0027 on KeyError or IndexError.","commit_id":"fea9a79661ed2d30772146b7d68a3a3744082aa2"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"8730caa821d8cbe4d244f4621bb856b1f4c1515d","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                            else:"},{"line_number":192,"context_line":"                                attr \u003d attr[inner_attr]"},{"line_number":193,"context_line":"                        return attr"},{"line_number":194,"context_line":"                    except (KeyError, IndexError, TypeError):"},{"line_number":195,"context_line":"                        return \u0027\u0027"},{"line_number":196,"context_line":"            except (KeyError, IndexError):"},{"line_number":197,"context_line":"                raise exception.InvalidTemplateAttribute(resource\u003dresource,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2BC5c%3D","line":194,"updated":"2014-01-30 18:17:31.000000000","message":"Nothing to -1 over, but personally I would prefer a key Error here as well. You\u0027ve specifically asked for something that doesn\u0027t exist, similar to if you\u0027d asked for a nonexistent attribute. Getting an empty string back doesn\u0027t clearly let you know you\u0027ve referenced the wrong thing.","commit_id":"d246508752829f17d81eccc234252207acf2b7eb"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"3a966cc187f1bd984ca1a8bda4e15a2a4db990b8","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                            else:"},{"line_number":192,"context_line":"                                attr \u003d attr[inner_attr]"},{"line_number":193,"context_line":"                        return attr"},{"line_number":194,"context_line":"                    except (KeyError, IndexError, TypeError):"},{"line_number":195,"context_line":"                        return \u0027\u0027"},{"line_number":196,"context_line":"            except (KeyError, IndexError):"},{"line_number":197,"context_line":"                raise exception.InvalidTemplateAttribute(resource\u003dresource,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2BCZI%3D","line":194,"in_reply_to":"AAAAUH%2F%2BC5c%3D","updated":"2014-01-30 19:13:06.000000000","message":"I followed what Steve suggested in a comment about patch set 1:\n\n[...] get_attr gets resolved many times before it can return a value, so raising an error when the data doesn\u0027t exist causes a problem. Here it might be enough to return \u0027\u0027 on KeyError or IndexError.","commit_id":"d246508752829f17d81eccc234252207acf2b7eb"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"c8d040acfd3cc1fd1697db3fef4fc499ce51bd64","unresolved":false,"context_lines":[{"line_number":191,"context_line":"                            else:"},{"line_number":192,"context_line":"                                attr \u003d attr[inner_attr]"},{"line_number":193,"context_line":"                        return attr"},{"line_number":194,"context_line":"                    except (KeyError, IndexError, TypeError):"},{"line_number":195,"context_line":"                        return \u0027\u0027"},{"line_number":196,"context_line":"            except (KeyError, IndexError):"},{"line_number":197,"context_line":"                raise exception.InvalidTemplateAttribute(resource\u003dresource,"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUH%2F%2BCWc%3D","line":194,"in_reply_to":"AAAAUH%2F%2BCZI%3D","updated":"2014-01-30 19:18:33.000000000","message":"Lol, sorry for any confusion then. I\u0027ll try and read the older patches now and again ;). And he\u0027s probably right in retrospect. My way could cause stack failures on validate prior to creating any resources.","commit_id":"d246508752829f17d81eccc234252207acf2b7eb"}],"heat/tests/generic_resource.py":[{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"790c07bb670a8af44846a7195e47fb4f5a2b947e","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    flat_dict \u003d {\u0027key1\u0027: \u0027val1\u0027, \u0027key2\u0027: \u0027val2\u0027, \u0027key3\u0027: \u0027val3\u0027}"},{"line_number":71,"context_line":"    nested_dict \u003d {\u0027list\u0027: [1, 2, 3],"},{"line_number":72,"context_line":"                   \u0027string\u0027: \u0027abc\u0027,"},{"line_number":73,"context_line":"                   \u0027dict\u0027: {\u0027a\u0027: 1, \u0027b\u0027: 2, \u0027c\u0027: 3}}"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    class AnObject(object):"},{"line_number":76,"context_line":"        def __init__(self, first, second, third):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2Bu%2Fw%3D","line":73,"updated":"2014-01-22 17:32:11.000000000","message":"If you change this line to:\n\n \u0027dict\u0027: {\u0027a\u0027: {\u0027a\u0027: 2}, \u0027b\u0027: 2, \u0027c\u0027: 3}}\n\nThe code will get stuck in an infinite loop when you run the test.  The test should\u0027ve failed because it was looking for 2, but got {\u0027a\u0027: 2} instead.","commit_id":"9928b95473624c73751d301e739e66c475ced083"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"ae21377f27fe26fe014f6ac021aa238a90984d17","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    flat_dict \u003d {\u0027key1\u0027: \u0027val1\u0027, \u0027key2\u0027: \u0027val2\u0027, \u0027key3\u0027: \u0027val3\u0027}"},{"line_number":71,"context_line":"    nested_dict \u003d {\u0027list\u0027: [1, 2, 3],"},{"line_number":72,"context_line":"                   \u0027string\u0027: \u0027abc\u0027,"},{"line_number":73,"context_line":"                   \u0027dict\u0027: {\u0027a\u0027: 1, \u0027b\u0027: 2, \u0027c\u0027: 3}}"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    class AnObject(object):"},{"line_number":76,"context_line":"        def __init__(self, first, second, third):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BpDE%3D","line":73,"in_reply_to":"AAAAUH%2F%2BpVc%3D","updated":"2014-01-23 16:31:02.000000000","message":"I found the issue. The parent class of StackAttributesTest is test_parser.StackTest, so when you run the test for that class, the tests of the parent class are run too. I\u0027ll change the base class for HeatTestCase.","commit_id":"9928b95473624c73751d301e739e66c475ced083"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"f3334e94ef497f069621deb2f992c150d3ca990b","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    flat_dict \u003d {\u0027key1\u0027: \u0027val1\u0027, \u0027key2\u0027: \u0027val2\u0027, \u0027key3\u0027: \u0027val3\u0027}"},{"line_number":71,"context_line":"    nested_dict \u003d {\u0027list\u0027: [1, 2, 3],"},{"line_number":72,"context_line":"                   \u0027string\u0027: \u0027abc\u0027,"},{"line_number":73,"context_line":"                   \u0027dict\u0027: {\u0027a\u0027: 1, \u0027b\u0027: 2, \u0027c\u0027: 3}}"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    class AnObject(object):"},{"line_number":76,"context_line":"        def __init__(self, first, second, third):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BuKg%3D","line":73,"in_reply_to":"AAAAUH%2F%2Bu%2Fw%3D","updated":"2014-01-22 19:55:48.000000000","message":"I can\u0027t reproduce what you comment. I ran the test with your change and the tests passes. I may be missing something.","commit_id":"9928b95473624c73751d301e739e66c475ced083"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"f54d057607b34e87b59492a7b469871750d95f8c","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    flat_dict \u003d {\u0027key1\u0027: \u0027val1\u0027, \u0027key2\u0027: \u0027val2\u0027, \u0027key3\u0027: \u0027val3\u0027}"},{"line_number":71,"context_line":"    nested_dict \u003d {\u0027list\u0027: [1, 2, 3],"},{"line_number":72,"context_line":"                   \u0027string\u0027: \u0027abc\u0027,"},{"line_number":73,"context_line":"                   \u0027dict\u0027: {\u0027a\u0027: 1, \u0027b\u0027: 2, \u0027c\u0027: 3}}"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    class AnObject(object):"},{"line_number":76,"context_line":"        def __init__(self, first, second, third):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2BpVc%3D","line":73,"in_reply_to":"AAAAUH%2F%2BuKg%3D","updated":"2014-01-23 15:41:52.000000000","message":"Actually, it doesn\u0027t go into an infinite loop, but the tests do take an order of magnitude longer:\nhttp://paste.openstack.org/show/61752/\n\nAnd the number of tests in test_hot.py went from 80 to 649.\n\nThis would be a huge impact to the heat unit tests.  Can the number of tests for this change be reduced?","commit_id":"9928b95473624c73751d301e739e66c475ced083"}],"heat/tests/test_hot.py":[{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"a0cdae41bac53c5b7d238ef78592d94ce9c16e33","unresolved":false,"context_lines":[{"line_number":307,"context_line":"    def test_get_attr_invalid(self):"},{"line_number":308,"context_line":"        \"\"\"Test resolution of get_attr occurrences in HOT template.\"\"\""},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"        hot_tpl \u003d template_format.parse(\u0027\u0027\u0027"},{"line_number":311,"context_line":"        heat_template_version: 2013-05-23"},{"line_number":312,"context_line":"        resources:"},{"line_number":313,"context_line":"          resource1:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B%2BDM%3D","line":310,"updated":"2014-01-20 09:32:05.000000000","message":"Why are you doing a template_format.parse here when this is already done in line 31 and you could just use the parsed template from line 31 here? Seems like one of those calls can be removed.","commit_id":"1538fe3bd7cde53669793f73daa1c68af9f774d1"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"693a9d2097e5331cc429d5cdb16b11d3a603af6a","unresolved":false,"context_lines":[{"line_number":307,"context_line":"    def test_get_attr_invalid(self):"},{"line_number":308,"context_line":"        \"\"\"Test resolution of get_attr occurrences in HOT template.\"\"\""},{"line_number":309,"context_line":""},{"line_number":310,"context_line":"        hot_tpl \u003d template_format.parse(\u0027\u0027\u0027"},{"line_number":311,"context_line":"        heat_template_version: 2013-05-23"},{"line_number":312,"context_line":"        resources:"},{"line_number":313,"context_line":"          resource1:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B9C4%3D","line":310,"in_reply_to":"AAAAUH%2F%2B%2BDM%3D","updated":"2014-01-20 13:14:58.000000000","message":"Done","commit_id":"1538fe3bd7cde53669793f73daa1c68af9f774d1"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"a0cdae41bac53c5b7d238ef78592d94ce9c16e33","unresolved":false,"context_lines":[{"line_number":377,"context_line":"              expected\u003d{\u0027Value\u0027: \u0027resource1\u0027})),"},{"line_number":378,"context_line":"        (\u0027GetAtt\u0027,"},{"line_number":379,"context_line":"         dict(hot_tpl\u003dhot_tpl_generic_resource,"},{"line_number":380,"context_line":"              snippet\u003d{\u0027Value\u0027: {\u0027Fn::GetAtt\u0027: [\u0027resource1\u0027, \u0027foo\u0027]}},"},{"line_number":381,"context_line":"              resource_name\u003d\u0027resource1\u0027,"},{"line_number":382,"context_line":"              expected\u003d{\u0027Value\u0027: \u0027resource1\u0027})),"},{"line_number":383,"context_line":"        (\u0027get_list_attr\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B%2BBs%3D","line":380,"updated":"2014-01-20 09:32:05.000000000","message":"Do we really want to support CFN functions like Fn::GetAtt in a HOT template?","commit_id":"1538fe3bd7cde53669793f73daa1c68af9f774d1"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"693a9d2097e5331cc429d5cdb16b11d3a603af6a","unresolved":false,"context_lines":[{"line_number":377,"context_line":"              expected\u003d{\u0027Value\u0027: \u0027resource1\u0027})),"},{"line_number":378,"context_line":"        (\u0027GetAtt\u0027,"},{"line_number":379,"context_line":"         dict(hot_tpl\u003dhot_tpl_generic_resource,"},{"line_number":380,"context_line":"              snippet\u003d{\u0027Value\u0027: {\u0027Fn::GetAtt\u0027: [\u0027resource1\u0027, \u0027foo\u0027]}},"},{"line_number":381,"context_line":"              resource_name\u003d\u0027resource1\u0027,"},{"line_number":382,"context_line":"              expected\u003d{\u0027Value\u0027: \u0027resource1\u0027})),"},{"line_number":383,"context_line":"        (\u0027get_list_attr\u0027,"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAUH%2F%2B9NE%3D","line":380,"in_reply_to":"AAAAUH%2F%2B%2BBs%3D","updated":"2014-01-20 13:14:58.000000000","message":"I really don\u0027t know. I\u0027ll ask on IRC about this. The test is here because was here before my patch.","commit_id":"1538fe3bd7cde53669793f73daa1c68af9f774d1"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"e204736f3331d8043c39b909f17c97839e0b8edf","unresolved":false,"context_lines":[{"line_number":351,"context_line":"    \"\"\""},{"line_number":352,"context_line":"    Test stack get_attr function when stack was created from HOT template."},{"line_number":353,"context_line":"    \"\"\""},{"line_number":354,"context_line":"    scenarios \u003d ["},{"line_number":355,"context_line":"        (\u0027get_flat_attr\u0027,"},{"line_number":356,"context_line":"         dict(hot_tpl\u003dhot_tpl_generic_resource,"},{"line_number":357,"context_line":"              snippet\u003d{\u0027Value\u0027: {\u0027get_attr\u0027: [\u0027resource1\u0027, \u0027foo\u0027]}},"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Bvuo%3D","line":354,"updated":"2014-01-22 15:36:30.000000000","message":"This would be much easier to read if the test data were defined here rather than in generic_resource.py.","commit_id":"b41e0c8fc1c03bdad2b4d97d9275a004ba754bc4"},{"author":{"_account_id":7253,"name":"Jason Dunsmore","email":"jasondunsmore@gmail.com","username":"jbd"},"change_message_id":"d53ce4d60dfe3eaf5b6bff1d8bc61445392708af","unresolved":false,"context_lines":[{"line_number":351,"context_line":"    \"\"\""},{"line_number":352,"context_line":"    Test stack get_attr function when stack was created from HOT template."},{"line_number":353,"context_line":"    \"\"\""},{"line_number":354,"context_line":"    scenarios \u003d ["},{"line_number":355,"context_line":"        (\u0027get_flat_attr\u0027,"},{"line_number":356,"context_line":"         dict(hot_tpl\u003dhot_tpl_generic_resource,"},{"line_number":357,"context_line":"              snippet\u003d{\u0027Value\u0027: {\u0027get_attr\u0027: [\u0027resource1\u0027, \u0027foo\u0027]}},"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BvHA%3D","line":354,"in_reply_to":"AAAAUH%2F%2BvY4%3D","updated":"2014-01-22 17:08:32.000000000","message":"The benefit would be that it would be immediately obvious what is being tested.  For example: \nhttps://github.com/openstack/heat/blob/master/heat/tests/test_resource.py#L1127-L1160\n\nDefining the class here would be an improvement, but I see you\u0027re following an established pattern, so it\u0027s probably fine as is.","commit_id":"b41e0c8fc1c03bdad2b4d97d9275a004ba754bc4"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"4421ca8e0959ffe760fe950e5ca25eb602ff0698","unresolved":false,"context_lines":[{"line_number":351,"context_line":"    \"\"\""},{"line_number":352,"context_line":"    Test stack get_attr function when stack was created from HOT template."},{"line_number":353,"context_line":"    \"\"\""},{"line_number":354,"context_line":"    scenarios \u003d ["},{"line_number":355,"context_line":"        (\u0027get_flat_attr\u0027,"},{"line_number":356,"context_line":"         dict(hot_tpl\u003dhot_tpl_generic_resource,"},{"line_number":357,"context_line":"              snippet\u003d{\u0027Value\u0027: {\u0027get_attr\u0027: [\u0027resource1\u0027, \u0027foo\u0027]}},"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2BvY4%3D","line":354,"in_reply_to":"AAAAUH%2F%2Bvuo%3D","updated":"2014-01-22 16:15:48.000000000","message":"Could you elaborate on the benefits of putting all the data here?\nAFAIK the option would be to bring ResourceWithComplexAttributes class here, which IMO wouldn\u0027t improve readability (scrolling vs changing files).\nAm I missing something?","commit_id":"b41e0c8fc1c03bdad2b4d97d9275a004ba754bc4"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"cfff38153eb20ef6b2aee4bf4c5b3c4a2fba89e8","unresolved":false,"context_lines":[{"line_number":247,"context_line":"                                  template.Template(hot_tpl))"},{"line_number":248,"context_line":"        self.stack.store()"},{"line_number":249,"context_line":"        self.stack.create()"},{"line_number":250,"context_line":"        self.assertEqual(self.stack.state,"},{"line_number":251,"context_line":"                         (parser.Stack.CREATE, parser.Stack.COMPLETE))"},{"line_number":252,"context_line":"        self.assertRaises(exception.InvalidTemplateAttribute,"},{"line_number":253,"context_line":"                          hot.HOTemplate.resolve_attributes,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BFoI%3D","line":250,"updated":"2014-01-30 09:04:27.000000000","message":"wrong order of arguments to assertEqual","commit_id":"a87302a63317b6c6981f6e567f989f44a477a093"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"b7daf9922e4a237815dc663c363bfee4d4b96945","unresolved":false,"context_lines":[{"line_number":247,"context_line":"                                  template.Template(hot_tpl))"},{"line_number":248,"context_line":"        self.stack.store()"},{"line_number":249,"context_line":"        self.stack.create()"},{"line_number":250,"context_line":"        self.assertEqual(self.stack.state,"},{"line_number":251,"context_line":"                         (parser.Stack.CREATE, parser.Stack.COMPLETE))"},{"line_number":252,"context_line":"        self.assertRaises(exception.InvalidTemplateAttribute,"},{"line_number":253,"context_line":"                          hot.HOTemplate.resolve_attributes,"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BEsE%3D","line":250,"in_reply_to":"AAAAUH%2F%2BFoI%3D","updated":"2014-01-30 12:49:41.000000000","message":"Done","commit_id":"a87302a63317b6c6981f6e567f989f44a477a093"},{"author":{"_account_id":9542,"name":"Pavlo Shchelokovskyy","email":"pshchelokovskyy@mirantis.com","username":"pshchelo"},"change_message_id":"cfff38153eb20ef6b2aee4bf4c5b3c4a2fba89e8","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                                  template.Template(hot_tpl))"},{"line_number":265,"context_line":"        self.stack.store()"},{"line_number":266,"context_line":"        self.stack.create()"},{"line_number":267,"context_line":"        self.assertEqual(self.stack.state,"},{"line_number":268,"context_line":"                         (parser.Stack.CREATE, parser.Stack.COMPLETE))"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        snippet \u003d {\u0027Value\u0027: {\u0027get_attr\u0027: [\u0027resource2\u0027, \u0027who_cares\u0027]}}"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BFoA%3D","line":267,"updated":"2014-01-30 09:04:27.000000000","message":"ditto","commit_id":"a87302a63317b6c6981f6e567f989f44a477a093"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"b7daf9922e4a237815dc663c363bfee4d4b96945","unresolved":false,"context_lines":[{"line_number":264,"context_line":"                                  template.Template(hot_tpl))"},{"line_number":265,"context_line":"        self.stack.store()"},{"line_number":266,"context_line":"        self.stack.create()"},{"line_number":267,"context_line":"        self.assertEqual(self.stack.state,"},{"line_number":268,"context_line":"                         (parser.Stack.CREATE, parser.Stack.COMPLETE))"},{"line_number":269,"context_line":""},{"line_number":270,"context_line":"        snippet \u003d {\u0027Value\u0027: {\u0027get_attr\u0027: [\u0027resource2\u0027, \u0027who_cares\u0027]}}"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BEsI%3D","line":267,"in_reply_to":"AAAAUH%2F%2BFoA%3D","updated":"2014-01-30 12:49:41.000000000","message":"Done","commit_id":"a87302a63317b6c6981f6e567f989f44a477a093"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"08caabf0330f10d72a660634238e4bd0e91967b6","unresolved":false,"context_lines":[{"line_number":395,"context_line":"                                  template.Template(self.hot_tpl))"},{"line_number":396,"context_line":"        self.stack.store()"},{"line_number":397,"context_line":"        self.stack.create()"},{"line_number":398,"context_line":"        self.assertEqual(self.stack.state,"},{"line_number":399,"context_line":"                         (parser.Stack.CREATE, parser.Stack.COMPLETE))"},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"        rsrc \u003d self.stack[self.resource_name]"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BFkU%3D","line":398,"updated":"2014-01-30 09:19:59.000000000","message":"it\u0027s related with Pavlo\u0027s comment too.","commit_id":"a87302a63317b6c6981f6e567f989f44a477a093"},{"author":{"_account_id":9331,"name":"Pablo Andres Fuente","email":"pablo.andres.fuente@gmail.com","username":"pafuent"},"change_message_id":"b7daf9922e4a237815dc663c363bfee4d4b96945","unresolved":false,"context_lines":[{"line_number":395,"context_line":"                                  template.Template(self.hot_tpl))"},{"line_number":396,"context_line":"        self.stack.store()"},{"line_number":397,"context_line":"        self.stack.create()"},{"line_number":398,"context_line":"        self.assertEqual(self.stack.state,"},{"line_number":399,"context_line":"                         (parser.Stack.CREATE, parser.Stack.COMPLETE))"},{"line_number":400,"context_line":""},{"line_number":401,"context_line":"        rsrc \u003d self.stack[self.resource_name]"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUH%2F%2BEsA%3D","line":398,"in_reply_to":"AAAAUH%2F%2BFkU%3D","updated":"2014-01-30 12:49:41.000000000","message":"Done","commit_id":"a87302a63317b6c6981f6e567f989f44a477a093"}]}
