)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"ecf346600b58a03cad4325b8ee2cff29dcbf26c1","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"heat engine changes for abandon-stack"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"abanon-stack operation is similar to delete-stack, but actual"},{"line_number":10,"context_line":"resources would not be deleted. only stack and resource data"},{"line_number":11,"context_line":"would be deleted from heat database. And also abandon-stack"},{"line_number":12,"context_line":"operation would return the stack/resources data in json format."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAATn%2F%2Bx8s%3D","line":9,"updated":"2013-11-20 09:58:13.000000000","message":"Type-o \"abanon-stack\" should be \"abandon-stack\".","commit_id":"67730d0a17eb634a5e1b0e97a50cc3a58fcf97f8"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"ecf346600b58a03cad4325b8ee2cff29dcbf26c1","unresolved":false,"context_lines":[{"line_number":7,"context_line":"heat engine changes for abandon-stack"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"abanon-stack operation is similar to delete-stack, but actual"},{"line_number":10,"context_line":"resources would not be deleted. only stack and resource data"},{"line_number":11,"context_line":"would be deleted from heat database. And also abandon-stack"},{"line_number":12,"context_line":"operation would return the stack/resources data in json format."},{"line_number":13,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAATn%2F%2Bx8o%3D","line":10,"updated":"2013-11-20 09:58:13.000000000","message":"\"only\" should be capitalized as \"Only\".","commit_id":"67730d0a17eb634a5e1b0e97a50cc3a58fcf97f8"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"ecf346600b58a03cad4325b8ee2cff29dcbf26c1","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        }"},{"line_number":42,"context_line":"    },"},{"line_number":43,"context_line":"    \"id\": \"xxxxxxx-xxxx-xxxx-xxxx-xxxxxx\""},{"line_number":44,"context_line":"}"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"Blueprint abandon-stack"},{"line_number":47,"context_line":"Change-Id: Ibb386255887d4de54e9a3dc95254a7151475cf3a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"AAAATn%2F%2Bx8U%3D","line":44,"updated":"2013-11-20 09:58:13.000000000","message":"I don\u0027t think example output is appropriate for a commit message. This should be in documentation (doctags or actually added to docs/source/something.rst)","commit_id":"67730d0a17eb634a5e1b0e97a50cc3a58fcf97f8"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"8c3f651407662e3351214e3c251a9f7f26fb9a1e","unresolved":false,"context_lines":[{"line_number":11,"context_line":"would be deleted from heat database. And also abandon-stack"},{"line_number":12,"context_line":"operation would return the stack/resources data in json format."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Blueprint abandon-stack"},{"line_number":15,"context_line":"Change-Id: Ibb386255887d4de54e9a3dc95254a7151475cf3a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAATn%2F%2BC8c%3D","line":14,"updated":"2013-12-03 04:19:22.000000000","message":"message format again.","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"f5f12bfd0f190e986e8d9bbec4e4b47268ba76f9","unresolved":false,"context_lines":[{"line_number":11,"context_line":"would be deleted from heat database. And also abandon-stack"},{"line_number":12,"context_line":"operation would return the stack/resources data in json format."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Blueprint abandon-stack"},{"line_number":15,"context_line":"Change-Id: Ibb386255887d4de54e9a3dc95254a7151475cf3a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"AAAATn%2F9%2FWc%3D","line":14,"in_reply_to":"AAAATn%2F%2BC8c%3D","updated":"2013-12-03 21:40:01.000000000","message":"done","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"}],"heat/engine/parser.py":[{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"be4a173fd9f4d52a63dfbfef4b3c818d2b1545c6","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        return self._zones"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"    def get_stack_details(self):"},{"line_number":653,"context_line":"        stk_info \u003d {}"},{"line_number":654,"context_line":"        stk_info[\u0027name\u0027] \u003d self.name"},{"line_number":655,"context_line":"        stk_info[\u0027id\u0027] \u003d self.id"},{"line_number":656,"context_line":"        stk_info[\u0027action\u0027] \u003d self.action"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BwHA%3D","line":653,"updated":"2013-11-20 17:22:47.000000000","message":"stk_info \u003d {\n  \u0027name\u0027: self.name,\n  \u0027id\u0027: self.id,\n  \u0027action\u0027: self.action,\n  \u0027status\u0027: self.status,\n  \u0027resources\u0027 \u003d {}\n}\n\nI think the code above is the more readable way to write it. A the same thing applies to resource data in for loop.","commit_id":"d6a2cfe5b63e7848fafa30d8a486b7d22004aec1"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"1fc8d471e8305166e11a859325e7dab3301961ab","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        return self._zones"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"    def get_stack_details(self):"},{"line_number":653,"context_line":"        stk_info \u003d {}"},{"line_number":654,"context_line":"        stk_info[\u0027name\u0027] \u003d self.name"},{"line_number":655,"context_line":"        stk_info[\u0027id\u0027] \u003d self.id"},{"line_number":656,"context_line":"        stk_info[\u0027action\u0027] \u003d self.action"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BrSQ%3D","line":653,"in_reply_to":"AAAATn%2F%2BvxY%3D","updated":"2013-11-21 18:47:21.000000000","message":"changing to inline dict.","commit_id":"d6a2cfe5b63e7848fafa30d8a486b7d22004aec1"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"54d24164f6c100bae6dfa1a262415ecae0dc5aea","unresolved":false,"context_lines":[{"line_number":650,"context_line":"        return self._zones"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"    def get_stack_details(self):"},{"line_number":653,"context_line":"        stk_info \u003d {}"},{"line_number":654,"context_line":"        stk_info[\u0027name\u0027] \u003d self.name"},{"line_number":655,"context_line":"        stk_info[\u0027id\u0027] \u003d self.id"},{"line_number":656,"context_line":"        stk_info[\u0027action\u0027] \u003d self.action"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BvxY%3D","line":653,"in_reply_to":"AAAATn%2F%2BwHA%3D","updated":"2013-11-20 18:39:52.000000000","message":"\"meh\". Agreed it is slightly more readable as an in-line dict, but I don\u0027t mind building up the dict as well.","commit_id":"d6a2cfe5b63e7848fafa30d8a486b7d22004aec1"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"54d24164f6c100bae6dfa1a262415ecae0dc5aea","unresolved":false,"context_lines":[{"line_number":655,"context_line":"        stk_info[\u0027id\u0027] \u003d self.id"},{"line_number":656,"context_line":"        stk_info[\u0027action\u0027] \u003d self.action"},{"line_number":657,"context_line":"        stk_info[\u0027status\u0027] \u003d self.status"},{"line_number":658,"context_line":"        stk_info[\u0027resources\u0027] \u003d {}"},{"line_number":659,"context_line":"        for resource in self.resources.values():"},{"line_number":660,"context_line":"            res \u003d {}"},{"line_number":661,"context_line":"            res[\u0027name\u0027] \u003d resource.name"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bvw8%3D","line":658,"updated":"2013-11-20 18:39:52.000000000","message":"still no template... the spec states that the template will be returned.","commit_id":"d6a2cfe5b63e7848fafa30d8a486b7d22004aec1"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"1fc8d471e8305166e11a859325e7dab3301961ab","unresolved":false,"context_lines":[{"line_number":655,"context_line":"        stk_info[\u0027id\u0027] \u003d self.id"},{"line_number":656,"context_line":"        stk_info[\u0027action\u0027] \u003d self.action"},{"line_number":657,"context_line":"        stk_info[\u0027status\u0027] \u003d self.status"},{"line_number":658,"context_line":"        stk_info[\u0027resources\u0027] \u003d {}"},{"line_number":659,"context_line":"        for resource in self.resources.values():"},{"line_number":660,"context_line":"            res \u003d {}"},{"line_number":661,"context_line":"            res[\u0027name\u0027] \u003d resource.name"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BrSY%3D","line":658,"in_reply_to":"AAAATn%2F%2Bvw8%3D","updated":"2013-11-21 18:47:21.000000000","message":"done.","commit_id":"d6a2cfe5b63e7848fafa30d8a486b7d22004aec1"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"0a30ac27ca3af814abbdbab126efd62587a9ada3","unresolved":false,"context_lines":[{"line_number":649,"context_line":"                self.clients.nova().availability_zones.list(detailed\u003dFalse)]"},{"line_number":650,"context_line":"        return self._zones"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"    def get_stack_details(self):"},{"line_number":653,"context_line":"        stk_info \u003d {"},{"line_number":654,"context_line":"            \u0027name\u0027: self.name,"},{"line_number":655,"context_line":"            \u0027id\u0027: self.id,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BlZg%3D","line":652,"updated":"2013-11-22 19:57:47.000000000","message":"A bit of a nit, but I think the method name should be something like:\n\n  def get_abandoned_data(self):\n\nI think it implies some sort of data optimization around the stack show mechanism and could confuse.","commit_id":"65028bcc23133797ffd21e0d526910dbc4e549e4"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"8c3f651407662e3351214e3c251a9f7f26fb9a1e","unresolved":false,"context_lines":[{"line_number":671,"context_line":"            \u0027action\u0027: self.action,"},{"line_number":672,"context_line":"            \u0027status\u0027: self.status,"},{"line_number":673,"context_line":"            \u0027template\u0027: self.t.t,"},{"line_number":674,"context_line":"            \u0027resources\u0027: {}"},{"line_number":675,"context_line":"        }"},{"line_number":676,"context_line":""},{"line_number":677,"context_line":"        for resource in self.resources.values():"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BC8k%3D","line":674,"updated":"2013-12-03 04:19:22.000000000","message":"Minor nit, but would rather see this more functionally defined rather than the loop that follows. Something like:\n\n  resources: dict((r.name, r.get_abandon_data()) for r in self.resources.values())","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"f5f12bfd0f190e986e8d9bbec4e4b47268ba76f9","unresolved":false,"context_lines":[{"line_number":671,"context_line":"            \u0027action\u0027: self.action,"},{"line_number":672,"context_line":"            \u0027status\u0027: self.status,"},{"line_number":673,"context_line":"            \u0027template\u0027: self.t.t,"},{"line_number":674,"context_line":"            \u0027resources\u0027: {}"},{"line_number":675,"context_line":"        }"},{"line_number":676,"context_line":""},{"line_number":677,"context_line":"        for resource in self.resources.values():"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9%2FWw%3D","line":674,"in_reply_to":"AAAATn%2F%2BC8k%3D","updated":"2013-12-03 21:40:01.000000000","message":"done","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"}],"heat/engine/resource.py":[{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"8c3f651407662e3351214e3c251a9f7f26fb9a1e","unresolved":false,"context_lines":[{"line_number":422,"context_line":"            \u0027name\u0027: self.name,"},{"line_number":423,"context_line":"            \u0027resource_id\u0027: self.resource_id,"},{"line_number":424,"context_line":"            \u0027type\u0027: self.type(),"},{"line_number":425,"context_line":"            \u0027action\u0027: self.action,"},{"line_number":426,"context_line":"            \u0027status\u0027: self.status,"},{"line_number":427,"context_line":"            \u0027metadata\u0027: self.metadata,"},{"line_number":428,"context_line":"            \u0027resource_data\u0027: {}"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BC78%3D","line":425,"updated":"2013-12-03 04:19:22.000000000","message":"Not really needed is it? Unless we want to allow for adopt to keep resource state as well? IMO, if you adopt a stack, you want the resources to be CREATE_COMPLETE or similar. Would you really want to adopt a stack and have failed resources? Same with the \"status\" part as well.","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"f5f12bfd0f190e986e8d9bbec4e4b47268ba76f9","unresolved":false,"context_lines":[{"line_number":422,"context_line":"            \u0027name\u0027: self.name,"},{"line_number":423,"context_line":"            \u0027resource_id\u0027: self.resource_id,"},{"line_number":424,"context_line":"            \u0027type\u0027: self.type(),"},{"line_number":425,"context_line":"            \u0027action\u0027: self.action,"},{"line_number":426,"context_line":"            \u0027status\u0027: self.status,"},{"line_number":427,"context_line":"            \u0027metadata\u0027: self.metadata,"},{"line_number":428,"context_line":"            \u0027resource_data\u0027: {}"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9%2FW8%3D","line":425,"in_reply_to":"AAAATn%2F%2BC78%3D","updated":"2013-12-03 21:40:01.000000000","message":"yes, we need this. For example,\nMoving stacks off a heat that needs an offline upgrade or moving  stacks from one heat to other heat, irrespective of the state, we just need to move them with their original action/status.\n\nhttps://etherpad.openstack.org/p/icehouse-summit-heat-abandon-adopt","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"8c3f651407662e3351214e3c251a9f7f26fb9a1e","unresolved":false,"context_lines":[{"line_number":425,"context_line":"            \u0027action\u0027: self.action,"},{"line_number":426,"context_line":"            \u0027status\u0027: self.status,"},{"line_number":427,"context_line":"            \u0027metadata\u0027: self.metadata,"},{"line_number":428,"context_line":"            \u0027resource_data\u0027: {}"},{"line_number":429,"context_line":"        }"},{"line_number":430,"context_line":"        result \u003d db_api.resource_data_get_all(self)"},{"line_number":431,"context_line":"        for res_data in result:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BC7g%3D","line":428,"updated":"2013-12-03 04:19:22.000000000","message":"Same minor nit as in the previous file. Would rather see:\n\n  resource_data: dict((r.key, r.value) for r in db_api.resource_data_get_all(self))","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"f5f12bfd0f190e986e8d9bbec4e4b47268ba76f9","unresolved":false,"context_lines":[{"line_number":425,"context_line":"            \u0027action\u0027: self.action,"},{"line_number":426,"context_line":"            \u0027status\u0027: self.status,"},{"line_number":427,"context_line":"            \u0027metadata\u0027: self.metadata,"},{"line_number":428,"context_line":"            \u0027resource_data\u0027: {}"},{"line_number":429,"context_line":"        }"},{"line_number":430,"context_line":"        result \u003d db_api.resource_data_get_all(self)"},{"line_number":431,"context_line":"        for res_data in result:"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9%2FW0%3D","line":428,"in_reply_to":"AAAATn%2F%2BC7g%3D","updated":"2013-12-03 21:40:01.000000000","message":"done","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"}],"heat/engine/service.py":[{"author":{"_account_id":7714,"name":"Tim Schnell","email":"tim.schnell@rackspace.com","username":"timductive"},"change_message_id":"382da2006eab77c407d0e118b008f890a460608c","unresolved":false,"context_lines":[{"line_number":433,"context_line":"        if abandon_stack:"},{"line_number":434,"context_line":"            stack_info \u003d self._get_stack_details(stack, cnxt)"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"            # Set all the resource deletion policy to \u0027Retail\u0027, so that"},{"line_number":437,"context_line":"            # resource would not not be deleted"},{"line_number":438,"context_line":"            for resource in stack.resources.values():"},{"line_number":439,"context_line":"                resource.t[\u0027DeletionPolicy\u0027] \u003d \u0027Retain\u0027"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2B5So%3D","line":436,"updated":"2013-11-18 21:38:25.000000000","message":"misspelling, I think you meant \u0027Retain\u0027 instead of \u0027Retail\u0027","commit_id":"67730d0a17eb634a5e1b0e97a50cc3a58fcf97f8"},{"author":{"_account_id":7896,"name":"Edmund Troche","email":"edmund.troche@us.ibm.com","username":"edmund"},"change_message_id":"e05a013e2fede8f94577e0e3ea041e35fe7e0e7c","unresolved":false,"context_lines":[{"line_number":434,"context_line":"            stack_info \u003d self._get_stack_details(stack, cnxt)"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"            # Set all the resource deletion policy to \u0027Retail\u0027, so that"},{"line_number":437,"context_line":"            # resource would not not be deleted"},{"line_number":438,"context_line":"            for resource in stack.resources.values():"},{"line_number":439,"context_line":"                resource.t[\u0027DeletionPolicy\u0027] \u003d \u0027Retain\u0027"},{"line_number":440,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2B44M%3D","line":437,"updated":"2013-11-18 22:48:56.000000000","message":"You meant \"resource would not be deleted\" (double not)","commit_id":"67730d0a17eb634a5e1b0e97a50cc3a58fcf97f8"},{"author":{"_account_id":7896,"name":"Edmund Troche","email":"edmund.troche@us.ibm.com","username":"edmund"},"change_message_id":"e05a013e2fede8f94577e0e3ea041e35fe7e0e7c","unresolved":false,"context_lines":[{"line_number":436,"context_line":"            # Set all the resource deletion policy to \u0027Retail\u0027, so that"},{"line_number":437,"context_line":"            # resource would not not be deleted"},{"line_number":438,"context_line":"            for resource in stack.resources.values():"},{"line_number":439,"context_line":"                resource.t[\u0027DeletionPolicy\u0027] \u003d \u0027Retain\u0027"},{"line_number":440,"context_line":""},{"line_number":441,"context_line":"        # Kill any pending threads by calling ThreadGroup.stop()"},{"line_number":442,"context_line":"        if st.id in self.stg:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2B48I%3D","line":439,"updated":"2013-11-18 22:48:56.000000000","message":"I\u0027m guessing that the \u0027Retain\u0027 string is something we potentially would refer to in other code, or at least more than once, so I would suggest we pull it into a \"constant\" (see SECTIONS, in template.py). This is not the only place where could pull things into \"constants\", so I\u0027m not picking on you ;-)","commit_id":"67730d0a17eb634a5e1b0e97a50cc3a58fcf97f8"},{"author":{"_account_id":7135,"name":"Liang Chen","email":"liangchen.linux@gmail.com","username":"Liang"},"change_message_id":"00923222edd0c7102af5444c6b23d1cc3d14ee46","unresolved":false,"context_lines":[{"line_number":443,"context_line":"            self.stg[st.id].stop()"},{"line_number":444,"context_line":"            del self.stg[st.id]"},{"line_number":445,"context_line":"        # use the service ThreadGroup for deletes"},{"line_number":446,"context_line":"        self.tg.add_thread(stack.delete, abandon_stack\u003dabandon_stack)"},{"line_number":447,"context_line":"        if abandon_stack:"},{"line_number":448,"context_line":"            return dict(stack_info)"},{"line_number":449,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2B4IA%3D","line":446,"updated":"2013-11-19 02:50:59.000000000","message":"Stack.delete doesn\u0027t seem to accept such an argument (abandon_stack). Should this patch depend on some other one?","commit_id":"67730d0a17eb634a5e1b0e97a50cc3a58fcf97f8"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"ecf346600b58a03cad4325b8ee2cff29dcbf26c1","unresolved":false,"context_lines":[{"line_number":443,"context_line":"            self.stg[st.id].stop()"},{"line_number":444,"context_line":"            del self.stg[st.id]"},{"line_number":445,"context_line":"        # use the service ThreadGroup for deletes"},{"line_number":446,"context_line":"        self.tg.add_thread(stack.delete, abandon_stack\u003dabandon_stack)"},{"line_number":447,"context_line":"        if abandon_stack:"},{"line_number":448,"context_line":"            return dict(stack_info)"},{"line_number":449,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Bx54%3D","line":446,"in_reply_to":"AAAATn%2F%2B4IA%3D","updated":"2013-11-20 09:58:13.000000000","message":"Agreed. Also I think a lot of this, certainly _get_stack_details, actually belongs in the Stack class rather than here in the engine service methods.","commit_id":"67730d0a17eb634a5e1b0e97a50cc3a58fcf97f8"},{"author":{"_account_id":7896,"name":"Edmund Troche","email":"edmund.troche@us.ibm.com","username":"edmund"},"change_message_id":"25ffe8c4665170f63e40b5c4415cf8ca52414105","unresolved":false,"context_lines":[{"line_number":459,"context_line":"        for resource in stack.resources.values():"},{"line_number":460,"context_line":"            res \u003d {}"},{"line_number":461,"context_line":"            res[\u0027name\u0027] \u003d resource.name"},{"line_number":462,"context_line":"            res[\u0027resource_id\u0027] \u003d resource.resource_id"},{"line_number":463,"context_line":"            res[\u0027type\u0027] \u003d resource.type()"},{"line_number":464,"context_line":"            res[\u0027action\u0027] \u003d resource.action"},{"line_number":465,"context_line":"            res[\u0027status\u0027] \u003d resource.status"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2B4qw%3D","line":462,"updated":"2013-11-18 23:41:10.000000000","message":"When we restore, do we know these id\u0027s won\u0027t clash with the ids of resources in the \"adopting\" Heat instance? Same for the stack.id.","commit_id":"67730d0a17eb634a5e1b0e97a50cc3a58fcf97f8"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"ecf346600b58a03cad4325b8ee2cff29dcbf26c1","unresolved":false,"context_lines":[{"line_number":459,"context_line":"        for resource in stack.resources.values():"},{"line_number":460,"context_line":"            res \u003d {}"},{"line_number":461,"context_line":"            res[\u0027name\u0027] \u003d resource.name"},{"line_number":462,"context_line":"            res[\u0027resource_id\u0027] \u003d resource.resource_id"},{"line_number":463,"context_line":"            res[\u0027type\u0027] \u003d resource.type()"},{"line_number":464,"context_line":"            res[\u0027action\u0027] \u003d resource.action"},{"line_number":465,"context_line":"            res[\u0027status\u0027] \u003d resource.status"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Bx7s%3D","line":462,"in_reply_to":"AAAATn%2F%2B4qw%3D","updated":"2013-11-20 09:58:13.000000000","message":"IMO these are there for informational purposes only. They must be ignored on adoption.","commit_id":"67730d0a17eb634a5e1b0e97a50cc3a58fcf97f8"},{"author":{"_account_id":7714,"name":"Tim Schnell","email":"tim.schnell@rackspace.com","username":"timductive"},"change_message_id":"382da2006eab77c407d0e118b008f890a460608c","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            for res_data in result:"},{"line_number":470,"context_line":"                res[\u0027resource_data\u0027][res_data.key] \u003d res_data.value"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"            stk_info[\u0027resources\u0027][resource.resource_id] \u003d res"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"        return stk_info"},{"line_number":475,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2B5QA%3D","line":472,"updated":"2013-11-18 21:38:25.000000000","message":"I would expect a list of resources to be returned here instead of a mapping against resource_id.","commit_id":"67730d0a17eb634a5e1b0e97a50cc3a58fcf97f8"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"ecf346600b58a03cad4325b8ee2cff29dcbf26c1","unresolved":false,"context_lines":[{"line_number":469,"context_line":"            for res_data in result:"},{"line_number":470,"context_line":"                res[\u0027resource_data\u0027][res_data.key] \u003d res_data.value"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"            stk_info[\u0027resources\u0027][resource.resource_id] \u003d res"},{"line_number":473,"context_line":""},{"line_number":474,"context_line":"        return stk_info"},{"line_number":475,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2Bx7c%3D","line":472,"in_reply_to":"AAAATn%2F%2B5QA%3D","updated":"2013-11-20 09:58:13.000000000","message":"and I would expect them to be a map by name, as that is the most logical way to represent them. The id\u0027s are informational only the moment we are done abandoning the stack. The resource names will still be guaranteed to be unique and will more naturally match the template.\n\nWhich reminds me, we need the template in this info! Otherwise on adopting we will have no way to run diffs on update.","commit_id":"67730d0a17eb634a5e1b0e97a50cc3a58fcf97f8"},{"author":{"_account_id":7714,"name":"Tim Schnell","email":"tim.schnell@rackspace.com","username":"timductive"},"change_message_id":"382da2006eab77c407d0e118b008f890a460608c","unresolved":false,"context_lines":[{"line_number":478,"context_line":"        The delete_stack method deletes a given stack."},{"line_number":479,"context_line":"        arg1 -\u003e RPC context."},{"line_number":480,"context_line":"        arg2 -\u003e Name of the stack you want to delete."},{"line_number":481,"context_line":"        \"\"\""},{"line_number":482,"context_line":"        return self.delete_stack(cnxt, stack_identity, abandon_stack\u003dTrue)"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def list_resource_types(self, cnxt):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2B5Rk%3D","line":481,"updated":"2013-11-18 21:38:25.000000000","message":"Looks like copy/paste error on this docstring.","commit_id":"67730d0a17eb634a5e1b0e97a50cc3a58fcf97f8"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"0a30ac27ca3af814abbdbab126efd62587a9ada3","unresolved":false,"context_lines":[{"line_number":422,"context_line":"        \"\"\""},{"line_number":423,"context_line":"        The delete_stack method deletes a given stack."},{"line_number":424,"context_line":"        arg1 -\u003e RPC context."},{"line_number":425,"context_line":"        arg2 -\u003e Name of the stack you want to delete."},{"line_number":426,"context_line":"        \"\"\""},{"line_number":427,"context_line":"        st \u003d self._get_stack(cnxt, stack_identity)"},{"line_number":428,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BlcY%3D","line":425,"updated":"2013-11-22 19:57:47.000000000","message":"I don\u0027t think this should be added to delete. This operation deletes the stack and respects the deletion policy. Abandon is IMO a related, but different operation in which you wish to override the policy and return some information regarding the physical resource. I think they should stay distinct operations.\n\nOtherwise, I think you at least need to add the abandon_stack arg to the pydoc and coverage for the new logic.","commit_id":"65028bcc23133797ffd21e0d526910dbc4e549e4"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"0a30ac27ca3af814abbdbab126efd62587a9ada3","unresolved":false,"context_lines":[{"line_number":456,"context_line":"        arg1 -\u003e RPC context."},{"line_number":457,"context_line":"        arg2 -\u003e Name of the stack you want to delete."},{"line_number":458,"context_line":"        \"\"\""},{"line_number":459,"context_line":"        return self.delete_stack(cnxt, stack_identity, abandon_stack\u003dTrue)"},{"line_number":460,"context_line":""},{"line_number":461,"context_line":"    def list_resource_types(self, cnxt):"},{"line_number":462,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BlbU%3D","line":459,"updated":"2013-11-22 19:57:47.000000000","message":"Per the above, I\u0027d move the abandon logic here and wrap a call to delete.","commit_id":"65028bcc23133797ffd21e0d526910dbc4e549e4"},{"author":{"_account_id":6800,"name":"Christopher Armstrong","email":"chris.armstrong@rackspace.com","username":"radix"},"change_message_id":"d51753307b2a577dbce09e82e6f5981a7ba24cf9","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        \"\"\""},{"line_number":452,"context_line":"        The abandon_stack method deletes a given stack but resources"},{"line_number":453,"context_line":"        would be retained."},{"line_number":454,"context_line":"        arg1 -\u003e RPC context."},{"line_number":455,"context_line":"        arg2 -\u003e Name of the stack you want to abandon."},{"line_number":456,"context_line":"        \"\"\""},{"line_number":457,"context_line":"        st \u003d self._get_stack(cnxt, stack_identity)"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BY3A%3D","line":454,"updated":"2013-11-26 16:31:08.000000000","message":"Please don\u0027t continue using this weird parameter documentation syntax. Just use restructured text, e.g.\n\n :param cnxt: RPC context.\n :param stack_identity: Name of the stack you want to abandon.","commit_id":"c29185df559a57d52c6d87688e50499595460527"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"c6a5f2695b6e2ef2644b510f4fda4d4daf3f509a","unresolved":false,"context_lines":[{"line_number":472,"context_line":"        # use the service ThreadGroup for deletes"},{"line_number":473,"context_line":"        self.tg.add_thread(stack.delete)"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"        return dict(stack_info)"},{"line_number":476,"context_line":""},{"line_number":477,"context_line":"    def list_resource_types(self, cnxt):"},{"line_number":478,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAATn%2F%2BUnE%3D","line":475,"updated":"2013-11-27 12:14:13.000000000","message":"I\u0027d prefer to see this refactored to reduce repeating all of the code in delete_stack.\n\nThis could be by creating a common function called by both, or just by adding an argument to delete_stack which gets set in the RPC API.  This might also be useful if we end up with more stack deletion policies other than RETAIN.\n\nRelated, it looks weird using resource.RETAIN, maybe we should have a stack.DELETION_POLICY tuple, which stores the deletion policies supported by parser.Stack, ie Delete and Retain (but not Snapshot, currently) - this would make validation of any argument passed to delete_stack easier too, if you decide to go that way.","commit_id":"c29185df559a57d52c6d87688e50499595460527"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"8c3f651407662e3351214e3c251a9f7f26fb9a1e","unresolved":false,"context_lines":[{"line_number":433,"context_line":"        return None"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    @request_context"},{"line_number":436,"context_line":"    def delete_stack(self, cnxt, stack_identity,"},{"line_number":437,"context_line":"                     deletion_policy\u003dresource.DELETE):"},{"line_number":438,"context_line":"        \"\"\""},{"line_number":439,"context_line":"        The delete_stack method deletes a given stack."}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BC7E%3D","line":436,"updated":"2013-12-03 04:19:22.000000000","message":"I\u0027d still rather see this done as explicit separate methods with shared code refactored than overloading a delete method, but its not a show-stopper if others feel strongly about this implementation.","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"f5f12bfd0f190e986e8d9bbec4e4b47268ba76f9","unresolved":false,"context_lines":[{"line_number":433,"context_line":"        return None"},{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    @request_context"},{"line_number":436,"context_line":"    def delete_stack(self, cnxt, stack_identity,"},{"line_number":437,"context_line":"                     deletion_policy\u003dresource.DELETE):"},{"line_number":438,"context_line":"        \"\"\""},{"line_number":439,"context_line":"        The delete_stack method deletes a given stack."}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9%2FE4%3D","line":436,"in_reply_to":"AAAATn%2F%2BC7E%3D","updated":"2013-12-03 21:40:01.000000000","message":"done.","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"8c3f651407662e3351214e3c251a9f7f26fb9a1e","unresolved":false,"context_lines":[{"line_number":451,"context_line":"            msg \u003d _(\u0027Deletion policy %s\u0027) % deletion_policy"},{"line_number":452,"context_line":"            raise exception.NotSupported(feature\u003dmsg)"},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"        if deletion_policy !\u003d resource.DELETE:"},{"line_number":455,"context_line":"            # Get stack details before deleting it."},{"line_number":456,"context_line":"            stack_info \u003d stack.get_abandon_data()"},{"line_number":457,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BC7A%3D","line":454,"updated":"2013-12-03 04:19:22.000000000","message":"To the point above, this assumes that for whatever other policy, we\u0027d want the abandon data which probably isn\u0027t the general case, plus this adds additional testing/regression burden on the existing delete tests which IMO isn\u0027t necessary.","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"},{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"d435f57ea9de5b29f523ed06423830c7c7a76423","unresolved":false,"context_lines":[{"line_number":447,"context_line":"        stack \u003d parser.Stack.load(cnxt, stack\u003dst)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        self._delete_stack_on_thread(st, stack)"},{"line_number":450,"context_line":"        return None"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"    def _delete_stack_on_thread(self, st, stack):"},{"line_number":453,"context_line":"        # Kill any pending threads by calling ThreadGroup.stop()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F96YY%3D","line":450,"updated":"2013-12-04 15:31:35.000000000","message":"The \"return None\" seems superfluous.","commit_id":"b2eb4d808893ee91a5b2c7829589b1d5a030b7cc"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"ac786bc0a8a99d2de26d2837eb4163c591e4614a","unresolved":false,"context_lines":[{"line_number":447,"context_line":"        stack \u003d parser.Stack.load(cnxt, stack\u003dst)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        self._delete_stack_on_thread(st, stack)"},{"line_number":450,"context_line":"        return None"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"    def _delete_stack_on_thread(self, st, stack):"},{"line_number":453,"context_line":"        # Kill any pending threads by calling ThreadGroup.stop()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F96Vc%3D","line":450,"in_reply_to":"AAAATn%2F96YY%3D","updated":"2013-12-04 18:03:06.000000000","message":"I agree (it was existing code). will remove it.","commit_id":"b2eb4d808893ee91a5b2c7829589b1d5a030b7cc"},{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"d435f57ea9de5b29f523ed06423830c7c7a76423","unresolved":false,"context_lines":[{"line_number":459,"context_line":""},{"line_number":460,"context_line":"    @request_context"},{"line_number":461,"context_line":"    def abandon_stack(self, cnxt, stack_identity,"},{"line_number":462,"context_line":"                      deletion_policy\u003dresource.DELETE):"},{"line_number":463,"context_line":"        \"\"\""},{"line_number":464,"context_line":"        The abandon_stack method abandons a given stack."},{"line_number":465,"context_line":"        :param cnxt: RPC context."}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F96ZM%3D","line":462,"updated":"2013-12-04 15:31:35.000000000","message":"Any reason to have this as a parameter? It seems that it should always be retain, or am I missing something?","commit_id":"b2eb4d808893ee91a5b2c7829589b1d5a030b7cc"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"ac786bc0a8a99d2de26d2837eb4163c591e4614a","unresolved":false,"context_lines":[{"line_number":459,"context_line":""},{"line_number":460,"context_line":"    @request_context"},{"line_number":461,"context_line":"    def abandon_stack(self, cnxt, stack_identity,"},{"line_number":462,"context_line":"                      deletion_policy\u003dresource.DELETE):"},{"line_number":463,"context_line":"        \"\"\""},{"line_number":464,"context_line":"        The abandon_stack method abandons a given stack."},{"line_number":465,"context_line":"        :param cnxt: RPC context."}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F96UA%3D","line":462,"in_reply_to":"AAAATn%2F96ZM%3D","updated":"2013-12-04 18:03:06.000000000","message":"currently it would be \u0027Retain\u0027, but the idea here was, in future we may let user to provide deletion policy like \u0027Snapshot\u0027, \u0027Delete\u0027, \u0027Retain\u0027. For now, I will remove this parameter.","commit_id":"b2eb4d808893ee91a5b2c7829589b1d5a030b7cc"},{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"d435f57ea9de5b29f523ed06423830c7c7a76423","unresolved":false,"context_lines":[{"line_number":469,"context_line":"        logger.info(_(\u0027abandoning stack %s\u0027) % st.name)"},{"line_number":470,"context_line":"        stack \u003d parser.Stack.load(cnxt, stack\u003dst)"},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        if deletion_policy not in resource.DELETION_POLICY:"},{"line_number":473,"context_line":"            msg \u003d _(\u0027Deletion policy %s\u0027) % deletion_policy"},{"line_number":474,"context_line":"            raise exception.NotSupported(feature\u003dmsg)"},{"line_number":475,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F96Ys%3D","line":472,"updated":"2013-12-04 15:31:35.000000000","message":"Possibly move this check inside Stack.set_deletion_policy. Or maybe don\u0027t do it if it\u0027s not a user specified argument for now.","commit_id":"b2eb4d808893ee91a5b2c7829589b1d5a030b7cc"},{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"d435f57ea9de5b29f523ed06423830c7c7a76423","unresolved":false,"context_lines":[{"line_number":479,"context_line":"        stack.set_deletion_policy(deletion_policy)"},{"line_number":480,"context_line":"        self._delete_stack_on_thread(st, stack)"},{"line_number":481,"context_line":"        return dict(stack_info)"},{"line_number":482,"context_line":""},{"line_number":483,"context_line":"    def list_resource_types(self, cnxt):"},{"line_number":484,"context_line":"        \"\"\""},{"line_number":485,"context_line":"        Get a list of supported resource types."}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F96Yk%3D","line":482,"updated":"2013-12-04 15:31:35.000000000","message":"dict() looks unnecessary here.","commit_id":"b2eb4d808893ee91a5b2c7829589b1d5a030b7cc"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"c4e06ffedb0abea55d46f3f1e846d2ba9dff7176","unresolved":false,"context_lines":[{"line_number":447,"context_line":"        stack \u003d parser.Stack.load(cnxt, stack\u003dst)"},{"line_number":448,"context_line":""},{"line_number":449,"context_line":"        self._delete_stack_on_thread(st, stack)"},{"line_number":450,"context_line":"        return None"},{"line_number":451,"context_line":""},{"line_number":452,"context_line":"    def _delete_stack_on_thread(self, st, stack):"},{"line_number":453,"context_line":"        # Kill any pending threads by calling ThreadGroup.stop()"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F95lE%3D","line":450,"updated":"2013-12-04 18:14:42.000000000","message":"Still returning None?","commit_id":"3a1b09c8931b8efd34dbcc975a84d8a024f73aca"}],"heat/engine/stack_resource.py":[{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"8c3f651407662e3351214e3c251a9f7f26fb9a1e","unresolved":false,"context_lines":[{"line_number":252,"context_line":"            res.set_deletion_policy(policy)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def get_abandon_data(self):"},{"line_number":255,"context_line":"        stack_res_info \u003d {"},{"line_number":256,"context_line":"            \u0027name\u0027: self.name,"},{"line_number":257,"context_line":"            \u0027resource_id\u0027: self.id,"},{"line_number":258,"context_line":"            \u0027action\u0027: self.action,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BC60%3D","line":255,"updated":"2013-12-03 04:19:22.000000000","message":"Couldn\u0027t you just return self.nested().get_abandon_data() here instead of copy-pasta a lot of code?","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"f5f12bfd0f190e986e8d9bbec4e4b47268ba76f9","unresolved":false,"context_lines":[{"line_number":252,"context_line":"            res.set_deletion_policy(policy)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def get_abandon_data(self):"},{"line_number":255,"context_line":"        stack_res_info \u003d {"},{"line_number":256,"context_line":"            \u0027name\u0027: self.name,"},{"line_number":257,"context_line":"            \u0027resource_id\u0027: self.id,"},{"line_number":258,"context_line":"            \u0027action\u0027: self.action,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9%2FZc%3D","line":255,"in_reply_to":"AAAATn%2F%2BC60%3D","updated":"2013-12-03 21:40:01.000000000","message":"makes sense. done.","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"c4e06ffedb0abea55d46f3f1e846d2ba9dff7176","unresolved":false,"context_lines":[{"line_number":247,"context_line":"        return done"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    def set_deletion_policy(self, policy):"},{"line_number":250,"context_line":"        for res in self.nested().resources.values():"},{"line_number":251,"context_line":"            res.set_deletion_policy(policy)"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    def get_abandon_data(self):"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATn%2F95kg%3D","line":250,"updated":"2013-12-04 18:14:42.000000000","message":"Another minor nit, but seems you could also just do:\n\n  self.nested().set_deletion_policy(policy)","commit_id":"3a1b09c8931b8efd34dbcc975a84d8a024f73aca"}],"heat/rpc/client.py":[{"author":{"_account_id":7714,"name":"Tim Schnell","email":"tim.schnell@rackspace.com","username":"timductive"},"change_message_id":"382da2006eab77c407d0e118b008f890a460608c","unresolved":false,"context_lines":[{"line_number":161,"context_line":""},{"line_number":162,"context_line":"        :param ctxt: RPC context."},{"line_number":163,"context_line":"        :param stack_identity: Name of the stack you want to delete."},{"line_number":164,"context_line":"        \"\"\""},{"line_number":165,"context_line":"        return self.call(ctxt,"},{"line_number":166,"context_line":"                         self.make_msg(\u0027abandon_stack\u0027,"},{"line_number":167,"context_line":"                                       stack_identity\u003dstack_identity))"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAATn%2F%2B5Po%3D","line":164,"updated":"2013-11-18 21:38:25.000000000","message":"Copy/paste error on the docstring.","commit_id":"67730d0a17eb634a5e1b0e97a50cc3a58fcf97f8"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"0a30ac27ca3af814abbdbab126efd62587a9ada3","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        resources would not be deleted."},{"line_number":162,"context_line":""},{"line_number":163,"context_line":"        :param ctxt: RPC context."},{"line_number":164,"context_line":"        :param stack_identity: Name of the stack you want to delete."},{"line_number":165,"context_line":"        \"\"\""},{"line_number":166,"context_line":"        return self.call(ctxt,"},{"line_number":167,"context_line":"                         self.make_msg(\u0027abandon_stack\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAATn%2F%2BlbA%3D","line":164,"updated":"2013-11-22 19:57:47.000000000","message":"s/delete/abandon","commit_id":"65028bcc23133797ffd21e0d526910dbc4e549e4"}],"heat/tests/test_engine_service.py":[{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"be4a173fd9f4d52a63dfbfef4b3c818d2b1545c6","unresolved":false,"context_lines":[{"line_number":1151,"context_line":"        ret \u003d self.eng.abandon_stack(self.ctx, self.stack.identifier())"},{"line_number":1152,"context_line":""},{"line_number":1153,"context_line":"        self.assertEqual(5, len(ret))"},{"line_number":1154,"context_line":"        self.assertTrue(\u0027action\u0027 in ret)"},{"line_number":1155,"context_line":"        self.assertTrue(\u0027id\u0027 in ret)"},{"line_number":1156,"context_line":"        self.assertTrue(\u0027name\u0027 in ret)"},{"line_number":1157,"context_line":"        self.assertTrue(\u0027resources\u0027 in ret)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BwEo%3D","line":1154,"updated":"2013-11-20 17:22:47.000000000","message":"I think you should not only check if the keys are present in the result but also that value for those keys are correct.","commit_id":"d6a2cfe5b63e7848fafa30d8a486b7d22004aec1"},{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"8c3f651407662e3351214e3c251a9f7f26fb9a1e","unresolved":false,"context_lines":[{"line_number":1155,"context_line":"                                                        )"},{"line_number":1156,"context_line":""},{"line_number":1157,"context_line":"    @stack_context(\u0027service_abandon_stack\u0027)"},{"line_number":1158,"context_line":"    def test_abandon_stack(self):"},{"line_number":1159,"context_line":"        self.m.StubOutWithMock(parser.Stack, \u0027load\u0027)"},{"line_number":1160,"context_line":"        parser.Stack.load(self.ctx,"},{"line_number":1161,"context_line":"                          stack\u003dmox.IgnoreArg()).AndReturn(self.stack)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BC6k%3D","line":1158,"updated":"2013-12-03 04:19:22.000000000","message":"While this seems to cover a lot of bases, would also/instead like to see a test the compares against a hard-coded dictionary showing what the abandon data *should* look like.","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"f5f12bfd0f190e986e8d9bbec4e4b47268ba76f9","unresolved":false,"context_lines":[{"line_number":1155,"context_line":"                                                        )"},{"line_number":1156,"context_line":""},{"line_number":1157,"context_line":"    @stack_context(\u0027service_abandon_stack\u0027)"},{"line_number":1158,"context_line":"    def test_abandon_stack(self):"},{"line_number":1159,"context_line":"        self.m.StubOutWithMock(parser.Stack, \u0027load\u0027)"},{"line_number":1160,"context_line":"        parser.Stack.load(self.ctx,"},{"line_number":1161,"context_line":"                          stack\u003dmox.IgnoreArg()).AndReturn(self.stack)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9%2BNA%3D","line":1158,"in_reply_to":"AAAATn%2F%2BC6k%3D","updated":"2013-12-03 21:40:01.000000000","message":"updating test to check for actual abandoned data.","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"},{"author":{"_account_id":7385,"name":"Thomas Herve","email":"therve@redhat.com","username":"therve"},"change_message_id":"d435f57ea9de5b29f523ed06423830c7c7a76423","unresolved":false,"context_lines":[{"line_number":542,"context_line":"                         self.man.delete_stack(self.ctx, stack.identifier()))"},{"line_number":543,"context_line":"        self.m.VerifyAll()"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"    def test_stack_abandon(self):"},{"line_number":546,"context_line":"        stack_name \u003d \u0027service_create_and_abandon\u0027"},{"line_number":547,"context_line":"        res._register_class(\u0027GenericResourceType\u0027,"},{"line_number":548,"context_line":"                            generic_rsrc.GenericResource)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F96YE%3D","line":545,"updated":"2013-12-04 15:31:35.000000000","message":"This test doesn\u0027t have anything to do with EngineService.abandon_stack. It probably should.","commit_id":"b2eb4d808893ee91a5b2c7829589b1d5a030b7cc"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"ac786bc0a8a99d2de26d2837eb4163c591e4614a","unresolved":false,"context_lines":[{"line_number":542,"context_line":"                         self.man.delete_stack(self.ctx, stack.identifier()))"},{"line_number":543,"context_line":"        self.m.VerifyAll()"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"    def test_stack_abandon(self):"},{"line_number":546,"context_line":"        stack_name \u003d \u0027service_create_and_abandon\u0027"},{"line_number":547,"context_line":"        res._register_class(\u0027GenericResourceType\u0027,"},{"line_number":548,"context_line":"                            generic_rsrc.GenericResource)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAATn%2F95mI%3D","line":545,"in_reply_to":"AAAATn%2F96YE%3D","updated":"2013-12-04 18:03:06.000000000","message":"will change it.","commit_id":"b2eb4d808893ee91a5b2c7829589b1d5a030b7cc"}],"heat/tests/test_parser.py":[{"author":{"_account_id":6917,"name":"Bartosz Górski","email":"bartosz@codilime.com","username":"bartosz-gorski"},"change_message_id":"be4a173fd9f4d52a63dfbfef4b3c818d2b1545c6","unresolved":false,"context_lines":[{"line_number":748,"context_line":"    @utils.stack_delete_after"},{"line_number":749,"context_line":"    def test_get_stack_details(self):"},{"line_number":750,"context_line":"        self.stack \u003d parser.Stack(self.ctx, \u0027identifier_test\u0027,"},{"line_number":751,"context_line":"                                  parser.Template({}))"},{"line_number":752,"context_line":"        self.stack.store()"},{"line_number":753,"context_line":"        info \u003d self.stack.get_stack_details()"},{"line_number":754,"context_line":"        self.assertTrue(\u0027action\u0027 in info)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2BwD4%3D","line":751,"updated":"2013-11-20 17:22:47.000000000","message":"You should use non-empty stack for testing get_stack_details()","commit_id":"d6a2cfe5b63e7848fafa30d8a486b7d22004aec1"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"54d24164f6c100bae6dfa1a262415ecae0dc5aea","unresolved":false,"context_lines":[{"line_number":755,"context_line":"        self.assertTrue(\u0027id\u0027 in info)"},{"line_number":756,"context_line":"        self.assertTrue(\u0027name\u0027 in info)"},{"line_number":757,"context_line":"        self.assertTrue(\u0027resources\u0027 in info)"},{"line_number":758,"context_line":"        self.assertTrue(\u0027status\u0027 in info)"},{"line_number":759,"context_line":""},{"line_number":760,"context_line":"    @utils.stack_delete_after"},{"line_number":761,"context_line":"    def test_set_param_id(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATn%2F%2Bvwg%3D","line":758,"updated":"2013-11-20 18:39:52.000000000","message":"Also remember to test for the template here once you add it in get_stack_details.","commit_id":"d6a2cfe5b63e7848fafa30d8a486b7d22004aec1"}],"heat/tests/test_resource.py":[{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"8c3f651407662e3351214e3c251a9f7f26fb9a1e","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.assertEqual(res.state, (res.CREATE, res.COMPLETE))"},{"line_number":83,"context_line":"        self.assertEqual(res.status_reason, \u0027wibble\u0027)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def test_set_deletion_policy(self):"},{"line_number":86,"context_line":"        tmpl \u003d {\u0027Type\u0027: \u0027Foo\u0027}"},{"line_number":87,"context_line":"        res \u003d generic_rsrc.GenericResource(\u0027test_resource\u0027, tmpl, self.stack)"},{"line_number":88,"context_line":"        res.set_deletion_policy(resource.RETAIN)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BC6c%3D","line":85,"updated":"2013-12-03 04:19:22.000000000","message":"Are we missing a test for the abandon data as well?","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"f5f12bfd0f190e986e8d9bbec4e4b47268ba76f9","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.assertEqual(res.state, (res.CREATE, res.COMPLETE))"},{"line_number":83,"context_line":"        self.assertEqual(res.status_reason, \u0027wibble\u0027)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def test_set_deletion_policy(self):"},{"line_number":86,"context_line":"        tmpl \u003d {\u0027Type\u0027: \u0027Foo\u0027}"},{"line_number":87,"context_line":"        res \u003d generic_rsrc.GenericResource(\u0027test_resource\u0027, tmpl, self.stack)"},{"line_number":88,"context_line":"        res.set_deletion_policy(resource.RETAIN)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9%2FWY%3D","line":85,"in_reply_to":"AAAATn%2F%2BC6c%3D","updated":"2013-12-03 21:40:01.000000000","message":"will add one.","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"}],"heat/tests/test_stack_resource.py":[{"author":{"_account_id":7256,"name":"Randall Burt","email":"randall.burt@rackspace.com","username":"randall-burt"},"change_message_id":"8c3f651407662e3351214e3c251a9f7f26fb9a1e","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        self.assertEqual(self.stack.id, self.parent_resource.resource_id)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @utils.stack_delete_after"},{"line_number":118,"context_line":"    def test_set_deletion_policy(self):"},{"line_number":119,"context_line":"        self.parent_resource.create_with_template(self.templ,"},{"line_number":120,"context_line":"                                                  {\"KeyName\": \"key\"})"},{"line_number":121,"context_line":"        self.stack \u003d self.parent_resource.nested()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F%2BC6U%3D","line":118,"updated":"2013-12-03 04:19:22.000000000","message":"Same as the test for resource; I think we are missing a test for the abandon data method.","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"},{"author":{"_account_id":7230,"name":"Vijendar Komalla","email":"vijendar.komalla@rackspace.com","username":"vijendar"},"change_message_id":"f5f12bfd0f190e986e8d9bbec4e4b47268ba76f9","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        self.assertEqual(self.stack.id, self.parent_resource.resource_id)"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    @utils.stack_delete_after"},{"line_number":118,"context_line":"    def test_set_deletion_policy(self):"},{"line_number":119,"context_line":"        self.parent_resource.create_with_template(self.templ,"},{"line_number":120,"context_line":"                                                  {\"KeyName\": \"key\"})"},{"line_number":121,"context_line":"        self.stack \u003d self.parent_resource.nested()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATn%2F9%2FWI%3D","line":118,"in_reply_to":"AAAATn%2F%2BC6U%3D","updated":"2013-12-03 21:40:01.000000000","message":"will add.","commit_id":"c9a9b174012bb3832a919c93535e321b72c80ee0"}]}
