)]}'
{"cinder/api/contrib/volume_actions.py":[{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7d2cede3a6f2062326f95ff4bbb1a799ee37ffb4","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        else:"},{"line_number":99,"context_line":"            mode \u003d \u0027rw\u0027"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        if instance_uuid is None and host_name is None:"},{"line_number":102,"context_line":"            msg \u003d _(\"Invalid request to attach volume to an invalid target\")"},{"line_number":103,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_5eb5d6eb","line":101,"range":{"start_line":101,"start_character":54,"end_line":101,"end_character":55},"updated":"2015-12-18 05:01:19.000000000","message":"I\u0027m not clear on the relationship between the code your removed here (if instance_uuid and host_name) and the bug this is marked as fixing?\n\nWhat\u0027s the reasoning behind the removal of the check here?","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"040104db0c017a78a5e87a25cf4b9dadcadd22e7","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        else:"},{"line_number":99,"context_line":"            mode \u003d \u0027rw\u0027"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        if instance_uuid is None and host_name is None:"},{"line_number":102,"context_line":"            msg \u003d _(\"Invalid request to attach volume to an invalid target\")"},{"line_number":103,"context_line":"            raise webob.exc.HTTPBadRequest(explanation\u003dmsg)"},{"line_number":104,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_da56955b","line":101,"range":{"start_line":101,"start_character":54,"end_line":101,"end_character":55},"in_reply_to":"3a7e1126_5eb5d6eb","updated":"2016-01-05 00:46:16.000000000","message":"So, the reasoning behind this is that we want Nova to always pass the host_name during attach.   This allows the volume manager to be able to check if there are attachments left on a host at detach time.  If there are, the the volume manager doesn\u0027t call remove_export, which then leaves the target exported and the volume still on the host.","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"}],"cinder/tests/unit/api/contrib/test_volume_actions.py":[{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7d2cede3a6f2062326f95ff4bbb1a799ee37ffb4","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        res \u003d req.get_response(fakes.wsgi_app())"},{"line_number":176,"context_line":"        self.assertEqual(202, res.status_int)"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"        body \u003d {\u0027os-attach\u0027: {\u0027instance_uuid\u0027: \u0027fake\u0027,"},{"line_number":179,"context_line":"                              \u0027host_name\u0027: \u0027fake_host\u0027,"},{"line_number":180,"context_line":"                              \u0027mountpoint\u0027: \u0027/dev/vdc\u0027}}"},{"line_number":181,"context_line":"        req \u003d webob.Request.blank(\u0027/v2/fake/volumes/1/action\u0027)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_1e22ee52","line":178,"range":{"start_line":178,"start_character":52,"end_line":178,"end_character":54},"updated":"2015-12-18 05:01:19.000000000","message":"Not a huge deal, but since this is a copy/paste of the code form the other test, maybe we should store this up in the init or something for reuse rather than continuing to copy/paste it throughout all the tests?","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"}],"cinder/tests/unit/test_volume.py":[{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"f1cf98cbef2f3107be47362e84717a5756b48dc9","unresolved":false,"context_lines":[{"line_number":2408,"context_line":"                          self.context,"},{"line_number":2409,"context_line":"                          volume_id)"},{"line_number":2410,"context_line":""},{"line_number":2411,"context_line":"    def test_run_attach_detach_multiattach_for_instances_with_host(self):"},{"line_number":2412,"context_line":"        \"\"\"Make sure volume can be attached to multiple instances.\"\"\""},{"line_number":2413,"context_line":"        mountpoint \u003d \"/dev/sdf\""},{"line_number":2414,"context_line":"        # attach volume to the instance then to detach"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a5de9d1_78454d6e","line":2411,"updated":"2016-01-28 20:59:23.000000000","message":"It would be good to have some  different name instead of \u0027...attach_detach_miltattach..\u0027 but it should not be a blocker","commit_id":"af94ada4d4c98c1d7494d1b9322e9ddc7689dcb4"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"f1cf98cbef2f3107be47362e84717a5756b48dc9","unresolved":false,"context_lines":[{"line_number":2448,"context_line":"                                                instance2_uuid, fake_host,"},{"line_number":2449,"context_line":"                                                mountpoint2, \u0027ro\u0027)"},{"line_number":2450,"context_line":"        vol \u003d db.volume_get(context.get_admin_context(), volume_id)"},{"line_number":2451,"context_line":"        self.assertEqual(\u0027in-use\u0027, vol[\u0027status\u0027])"},{"line_number":2452,"context_line":"        self.assertTrue(vol[\u0027multiattach\u0027])"},{"line_number":2453,"context_line":"        self.assertEqual(\u0027attached\u0027, attachment2[\u0027attach_status\u0027])"},{"line_number":2454,"context_line":"        self.assertEqual(mountpoint2, attachment2[\u0027mountpoint\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a5de9d1_783c6de2","line":2451,"updated":"2016-01-28 20:59:23.000000000","message":"These lines are almost the same like #2327-2432","commit_id":"af94ada4d4c98c1d7494d1b9322e9ddc7689dcb4"}],"cinder/volume/manager.py":[{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7d2cede3a6f2062326f95ff4bbb1a799ee37ffb4","unresolved":false,"context_lines":[{"line_number":957,"context_line":"                         resource\u003dvolume)"},{"line_number":958,"context_line":"                # We need to make sure the volume status is set to the correct"},{"line_number":959,"context_line":"                # status.  It could be in detaching status now, and we don\u0027t"},{"line_number":960,"context_line":"                # want to leave it there."},{"line_number":961,"context_line":"                self.db.volume_detached(context, volume_id, attachment_id)"},{"line_number":962,"context_line":"                return"},{"line_number":963,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_de91c69a","line":960,"range":{"start_line":960,"start_character":40,"end_line":960,"end_character":41},"updated":"2015-12-18 05:01:19.000000000","message":"If it\u0027s in \"detaching\" doesn\u0027t that mean that another detach call screwed up and lost status of the volume?  Or is this a race that you address by ignoring?  Considering there\u0027s a lock decorator on this it would seem that if you hit this case there\u0027s a root problem that\u0027s being masked maybe?","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7d2cede3a6f2062326f95ff4bbb1a799ee37ffb4","unresolved":false,"context_lines":[{"line_number":975,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":976,"context_line":"            elif len(attachments) \u003d\u003d 1:"},{"line_number":977,"context_line":"                attachment \u003d attachments[0]"},{"line_number":978,"context_line":"                attach_host \u003d attachment[\u0027attached_host\u0027]"},{"line_number":979,"context_line":"            else:"},{"line_number":980,"context_line":"                # there aren\u0027t any attachments for this volume."},{"line_number":981,"context_line":"                # so set the status to available and move on."}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_5ef4f6f0","line":978,"range":{"start_line":978,"start_character":55,"end_line":978,"end_character":57},"updated":"2015-12-18 05:01:19.000000000","message":"attach_host \u003d attachments[0][\u0027attached_host\u0027] ?","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"040104db0c017a78a5e87a25cf4b9dadcadd22e7","unresolved":false,"context_lines":[{"line_number":975,"context_line":"                raise exception.InvalidVolume(reason\u003dmsg)"},{"line_number":976,"context_line":"            elif len(attachments) \u003d\u003d 1:"},{"line_number":977,"context_line":"                attachment \u003d attachments[0]"},{"line_number":978,"context_line":"                attach_host \u003d attachment[\u0027attached_host\u0027]"},{"line_number":979,"context_line":"            else:"},{"line_number":980,"context_line":"                # there aren\u0027t any attachments for this volume."},{"line_number":981,"context_line":"                # so set the status to available and move on."}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_c3ec6cf5","line":978,"range":{"start_line":978,"start_character":55,"end_line":978,"end_character":57},"in_reply_to":"3a7e1126_5ef4f6f0","updated":"2016-01-05 00:46:16.000000000","message":"we use the attachment later on, otherwise yah.","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7d2cede3a6f2062326f95ff4bbb1a799ee37ffb4","unresolved":false,"context_lines":[{"line_number":1015,"context_line":"        volume \u003d self.db.volume_get(context, volume_id)"},{"line_number":1016,"context_line":"        attaches \u003d volume.volume_attachment"},{"line_number":1017,"context_line":"        host_attaches \u003d 0"},{"line_number":1018,"context_line":"        for attach in attaches:"},{"line_number":1019,"context_line":"            if attach_host \u003d\u003d attach.attached_host:"},{"line_number":1020,"context_line":"                host_attaches \u003d host_attaches + 1"},{"line_number":1021,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_5ecb96a5","line":1018,"range":{"start_line":1018,"start_character":30,"end_line":1018,"end_character":31},"updated":"2015-12-18 05:01:19.000000000","message":"for attach in volume.volume_attachment ?","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"040104db0c017a78a5e87a25cf4b9dadcadd22e7","unresolved":false,"context_lines":[{"line_number":1015,"context_line":"        volume \u003d self.db.volume_get(context, volume_id)"},{"line_number":1016,"context_line":"        attaches \u003d volume.volume_attachment"},{"line_number":1017,"context_line":"        host_attaches \u003d 0"},{"line_number":1018,"context_line":"        for attach in attaches:"},{"line_number":1019,"context_line":"            if attach_host \u003d\u003d attach.attached_host:"},{"line_number":1020,"context_line":"                host_attaches \u003d host_attaches + 1"},{"line_number":1021,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_8ec1bb56","line":1018,"range":{"start_line":1018,"start_character":30,"end_line":1018,"end_character":31},"in_reply_to":"3a7e1126_5ecb96a5","updated":"2016-01-05 00:46:16.000000000","message":"Done","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7d2cede3a6f2062326f95ff4bbb1a799ee37ffb4","unresolved":false,"context_lines":[{"line_number":1016,"context_line":"        attaches \u003d volume.volume_attachment"},{"line_number":1017,"context_line":"        host_attaches \u003d 0"},{"line_number":1018,"context_line":"        for attach in attaches:"},{"line_number":1019,"context_line":"            if attach_host \u003d\u003d attach.attached_host:"},{"line_number":1020,"context_line":"                host_attaches \u003d host_attaches + 1"},{"line_number":1021,"context_line":""},{"line_number":1022,"context_line":"        if not host_attaches:"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_1e4d0e3e","line":1019,"range":{"start_line":1019,"start_character":50,"end_line":1019,"end_character":51},"updated":"2015-12-18 05:01:19.000000000","message":"Is this safe?  You might want to ensure you can handle comparing to None in either case here maybe.","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"040104db0c017a78a5e87a25cf4b9dadcadd22e7","unresolved":false,"context_lines":[{"line_number":1016,"context_line":"        attaches \u003d volume.volume_attachment"},{"line_number":1017,"context_line":"        host_attaches \u003d 0"},{"line_number":1018,"context_line":"        for attach in attaches:"},{"line_number":1019,"context_line":"            if attach_host \u003d\u003d attach.attached_host:"},{"line_number":1020,"context_line":"                host_attaches \u003d host_attaches + 1"},{"line_number":1021,"context_line":""},{"line_number":1022,"context_line":"        if not host_attaches:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_2edbef50","line":1019,"range":{"start_line":1019,"start_character":50,"end_line":1019,"end_character":51},"in_reply_to":"3a7e1126_1e4d0e3e","updated":"2016-01-05 00:46:16.000000000","message":"Done","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7d2cede3a6f2062326f95ff4bbb1a799ee37ffb4","unresolved":false,"context_lines":[{"line_number":1019,"context_line":"            if attach_host \u003d\u003d attach.attached_host:"},{"line_number":1020,"context_line":"                host_attaches \u003d host_attaches + 1"},{"line_number":1021,"context_line":""},{"line_number":1022,"context_line":"        if not host_attaches:"},{"line_number":1023,"context_line":"            # We can safely remove the target"},{"line_number":1024,"context_line":"            # because we don\u0027t have any active attachments to that host"},{"line_number":1025,"context_line":"            LOG.info(_LI(\"remove export as there are no more attachments on\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_fea9227c","line":1022,"range":{"start_line":1022,"start_character":28,"end_line":1022,"end_character":29},"updated":"2015-12-18 05:01:19.000000000","message":"Might be more clear to use \"if host_attaches \u003d\u003d 0\" rather than using not\n\nMore importantly though, it seems that you could condense the pre-checks in 1016-1020 into a comprehension, then you could just simply look at the length of the result of that comprehension here and clean up the code considerably.","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"040104db0c017a78a5e87a25cf4b9dadcadd22e7","unresolved":false,"context_lines":[{"line_number":1019,"context_line":"            if attach_host \u003d\u003d attach.attached_host:"},{"line_number":1020,"context_line":"                host_attaches \u003d host_attaches + 1"},{"line_number":1021,"context_line":""},{"line_number":1022,"context_line":"        if not host_attaches:"},{"line_number":1023,"context_line":"            # We can safely remove the target"},{"line_number":1024,"context_line":"            # because we don\u0027t have any active attachments to that host"},{"line_number":1025,"context_line":"            LOG.info(_LI(\"remove export as there are no more attachments on\""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_d4ec24f5","line":1022,"range":{"start_line":1022,"start_character":28,"end_line":1022,"end_character":29},"in_reply_to":"3a7e1126_fea9227c","updated":"2016-01-05 00:46:16.000000000","message":"Done","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7d2cede3a6f2062326f95ff4bbb1a799ee37ffb4","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"            # We can safely remove the target"},{"line_number":1024,"context_line":"            # because we don\u0027t have any active attachments to that host"},{"line_number":1025,"context_line":"            LOG.info(_LI(\"remove export as there are no more attachments on\""},{"line_number":1026,"context_line":"                         \" host %(host)s\"), {\u0027host\u0027: attach_host})"},{"line_number":1027,"context_line":""},{"line_number":1028,"context_line":"            try:"},{"line_number":1029,"context_line":"                utils.require_driver_initialized(self.driver)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_7eb452d0","line":1026,"range":{"start_line":1026,"start_character":64,"end_line":1026,"end_character":66},"updated":"2015-12-18 05:01:19.000000000","message":"Info or debug?  I\u0027m not sure this warrants an info message or not.  If left as Info, should probably be a bit more formal:\n\"Removing export for volume with no attachments during detach\".\n\nEven better, throw in the resource tag so we can track the request in the logs easily. (resource\u003dvolume)","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"040104db0c017a78a5e87a25cf4b9dadcadd22e7","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"            # We can safely remove the target"},{"line_number":1024,"context_line":"            # because we don\u0027t have any active attachments to that host"},{"line_number":1025,"context_line":"            LOG.info(_LI(\"remove export as there are no more attachments on\""},{"line_number":1026,"context_line":"                         \" host %(host)s\"), {\u0027host\u0027: attach_host})"},{"line_number":1027,"context_line":""},{"line_number":1028,"context_line":"            try:"},{"line_number":1029,"context_line":"                utils.require_driver_initialized(self.driver)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_54b7d4f4","line":1026,"range":{"start_line":1026,"start_character":64,"end_line":1026,"end_character":66},"in_reply_to":"3a7e1126_7eb452d0","updated":"2016-01-05 00:46:16.000000000","message":"Done","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7d2cede3a6f2062326f95ff4bbb1a799ee37ffb4","unresolved":false,"context_lines":[{"line_number":1029,"context_line":"                utils.require_driver_initialized(self.driver)"},{"line_number":1030,"context_line":"                self.driver.remove_export(context.elevated(), volume)"},{"line_number":1031,"context_line":"            except exception.DriverNotInitialized:"},{"line_number":1032,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":1033,"context_line":"                    LOG.exception(_LE(\"Detach volume failed, due to \""},{"line_number":1034,"context_line":"                                      \"uninitialized driver.\"),"},{"line_number":1035,"context_line":"                                  resource\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_3e6faa93","line":1032,"range":{"start_line":1032,"start_character":56,"end_line":1032,"end_character":59},"updated":"2015-12-18 05:01:19.000000000","message":"Do we need the differentiated exception as opposed to just logging the failure and the ex message like we were doing previously?","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"040104db0c017a78a5e87a25cf4b9dadcadd22e7","unresolved":false,"context_lines":[{"line_number":1029,"context_line":"                utils.require_driver_initialized(self.driver)"},{"line_number":1030,"context_line":"                self.driver.remove_export(context.elevated(), volume)"},{"line_number":1031,"context_line":"            except exception.DriverNotInitialized:"},{"line_number":1032,"context_line":"                with excutils.save_and_reraise_exception():"},{"line_number":1033,"context_line":"                    LOG.exception(_LE(\"Detach volume failed, due to \""},{"line_number":1034,"context_line":"                                      \"uninitialized driver.\"),"},{"line_number":1035,"context_line":"                                  resource\u003dvolume)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_34a90091","line":1032,"range":{"start_line":1032,"start_character":56,"end_line":1032,"end_character":59},"in_reply_to":"3a7e1126_3e6faa93","updated":"2016-01-05 00:46:16.000000000","message":"I think this is a diff oddity.  The original had the same exception catching","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"7d2cede3a6f2062326f95ff4bbb1a799ee37ffb4","unresolved":false,"context_lines":[{"line_number":1040,"context_line":"                raise exception.RemoveExportException(volume\u003dvolume_id,"},{"line_number":1041,"context_line":"                                                      reason\u003dsix.text_type(ex))"},{"line_number":1042,"context_line":"        else:"},{"line_number":1043,"context_line":"            LOG.info("},{"line_number":1044,"context_line":"                _LI(\"There are %(num)s attachments left on host %(host)s\"),"},{"line_number":1045,"context_line":"                {\u0027num\u0027: host_attaches, \u0027host\u0027: attach_host})"},{"line_number":1046,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a7e1126_5e107601","line":1043,"range":{"start_line":1043,"start_character":20,"end_line":1043,"end_character":21},"updated":"2015-12-18 05:01:19.000000000","message":"Info or debug?  I\u0027m not sure this warrants an info message or not.","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"040104db0c017a78a5e87a25cf4b9dadcadd22e7","unresolved":false,"context_lines":[{"line_number":1040,"context_line":"                raise exception.RemoveExportException(volume\u003dvolume_id,"},{"line_number":1041,"context_line":"                                                      reason\u003dsix.text_type(ex))"},{"line_number":1042,"context_line":"        else:"},{"line_number":1043,"context_line":"            LOG.info("},{"line_number":1044,"context_line":"                _LI(\"There are %(num)s attachments left on host %(host)s\"),"},{"line_number":1045,"context_line":"                {\u0027num\u0027: host_attaches, \u0027host\u0027: attach_host})"},{"line_number":1046,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_f497e845","line":1043,"range":{"start_line":1043,"start_character":20,"end_line":1043,"end_character":21},"in_reply_to":"3a7e1126_5e107601","updated":"2016-01-05 00:46:16.000000000","message":"Done","commit_id":"b3bdf75700a79cf464386b8be1505e0bbf579b5d"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"82b94d13d6559fd9773bdb14024e3acc3df00a11","unresolved":false,"context_lines":[{"line_number":1033,"context_line":"            # We can safely remove the target"},{"line_number":1034,"context_line":"            # because we don\u0027t have any active attachments to that host"},{"line_number":1035,"context_line":"            LOG.debug(\"remove export as there are no more attachments on\""},{"line_number":1036,"context_line":"                      \" host %(host)s\", {\u0027host\u0027: attach_host})"},{"line_number":1037,"context_line":""},{"line_number":1038,"context_line":"            try:"},{"line_number":1039,"context_line":"                utils.require_driver_initialized(self.driver)"}],"source_content_type":"text/x-python","patch_set":7,"id":"fa69d971_86bf0960","line":1036,"updated":"2016-01-06 17:26:39.000000000","message":"refactor getting the host_attaches into a utils function that drivers can call.  Then they can determine what to do at terminate_connection time, to remove the export/target or not.","commit_id":"2fbb97282ff6ec212b954d96af269a450ac89b6c"},{"author":{"_account_id":13002,"name":"Shyama","email":"shyvenug@in.ibm.com","username":"shyama"},"change_message_id":"4ea9ca6b2ae47ef51024e8b3374ec087de27add5","unresolved":false,"context_lines":[{"line_number":1046,"context_line":"                                                      reason\u003dsix.text_type(ex))"},{"line_number":1047,"context_line":"        else:"},{"line_number":1048,"context_line":"            LOG.debug("},{"line_number":1049,"context_line":"                \"There are %(num)s attachments left on host %(host)s\","},{"line_number":1050,"context_line":"                {\u0027num\u0027: host_attaches, \u0027host\u0027: attach_host})"},{"line_number":1051,"context_line":""},{"line_number":1052,"context_line":"        self._notify_about_volume_usage(context, volume, \"detach.end\")"}],"source_content_type":"text/x-python","patch_set":8,"id":"7a5de9d1_c1059ac2","line":1049,"updated":"2016-01-28 06:54:34.000000000","message":"It would help if this is a info instead of debug message","commit_id":"8dad18462c1683c7680d5831cb08a921c2f600ba"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"f1cf98cbef2f3107be47362e84717a5756b48dc9","unresolved":false,"context_lines":[{"line_number":1045,"context_line":"                raise exception.RemoveExportException(volume\u003dvolume_id,"},{"line_number":1046,"context_line":"                                                      reason\u003dsix.text_type(ex))"},{"line_number":1047,"context_line":"        else:"},{"line_number":1048,"context_line":"            LOG.debug("},{"line_number":1049,"context_line":"                \"There are %(num)s attachments left on host %(host)s\","},{"line_number":1050,"context_line":"                {\u0027num\u0027: host_attaches, \u0027host\u0027: attach_host})"},{"line_number":1051,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7a5de9d1_1803f910","line":1048,"updated":"2016-01-28 20:59:23.000000000","message":"Should it be LOG.info?","commit_id":"af94ada4d4c98c1d7494d1b9322e9ddc7689dcb4"}],"cinder/volume/utils.py":[{"author":{"_account_id":8190,"name":"Drew Thorstensen (thorst)","email":"thorst@us.ibm.com","username":"thorst"},"change_message_id":"51a98bc4d1071a3409bad95cfbee38e177ece713","unresolved":false,"context_lines":[{"line_number":725,"context_line":""},{"line_number":726,"context_line":""},{"line_number":727,"context_line":"def get_host_attaches(context, volume_id, attach_host):"},{"line_number":728,"context_line":"    \"\"\"Check if the volume has any attachments for the given host"},{"line_number":729,"context_line":""},{"line_number":730,"context_line":"    :param context: volume context"},{"line_number":731,"context_line":"    :param volume_id: volume_id of the volume"}],"source_content_type":"text/x-python","patch_set":8,"id":"9a68dd71_b105247b","line":728,"range":{"start_line":728,"start_character":7,"end_line":728,"end_character":65},"updated":"2016-01-21 21:41:44.000000000","message":"This is a little hard to understand unless you look at it in the context of just this change set.\n\nMaybe this should be:\n\"\"\"\nReturn all of volume_attachments for a given host/volume combination.\n\nA given volume may be attached to multiple targets.  Within a single Host, a volume may be attached to multiple VMs.  This method returns all of the volume attachments for a given volume and host.\n\n\u003cother content\u003e\n\"\"\"","commit_id":"8dad18462c1683c7680d5831cb08a921c2f600ba"},{"author":{"_account_id":14532,"name":"Gerald McBrearty","email":"gfm@us.ibm.com","username":"gfm"},"change_message_id":"68edcba6bf8bf2b3ba1e1baaa53473701025d0d5","unresolved":false,"context_lines":[{"line_number":727,"context_line":"def get_host_attaches(context, volume_id, attach_host):"},{"line_number":728,"context_line":"    \"\"\"Return all of volume_attachments for a given host/volume combination"},{"line_number":729,"context_line":""},{"line_number":730,"context_line":"    A given volume may be attached to multiple targets.  Within a single Host,"},{"line_number":731,"context_line":"    a volume may be attached to multiple VMs."},{"line_number":732,"context_line":"    This method returns all of the volume attachments for a given volume and"},{"line_number":733,"context_line":"    host."}],"source_content_type":"text/x-python","patch_set":9,"id":"9a68dd71_79844a5d","line":730,"updated":"2016-01-22 14:44:05.000000000","message":"Nit -\u003e I think \"targets\" here is really \"initiators\".","commit_id":"af94ada4d4c98c1d7494d1b9322e9ddc7689dcb4"}]}
