)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"cf1d8f839f354c1daef48bcbb9990a5199e934fd","unresolved":false,"context_lines":[{"line_number":7,"context_line":"LVM+tgt:iscsi target deleted after VM live migrate"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Cinder_volume does not check whether there is connection before it"},{"line_number":10,"context_line":"excutes \u0027remove_iscsi_target\u0027."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: I6e1e9b59b425fac257489a9dfe86898bb518520c"},{"line_number":13,"context_line":"Closes-Bug: #1477831"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"1aa78d24_50ba7c24","line":10,"range":{"start_line":10,"start_character":0,"end_line":10,"end_character":7},"updated":"2016-07-04 13:53:30.000000000","message":"nit: executes","commit_id":"e15eb0dbe0d5bb4faf85834b9cad011881ba949b"}],"cinder/tests/unit/targets/test_tgt_driver.py":[{"author":{"_account_id":16523,"name":"ZhangLei","display_name":"ZhangLei","email":"zhang.lei@99cloud.net","username":"zhang.lei"},"change_message_id":"a07e2a644edb325239fcbef4bacdd5158cfffdfc","unresolved":false,"context_lines":[{"line_number":437,"context_line":"        self.stubs.Set(utils,"},{"line_number":438,"context_line":"                       \u0027execute\u0027,"},{"line_number":439,"context_line":"                       _fake_execute_no_nexus)"},{"line_number":440,"context_line":"        self.assertEqual(True, self.target.can_target_delete(self.fake_iscsi_target))"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"        self.stubs.Set(utils,"},{"line_number":443,"context_line":"                       \u0027execute\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"dab17558_a5079180","line":440,"updated":"2016-05-11 09:06:55.000000000","message":"s/assertEqual/assertTrue/","commit_id":"81d95ef7d57490c07973cb1a3f1b1dddd7d68f8e"},{"author":{"_account_id":12184,"name":"Weiwei Gu","email":"gu.weiwei@zte.com.cn","username":"guweiwei"},"change_message_id":"7093ea1e91cbc08ee745ebe8e26b1c9dd9e4e9b5","unresolved":false,"context_lines":[{"line_number":437,"context_line":"        self.stubs.Set(utils,"},{"line_number":438,"context_line":"                       \u0027execute\u0027,"},{"line_number":439,"context_line":"                       _fake_execute_no_nexus)"},{"line_number":440,"context_line":"        self.assertEqual(True, self.target.can_target_delete(self.fake_iscsi_target))"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"        self.stubs.Set(utils,"},{"line_number":443,"context_line":"                       \u0027execute\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_e8cc126c","line":440,"in_reply_to":"dab17558_a5079180","updated":"2016-05-31 11:23:07.000000000","message":"Done","commit_id":"81d95ef7d57490c07973cb1a3f1b1dddd7d68f8e"},{"author":{"_account_id":16523,"name":"ZhangLei","display_name":"ZhangLei","email":"zhang.lei@99cloud.net","username":"zhang.lei"},"change_message_id":"a07e2a644edb325239fcbef4bacdd5158cfffdfc","unresolved":false,"context_lines":[{"line_number":442,"context_line":"        self.stubs.Set(utils,"},{"line_number":443,"context_line":"                       \u0027execute\u0027,"},{"line_number":444,"context_line":"                       _fake_execute_has_nexus)"},{"line_number":445,"context_line":"        self.assertEqual(False, self.target.can_target_delete(self.fake_iscsi_target))"}],"source_content_type":"text/x-python","patch_set":1,"id":"dab17558_65f2c99b","line":445,"updated":"2016-05-11 09:06:55.000000000","message":"s/assertEqual/assertFalse/","commit_id":"81d95ef7d57490c07973cb1a3f1b1dddd7d68f8e"},{"author":{"_account_id":12184,"name":"Weiwei Gu","email":"gu.weiwei@zte.com.cn","username":"guweiwei"},"change_message_id":"7093ea1e91cbc08ee745ebe8e26b1c9dd9e4e9b5","unresolved":false,"context_lines":[{"line_number":442,"context_line":"        self.stubs.Set(utils,"},{"line_number":443,"context_line":"                       \u0027execute\u0027,"},{"line_number":444,"context_line":"                       _fake_execute_has_nexus)"},{"line_number":445,"context_line":"        self.assertEqual(False, self.target.can_target_delete(self.fake_iscsi_target))"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_68df820d","line":445,"in_reply_to":"dab17558_65f2c99b","updated":"2016-05-31 11:23:07.000000000","message":"Done","commit_id":"81d95ef7d57490c07973cb1a3f1b1dddd7d68f8e"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"cf1d8f839f354c1daef48bcbb9990a5199e934fd","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        def _fake_execute_has_nexus(*args, **kwargs):"},{"line_number":402,"context_line":"            return self.fake_iscsi_scan_has_nexus, None"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"        self.stubs.Set(utils,"},{"line_number":405,"context_line":"                       \u0027execute\u0027,"},{"line_number":406,"context_line":"                       _fake_execute_no_nexus)"},{"line_number":407,"context_line":"        self.assertTrue("}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_b0cf60af","line":404,"updated":"2016-07-04 13:53:30.000000000","message":"New tests should use mock.","commit_id":"e15eb0dbe0d5bb4faf85834b9cad011881ba949b"},{"author":{"_account_id":12184,"name":"Weiwei Gu","email":"gu.weiwei@zte.com.cn","username":"guweiwei"},"change_message_id":"5cfef6df31e7f140ea574d6232e673ad4fe80a36","unresolved":false,"context_lines":[{"line_number":401,"context_line":"        def _fake_execute_has_nexus(*args, **kwargs):"},{"line_number":402,"context_line":"            return self.fake_iscsi_scan_has_nexus, None"},{"line_number":403,"context_line":""},{"line_number":404,"context_line":"        self.stubs.Set(utils,"},{"line_number":405,"context_line":"                       \u0027execute\u0027,"},{"line_number":406,"context_line":"                       _fake_execute_no_nexus)"},{"line_number":407,"context_line":"        self.assertTrue("}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_2ca30a51","line":404,"in_reply_to":"1aa78d24_b0cf60af","updated":"2016-07-05 02:13:50.000000000","message":"Done","commit_id":"e15eb0dbe0d5bb4faf85834b9cad011881ba949b"}],"cinder/volume/targets/iscsi.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6f04ac45084386a69d852e9a2d155d762acf3453","unresolved":false,"context_lines":[{"line_number":409,"context_line":"    def _get_target(self, iqn):"},{"line_number":410,"context_line":"        pass"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def can_target_delete(self, iqn):"},{"line_number":413,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_77dab64d","line":412,"updated":"2016-05-31 13:39:35.000000000","message":"Please rename this to \"is_target_removable\" to be more clear about what it does.\n\nIt should also return True rather than \"pass\" here.","commit_id":"81d95ef7d57490c07973cb1a3f1b1dddd7d68f8e"},{"author":{"_account_id":12184,"name":"Weiwei Gu","email":"gu.weiwei@zte.com.cn","username":"guweiwei"},"change_message_id":"98c17653afc0faee448552233aaa5181353e0b58","unresolved":false,"context_lines":[{"line_number":409,"context_line":"    def _get_target(self, iqn):"},{"line_number":410,"context_line":"        pass"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def can_target_delete(self, iqn):"},{"line_number":413,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_415d1078","line":412,"in_reply_to":"9abb7d3a_77dab64d","updated":"2016-06-01 02:34:10.000000000","message":"Done","commit_id":"81d95ef7d57490c07973cb1a3f1b1dddd7d68f8e"}],"cinder/volume/targets/tgt.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"ca3aa897e5d5e40ee061262f5566b3e414a57cd0","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            LOG.debug(\u0027Volume path %s not found at end, \u0027"},{"line_number":316,"context_line":"                      \u0027of remove_iscsi_target.\u0027, volume_path)"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"    def can_target_delete(self, iqn):"},{"line_number":319,"context_line":"        (out, err) \u003d utils.execute(\u0027tgt-admin\u0027, \u0027--show\u0027, run_as_root\u003dTrue)"},{"line_number":320,"context_line":"        lines \u003d out.split(\u0027\\n\u0027)"},{"line_number":321,"context_line":"        find_target \u003d False"}],"source_content_type":"text/x-python","patch_set":1,"id":"dab17558_279913c5","line":318,"updated":"2016-05-10 13:41:11.000000000","message":"How do you know if the target is there because it\u0027s still intending to be used, vs. some kind of race condition where it is about to be removed, but hasn\u0027t yet?","commit_id":"81d95ef7d57490c07973cb1a3f1b1dddd7d68f8e"},{"author":{"_account_id":12184,"name":"Weiwei Gu","email":"gu.weiwei@zte.com.cn","username":"guweiwei"},"change_message_id":"314740ac467887b0a6b650a114f057a492bdc996","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            LOG.debug(\u0027Volume path %s not found at end, \u0027"},{"line_number":316,"context_line":"                      \u0027of remove_iscsi_target.\u0027, volume_path)"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"    def can_target_delete(self, iqn):"},{"line_number":319,"context_line":"        (out, err) \u003d utils.execute(\u0027tgt-admin\u0027, \u0027--show\u0027, run_as_root\u003dTrue)"},{"line_number":320,"context_line":"        lines \u003d out.split(\u0027\\n\u0027)"},{"line_number":321,"context_line":"        find_target \u003d False"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_01ba110a","line":318,"in_reply_to":"dab17558_279913c5","updated":"2016-05-31 11:58:25.000000000","message":"I think the target can not be deleted in some condition. For example, a volume is attached to several instances, or an instance which booted form a volume migrates.\nIf there are volumes joined to the target, we can see \"I_T nexus:\" info in the return message of \"tgt-admin --show\".","commit_id":"81d95ef7d57490c07973cb1a3f1b1dddd7d68f8e"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6f04ac45084386a69d852e9a2d155d762acf3453","unresolved":false,"context_lines":[{"line_number":328,"context_line":"                    break"},{"line_number":329,"context_line":"                if \"I_T nexus:\" in line:"},{"line_number":330,"context_line":"                    nexus_num +\u003d 1"},{"line_number":331,"context_line":"        LOG.info(_LI(\u0027Tgt target %s has %d nexus\u0027 % (iqn, nexus_num)))"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        return (nexus_num \u003c 1)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_37682e87","line":331,"updated":"2016-05-31 13:39:35.000000000","message":"This is not an informative message.  Messages logged at info level need to be clearly understandable.  Why does an admin want to know this?","commit_id":"81d95ef7d57490c07973cb1a3f1b1dddd7d68f8e"},{"author":{"_account_id":12184,"name":"Weiwei Gu","email":"gu.weiwei@zte.com.cn","username":"guweiwei"},"change_message_id":"98c17653afc0faee448552233aaa5181353e0b58","unresolved":false,"context_lines":[{"line_number":328,"context_line":"                    break"},{"line_number":329,"context_line":"                if \"I_T nexus:\" in line:"},{"line_number":330,"context_line":"                    nexus_num +\u003d 1"},{"line_number":331,"context_line":"        LOG.info(_LI(\u0027Tgt target %s has %d nexus\u0027 % (iqn, nexus_num)))"},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"        return (nexus_num \u003c 1)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9abb7d3a_a1567c59","line":331,"in_reply_to":"9abb7d3a_37682e87","updated":"2016-06-01 02:34:10.000000000","message":"Done","commit_id":"81d95ef7d57490c07973cb1a3f1b1dddd7d68f8e"},{"author":{"_account_id":22104,"name":"zhangyanxian","email":"zhangyanxianmail@163.com","username":"zhangyanxian"},"change_message_id":"ebcff909c2341e212c642428cc877771fd15e02e","unresolved":false,"context_lines":[{"line_number":312,"context_line":"        if os.path.exists(volume_path):"},{"line_number":313,"context_line":"            os.unlink(volume_path)"},{"line_number":314,"context_line":"        else:"},{"line_number":315,"context_line":"            LOG.debug(\u0027Volume path %s not found at end, \u0027"},{"line_number":316,"context_line":"                      \u0027of remove_iscsi_target.\u0027, volume_path)"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"    def is_target_removable(self, iqn):"}],"source_content_type":"text/x-python","patch_set":4,"id":"9abb7d3a_ca1e30ba","line":315,"range":{"start_line":315,"start_character":38,"end_line":315,"end_character":54},"updated":"2016-06-01 08:00:58.000000000","message":"should \"has not been found at the end\" be better?","commit_id":"a7f2f7c33d8d0a2736051414bebc9fc91f6dafaa"},{"author":{"_account_id":22257,"name":"Manish","email":"deolalkar.manish@hpe.com","username":"manishd"},"change_message_id":"0a19ab496fb46d6f0f023dff84e358170c58a5f3","unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def remove_iscsi_target(self, tid, lun, vol_id, vol_name, **kwargs):"},{"line_number":251,"context_line":"        LOG.info(_LI(\u0027Removing iscsi_target for Volume ID: %s\u0027), vol_id)"},{"line_number":252,"context_line":"        iqn \u003d kwargs.get(\u0027iqn\u0027, None)"},{"line_number":253,"context_line":"        if iqn and not self.is_target_removable(iqn):"},{"line_number":254,"context_line":"            return"},{"line_number":255,"context_line":"        vol_uuid_file \u003d vol_name"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_96317c0e","line":252,"range":{"start_line":252,"start_character":8,"end_line":252,"end_character":37},"updated":"2016-07-04 14:51:45.000000000","message":"This is pointless since .get() will default to None anyway.","commit_id":"e15eb0dbe0d5bb4faf85834b9cad011881ba949b"},{"author":{"_account_id":12184,"name":"Weiwei Gu","email":"gu.weiwei@zte.com.cn","username":"guweiwei"},"change_message_id":"5cfef6df31e7f140ea574d6232e673ad4fe80a36","unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"    def remove_iscsi_target(self, tid, lun, vol_id, vol_name, **kwargs):"},{"line_number":251,"context_line":"        LOG.info(_LI(\u0027Removing iscsi_target for Volume ID: %s\u0027), vol_id)"},{"line_number":252,"context_line":"        iqn \u003d kwargs.get(\u0027iqn\u0027, None)"},{"line_number":253,"context_line":"        if iqn and not self.is_target_removable(iqn):"},{"line_number":254,"context_line":"            return"},{"line_number":255,"context_line":"        vol_uuid_file \u003d vol_name"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_8cdcbee5","line":252,"range":{"start_line":252,"start_character":8,"end_line":252,"end_character":37},"in_reply_to":"1aa78d24_96317c0e","updated":"2016-07-05 02:13:50.000000000","message":"Done","commit_id":"e15eb0dbe0d5bb4faf85834b9cad011881ba949b"},{"author":{"_account_id":22257,"name":"Manish","email":"deolalkar.manish@hpe.com","username":"manishd"},"change_message_id":"0a19ab496fb46d6f0f023dff84e358170c58a5f3","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                            \u0027nothing to remove.\u0027), volume_path)"},{"line_number":260,"context_line":"            return"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"        if os.path.isfile(volume_path):"},{"line_number":263,"context_line":"            iqn \u003d \u0027%s%s\u0027 % (self.iscsi_target_prefix,"},{"line_number":264,"context_line":"                            vol_uuid_file)"},{"line_number":265,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_4adc8812","line":262,"range":{"start_line":262,"start_character":7,"end_line":262,"end_character":38},"updated":"2016-07-04 14:51:45.000000000","message":"Can this condition be combined with below .exists() method since volume_path remains the same for both.","commit_id":"e15eb0dbe0d5bb4faf85834b9cad011881ba949b"},{"author":{"_account_id":12184,"name":"Weiwei Gu","email":"gu.weiwei@zte.com.cn","username":"guweiwei"},"change_message_id":"5cfef6df31e7f140ea574d6232e673ad4fe80a36","unresolved":false,"context_lines":[{"line_number":259,"context_line":"                            \u0027nothing to remove.\u0027), volume_path)"},{"line_number":260,"context_line":"            return"},{"line_number":261,"context_line":""},{"line_number":262,"context_line":"        if os.path.isfile(volume_path):"},{"line_number":263,"context_line":"            iqn \u003d \u0027%s%s\u0027 % (self.iscsi_target_prefix,"},{"line_number":264,"context_line":"                            vol_uuid_file)"},{"line_number":265,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_ec98e21d","line":262,"range":{"start_line":262,"start_character":7,"end_line":262,"end_character":38},"in_reply_to":"1aa78d24_4adc8812","updated":"2016-07-05 02:13:50.000000000","message":"They are .isfile() and .exists(), not same.","commit_id":"e15eb0dbe0d5bb4faf85834b9cad011881ba949b"},{"author":{"_account_id":22257,"name":"Manish","email":"deolalkar.manish@hpe.com","username":"manishd"},"change_message_id":"0a19ab496fb46d6f0f023dff84e358170c58a5f3","unresolved":false,"context_lines":[{"line_number":312,"context_line":"        # it\u0027s not we don\u0027t care, so just ignore it if was"},{"line_number":313,"context_line":"        # somehow deleted between entry of this method"},{"line_number":314,"context_line":"        # and here"},{"line_number":315,"context_line":"        if os.path.exists(volume_path):"},{"line_number":316,"context_line":"            os.unlink(volume_path)"},{"line_number":317,"context_line":"        else:"},{"line_number":318,"context_line":"            LOG.debug(\u0027Volume path %s not found at end, \u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_eaf57483","line":315,"range":{"start_line":315,"start_character":8,"end_line":315,"end_character":39},"updated":"2016-07-04 14:51:45.000000000","message":"Refer comment for Line#262","commit_id":"e15eb0dbe0d5bb4faf85834b9cad011881ba949b"},{"author":{"_account_id":12184,"name":"Weiwei Gu","email":"gu.weiwei@zte.com.cn","username":"guweiwei"},"change_message_id":"5cfef6df31e7f140ea574d6232e673ad4fe80a36","unresolved":false,"context_lines":[{"line_number":312,"context_line":"        # it\u0027s not we don\u0027t care, so just ignore it if was"},{"line_number":313,"context_line":"        # somehow deleted between entry of this method"},{"line_number":314,"context_line":"        # and here"},{"line_number":315,"context_line":"        if os.path.exists(volume_path):"},{"line_number":316,"context_line":"            os.unlink(volume_path)"},{"line_number":317,"context_line":"        else:"},{"line_number":318,"context_line":"            LOG.debug(\u0027Volume path %s not found at end, \u0027"}],"source_content_type":"text/x-python","patch_set":10,"id":"1aa78d24_4ca01644","line":315,"range":{"start_line":315,"start_character":8,"end_line":315,"end_character":39},"in_reply_to":"1aa78d24_eaf57483","updated":"2016-07-05 02:13:50.000000000","message":"They are .isfile() and .exists(), not same.","commit_id":"e15eb0dbe0d5bb4faf85834b9cad011881ba949b"}]}
