)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"4479404a9b643d062b5c36b2bfbdc599b0b2f081","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Bartosz Górski \u003cbartosz.gorski@ntti3.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2013-11-08 09:19:00 -0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Multi-region support with context concept"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implements: blueprint multi-region-support"},{"line_number":10,"context_line":"Change-Id: I62cb07877702c57dd0e77dbcb0e123a3ec2c885d"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAATn%2F%2FE4Q%3D","line":7,"updated":"2013-11-14 20:07:05.000000000","message":"We\u0027re going to need more information here, such as why the change is needed, and why we\u0027ve done it the way we have.","commit_id":"f9ef35af16f84493eaf7db1389103ca9ca2b0d1b"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"bd772e7b958c7e17305fd681970e139e620aed5e","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Gerrit Code Review \u003creview@openstack.org\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-04-04 13:05:38 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Multi-region support with context concept"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implements: blueprint multi-region-support"},{"line_number":10,"context_line":"Change-Id: I62cb07877702c57dd0e77dbcb0e123a3ec2c885d"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"AAAAXH%2F%2FyBY%3D","line":7,"updated":"2014-04-17 14:03:38.000000000","message":"As pointed out in a previous comment, We\u0027re going to need more information here.","commit_id":"383c8ac7ecc1c39c62faf2d413b9c53f8dbb7204"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"2e6e5e49b50d3ec2acf4fc87a3da2c0c191224d3","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Gerrit Code Review \u003creview@openstack.org\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-04-04 13:05:38 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Multi-region support with context concept"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implements: blueprint multi-region-support"},{"line_number":10,"context_line":"Change-Id: I62cb07877702c57dd0e77dbcb0e123a3ec2c885d"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"3ae8d1ca_a3c5e05c","line":7,"in_reply_to":"AAAAXH%2F%2FyBY%3D","updated":"2014-05-27 20:21:40.000000000","message":"Done","commit_id":"383c8ac7ecc1c39c62faf2d413b9c53f8dbb7204"},{"author":{"_account_id":10556,"name":"Dimitri Mazmanov","email":"dimitri.mazmanov@ericsson.com","username":"edimmaz"},"change_message_id":"39db64cef59435f4bc85d1d832a917b983e5c0e5","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Adds multi-region support for stack resource"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds new resource type called OS::HEAT::STACK which allows"},{"line_number":10,"context_line":"creating new stack in specified region using heatclient."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements: blueprint multi-region-support"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1ae5cdf2_7f0c153c","line":9,"updated":"2014-06-10 08:20:57.000000000","message":"Just for consistency, could you replace the resource name to OS::Heat::Stack?","commit_id":"0c09a6fd2343a5f9d456ecce7c03d0c241279591"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"4c3ef2cb97bacc3e59ca663809caeb35b175655e","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Adds multi-region support for stack resource"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds new resource type called OS::HEAT::STACK which allows"},{"line_number":10,"context_line":"creating new stack in specified region using heatclient."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Implements: blueprint multi-region-support"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"1ae5cdf2_90c8ab56","line":9,"in_reply_to":"1ae5cdf2_7f0c153c","updated":"2014-06-11 20:24:40.000000000","message":"Done","commit_id":"0c09a6fd2343a5f9d456ecce7c03d0c241279591"}],"heat/common/context.py":[{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"d2b0fb72cbfe6b5122b73da277fff7c021087c9c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                 roles\u003dNone, is_admin\u003dNone, read_only\u003dFalse,"},{"line_number":40,"context_line":"                 show_deleted\u003dFalse, overwrite\u003dTrue, trust_id\u003dNone,"},{"line_number":41,"context_line":"                 trustor_user_id\u003dNone, request_id\u003dNone, **kwargs):"},{"line_number":42,"context_line":"        \"\"\""},{"line_number":43,"context_line":"        :param overwrite: Set to False to ensure that the greenthread local"},{"line_number":44,"context_line":"            copy of the index is not overwritten."},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAWH%2F9cTg%3D","line":42,"updated":"2014-04-04 13:57:55.000000000","message":"I don\u0027t understand this change and the change in url_for. You don\u0027t see to be using this anywhere, as KeystoneClient doesn\u0027t use the region_name from the context, and you pass it explicitly to url_for anyway. Can you explain it to me?","commit_id":"383c8ac7ecc1c39c62faf2d413b9c53f8dbb7204"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"2e6e5e49b50d3ec2acf4fc87a3da2c0c191224d3","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                 roles\u003dNone, is_admin\u003dNone, read_only\u003dFalse,"},{"line_number":40,"context_line":"                 show_deleted\u003dFalse, overwrite\u003dTrue, trust_id\u003dNone,"},{"line_number":41,"context_line":"                 trustor_user_id\u003dNone, request_id\u003dNone, **kwargs):"},{"line_number":42,"context_line":"        \"\"\""},{"line_number":43,"context_line":"        :param overwrite: Set to False to ensure that the greenthread local"},{"line_number":44,"context_line":"            copy of the index is not overwritten."},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"3ae8d1ca_0383f404","line":42,"in_reply_to":"AAAAW3%2F%2FzRA%3D","updated":"2014-05-27 20:21:40.000000000","message":"It is not needed anymore. I will remove it.","commit_id":"383c8ac7ecc1c39c62faf2d413b9c53f8dbb7204"},{"author":{"_account_id":10556,"name":"Dimitri Mazmanov","email":"dimitri.mazmanov@ericsson.com","username":"edimmaz"},"change_message_id":"a58bc6ce8831bca5a681ea8e7b57ee1ee9e9130f","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                 roles\u003dNone, is_admin\u003dNone, read_only\u003dFalse,"},{"line_number":40,"context_line":"                 show_deleted\u003dFalse, overwrite\u003dTrue, trust_id\u003dNone,"},{"line_number":41,"context_line":"                 trustor_user_id\u003dNone, request_id\u003dNone, **kwargs):"},{"line_number":42,"context_line":"        \"\"\""},{"line_number":43,"context_line":"        :param overwrite: Set to False to ensure that the greenthread local"},{"line_number":44,"context_line":"            copy of the index is not overwritten."},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2FzRA%3D","line":42,"in_reply_to":"AAAAWH%2F9cTg%3D","updated":"2014-04-10 10:20:01.000000000","message":"imho he\u0027s using region_name to get a remote endpoint (line 124 remote_stack.py) but this doesn\u0027t explain the way it\u0027s implemented","commit_id":"383c8ac7ecc1c39c62faf2d413b9c53f8dbb7204"}],"heat/common/wsgi.py":[{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"4479404a9b643d062b5c36b2bfbdc599b0b2f081","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"URL_LENGTH_LIMIT \u003d 50000"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"eventlet.wsgi.MAX_HEADER_LINE \u003d 65536"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"api_opts \u003d ["},{"line_number":56,"context_line":"    cfg.StrOpt(\u0027bind_host\u0027, default\u003d\u00270.0.0.0\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FE4A%3D","line":53,"updated":"2013-11-14 20:07:05.000000000","message":"This seems quite random. Why do we have to change this?","commit_id":"f9ef35af16f84493eaf7db1389103ca9ca2b0d1b"}],"heat/db/sqlalchemy/migrate_repo/versions/029_user_creds_region_name.py":[{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"4479404a9b643d062b5c36b2bfbdc599b0b2f081","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    meta \u003d sqlalchemy.MetaData(bind\u003dmigrate_engine)"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"    user_creds \u003d sqlalchemy.Table(\u0027user_creds\u0027, meta, autoload\u003dTrue)"},{"line_number":22,"context_line":"    region_name \u003d sqlalchemy.Column(\u0027region_name\u0027, sqlalchemy.TEXT())"},{"line_number":23,"context_line":"    region_name.create(user_creds)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FE30%3D","line":22,"updated":"2013-11-14 20:07:05.000000000","message":"varchar(255) is not a \"TEXT\" field. You\u0027ll end up with different tables thant he model here.","commit_id":"f9ef35af16f84493eaf7db1389103ca9ca2b0d1b"}],"heat/engine/clients.py":[{"author":{"_account_id":10556,"name":"Dimitri Mazmanov","email":"dimitri.mazmanov@ericsson.com","username":"edimmaz"},"change_message_id":"a58bc6ce8831bca5a681ea8e7b57ee1ee9e9130f","unresolved":false,"context_lines":[{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def url_for(self, **kwargs):"},{"line_number":96,"context_line":"        if self.context.region_name and \u0027region_name\u0027 not in kwargs:"},{"line_number":97,"context_line":"            kwargs[\u0027region_name\u0027] \u003d self.context.region_name"},{"line_number":98,"context_line":"        return self.keystone().url_for(**kwargs)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def nova(self, service_type\u003d\u0027compute\u0027):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2FzQ0%3D","line":97,"updated":"2014-04-10 10:20:01.000000000","message":"Is this the only way to insert region_name in kwargs?","commit_id":"383c8ac7ecc1c39c62faf2d413b9c53f8dbb7204"}],"heat/engine/resources/context.py":[{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"4479404a9b643d062b5c36b2bfbdc599b0b2f081","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class Context(resource.Resource):"},{"line_number":25,"context_line":"    \"\"\""},{"line_number":26,"context_line":"    A resource for context used to create nested stacks."},{"line_number":27,"context_line":"    \"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    properties_schema \u003d {"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FElA%3D","line":26,"updated":"2013-11-14 20:07:05.000000000","message":"This is pretty terse. I recommend a few sentences explaining the use case for the resource.","commit_id":"f9ef35af16f84493eaf7db1389103ca9ca2b0d1b"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"4479404a9b643d062b5c36b2bfbdc599b0b2f081","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        },"},{"line_number":38,"context_line":"        \u0027username\u0027: {"},{"line_number":39,"context_line":"            \u0027Type\u0027: \u0027String\u0027,"},{"line_number":40,"context_line":"            \u0027Description\u0027: _(\u0027Username of user used to create resources.\u0027)"},{"line_number":41,"context_line":"        },"},{"line_number":42,"context_line":"        \u0027password\u0027: {"},{"line_number":43,"context_line":"            \u0027Type\u0027: \u0027String\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FEk0%3D","line":40,"updated":"2013-11-14 20:07:05.000000000","message":"s/create/manage/","commit_id":"f9ef35af16f84493eaf7db1389103ca9ca2b0d1b"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"4479404a9b643d062b5c36b2bfbdc599b0b2f081","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        res \u003d None"},{"line_number":92,"context_line":"        if name in self.attributes_schema.keys():"},{"line_number":93,"context_line":"            res \u003d self.properties[name]"},{"line_number":94,"context_line":"        logger.info(\u0027%s._resolve_attribute(%s) \u003d\u003d %s\u0027 % (self.name, name, res))"},{"line_number":95,"context_line":"        return unicode(res) if res else None"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def FnGetRefId(self):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FEko%3D","line":94,"updated":"2013-11-14 20:07:05.000000000","message":"Is logging all attribute fetches at info a normal pattern? This seems like debug level, not info.","commit_id":"f9ef35af16f84493eaf7db1389103ca9ca2b0d1b"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"4479404a9b643d062b5c36b2bfbdc599b0b2f081","unresolved":false,"context_lines":[{"line_number":100,"context_line":""},{"line_number":101,"context_line":"def resource_mapping():"},{"line_number":102,"context_line":"    return {"},{"line_number":103,"context_line":"        \u0027OS::Cloud::Context\u0027: Context,"},{"line_number":104,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2FElw%3D","line":103,"updated":"2013-11-14 20:07:05.000000000","message":"\"cloud\" is not really an appropriate namespace IMO. OS::Heat::CloudContext seems like the proper scoping.","commit_id":"f9ef35af16f84493eaf7db1389103ca9ca2b0d1b"}],"heat/engine/resources/remote_stack.py":[{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"d928f4bb5db409abd36e6e544339587816418b6f","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        ctx \u003d None"},{"line_number":83,"context_line":"        ctx_id \u003d self.properties.get(self.CONTEXT)"},{"line_number":84,"context_line":"        if ctx_id is not None:"},{"line_number":85,"context_line":"            ctx \u003d self.stack.resource_by_refid(ctx_id)"},{"line_number":86,"context_line":"            if ctx is not None:"},{"line_number":87,"context_line":"                default_ctx \u003d self.context.to_dict()"},{"line_number":88,"context_line":"                default_ctx.update(ctx.to_dict())"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAVX%2F%2F%2Bl0%3D","line":85,"updated":"2014-02-27 16:54:14.000000000","message":"This is a red flag.","commit_id":"4ba0044a0487d0fbd1c221f325272301974df1c8"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"54ee84d40d88b299e21d9489415e6294e6df4768","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    PROPERTIES \u003d ("},{"line_number":45,"context_line":"        CONTEXT, TEMPLATE_URL, TIMEOUT_IN_MINS, PARAMETERS,"},{"line_number":46,"context_line":"    ) \u003d ("},{"line_number":47,"context_line":"        \u0027Context\u0027, \u0027TemplateURL\u0027, \u0027TimeoutInMinutes\u0027, \u0027Parameters\u0027,"},{"line_number":48,"context_line":"    )"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    _CONTEXT_KEYS \u003d ("}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2Fc6A%3D","line":47,"updated":"2014-03-17 20:21:14.000000000","message":"I would prefer these be in HOT-style casing: context, template_url, timeout_in_minutes, etc.","commit_id":"98ad7fac60b4a902fd9b4a8bd42e0368094207b7"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"40efd4e8294ae664415448cce0b4f47b458474d9","unresolved":false,"context_lines":[{"line_number":44,"context_line":"    PROPERTIES \u003d ("},{"line_number":45,"context_line":"        CONTEXT, TEMPLATE_URL, TIMEOUT_IN_MINS, PARAMETERS,"},{"line_number":46,"context_line":"    ) \u003d ("},{"line_number":47,"context_line":"        \u0027Context\u0027, \u0027TemplateURL\u0027, \u0027TimeoutInMinutes\u0027, \u0027Parameters\u0027,"},{"line_number":48,"context_line":"    )"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    _CONTEXT_KEYS \u003d ("}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2FW4Q%3D","line":47,"in_reply_to":"AAAAWH%2F%2Fc6A%3D","updated":"2014-03-18 12:05:05.000000000","message":"Done","commit_id":"98ad7fac60b4a902fd9b4a8bd42e0368094207b7"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"54ee84d40d88b299e21d9489415e6294e6df4768","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        try:"},{"line_number":188,"context_line":"            self.heat().stacks.delete(stack_id\u003dself.resource_id)"},{"line_number":189,"context_line":"        except heat_exp.HTTPNotFound as ex:"},{"line_number":190,"context_line":"            logger.warn(_(\"Deleting remote stack failed: %s\") % str(ex))"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def _get_status(self):"},{"line_number":193,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2Fc3w%3D","line":190,"updated":"2014-03-17 20:21:14.000000000","message":"Minor nit. I don\u0027t think deleting the remote stack failed, it was just removed via other means.","commit_id":"98ad7fac60b4a902fd9b4a8bd42e0368094207b7"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"54ee84d40d88b299e21d9489415e6294e6df4768","unresolved":false,"context_lines":[{"line_number":197,"context_line":"            logger.warn(_(\"Getting remote stack status failed: %s\") % str(ex))"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def check_create_complete(self, *args):"},{"line_number":200,"context_line":"        return not (self._get_status() \u003d\u003d \u0027CREATE_IN_PROGRESS\u0027)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def check_update_complete(self, *args):"},{"line_number":203,"context_line":"        return not (self._get_status() \u003d\u003d \u0027UPDATE_IN_PROGRESS\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2Fc5I%3D","line":200,"updated":"2014-03-17 20:21:14.000000000","message":"Shouldn\u0027t this raise an exception if the remote stack is CREATE_FAILED? Also, seems there should be some handling around the case when we get None from _get_status. This would seem like an error to me.","commit_id":"98ad7fac60b4a902fd9b4a8bd42e0368094207b7"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"40efd4e8294ae664415448cce0b4f47b458474d9","unresolved":false,"context_lines":[{"line_number":197,"context_line":"            logger.warn(_(\"Getting remote stack status failed: %s\") % str(ex))"},{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def check_create_complete(self, *args):"},{"line_number":200,"context_line":"        return not (self._get_status() \u003d\u003d \u0027CREATE_IN_PROGRESS\u0027)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def check_update_complete(self, *args):"},{"line_number":203,"context_line":"        return not (self._get_status() \u003d\u003d \u0027UPDATE_IN_PROGRESS\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2FW3w%3D","line":200,"in_reply_to":"AAAAWH%2F%2Fc5I%3D","updated":"2014-03-18 12:05:05.000000000","message":"You are right. I will fix it.","commit_id":"98ad7fac60b4a902fd9b4a8bd42e0368094207b7"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"54ee84d40d88b299e21d9489415e6294e6df4768","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        return not (self._get_status() \u003d\u003d \u0027CREATE_IN_PROGRESS\u0027)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def check_update_complete(self, *args):"},{"line_number":203,"context_line":"        return not (self._get_status() \u003d\u003d \u0027UPDATE_IN_PROGRESS\u0027)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def check_delete_complete(self, *args):"},{"line_number":206,"context_line":"        return not (self._get_status() \u003d\u003d \u0027DELETE_IN_PROGRESS\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2Fc4w%3D","line":203,"updated":"2014-03-17 20:21:14.000000000","message":"Same as above.","commit_id":"98ad7fac60b4a902fd9b4a8bd42e0368094207b7"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"40efd4e8294ae664415448cce0b4f47b458474d9","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        return not (self._get_status() \u003d\u003d \u0027CREATE_IN_PROGRESS\u0027)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    def check_update_complete(self, *args):"},{"line_number":203,"context_line":"        return not (self._get_status() \u003d\u003d \u0027UPDATE_IN_PROGRESS\u0027)"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    def check_delete_complete(self, *args):"},{"line_number":206,"context_line":"        return not (self._get_status() \u003d\u003d \u0027DELETE_IN_PROGRESS\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2FW3s%3D","line":203,"in_reply_to":"AAAAWH%2F%2Fc4w%3D","updated":"2014-03-18 12:05:05.000000000","message":"Done","commit_id":"98ad7fac60b4a902fd9b4a8bd42e0368094207b7"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"54ee84d40d88b299e21d9489415e6294e6df4768","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":"def resource_mapping():"},{"line_number":221,"context_line":"    return {"},{"line_number":222,"context_line":"        \u0027OS::Heat::RemoteStack\u0027: RemoteNestedStack,"},{"line_number":223,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2Fc5U%3D","line":222,"updated":"2014-03-17 20:21:14.000000000","message":"I don\u0027t think we should register this resource if heatclient isn\u0027t available.","commit_id":"98ad7fac60b4a902fd9b4a8bd42e0368094207b7"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"40efd4e8294ae664415448cce0b4f47b458474d9","unresolved":false,"context_lines":[{"line_number":219,"context_line":""},{"line_number":220,"context_line":"def resource_mapping():"},{"line_number":221,"context_line":"    return {"},{"line_number":222,"context_line":"        \u0027OS::Heat::RemoteStack\u0027: RemoteNestedStack,"},{"line_number":223,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAWH%2F%2FW3A%3D","line":222,"in_reply_to":"AAAAWH%2F%2Fc5U%3D","updated":"2014-03-18 12:05:05.000000000","message":"Good point. Thank you.","commit_id":"98ad7fac60b4a902fd9b4a8bd42e0368094207b7"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"0d271362ee97ef1ca1e176c36e56b4457cbf674e","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"class RemoteNestedStack(resource.Resource):"},{"line_number":40,"context_line":"    \"\"\""},{"line_number":41,"context_line":"    A Resource representing a child stack to allow composition of templates."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    PROPERTIES \u003d ("}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2FcnU%3D","line":41,"updated":"2014-04-14 14:56:23.000000000","message":"Seemly we should modify the description here. This is for nested stack.","commit_id":"383c8ac7ecc1c39c62faf2d413b9c53f8dbb7204"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"0d271362ee97ef1ca1e176c36e56b4457cbf674e","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        }"},{"line_number":124,"context_line":"        endpoint \u003d kc.url_for(service_type\u003d\u0027orchestration\u0027,"},{"line_number":125,"context_line":"                              region_name\u003dctx.region_name)"},{"line_number":126,"context_line":"        self.hc \u003d heatclient.Client(\u00271\u0027, endpoint, **args)"},{"line_number":127,"context_line":"        return self.hc"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def handle_create(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2FclI%3D","line":126,"updated":"2014-04-14 14:56:23.000000000","message":"How to support standalone heat engine? Or, not support standalone at all?","commit_id":"383c8ac7ecc1c39c62faf2d413b9c53f8dbb7204"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"2e6e5e49b50d3ec2acf4fc87a3da2c0c191224d3","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        }"},{"line_number":124,"context_line":"        endpoint \u003d kc.url_for(service_type\u003d\u0027orchestration\u0027,"},{"line_number":125,"context_line":"                              region_name\u003dctx.region_name)"},{"line_number":126,"context_line":"        self.hc \u003d heatclient.Client(\u00271\u0027, endpoint, **args)"},{"line_number":127,"context_line":"        return self.hc"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def handle_create(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"3ae8d1ca_23ee3089","line":126,"in_reply_to":"AAAAW3%2F%2FclI%3D","updated":"2014-05-27 20:21:40.000000000","message":"Right now standalone will not be supported.","commit_id":"383c8ac7ecc1c39c62faf2d413b9c53f8dbb7204"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"0d271362ee97ef1ca1e176c36e56b4457cbf674e","unresolved":false,"context_lines":[{"line_number":143,"context_line":"            \u0027timeout_mins\u0027: self.properties[self.TIMEOUT_IN_MINS],"},{"line_number":144,"context_line":"            \u0027disable_rollback\u0027: True,"},{"line_number":145,"context_line":"            \u0027parameters\u0027: self.properties[self.PARAMETERS],"},{"line_number":146,"context_line":"            \u0027files\u0027: self.stack.t.files"},{"line_number":147,"context_line":"        }"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        remote_stack_id \u003d self.heat().stacks.create(**fields)[\u0027stack\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAW3%2F%2Fcgw%3D","line":146,"updated":"2014-04-14 14:56:23.000000000","message":"I think files should be get from the parsed template instead self.stack.t. self.stack should be the parent stack.","commit_id":"383c8ac7ecc1c39c62faf2d413b9c53f8dbb7204"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"13af2bb2e8d43b4b64bd37c3f68a22d1359fffc9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_0c323110","line":1,"updated":"2014-05-28 09:44:17.000000000","message":"Please remove this line according to [1]\n\n[1] https://bugs.launchpad.net/ceilometer/+bug/1229324","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"19b53d17219e07b858ef0126b3ad395ee52b7493","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_390ef23b","line":1,"in_reply_to":"3ae8d1ca_0c323110","updated":"2014-06-03 21:35:10.000000000","message":"I will remove it","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"13af2bb2e8d43b4b64bd37c3f68a22d1359fffc9","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    from heatclient import client as heatclient"},{"line_number":36,"context_line":"except ImportError:"},{"line_number":37,"context_line":"    heatclient \u003d None"},{"line_number":38,"context_line":"    logger.info(_(\u0027heatclient not available\u0027))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class RemoteNestedStack(resource.Resource):"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_07ea0a0f","line":38,"updated":"2014-05-28 09:44:17.000000000","message":"In other places (f.e. clients.py) heatclient used without conditions. So I suppose, you could just import heatclient here","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"19b53d17219e07b858ef0126b3ad395ee52b7493","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    from heatclient import client as heatclient"},{"line_number":36,"context_line":"except ImportError:"},{"line_number":37,"context_line":"    heatclient \u003d None"},{"line_number":38,"context_line":"    logger.info(_(\u0027heatclient not available\u0027))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class RemoteNestedStack(resource.Resource):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_5d9809c0","line":38,"in_reply_to":"3ae8d1ca_07ea0a0f","updated":"2014-06-03 21:35:10.000000000","message":"You are right. I will fix it.","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"7e5591e6bee0f7a78657502b39c1f1399e426c68","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            properties.Schema.MAP,"},{"line_number":62,"context_line":"            _(\u0027Context for the stack.\u0027),"},{"line_number":63,"context_line":"            schema\u003d{"},{"line_number":64,"context_line":"                USERNAME: properties.Schema("},{"line_number":65,"context_line":"                    properties.Schema.STRING,"},{"line_number":66,"context_line":"                    _(\u0027Username used to create stack.\u0027)"},{"line_number":67,"context_line":"                ),"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_c5ff2566","line":64,"updated":"2014-05-28 20:16:03.000000000","message":"This seems like halfway between a multi-region implementation and a multi-cloud implementation.\n\nFor multi-region you don\u0027t need the username/password/tenant. But for multi-cloud, you also need an endpoint URL.","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"287adce26d15568068fa097067792ce70d198230","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            properties.Schema.MAP,"},{"line_number":62,"context_line":"            _(\u0027Context for the stack.\u0027),"},{"line_number":63,"context_line":"            schema\u003d{"},{"line_number":64,"context_line":"                USERNAME: properties.Schema("},{"line_number":65,"context_line":"                    properties.Schema.STRING,"},{"line_number":66,"context_line":"                    _(\u0027Username used to create stack.\u0027)"},{"line_number":67,"context_line":"                ),"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_15a2b698","line":64,"in_reply_to":"1ae5cdf2_066632c1","updated":"2014-06-04 15:43:41.000000000","message":"Bartosz, your proposal sounds good to me.","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"781a0d6ac50aba4936432b5cfc430925e838a039","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            properties.Schema.MAP,"},{"line_number":62,"context_line":"            _(\u0027Context for the stack.\u0027),"},{"line_number":63,"context_line":"            schema\u003d{"},{"line_number":64,"context_line":"                USERNAME: properties.Schema("},{"line_number":65,"context_line":"                    properties.Schema.STRING,"},{"line_number":66,"context_line":"                    _(\u0027Username used to create stack.\u0027)"},{"line_number":67,"context_line":"                ),"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_77407e34","line":64,"in_reply_to":"1ae5cdf2_066632c1","updated":"2014-06-03 23:33:41.000000000","message":"Sounds fine to me, though I wonder if the follow on is premature.","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"2425f129cabe287282940ff557d1cb39ed242f5e","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            properties.Schema.MAP,"},{"line_number":62,"context_line":"            _(\u0027Context for the stack.\u0027),"},{"line_number":63,"context_line":"            schema\u003d{"},{"line_number":64,"context_line":"                USERNAME: properties.Schema("},{"line_number":65,"context_line":"                    properties.Schema.STRING,"},{"line_number":66,"context_line":"                    _(\u0027Username used to create stack.\u0027)"},{"line_number":67,"context_line":"                ),"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_a3c8e7a8","line":64,"in_reply_to":"1ae5cdf2_15a2b698","updated":"2014-06-04 19:06:30.000000000","message":"+1","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"6d462713bb9d1b2d15f9b0c95ec2753b9b90d29d","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            properties.Schema.MAP,"},{"line_number":62,"context_line":"            _(\u0027Context for the stack.\u0027),"},{"line_number":63,"context_line":"            schema\u003d{"},{"line_number":64,"context_line":"                USERNAME: properties.Schema("},{"line_number":65,"context_line":"                    properties.Schema.STRING,"},{"line_number":66,"context_line":"                    _(\u0027Username used to create stack.\u0027)"},{"line_number":67,"context_line":"                ),"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_066632c1","line":64,"in_reply_to":"1ae5cdf2_7dc94558","updated":"2014-06-03 23:05:42.000000000","message":"I talked with Randall and by multi-region first he means to (Randall correct me if I\u0027m wrong):\n- leave only a region_name property in context\n- not create keystone client in this resource\n- use keystone client from stack clients to get endpoint for heat service\n- create heatclient with existing username,  token and heat endpoint\n\nSo I can split it on two depended patches. First with multi-region support (as defined by Randall) and second one with multi-cloud support:\n- add username, password, tenant and auth_url properties in context\n- create new keystone client with provided user credentials to get token and endpoint for heat\n\n What you think guys?","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"b9c5310effb460bdcd3d390657543783437a44a7","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            properties.Schema.MAP,"},{"line_number":62,"context_line":"            _(\u0027Context for the stack.\u0027),"},{"line_number":63,"context_line":"            schema\u003d{"},{"line_number":64,"context_line":"                USERNAME: properties.Schema("},{"line_number":65,"context_line":"                    properties.Schema.STRING,"},{"line_number":66,"context_line":"                    _(\u0027Username used to create stack.\u0027)"},{"line_number":67,"context_line":"                ),"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_7dc94558","line":64,"in_reply_to":"1ae5cdf2_9d8e1178","updated":"2014-06-03 21:39:30.000000000","message":"I disagree Bartosz. I think this should be multi-region only for now. Lets prove/get that working and then tackle multi-cloud after.","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"19b53d17219e07b858ef0126b3ad395ee52b7493","unresolved":false,"context_lines":[{"line_number":61,"context_line":"            properties.Schema.MAP,"},{"line_number":62,"context_line":"            _(\u0027Context for the stack.\u0027),"},{"line_number":63,"context_line":"            schema\u003d{"},{"line_number":64,"context_line":"                USERNAME: properties.Schema("},{"line_number":65,"context_line":"                    properties.Schema.STRING,"},{"line_number":66,"context_line":"                    _(\u0027Username used to create stack.\u0027)"},{"line_number":67,"context_line":"                ),"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_9d8e1178","line":64,"in_reply_to":"3ae8d1ca_c5ff2566","updated":"2014-06-03 21:35:10.000000000","message":"Yes. I will add property for AUTH_URL.Probably in the future we will end up with supporting more options offered by heatclient (i.e. token and heat_url pair and also standalone mode options). Right now I will try to keep it simple.","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"13af2bb2e8d43b4b64bd37c3f68a22d1359fffc9","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        ),"},{"line_number":100,"context_line":"    }"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    update_allowed_keys \u003d (\u0027Properties\u0027,)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def __init__(self, name, json_snippet, stack):"},{"line_number":105,"context_line":"        super(RemoteNestedStack, self).__init__(name, json_snippet, stack)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_27ef0620","line":102,"updated":"2014-05-28 09:44:17.000000000","message":"It should be deleted, because unused now.","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"19b53d17219e07b858ef0126b3ad395ee52b7493","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        ),"},{"line_number":100,"context_line":"    }"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    update_allowed_keys \u003d (\u0027Properties\u0027,)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def __init__(self, name, json_snippet, stack):"},{"line_number":105,"context_line":"        super(RemoteNestedStack, self).__init__(name, json_snippet, stack)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_1dc921ac","line":102,"in_reply_to":"3ae8d1ca_27ef0620","updated":"2014-06-03 21:35:10.000000000","message":"Done","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"781a0d6ac50aba4936432b5cfc430925e838a039","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        if status \u003d\u003d \u0027CREATE_FAILED\u0027:"},{"line_number":209,"context_line":"            exc \u003d Exception(_(\u0027Remote stack creation failed.\u0027))"},{"line_number":210,"context_line":"            raise exception.ResourceFailure(exc, self, self.action)"},{"line_number":211,"context_line":"        return not (status \u003d\u003d \u0027CREATE_IN_PROGRESS\u0027)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def check_update_complete(self, *args):"},{"line_number":214,"context_line":"        status \u003d self._get_status()"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_5798e2bf","line":211,"updated":"2014-06-03 23:33:41.000000000","message":"IMO, you should just check for CREATE_COMPLETE here.\n\n  return status \u003d\u003d \"CREATE_COMPLETE\"","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"3cd3e55fc356964857d7525e8c48a760c6509258","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        if status \u003d\u003d \u0027CREATE_FAILED\u0027:"},{"line_number":209,"context_line":"            exc \u003d Exception(_(\u0027Remote stack creation failed.\u0027))"},{"line_number":210,"context_line":"            raise exception.ResourceFailure(exc, self, self.action)"},{"line_number":211,"context_line":"        return not (status \u003d\u003d \u0027CREATE_IN_PROGRESS\u0027)"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"    def check_update_complete(self, *args):"},{"line_number":214,"context_line":"        status \u003d self._get_status()"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_7bf1fb69","line":211,"in_reply_to":"1ae5cdf2_5798e2bf","updated":"2014-06-05 19:00:30.000000000","message":"Done","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"781a0d6ac50aba4936432b5cfc430925e838a039","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        if status \u003d\u003d \u0027UPDATE_FAILED\u0027:"},{"line_number":216,"context_line":"            exc \u003d Exception(_(\u0027Remote stack update failed.\u0027))"},{"line_number":217,"context_line":"            raise exception.ResourceFailure(exc, self, self.action)"},{"line_number":218,"context_line":"        return not (status \u003d\u003d \u0027UPDATE_IN_PROGRESS\u0027)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def check_delete_complete(self, *args):"},{"line_number":221,"context_line":"        if self.resource_id is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_f7f00e00","line":218,"updated":"2014-06-03 23:33:41.000000000","message":"same as above; there\u0027s only one value that indicates success/done that isn\u0027t an exception.","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"3cd3e55fc356964857d7525e8c48a760c6509258","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        if status \u003d\u003d \u0027UPDATE_FAILED\u0027:"},{"line_number":216,"context_line":"            exc \u003d Exception(_(\u0027Remote stack update failed.\u0027))"},{"line_number":217,"context_line":"            raise exception.ResourceFailure(exc, self, self.action)"},{"line_number":218,"context_line":"        return not (status \u003d\u003d \u0027UPDATE_IN_PROGRESS\u0027)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"    def check_delete_complete(self, *args):"},{"line_number":221,"context_line":"        if self.resource_id is None:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_9bf4075c","line":218,"in_reply_to":"1ae5cdf2_f7f00e00","updated":"2014-06-05 19:00:30.000000000","message":"Done","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"781a0d6ac50aba4936432b5cfc430925e838a039","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        if status \u003d\u003d \u0027DELETE_FAILED\u0027:"},{"line_number":230,"context_line":"            exc \u003d Exception(_(\u0027Remote stack deletion failed.\u0027))"},{"line_number":231,"context_line":"            raise exception.ResourceFailure(exc, self, self.action)"},{"line_number":232,"context_line":"        return not (status \u003d\u003d \u0027DELETE_IN_PROGRESS\u0027)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def FnGetAtt(self, key):"},{"line_number":235,"context_line":"        if key and not key.startswith(\u0027Outputs.\u0027):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_b7e2062d","line":232,"updated":"2014-06-03 23:33:41.000000000","message":"same as above.","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"3cd3e55fc356964857d7525e8c48a760c6509258","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        if status \u003d\u003d \u0027DELETE_FAILED\u0027:"},{"line_number":230,"context_line":"            exc \u003d Exception(_(\u0027Remote stack deletion failed.\u0027))"},{"line_number":231,"context_line":"            raise exception.ResourceFailure(exc, self, self.action)"},{"line_number":232,"context_line":"        return not (status \u003d\u003d \u0027DELETE_IN_PROGRESS\u0027)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def FnGetAtt(self, key):"},{"line_number":235,"context_line":"        if key and not key.startswith(\u0027Outputs.\u0027):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_dbea0f73","line":232,"in_reply_to":"1ae5cdf2_b7e2062d","updated":"2014-06-05 19:00:30.000000000","message":"Done","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"7e5591e6bee0f7a78657502b39c1f1399e426c68","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    if heatclient is None:"},{"line_number":248,"context_line":"        return {}"},{"line_number":249,"context_line":"    return {"},{"line_number":250,"context_line":"        \u0027OS::Heat::RemoteStack\u0027: RemoteNestedStack,"},{"line_number":251,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_854b5d86","line":250,"updated":"2014-05-28 20:16:03.000000000","message":"In an ideal world I would like just one OS::Heat::Stack that could handle either a nested stack internally or a remote one, depending on whether another region was specified or not.\n\nThe implementation of that could get pretty hairy, though, (probably involving a couple of delegate classes) so one option would be to just always make requests through python-heatclient. This would actually have some advantages for people like TripleO who have enormous templates - splitting them up into individual stacks would then allow them to be processed on different engines.\n\nIn any event, I\u0027d rather not have a separate OS::Heat::RemoteStack type.","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"6c2dac68b020ef8349f48be1de5bb1ae89ce1d72","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    if heatclient is None:"},{"line_number":248,"context_line":"        return {}"},{"line_number":249,"context_line":"    return {"},{"line_number":250,"context_line":"        \u0027OS::Heat::RemoteStack\u0027: RemoteNestedStack,"},{"line_number":251,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_4f2b1430","line":250,"in_reply_to":"1ae5cdf2_16d17bfb","updated":"2014-06-03 00:23:29.000000000","message":"I\u0027d like us to consider not adding any new resource types. It would be nice to be able to do the following:\n\n  resources:\n    thing_over_there:\n      type: thing.yaml\n      properties:\n        foo: bar\n      context: {region_name: over_there}\n\nSo \u0027context\u0027 is a resource-type property, but an exception will be raised if it is set on any resource type which shouldn\u0027t be run remotely (everything except TemplateResource?)","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"33eaddfe305cf2b660955ba0feb3abfdaac85006","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    if heatclient is None:"},{"line_number":248,"context_line":"        return {}"},{"line_number":249,"context_line":"    return {"},{"line_number":250,"context_line":"        \u0027OS::Heat::RemoteStack\u0027: RemoteNestedStack,"},{"line_number":251,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_6fd29001","line":250,"in_reply_to":"1ae5cdf2_4f2b1430","updated":"2014-06-03 00:35:21.000000000","message":"+1 on that from me Steve. As we get smarter, we can enable more resources. I recall in the discussion in Hong Kong though, that the worry was that if we do this, then users will constantly be bumping against it since we only really support nested stacks with remote regions. I however, think that is fine, and since this is entirely static, we can fail on validation.","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"90debd75b236882fc278c0384cd0ddd0e04a6a6b","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    if heatclient is None:"},{"line_number":248,"context_line":"        return {}"},{"line_number":249,"context_line":"    return {"},{"line_number":250,"context_line":"        \u0027OS::Heat::RemoteStack\u0027: RemoteNestedStack,"},{"line_number":251,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_aa772639","line":250,"in_reply_to":"1ae5cdf2_6fd29001","updated":"2014-06-03 01:20:00.000000000","message":"-1 from me. What you\u0027re saying is that we should allow provider templates to span regions, but I that doesn\u0027t make a lot of conceptual sense to me. When would you want to override a local resource with something in another region? If for some strange reason that\u0027s what you need, the option is still open to you by creating an OS::Heat::Stack and use a provider resource within it.\n\nProvider stacks are currently quite tightly tied to their parent resource - e.g. they need to be able to retrieve the parent\u0027s metadata, deletion policy and update policy, so we would have to change the Heat API to pass those (which would not be a change for the better IMO). If the master region goes down, this also makes it a whole lot more complicated for the user to manage the remote stack directly with Heat, since now they have to pass all this extra data. At the very least it would significantly delay this feature which multiple users asked me about at Summit, and I think it has other undesirable side effects, for no real benefit at all afaict.\n\nI also agree with Clint that it will not be at all obvious to users that a setting that lives at the top level of a resource definition is, in fact, applicable to only one type of resource. (I also predict that plugin authors will start to make heavy use of it in ways they will later regret.)\n\nI disagree with him that we should be looking to add this support to more resource types over time. The reason we decided to limit this to Stack resources is not that we lack the technical capacity to do it for all kinds of resources (except those with WaitConditions), but because we can\u0027t do that and maintain the conceptual integrity of Heat. As a reminder: https://wiki.openstack.org/wiki/Heat/Blueprints/Multi_Region_Support_for_Heat/The_Missing_Diagram (we agreed 6 months ago on #2).","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"0c5b0ac0338ab3e885f3f95961d2f2bd7e99f009","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    if heatclient is None:"},{"line_number":248,"context_line":"        return {}"},{"line_number":249,"context_line":"    return {"},{"line_number":250,"context_line":"        \u0027OS::Heat::RemoteStack\u0027: RemoteNestedStack,"},{"line_number":251,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_7d714575","line":250,"in_reply_to":"1ae5cdf2_aa772639","updated":"2014-06-03 21:27:34.000000000","message":"OK, lets take the resource-provider approach off the table so that Bartosz has a clear direction - OS::Heat::Stack it is.","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"19b53d17219e07b858ef0126b3ad395ee52b7493","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    if heatclient is None:"},{"line_number":248,"context_line":"        return {}"},{"line_number":249,"context_line":"    return {"},{"line_number":250,"context_line":"        \u0027OS::Heat::RemoteStack\u0027: RemoteNestedStack,"},{"line_number":251,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_ddd5f91c","line":250,"in_reply_to":"1ae5cdf2_aa772639","updated":"2014-06-03 21:35:10.000000000","message":"Okay to sum up:\n\n1. OS::Heat::Stack\n\nI like this idea and also trying to handle either nested stack internally or a remote might be hard. So to keep it simple I will assume that we also use heatclient to create new stack for this type.\n\n2. Defining context on Resource class level\n\nI think Zane have a point here with resource-provider use case. Lets keep it simple.","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"441980c88a8f58ed6d993532fa25de9fba260161","unresolved":false,"context_lines":[{"line_number":247,"context_line":"    if heatclient is None:"},{"line_number":248,"context_line":"        return {}"},{"line_number":249,"context_line":"    return {"},{"line_number":250,"context_line":"        \u0027OS::Heat::RemoteStack\u0027: RemoteNestedStack,"},{"line_number":251,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_16d17bfb","line":250,"in_reply_to":"3ae8d1ca_854b5d86","updated":"2014-05-30 13:01:41.000000000","message":"+1 on just one OS::Heat::Stack if any possible.","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"b056ee0e83ceb684f254e0aea5c79bdc1b2c2f87","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from heat.openstack.common import log as logging"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"logger \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class RemoteStack(resource.Resource):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1ae5cdf2_73403207","line":30,"updated":"2014-06-06 09:05:27.000000000","message":"I think per a recent patch, all loggers are called LOG now.","commit_id":"33f2635fe97d966621c06758806ea2f34115549c"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"7644c2f59a4d4866ffb96f9b0b6bb3cf9c59b23c","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"from heat.openstack.common import log as logging"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"logger \u003d logging.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class RemoteStack(resource.Resource):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1ae5cdf2_13bd1703","line":30,"in_reply_to":"1ae5cdf2_73403207","updated":"2014-06-06 20:33:23.000000000","message":"Done","commit_id":"33f2635fe97d966621c06758806ea2f34115549c"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"b056ee0e83ceb684f254e0aea5c79bdc1b2c2f87","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class RemoteStack(resource.Resource):"},{"line_number":34,"context_line":"    \"\"\""},{"line_number":35,"context_line":"    A Resource representing a stack which can be creating using specified"},{"line_number":36,"context_line":"    context."},{"line_number":37,"context_line":"    \"\"\""},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1ae5cdf2_b3439a40","line":35,"updated":"2014-06-06 09:05:27.000000000","message":"typo: creating -\u003e created","commit_id":"33f2635fe97d966621c06758806ea2f34115549c"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"7644c2f59a4d4866ffb96f9b0b6bb3cf9c59b23c","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"class RemoteStack(resource.Resource):"},{"line_number":34,"context_line":"    \"\"\""},{"line_number":35,"context_line":"    A Resource representing a stack which can be creating using specified"},{"line_number":36,"context_line":"    context."},{"line_number":37,"context_line":"    \"\"\""},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"1ae5cdf2_33b5b331","line":35,"in_reply_to":"1ae5cdf2_b3439a40","updated":"2014-06-06 20:33:23.000000000","message":"Done","commit_id":"33f2635fe97d966621c06758806ea2f34115549c"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"b056ee0e83ceb684f254e0aea5c79bdc1b2c2f87","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        ),"},{"line_number":75,"context_line":"        TIMEOUT_IN_MINS: properties.Schema("},{"line_number":76,"context_line":"            properties.Schema.NUMBER,"},{"line_number":77,"context_line":"            _(\u0027The length of time, in minutes, to wait for the nested stack \u0027"},{"line_number":78,"context_line":"              \u0027creation.\u0027),"},{"line_number":79,"context_line":"            update_allowed\u003dTrue"},{"line_number":80,"context_line":"        ),"}],"source_content_type":"text/x-python","patch_set":14,"id":"1ae5cdf2_d36586e1","line":77,"updated":"2014-06-06 09:05:27.000000000","message":"Wording suggestion: \"The amount of time in minutes ...\"","commit_id":"33f2635fe97d966621c06758806ea2f34115549c"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"7644c2f59a4d4866ffb96f9b0b6bb3cf9c59b23c","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        ),"},{"line_number":75,"context_line":"        TIMEOUT_IN_MINS: properties.Schema("},{"line_number":76,"context_line":"            properties.Schema.NUMBER,"},{"line_number":77,"context_line":"            _(\u0027The length of time, in minutes, to wait for the nested stack \u0027"},{"line_number":78,"context_line":"              \u0027creation.\u0027),"},{"line_number":79,"context_line":"            update_allowed\u003dTrue"},{"line_number":80,"context_line":"        ),"}],"source_content_type":"text/x-python","patch_set":14,"id":"1ae5cdf2_f3634bdb","line":77,"in_reply_to":"1ae5cdf2_d36586e1","updated":"2014-06-06 20:33:23.000000000","message":"Done","commit_id":"33f2635fe97d966621c06758806ea2f34115549c"},{"author":{"_account_id":10556,"name":"Dimitri Mazmanov","email":"dimitri.mazmanov@ericsson.com","username":"edimmaz"},"change_message_id":"39db64cef59435f4bc85d1d832a917b983e5c0e5","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def handle_create(self):"},{"line_number":118,"context_line":"        try:"},{"line_number":119,"context_line":"            template_data \u003d urlfetch.get(self.properties[self.TEMPLATE_URL])"},{"line_number":120,"context_line":"        except (exceptions.RequestException, IOError) as r_exc:"},{"line_number":121,"context_line":"            raise ValueError(_(\"Could not fetch remote template \u0027%(url)s\u0027: \""},{"line_number":122,"context_line":"                             \"%(exc)s\") %"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ae5cdf2_74b99c78","line":119,"updated":"2014-06-10 08:20:57.000000000","message":"There was a proposal at the last summit to remove passing a template by url completely. Nobody complained. So I guess it will be removed.","commit_id":"0c09a6fd2343a5f9d456ecce7c03d0c241279591"},{"author":{"_account_id":7404,"name":"Ethan Lynn","email":"xuanlangjian@gmail.com","username":"GaryLynn"},"change_message_id":"8b2fd264750631d7210caefcc9e0be9489125dd1","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def handle_create(self):"},{"line_number":118,"context_line":"        try:"},{"line_number":119,"context_line":"            template_data \u003d urlfetch.get(self.properties[self.TEMPLATE_URL])"},{"line_number":120,"context_line":"        except (exceptions.RequestException, IOError) as r_exc:"},{"line_number":121,"context_line":"            raise ValueError(_(\"Could not fetch remote template \u0027%(url)s\u0027: \""},{"line_number":122,"context_line":"                             \"%(exc)s\") %"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ae5cdf2_22a9d624","line":119,"updated":"2014-06-07 18:21:09.000000000","message":"Why template can\u0027t be pass by file but only download from url?\n\nSince we can define some custom templates and put it in /etc/heat/templates.\n\nSo I think if we can pass template through file that would be better, just an advise ??","commit_id":"0c09a6fd2343a5f9d456ecce7c03d0c241279591"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"4c3ef2cb97bacc3e59ca663809caeb35b175655e","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def handle_create(self):"},{"line_number":118,"context_line":"        try:"},{"line_number":119,"context_line":"            template_data \u003d urlfetch.get(self.properties[self.TEMPLATE_URL])"},{"line_number":120,"context_line":"        except (exceptions.RequestException, IOError) as r_exc:"},{"line_number":121,"context_line":"            raise ValueError(_(\"Could not fetch remote template \u0027%(url)s\u0027: \""},{"line_number":122,"context_line":"                             \"%(exc)s\") %"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ae5cdf2_30e517dc","line":119,"in_reply_to":"1ae5cdf2_74b99c78","updated":"2014-06-11 20:24:40.000000000","message":"Done","commit_id":"0c09a6fd2343a5f9d456ecce7c03d0c241279591"},{"author":{"_account_id":10556,"name":"Dimitri Mazmanov","email":"dimitri.mazmanov@ericsson.com","username":"edimmaz"},"change_message_id":"39db64cef59435f4bc85d1d832a917b983e5c0e5","unresolved":false,"context_lines":[{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        if status \u003d\u003d \u0027DELETE_FAILED\u0027:"},{"line_number":207,"context_line":"            exc \u003d Exception(_(\u0027Remote stack deletion failed.\u0027))"},{"line_number":208,"context_line":"            raise exception.ResourceFailure(exc, self, self.action)"},{"line_number":209,"context_line":"        return status \u003d\u003d \u0027DELETE_COMPLETE\u0027"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def FnGetAtt(self, key):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ae5cdf2_7f12550a","line":208,"updated":"2014-06-10 08:20:57.000000000","message":"Looks like you missed setting resource_id to None","commit_id":"0c09a6fd2343a5f9d456ecce7c03d0c241279591"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"4c3ef2cb97bacc3e59ca663809caeb35b175655e","unresolved":false,"context_lines":[{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        if status \u003d\u003d \u0027DELETE_FAILED\u0027:"},{"line_number":207,"context_line":"            exc \u003d Exception(_(\u0027Remote stack deletion failed.\u0027))"},{"line_number":208,"context_line":"            raise exception.ResourceFailure(exc, self, self.action)"},{"line_number":209,"context_line":"        return status \u003d\u003d \u0027DELETE_COMPLETE\u0027"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def FnGetAtt(self, key):"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ae5cdf2_2fd13557","line":208,"in_reply_to":"1ae5cdf2_7f12550a","updated":"2014-06-11 20:24:40.000000000","message":"I think we do not need to unset it.","commit_id":"0c09a6fd2343a5f9d456ecce7c03d0c241279591"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"77713af88168053ddcf41b42188424922ed305a5","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            try:"},{"line_number":158,"context_line":"                self.heat().stacks.delete(stack_id\u003dself.resource_id)"},{"line_number":159,"context_line":"            except heat_exp.HTTPNotFound:"},{"line_number":160,"context_line":"                LOG.warn(_(\"Remote Stack %s already gone.\") % self.name)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _get_status(self):"},{"line_number":163,"context_line":"        stack \u003d self.heat().stacks.get(stack_id\u003dself.resource_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1ae5cdf2_80504133","line":160,"updated":"2014-06-12 14:33:16.000000000","message":"1. I feel this should be either debug or info message instead of \u0027warn\u0027\n\n2. Stack -- \u003e stack\n\n3. And also I would change something like \u0027Remote stack %s not found\u0027 or \u0027Remote stack %s already deleted\u0027","commit_id":"b5f36bf28993ec68621c238bd4e2f90f85d44bb8"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"fa41778a258bc766c196f1067f55d8412cc37aa9","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            try:"},{"line_number":158,"context_line":"                self.heat().stacks.delete(stack_id\u003dself.resource_id)"},{"line_number":159,"context_line":"            except heat_exp.HTTPNotFound:"},{"line_number":160,"context_line":"                LOG.warn(_(\"Remote Stack %s already gone.\") % self.name)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _get_status(self):"},{"line_number":163,"context_line":"        stack \u003d self.heat().stacks.get(stack_id\u003dself.resource_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1ae5cdf2_66234805","line":160,"in_reply_to":"1ae5cdf2_80504133","updated":"2014-06-12 17:39:37.000000000","message":"2 and 3 done. About 1 one I think it should be warn level","commit_id":"b5f36bf28993ec68621c238bd4e2f90f85d44bb8"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"77713af88168053ddcf41b42188424922ed305a5","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        status \u003d self._get_status()"},{"line_number":168,"context_line":"        if status \u003d\u003d \u0027CREATE_FAILED\u0027:"},{"line_number":169,"context_line":"            exc \u003d Exception(_(\u0027Remote stack creation failed.\u0027))"},{"line_number":170,"context_line":"            raise exception.ResourceFailure(exc, self, self.action)"},{"line_number":171,"context_line":"        return status \u003d\u003d \u0027CREATE_COMPLETE\u0027"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def check_update_complete(self, *args):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1ae5cdf2_0000b132","line":170,"updated":"2014-06-12 14:33:16.000000000","message":"similar to rest of  the resources, why not throw exception directly (instead of wrapping Exception in ResourceFailure exception)?  what ever exception thrown from here would be caught in Resource _do_action and throws \u0027ResourceFailure\u0027 exception.\n\nsomething like raise exception.Error(\u0027...\u0027)","commit_id":"b5f36bf28993ec68621c238bd4e2f90f85d44bb8"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"fa41778a258bc766c196f1067f55d8412cc37aa9","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        status \u003d self._get_status()"},{"line_number":168,"context_line":"        if status \u003d\u003d \u0027CREATE_FAILED\u0027:"},{"line_number":169,"context_line":"            exc \u003d Exception(_(\u0027Remote stack creation failed.\u0027))"},{"line_number":170,"context_line":"            raise exception.ResourceFailure(exc, self, self.action)"},{"line_number":171,"context_line":"        return status \u003d\u003d \u0027CREATE_COMPLETE\u0027"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def check_update_complete(self, *args):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1ae5cdf2_a642b0a8","line":170,"in_reply_to":"1ae5cdf2_0000b132","updated":"2014-06-12 17:39:37.000000000","message":"Done","commit_id":"b5f36bf28993ec68621c238bd4e2f90f85d44bb8"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"77713af88168053ddcf41b42188424922ed305a5","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        status \u003d self._get_status()"},{"line_number":175,"context_line":"        if status \u003d\u003d \u0027UPDATE_FAILED\u0027:"},{"line_number":176,"context_line":"            exc \u003d Exception(_(\u0027Remote stack update failed.\u0027))"},{"line_number":177,"context_line":"            raise exception.ResourceFailure(exc, self, self.action)"},{"line_number":178,"context_line":"        return status \u003d\u003d \u0027UPDATE_COMPLETE\u0027"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def check_delete_complete(self, *args):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1ae5cdf2_40f6395e","line":177,"updated":"2014-06-12 14:33:16.000000000","message":"same here.","commit_id":"b5f36bf28993ec68621c238bd4e2f90f85d44bb8"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"fa41778a258bc766c196f1067f55d8412cc37aa9","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        status \u003d self._get_status()"},{"line_number":175,"context_line":"        if status \u003d\u003d \u0027UPDATE_FAILED\u0027:"},{"line_number":176,"context_line":"            exc \u003d Exception(_(\u0027Remote stack update failed.\u0027))"},{"line_number":177,"context_line":"            raise exception.ResourceFailure(exc, self, self.action)"},{"line_number":178,"context_line":"        return status \u003d\u003d \u0027UPDATE_COMPLETE\u0027"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def check_delete_complete(self, *args):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1ae5cdf2_c6141ca2","line":177,"in_reply_to":"1ae5cdf2_40f6395e","updated":"2014-06-12 17:39:37.000000000","message":"Done","commit_id":"b5f36bf28993ec68621c238bd4e2f90f85d44bb8"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"77713af88168053ddcf41b42188424922ed305a5","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        if status \u003d\u003d \u0027DELETE_FAILED\u0027:"},{"line_number":190,"context_line":"            exc \u003d Exception(_(\u0027Remote stack deletion failed.\u0027))"},{"line_number":191,"context_line":"            raise exception.ResourceFailure(exc, self, self.action)"},{"line_number":192,"context_line":"        return status \u003d\u003d \u0027DELETE_COMPLETE\u0027"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def FnGetAtt(self, key):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1ae5cdf2_8305ab12","line":191,"updated":"2014-06-12 14:33:16.000000000","message":"same here... don\u0027t wrap exception","commit_id":"b5f36bf28993ec68621c238bd4e2f90f85d44bb8"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"fa41778a258bc766c196f1067f55d8412cc37aa9","unresolved":false,"context_lines":[{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        if status \u003d\u003d \u0027DELETE_FAILED\u0027:"},{"line_number":190,"context_line":"            exc \u003d Exception(_(\u0027Remote stack deletion failed.\u0027))"},{"line_number":191,"context_line":"            raise exception.ResourceFailure(exc, self, self.action)"},{"line_number":192,"context_line":"        return status \u003d\u003d \u0027DELETE_COMPLETE\u0027"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def FnGetAtt(self, key):"}],"source_content_type":"text/x-python","patch_set":17,"id":"1ae5cdf2_e61758a1","line":191,"in_reply_to":"1ae5cdf2_8305ab12","updated":"2014-06-12 17:39:37.000000000","message":"Done","commit_id":"b5f36bf28993ec68621c238bd4e2f90f85d44bb8"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"b43be449648a6006834c7efd2fd9cdb22d04d87a","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def handle_update(self, json_snippet, tmpl_diff, prop_diff):"},{"line_number":131,"context_line":"        if self.resource_id is not None and prop_diff \\"},{"line_number":132,"context_line":"           and self.CONTEXT not in prop_diff:"},{"line_number":133,"context_line":"            self.properties \u003d Properties(self.properties_schema,"},{"line_number":134,"context_line":"                                         json_snippet.get(\u0027Properties\u0027, {}),"},{"line_number":135,"context_line":"                                         function.resolve,"}],"source_content_type":"text/x-python","patch_set":18,"id":"1ae5cdf2_7892b84c","line":132,"updated":"2014-06-16 08:35:18.000000000","message":"1.May be it\u0027s better to use parenthesis instead of \u0027\\\u0027 here\n2.if the self.CONTEXT is in prop_diff, we can\u0027t go handle_update flow, due to the self.CONTEXT property isn\u0027t updatable. So no need to check whether the self.CONTEXT in prop_diff, if self.CONTEXT in prop_diff, it will go to the UpdateReplace flow automatically, right? Or I missed something?","commit_id":"8d5bbdbba1e1abb22fdd698e8b8c4824110329d9"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"cda70066806c7aaa016025010a67fb07f05f5418","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def handle_update(self, json_snippet, tmpl_diff, prop_diff):"},{"line_number":131,"context_line":"        if self.resource_id is not None and prop_diff \\"},{"line_number":132,"context_line":"           and self.CONTEXT not in prop_diff:"},{"line_number":133,"context_line":"            self.properties \u003d Properties(self.properties_schema,"},{"line_number":134,"context_line":"                                         json_snippet.get(\u0027Properties\u0027, {}),"},{"line_number":135,"context_line":"                                         function.resolve,"}],"source_content_type":"text/x-python","patch_set":18,"id":"1ae5cdf2_a0ca8b6b","line":132,"in_reply_to":"1ae5cdf2_7892b84c","updated":"2014-06-20 01:27:22.000000000","message":"Done","commit_id":"8d5bbdbba1e1abb22fdd698e8b8c4824110329d9"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"d6f67099c43cf366b7e19cd643f69bd40aee55d2","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        ),"},{"line_number":89,"context_line":"    }"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def __init__(self, name, json_snippet, stack):"},{"line_number":92,"context_line":"        super(RemoteStack, self).__init__(name, json_snippet, stack)"},{"line_number":93,"context_line":"        self.hc \u003d None"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_33d5261c","line":91,"updated":"2014-07-04 05:50:32.000000000","message":"I would suggest to rename \u0027json_snippet\u0027 to \u0027definition\u0027 -\u003e see Resource.__init__ after Zane\u0027s ResourceDefinition changes.\n\nNote that most (or all?) existing resources still use \u0027json_snippet\u0027 but I think new resources should use the new param name IMO.","commit_id":"987836de08ac603debb671a7e5534b3556e6e794"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"46c00334251ac20fd84a0a3483f7629031de7b2c","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        ),"},{"line_number":89,"context_line":"    }"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def __init__(self, name, json_snippet, stack):"},{"line_number":92,"context_line":"        super(RemoteStack, self).__init__(name, json_snippet, stack)"},{"line_number":93,"context_line":"        self.hc \u003d None"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_561b5ec9","line":91,"in_reply_to":"baada198_33d5261c","updated":"2014-07-04 15:38:02.000000000","message":"Done","commit_id":"987836de08ac603debb671a7e5534b3556e6e794"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"d6f67099c43cf366b7e19cd643f69bd40aee55d2","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            raise exception.InvalidTemplateAttribute(resource\u003dself.name,"},{"line_number":189,"context_line":"                                                     key\u003dkey)"},{"line_number":190,"context_line":"        stack \u003d self.heat().stacks.get(stack_id\u003dself.resource_id)"},{"line_number":191,"context_line":"        output_key \u003d key.partition(\u0027.\u0027)[-1]"},{"line_number":192,"context_line":"        for output in stack.outputs:"},{"line_number":193,"context_line":"            if output[\u0027output_key\u0027] \u003d\u003d output_key:"},{"line_number":194,"context_line":"                return output[\u0027output_value\u0027]"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_13a82276","line":191,"updated":"2014-07-04 05:50:32.000000000","message":"In HOT you would actually not use a dot-separated notation but get_attr allows for navigating thru complex attributes.\n\nSee: http://docs.openstack.org/developer/heat/template_guide/hot_spec.html#get-attr\n\nSo maybe we should not assume a dot notation here but stick to the get_attr calling convention? The bad thing is that I guess the feature we have in HOT\u0027s get_attr is not present for the CFN GetAtt function, so this would only work in HOT. So we would have two options:\n\n* OS::Heat:Stack only really works in HOT templates\n* We enhance the CFN GetAtt function to have the same power as HOT get_attr\n\nBoth seems ok with me and better than the dot notation.","commit_id":"987836de08ac603debb671a7e5534b3556e6e794"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"46c00334251ac20fd84a0a3483f7629031de7b2c","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            raise exception.InvalidTemplateAttribute(resource\u003dself.name,"},{"line_number":189,"context_line":"                                                     key\u003dkey)"},{"line_number":190,"context_line":"        stack \u003d self.heat().stacks.get(stack_id\u003dself.resource_id)"},{"line_number":191,"context_line":"        output_key \u003d key.partition(\u0027.\u0027)[-1]"},{"line_number":192,"context_line":"        for output in stack.outputs:"},{"line_number":193,"context_line":"            if output[\u0027output_key\u0027] \u003d\u003d output_key:"},{"line_number":194,"context_line":"                return output[\u0027output_value\u0027]"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_7662223f","line":191,"in_reply_to":"baada198_13a82276","updated":"2014-07-04 15:38:02.000000000","message":"I\u0027m ok with that OS::Heat::Stack works only in HOT templates so I will use HOT\u0027s get_attr","commit_id":"987836de08ac603debb671a7e5534b3556e6e794"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"f0e386a2d4ee22dcd218e63f812bbc961b1b2c53","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            \u0027stack_name\u0027: self.physical_resource_name(),"},{"line_number":120,"context_line":"            \u0027template\u0027: template,"},{"line_number":121,"context_line":"            \u0027timeout_mins\u0027: self.properties[self.TIMEOUT],"},{"line_number":122,"context_line":"            \u0027disable_rollback\u0027: True,"},{"line_number":123,"context_line":"            \u0027parameters\u0027: self.properties[self.PARAMETERS],"},{"line_number":124,"context_line":"            \u0027files\u0027: self.stack.t.files"},{"line_number":125,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":20,"id":"baada198_a771dba9","line":122,"updated":"2014-07-05 07:49:31.000000000","message":"why the disable_rollback is always true? should we get from the self.stack?","commit_id":"f154c560bb858ea8ed4522a569fce7e2ad1c9b6c"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"db9270ca755ca5be816df29b08aaa308c405e566","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            \u0027stack_name\u0027: self.physical_resource_name(),"},{"line_number":120,"context_line":"            \u0027template\u0027: template,"},{"line_number":121,"context_line":"            \u0027timeout_mins\u0027: self.properties[self.TIMEOUT],"},{"line_number":122,"context_line":"            \u0027disable_rollback\u0027: True,"},{"line_number":123,"context_line":"            \u0027parameters\u0027: self.properties[self.PARAMETERS],"},{"line_number":124,"context_line":"            \u0027files\u0027: self.stack.t.files"},{"line_number":125,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":20,"id":"baada198_919ebcb7","line":122,"in_reply_to":"baada198_a771dba9","updated":"2014-07-07 11:04:28.000000000","message":"Good catch. Done","commit_id":"f154c560bb858ea8ed4522a569fce7e2ad1c9b6c"},{"author":{"_account_id":4715,"name":"Angus Salkeld","email":"asalkeld@redhat.com","username":"asalkeld"},"change_message_id":"22d1f4876f00732777aa605441ebbcba85fe6ca5","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            \u0027timeout_mins\u0027: self.properties[self.TIMEOUT],"},{"line_number":122,"context_line":"            \u0027disable_rollback\u0027: True,"},{"line_number":123,"context_line":"            \u0027parameters\u0027: self.properties[self.PARAMETERS],"},{"line_number":124,"context_line":"            \u0027files\u0027: self.stack.t.files"},{"line_number":125,"context_line":"        }"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        remote_stack_id \u003d self.heat().stacks.create(**fields)[\u0027stack\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":20,"id":"baada198_76c13753","line":124,"updated":"2014-07-04 21:30:40.000000000","message":"what about the environment?\nhttps://github.com/openstack/heat/blob/master/heat/engine/stack_resource.py#L128","commit_id":"f154c560bb858ea8ed4522a569fce7e2ad1c9b6c"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"db9270ca755ca5be816df29b08aaa308c405e566","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            \u0027timeout_mins\u0027: self.properties[self.TIMEOUT],"},{"line_number":122,"context_line":"            \u0027disable_rollback\u0027: True,"},{"line_number":123,"context_line":"            \u0027parameters\u0027: self.properties[self.PARAMETERS],"},{"line_number":124,"context_line":"            \u0027files\u0027: self.stack.t.files"},{"line_number":125,"context_line":"        }"},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"        remote_stack_id \u003d self.heat().stacks.create(**fields)[\u0027stack\u0027][\u0027id\u0027]"}],"source_content_type":"text/x-python","patch_set":20,"id":"baada198_3194108a","line":124,"in_reply_to":"baada198_76c13753","updated":"2014-07-07 11:04:28.000000000","message":"Thank you for the review. Right now RemoteStack is not subclass of StackResource but just Resource. But may be it is good idea to change the parent class. I need to think about and test couple things. I will post new patch shortly.","commit_id":"f154c560bb858ea8ed4522a569fce7e2ad1c9b6c"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"f0e386a2d4ee22dcd218e63f812bbc961b1b2c53","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                \u0027stack_name\u0027: self.physical_resource_name(),"},{"line_number":139,"context_line":"                \u0027template\u0027: template,"},{"line_number":140,"context_line":"                \u0027timeout_mins\u0027: self.properties[self.TIMEOUT],"},{"line_number":141,"context_line":"                \u0027disable_rollback\u0027: True,"},{"line_number":142,"context_line":"                \u0027parameters\u0027: self.properties[self.PARAMETERS],"},{"line_number":143,"context_line":"                \u0027files\u0027: self.stack.t.files"},{"line_number":144,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":20,"id":"baada198_e76673ec","line":141,"updated":"2014-07-05 07:49:31.000000000","message":"ditto.","commit_id":"f154c560bb858ea8ed4522a569fce7e2ad1c9b6c"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"db9270ca755ca5be816df29b08aaa308c405e566","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                \u0027stack_name\u0027: self.physical_resource_name(),"},{"line_number":139,"context_line":"                \u0027template\u0027: template,"},{"line_number":140,"context_line":"                \u0027timeout_mins\u0027: self.properties[self.TIMEOUT],"},{"line_number":141,"context_line":"                \u0027disable_rollback\u0027: True,"},{"line_number":142,"context_line":"                \u0027parameters\u0027: self.properties[self.PARAMETERS],"},{"line_number":143,"context_line":"                \u0027files\u0027: self.stack.t.files"},{"line_number":144,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":20,"id":"baada198_b1a100fa","line":141,"in_reply_to":"baada198_e76673ec","updated":"2014-07-07 11:04:28.000000000","message":"Done","commit_id":"f154c560bb858ea8ed4522a569fce7e2ad1c9b6c"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"e73f5be07e1c2654a08bc0b30a170393aae398ac","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            try:"},{"line_number":139,"context_line":"                self.heat().stacks.delete(stack_id\u003dself.resource_id)"},{"line_number":140,"context_line":"            except heat_exp.HTTPNotFound:"},{"line_number":141,"context_line":"                LOG.warn(_(\"Remote stack %s already deleted.\") % self.name)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def handle_resume(self):"},{"line_number":144,"context_line":"        if self.resource_id is None:"}],"source_content_type":"text/x-python","patch_set":21,"id":"baada198_1762073d","line":141,"updated":"2014-07-24 03:54:35.000000000","message":"should finally set resource_id to None.","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"4742db4ab85882b2c2219edcaf3e38cd30938f82","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            try:"},{"line_number":139,"context_line":"                self.heat().stacks.delete(stack_id\u003dself.resource_id)"},{"line_number":140,"context_line":"            except heat_exp.HTTPNotFound:"},{"line_number":141,"context_line":"                LOG.warn(_(\"Remote stack %s already deleted.\") % self.name)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def handle_resume(self):"},{"line_number":144,"context_line":"        if self.resource_id is None:"}],"source_content_type":"text/x-python","patch_set":21,"id":"baada198_9d7ab1b8","line":141,"in_reply_to":"baada198_1762073d","updated":"2014-08-28 15:06:51.000000000","message":"I disagree because then handle_delete will immediately return with true without even checking the actual remote stack state.\n\nI consider a few case:\n\n1. Successful delete - handle_delete get status DELETE_COMPLETE and sets resource_id to None\n\n2. Not found - handle_delete catches exception NotFound and also sets resource_id to None\n\n3. Delete Failed - handle_delete gets status DELETE_FAILED and then we want to keep actual resource_id to be able to retry","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":4715,"name":"Angus Salkeld","email":"asalkeld@redhat.com","username":"asalkeld"},"change_message_id":"8cdf5419077acb7e63ddd0f12c5f61553ab51b0c","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            try:"},{"line_number":139,"context_line":"                self.heat().stacks.delete(stack_id\u003dself.resource_id)"},{"line_number":140,"context_line":"            except heat_exp.HTTPNotFound:"},{"line_number":141,"context_line":"                LOG.warn(_(\"Remote stack %s already deleted.\") % self.name)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def handle_resume(self):"},{"line_number":144,"context_line":"        if self.resource_id is None:"}],"source_content_type":"text/x-python","patch_set":21,"id":"baada198_f22841f0","line":141,"in_reply_to":"baada198_1762073d","updated":"2014-07-31 12:00:56.000000000","message":"agree should really do that.","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"9e866e85d24529fe11d78ebfe9b59318e35b10c3","unresolved":false,"context_lines":[{"line_number":138,"context_line":"            try:"},{"line_number":139,"context_line":"                self.heat().stacks.delete(stack_id\u003dself.resource_id)"},{"line_number":140,"context_line":"            except heat_exp.HTTPNotFound:"},{"line_number":141,"context_line":"                LOG.warn(_(\"Remote stack %s already deleted.\") % self.name)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def handle_resume(self):"},{"line_number":144,"context_line":"        if self.resource_id is None:"}],"source_content_type":"text/x-python","patch_set":21,"id":"1abeadc6_a4ce4781","line":141,"in_reply_to":"baada198_f22841f0","updated":"2014-08-28 16:49:50.000000000","message":"We discussed this a bit at the meetup... basically once a resource goes into the state DELETE_COMPLETE we will never try to delete it again. So there\u0027s no reason as far as anyone knows to _ever_ set the resource_id to None, and in fact it\u0027s somewhat unhelpful to anyone who needs to do debugging later.","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"e73f5be07e1c2654a08bc0b30a170393aae398ac","unresolved":false,"context_lines":[{"line_number":178,"context_line":"    def check_create_complete(self, *args):"},{"line_number":179,"context_line":"        status \u003d self._get_status()"},{"line_number":180,"context_line":"        if status \u003d\u003d \u0027CREATE_FAILED\u0027:"},{"line_number":181,"context_line":"            raise exception.Error(_(\u0027Remote stack creation failed.\u0027))"},{"line_number":182,"context_line":"        return status \u003d\u003d \u0027CREATE_COMPLETE\u0027"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def check_delete_complete(self, *args):"}],"source_content_type":"text/x-python","patch_set":21,"id":"baada198_d2b25d48","line":181,"updated":"2014-07-24 03:54:35.000000000","message":"The patch should depends on the following:\nhttps://review.openstack.org/#/c/102394/","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"4742db4ab85882b2c2219edcaf3e38cd30938f82","unresolved":false,"context_lines":[{"line_number":178,"context_line":"    def check_create_complete(self, *args):"},{"line_number":179,"context_line":"        status \u003d self._get_status()"},{"line_number":180,"context_line":"        if status \u003d\u003d \u0027CREATE_FAILED\u0027:"},{"line_number":181,"context_line":"            raise exception.Error(_(\u0027Remote stack creation failed.\u0027))"},{"line_number":182,"context_line":"        return status \u003d\u003d \u0027CREATE_COMPLETE\u0027"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def check_delete_complete(self, *args):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1abeadc6_7bd3575f","line":181,"in_reply_to":"baada198_5d049918","updated":"2014-08-28 15:06:51.000000000","message":"Done","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":4715,"name":"Angus Salkeld","email":"asalkeld@redhat.com","username":"asalkeld"},"change_message_id":"8cdf5419077acb7e63ddd0f12c5f61553ab51b0c","unresolved":false,"context_lines":[{"line_number":178,"context_line":"    def check_create_complete(self, *args):"},{"line_number":179,"context_line":"        status \u003d self._get_status()"},{"line_number":180,"context_line":"        if status \u003d\u003d \u0027CREATE_FAILED\u0027:"},{"line_number":181,"context_line":"            raise exception.Error(_(\u0027Remote stack creation failed.\u0027))"},{"line_number":182,"context_line":"        return status \u003d\u003d \u0027CREATE_COMPLETE\u0027"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def check_delete_complete(self, *args):"}],"source_content_type":"text/x-python","patch_set":21,"id":"baada198_f20f6189","line":181,"in_reply_to":"baada198_d2b25d48","updated":"2014-07-31 12:00:56.000000000","message":"not really, just depends who gets in first.","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"47f450d37ad2bf7c532d3602cae82627ced3dfc2","unresolved":false,"context_lines":[{"line_number":178,"context_line":"    def check_create_complete(self, *args):"},{"line_number":179,"context_line":"        status \u003d self._get_status()"},{"line_number":180,"context_line":"        if status \u003d\u003d \u0027CREATE_FAILED\u0027:"},{"line_number":181,"context_line":"            raise exception.Error(_(\u0027Remote stack creation failed.\u0027))"},{"line_number":182,"context_line":"        return status \u003d\u003d \u0027CREATE_COMPLETE\u0027"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def check_delete_complete(self, *args):"}],"source_content_type":"text/x-python","patch_set":21,"id":"baada198_5d049918","line":181,"in_reply_to":"baada198_f20f6189","updated":"2014-07-31 15:19:19.000000000","message":"@Angus Salkeld, I suggest this patch should depend on 102394, because here we should raise Exceptions ResourceInError, ResourceUnknownStatus to uniform with 102394, otherwise this patch will be merged without conflict, but here will be raise exception.Error, right?","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"e73f5be07e1c2654a08bc0b30a170393aae398ac","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            return True"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        if status \u003d\u003d \u0027DELETE_FAILED\u0027:"},{"line_number":194,"context_line":"            raise exception.Error(_(\u0027Remote stack deletion failed.\u0027))"},{"line_number":195,"context_line":"        return status \u003d\u003d \u0027DELETE_COMPLETE\u0027"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def check_resume_complete(self, *args):"}],"source_content_type":"text/x-python","patch_set":21,"id":"baada198_f280414b","line":194,"updated":"2014-07-24 03:54:35.000000000","message":"ditto","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"4742db4ab85882b2c2219edcaf3e38cd30938f82","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            return True"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        if status \u003d\u003d \u0027DELETE_FAILED\u0027:"},{"line_number":194,"context_line":"            raise exception.Error(_(\u0027Remote stack deletion failed.\u0027))"},{"line_number":195,"context_line":"        return status \u003d\u003d \u0027DELETE_COMPLETE\u0027"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def check_resume_complete(self, *args):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1abeadc6_503e118c","line":194,"in_reply_to":"baada198_f280414b","updated":"2014-08-28 15:06:51.000000000","message":"Done","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"e73f5be07e1c2654a08bc0b30a170393aae398ac","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    def check_resume_complete(self, *args):"},{"line_number":198,"context_line":"        status \u003d self._get_status()"},{"line_number":199,"context_line":"        if status \u003d\u003d \u0027RESUME_FAILED\u0027:"},{"line_number":200,"context_line":"            raise exception.Error(_(\u0027Remote stack resume failed.\u0027))"},{"line_number":201,"context_line":"        return status \u003d\u003d \u0027RESUME_COMPLETE\u0027"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def check_suspend_complete(self, *args):"}],"source_content_type":"text/x-python","patch_set":21,"id":"baada198_1284d55b","line":200,"updated":"2014-07-24 03:54:35.000000000","message":"ditto","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"4742db4ab85882b2c2219edcaf3e38cd30938f82","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    def check_resume_complete(self, *args):"},{"line_number":198,"context_line":"        status \u003d self._get_status()"},{"line_number":199,"context_line":"        if status \u003d\u003d \u0027RESUME_FAILED\u0027:"},{"line_number":200,"context_line":"            raise exception.Error(_(\u0027Remote stack resume failed.\u0027))"},{"line_number":201,"context_line":"        return status \u003d\u003d \u0027RESUME_COMPLETE\u0027"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def check_suspend_complete(self, *args):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1abeadc6_70430d13","line":200,"in_reply_to":"baada198_1284d55b","updated":"2014-08-28 15:06:51.000000000","message":"Done","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"e73f5be07e1c2654a08bc0b30a170393aae398ac","unresolved":false,"context_lines":[{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def check_suspend_complete(self, *args):"},{"line_number":204,"context_line":"        status \u003d self._get_status()"},{"line_number":205,"context_line":"        if status \u003d\u003d \u0027SUSPEND_FAILED\u0027:"},{"line_number":206,"context_line":"            raise exception.Error(_(\u0027Remote stack suspend failed.\u0027))"},{"line_number":207,"context_line":"        return status \u003d\u003d \u0027SUSPEND_COMPLETE\u0027"},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"baada198_327b997c","line":205,"updated":"2014-07-24 03:54:35.000000000","message":"ditto","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"4742db4ab85882b2c2219edcaf3e38cd30938f82","unresolved":false,"context_lines":[{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def check_suspend_complete(self, *args):"},{"line_number":204,"context_line":"        status \u003d self._get_status()"},{"line_number":205,"context_line":"        if status \u003d\u003d \u0027SUSPEND_FAILED\u0027:"},{"line_number":206,"context_line":"            raise exception.Error(_(\u0027Remote stack suspend failed.\u0027))"},{"line_number":207,"context_line":"        return status \u003d\u003d \u0027SUSPEND_COMPLETE\u0027"},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"1abeadc6_904b492a","line":205,"in_reply_to":"baada198_327b997c","updated":"2014-08-28 15:06:51.000000000","message":"Done","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"e73f5be07e1c2654a08bc0b30a170393aae398ac","unresolved":false,"context_lines":[{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def check_update_complete(self, *args):"},{"line_number":210,"context_line":"        status \u003d self._get_status()"},{"line_number":211,"context_line":"        if status \u003d\u003d \u0027UPDATE_FAILED\u0027:"},{"line_number":212,"context_line":"            raise exception.Error(_(\u0027Remote stack update failed.\u0027))"},{"line_number":213,"context_line":"        return status \u003d\u003d \u0027UPDATE_COMPLETE\u0027"},{"line_number":214,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"baada198_527e4d6b","line":211,"updated":"2014-07-24 03:54:35.000000000","message":"ditto","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"4742db4ab85882b2c2219edcaf3e38cd30938f82","unresolved":false,"context_lines":[{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def check_update_complete(self, *args):"},{"line_number":210,"context_line":"        status \u003d self._get_status()"},{"line_number":211,"context_line":"        if status \u003d\u003d \u0027UPDATE_FAILED\u0027:"},{"line_number":212,"context_line":"            raise exception.Error(_(\u0027Remote stack update failed.\u0027))"},{"line_number":213,"context_line":"        return status \u003d\u003d \u0027UPDATE_COMPLETE\u0027"},{"line_number":214,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"1abeadc6_d05141da","line":211,"in_reply_to":"baada198_527e4d6b","updated":"2014-08-28 15:06:51.000000000","message":"Done","commit_id":"858d3c849d877a803ddb1644603fc9966c7499ae"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"4a394e60ca36e4897b119cfdbad3e4dabd441050","unresolved":false,"context_lines":[{"line_number":29,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class RemoteStack(stack_resource.StackResource):"},{"line_number":33,"context_line":"    \"\"\""},{"line_number":34,"context_line":"    A Resource representing a stack which can be created using specified"},{"line_number":35,"context_line":"    context."}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_c49343a1","line":32,"updated":"2014-08-28 16:50:45.000000000","message":"I\u0027m surprised that this inherits from StackResource, given that it is more like an ordinary resource than a nested stack. Is this just in order to inherit _nested_environment()? Because I think that function is just declared in the wrong place (it should be moved to the environment module).\n\nI think we are inheriting stuff here, like handle_check(), that we really don\u0027t want.","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"17cad6dd16dc85ca8024a8dcd09a22f7c388e5aa","unresolved":false,"context_lines":[{"line_number":29,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class RemoteStack(stack_resource.StackResource):"},{"line_number":33,"context_line":"    \"\"\""},{"line_number":34,"context_line":"    A Resource representing a stack which can be created using specified"},{"line_number":35,"context_line":"    context."}],"source_content_type":"text/x-python","patch_set":23,"id":"5a890539_6bd47d47","line":32,"in_reply_to":"1abeadc6_c49343a1","updated":"2014-11-12 04:43:06.000000000","message":"Done","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"9ca6e8a465d08307dbe08c68388114910e1b6956","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            required\u003dTrue,"},{"line_number":72,"context_line":"            update_allowed\u003dTrue"},{"line_number":73,"context_line":"        ),"},{"line_number":74,"context_line":"        TIMEOUT: properties.Schema("},{"line_number":75,"context_line":"            properties.Schema.NUMBER,"},{"line_number":76,"context_line":"            _(\u0027Number of minutes to wait for this stack creation.\u0027),"},{"line_number":77,"context_line":"            update_allowed\u003dTrue"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_315c207d","line":74,"updated":"2014-08-29 04:25:16.000000000","message":"Why Timeout is defined in properties, but disable_rollback is not defined here?","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"82e46479f61d567faa34be258012e6f248cae553","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    }"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    attributes_schema \u003d {"},{"line_number":88,"context_line":"        NAME_ATTR: attributes.Schema("},{"line_number":89,"context_line":"            _(\u0027Name of the stack.\u0027)"},{"line_number":90,"context_line":"        ),"},{"line_number":91,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_4b3e2eb9","line":88,"updated":"2014-08-29 14:47:36.000000000","message":"The \u0027outputs\u0027 attribute should also be listed in the schema.","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"17cad6dd16dc85ca8024a8dcd09a22f7c388e5aa","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    }"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    attributes_schema \u003d {"},{"line_number":88,"context_line":"        NAME_ATTR: attributes.Schema("},{"line_number":89,"context_line":"            _(\u0027Name of the stack.\u0027)"},{"line_number":90,"context_line":"        ),"},{"line_number":91,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a890539_4bd18156","line":88,"in_reply_to":"1abeadc6_4b3e2eb9","updated":"2014-11-12 04:43:06.000000000","message":"Done","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"9ca6e8a465d08307dbe08c68388114910e1b6956","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            \u0027files\u0027: self.stack.t.files,"},{"line_number":133,"context_line":"            \u0027environment\u0027: env,"},{"line_number":134,"context_line":"        }"},{"line_number":135,"context_line":"        remote_stack_id \u003d self.heat().stacks.create(**fields)[\u0027stack\u0027][\u0027id\u0027]"},{"line_number":136,"context_line":"        self.resource_id_set(remote_stack_id)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def handle_delete(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_1f81ebfa","line":135,"updated":"2014-08-29 04:25:16.000000000","message":"I test to create this resource,but failed, because the stack_name is none, here your stack_name is the resource.id, but the resource.id is none now.\nPlease see:\nhttp://paste.openstack.org/show/102202/","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"17cad6dd16dc85ca8024a8dcd09a22f7c388e5aa","unresolved":false,"context_lines":[{"line_number":132,"context_line":"            \u0027files\u0027: self.stack.t.files,"},{"line_number":133,"context_line":"            \u0027environment\u0027: env,"},{"line_number":134,"context_line":"        }"},{"line_number":135,"context_line":"        remote_stack_id \u003d self.heat().stacks.create(**fields)[\u0027stack\u0027][\u0027id\u0027]"},{"line_number":136,"context_line":"        self.resource_id_set(remote_stack_id)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def handle_delete(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a890539_ab802547","line":135,"in_reply_to":"1abeadc6_1f81ebfa","updated":"2014-11-12 04:43:06.000000000","message":"Done","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"9ca6e8a465d08307dbe08c68388114910e1b6956","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                self.heat().stacks.delete(stack_id\u003dself.resource_id)"},{"line_number":142,"context_line":"            except heat_exp.HTTPNotFound:"},{"line_number":143,"context_line":"                LOG.warn(_(\"Remote stack %s already deleted.\") % self.name)"},{"line_number":144,"context_line":"                self.resource_id \u003d None"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def handle_resume(self):"},{"line_number":147,"context_line":"        if self.resource_id is None:"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_4cef4887","line":144,"updated":"2014-08-29 04:25:16.000000000","message":"1.According the patch:\n  https://review.openstack.org/#/c/115285/\n  So no need to set the resource_id to None\n2.line142-144, use ignore_not_found for uniform:\n  except Exception as e:\n      self.client_plugin(\u0027heat\u0027).ignore_not_found(e)","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"17cad6dd16dc85ca8024a8dcd09a22f7c388e5aa","unresolved":false,"context_lines":[{"line_number":141,"context_line":"                self.heat().stacks.delete(stack_id\u003dself.resource_id)"},{"line_number":142,"context_line":"            except heat_exp.HTTPNotFound:"},{"line_number":143,"context_line":"                LOG.warn(_(\"Remote stack %s already deleted.\") % self.name)"},{"line_number":144,"context_line":"                self.resource_id \u003d None"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    def handle_resume(self):"},{"line_number":147,"context_line":"        if self.resource_id is None:"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a890539_8b7d2971","line":144,"in_reply_to":"1abeadc6_4cef4887","updated":"2014-11-12 04:43:06.000000000","message":"Done","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":11034,"name":"Yanyan Hu","email":"huyanyan84@gmail.com","username":"yanyanhu"},"change_message_id":"03dbf0d53e0b8aa2147f14a7bd8cbb4b5eedf0de","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                \u0027environment\u0027: env,"},{"line_number":174,"context_line":"            }"},{"line_number":175,"context_line":"            self.heat().stacks.update(**fields)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def _get_status_and_reason(self):"},{"line_number":178,"context_line":"        stack \u003d self.heat().stacks.get(stack_id\u003dself.resource_id)"},{"line_number":179,"context_line":"        return stack.stack_status, stack.status_reason"}],"source_content_type":"text/x-python","patch_set":23,"id":"fa98f980_269a9263","line":176,"updated":"2014-09-10 06:30:56.000000000","message":"Should be self.heat().stacks.update(stack_id\u003dself.resource_id, **fields) here?","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"17cad6dd16dc85ca8024a8dcd09a22f7c388e5aa","unresolved":false,"context_lines":[{"line_number":173,"context_line":"                \u0027environment\u0027: env,"},{"line_number":174,"context_line":"            }"},{"line_number":175,"context_line":"            self.heat().stacks.update(**fields)"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    def _get_status_and_reason(self):"},{"line_number":178,"context_line":"        stack \u003d self.heat().stacks.get(stack_id\u003dself.resource_id)"},{"line_number":179,"context_line":"        return stack.stack_status, stack.status_reason"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a890539_2be35534","line":176,"in_reply_to":"fa98f980_269a9263","updated":"2014-11-12 04:43:06.000000000","message":"Done","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"9ca6e8a465d08307dbe08c68388114910e1b6956","unresolved":false,"context_lines":[{"line_number":187,"context_line":"        elif status \u003d\u003d \u0027{action}_FAILED\u0027.format(action\u003daction):"},{"line_number":188,"context_line":"            raise resource.ResourceInError(resource_status\u003dstatus,"},{"line_number":189,"context_line":"                                           status_reason\u003dreason)"},{"line_number":190,"context_line":"        raise resource.ResourceUnknownStatus(resource_status\u003dstatus,"},{"line_number":191,"context_line":"                                             status_reason\u003dreason)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def check_create_complete(self, *args):"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_1408f226","line":190,"updated":"2014-08-29 04:25:16.000000000","message":"How about ROLLBACK_IN_PROGRESS and ROLLBACK_COMPLETED?","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"9ca6e8a465d08307dbe08c68388114910e1b6956","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        try:"},{"line_number":201,"context_line":"            is_completed \u003d self._check_action_complete(action\u003d\u0027DELETE\u0027)"},{"line_number":202,"context_line":"        except heat_exp.HTTPNotFound:"},{"line_number":203,"context_line":"            self.resource_id \u003d None"},{"line_number":204,"context_line":"            return True"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        if is_completed:"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_14563206","line":203,"updated":"2014-08-29 04:25:16.000000000","message":"See comment in line144.","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"17cad6dd16dc85ca8024a8dcd09a22f7c388e5aa","unresolved":false,"context_lines":[{"line_number":200,"context_line":"        try:"},{"line_number":201,"context_line":"            is_completed \u003d self._check_action_complete(action\u003d\u0027DELETE\u0027)"},{"line_number":202,"context_line":"        except heat_exp.HTTPNotFound:"},{"line_number":203,"context_line":"            self.resource_id \u003d None"},{"line_number":204,"context_line":"            return True"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        if is_completed:"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a890539_0be8590f","line":203,"in_reply_to":"1abeadc6_14563206","updated":"2014-11-12 04:43:06.000000000","message":"Done","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"9ca6e8a465d08307dbe08c68388114910e1b6956","unresolved":false,"context_lines":[{"line_number":204,"context_line":"            return True"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        if is_completed:"},{"line_number":207,"context_line":"            self.resource_id \u003d None"},{"line_number":208,"context_line":"        return is_completed"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def check_resume_complete(self, *args):"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_546a6ab3","line":207,"updated":"2014-08-29 04:25:16.000000000","message":"delete this two lines.","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"17cad6dd16dc85ca8024a8dcd09a22f7c388e5aa","unresolved":false,"context_lines":[{"line_number":204,"context_line":"            return True"},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"        if is_completed:"},{"line_number":207,"context_line":"            self.resource_id \u003d None"},{"line_number":208,"context_line":"        return is_completed"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def check_resume_complete(self, *args):"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a890539_ebd86d81","line":207,"in_reply_to":"1abeadc6_546a6ab3","updated":"2014-11-12 04:43:06.000000000","message":"Done","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"9ca6e8a465d08307dbe08c68388114910e1b6956","unresolved":false,"context_lines":[{"line_number":216,"context_line":"    def check_update_complete(self, *args):"},{"line_number":217,"context_line":"        return self._check_action_complete(action\u003d\u0027UPDATE\u0027)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def FnGetAtt(self, key):"},{"line_number":220,"context_line":"        if key in self.ATTRIBUTES:"},{"line_number":221,"context_line":"            stack \u003d self.heat().stacks.get(stack_id\u003dself.resource_id)"},{"line_number":222,"context_line":"            return getattr(stack, key, None)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_9fab3b74","line":219,"updated":"2014-08-29 04:25:16.000000000","message":"missing *path parameter, I\u0027m not sure whether this is ok.","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"17cad6dd16dc85ca8024a8dcd09a22f7c388e5aa","unresolved":false,"context_lines":[{"line_number":216,"context_line":"    def check_update_complete(self, *args):"},{"line_number":217,"context_line":"        return self._check_action_complete(action\u003d\u0027UPDATE\u0027)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def FnGetAtt(self, key):"},{"line_number":220,"context_line":"        if key in self.ATTRIBUTES:"},{"line_number":221,"context_line":"            stack \u003d self.heat().stacks.get(stack_id\u003dself.resource_id)"},{"line_number":222,"context_line":"            return getattr(stack, key, None)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a890539_abce65b2","line":219,"in_reply_to":"1abeadc6_2b3c92c7","updated":"2014-11-12 04:43:06.000000000","message":"Done","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"17cad6dd16dc85ca8024a8dcd09a22f7c388e5aa","unresolved":false,"context_lines":[{"line_number":216,"context_line":"    def check_update_complete(self, *args):"},{"line_number":217,"context_line":"        return self._check_action_complete(action\u003d\u0027UPDATE\u0027)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def FnGetAtt(self, key):"},{"line_number":220,"context_line":"        if key in self.ATTRIBUTES:"},{"line_number":221,"context_line":"            stack \u003d self.heat().stacks.get(stack_id\u003dself.resource_id)"},{"line_number":222,"context_line":"            return getattr(stack, key, None)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a890539_8bcb69a4","line":219,"in_reply_to":"1abeadc6_9fab3b74","updated":"2014-11-12 04:43:06.000000000","message":"Done","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":4257,"name":"Zane Bitter","email":"zbitter@redhat.com","username":"zaneb"},"change_message_id":"82e46479f61d567faa34be258012e6f248cae553","unresolved":false,"context_lines":[{"line_number":216,"context_line":"    def check_update_complete(self, *args):"},{"line_number":217,"context_line":"        return self._check_action_complete(action\u003d\u0027UPDATE\u0027)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def FnGetAtt(self, key):"},{"line_number":220,"context_line":"        if key in self.ATTRIBUTES:"},{"line_number":221,"context_line":"            stack \u003d self.heat().stacks.get(stack_id\u003dself.resource_id)"},{"line_number":222,"context_line":"            return getattr(stack, key, None)"}],"source_content_type":"text/x-python","patch_set":23,"id":"1abeadc6_2b3c92c7","line":219,"in_reply_to":"1abeadc6_9fab3b74","updated":"2014-08-29 14:47:36.000000000","message":"Good catch. Two options here:\n\n- Add a *path parameter and then do\n\n  return attributes.select_from_attribute(prev_return_value, path)\n\n(see eca6faa83e13a43546f7533b52e0fd3071fd97d4)\n\n- (better) Add \u0027outputs\u0027 to the attributes_schema and then override _resolve_attribute() instead of overriding FnGetAtt().","commit_id":"dcf58de41a776137112a8e4b0a9c59d597d0475c"},{"author":{"_account_id":7404,"name":"Ethan Lynn","email":"xuanlangjian@gmail.com","username":"GaryLynn"},"change_message_id":"b1c01027faebe284e8ebbf9d897686a06cb12823","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            try:"},{"line_number":147,"context_line":"                self.heat().stacks.delete(stack_id\u003dself.resource_id)"},{"line_number":148,"context_line":"            except heat_exp.HTTPNotFound:"},{"line_number":149,"context_line":"                LOG.warn(_LW(\"Remote stack %s already deleted.\") % self.name)"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    def handle_resume(self):"},{"line_number":152,"context_line":"        if self.resource_id is None:"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a890539_a223fa03","line":149,"updated":"2014-11-11 15:09:26.000000000","message":"As address by http://docs.openstack.org/developer/oslo.i18n/guidelines.html\n, should be better using \u0027,\u0027 instead of \u0027%\u0027","commit_id":"6073eb1da6ffbfcda81dc4d20675838654ff300d"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"7a94af603cd8dc6946b4bc9bad1fc419377391e9","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        registry \u003d self.stack.env.registry"},{"line_number":130,"context_line":"        env \u003d environment.get_custom_environment(registry, params)"},{"line_number":131,"context_line":"        fields \u003d {"},{"line_number":132,"context_line":"            \u0027stack_name\u0027: self.physical_resource_name() or self.name,"},{"line_number":133,"context_line":"            \u0027template\u0027: self.child_template(),"},{"line_number":134,"context_line":"            \u0027timeout_mins\u0027: self.properties[self.TIMEOUT],"},{"line_number":135,"context_line":"            \u0027disable_rollback\u0027: True,"}],"source_content_type":"text/x-python","patch_set":30,"id":"5a890539_e62cfb04","line":132,"updated":"2014-11-13 10:15:04.000000000","message":"you can use self.physical_resource_name_or_FnGetRefId() here.","commit_id":"2b547fc9dc872d7ae3b956fe17e453ce8030f6a2"},{"author":{"_account_id":7761,"name":"Jun Jie Nan","email":"nanjunjie@gmail.com","username":"nanjj"},"change_message_id":"6f30bd9723322b8166ace179632924d3e660ad99","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        args \u003d {"},{"line_number":112,"context_line":"            \u0027auth_url\u0027: kc.context.auth_url,"},{"line_number":113,"context_line":"            \u0027username\u0027: kc.context.username,"},{"line_number":114,"context_line":"            \u0027token\u0027: kc.auth_token,"},{"line_number":115,"context_line":"        }"},{"line_number":116,"context_line":"        endpoint \u003d kc.url_for(service_type\u003d\u0027orchestration\u0027,"},{"line_number":117,"context_line":"                              region_name\u003dself._get_region_name())"}],"source_content_type":"text/x-python","patch_set":31,"id":"5a890539_85f7848a","line":114,"updated":"2014-11-14 09:31:52.000000000","message":"suggest to add:\n\u0027region_name\u0027: self._get_region_name(),\n\nSo the remote heat service have no need to configure the default services region.","commit_id":"09a9d4e978e83787628a6e18be2445ab5b2f917b"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"62cbd6cb9b321c6371590be4f5a5dc293da7e088","unresolved":false,"context_lines":[{"line_number":66,"context_line":"            }"},{"line_number":67,"context_line":"        ),"},{"line_number":68,"context_line":"        TEMPLATE: properties.Schema("},{"line_number":69,"context_line":"            properties.Schema.STRING,"},{"line_number":70,"context_line":"            _(\u0027Template that specifies the stack to be created as \u0027"},{"line_number":71,"context_line":"              \u0027a resource.\u0027),"},{"line_number":72,"context_line":"            required\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":34,"id":"5a890539_7bc3d437","line":69,"updated":"2014-11-17 20:33:06.000000000","message":"It would be nice if authors could also define an inline template as a MAP rather than STRING, but I can\u0027t see a way of doing that without defining an additional MAP property","commit_id":"02e69c14ab285692048b5bd39af909f35618cd9c"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"62cbd6cb9b321c6371590be4f5a5dc293da7e088","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    def __init__(self, name, definition, stack):"},{"line_number":98,"context_line":"        super(RemoteStack, self).__init__(name, definition, stack)"},{"line_number":99,"context_line":"        self.hc \u003d None"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    def _get_region_name(self):"},{"line_number":102,"context_line":"        ctx_props \u003d self.properties.get(self.CONTEXT)"},{"line_number":103,"context_line":"        if ctx_props:"}],"source_content_type":"text/x-python","patch_set":34,"id":"5a890539_0026dd67","line":100,"updated":"2014-11-17 20:33:06.000000000","message":"Implementing a validate which makes a heat API validate call would be useful.","commit_id":"02e69c14ab285692048b5bd39af909f35618cd9c"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"62cbd6cb9b321c6371590be4f5a5dc293da7e088","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        if ctx_props:"},{"line_number":104,"context_line":"            return ctx_props[self.REGION_NAME]"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def heat(self):"},{"line_number":107,"context_line":"        if self.hc:"},{"line_number":108,"context_line":"            return self.hc"},{"line_number":109,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"5a890539_60cc018a","line":106,"updated":"2014-11-17 20:33:06.000000000","message":"Rather than creating a heat client directly I would prefer a new RequestContext is created with the different region, and that context is used to create a new heat_plugin.HeatClientPlugin. This could also be used for the ignore_not_found calls too.","commit_id":"02e69c14ab285692048b5bd39af909f35618cd9c"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"5ab3330a6e79063c81c539b35a0a2f97698222db","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        super(RemoteStack, self).validate()"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            self.heat()"},{"line_number":126,"context_line":"        except Exception as ex:"},{"line_number":127,"context_line":"            exc_info \u003d dict(region\u003dself._region_name, exc\u003dsix.text_type(ex))"},{"line_number":128,"context_line":"            msg \u003d _(\u0027Cannot establish connection to Heat endpoint at region \u0027"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a961159_a4b85ae6","line":125,"updated":"2014-12-09 11:11:44.000000000","message":"Is checking availability of the remote Heat endpoint enough, or would we also want to do stack validation of the stack on the remote Heat?","commit_id":"e260b2541900447823ed9af66a3d2114570306ea"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"da6753668702c95d6753d16f64df347cf5f136e8","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        super(RemoteStack, self).validate()"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            self.heat()"},{"line_number":126,"context_line":"        except Exception as ex:"},{"line_number":127,"context_line":"            exc_info \u003d dict(region\u003dself._region_name, exc\u003dsix.text_type(ex))"},{"line_number":128,"context_line":"            msg \u003d _(\u0027Cannot establish connection to Heat endpoint at region \u0027"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a961159_8b6286ab","line":125,"in_reply_to":"3a961159_2b6352dd","updated":"2014-12-09 14:46:04.000000000","message":"Right, and that\u0027s why I thought we need to call validate() on the remote heat engine here.","commit_id":"e260b2541900447823ed9af66a3d2114570306ea"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"04d2abf2e7d44a8b4862794ea4e4153baab7fbf2","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        super(RemoteStack, self).validate()"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            self.heat()"},{"line_number":126,"context_line":"        except Exception as ex:"},{"line_number":127,"context_line":"            exc_info \u003d dict(region\u003dself._region_name, exc\u003dsix.text_type(ex))"},{"line_number":128,"context_line":"            msg \u003d _(\u0027Cannot establish connection to Heat endpoint at region \u0027"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a961159_2b6352dd","line":125,"in_reply_to":"3a961159_99e9ff82","updated":"2014-12-09 14:42:31.000000000","message":"Yes. That is my understanding too.  Validation of image constraints?  That is exactly something we have to do on the remote stack because the image may be available only on that region.  I mean, each region has its own glance service.","commit_id":"e260b2541900447823ed9af66a3d2114570306ea"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"331b7b2221b89d1dc534e68f5d3e069acddeb5d9","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        super(RemoteStack, self).validate()"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            self.heat()"},{"line_number":126,"context_line":"        except Exception as ex:"},{"line_number":127,"context_line":"            exc_info \u003d dict(region\u003dself._region_name, exc\u003dsix.text_type(ex))"},{"line_number":128,"context_line":"            msg \u003d _(\u0027Cannot establish connection to Heat endpoint at region \u0027"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a961159_ad875dd6","line":125,"in_reply_to":"3a961159_a4b85ae6","updated":"2014-12-09 12:26:10.000000000","message":"I thought about this as well and my current understanding is that maybe leaving the stack validation to the remote Heat is not a bad choice.","commit_id":"e260b2541900447823ed9af66a3d2114570306ea"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"a3252cda0471ceaf88276db67cff260bd4d67a43","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        super(RemoteStack, self).validate()"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        try:"},{"line_number":125,"context_line":"            self.heat()"},{"line_number":126,"context_line":"        except Exception as ex:"},{"line_number":127,"context_line":"            exc_info \u003d dict(region\u003dself._region_name, exc\u003dsix.text_type(ex))"},{"line_number":128,"context_line":"            msg \u003d _(\u0027Cannot establish connection to Heat endpoint at region \u0027"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a961159_99e9ff82","line":125,"in_reply_to":"3a961159_ad875dd6","updated":"2014-12-09 14:34:12.000000000","message":"So that would mean that validation could happen at resource create time of the remote stack resource, right?\n\nMy question was whether we would want to catch real validation errors (e.g. an image specified in parameters does not exist) at overall validation time. I am not decided on the right answer myself btw ;-)","commit_id":"e260b2541900447823ed9af66a3d2114570306ea"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"ab468e693a83e01645c1c87ed1cd4ba03233d4eb","unresolved":false,"context_lines":[{"line_number":139,"context_line":"                \u0027stack_name\u0027: self.physical_resource_name_or_FnGetRefId(),"},{"line_number":140,"context_line":"                \u0027template\u0027: tmpl,"},{"line_number":141,"context_line":"                \u0027timeout_mins\u0027: self.properties[self.TIMEOUT],"},{"line_number":142,"context_line":"                \u0027disable_rollback\u0027: True,"},{"line_number":143,"context_line":"                \u0027parameters\u0027: params,"},{"line_number":144,"context_line":"                \u0027files\u0027: self.stack.t.files,"},{"line_number":145,"context_line":"                \u0027environment\u0027: env.user_env_as_dict(),"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a961159_d12b4292","line":142,"updated":"2014-12-10 07:45:00.000000000","message":"why not set from self.stack.disalbe_rollback?","commit_id":"09dc248b81f65798cf9806b8679b082902825e47"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"ab468e693a83e01645c1c87ed1cd4ba03233d4eb","unresolved":false,"context_lines":[{"line_number":144,"context_line":"                \u0027files\u0027: self.stack.t.files,"},{"line_number":145,"context_line":"                \u0027environment\u0027: env.user_env_as_dict(),"},{"line_number":146,"context_line":"            }"},{"line_number":147,"context_line":"            self.heat().stacks.validate(**args)"},{"line_number":148,"context_line":"        except Exception as ex:"},{"line_number":149,"context_line":"            exc_info \u003d dict(region\u003dself._region_name, exc\u003dsix.text_type(ex))"},{"line_number":150,"context_line":"            LOG.error(_LE(\u0027exception: %s\u0027), type(ex))"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a961159_dc30b9ea","line":147,"updated":"2014-12-10 07:45:00.000000000","message":"if the args of validate and create are same, why not abstract a method like make_args().","commit_id":"09dc248b81f65798cf9806b8679b082902825e47"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"ab468e693a83e01645c1c87ed1cd4ba03233d4eb","unresolved":false,"context_lines":[{"line_number":161,"context_line":"            \u0027stack_name\u0027: self.physical_resource_name_or_FnGetRefId(),"},{"line_number":162,"context_line":"            \u0027template\u0027: tmpl,"},{"line_number":163,"context_line":"            \u0027timeout_mins\u0027: self.properties[self.TIMEOUT],"},{"line_number":164,"context_line":"            \u0027disable_rollback\u0027: True,"},{"line_number":165,"context_line":"            \u0027parameters\u0027: params,"},{"line_number":166,"context_line":"            \u0027files\u0027: self.stack.t.files,"},{"line_number":167,"context_line":"            \u0027environment\u0027: env.user_env_as_dict(),"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a961159_b1307602","line":164,"updated":"2014-12-10 07:45:00.000000000","message":"why not set from self.stack.disalbe_rollback?","commit_id":"09dc248b81f65798cf9806b8679b082902825e47"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"ab468e693a83e01645c1c87ed1cd4ba03233d4eb","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                \u0027parameters\u0027: params,"},{"line_number":206,"context_line":"                \u0027template\u0027: tmpl,"},{"line_number":207,"context_line":"                \u0027timeout_mins\u0027: self.properties[self.TIMEOUT],"},{"line_number":208,"context_line":"                \u0027disable_rollback\u0027: True,"},{"line_number":209,"context_line":"                \u0027files\u0027: self.stack.t.files,"},{"line_number":210,"context_line":"                \u0027environment\u0027: env.user_env_as_dict(),"},{"line_number":211,"context_line":"            }"}],"source_content_type":"text/x-python","patch_set":40,"id":"3a961159_1c524113","line":208,"updated":"2014-12-10 07:45:00.000000000","message":"why not set from self.stack.disalbe_rollback?","commit_id":"09dc248b81f65798cf9806b8679b082902825e47"},{"author":{"_account_id":8289,"name":"huangtianhua","email":"tiantian223@163.com","username":"huangtianhua"},"change_message_id":"ab468e693a83e01645c1c87ed1cd4ba03233d4eb","unresolved":false,"context_lines":[{"line_number":238,"context_line":"            is_complete \u003d self._check_action_complete(action\u003dself.DELETE)"},{"line_number":239,"context_line":"        except Exception as e:"},{"line_number":240,"context_line":"            self.client_plugin().ignore_not_found(e)"},{"line_number":241,"context_line":"            return True"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        return is_complete"},{"line_number":244,"context_line":""}],"source_content_type":"text/x-python","patch_set":40,"id":"3a961159_51a4b256","line":241,"updated":"2014-12-10 07:45:00.000000000","message":"the variable \u0027is_complete\u0027 isn\u0027t needed, may be the this function like:\n\ndef check_delete_complete(self, *args):\n    if self.resource_id is None:\n        return True\n\n    try:\n        return self._check_action_complete(action\u003dself.DELETE)\n    except Exception as e:\n        self.client_plugin().ignore_not_found(e)\n        return True","commit_id":"09dc248b81f65798cf9806b8679b082902825e47"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"4027f2f9ca8731ebe6b2efd7b87f15a04805490b","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    def __init__(self, name, definition, stack):"},{"line_number":98,"context_line":"        super(RemoteStack, self).__init__(name, definition, stack)"},{"line_number":99,"context_line":"        self._region_name \u003d None"},{"line_number":100,"context_line":"        self._context \u003d self._init_context()"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _init_context(self):"},{"line_number":103,"context_line":"        ctx_props \u003d self.properties.get(self.CONTEXT)"}],"source_content_type":"text/x-python","patch_set":41,"id":"3a961159_5c602dcf","line":100,"updated":"2014-12-10 20:53:58.000000000","message":"I can see why you\u0027ve done this but it would be preferable if the custom self._context was created lazily. How about something like:\n\n  def _context(self):\n    if self._local_context:\n      return self._local_context\n\n    # ... create RequestContext and store in self._local_context","commit_id":"1878cc3b1d7314e0c8c245b3d27e06d4d828f2ab"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"d6f8fc03805ee3ec5a94e844598a10ddd0e5c5cc","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    def __init__(self, name, definition, stack):"},{"line_number":98,"context_line":"        super(RemoteStack, self).__init__(name, definition, stack)"},{"line_number":99,"context_line":"        self._region_name \u003d None"},{"line_number":100,"context_line":"        self._context \u003d self._init_context()"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _init_context(self):"},{"line_number":103,"context_line":"        ctx_props \u003d self.properties.get(self.CONTEXT)"}],"source_content_type":"text/x-python","patch_set":41,"id":"3a961159_c8fe05ae","line":100,"in_reply_to":"3a961159_5c602dcf","updated":"2014-12-11 12:46:50.000000000","message":"Done","commit_id":"1878cc3b1d7314e0c8c245b3d27e06d4d828f2ab"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"4027f2f9ca8731ebe6b2efd7b87f15a04805490b","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def heat(self):"},{"line_number":115,"context_line":"        # A convenience method overriding Resource.heat()"},{"line_number":116,"context_line":"        return self._context.clients.heat()"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def client_plugin(self):"},{"line_number":119,"context_line":"        # A convenience method overriding Resource.client_plugin()"}],"source_content_type":"text/x-python","patch_set":41,"id":"3a961159_bca2f1fa","line":116,"updated":"2014-12-10 20:53:58.000000000","message":"self._context()...","commit_id":"1878cc3b1d7314e0c8c245b3d27e06d4d828f2ab"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"d6f8fc03805ee3ec5a94e844598a10ddd0e5c5cc","unresolved":false,"context_lines":[{"line_number":113,"context_line":""},{"line_number":114,"context_line":"    def heat(self):"},{"line_number":115,"context_line":"        # A convenience method overriding Resource.heat()"},{"line_number":116,"context_line":"        return self._context.clients.heat()"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def client_plugin(self):"},{"line_number":119,"context_line":"        # A convenience method overriding Resource.client_plugin()"}],"source_content_type":"text/x-python","patch_set":41,"id":"3a961159_883ebd26","line":116,"in_reply_to":"3a961159_bca2f1fa","updated":"2014-12-11 12:46:50.000000000","message":"Done","commit_id":"1878cc3b1d7314e0c8c245b3d27e06d4d828f2ab"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"4027f2f9ca8731ebe6b2efd7b87f15a04805490b","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def client_plugin(self):"},{"line_number":119,"context_line":"        # A convenience method overriding Resource.client_plugin()"},{"line_number":120,"context_line":"        return self._context.clients.client_plugin(\u0027heat\u0027)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def validate(self):"},{"line_number":123,"context_line":"        super(RemoteStack, self).validate()"}],"source_content_type":"text/x-python","patch_set":41,"id":"3a961159_dca33dfe","line":120,"updated":"2014-12-10 20:53:58.000000000","message":"self._context()...","commit_id":"1878cc3b1d7314e0c8c245b3d27e06d4d828f2ab"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"d6f8fc03805ee3ec5a94e844598a10ddd0e5c5cc","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def client_plugin(self):"},{"line_number":119,"context_line":"        # A convenience method overriding Resource.client_plugin()"},{"line_number":120,"context_line":"        return self._context.clients.client_plugin(\u0027heat\u0027)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    def validate(self):"},{"line_number":123,"context_line":"        super(RemoteStack, self).validate()"}],"source_content_type":"text/x-python","patch_set":41,"id":"3a961159_48393540","line":120,"in_reply_to":"3a961159_dca33dfe","updated":"2014-12-11 12:46:50.000000000","message":"Done","commit_id":"1878cc3b1d7314e0c8c245b3d27e06d4d828f2ab"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"4027f2f9ca8731ebe6b2efd7b87f15a04805490b","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def _check_action_complete(self, action):"},{"line_number":211,"context_line":"        stack \u003d self.heat().stacks.get(stack_id\u003dself.resource_id)"},{"line_number":212,"context_line":"        if stack.action \u003d\u003d action:"},{"line_number":213,"context_line":"            if stack.status \u003d\u003d self.IN_PROGRESS:"},{"line_number":214,"context_line":"                return False"},{"line_number":215,"context_line":"            elif stack.status \u003d\u003d self.COMPLETE:"}],"source_content_type":"text/x-python","patch_set":41,"id":"3a961159_3c71a176","line":212,"updated":"2014-12-10 20:53:58.000000000","message":"I think if stack.action !\u003d action then an exception should be raised with a custom message that mentions the expected and actual actions. Maybe a ResourceUnknownStatus with a custom status_reason.","commit_id":"1878cc3b1d7314e0c8c245b3d27e06d4d828f2ab"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"d6f8fc03805ee3ec5a94e844598a10ddd0e5c5cc","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    def _check_action_complete(self, action):"},{"line_number":211,"context_line":"        stack \u003d self.heat().stacks.get(stack_id\u003dself.resource_id)"},{"line_number":212,"context_line":"        if stack.action \u003d\u003d action:"},{"line_number":213,"context_line":"            if stack.status \u003d\u003d self.IN_PROGRESS:"},{"line_number":214,"context_line":"                return False"},{"line_number":215,"context_line":"            elif stack.status \u003d\u003d self.COMPLETE:"}],"source_content_type":"text/x-python","patch_set":41,"id":"3a961159_88c95d5b","line":212,"in_reply_to":"3a961159_3c71a176","updated":"2014-12-11 12:46:50.000000000","message":"The current ResourceUnknownStatus is ignoring the status_reason key, so I\u0027m gonna fix this as you suggested but the test case won\u0027t be able to check this at the moment.\nNeed another patch to make all (about 8 or 9) ResourceUnknownStatus exceptions raised with \u0027status_reason\u0027 applied.","commit_id":"1878cc3b1d7314e0c8c245b3d27e06d4d828f2ab"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"4027f2f9ca8731ebe6b2efd7b87f15a04805490b","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                raise resource.ResourceInError("},{"line_number":219,"context_line":"                    resource_status\u003dstack.stack_status,"},{"line_number":220,"context_line":"                    status_reason\u003dstack.stack_status_reason)"},{"line_number":221,"context_line":"        raise resource.ResourceUnknownStatus("},{"line_number":222,"context_line":"            resource_status\u003dstack.stack_status,"},{"line_number":223,"context_line":"            status_reason\u003dstack.stack_status_reason)"},{"line_number":224,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"3a961159_1cfb05c2","line":221,"updated":"2014-12-10 20:53:58.000000000","message":"This should be indented into the else: of the above status checks","commit_id":"1878cc3b1d7314e0c8c245b3d27e06d4d828f2ab"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"d6f8fc03805ee3ec5a94e844598a10ddd0e5c5cc","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                raise resource.ResourceInError("},{"line_number":219,"context_line":"                    resource_status\u003dstack.stack_status,"},{"line_number":220,"context_line":"                    status_reason\u003dstack.stack_status_reason)"},{"line_number":221,"context_line":"        raise resource.ResourceUnknownStatus("},{"line_number":222,"context_line":"            resource_status\u003dstack.stack_status,"},{"line_number":223,"context_line":"            status_reason\u003dstack.stack_status_reason)"},{"line_number":224,"context_line":""}],"source_content_type":"text/x-python","patch_set":41,"id":"3a961159_68cc316b","line":221,"in_reply_to":"3a961159_1cfb05c2","updated":"2014-12-11 12:46:50.000000000","message":"Yes, I can do this, but I cannot think of a situation where a resource\u0027s status is not in (IN_PROGRESS, COMPLETE, FAILED), so I\u0027m adding a comment to note that this rarely happens.","commit_id":"1878cc3b1d7314e0c8c245b3d27e06d4d828f2ab"},{"author":{"_account_id":4571,"name":"Steve Baker","email":"sbaker@redhat.com","username":"steve-stevebaker"},"change_message_id":"4027f2f9ca8731ebe6b2efd7b87f15a04805490b","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            stack \u003d self.heat().stacks.get(stack_id\u003dself.resource_id)"},{"line_number":250,"context_line":"        except Exception as e:"},{"line_number":251,"context_line":"            self.client_plugin().ignore_not_found(e)"},{"line_number":252,"context_line":"            return \u0027\u0027"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"        if name \u003d\u003d self.NAME_ATTR:"},{"line_number":255,"context_line":"            value \u003d getattr(stack, name, None)"}],"source_content_type":"text/x-python","patch_set":41,"id":"3a961159_1ce945e6","line":252,"updated":"2014-12-10 20:53:58.000000000","message":"This should return None.","commit_id":"1878cc3b1d7314e0c8c245b3d27e06d4d828f2ab"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"d6f8fc03805ee3ec5a94e844598a10ddd0e5c5cc","unresolved":false,"context_lines":[{"line_number":249,"context_line":"            stack \u003d self.heat().stacks.get(stack_id\u003dself.resource_id)"},{"line_number":250,"context_line":"        except Exception as e:"},{"line_number":251,"context_line":"            self.client_plugin().ignore_not_found(e)"},{"line_number":252,"context_line":"            return \u0027\u0027"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"        if name \u003d\u003d self.NAME_ATTR:"},{"line_number":255,"context_line":"            value \u003d getattr(stack, name, None)"}],"source_content_type":"text/x-python","patch_set":41,"id":"3a961159_0833ad63","line":252,"in_reply_to":"3a961159_1ce945e6","updated":"2014-12-11 12:46:50.000000000","message":"Done","commit_id":"1878cc3b1d7314e0c8c245b3d27e06d4d828f2ab"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"1db375dcb71f169236d6effe9a84fe566c7e977f","unresolved":false,"context_lines":[{"line_number":229,"context_line":"                    resource_status\u003dstack.stack_status,"},{"line_number":230,"context_line":"                    status_reason\u003dstack.stack_status_reason)"},{"line_number":231,"context_line":"        else:"},{"line_number":232,"context_line":"            msg \u003d _(\u0027Resource action misatch detected: expected\u003d%(expected)s \u0027"},{"line_number":233,"context_line":"                    \u0027actual\u003d%(actual)s\u0027) % dict(expected\u003daction,"},{"line_number":234,"context_line":"                                                actual\u003dstack.action)"},{"line_number":235,"context_line":"            raise resource.ResourceUnknownStatus("}],"source_content_type":"text/x-python","patch_set":43,"id":"3a961159_c04092a7","line":232,"updated":"2014-12-11 16:11:02.000000000","message":"just a little typo: misatch\n\nI won\u0027t block on this but I prefer to get this in now and you can post another tiny patch to fix the typo afterwards :-)","commit_id":"fa6cf012a58bf79b42e0167450e99df27c17886e"}],"heat/tests/test_remote_stack.py":[{"author":{"_account_id":6577,"name":"Sergey Kraynev","email":"sergejyit@gmail.com","username":"skraynev"},"change_message_id":"13af2bb2e8d43b4b64bd37c3f68a22d1359fffc9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":12,"id":"3ae8d1ca_a7795631","line":1,"updated":"2014-05-28 09:44:17.000000000","message":"same","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"19b53d17219e07b858ef0126b3ad395ee52b7493","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ae5cdf2_1ddcc145","line":1,"in_reply_to":"3ae8d1ca_a7795631","updated":"2014-06-03 21:35:10.000000000","message":"Done","commit_id":"760a92ce56de3224035fe6c24d9d22bb74b9d1a2"},{"author":{"_account_id":10556,"name":"Dimitri Mazmanov","email":"dimitri.mazmanov@ericsson.com","username":"edimmaz"},"change_message_id":"39db64cef59435f4bc85d1d832a917b983e5c0e5","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def setUp(self):"},{"line_number":91,"context_line":"        super(RemoteStackTest, self).setUp()"},{"line_number":92,"context_line":"        utils.setup_dummy_db()"},{"line_number":93,"context_line":"        self.heat \u003d mock.MagicMock()"},{"line_number":94,"context_line":"        self.heatclient \u003d mock.MagicMock()"},{"line_number":95,"context_line":"        self.heat.return_value \u003d self.heatclient"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ae5cdf2_ff14a5ea","line":92,"updated":"2014-06-10 08:20:57.000000000","message":"No need to set up a db here. It\u0027s been moved to the HeatTestCase class","commit_id":"0c09a6fd2343a5f9d456ecce7c03d0c241279591"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"4c3ef2cb97bacc3e59ca663809caeb35b175655e","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def setUp(self):"},{"line_number":91,"context_line":"        super(RemoteStackTest, self).setUp()"},{"line_number":92,"context_line":"        utils.setup_dummy_db()"},{"line_number":93,"context_line":"        self.heat \u003d mock.MagicMock()"},{"line_number":94,"context_line":"        self.heatclient \u003d mock.MagicMock()"},{"line_number":95,"context_line":"        self.heat.return_value \u003d self.heatclient"}],"source_content_type":"text/x-python","patch_set":16,"id":"1ae5cdf2_cfc1b181","line":92,"in_reply_to":"1ae5cdf2_ff14a5ea","updated":"2014-06-11 20:24:40.000000000","message":"Done","commit_id":"0c09a6fd2343a5f9d456ecce7c03d0c241279591"},{"author":{"_account_id":10556,"name":"Dimitri Mazmanov","email":"dimitri.mazmanov@ericsson.com","username":"edimmaz"},"change_message_id":"7651d82813523e033bd0ecb4e80904d3823e016a","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def setUp(self):"},{"line_number":79,"context_line":"        super(RemoteStackTest, self).setUp()"},{"line_number":80,"context_line":"        utils.setup_dummy_db()"},{"line_number":81,"context_line":"        self.heat \u003d mock.MagicMock()"},{"line_number":82,"context_line":"        self.heatclient \u003d mock.MagicMock()"},{"line_number":83,"context_line":"        self.heat.return_value \u003d self.heatclient"}],"source_content_type":"text/x-python","patch_set":17,"id":"1ae5cdf2_ad6b76b7","line":80,"updated":"2014-06-12 13:24:44.000000000","message":"It\u0027s still here","commit_id":"b5f36bf28993ec68621c238bd4e2f90f85d44bb8"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"fa41778a258bc766c196f1067f55d8412cc37aa9","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def setUp(self):"},{"line_number":79,"context_line":"        super(RemoteStackTest, self).setUp()"},{"line_number":80,"context_line":"        utils.setup_dummy_db()"},{"line_number":81,"context_line":"        self.heat \u003d mock.MagicMock()"},{"line_number":82,"context_line":"        self.heatclient \u003d mock.MagicMock()"},{"line_number":83,"context_line":"        self.heat.return_value \u003d self.heatclient"}],"source_content_type":"text/x-python","patch_set":17,"id":"1ae5cdf2_0608c426","line":80,"in_reply_to":"1ae5cdf2_ad6b76b7","updated":"2014-06-12 17:39:37.000000000","message":"Right. This time is removed for good :)","commit_id":"b5f36bf28993ec68621c238bd4e2f90f85d44bb8"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"d6f67099c43cf366b7e19cd643f69bd40aee55d2","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            }"},{"line_number":229,"context_line":"        ]"},{"line_number":230,"context_line":"        self.stacks.get.return_value \u003d created_stack"},{"line_number":231,"context_line":"        self.assertEqual(\u0027bar\u0027, rsrc.FnGetAtt(\u0027outputs.foo\u0027))"},{"line_number":232,"context_line":"        self.assertEqual(\u0027stack_name\u0027, rsrc.FnGetAtt(\u0027name\u0027))"},{"line_number":233,"context_line":"        self.stacks.get.assert_called_with("},{"line_number":234,"context_line":"            stack_id\u003d\u0027c8a19429-7fde-47ea-a42f-40045488226c\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_73e5deda","line":231,"updated":"2014-07-04 05:50:32.000000000","message":"See my comment in the remote_stack.py: with HOT you would be able to do a get_attr with multiple arguments to navigate thru complex attributes like output here.","commit_id":"987836de08ac603debb671a7e5534b3556e6e794"},{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"46c00334251ac20fd84a0a3483f7629031de7b2c","unresolved":false,"context_lines":[{"line_number":228,"context_line":"            }"},{"line_number":229,"context_line":"        ]"},{"line_number":230,"context_line":"        self.stacks.get.return_value \u003d created_stack"},{"line_number":231,"context_line":"        self.assertEqual(\u0027bar\u0027, rsrc.FnGetAtt(\u0027outputs.foo\u0027))"},{"line_number":232,"context_line":"        self.assertEqual(\u0027stack_name\u0027, rsrc.FnGetAtt(\u0027name\u0027))"},{"line_number":233,"context_line":"        self.stacks.get.assert_called_with("},{"line_number":234,"context_line":"            stack_id\u003d\u0027c8a19429-7fde-47ea-a42f-40045488226c\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"baada198_b6583a8b","line":231,"in_reply_to":"baada198_73e5deda","updated":"2014-07-04 15:38:02.000000000","message":"Done","commit_id":"987836de08ac603debb671a7e5534b3556e6e794"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"5ab3330a6e79063c81c539b35a0a2f97698222db","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        self.assertEqual((rsrc.INIT, rsrc.COMPLETE), rsrc.state)"},{"line_number":191,"context_line":"        self.assertEqual(self.this_region, rsrc._region_name)"},{"line_number":192,"context_line":"        ctx \u003d rsrc.properties.get(\u0027context\u0027)"},{"line_number":193,"context_line":"        self.assertEqual(None, ctx)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        self.assertEqual(None, rsrc.validate())"},{"line_number":196,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3a961159_e4fd023d","line":193,"updated":"2014-12-09 11:11:44.000000000","message":"Minor nit: this could be changed to\n\n self.assertIsNone(ctx)","commit_id":"e260b2541900447823ed9af66a3d2114570306ea"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"331b7b2221b89d1dc534e68f5d3e069acddeb5d9","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        self.assertEqual((rsrc.INIT, rsrc.COMPLETE), rsrc.state)"},{"line_number":191,"context_line":"        self.assertEqual(self.this_region, rsrc._region_name)"},{"line_number":192,"context_line":"        ctx \u003d rsrc.properties.get(\u0027context\u0027)"},{"line_number":193,"context_line":"        self.assertEqual(None, ctx)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        self.assertEqual(None, rsrc.validate())"},{"line_number":196,"context_line":""}],"source_content_type":"text/x-python","patch_set":36,"id":"3a961159_ed688523","line":193,"in_reply_to":"3a961159_e4fd023d","updated":"2014-12-09 12:26:10.000000000","message":"Done","commit_id":"e260b2541900447823ed9af66a3d2114570306ea"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"5ab3330a6e79063c81c539b35a0a2f97698222db","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        ctx \u003d rsrc.properties.get(\u0027context\u0027)"},{"line_number":193,"context_line":"        self.assertEqual(None, ctx)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        self.assertEqual(None, rsrc.validate())"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def test_create_remote_stack_this_region(self):"},{"line_number":198,"context_line":"        parent, rsrc \u003d self.create_parent_stack(remote_region\u003dself.this_region)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a961159_a4713ae2","line":195,"updated":"2014-12-09 11:11:44.000000000","message":"-\u003e self.assertIsNone","commit_id":"e260b2541900447823ed9af66a3d2114570306ea"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"331b7b2221b89d1dc534e68f5d3e069acddeb5d9","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        ctx \u003d rsrc.properties.get(\u0027context\u0027)"},{"line_number":193,"context_line":"        self.assertEqual(None, ctx)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        self.assertEqual(None, rsrc.validate())"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def test_create_remote_stack_this_region(self):"},{"line_number":198,"context_line":"        parent, rsrc \u003d self.create_parent_stack(remote_region\u003dself.this_region)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a961159_0d7871f1","line":195,"in_reply_to":"3a961159_a4713ae2","updated":"2014-12-09 12:26:10.000000000","message":"Done","commit_id":"e260b2541900447823ed9af66a3d2114570306ea"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"5ab3330a6e79063c81c539b35a0a2f97698222db","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        ctx \u003d rsrc.properties.get(\u0027context\u0027)"},{"line_number":203,"context_line":"        self.assertEqual(self.this_region, ctx[\u0027region_name\u0027])"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        self.assertEqual(None, rsrc.validate())"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def test_create_remote_stack_that_region(self):"},{"line_number":208,"context_line":"        parent, rsrc \u003d self.create_parent_stack(remote_region\u003dself.that_region)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a961159_444b3687","line":205,"updated":"2014-12-09 11:11:44.000000000","message":"-\u003e self.assertIsNone","commit_id":"e260b2541900447823ed9af66a3d2114570306ea"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"331b7b2221b89d1dc534e68f5d3e069acddeb5d9","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        ctx \u003d rsrc.properties.get(\u0027context\u0027)"},{"line_number":203,"context_line":"        self.assertEqual(self.this_region, ctx[\u0027region_name\u0027])"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        self.assertEqual(None, rsrc.validate())"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def test_create_remote_stack_that_region(self):"},{"line_number":208,"context_line":"        parent, rsrc \u003d self.create_parent_stack(remote_region\u003dself.that_region)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a961159_2d736d16","line":205,"in_reply_to":"3a961159_444b3687","updated":"2014-12-09 12:26:10.000000000","message":"Done","commit_id":"e260b2541900447823ed9af66a3d2114570306ea"},{"author":{"_account_id":7193,"name":"Thomas Spatzier","email":"thomas.spatzier@icloud.com","username":"thomasspatzier"},"change_message_id":"5ab3330a6e79063c81c539b35a0a2f97698222db","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        ctx \u003d rsrc.properties.get(\u0027context\u0027)"},{"line_number":213,"context_line":"        self.assertEqual(self.that_region, ctx[\u0027region_name\u0027])"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        self.assertEqual(None, rsrc.validate())"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def test_create_remote_stack_bad_region(self):"},{"line_number":218,"context_line":"        parent, rsrc \u003d self.create_parent_stack(remote_region\u003dself.bad_region)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a961159_24546a20","line":215,"updated":"2014-12-09 11:11:44.000000000","message":"-\u003e self.assertIsNone","commit_id":"e260b2541900447823ed9af66a3d2114570306ea"},{"author":{"_account_id":8246,"name":"Qiming Teng","email":"tengqm@outlook.com","username":"tengqm"},"change_message_id":"331b7b2221b89d1dc534e68f5d3e069acddeb5d9","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        ctx \u003d rsrc.properties.get(\u0027context\u0027)"},{"line_number":213,"context_line":"        self.assertEqual(self.that_region, ctx[\u0027region_name\u0027])"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        self.assertEqual(None, rsrc.validate())"},{"line_number":216,"context_line":""},{"line_number":217,"context_line":"    def test_create_remote_stack_bad_region(self):"},{"line_number":218,"context_line":"        parent, rsrc \u003d self.create_parent_stack(remote_region\u003dself.bad_region)"}],"source_content_type":"text/x-python","patch_set":36,"id":"3a961159_4d619938","line":215,"in_reply_to":"3a961159_24546a20","updated":"2014-12-09 12:26:10.000000000","message":"Done","commit_id":"e260b2541900447823ed9af66a3d2114570306ea"}]}
