)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"ee76ac6291f2937afce953f4c2222e5e727d0df6","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Changes in the drivers are left to each driver"},{"line_number":14,"context_line":"maintainer to update."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"We want to update bother the attach_volume()"},{"line_number":17,"context_line":"and detach_volume() with versionedobjects."},{"line_number":18,"context_line":"There are 3 patches in the chain."},{"line_number":19,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":35,"id":"7a77a97e_e4484d5e","line":16,"range":{"start_line":16,"start_character":18,"end_line":16,"end_character":24},"updated":"2016-11-15 08:49:19.000000000","message":"both?","commit_id":"a69137d9cf8a7c974f86c172658c86c7e39d4916"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"b1d4e38ba09ad78a9ed0243df398fe44eb14b555","unresolved":false,"context_lines":[{"line_number":13,"context_line":"Changes in the drivers are left to each driver"},{"line_number":14,"context_line":"maintainer to update."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"We want to update bother the attach_volume()"},{"line_number":17,"context_line":"and detach_volume() with versionedobjects."},{"line_number":18,"context_line":"There are 3 patches in the chain."},{"line_number":19,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":35,"id":"7a77a97e_58d0681f","line":16,"range":{"start_line":16,"start_character":18,"end_line":16,"end_character":24},"in_reply_to":"7a77a97e_e4484d5e","updated":"2016-11-18 01:56:51.000000000","message":"Done","commit_id":"a69137d9cf8a7c974f86c172658c86c7e39d4916"},{"author":{"_account_id":23083,"name":"TommyLike","email":"tommylikehu@gmail.com","username":"TommyLike"},"change_message_id":"ee76ac6291f2937afce953f4c2222e5e727d0df6","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Co-Authored-By: Thang Pham \u003cthang.g.pham@gmail.com\u003e"},{"line_number":28,"context_line":"Co-Authored-By: lisali \u003cxiaoyan.li@intel.com\u003e"},{"line_number":29,"context_line":"Partial-Implements: blueprint cinder-objects"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Change-Id: Ib153342b20f5b3e74d2815cb422b411f5690443f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":35,"id":"7a77a97e_84f959cb","line":29,"range":{"start_line":29,"start_character":0,"end_line":29,"end_character":44},"updated":"2016-11-15 08:49:19.000000000","message":"Can not find the blueprint from this link directly, does it closed or something wrong?","commit_id":"a69137d9cf8a7c974f86c172658c86c7e39d4916"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"b1d4e38ba09ad78a9ed0243df398fe44eb14b555","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Co-Authored-By: Thang Pham \u003cthang.g.pham@gmail.com\u003e"},{"line_number":28,"context_line":"Co-Authored-By: lisali \u003cxiaoyan.li@intel.com\u003e"},{"line_number":29,"context_line":"Partial-Implements: blueprint cinder-objects"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"Change-Id: Ib153342b20f5b3e74d2815cb422b411f5690443f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":35,"id":"7a77a97e_f88e942c","line":29,"range":{"start_line":29,"start_character":0,"end_line":29,"end_character":44},"in_reply_to":"7a77a97e_84f959cb","updated":"2016-11-18 01:56:51.000000000","message":"The BP was set to completed. But the ovo work is going on, so we     used to set the related patches with this BP.","commit_id":"a69137d9cf8a7c974f86c172658c86c7e39d4916"}],"cinder/db/sqlalchemy/api.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c9b3cdb62986bc5c4ab6077ff3c57223ab724b70","unresolved":false,"context_lines":[{"line_number":1592,"context_line":"                                 session\u003dsession)"},{"line_number":1593,"context_line":"        volume_updated_values \u003d {}"},{"line_number":1594,"context_line":"        volume_updated_values[\u0027updated_at\u0027] \u003d literal_column(\u0027updated_at\u0027)"},{"line_number":1595,"context_line":"        if not volume_ref[\u0027volume_attachment\u0027]:"},{"line_number":1596,"context_line":"            # Hide status update from user if we\u0027re performing volume migration"},{"line_number":1597,"context_line":"            # or uploading it to image"},{"line_number":1598,"context_line":"            if ((not volume_ref[\u0027migration_status\u0027] and"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_e029388b","line":1595,"updated":"2016-08-02 16:32:40.000000000","message":"-1: Really nice refactoring, but you should use attribute notation since this is not a dictionary but an ORM instance.","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"325d48dfe1b7005da62c54cfa43f4cbb4de42f5c","unresolved":false,"context_lines":[{"line_number":1592,"context_line":"                                 session\u003dsession)"},{"line_number":1593,"context_line":"        volume_updated_values \u003d {}"},{"line_number":1594,"context_line":"        volume_updated_values[\u0027updated_at\u0027] \u003d literal_column(\u0027updated_at\u0027)"},{"line_number":1595,"context_line":"        if not volume_ref[\u0027volume_attachment\u0027]:"},{"line_number":1596,"context_line":"            # Hide status update from user if we\u0027re performing volume migration"},{"line_number":1597,"context_line":"            # or uploading it to image"},{"line_number":1598,"context_line":"            if ((not volume_ref[\u0027migration_status\u0027] and"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_3c1d1bbe","line":1595,"in_reply_to":"bacf61ea_e029388b","updated":"2016-08-03 09:36:43.000000000","message":"Done","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d98877349268a85e8a55616486cf77f204da0b52","unresolved":false,"context_lines":[{"line_number":1611,"context_line":"    session \u003d get_session()"},{"line_number":1612,"context_line":"    with session.begin():"},{"line_number":1613,"context_line":"        attachment_updates \u003d None"},{"line_number":1614,"context_line":"        attachment \u003d None"},{"line_number":1615,"context_line":"        try:"},{"line_number":1616,"context_line":"            attachment \u003d volume_attachment_get(context, attachment_id,"},{"line_number":1617,"context_line":"                                               session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa7ab95a_0a99cd1f","line":1614,"updated":"2016-08-31 09:41:52.000000000","message":"nit: This should be moved to replace pass in L1619","commit_id":"c0a8d90fe2598be3aed65af21580d64f5c44fadd"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d98877349268a85e8a55616486cf77f204da0b52","unresolved":false,"context_lines":[{"line_number":1620,"context_line":""},{"line_number":1621,"context_line":"        if attachment:"},{"line_number":1622,"context_line":"            now \u003d timeutils.utcnow()"},{"line_number":1623,"context_line":"            attachment_updates \u003d {\u0027attach_status\u0027: \u0027detached\u0027,"},{"line_number":1624,"context_line":"                                  \u0027detach_time\u0027: now,"},{"line_number":1625,"context_line":"                                  \u0027deleted\u0027: True,"},{"line_number":1626,"context_line":"                                  \u0027deleted_at\u0027: now,"},{"line_number":1627,"context_line":"                                  \u0027updated_at\u0027:"},{"line_number":1628,"context_line":"                                  literal_column(\u0027updated_at\u0027)}"},{"line_number":1629,"context_line":"            attachment.update(attachment_updates)"},{"line_number":1630,"context_line":"            attachment.save(session\u003dsession)"},{"line_number":1631,"context_line":"            del attachment_updates[\u0027updated_at\u0027]"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa7ab95a_7f785d2c","line":1628,"range":{"start_line":1623,"start_character":0,"end_line":1628,"end_character":63},"updated":"2016-08-31 09:41:52.000000000","message":"nit: Readability would improve if we start the contents of the dictionary on the next line:\n\n attachment_updates \u003d {\n     \u0027attach_status\u0027: \u0027detached\u0027,\n     \u0027detach_time\u0027: now,\n     \u0027deleted\u0027: True,\n     \u0027deleted_at\u0027: now,\n     \u0027updated_at\u0027: literal_column(\u0027updated_at\u0027),\n }","commit_id":"c0a8d90fe2598be3aed65af21580d64f5c44fadd"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d98877349268a85e8a55616486cf77f204da0b52","unresolved":false,"context_lines":[{"line_number":1632,"context_line":""},{"line_number":1633,"context_line":"        volume_ref \u003d _volume_get(context, volume_id,"},{"line_number":1634,"context_line":"                                 session\u003dsession)"},{"line_number":1635,"context_line":"        volume_updates \u003d {}"},{"line_number":1636,"context_line":"        volume_updates[\u0027updated_at\u0027] \u003d literal_column(\u0027updated_at\u0027)"},{"line_number":1637,"context_line":"        if not volume_ref.volume_attachment:"},{"line_number":1638,"context_line":"            # Hide status update from user if we\u0027re performing volume migration"},{"line_number":1639,"context_line":"            # or uploading it to image"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa7ab95a_5f3e392a","line":1636,"range":{"start_line":1635,"start_character":0,"end_line":1636,"end_character":67},"updated":"2016-08-31 09:41:52.000000000","message":"nit: This should be merged into one:\n\n volume_updates \u003d {\u0027updated_at\u0027] \u003d literal_column(\u0027updated_at\u0027)}","commit_id":"c0a8d90fe2598be3aed65af21580d64f5c44fadd"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"12a89d012eedf8da52e38b8e8466bde4e921b555","unresolved":false,"context_lines":[{"line_number":1615,"context_line":"            attachment \u003d volume_attachment_get(context, attachment_id,"},{"line_number":1616,"context_line":"                                               session\u003dsession)"},{"line_number":1617,"context_line":"        except exception.VolumeAttachmentNotFound:"},{"line_number":1618,"context_line":"            attachment_updates \u003d None"},{"line_number":1619,"context_line":""},{"line_number":1620,"context_line":"        if attachment:"},{"line_number":1621,"context_line":"            now \u003d timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa7ab95a_74aaf71a","line":1618,"updated":"2016-09-01 09:29:54.000000000","message":"nit: L1613 should also come here, as there\u0027s no reason to initialize attachment if L1615 changes its value.","commit_id":"8781e13c0579a37541821054c5a031225ddd0d9d"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"6ae1d1ed9adb5b1f2814ac5adfb4c6dc7e9e3393","unresolved":false,"context_lines":[{"line_number":1615,"context_line":"            attachment \u003d volume_attachment_get(context, attachment_id,"},{"line_number":1616,"context_line":"                                               session\u003dsession)"},{"line_number":1617,"context_line":"        except exception.VolumeAttachmentNotFound:"},{"line_number":1618,"context_line":"            attachment_updates \u003d None"},{"line_number":1619,"context_line":""},{"line_number":1620,"context_line":"        if attachment:"},{"line_number":1621,"context_line":"            now \u003d timeutils.utcnow()"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa7ab95a_e0d365d3","line":1618,"in_reply_to":"fa7ab95a_74aaf71a","updated":"2016-09-02 07:30:54.000000000","message":"Done","commit_id":"8781e13c0579a37541821054c5a031225ddd0d9d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"12a89d012eedf8da52e38b8e8466bde4e921b555","unresolved":false,"context_lines":[{"line_number":1625,"context_line":"                \u0027deleted\u0027: True,"},{"line_number":1626,"context_line":"                \u0027deleted_at\u0027: now,"},{"line_number":1627,"context_line":"                \u0027updated_at\u0027:"},{"line_number":1628,"context_line":"                literal_column(\u0027updated_at\u0027)}"},{"line_number":1629,"context_line":"            attachment.update(attachment_updates)"},{"line_number":1630,"context_line":"            attachment.save(session\u003dsession)"},{"line_number":1631,"context_line":"            del attachment_updates[\u0027updated_at\u0027]"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa7ab95a_769bdcc9","line":1628,"updated":"2016-09-01 09:29:54.000000000","message":"nit: According to OpenStack\u0027s Style Guidelines [1] this should be:\n\n     literal_column(\u0027updated_at\u0027),\n }\n\n\n\n[1]: http://docs.openstack.org/developer/hacking/#dictionaries-lists","commit_id":"8781e13c0579a37541821054c5a031225ddd0d9d"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"6ae1d1ed9adb5b1f2814ac5adfb4c6dc7e9e3393","unresolved":false,"context_lines":[{"line_number":1625,"context_line":"                \u0027deleted\u0027: True,"},{"line_number":1626,"context_line":"                \u0027deleted_at\u0027: now,"},{"line_number":1627,"context_line":"                \u0027updated_at\u0027:"},{"line_number":1628,"context_line":"                literal_column(\u0027updated_at\u0027)}"},{"line_number":1629,"context_line":"            attachment.update(attachment_updates)"},{"line_number":1630,"context_line":"            attachment.save(session\u003dsession)"},{"line_number":1631,"context_line":"            del attachment_updates[\u0027updated_at\u0027]"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa7ab95a_31d92123","line":1628,"in_reply_to":"fa7ab95a_769bdcc9","updated":"2016-09-02 07:30:54.000000000","message":"Done","commit_id":"8781e13c0579a37541821054c5a031225ddd0d9d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"b24413b57ed504cfafdb1a5c6e919c2db199f6ab","unresolved":false,"context_lines":[{"line_number":1624,"context_line":"                \u0027deleted\u0027: True,"},{"line_number":1625,"context_line":"                \u0027deleted_at\u0027: now,"},{"line_number":1626,"context_line":"                \u0027updated_at\u0027:"},{"line_number":1627,"context_line":"                literal_column(\u0027updated_at\u0027)"},{"line_number":1628,"context_line":"            }"},{"line_number":1629,"context_line":"            attachment.update(attachment_updates)"},{"line_number":1630,"context_line":"            attachment.save(session\u003dsession)"}],"source_content_type":"text/x-python","patch_set":34,"id":"fa7ab95a_2870cba3","line":1627,"range":{"start_line":1627,"start_character":43,"end_line":1627,"end_character":44},"updated":"2016-09-02 10:01:51.000000000","message":"nit: Missing comma at the end to follow guidelines","commit_id":"d07c7bea6032539c8dcae9dcdd9ac89253279818"}],"cinder/objects/volume.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"9f92c0698e09287880d8879ec1b1e16906033c0a","unresolved":false,"context_lines":[{"line_number":432,"context_line":"    def finish_detach(self, attachment_id):"},{"line_number":433,"context_line":"        db.volume_detached(self._context, self.id, attachment_id)"},{"line_number":434,"context_line":"        # Refresh the object as above db operation change db object."},{"line_number":435,"context_line":"        self.refresh()"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"@base.CinderObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":16,"id":"bacf61ea_ad2197b6","line":435,"updated":"2016-07-29 12:27:28.000000000","message":"-1: We don\u0027t need to make another query to the DB, just make volume_detached return changed values to volume and the attachment both as dictionaries and then update here the volume using the dictionary (like I did when fixing the destroy method [1]) and make this method return the changes done to the attachment in case we want to use them to avoid another refresh of the attachment.\n\n\n[1]: https://github.com/openstack/cinder/commit/b03f539e6e106480f0caea2f561757e0049f9505","commit_id":"e277e9cf968a5d622d83a86a35bda69db9d6f501"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"afb090e1b6665b4be50827bc4376a9a9be5885cf","unresolved":false,"context_lines":[{"line_number":432,"context_line":"    def finish_detach(self, attachment_id):"},{"line_number":433,"context_line":"        db.volume_detached(self._context, self.id, attachment_id)"},{"line_number":434,"context_line":"        # Refresh the object as above db operation change db object."},{"line_number":435,"context_line":"        self.refresh()"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"@base.CinderObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":16,"id":"bacf61ea_89244bc5","line":435,"in_reply_to":"bacf61ea_ad2197b6","updated":"2016-08-01 09:03:58.000000000","message":"Done.","commit_id":"e277e9cf968a5d622d83a86a35bda69db9d6f501"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c9b3cdb62986bc5c4ab6077ff3c57223ab724b70","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from cinder.i18n import _"},{"line_number":22,"context_line":"from cinder import objects"},{"line_number":23,"context_line":"from cinder.objects import base"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CONF \u003d cfg.CONF"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_00cf2cb4","line":24,"updated":"2016-08-02 16:32:40.000000000","message":"-1: Don\u0027t remove a line here","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"325d48dfe1b7005da62c54cfa43f4cbb4de42f5c","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from cinder.i18n import _"},{"line_number":22,"context_line":"from cinder import objects"},{"line_number":23,"context_line":"from cinder.objects import base"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"CONF \u003d cfg.CONF"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_5c772f02","line":24,"in_reply_to":"bacf61ea_00cf2cb4","updated":"2016-08-03 09:36:43.000000000","message":"Done","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c9b3cdb62986bc5c4ab6077ff3c57223ab724b70","unresolved":false,"context_lines":[{"line_number":474,"context_line":""},{"line_number":475,"context_line":"    def finish_detach(self, attachment_id):"},{"line_number":476,"context_line":"        with self.obj_as_admin():"},{"line_number":477,"context_line":"            (volume_updated_values, attachment_updated_values) \u003d ("},{"line_number":478,"context_line":"                db.volume_detached(self._context, self.id, attachment_id))"},{"line_number":479,"context_line":"        if attachment_updated_values:"},{"line_number":480,"context_line":"            attachment \u003d next((x for x in self.volume_attachment"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_e06138aa","line":477,"range":{"start_line":477,"start_character":12,"end_line":477,"end_character":62},"updated":"2016-08-02 16:32:40.000000000","message":"nit: Parenthesis are not necessary, and names could be sorter (volume_updates, attach_updates)","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"325d48dfe1b7005da62c54cfa43f4cbb4de42f5c","unresolved":false,"context_lines":[{"line_number":474,"context_line":""},{"line_number":475,"context_line":"    def finish_detach(self, attachment_id):"},{"line_number":476,"context_line":"        with self.obj_as_admin():"},{"line_number":477,"context_line":"            (volume_updated_values, attachment_updated_values) \u003d ("},{"line_number":478,"context_line":"                db.volume_detached(self._context, self.id, attachment_id))"},{"line_number":479,"context_line":"        if attachment_updated_values:"},{"line_number":480,"context_line":"            attachment \u003d next((x for x in self.volume_attachment"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_bc5e2b74","line":477,"range":{"start_line":477,"start_character":12,"end_line":477,"end_character":62},"in_reply_to":"bacf61ea_e06138aa","updated":"2016-08-03 09:36:43.000000000","message":"Done","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"db8e21fef22f353b0b3a65a73a43305407da1d72","unresolved":false,"context_lines":[{"line_number":498,"context_line":"            volume_updates, attachment_updates \u003d ("},{"line_number":499,"context_line":"                db.volume_detached(self._context, self.id, attachment_id))"},{"line_number":500,"context_line":"        if attachment_updates:"},{"line_number":501,"context_line":"            attachment \u003d next((x for x in self.volume_attachment"},{"line_number":502,"context_line":"                              if x.id \u003d\u003d attachment_id), None)"},{"line_number":503,"context_line":"            if attachment:"},{"line_number":504,"context_line":"                attachment.update(attachment_updates)"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa7ab95a_e52f7aa5","line":501,"updated":"2016-08-31 09:50:07.000000000","message":"-1: We should only be doing this if volume_attachment is set in the OVO, otherwise we would be triggering a lazy load.","commit_id":"c0a8d90fe2598be3aed65af21580d64f5c44fadd"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d98877349268a85e8a55616486cf77f204da0b52","unresolved":false,"context_lines":[{"line_number":502,"context_line":"                              if x.id \u003d\u003d attachment_id), None)"},{"line_number":503,"context_line":"            if attachment:"},{"line_number":504,"context_line":"                attachment.update(attachment_updates)"},{"line_number":505,"context_line":"                attachment.obj_reset_changes(attachment_updates.keys())"},{"line_number":506,"context_line":""},{"line_number":507,"context_line":"        self.update(volume_updates)"},{"line_number":508,"context_line":"        self.obj_reset_changes(volume_updates.keys())"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa7ab95a_ca1605f1","line":505,"updated":"2016-08-31 09:41:52.000000000","message":"-1: We also have to remove the attachment from self.volume_attachment, otherwise when we do len(volume.volume_attachment) will say we have more attachments than we actually do.","commit_id":"c0a8d90fe2598be3aed65af21580d64f5c44fadd"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"12a89d012eedf8da52e38b8e8466bde4e921b555","unresolved":false,"context_lines":[{"line_number":502,"context_line":"        with self.obj_as_admin():"},{"line_number":503,"context_line":"            volume_updates, attachment_updates \u003d ("},{"line_number":504,"context_line":"                db.volume_detached(self._context, self.id, attachment_id))"},{"line_number":505,"context_line":"            db.volume_admin_metadata_delete(self._context, self.id,"},{"line_number":506,"context_line":"                                            \u0027attached_mode\u0027)"},{"line_number":507,"context_line":"            self.admin_metadata.pop(\u0027attached_mode\u0027, None)"},{"line_number":508,"context_line":"        # Remove attachment in volume only when this field is loaded."}],"source_content_type":"text/x-python","patch_set":31,"id":"fa7ab95a_7cb65ddd","line":505,"updated":"2016-09-01 09:29:54.000000000","message":"I think we shouldn\u0027t be blindly deleting the metadata just because we removed one attachment, because there could still be other attachments, but that\u0027s something for another patch.  Better not mix things in here.","commit_id":"8781e13c0579a37541821054c5a031225ddd0d9d"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"6ae1d1ed9adb5b1f2814ac5adfb4c6dc7e9e3393","unresolved":false,"context_lines":[{"line_number":502,"context_line":"        with self.obj_as_admin():"},{"line_number":503,"context_line":"            volume_updates, attachment_updates \u003d ("},{"line_number":504,"context_line":"                db.volume_detached(self._context, self.id, attachment_id))"},{"line_number":505,"context_line":"            db.volume_admin_metadata_delete(self._context, self.id,"},{"line_number":506,"context_line":"                                            \u0027attached_mode\u0027)"},{"line_number":507,"context_line":"            self.admin_metadata.pop(\u0027attached_mode\u0027, None)"},{"line_number":508,"context_line":"        # Remove attachment in volume only when this field is loaded."}],"source_content_type":"text/x-python","patch_set":31,"id":"fa7ab95a_712c8902","line":505,"in_reply_to":"fa7ab95a_7cb65ddd","updated":"2016-09-02 07:30:54.000000000","message":"Yes, this is a problem, especially when multiple attach is enabled.","commit_id":"8781e13c0579a37541821054c5a031225ddd0d9d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"12a89d012eedf8da52e38b8e8466bde4e921b555","unresolved":false,"context_lines":[{"line_number":506,"context_line":"                                            \u0027attached_mode\u0027)"},{"line_number":507,"context_line":"            self.admin_metadata.pop(\u0027attached_mode\u0027, None)"},{"line_number":508,"context_line":"        # Remove attachment in volume only when this field is loaded."},{"line_number":509,"context_line":"        if attachment_updates and self.obj_attr_is_set(\u0027volume_attachment\u0027):"},{"line_number":510,"context_line":"            attachment \u003d next((x for x in self.volume_attachment"},{"line_number":511,"context_line":"                              if x.id \u003d\u003d attachment_id), None)"},{"line_number":512,"context_line":"            if attachment:"},{"line_number":513,"context_line":"                # Remove this attachment from volume"},{"line_number":514,"context_line":"                attachment_list \u003d list(self.volume_attachment)"},{"line_number":515,"context_line":"                attachment_list.remove(attachment)"},{"line_number":516,"context_line":"                self.volume_attachment \u003d objects.VolumeAttachmentList("},{"line_number":517,"context_line":"                    context\u003dself._context,"},{"line_number":518,"context_line":"                    objects\u003dattachment_list)"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        self.update(volume_updates)"},{"line_number":521,"context_line":"        self.obj_reset_changes(volume_updates.keys())"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa7ab95a_dc5a092a","line":518,"range":{"start_line":509,"start_character":0,"end_line":518,"end_character":44},"updated":"2016-09-01 09:29:54.000000000","message":"-1: This is a little complex:\n\n if attachment_updates and self.obj_attr_is_set(\u0027volume_attachment\u0027):\n     for i, attachment in enumerate(self.volume_attachment):         \n         if attachment.id \u003d\u003d attachment_id:                          \n             del self.volume_attachment.objects[i]                   \n             break","commit_id":"8781e13c0579a37541821054c5a031225ddd0d9d"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"6ae1d1ed9adb5b1f2814ac5adfb4c6dc7e9e3393","unresolved":false,"context_lines":[{"line_number":506,"context_line":"                                            \u0027attached_mode\u0027)"},{"line_number":507,"context_line":"            self.admin_metadata.pop(\u0027attached_mode\u0027, None)"},{"line_number":508,"context_line":"        # Remove attachment in volume only when this field is loaded."},{"line_number":509,"context_line":"        if attachment_updates and self.obj_attr_is_set(\u0027volume_attachment\u0027):"},{"line_number":510,"context_line":"            attachment \u003d next((x for x in self.volume_attachment"},{"line_number":511,"context_line":"                              if x.id \u003d\u003d attachment_id), None)"},{"line_number":512,"context_line":"            if attachment:"},{"line_number":513,"context_line":"                # Remove this attachment from volume"},{"line_number":514,"context_line":"                attachment_list \u003d list(self.volume_attachment)"},{"line_number":515,"context_line":"                attachment_list.remove(attachment)"},{"line_number":516,"context_line":"                self.volume_attachment \u003d objects.VolumeAttachmentList("},{"line_number":517,"context_line":"                    context\u003dself._context,"},{"line_number":518,"context_line":"                    objects\u003dattachment_list)"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        self.update(volume_updates)"},{"line_number":521,"context_line":"        self.obj_reset_changes(volume_updates.keys())"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa7ab95a_314761bd","line":518,"range":{"start_line":509,"start_character":0,"end_line":518,"end_character":44},"in_reply_to":"fa7ab95a_dc5a092a","updated":"2016-09-02 07:30:54.000000000","message":"Much easier :), thank you.","commit_id":"8781e13c0579a37541821054c5a031225ddd0d9d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"12a89d012eedf8da52e38b8e8466bde4e921b555","unresolved":false,"context_lines":[{"line_number":518,"context_line":"                    objects\u003dattachment_list)"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        self.update(volume_updates)"},{"line_number":521,"context_line":"        self.obj_reset_changes(volume_updates.keys())"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":""},{"line_number":524,"context_line":"@base.CinderObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa7ab95a_5cc4395e","line":521,"updated":"2016-09-01 09:29:54.000000000","message":"-1: This is not enough, we also have to reset changes for:\n\n- admin_metadata\n- volume_attachment","commit_id":"8781e13c0579a37541821054c5a031225ddd0d9d"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"6ae1d1ed9adb5b1f2814ac5adfb4c6dc7e9e3393","unresolved":false,"context_lines":[{"line_number":518,"context_line":"                    objects\u003dattachment_list)"},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"        self.update(volume_updates)"},{"line_number":521,"context_line":"        self.obj_reset_changes(volume_updates.keys())"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":""},{"line_number":524,"context_line":"@base.CinderObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":31,"id":"fa7ab95a_91182dd5","line":521,"in_reply_to":"fa7ab95a_5cc4395e","updated":"2016-09-02 07:30:54.000000000","message":"Thank you for catching this. Also I add test codes.","commit_id":"8781e13c0579a37541821054c5a031225ddd0d9d"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"b24413b57ed504cfafdb1a5c6e919c2db199f6ab","unresolved":false,"context_lines":[{"line_number":514,"context_line":""},{"line_number":515,"context_line":"        self.update(volume_updates)"},{"line_number":516,"context_line":"        self.obj_reset_changes("},{"line_number":517,"context_line":"            volume_updates.keys() + [\u0027volume_attachment\u0027, \u0027admin_metadata\u0027])"},{"line_number":518,"context_line":""},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"@base.CinderObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":34,"id":"fa7ab95a_a8a4db4a","line":517,"updated":"2016-09-02 10:01:51.000000000","message":"-1: This is not going to work on Python3, because keys method returns a dict_keys class which cannot be concatenated with a list.\n\nOne option is\n\n list(volume_updates.keys()) + [\u0027volume_attachment\u0027, \u0027admin_metadata\u0027])\n\nAnother is\n\n import itertools\n\n itertools.chain(volume_updates.keys(), (\u0027volume_attachment\u0027, \u0027admin_metadata\u0027))","commit_id":"d07c7bea6032539c8dcae9dcdd9ac89253279818"}],"cinder/objects/volume_attachment.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"ceeff060719f9f7bbb31a50bec2beabec05b6fc7","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            self.obj_reset_changes()"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @classmethod"},{"line_number":62,"context_line":"    def volume_detached(cls, context, volume_id, attachment_id):"},{"line_number":63,"context_line":"        # The attachment may be detached, it updates volume\u0027s"},{"line_number":64,"context_line":"        # status in this case."},{"line_number":65,"context_line":"        db.volume_detached(context, volume_id, attachment_id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_981e65b9","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":23},"updated":"2016-07-20 15:37:35.000000000","message":"Is it more like update_detached - similarly to my comment on attach_volume patch?","commit_id":"7a5d6e7d5c67aa3bd96269269cdba977accc7ec0"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5488e9496ef0e3eaf9008115177c20ec187414c9","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            self.obj_reset_changes()"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @classmethod"},{"line_number":62,"context_line":"    def volume_detached(cls, context, volume_id, attachment_id):"},{"line_number":63,"context_line":"        # The attachment may be detached, it updates volume\u0027s"},{"line_number":64,"context_line":"        # status in this case."},{"line_number":65,"context_line":"        db.volume_detached(context, volume_id, attachment_id)"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_45db4b4f","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":23},"in_reply_to":"dada55a8_981e65b9","updated":"2016-07-21 03:48:11.000000000","message":"I set the name to detach().\n\nAnd I set this method as class, as when attachment is detached, this function continues to update volume\u0027s status.","commit_id":"7a5d6e7d5c67aa3bd96269269cdba977accc7ec0"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6702ff0d4b724e2c3b9dd9f8d0cc1ec4a290d116","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            self.obj_reset_changes()"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @classmethod"},{"line_number":62,"context_line":"    def detach(cls, context, volume_id, attachment_id):"},{"line_number":63,"context_line":"        # The attachment may be detached, it updates volume\u0027s"},{"line_number":64,"context_line":"        # status in this case."},{"line_number":65,"context_line":"        db.volume_detached(context, volume_id, attachment_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_7f9ae515","line":62,"updated":"2016-07-28 11:03:37.000000000","message":"-1: This should be in the volume object and like in the attach patch this should be renamed to reflect that this is the last part of the process, so \"finish_detach\", \"complete_detach\", or whatever you prefer.\n\nWhen moved to the volume OVO it should be able to update the OVO instance after the DB operation has completed.","commit_id":"a773a72eda05e021f9486bac8eac1f7a880fb778"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"f11ff6de0e0005aa15567064cbb7e5e4b356a976","unresolved":false,"context_lines":[{"line_number":59,"context_line":"            self.obj_reset_changes()"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    @classmethod"},{"line_number":62,"context_line":"    def detach(cls, context, volume_id, attachment_id):"},{"line_number":63,"context_line":"        # The attachment may be detached, it updates volume\u0027s"},{"line_number":64,"context_line":"        # status in this case."},{"line_number":65,"context_line":"        db.volume_detached(context, volume_id, attachment_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_0948a25a","line":62,"in_reply_to":"bacf61ea_7f9ae515","updated":"2016-07-29 08:26:25.000000000","message":"Yes, to move to volume is much better.","commit_id":"a773a72eda05e021f9486bac8eac1f7a880fb778"}],"cinder/tests/unit/objects/test_volume.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c9b3cdb62986bc5c4ab6077ff3c57223ab724b70","unresolved":false,"context_lines":[{"line_number":436,"context_line":"                                                volume.id,"},{"line_number":437,"context_line":"                                                fake.OBJECT_ID)"},{"line_number":438,"context_line":"        self.assertEqual(\u0027in-use\u0027, volume.status)"},{"line_number":439,"context_line":"        attachment \u003d next((x for x in va_objs"},{"line_number":440,"context_line":"                           if x.id \u003d\u003d fake.OBJECT_ID), None)"},{"line_number":441,"context_line":"        self.assertEqual(\u0027rw\u0027, attachment.attach_mode)"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_60d708c0","line":440,"range":{"start_line":439,"start_character":0,"end_line":440,"end_character":60},"updated":"2016-08-02 16:32:40.000000000","message":"-1: This will always be va_objs[0], so we should just address it as such","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"325d48dfe1b7005da62c54cfa43f4cbb4de42f5c","unresolved":false,"context_lines":[{"line_number":436,"context_line":"                                                volume.id,"},{"line_number":437,"context_line":"                                                fake.OBJECT_ID)"},{"line_number":438,"context_line":"        self.assertEqual(\u0027in-use\u0027, volume.status)"},{"line_number":439,"context_line":"        attachment \u003d next((x for x in va_objs"},{"line_number":440,"context_line":"                           if x.id \u003d\u003d fake.OBJECT_ID), None)"},{"line_number":441,"context_line":"        self.assertEqual(\u0027rw\u0027, attachment.attach_mode)"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_bc710be3","line":440,"range":{"start_line":439,"start_character":0,"end_line":440,"end_character":60},"in_reply_to":"bacf61ea_60d708c0","updated":"2016-08-03 09:36:43.000000000","message":"Done","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"7144bf664fdf64f3000378afd221a93453e2c62f","unresolved":false,"context_lines":[{"line_number":415,"context_line":"        volume_attach.return_value \u003d db_attachment"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        attachment \u003d volume.begin_attach()"},{"line_number":418,"context_line":"        self.assertTrue(isinstance(attachment, objects.VolumeAttachment))"},{"line_number":419,"context_line":"        self.assertEqual(volume.id, attachment.volume_id)"},{"line_number":420,"context_line":"        self.assertEqual(\u0027attaching\u0027, attachment.attach_status)"},{"line_number":421,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"bacf61ea_b1592991","line":418,"range":{"start_line":418,"start_character":8,"end_line":418,"end_character":73},"updated":"2016-08-03 11:17:15.000000000","message":"nit:\n\n self.assertIsInstance(attachment, objects.VolumeAttachment)","commit_id":"a63c3fccbc9973ace3b8e514393f0324cc3d9b2a"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"d89de7c7cbe6860b87c30f591485c4e102e3de68","unresolved":false,"context_lines":[{"line_number":415,"context_line":"        volume_attach.return_value \u003d db_attachment"},{"line_number":416,"context_line":""},{"line_number":417,"context_line":"        attachment \u003d volume.begin_attach()"},{"line_number":418,"context_line":"        self.assertTrue(isinstance(attachment, objects.VolumeAttachment))"},{"line_number":419,"context_line":"        self.assertEqual(volume.id, attachment.volume_id)"},{"line_number":420,"context_line":"        self.assertEqual(\u0027attaching\u0027, attachment.attach_status)"},{"line_number":421,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"bacf61ea_6059765a","line":418,"range":{"start_line":418,"start_character":8,"end_line":418,"end_character":73},"in_reply_to":"bacf61ea_b1592991","updated":"2016-08-04 01:49:00.000000000","message":"Done","commit_id":"a63c3fccbc9973ace3b8e514393f0324cc3d9b2a"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d98877349268a85e8a55616486cf77f204da0b52","unresolved":false,"context_lines":[{"line_number":441,"context_line":"                                                volume.id,"},{"line_number":442,"context_line":"                                                fake.OBJECT_ID)"},{"line_number":443,"context_line":"        self.assertEqual(\u0027in-use\u0027, volume.status)"},{"line_number":444,"context_line":"        self.assertEqual(\u0027rw\u0027, volume.volume_attachment[0].attach_mode)"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":""},{"line_number":447,"context_line":"class TestVolumeList(test_objects.BaseObjectsTestCase):"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa7ab95a_2aaa1186","line":444,"updated":"2016-08-31 09:41:52.000000000","message":"-1: We need to check that volume.volume_attachment contains only 2 elements instead of the original 3.","commit_id":"c0a8d90fe2598be3aed65af21580d64f5c44fadd"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"b24413b57ed504cfafdb1a5c6e919c2db199f6ab","unresolved":false,"context_lines":[{"line_number":469,"context_line":"                                                    volume.id,"},{"line_number":470,"context_line":"                                                    \u0027attached_mode\u0027)"},{"line_number":471,"context_line":"            self.assertEqual(\u0027in-use\u0027, volume.status)"},{"line_number":472,"context_line":"            self.assertEqual({}, volume.cinder_obj_get_changes())"},{"line_number":473,"context_line":"            self.assertEqual(2, len(volume.volume_attachment))"},{"line_number":474,"context_line":"            self.assertIsNone(volume.admin_metadata.get(\u0027attached_mode\u0027))"},{"line_number":475,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"fa7ab95a_8855571f","line":472,"updated":"2016-09-02 10:01:51.000000000","message":"Very good idea to add this to the tests!!","commit_id":"d07c7bea6032539c8dcae9dcdd9ac89253279818"}],"cinder/tests/unit/test_db_api.py":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c9b3cdb62986bc5c4ab6077ff3c57223ab724b70","unresolved":false,"context_lines":[{"line_number":403,"context_line":"                          db.volume_attachment_get,"},{"line_number":404,"context_line":"                          self.ctxt,"},{"line_number":405,"context_line":"                          attachment[\u0027id\u0027])"},{"line_number":406,"context_line":"        self.assertEqual(\u0027available\u0027, volume[\u0027status\u0027])"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def test_volume_detached_two_attachments(self):"},{"line_number":409,"context_line":"        volume \u003d db.volume_create(self.ctxt, {})"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_a07d80b3","line":406,"range":{"start_line":406,"start_character":38,"end_line":406,"end_character":54},"updated":"2016-08-02 16:32:40.000000000","message":"-1: volume.status","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"325d48dfe1b7005da62c54cfa43f4cbb4de42f5c","unresolved":false,"context_lines":[{"line_number":403,"context_line":"                          db.volume_attachment_get,"},{"line_number":404,"context_line":"                          self.ctxt,"},{"line_number":405,"context_line":"                          attachment[\u0027id\u0027])"},{"line_number":406,"context_line":"        self.assertEqual(\u0027available\u0027, volume[\u0027status\u0027])"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":"    def test_volume_detached_two_attachments(self):"},{"line_number":409,"context_line":"        volume \u003d db.volume_create(self.ctxt, {})"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_ff36d5e5","line":406,"range":{"start_line":406,"start_character":38,"end_line":406,"end_character":54},"in_reply_to":"bacf61ea_a07d80b3","updated":"2016-08-03 09:36:43.000000000","message":"Done","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c9b3cdb62986bc5c4ab6077ff3c57223ab724b70","unresolved":false,"context_lines":[{"line_number":408,"context_line":"    def test_volume_detached_two_attachments(self):"},{"line_number":409,"context_line":"        volume \u003d db.volume_create(self.ctxt, {})"},{"line_number":410,"context_line":"        instance_uuid \u003d fake.INSTANCE_ID"},{"line_number":411,"context_line":"        values \u003d {\u0027volume_id\u0027: volume[\u0027id\u0027],"},{"line_number":412,"context_line":"                  \u0027instance_uuid\u0027: instance_uuid,"},{"line_number":413,"context_line":"                  \u0027attach_status\u0027: \u0027attaching\u0027, }"},{"line_number":414,"context_line":"        attachment \u003d db.volume_attach(self.ctxt, values)"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_2016b055","line":411,"range":{"start_line":411,"start_character":31,"end_line":411,"end_character":43},"updated":"2016-08-02 16:32:40.000000000","message":"-1: volume.id","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"325d48dfe1b7005da62c54cfa43f4cbb4de42f5c","unresolved":false,"context_lines":[{"line_number":408,"context_line":"    def test_volume_detached_two_attachments(self):"},{"line_number":409,"context_line":"        volume \u003d db.volume_create(self.ctxt, {})"},{"line_number":410,"context_line":"        instance_uuid \u003d fake.INSTANCE_ID"},{"line_number":411,"context_line":"        values \u003d {\u0027volume_id\u0027: volume[\u0027id\u0027],"},{"line_number":412,"context_line":"                  \u0027instance_uuid\u0027: instance_uuid,"},{"line_number":413,"context_line":"                  \u0027attach_status\u0027: \u0027attaching\u0027, }"},{"line_number":414,"context_line":"        attachment \u003d db.volume_attach(self.ctxt, values)"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_5f3441dd","line":411,"range":{"start_line":411,"start_character":31,"end_line":411,"end_character":43},"in_reply_to":"bacf61ea_2016b055","updated":"2016-08-03 09:36:43.000000000","message":"Done","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c9b3cdb62986bc5c4ab6077ff3c57223ab724b70","unresolved":false,"context_lines":[{"line_number":412,"context_line":"                  \u0027instance_uuid\u0027: instance_uuid,"},{"line_number":413,"context_line":"                  \u0027attach_status\u0027: \u0027attaching\u0027, }"},{"line_number":414,"context_line":"        attachment \u003d db.volume_attach(self.ctxt, values)"},{"line_number":415,"context_line":"        values2 \u003d {\u0027volume_id\u0027: volume[\u0027id\u0027],"},{"line_number":416,"context_line":"                   \u0027instance_uuid\u0027: fake.OBJECT_ID,"},{"line_number":417,"context_line":"                   \u0027attach_status\u0027: \u0027attaching\u0027, }"},{"line_number":418,"context_line":"        db.volume_attach(self.ctxt, values2)"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_630f122f","line":415,"range":{"start_line":415,"start_character":32,"end_line":415,"end_character":44},"updated":"2016-08-02 16:32:40.000000000","message":"ditto","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"325d48dfe1b7005da62c54cfa43f4cbb4de42f5c","unresolved":false,"context_lines":[{"line_number":412,"context_line":"                  \u0027instance_uuid\u0027: instance_uuid,"},{"line_number":413,"context_line":"                  \u0027attach_status\u0027: \u0027attaching\u0027, }"},{"line_number":414,"context_line":"        attachment \u003d db.volume_attach(self.ctxt, values)"},{"line_number":415,"context_line":"        values2 \u003d {\u0027volume_id\u0027: volume[\u0027id\u0027],"},{"line_number":416,"context_line":"                   \u0027instance_uuid\u0027: fake.OBJECT_ID,"},{"line_number":417,"context_line":"                   \u0027attach_status\u0027: \u0027attaching\u0027, }"},{"line_number":418,"context_line":"        db.volume_attach(self.ctxt, values2)"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_3f318ded","line":415,"range":{"start_line":415,"start_character":32,"end_line":415,"end_character":44},"in_reply_to":"bacf61ea_630f122f","updated":"2016-08-03 09:36:43.000000000","message":"Done","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c9b3cdb62986bc5c4ab6077ff3c57223ab724b70","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                   \u0027instance_uuid\u0027: fake.OBJECT_ID,"},{"line_number":417,"context_line":"                   \u0027attach_status\u0027: \u0027attaching\u0027, }"},{"line_number":418,"context_line":"        db.volume_attach(self.ctxt, values2)"},{"line_number":419,"context_line":"        db.volume_attached(self.ctxt, attachment[\u0027id\u0027],"},{"line_number":420,"context_line":"                           instance_uuid,"},{"line_number":421,"context_line":"                           None, \u0027/tmp\u0027)"},{"line_number":422,"context_line":"        (volume_updated_values, attachment_updated_values) \u003d ("}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_2324faad","line":419,"range":{"start_line":419,"start_character":38,"end_line":419,"end_character":54},"updated":"2016-08-02 16:32:40.000000000","message":"attachment.id","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"325d48dfe1b7005da62c54cfa43f4cbb4de42f5c","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                   \u0027instance_uuid\u0027: fake.OBJECT_ID,"},{"line_number":417,"context_line":"                   \u0027attach_status\u0027: \u0027attaching\u0027, }"},{"line_number":418,"context_line":"        db.volume_attach(self.ctxt, values2)"},{"line_number":419,"context_line":"        db.volume_attached(self.ctxt, attachment[\u0027id\u0027],"},{"line_number":420,"context_line":"                           instance_uuid,"},{"line_number":421,"context_line":"                           None, \u0027/tmp\u0027)"},{"line_number":422,"context_line":"        (volume_updated_values, attachment_updated_values) \u003d ("}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_9f4cf977","line":419,"range":{"start_line":419,"start_character":38,"end_line":419,"end_character":54},"in_reply_to":"bacf61ea_2324faad","updated":"2016-08-03 09:36:43.000000000","message":"Done","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c9b3cdb62986bc5c4ab6077ff3c57223ab724b70","unresolved":false,"context_lines":[{"line_number":420,"context_line":"                           instance_uuid,"},{"line_number":421,"context_line":"                           None, \u0027/tmp\u0027)"},{"line_number":422,"context_line":"        (volume_updated_values, attachment_updated_values) \u003d ("},{"line_number":423,"context_line":"            db.volume_detached(self.ctxt, volume[\u0027id\u0027], attachment[\u0027id\u0027]))"},{"line_number":424,"context_line":"        expected_attachment \u003d {\u0027attach_status\u0027: \u0027detached\u0027,"},{"line_number":425,"context_line":"                               \u0027detach_time\u0027: mock.ANY,"},{"line_number":426,"context_line":"                               \u0027deleted\u0027: True,"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_436daecb","line":423,"range":{"start_line":423,"start_character":42,"end_line":423,"end_character":74},"updated":"2016-08-02 16:32:40.000000000","message":"-1: ORM instances should always use attribute notation and not dictionary notation, it makes it easier to know what we have and expect just by looking at the code.  Same for following field accesses.","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"325d48dfe1b7005da62c54cfa43f4cbb4de42f5c","unresolved":false,"context_lines":[{"line_number":420,"context_line":"                           instance_uuid,"},{"line_number":421,"context_line":"                           None, \u0027/tmp\u0027)"},{"line_number":422,"context_line":"        (volume_updated_values, attachment_updated_values) \u003d ("},{"line_number":423,"context_line":"            db.volume_detached(self.ctxt, volume[\u0027id\u0027], attachment[\u0027id\u0027]))"},{"line_number":424,"context_line":"        expected_attachment \u003d {\u0027attach_status\u0027: \u0027detached\u0027,"},{"line_number":425,"context_line":"                               \u0027detach_time\u0027: mock.ANY,"},{"line_number":426,"context_line":"                               \u0027deleted\u0027: True,"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_ff3d35bc","line":423,"range":{"start_line":423,"start_character":42,"end_line":423,"end_character":74},"in_reply_to":"bacf61ea_436daecb","updated":"2016-08-03 09:36:43.000000000","message":"Done","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"}],"cinder/tests/unit/test_volume.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"6a23e756e56b88aecdaaf79486f7e9ca718bf8d5","unresolved":false,"context_lines":[{"line_number":2199,"context_line":"        attachment \u003d self.volume.attach_volume(self.context, volume_id,"},{"line_number":2200,"context_line":"                                               instance_uuid, None,"},{"line_number":2201,"context_line":"                                               mountpoint, \u0027ro\u0027)"},{"line_number":2202,"context_line":"        vol \u003d db.volume_get(context.get_admin_context(), volume_id)"},{"line_number":2203,"context_line":"        self.assertEqual(\"in-use\", vol[\u0027status\u0027])"},{"line_number":2204,"context_line":"        self.assertEqual(\u0027attached\u0027, attachment[\u0027attach_status\u0027])"},{"line_number":2205,"context_line":"        self.assertEqual(mountpoint, attachment[\u0027mountpoint\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_045c0eec","line":2202,"updated":"2016-01-19 17:21:37.000000000","message":"volume.refresh()","commit_id":"73bb06ce35f1a249cbc249c9ffaa68d1d390e6de"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"6a23e756e56b88aecdaaf79486f7e9ca718bf8d5","unresolved":false,"context_lines":[{"line_number":2200,"context_line":"                                               instance_uuid, None,"},{"line_number":2201,"context_line":"                                               mountpoint, \u0027ro\u0027)"},{"line_number":2202,"context_line":"        vol \u003d db.volume_get(context.get_admin_context(), volume_id)"},{"line_number":2203,"context_line":"        self.assertEqual(\"in-use\", vol[\u0027status\u0027])"},{"line_number":2204,"context_line":"        self.assertEqual(\u0027attached\u0027, attachment[\u0027attach_status\u0027])"},{"line_number":2205,"context_line":"        self.assertEqual(mountpoint, attachment[\u0027mountpoint\u0027])"},{"line_number":2206,"context_line":"        self.assertEqual(instance_uuid, attachment[\u0027instance_uuid\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_242d9246","line":2203,"updated":"2016-01-19 17:21:37.000000000","message":"Should use dot notation here, since this test case is already using objects - volume.status","commit_id":"73bb06ce35f1a249cbc249c9ffaa68d1d390e6de"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"6a23e756e56b88aecdaaf79486f7e9ca718bf8d5","unresolved":false,"context_lines":[{"line_number":2224,"context_line":"                          volume_id)"},{"line_number":2225,"context_line":"        self.volume.detach_volume(self.context, volume_id, attachment[\u0027id\u0027],"},{"line_number":2226,"context_line":"                                  volume\u003dvolume)"},{"line_number":2227,"context_line":"        vol \u003d db.volume_get(self.context, volume_id)"},{"line_number":2228,"context_line":"        self.assertEqual(\u0027available\u0027, vol[\u0027status\u0027])"},{"line_number":2229,"context_line":""},{"line_number":2230,"context_line":"        self.volume.delete_volume(self.context, volume_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_641b8a1c","line":2227,"updated":"2016-01-19 17:21:37.000000000","message":"volume.refresh()","commit_id":"73bb06ce35f1a249cbc249c9ffaa68d1d390e6de"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"6a23e756e56b88aecdaaf79486f7e9ca718bf8d5","unresolved":false,"context_lines":[{"line_number":2263,"context_line":"                                           multiattach\u003dFalse,"},{"line_number":2264,"context_line":"                                           **self.volume_params)"},{"line_number":2265,"context_line":"        self.volume.detach_volume(self.context, volume[\u0027id\u0027], volume\u003dvolume)"},{"line_number":2266,"context_line":"        volume \u003d db.volume_get(self.context, volume[\u0027id\u0027])"},{"line_number":2267,"context_line":"        self.assertEqual(\u0027available\u0027, volume[\u0027status\u0027])"},{"line_number":2268,"context_line":""},{"line_number":2269,"context_line":"    def test_run_attach_detach_volume_for_instance_no_attachment_id(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_04b88ee4","line":2266,"updated":"2016-01-19 17:21:37.000000000","message":"volume.refresh()","commit_id":"73bb06ce35f1a249cbc249c9ffaa68d1d390e6de"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"6a23e756e56b88aecdaaf79486f7e9ca718bf8d5","unresolved":false,"context_lines":[{"line_number":2313,"context_line":""},{"line_number":2314,"context_line":"        self.volume.detach_volume(self.context, volume_id, attachment[\u0027id\u0027],"},{"line_number":2315,"context_line":"                                  volume\u003dvolume)"},{"line_number":2316,"context_line":"        vol \u003d db.volume_get(self.context, volume_id)"},{"line_number":2317,"context_line":"        self.assertEqual(\u0027in-use\u0027, vol[\u0027status\u0027])"},{"line_number":2318,"context_line":""},{"line_number":2319,"context_line":"        self.volume.detach_volume(self.context, volume_id, attachment2[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_84c47e5f","line":2316,"updated":"2016-01-19 17:21:37.000000000","message":"volume.refresh()","commit_id":"73bb06ce35f1a249cbc249c9ffaa68d1d390e6de"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"6a23e756e56b88aecdaaf79486f7e9ca718bf8d5","unresolved":false,"context_lines":[{"line_number":2314,"context_line":"        self.volume.detach_volume(self.context, volume_id, attachment[\u0027id\u0027],"},{"line_number":2315,"context_line":"                                  volume\u003dvolume)"},{"line_number":2316,"context_line":"        vol \u003d db.volume_get(self.context, volume_id)"},{"line_number":2317,"context_line":"        self.assertEqual(\u0027in-use\u0027, vol[\u0027status\u0027])"},{"line_number":2318,"context_line":""},{"line_number":2319,"context_line":"        self.volume.detach_volume(self.context, volume_id, attachment2[\u0027id\u0027],"},{"line_number":2320,"context_line":"                                  volume\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_448c4635","line":2317,"updated":"2016-01-19 17:21:37.000000000","message":"Should use dot notation - volume.status","commit_id":"73bb06ce35f1a249cbc249c9ffaa68d1d390e6de"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"6a23e756e56b88aecdaaf79486f7e9ca718bf8d5","unresolved":false,"context_lines":[{"line_number":2318,"context_line":""},{"line_number":2319,"context_line":"        self.volume.detach_volume(self.context, volume_id, attachment2[\u0027id\u0027],"},{"line_number":2320,"context_line":"                                  volume\u003dvolume)"},{"line_number":2321,"context_line":"        vol \u003d db.volume_get(self.context, volume_id)"},{"line_number":2322,"context_line":"        self.assertEqual(\u0027available\u0027, vol[\u0027status\u0027])"},{"line_number":2323,"context_line":""},{"line_number":2324,"context_line":"        attachment \u003d self.volume.attach_volume(self.context, volume_id,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_a47d021e","line":2321,"updated":"2016-01-19 17:21:37.000000000","message":"Ditto - volume.refresh()","commit_id":"73bb06ce35f1a249cbc249c9ffaa68d1d390e6de"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"6a23e756e56b88aecdaaf79486f7e9ca718bf8d5","unresolved":false,"context_lines":[{"line_number":2319,"context_line":"        self.volume.detach_volume(self.context, volume_id, attachment2[\u0027id\u0027],"},{"line_number":2320,"context_line":"                                  volume\u003dvolume)"},{"line_number":2321,"context_line":"        vol \u003d db.volume_get(self.context, volume_id)"},{"line_number":2322,"context_line":"        self.assertEqual(\u0027available\u0027, vol[\u0027status\u0027])"},{"line_number":2323,"context_line":""},{"line_number":2324,"context_line":"        attachment \u003d self.volume.attach_volume(self.context, volume_id,"},{"line_number":2325,"context_line":"                                               instance_uuid, None,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_24def211","line":2322,"updated":"2016-01-19 17:21:37.000000000","message":"Should use dot notation - volume.status","commit_id":"73bb06ce35f1a249cbc249c9ffaa68d1d390e6de"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"6a23e756e56b88aecdaaf79486f7e9ca718bf8d5","unresolved":false,"context_lines":[{"line_number":2324,"context_line":"        attachment \u003d self.volume.attach_volume(self.context, volume_id,"},{"line_number":2325,"context_line":"                                               instance_uuid, None,"},{"line_number":2326,"context_line":"                                               mountpoint, \u0027ro\u0027)"},{"line_number":2327,"context_line":"        vol \u003d db.volume_get(self.context, volume_id)"},{"line_number":2328,"context_line":"        self.assertEqual(\u0027in-use\u0027, vol[\u0027status\u0027])"},{"line_number":2329,"context_line":"        self.volume.detach_volume(self.context, volume_id, volume\u003dvolume)"},{"line_number":2330,"context_line":"        vol \u003d db.volume_get(self.context, volume_id)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_e4fe9a6a","line":2327,"updated":"2016-01-19 17:21:37.000000000","message":"Ditto - volume.refresh()","commit_id":"73bb06ce35f1a249cbc249c9ffaa68d1d390e6de"}],"cinder/tests/unit/test_volume_rpcapi.py":[{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"e618e9a4c790ae7389ed5647fc65af28b9463936","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            spec \u003d jsonutils.to_primitive(kwargs[\u0027request_spec\u0027])"},{"line_number":168,"context_line":"            kwargs[\u0027request_spec\u0027] \u003d spec"},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"        expected_msg \u003d self._build_expected_msg(**kwargs)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        if \u0027host\u0027 in kwargs:"},{"line_number":173,"context_line":"            host \u003d kwargs[\u0027host\u0027]"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_193d4fdd","line":170,"updated":"2016-07-12 10:06:45.000000000","message":"Create a new function _build_expected_msg as it will raise pep8 too complex error if not.","commit_id":"d11170a0376fc59e05c53a7c6d42f34642496a7e"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c9b3cdb62986bc5c4ab6077ff3c57223ab724b70","unresolved":false,"context_lines":[{"line_number":341,"context_line":"    @ddt.data(\u00272.0\u0027, \u00272.5\u0027)"},{"line_number":342,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027)"},{"line_number":343,"context_line":"    def test_detach_volume(self, version, can_send_version):"},{"line_number":344,"context_line":"        can_send_version.side_effect \u003d ("},{"line_number":345,"context_line":"            lambda x: versionutils.convert_version_to_tuple(x) \u003c\u003d"},{"line_number":346,"context_line":"            versionutils.convert_version_to_tuple(version))"},{"line_number":347,"context_line":"        self._test_volume_api(\u0027detach_volume\u0027,"},{"line_number":348,"context_line":"                              rpc_method\u003d\u0027call\u0027,"},{"line_number":349,"context_line":"                              volume\u003dself.fake_volume_obj,"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_a3ff4aa9","line":346,"range":{"start_line":344,"start_character":0,"end_line":346,"end_character":59},"updated":"2016-08-02 16:32:40.000000000","message":"-1: Very nice lambda, but it\u0027s unnecessarily complex since we know the call is for always for version 2.5:\n\n can_send_version.return_value \u003d version \u003d\u003d \u00272.5\u0027","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"325d48dfe1b7005da62c54cfa43f4cbb4de42f5c","unresolved":false,"context_lines":[{"line_number":341,"context_line":"    @ddt.data(\u00272.0\u0027, \u00272.5\u0027)"},{"line_number":342,"context_line":"    @mock.patch(\u0027oslo_messaging.RPCClient.can_send_version\u0027)"},{"line_number":343,"context_line":"    def test_detach_volume(self, version, can_send_version):"},{"line_number":344,"context_line":"        can_send_version.side_effect \u003d ("},{"line_number":345,"context_line":"            lambda x: versionutils.convert_version_to_tuple(x) \u003c\u003d"},{"line_number":346,"context_line":"            versionutils.convert_version_to_tuple(version))"},{"line_number":347,"context_line":"        self._test_volume_api(\u0027detach_volume\u0027,"},{"line_number":348,"context_line":"                              rpc_method\u003d\u0027call\u0027,"},{"line_number":349,"context_line":"                              volume\u003dself.fake_volume_obj,"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_6bd4e746","line":346,"range":{"start_line":344,"start_character":0,"end_line":346,"end_character":59},"in_reply_to":"bacf61ea_a3ff4aa9","updated":"2016-08-03 09:36:43.000000000","message":"Done","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"}],"cinder/volume/manager.py":[{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"6a23e756e56b88aecdaaf79486f7e9ca718bf8d5","unresolved":false,"context_lines":[{"line_number":204,"context_line":"class VolumeManager(manager.SchedulerDependentManager):"},{"line_number":205,"context_line":"    \"\"\"Manages attachable block storage devices.\"\"\""},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    RPC_API_VERSION \u003d \u00271.38\u0027"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    target \u003d messaging.Target(version\u003dRPC_API_VERSION)"},{"line_number":210,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_04872ed8","line":207,"updated":"2016-01-19 17:21:37.000000000","message":"Depending on which patch goes in first.  Some of your other patches would conflict with this one.  It might be better to make this and maybe others dependent - i.e. chain them together.","commit_id":"73bb06ce35f1a249cbc249c9ffaa68d1d390e6de"},{"author":{"_account_id":8247,"name":"Thang Pham","email":"thang.g.pham@gmail.com","username":"thang.pham"},"change_message_id":"6a23e756e56b88aecdaaf79486f7e9ca718bf8d5","unresolved":false,"context_lines":[{"line_number":992,"context_line":"                         resource\u003dvolume)"},{"line_number":993,"context_line":"                updates \u003d {\u0027status\u0027: \u0027available\u0027,"},{"line_number":994,"context_line":"                           \u0027attach_status\u0027: \u0027detached\u0027}"},{"line_number":995,"context_line":"                volume.update(updates)"},{"line_number":996,"context_line":"                volume.save()"},{"line_number":997,"context_line":"                return"},{"line_number":998,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba63e191_a403c241","line":995,"updated":"2016-01-19 17:21:37.000000000","message":"DictCompat would eventually go away, so lets avoid using update() where we can.  Lets use:\nvolume.status \u003d \u0027available\u0027\nvolume.attach_status \u003d \u0027detached\u0027","commit_id":"73bb06ce35f1a249cbc249c9ffaa68d1d390e6de"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"ceeff060719f9f7bbb31a50bec2beabec05b6fc7","unresolved":false,"context_lines":[{"line_number":995,"context_line":"            # Get attachment state, as it may be detached."},{"line_number":996,"context_line":"            if attachment:"},{"line_number":997,"context_line":"                attachment.refresh()"},{"line_number":998,"context_line":"            elif attachment_id:"},{"line_number":999,"context_line":"                attachment \u003d objects.VolumeAttachment.get_by_id("},{"line_number":1000,"context_line":"                    context, attachment_id)"},{"line_number":1001,"context_line":"        except exception.VolumeAttachmentNotFound:"},{"line_number":1002,"context_line":"            LOG.info(_LI(\"Volume detach called, but volume not attached.\"),"},{"line_number":1003,"context_line":"                     resource\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_f8e961b8","line":1000,"range":{"start_line":998,"start_character":0,"end_line":1000,"end_character":43},"updated":"2016-07-20 15:37:35.000000000","message":"Can we comment that this is only for backward compatibility and we can remove this in Ocata?","commit_id":"7a5d6e7d5c67aa3bd96269269cdba977accc7ec0"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8f13f6b3e44f9a36739f330d9e98d67a116877df","unresolved":false,"context_lines":[{"line_number":983,"context_line":""},{"line_number":984,"context_line":"    @coordination.synchronized(\u0027{volume_id}-{f_name}\u0027)"},{"line_number":985,"context_line":"    def detach_volume(self, context, volume_id, attachment_id\u003dNone,"},{"line_number":986,"context_line":"                      volume\u003dNone, attachment\u003dNone):"},{"line_number":987,"context_line":"        \"\"\"Updates db to show volume is detached.\"\"\""},{"line_number":988,"context_line":"        # TODO(vish): refactor this into a more general \"unreserve\""},{"line_number":989,"context_line":"        # FIXME(lixiaoy1): Remove this in v3.0 of RPC API."}],"source_content_type":"text/x-python","patch_set":14,"id":"dada55a8_a29e5904","line":986,"range":{"start_line":986,"start_character":33,"end_line":986,"end_character":50},"updated":"2016-07-21 15:16:36.000000000","message":"Haven\u0027t you removed this one?","commit_id":"f4e53a1edf628221155f4fa4fdd9230551a2b101"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"3a6082889d74ff91364a0fff6f7c3115deb96a36","unresolved":false,"context_lines":[{"line_number":983,"context_line":""},{"line_number":984,"context_line":"    @coordination.synchronized(\u0027{volume_id}-{f_name}\u0027)"},{"line_number":985,"context_line":"    def detach_volume(self, context, volume_id, attachment_id\u003dNone,"},{"line_number":986,"context_line":"                      volume\u003dNone, attachment\u003dNone):"},{"line_number":987,"context_line":"        \"\"\"Updates db to show volume is detached.\"\"\""},{"line_number":988,"context_line":"        # TODO(vish): refactor this into a more general \"unreserve\""},{"line_number":989,"context_line":"        # FIXME(lixiaoy1): Remove this in v3.0 of RPC API."}],"source_content_type":"text/x-python","patch_set":14,"id":"dada55a8_096489e3","line":986,"range":{"start_line":986,"start_character":33,"end_line":986,"end_character":50},"in_reply_to":"dada55a8_a29e5904","updated":"2016-07-22 06:31:29.000000000","message":"I forgot to remove. Sorry.","commit_id":"f4e53a1edf628221155f4fa4fdd9230551a2b101"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"8f13f6b3e44f9a36739f330d9e98d67a116877df","unresolved":false,"context_lines":[{"line_number":1053,"context_line":"        objects.VolumeAttachment.detach("},{"line_number":1054,"context_line":"            context.elevated(), volume_id, attachment.id)"},{"line_number":1055,"context_line":""},{"line_number":1056,"context_line":"        if volume.admin_metadata.get(\u0027attached_mode\u0027):"},{"line_number":1057,"context_line":"            volume.admin_metadata.pop(\u0027attached_mode\u0027)"},{"line_number":1058,"context_line":"            volume.save()"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"        # NOTE(jdg): We used to do an ensure export here to"},{"line_number":1061,"context_line":"        # catch upgrades while volumes were attached (E-\u003eF)"}],"source_content_type":"text/x-python","patch_set":14,"id":"dada55a8_8214f54c","line":1058,"range":{"start_line":1056,"start_character":0,"end_line":1058,"end_character":25},"updated":"2016-07-21 15:16:36.000000000","message":"If attached_mode was set to \"\", then this will leave it as is. I think we should rework this to:\n\n        volume.admin_metadata.pop(\u0027attached_mode\u0027, None)\n        volume.save()\n\nor\n\n        if \u0027attached_mode\u0027 in volume.admin_metadata:\n            volume.admin_metadata.pop(\u0027attached_mode\u0027)\n            volume.save()\n\nAm I making sense?","commit_id":"f4e53a1edf628221155f4fa4fdd9230551a2b101"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"3a6082889d74ff91364a0fff6f7c3115deb96a36","unresolved":false,"context_lines":[{"line_number":1053,"context_line":"        objects.VolumeAttachment.detach("},{"line_number":1054,"context_line":"            context.elevated(), volume_id, attachment.id)"},{"line_number":1055,"context_line":""},{"line_number":1056,"context_line":"        if volume.admin_metadata.get(\u0027attached_mode\u0027):"},{"line_number":1057,"context_line":"            volume.admin_metadata.pop(\u0027attached_mode\u0027)"},{"line_number":1058,"context_line":"            volume.save()"},{"line_number":1059,"context_line":""},{"line_number":1060,"context_line":"        # NOTE(jdg): We used to do an ensure export here to"},{"line_number":1061,"context_line":"        # catch upgrades while volumes were attached (E-\u003eF)"}],"source_content_type":"text/x-python","patch_set":14,"id":"dada55a8_3928c099","line":1058,"range":{"start_line":1056,"start_character":0,"end_line":1058,"end_character":25},"in_reply_to":"dada55a8_8214f54c","updated":"2016-07-22 06:31:29.000000000","message":"This is more accurate. Done","commit_id":"f4e53a1edf628221155f4fa4fdd9230551a2b101"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6702ff0d4b724e2c3b9dd9f8d0cc1ec4a290d116","unresolved":false,"context_lines":[{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"        # We\u0027re going to remove the export here"},{"line_number":1065,"context_line":"        # (delete the iscsi target)"},{"line_number":1066,"context_line":"        volume.refresh()"},{"line_number":1067,"context_line":"        try:"},{"line_number":1068,"context_line":"            utils.require_driver_initialized(self.driver)"},{"line_number":1069,"context_line":"            self.driver.remove_export(context.elevated(), volume)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_7f1dc572","line":1066,"updated":"2016-07-28 11:03:37.000000000","message":"-1: If detach operation updated volume as it should we wouldn\u0027t need this refresh.","commit_id":"a773a72eda05e021f9486bac8eac1f7a880fb778"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"f11ff6de0e0005aa15567064cbb7e5e4b356a976","unresolved":false,"context_lines":[{"line_number":1063,"context_line":""},{"line_number":1064,"context_line":"        # We\u0027re going to remove the export here"},{"line_number":1065,"context_line":"        # (delete the iscsi target)"},{"line_number":1066,"context_line":"        volume.refresh()"},{"line_number":1067,"context_line":"        try:"},{"line_number":1068,"context_line":"            utils.require_driver_initialized(self.driver)"},{"line_number":1069,"context_line":"            self.driver.remove_export(context.elevated(), volume)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_8945b218","line":1066,"in_reply_to":"bacf61ea_7f1dc572","updated":"2016-07-29 08:26:25.000000000","message":"Done","commit_id":"a773a72eda05e021f9486bac8eac1f7a880fb778"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c9b3cdb62986bc5c4ab6077ff3c57223ab724b70","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"            volume.refresh()"},{"line_number":1012,"context_line":""},{"line_number":1013,"context_line":"        if attachment_id:"},{"line_number":1014,"context_line":"            attachment \u003d next((x for x in volume.volume_attachment"},{"line_number":1015,"context_line":"                              if x.id \u003d\u003d attachment_id), None)"},{"line_number":1016,"context_line":"            if attachment is None:"},{"line_number":1017,"context_line":"                LOG.info(_LI(\"Volume detach called, but volume not attached.\"),"},{"line_number":1018,"context_line":"                         resource\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_e3a4a2ba","line":1015,"range":{"start_line":1014,"start_character":12,"end_line":1015,"end_character":62},"updated":"2016-08-02 16:32:40.000000000","message":"-1: Why do we want to get all attachments instead of just the one we are looking for?  This seems inneficient.","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"325d48dfe1b7005da62c54cfa43f4cbb4de42f5c","unresolved":false,"context_lines":[{"line_number":1011,"context_line":"            volume.refresh()"},{"line_number":1012,"context_line":""},{"line_number":1013,"context_line":"        if attachment_id:"},{"line_number":1014,"context_line":"            attachment \u003d next((x for x in volume.volume_attachment"},{"line_number":1015,"context_line":"                              if x.id \u003d\u003d attachment_id), None)"},{"line_number":1016,"context_line":"            if attachment is None:"},{"line_number":1017,"context_line":"                LOG.info(_LI(\"Volume detach called, but volume not attached.\"),"},{"line_number":1018,"context_line":"                         resource\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_ffe37503","line":1015,"range":{"start_line":1014,"start_character":12,"end_line":1015,"end_character":62},"in_reply_to":"bacf61ea_e3a4a2ba","updated":"2016-08-03 09:36:43.000000000","message":"Done.","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"d98877349268a85e8a55616486cf77f204da0b52","unresolved":false,"context_lines":[{"line_number":1101,"context_line":"                    {\u0027attach_status\u0027: \u0027error_detaching\u0027})"},{"line_number":1102,"context_line":""},{"line_number":1103,"context_line":"        volume.finish_detach(attachment.id)"},{"line_number":1104,"context_line":"        with volume.obj_as_admin():"},{"line_number":1105,"context_line":"            volume.admin_metadata.pop(\u0027attached_mode\u0027, None)"},{"line_number":1106,"context_line":"            volume.save()"},{"line_number":1107,"context_line":""},{"line_number":1108,"context_line":"        # NOTE(jdg): We used to do an ensure export here to"},{"line_number":1109,"context_line":"        # catch upgrades while volumes were attached (E-\u003eF)"}],"source_content_type":"text/x-python","patch_set":30,"id":"fa7ab95a_c5ba760a","line":1106,"range":{"start_line":1104,"start_character":0,"end_line":1106,"end_character":25},"updated":"2016-08-31 09:41:52.000000000","message":"-1: Shouldn\u0027t this be done in finish_detach?  And shouldn\u0027t we only remove attached_mode if there are no remaining attached volumes?","commit_id":"c0a8d90fe2598be3aed65af21580d64f5c44fadd"},{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"19263606c9dfeebf0041beb7c9ac74de526a685d","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"                      volume\u003dNone):"},{"line_number":1024,"context_line":"        \"\"\"Updates db to show volume is detached.\"\"\""},{"line_number":1025,"context_line":"        # TODO(vish): refactor this into a more general \"unreserve\""},{"line_number":1026,"context_line":"        # FIXME(lixiaoy1): Remove this in v3.0 of RPC API."},{"line_number":1027,"context_line":"        if volume is None:"},{"line_number":1028,"context_line":"            # For older clients, mimic the old behavior and look up the volume"},{"line_number":1029,"context_line":"            # by its volume_id."}],"source_content_type":"text/x-python","patch_set":38,"id":"5a74a57a_49de1f12","line":1026,"range":{"start_line":1026,"start_character":42,"end_line":1026,"end_character":46},"updated":"2016-11-25 10:00:29.000000000","message":"We\u0027re currently in v3.0. You mean v4.0.","commit_id":"342ae29810db3514c609cdb80288c106a32508ff"}],"cinder/volume/rpcapi.py":[{"author":{"_account_id":11600,"name":"Michał Dulko","email":"michal.dulko@gmail.com","username":"dulek"},"change_message_id":"ceeff060719f9f7bbb31a50bec2beabec05b6fc7","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        msg_args \u003d {\u0027volume_id\u0027: volume.id,"},{"line_number":195,"context_line":"                    \u0027attachment_id\u0027: attachment_id,"},{"line_number":196,"context_line":"                    \u0027volume\u0027: volume,"},{"line_number":197,"context_line":"                    \u0027attachment\u0027: attachment}"},{"line_number":198,"context_line":"        version \u003d \u00272.4\u0027"},{"line_number":199,"context_line":"        if not self.client.can_send_version(\u00272.4\u0027):"},{"line_number":200,"context_line":"            version \u003d \u00272.0\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_95491063","line":197,"range":{"start_line":197,"start_character":20,"end_line":197,"end_character":44},"updated":"2016-07-20 15:37:35.000000000","message":"Ah, that\u0027s pretty interesting. So actually we\u0027re sending all the attachments inside the volume object. Probably we only need a simple method in Volume that will retrieve the correct one based on ID from volume_attachment field (yes, it\u0027s a poor naming for a list) and then sending it won\u0027t be necessary.","commit_id":"7a5d6e7d5c67aa3bd96269269cdba977accc7ec0"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"5488e9496ef0e3eaf9008115177c20ec187414c9","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        msg_args \u003d {\u0027volume_id\u0027: volume.id,"},{"line_number":195,"context_line":"                    \u0027attachment_id\u0027: attachment_id,"},{"line_number":196,"context_line":"                    \u0027volume\u0027: volume,"},{"line_number":197,"context_line":"                    \u0027attachment\u0027: attachment}"},{"line_number":198,"context_line":"        version \u003d \u00272.4\u0027"},{"line_number":199,"context_line":"        if not self.client.can_send_version(\u00272.4\u0027):"},{"line_number":200,"context_line":"            version \u003d \u00272.0\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_80c6d197","line":197,"range":{"start_line":197,"start_character":20,"end_line":197,"end_character":44},"in_reply_to":"dada55a8_95491063","updated":"2016-07-21 03:48:11.000000000","message":"oh, I didn\u0027t notice that attachments were included in volume.\n\nAnd seems that we no need to include just the correct attachment, as attachment_id may be None.","commit_id":"7a5d6e7d5c67aa3bd96269269cdba977accc7ec0"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"6702ff0d4b724e2c3b9dd9f8d0cc1ec4a290d116","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        2.2 - Adds support for sending objects over RPC in manage_existing()."},{"line_number":104,"context_line":"        2.3  - Adds support for sending objects over RPC in"},{"line_number":105,"context_line":"               initialize_connection()."},{"line_number":106,"context_line":"        2.4 - Adds support for sending objects over RPC in detach_volume()."},{"line_number":107,"context_line":"    \"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    RPC_API_VERSION \u003d \u00272.4\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_8ad03955","line":106,"updated":"2016-07-28 11:03:37.000000000","message":"-1: How can the attach and detach patches have the same version being in different patches?  Aren\u0027t you creating a patch chain so they are all linked?","commit_id":"a773a72eda05e021f9486bac8eac1f7a880fb778"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"887caf615fb3a129ed6454fc4f164cf41d69d68a","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        2.2 - Adds support for sending objects over RPC in manage_existing()."},{"line_number":104,"context_line":"        2.3  - Adds support for sending objects over RPC in"},{"line_number":105,"context_line":"               initialize_connection()."},{"line_number":106,"context_line":"        2.4 - Adds support for sending objects over RPC in detach_volume()."},{"line_number":107,"context_line":"    \"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    RPC_API_VERSION \u003d \u00272.4\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_78247bae","line":106,"in_reply_to":"bacf61ea_0900a2a9","updated":"2016-07-29 12:29:11.000000000","message":"Well, I think it would make more sense to chain these 2 patches together instead of having them fight to see which one lands first, forcing the other to change, but whatever works for you is fine.  :-)","commit_id":"a773a72eda05e021f9486bac8eac1f7a880fb778"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"b9b5a2cde79feaa0b7be815bba6e9523f776a388","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        2.2 - Adds support for sending objects over RPC in manage_existing()."},{"line_number":104,"context_line":"        2.3  - Adds support for sending objects over RPC in"},{"line_number":105,"context_line":"               initialize_connection()."},{"line_number":106,"context_line":"        2.4 - Adds support for sending objects over RPC in detach_volume()."},{"line_number":107,"context_line":"    \"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    RPC_API_VERSION \u003d \u00272.4\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_c3e57738","line":106,"in_reply_to":"bacf61ea_78247bae","updated":"2016-08-01 09:03:51.000000000","message":"I made a chain.","commit_id":"a773a72eda05e021f9486bac8eac1f7a880fb778"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"f11ff6de0e0005aa15567064cbb7e5e4b356a976","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        2.2 - Adds support for sending objects over RPC in manage_existing()."},{"line_number":104,"context_line":"        2.3  - Adds support for sending objects over RPC in"},{"line_number":105,"context_line":"               initialize_connection()."},{"line_number":106,"context_line":"        2.4 - Adds support for sending objects over RPC in detach_volume()."},{"line_number":107,"context_line":"    \"\"\""},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    RPC_API_VERSION \u003d \u00272.4\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"bacf61ea_0900a2a9","line":106,"in_reply_to":"bacf61ea_8ad03955","updated":"2016-07-29 08:26:25.000000000","message":"There is no dependency for these two patches. As we only update related rpc interface/manager functions, there is no change to data model.\n\nOnce either patch is merged, the other patch will be rebased to update the version.","commit_id":"a773a72eda05e021f9486bac8eac1f7a880fb778"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c9b3cdb62986bc5c4ab6077ff3c57223ab724b70","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        2.3  - Adds support for sending objects over RPC in"},{"line_number":105,"context_line":"               initialize_connection()."},{"line_number":106,"context_line":"        2.4 - Adds support for sending objects over RPC in attach_volume()."},{"line_number":107,"context_line":"        2.5 - Adds support for sending objects over RPC in detach_volume()."},{"line_number":108,"context_line":"    \"\"\""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    RPC_API_VERSION \u003d \u00272.5\u0027"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_c3c35e37","line":107,"updated":"2016-08-02 16:32:40.000000000","message":"Thank you for chaining both patches  :-)","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"c9b3cdb62986bc5c4ab6077ff3c57223ab724b70","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        if not self.client.can_send_version(\u00272.5\u0027):"},{"line_number":204,"context_line":"            version \u003d \u00272.0\u0027"},{"line_number":205,"context_line":"            msg_args.pop(\u0027volume\u0027)"},{"line_number":206,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], version)"},{"line_number":207,"context_line":"        return cctxt.call(ctxt, \u0027detach_volume\u0027, **msg_args)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def copy_volume_to_image(self, ctxt, volume, image_meta):"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_c3f19e97","line":206,"range":{"start_line":206,"start_character":32,"end_line":206,"end_character":47},"updated":"2016-08-02 16:32:40.000000000","message":"-1: volume.host","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"},{"author":{"_account_id":15961,"name":"lisali","email":"xiaoyan.li@intel.com","username":"lisali"},"change_message_id":"325d48dfe1b7005da62c54cfa43f4cbb4de42f5c","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        if not self.client.can_send_version(\u00272.5\u0027):"},{"line_number":204,"context_line":"            version \u003d \u00272.0\u0027"},{"line_number":205,"context_line":"            msg_args.pop(\u0027volume\u0027)"},{"line_number":206,"context_line":"        cctxt \u003d self._get_cctxt(volume[\u0027host\u0027], version)"},{"line_number":207,"context_line":"        return cctxt.call(ctxt, \u0027detach_volume\u0027, **msg_args)"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def copy_volume_to_image(self, ctxt, volume, image_meta):"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_1f200949","line":206,"range":{"start_line":206,"start_character":32,"end_line":206,"end_character":47},"in_reply_to":"bacf61ea_c3f19e97","updated":"2016-08-03 09:36:43.000000000","message":"Done","commit_id":"6ea18096878a48afba65d811fc765c18afd21c25"}]}
