)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"fdfcd518c13e27dc3919df106d424c03f31ba564","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Anna Babich \u003cababich@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-10-08 18:22:50 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Functional tests for os-extended-server-attributes (legacy and 2.3 microversion) have been added."},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I0c8f096134838b90e17720f2a28e649998a02e3b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"7a2fa921_5967e3b6","line":7,"updated":"2015-10-08 15:36:51.000000000","message":"Two notes on your commit message:\n\n1. The first paragraph becomes a summary describing the commit; we like to keep it under 50 characters, with 72 characters being a hard limit.\n\n2. There should be subsequent paragraphs describing the change in more detail.\n\n(Note that paragraphs are set off from each other by blank lines.)\n\nYou may wish to consult [1] regarding how we like commit messages formatted.  Note that, while I have the capability to edit your commit message for you, since I expect you will have to upload a new patchset, I\u0027d rather let you make the necessary changes, so that any changes I make don\u0027t get accidentally overwritten.\n\n[1] https://wiki.openstack.org/wiki/GitCommitMessages","commit_id":"af25bbb539a4db418a569bbe6bb067f96ac89f15"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"93b13b9652aef9f830683edd92f32b1e8231db42","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Anna Babich \u003cababich@mirantis.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-10-08 18:55:22 +0300"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Functional tests for os-extended-server-attributes (legacy and 2.3 microversion) have been added"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I0c8f096134838b90e17720f2a28e649998a02e3b"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"7a2fa921_3ff0c790","line":7,"updated":"2015-10-08 16:07:38.000000000","message":"Your commit message still needs to be updated.  This summary line is 96 characters long, and there\u0027s no detail paragraph.","commit_id":"bedc5fb951cad5a383696ca99513c620d0de3c62"}],"novaclient/tests/functional/v2/legacy/test_extended_attributes.py":[{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"fdfcd518c13e27dc3919df106d424c03f31ba564","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from novaclient.tests.functional import base"},{"line_number":2,"context_line":"from novaclient.v2 import shell"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"class TestExtendedAtributesNovaClient(base.ClientTestBase):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_f9a26fad","line":1,"updated":"2015-10-08 15:36:51.000000000","message":"This file is missing the Apache License header…","commit_id":"af25bbb539a4db418a569bbe6bb067f96ac89f15"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"fdfcd518c13e27dc3919df106d424c03f31ba564","unresolved":false,"context_lines":[{"line_number":1,"context_line":"from novaclient.tests.functional import base"},{"line_number":2,"context_line":"from novaclient.v2 import shell"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"class TestExtendedAtributesNovaClient(base.ClientTestBase):"},{"line_number":5,"context_line":"    \"\"\"os-extended-server-attributes functional tests for basic nova-api version.\"\"\""},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"    COMPUTE_API_VERSION \u003d \"2.1\""}],"source_content_type":"text/x-python","patch_set":1,"id":"7a2fa921_19dacb4c","line":4,"updated":"2015-10-08 15:36:51.000000000","message":"So, PEP8 requires that all classes be preceded by two blank lines, rather than a single blank line as you have here.","commit_id":"af25bbb539a4db418a569bbe6bb067f96ac89f15"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"93b13b9652aef9f830683edd92f32b1e8231db42","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2015 IBM Corp."},{"line_number":2,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":3,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":4,"context_line":"#    a copy of the License at"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a2fa921_5f1b43ca","line":1,"updated":"2015-10-08 16:07:38.000000000","message":"Are you IBM?  I think you should leave off the \"Copyright\" line; all we really need here is the license header itself.","commit_id":"bedc5fb951cad5a383696ca99513c620d0de3c62"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"563829b01a6d0d914898e5628e5d507b02403d58","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    def test_extended_server_attributes(self):"},{"line_number":42,"context_line":"        server, volume \u003d self._create_server_and_attach_volume()"},{"line_number":43,"context_line":"        table \u003d self.nova(\u0027show %s\u0027 % server.id)"},{"line_number":44,"context_line":"        for attr in [\u0027host\u0027, \u0027hypervisor_hostname\u0027, \u0027instance_name\u0027]:"},{"line_number":45,"context_line":"            self.assertIn(attr, table)"},{"line_number":46,"context_line":"        volume_attr \u003d self._get_value_from_the_table("},{"line_number":47,"context_line":"            table, \u0027os-extended-volumes:volumes_attached\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a2fa921_071b3d74","line":44,"updated":"2015-10-08 16:53:49.000000000","message":"same comment as in TestCase for v2.3","commit_id":"ac4c2a49a1bff39d078175eef2e9b77bc5148712"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"563829b01a6d0d914898e5628e5d507b02403d58","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            self.assertIn(attr, table)"},{"line_number":46,"context_line":"        volume_attr \u003d self._get_value_from_the_table("},{"line_number":47,"context_line":"            table, \u0027os-extended-volumes:volumes_attached\u0027)"},{"line_number":48,"context_line":"        self.assertIn(\u0027id\u0027, volume_attr)"},{"line_number":49,"context_line":"        self._release(server.id, volume)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a2fa921_34e0e995","line":48,"updated":"2015-10-08 16:53:49.000000000","message":"\u0027id\u0027 can be a substring of some uuid or word, so I prefer to parse volume_attr (using json.dumps) and check that \u0027id\u0027 is a key of a volumes dicts.","commit_id":"ac4c2a49a1bff39d078175eef2e9b77bc5148712"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"228a6c0bbe10030fcbff5502e3c8c3e7de9756ba","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        volume_attr \u003d self._get_value_from_the_table("},{"line_number":47,"context_line":"            table, \u0027os-extended-volumes:volumes_attached\u0027)"},{"line_number":48,"context_line":"        self.assertIn(\u0027id\u0027, volume_attr)"},{"line_number":49,"context_line":"        self._release(server.id, volume)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a2fa921_94553dc3","line":49,"updated":"2015-10-08 16:37:36.000000000","message":"This should be called from _create_server_and_attach_volume using self.addCleanup so that it\u0027s handled gracefully in case something fails in the test, otherwise tearDown doesn\u0027t get this and we don\u0027t cleanup.","commit_id":"ac4c2a49a1bff39d078175eef2e9b77bc5148712"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6b2a7c4d6493006236ccef3ef8b13bd39097373c","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    def _create_server_and_attach_volume(self):"},{"line_number":25,"context_line":"        name \u003d self.name_generate(prefix\u003d\u0027server\u0027)"},{"line_number":26,"context_line":"        server \u003d self.client.servers.create(name, self.image, self.flavor)"},{"line_number":27,"context_line":"        shell._poll_for_status("},{"line_number":28,"context_line":"            self.client.servers.get, server.id,"},{"line_number":29,"context_line":"            \u0027building\u0027, [\u0027active\u0027])"},{"line_number":30,"context_line":"        volume \u003d self.client.volumes.create(1)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a26ad4f_5594f189","line":27,"updated":"2015-10-28 19:48:50.000000000","message":"If this times out we don\u0027t delete the instance and we leak resources.  We should have a separate cleanup for deleting the server instance from the detach and delete of the volume.  addCleanup is a stack so we can push things on that in order and it should be OK.","commit_id":"c7e58ea1362730f23b5f44e460018cd91c3dca51"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6b2a7c4d6493006236ccef3ef8b13bd39097373c","unresolved":false,"context_lines":[{"line_number":30,"context_line":"        volume \u003d self.client.volumes.create(1)"},{"line_number":31,"context_line":"        self.wait_for_volume_status(volume, \u0027available\u0027)"},{"line_number":32,"context_line":"        self.nova(\u0027volume-attach\u0027, params\u003d\"%s %s\" % (name, volume.id))"},{"line_number":33,"context_line":"        self.wait_for_volume_status(volume, \u0027in-use\u0027)"},{"line_number":34,"context_line":"        self.addCleanup(self._release_instance, server, volume)"},{"line_number":35,"context_line":"        return server, volume"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a26ad4f_f555fdc5","line":33,"updated":"2015-10-28 19:48:50.000000000","message":"Same here; if we timeout waiting for the volume to be attached, we aren\u0027t deleting the volume and we are leaking resources.","commit_id":"c7e58ea1362730f23b5f44e460018cd91c3dca51"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"ff23a6f9317f201c1784aa58ef6e58c957d2a8b3","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        self.wait_for_volume_status(volume, \u0027available\u0027)"},{"line_number":33,"context_line":"        self.nova(\u0027volume-attach\u0027, params\u003d\"%s %s\" % (name, volume.id))"},{"line_number":34,"context_line":"        self.wait_for_volume_status(volume, \u0027in-use\u0027)"},{"line_number":35,"context_line":"        if False:"},{"line_number":36,"context_line":"            self.addCleanup(volume.delete)"},{"line_number":37,"context_line":"        else:"},{"line_number":38,"context_line":"            self.addCleanup(self._release_volume, server, volume)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a26ad4f_b0eac572","line":35,"updated":"2015-11-02 17:04:23.000000000","message":"Er…what\u0027s this for?  This whole conditional is equivalent to just:\n\n    self.addCleanup(self._release_volume, server, volume)\n\nIs this intended for future work?  If so, use a TODO comment explaining what the future work is and including the code, rather than a dead \u0027if\u0027…","commit_id":"b7d407e3b9da038eaa68455e14fbaf01c506f27b"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"9f8b24cde155910f37c561e7461bd5cbed1a1084","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        shell._poll_for_status("},{"line_number":28,"context_line":"            self.client.servers.get, server.id,"},{"line_number":29,"context_line":"            \u0027building\u0027, [\u0027active\u0027])"},{"line_number":30,"context_line":"        self.addCleanup(server.delete)"},{"line_number":31,"context_line":"        volume \u003d self.client.volumes.create(1)"},{"line_number":32,"context_line":"        self.wait_for_volume_status(volume, \u0027available\u0027)"},{"line_number":33,"context_line":"        self.nova(\u0027volume-attach\u0027, params\u003d\"%s %s\" % (name, volume.id))"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa80f949_7dd4591f","line":30,"updated":"2015-11-05 16:43:13.000000000","message":"Adding the cleanup *after* the _poll_for_status() does not address Matt\u0027s comment; if _poll_for_status() times out, we *still* leak the server, because the cleanup hasn\u0027t been added to the stack, yet.  This cleanup needs to be added immediately before the call to _poll_for_status().","commit_id":"356de9d8b09d79b56f9fd5faf14c49310f98bf94"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"36302714f167e05fe1aa2e54620f1ed606efcec1","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        self.wait_for_volume_status(volume, \u0027available\u0027)"},{"line_number":33,"context_line":"        self.nova(\u0027volume-attach\u0027, params\u003d\"%s %s\" % (name, volume.id))"},{"line_number":34,"context_line":"        self.wait_for_volume_status(volume, \u0027in-use\u0027)"},{"line_number":35,"context_line":"        self.addCleanup(self.nova, \u0027volume-delete\u0027, params\u003dvolume.id)"},{"line_number":36,"context_line":"        self.addCleanup(self._release_volume, server, volume)"},{"line_number":37,"context_line":"        return server, volume"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa80f949_f4ec4291","line":35,"updated":"2015-11-03 16:54:12.000000000","message":"Isn\u0027t this redundant?  The cleanup on line 36 would run first; that calls _release_volume(), which has, as its last line, \"self.nova(\u0027volume-delete\u0027, params\u003dvolume.id)\"—the same code you have here on line 35.","commit_id":"356de9d8b09d79b56f9fd5faf14c49310f98bf94"},{"author":{"_account_id":16437,"name":"Anna Babich","email":"anna.v.babich@gmail.com","username":"ababich"},"change_message_id":"a352de87f46cdada65688ea21a09017d6887ebac","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        self.wait_for_volume_status(volume, \u0027available\u0027)"},{"line_number":33,"context_line":"        self.nova(\u0027volume-attach\u0027, params\u003d\"%s %s\" % (name, volume.id))"},{"line_number":34,"context_line":"        self.wait_for_volume_status(volume, \u0027in-use\u0027)"},{"line_number":35,"context_line":"        self.addCleanup(self.nova, \u0027volume-delete\u0027, params\u003dvolume.id)"},{"line_number":36,"context_line":"        self.addCleanup(self._release_volume, server, volume)"},{"line_number":37,"context_line":"        return server, volume"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"da85f559_e0546355","line":35,"in_reply_to":"fa80f949_3d425111","updated":"2015-11-09 12:09:40.000000000","message":"Good idea, thanks!","commit_id":"356de9d8b09d79b56f9fd5faf14c49310f98bf94"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"9f8b24cde155910f37c561e7461bd5cbed1a1084","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        self.wait_for_volume_status(volume, \u0027available\u0027)"},{"line_number":33,"context_line":"        self.nova(\u0027volume-attach\u0027, params\u003d\"%s %s\" % (name, volume.id))"},{"line_number":34,"context_line":"        self.wait_for_volume_status(volume, \u0027in-use\u0027)"},{"line_number":35,"context_line":"        self.addCleanup(self.nova, \u0027volume-delete\u0027, params\u003dvolume.id)"},{"line_number":36,"context_line":"        self.addCleanup(self._release_volume, server, volume)"},{"line_number":37,"context_line":"        return server, volume"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa80f949_3d425111","line":35,"in_reply_to":"fa80f949_c7ce2b83","updated":"2015-11-05 16:43:13.000000000","message":"There\u0027s still a redundancy, and I don\u0027t think Matt\u0027s comment has been fully addressed, either.  Regarding Matt\u0027s concern: on line 31, you create the volume; then, on line 32, you wait for it to become available.  On line 33, you then try to attach the volume.  If that times out, the method exits, and the volume still hasn\u0027t been deleted, because you have not yet added the cleanup routine.\n\nI would suggest moving the addCleanup() call from line 35 to immediately after the volume creation on line 31—before the wait_for_volume_status().  Line 42 can be removed, as it is purely redundant, and the cleanup calling volume-delete would be run after the call to _release_volume() anyway.","commit_id":"356de9d8b09d79b56f9fd5faf14c49310f98bf94"},{"author":{"_account_id":16437,"name":"Anna Babich","email":"anna.v.babich@gmail.com","username":"ababich"},"change_message_id":"4fa5e34cb275fcb006f53cb3dc0d601dd6409f10","unresolved":false,"context_lines":[{"line_number":32,"context_line":"        self.wait_for_volume_status(volume, \u0027available\u0027)"},{"line_number":33,"context_line":"        self.nova(\u0027volume-attach\u0027, params\u003d\"%s %s\" % (name, volume.id))"},{"line_number":34,"context_line":"        self.wait_for_volume_status(volume, \u0027in-use\u0027)"},{"line_number":35,"context_line":"        self.addCleanup(self.nova, \u0027volume-delete\u0027, params\u003dvolume.id)"},{"line_number":36,"context_line":"        self.addCleanup(self._release_volume, server, volume)"},{"line_number":37,"context_line":"        return server, volume"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"fa80f949_c7ce2b83","line":35,"in_reply_to":"fa80f949_f4ec4291","updated":"2015-11-05 16:19:14.000000000","message":"It concerns Matt Riedemann\u0027s comment to the patch 5 about resources leakage when wait_for_volume_status(volume, \u0027in-use\u0027) times out. The _release_volume is intended for cleanup of any attached volume and I\u0027m not sure that it will be helpful for the first case, because we don\u0027t have nothing to detach here.","commit_id":"356de9d8b09d79b56f9fd5faf14c49310f98bf94"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"144ca77b4d11d82430976f97dc0916a04203f673","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        shell._poll_for_status("},{"line_number":28,"context_line":"            self.client.servers.get, server.id,"},{"line_number":29,"context_line":"            \u0027building\u0027, [\u0027active\u0027])"},{"line_number":30,"context_line":"        self.addCleanup(server.delete)"},{"line_number":31,"context_line":"        volume \u003d self.client.volumes.create(1)"},{"line_number":32,"context_line":"        self.addCleanup(self._release_volume, server, volume)"},{"line_number":33,"context_line":"        self.wait_for_volume_status(volume, \u0027available\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_1bab1976","line":30,"updated":"2015-11-09 12:50:30.000000000","message":"My comment regarding this addCleanup() hasn\u0027t been addressed.  It should be immediately before the _poll_for_status() call.","commit_id":"6444f087e6daefb40371630320315bc8f14c7804"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"144ca77b4d11d82430976f97dc0916a04203f673","unresolved":false,"context_lines":[{"line_number":29,"context_line":"            \u0027building\u0027, [\u0027active\u0027])"},{"line_number":30,"context_line":"        self.addCleanup(server.delete)"},{"line_number":31,"context_line":"        volume \u003d self.client.volumes.create(1)"},{"line_number":32,"context_line":"        self.addCleanup(self._release_volume, server, volume)"},{"line_number":33,"context_line":"        self.wait_for_volume_status(volume, \u0027available\u0027)"},{"line_number":34,"context_line":"        self.nova(\u0027volume-attach\u0027, params\u003d\"%s %s\" % (name, volume.id))"},{"line_number":35,"context_line":"        self.wait_for_volume_status(volume, \u0027in-use\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"da85f559_5ba1a193","line":32,"updated":"2015-11-09 12:50:30.000000000","message":"You moved the wrong addCleanup().  I recommended the one from line 35 (now line 36) be moved here, but you moved the other one.","commit_id":"6444f087e6daefb40371630320315bc8f14c7804"},{"author":{"_account_id":679,"name":"Kevin L. Mitchell","email":"klmitch@mit.edu","username":"klmitch"},"change_message_id":"827797047118a179083e7955c22d8b7e43940d30","unresolved":false,"context_lines":[{"line_number":33,"context_line":"        self.wait_for_volume_status(volume, \u0027available\u0027)"},{"line_number":34,"context_line":"        self.nova(\u0027volume-attach\u0027, params\u003d\"%s %s\" % (name, volume.id))"},{"line_number":35,"context_line":"        self.wait_for_volume_status(volume, \u0027in-use\u0027)"},{"line_number":36,"context_line":"        self.addCleanup(self._release_volume, server, volume)"},{"line_number":37,"context_line":"        return server, volume"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def _release_volume(self, server, volume):"}],"source_content_type":"text/x-python","patch_set":9,"id":"da85f559_1e18e71c","line":36,"updated":"2015-11-09 13:08:33.000000000","message":"I think this addCleanup() needs to be just before the wait_for_volume_status(), but from my understanding, that\u0027s the last necessary tweak…","commit_id":"9d9c0a28cdc853e414311b4f1d155284bc39b915"}],"novaclient/tests/functional/v2/test_extended_attributes.py":[{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"563829b01a6d0d914898e5628e5d507b02403d58","unresolved":false,"context_lines":[{"line_number":24,"context_line":"        table \u003d self.nova(\u0027show %s\u0027 % server.id)"},{"line_number":25,"context_line":"        for attr in [\u0027reservation_id\u0027, \u0027launch_index\u0027, \u0027ramdisk_id\u0027,"},{"line_number":26,"context_line":"                     \u0027kernel_id\u0027, \u0027hostname\u0027, \u0027root_device_name\u0027, \u0027user_data\u0027]:"},{"line_number":27,"context_line":"            self.assertIn(attr, table)"},{"line_number":28,"context_line":"        volume_attr \u003d self._get_value_from_the_table("},{"line_number":29,"context_line":"            table, \u0027os-extended-volumes:volumes_attached\u0027)"},{"line_number":30,"context_line":"        self.assertIn(\u0027delete_on_termination\u0027, volume_attr)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a2fa921_940f7d38","line":27,"updated":"2015-10-08 16:53:49.000000000","message":"I prefer to use `self._get_value_from_the_table` here, since name of server can contain all this words. `self._get_value_from_the_table` will check that this attr is a key in the table(first column) and raise an exception if not.","commit_id":"ac4c2a49a1bff39d078175eef2e9b77bc5148712"},{"author":{"_account_id":9545,"name":"Andriy Kurilin","email":"andr.kurilin@gmail.com","username":"akurilin"},"change_message_id":"563829b01a6d0d914898e5628e5d507b02403d58","unresolved":false,"context_lines":[{"line_number":27,"context_line":"            self.assertIn(attr, table)"},{"line_number":28,"context_line":"        volume_attr \u003d self._get_value_from_the_table("},{"line_number":29,"context_line":"            table, \u0027os-extended-volumes:volumes_attached\u0027)"},{"line_number":30,"context_line":"        self.assertIn(\u0027delete_on_termination\u0027, volume_attr)"},{"line_number":31,"context_line":"        self._release(server.id, volume)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a2fa921_d49655ef","line":30,"updated":"2015-10-08 16:53:49.000000000","message":"`delete_on_termination` can\u0027t be a substing of something, but I prefer to check that it is a key of dict too","commit_id":"ac4c2a49a1bff39d078175eef2e9b77bc5148712"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6b2a7c4d6493006236ccef3ef8b13bd39097373c","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        # Check that attribute given below also exists in \u0027nova show\u0027 table"},{"line_number":39,"context_line":"        # as a key (first column) of table dict"},{"line_number":40,"context_line":"        volume_attr \u003d self._get_value_from_the_table("},{"line_number":41,"context_line":"            table, \u0027os-extended-volumes:volumes_attached\u0027)"},{"line_number":42,"context_line":"        # Check that \u0027delete_on_termination\u0027 exists as a key"},{"line_number":43,"context_line":"        # of volume_attr dict"},{"line_number":44,"context_line":"        self.assertIn(\u0027delete_on_termination\u0027, json.loads(volume_attr)[0])"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a26ad4f_b50545c3","line":41,"updated":"2015-10-28 19:48:50.000000000","message":"Huh, looks like we need to update the REST API version history doc:\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/nova/api/openstack/rest_api_version_history.rst#n47\n\nI\u0027ll do that separately.","commit_id":"c7e58ea1362730f23b5f44e460018cd91c3dca51"}]}
