)]}'
{"cinder/tests/unit/volume/drivers/datacore/test_datacore_api.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"4b8c427a4af7262da483c2cc45ea43a562ec4640","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                          self.client.get_server_groups)"},{"line_number":91,"context_line":"        self.mock_channel.recv.side_effect \u003d None"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        self.mock_storage_service_context.process_reply.side_effect \u003d \\"},{"line_number":94,"context_line":"            fail_with_web_fault"},{"line_number":95,"context_line":"        self.assertRaises(exception.DataCoreFaultException,"},{"line_number":96,"context_line":"                          self.client.get_server_groups)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffe62b97_b8044a19","line":93,"range":{"start_line":93,"start_character":70,"end_line":93,"end_character":71},"updated":"2017-03-28 15:16:05.000000000","message":"Please use () instead of \\ to span multiple lines.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"51c8836f552c84570ef6a6c42e36cbe259248c98","unresolved":false,"context_lines":[{"line_number":90,"context_line":"                          self.client.get_server_groups)"},{"line_number":91,"context_line":"        self.mock_channel.recv.side_effect \u003d None"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        self.mock_storage_service_context.process_reply.side_effect \u003d \\"},{"line_number":94,"context_line":"            fail_with_web_fault"},{"line_number":95,"context_line":"        self.assertRaises(exception.DataCoreFaultException,"},{"line_number":96,"context_line":"                          self.client.get_server_groups)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ff52f3f_3a2e7ea5","line":93,"range":{"start_line":93,"start_character":70,"end_line":93,"end_character":71},"in_reply_to":"ffe62b97_b8044a19","updated":"2017-04-13 14:49:48.000000000","message":"Done.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"}],"cinder/tests/unit/volume/drivers/datacore/test_datacore_driver.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"4b8c427a4af7262da483c2cc45ea43a562ec4640","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                         \u0027DataCoreClient\u0027).return_value \u003d self.mock_client"},{"line_number":199,"context_line":"        self.mock_client.get_servers.return_value \u003d SERVERS"},{"line_number":200,"context_line":"        self.mock_client.get_disk_pools.return_value \u003d DISK_POOLS"},{"line_number":201,"context_line":"        self.mock_client.get_performance_by_type.return_value \u003d \\"},{"line_number":202,"context_line":"            DISK_POOL_PERFORMANCE"},{"line_number":203,"context_line":"        self.mock_client.get_virtual_disks.return_value \u003d VIRTUAL_DISKS"},{"line_number":204,"context_line":"        self.mock_client.get_storage_profiles.return_value \u003d STORAGE_PROFILES"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffe62b97_ab19927a","line":201,"range":{"start_line":201,"start_character":64,"end_line":201,"end_character":65},"updated":"2017-03-28 15:16:05.000000000","message":"()","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"51c8836f552c84570ef6a6c42e36cbe259248c98","unresolved":false,"context_lines":[{"line_number":198,"context_line":"                         \u0027DataCoreClient\u0027).return_value \u003d self.mock_client"},{"line_number":199,"context_line":"        self.mock_client.get_servers.return_value \u003d SERVERS"},{"line_number":200,"context_line":"        self.mock_client.get_disk_pools.return_value \u003d DISK_POOLS"},{"line_number":201,"context_line":"        self.mock_client.get_performance_by_type.return_value \u003d \\"},{"line_number":202,"context_line":"            DISK_POOL_PERFORMANCE"},{"line_number":203,"context_line":"        self.mock_client.get_virtual_disks.return_value \u003d VIRTUAL_DISKS"},{"line_number":204,"context_line":"        self.mock_client.get_storage_profiles.return_value \u003d STORAGE_PROFILES"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ff52f3f_bd084828","line":201,"range":{"start_line":201,"start_character":64,"end_line":201,"end_character":65},"in_reply_to":"ffe62b97_ab19927a","updated":"2017-04-13 14:49:48.000000000","message":"Done.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"960b982c84ac5d278913986f4c2803a3a884fdaa","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        driver \u003d self.init_driver(config)"},{"line_number":272,"context_line":"        volume_stats \u003d driver.get_volume_stats(refresh\u003dTrue)"},{"line_number":273,"context_line":"        self.assertEqual(\u0027DataCore\u0027, volume_stats[\u0027vendor_name\u0027])"},{"line_number":274,"context_line":"        self.assertEqual(False, volume_stats[\u0027QoS_support\u0027])"},{"line_number":275,"context_line":"        self.assertEqual(total, volume_stats[\u0027total_capacity_gb\u0027])"},{"line_number":276,"context_line":"        self.assertEqual(free, volume_stats[\u0027free_capacity_gb\u0027])"},{"line_number":277,"context_line":"        self.assertEqual(provisioned, volume_stats[\u0027provisioned_capacity_gb\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ff52f3f_da1e726f","line":274,"range":{"start_line":274,"start_character":13,"end_line":274,"end_character":24},"updated":"2017-04-13 14:44:55.000000000","message":"Should be assertFalse()","commit_id":"4d50a98ff5e096c3d8a488236bb711a1f52a8053"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"a3068fbce1e995e5f468a15f94af23f76fbb0678","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        driver \u003d self.init_driver(config)"},{"line_number":272,"context_line":"        volume_stats \u003d driver.get_volume_stats(refresh\u003dTrue)"},{"line_number":273,"context_line":"        self.assertEqual(\u0027DataCore\u0027, volume_stats[\u0027vendor_name\u0027])"},{"line_number":274,"context_line":"        self.assertEqual(False, volume_stats[\u0027QoS_support\u0027])"},{"line_number":275,"context_line":"        self.assertEqual(total, volume_stats[\u0027total_capacity_gb\u0027])"},{"line_number":276,"context_line":"        self.assertEqual(free, volume_stats[\u0027free_capacity_gb\u0027])"},{"line_number":277,"context_line":"        self.assertEqual(provisioned, volume_stats[\u0027provisioned_capacity_gb\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"7ffa3b31_ebf704f5","line":274,"range":{"start_line":274,"start_character":13,"end_line":274,"end_character":24},"in_reply_to":"9ff52f3f_da1e726f","updated":"2017-04-17 17:30:03.000000000","message":"Done.","commit_id":"4d50a98ff5e096c3d8a488236bb711a1f52a8053"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"960b982c84ac5d278913986f4c2803a3a884fdaa","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        self.assertEqual(reserved, volume_stats[\u0027reserved_percentage\u0027])"},{"line_number":279,"context_line":"        self.assertEqual(ratio, volume_stats[\u0027max_over_subscription_ratio\u0027])"},{"line_number":280,"context_line":"        self.assertTrue(volume_stats[\u0027thin_provisioning_support\u0027])"},{"line_number":281,"context_line":"        self.assertEqual(False, volume_stats[\u0027thick_provisioning_support\u0027])"},{"line_number":282,"context_line":"        volume_stats_cached \u003d driver.get_volume_stats(refresh\u003dFalse)"},{"line_number":283,"context_line":"        self.assertEqual(volume_stats, volume_stats_cached)"},{"line_number":284,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9ff52f3f_fa193688","line":281,"range":{"start_line":281,"start_character":13,"end_line":281,"end_character":24},"updated":"2017-04-13 14:44:55.000000000","message":"Should be assertFalse()","commit_id":"4d50a98ff5e096c3d8a488236bb711a1f52a8053"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"a3068fbce1e995e5f468a15f94af23f76fbb0678","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        self.assertEqual(reserved, volume_stats[\u0027reserved_percentage\u0027])"},{"line_number":279,"context_line":"        self.assertEqual(ratio, volume_stats[\u0027max_over_subscription_ratio\u0027])"},{"line_number":280,"context_line":"        self.assertTrue(volume_stats[\u0027thin_provisioning_support\u0027])"},{"line_number":281,"context_line":"        self.assertEqual(False, volume_stats[\u0027thick_provisioning_support\u0027])"},{"line_number":282,"context_line":"        volume_stats_cached \u003d driver.get_volume_stats(refresh\u003dFalse)"},{"line_number":283,"context_line":"        self.assertEqual(volume_stats, volume_stats_cached)"},{"line_number":284,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7ffa3b31_abd9fc83","line":281,"range":{"start_line":281,"start_character":13,"end_line":281,"end_character":24},"in_reply_to":"9ff52f3f_fa193688","updated":"2017-04-17 17:30:03.000000000","message":"Done.","commit_id":"4d50a98ff5e096c3d8a488236bb711a1f52a8053"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"82d67e6ff4373210a814d1b57f56d1e29314a2b7","unresolved":false,"context_lines":[{"line_number":177,"context_line":"]"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"VOLUME \u003d {"},{"line_number":180,"context_line":"    \u0027id\u0027: \u0027volume_id1\u0027,"},{"line_number":181,"context_line":"    \u0027display_name\u0027: \u0027volume_1\u0027,"},{"line_number":182,"context_line":"    \u0027volume_type_id\u0027: None,"},{"line_number":183,"context_line":"    \u0027size\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ffa3b31_60defc6d","line":180,"updated":"2017-04-20 18:23:56.000000000","message":"Please use a valid UUID for the id here.","commit_id":"9a8502651ac29d5a272e76fa9bc409165d1c352c"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"a7213cb03a0f1f1e685af6c872414a70f40a45b6","unresolved":false,"context_lines":[{"line_number":177,"context_line":"]"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"VOLUME \u003d {"},{"line_number":180,"context_line":"    \u0027id\u0027: \u0027volume_id1\u0027,"},{"line_number":181,"context_line":"    \u0027display_name\u0027: \u0027volume_1\u0027,"},{"line_number":182,"context_line":"    \u0027volume_type_id\u0027: None,"},{"line_number":183,"context_line":"    \u0027size\u0027: 1,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f044301_4f8c6435","line":180,"in_reply_to":"7ffa3b31_60defc6d","updated":"2017-05-11 09:36:18.000000000","message":"Done","commit_id":"9a8502651ac29d5a272e76fa9bc409165d1c352c"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"82d67e6ff4373210a814d1b57f56d1e29314a2b7","unresolved":false,"context_lines":[{"line_number":184,"context_line":"}"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"SNAPSHOT \u003d {"},{"line_number":187,"context_line":"    \u0027id\u0027: \u0027snapshot_id1\u0027,"},{"line_number":188,"context_line":"    \u0027display_name\u0027: \u0027snapshot_1\u0027,"},{"line_number":189,"context_line":"}"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7ffa3b31_40db007b","line":187,"updated":"2017-04-20 18:23:56.000000000","message":"Please use a valid UUID for the id here.","commit_id":"9a8502651ac29d5a272e76fa9bc409165d1c352c"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"a7213cb03a0f1f1e685af6c872414a70f40a45b6","unresolved":false,"context_lines":[{"line_number":184,"context_line":"}"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"SNAPSHOT \u003d {"},{"line_number":187,"context_line":"    \u0027id\u0027: \u0027snapshot_id1\u0027,"},{"line_number":188,"context_line":"    \u0027display_name\u0027: \u0027snapshot_1\u0027,"},{"line_number":189,"context_line":"}"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f044301_0f82dc00","line":187,"in_reply_to":"7ffa3b31_40db007b","updated":"2017-05-11 09:36:18.000000000","message":"Done","commit_id":"9a8502651ac29d5a272e76fa9bc409165d1c352c"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"82d67e6ff4373210a814d1b57f56d1e29314a2b7","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        driver \u003d self.init_driver(config)"},{"line_number":272,"context_line":"        volume_stats \u003d driver.get_volume_stats(refresh\u003dTrue)"},{"line_number":273,"context_line":"        self.assertEqual(\u0027DataCore\u0027, volume_stats[\u0027vendor_name\u0027])"},{"line_number":274,"context_line":"        self.assertFalse(volume_stats[\u0027QoS_support\u0027])"},{"line_number":275,"context_line":"        self.assertEqual(total, volume_stats[\u0027total_capacity_gb\u0027])"},{"line_number":276,"context_line":"        self.assertEqual(free, volume_stats[\u0027free_capacity_gb\u0027])"},{"line_number":277,"context_line":"        self.assertEqual(provisioned, volume_stats[\u0027provisioned_capacity_gb\u0027])"},{"line_number":278,"context_line":"        self.assertEqual(reserved, volume_stats[\u0027reserved_percentage\u0027])"},{"line_number":279,"context_line":"        self.assertEqual(ratio, volume_stats[\u0027max_over_subscription_ratio\u0027])"},{"line_number":280,"context_line":"        self.assertTrue(volume_stats[\u0027thin_provisioning_support\u0027])"},{"line_number":281,"context_line":"        self.assertFalse(volume_stats[\u0027thick_provisioning_support\u0027])"},{"line_number":282,"context_line":"        volume_stats_cached \u003d driver.get_volume_stats(refresh\u003dFalse)"},{"line_number":283,"context_line":"        self.assertEqual(volume_stats, volume_stats_cached)"},{"line_number":284,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"7ffa3b31_e038cca0","line":281,"range":{"start_line":274,"start_character":0,"end_line":281,"end_character":68},"updated":"2017-04-20 18:23:56.000000000","message":"Could use self.assertDictEqual to make this cleaner.","commit_id":"9a8502651ac29d5a272e76fa9bc409165d1c352c"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"a7213cb03a0f1f1e685af6c872414a70f40a45b6","unresolved":false,"context_lines":[{"line_number":271,"context_line":"        driver \u003d self.init_driver(config)"},{"line_number":272,"context_line":"        volume_stats \u003d driver.get_volume_stats(refresh\u003dTrue)"},{"line_number":273,"context_line":"        self.assertEqual(\u0027DataCore\u0027, volume_stats[\u0027vendor_name\u0027])"},{"line_number":274,"context_line":"        self.assertFalse(volume_stats[\u0027QoS_support\u0027])"},{"line_number":275,"context_line":"        self.assertEqual(total, volume_stats[\u0027total_capacity_gb\u0027])"},{"line_number":276,"context_line":"        self.assertEqual(free, volume_stats[\u0027free_capacity_gb\u0027])"},{"line_number":277,"context_line":"        self.assertEqual(provisioned, volume_stats[\u0027provisioned_capacity_gb\u0027])"},{"line_number":278,"context_line":"        self.assertEqual(reserved, volume_stats[\u0027reserved_percentage\u0027])"},{"line_number":279,"context_line":"        self.assertEqual(ratio, volume_stats[\u0027max_over_subscription_ratio\u0027])"},{"line_number":280,"context_line":"        self.assertTrue(volume_stats[\u0027thin_provisioning_support\u0027])"},{"line_number":281,"context_line":"        self.assertFalse(volume_stats[\u0027thick_provisioning_support\u0027])"},{"line_number":282,"context_line":"        volume_stats_cached \u003d driver.get_volume_stats(refresh\u003dFalse)"},{"line_number":283,"context_line":"        self.assertEqual(volume_stats, volume_stats_cached)"},{"line_number":284,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"3f044301_ef869013","line":281,"range":{"start_line":274,"start_character":0,"end_line":281,"end_character":68},"in_reply_to":"7ffa3b31_e038cca0","updated":"2017-05-11 09:36:18.000000000","message":"Done","commit_id":"9a8502651ac29d5a272e76fa9bc409165d1c352c"}],"cinder/volume/drivers/datacore/api.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"4b8c427a4af7262da483c2cc45ea43a562ec4640","unresolved":false,"context_lines":[{"line_number":312,"context_line":"                self._update_storage_services_endpoint(endpoint)"},{"line_number":313,"context_line":"                break"},{"line_number":314,"context_line":"            except datacore_exceptions.DataCoreConnectionException as e:"},{"line_number":315,"context_line":"                msg \u003d _LW(\u0027Failed to update DataCore Server Group \u0027"},{"line_number":316,"context_line":"                          \u0027endpoints. %s.\u0027)"},{"line_number":317,"context_line":"                LOG.warning(msg, e)"},{"line_number":318,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ffe62b97_cbc3b688","line":315,"range":{"start_line":315,"start_character":22,"end_line":315,"end_character":26},"updated":"2017-03-28 15:16:05.000000000","message":"All translations other than _() for exception messages need to be removed now.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"51c8836f552c84570ef6a6c42e36cbe259248c98","unresolved":false,"context_lines":[{"line_number":312,"context_line":"                self._update_storage_services_endpoint(endpoint)"},{"line_number":313,"context_line":"                break"},{"line_number":314,"context_line":"            except datacore_exceptions.DataCoreConnectionException as e:"},{"line_number":315,"context_line":"                msg \u003d _LW(\u0027Failed to update DataCore Server Group \u0027"},{"line_number":316,"context_line":"                          \u0027endpoints. %s.\u0027)"},{"line_number":317,"context_line":"                LOG.warning(msg, e)"},{"line_number":318,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9ff52f3f_7d408036","line":315,"range":{"start_line":315,"start_character":22,"end_line":315,"end_character":26},"in_reply_to":"ffe62b97_cbc3b688","updated":"2017-04-13 14:49:48.000000000","message":"Done.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"22a09b986e91524d9718d84751b784a231c02911","unresolved":false,"context_lines":[{"line_number":52,"context_line":"    \"\"\""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    def __init__(self):"},{"line_number":55,"context_line":"        pass"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def parsed(self, context):"},{"line_number":58,"context_line":"        document \u003d context.document"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f485f77_637f39e0","line":55,"updated":"2017-11-16 15:15:00.000000000","message":"Please, remove empty __init__ method","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"22a09b986e91524d9718d84751b784a231c02911","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    def _get_tns(document):"},{"line_number":74,"context_line":"        target_namespace \u003d document.get(\u0027targetNamespace\u0027)"},{"line_number":75,"context_line":"        prefix \u003d document.findPrefix(target_namespace)"},{"line_number":76,"context_line":"        if prefix is None:"},{"line_number":77,"context_line":"            prefix \u003d \u0027tns\u0027"},{"line_number":78,"context_line":"        return prefix, target_namespace"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1f485f77_a3709109","line":76,"updated":"2017-11-16 15:15:00.000000000","message":"nit: could be simplified to:\nprefix \u003d document.findPrefix(target_namespace) or \u0027tns\u0027","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"c6fbabc87279e93a34b0bb4d5a50ab909b0e6e25","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    def _invoke_storage_services(self, method, *args, **kwargs):"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        @retrying.retry("},{"line_number":302,"context_line":"            retry_on_exception\u003dlambda e:"},{"line_number":303,"context_line":"                isinstance(e, datacore_exceptions.DataCoreConnectionException),"},{"line_number":304,"context_line":"            wait_fixed\u003dself.API_RETRY_INTERVAL * 1000,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f485f77_661ac36f","line":301,"range":{"start_line":301,"start_character":9,"end_line":301,"end_character":17},"updated":"2017-11-15 20:41:46.000000000","message":"May be better to use our retrying decorator:\n\nhttps://github.com/openstack/cinder/blob/master/cinder/utils.py#L761","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"22a09b986e91524d9718d84751b784a231c02911","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    def _invoke_storage_services(self, method, *args, **kwargs):"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        @retrying.retry("},{"line_number":302,"context_line":"            retry_on_exception\u003dlambda e:"},{"line_number":303,"context_line":"                isinstance(e, datacore_exceptions.DataCoreConnectionException),"},{"line_number":304,"context_line":"            wait_fixed\u003dself.API_RETRY_INTERVAL * 1000,"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f485f77_83f1156e","line":301,"range":{"start_line":301,"start_character":9,"end_line":301,"end_character":17},"in_reply_to":"1f485f77_661ac36f","updated":"2017-11-16 15:15:00.000000000","message":"+1","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"472d2519e58d09e5e3fe709ee4022eb13add5ece","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"    def _invoke_storage_services(self, method, *args, **kwargs):"},{"line_number":300,"context_line":""},{"line_number":301,"context_line":"        @retrying.retry("},{"line_number":302,"context_line":"            retry_on_exception\u003dlambda e:"},{"line_number":303,"context_line":"                isinstance(e, datacore_exceptions.DataCoreConnectionException),"},{"line_number":304,"context_line":"            wait_fixed\u003dself.API_RETRY_INTERVAL * 1000,"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_0e94c843","line":301,"range":{"start_line":301,"start_character":9,"end_line":301,"end_character":17},"in_reply_to":"1f485f77_661ac36f","updated":"2017-11-20 15:14:08.000000000","message":"Returning back to our previous discussion on this topic, we have used a retry function from the retrying library because such one from the cinder/utils.py does not work well for us. We had a look for existing usage samples of cinder.utils.retry for our case in the Cinder source code such as retry for wait_for_quiesced method in the ...\\volume\\drivers\\netapp\\dataontap\\utils\\data_motion.py. It looks error-prone for me. May be we can add a timeout parameter to the retry function from the cinder/utils.py to stop retrying on timeout or exceeding a number of tries.","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"}],"cinder/volume/drivers/datacore/driver.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"f0187fe9a5872028ed0607f00f27240b555dc406","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Base Driver for DataCore SANsymphony storage array.\"\"\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from __future__ import division"},{"line_number":18,"context_line":"import time"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffe62b97_d78af761","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":31},"updated":"2017-03-29 20:02:48.000000000","message":"It would be nice to add a brief comment indicating why this is used/needed.  (It\u0027s tricky to scan through the code and figure out where it matters.)","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"51c8836f552c84570ef6a6c42e36cbe259248c98","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"\"\"\"Base Driver for DataCore SANsymphony storage array.\"\"\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from __future__ import division"},{"line_number":18,"context_line":"import time"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from oslo_config import cfg"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ff52f3f_bd7de86f","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":31},"in_reply_to":"ffe62b97_d78af761","updated":"2017-04-13 14:49:48.000000000","message":"Removed. Float arguments are used instead where it matters.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"4b8c427a4af7262da483c2cc45ea43a562ec4640","unresolved":false,"context_lines":[{"line_number":38,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"datacore_opts \u003d ["},{"line_number":41,"context_line":"    cfg.StrOpt(\u0027datacore_server\u0027,"},{"line_number":42,"context_line":"               default\u003dNone,"},{"line_number":43,"context_line":"               help\u003d\u0027IP address or DNS name for connecting to \u0027"},{"line_number":44,"context_line":"                    \u0027DataCore SANsymphony server.\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffe62b97_0b119e04","line":41,"updated":"2017-03-28 15:16:05.000000000","message":"May be better to use the existing san_ip, san_login, and san_password.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"51c8836f552c84570ef6a6c42e36cbe259248c98","unresolved":false,"context_lines":[{"line_number":38,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"datacore_opts \u003d ["},{"line_number":41,"context_line":"    cfg.StrOpt(\u0027datacore_server\u0027,"},{"line_number":42,"context_line":"               default\u003dNone,"},{"line_number":43,"context_line":"               help\u003d\u0027IP address or DNS name for connecting to \u0027"},{"line_number":44,"context_line":"                    \u0027DataCore SANsymphony server.\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ff52f3f_bda4c809","line":41,"in_reply_to":"ffe62b97_0b119e04","updated":"2017-04-13 14:49:48.000000000","message":"Done.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"f0187fe9a5872028ed0607f00f27240b555dc406","unresolved":false,"context_lines":[{"line_number":55,"context_line":"               default\u003d\u0027single\u0027,"},{"line_number":56,"context_line":"               help\u003d\u0027DataCore virtual disk type (single/mirrored). \u0027"},{"line_number":57,"context_line":"                    \u0027Mirrored virtual disks require two storage servers in \u0027"},{"line_number":58,"context_line":"                    \u0027the server group.\u0027),"},{"line_number":59,"context_line":"    cfg.StrOpt(\u0027datacore_storage_profile\u0027,"},{"line_number":60,"context_line":"               default\u003dNone,"},{"line_number":61,"context_line":"               help\u003d\u0027DataCore virtual disk storage profile.\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffe62b97_5c5dee76","line":58,"updated":"2017-03-29 20:02:48.000000000","message":"Add choices\u003d[\u0027single\u0027, \u0027mirrored\u0027] here to catch invalid entries.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"51c8836f552c84570ef6a6c42e36cbe259248c98","unresolved":false,"context_lines":[{"line_number":55,"context_line":"               default\u003d\u0027single\u0027,"},{"line_number":56,"context_line":"               help\u003d\u0027DataCore virtual disk type (single/mirrored). \u0027"},{"line_number":57,"context_line":"                    \u0027Mirrored virtual disks require two storage servers in \u0027"},{"line_number":58,"context_line":"                    \u0027the server group.\u0027),"},{"line_number":59,"context_line":"    cfg.StrOpt(\u0027datacore_storage_profile\u0027,"},{"line_number":60,"context_line":"               default\u003dNone,"},{"line_number":61,"context_line":"               help\u003d\u0027DataCore virtual disk storage profile.\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ff52f3f_3d91d89a","line":58,"in_reply_to":"ffe62b97_5c5dee76","updated":"2017-04-13 14:49:48.000000000","message":"Done.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"f0187fe9a5872028ed0607f00f27240b555dc406","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    cfg.IntOpt(\u0027datacore_disk_failed_delay\u0027,"},{"line_number":71,"context_line":"               default\u003d15,"},{"line_number":72,"context_line":"               help\u003d\u0027Seconds to wait for DataCore virtual \u0027"},{"line_number":73,"context_line":"                    \u0027disk to come from \"Failed\" state.\u0027),"},{"line_number":74,"context_line":"]"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffe62b97_dca45e4d","line":73,"updated":"2017-03-29 20:02:48.000000000","message":"Add min\u003d1 to the IntOpt here and you can delete the code at line 121 that tests that this is \u003e\u003d0.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"51c8836f552c84570ef6a6c42e36cbe259248c98","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    cfg.IntOpt(\u0027datacore_disk_failed_delay\u0027,"},{"line_number":71,"context_line":"               default\u003d15,"},{"line_number":72,"context_line":"               help\u003d\u0027Seconds to wait for DataCore virtual \u0027"},{"line_number":73,"context_line":"                    \u0027disk to come from \"Failed\" state.\u0027),"},{"line_number":74,"context_line":"]"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ff52f3f_9df7c4f6","line":73,"in_reply_to":"ffe62b97_dca45e4d","updated":"2017-04-13 14:49:48.000000000","message":"Done.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"4b8c427a4af7262da483c2cc45ea43a562ec4640","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                LOG.exception(_LE(\"Creation of volume %(volume)s \""},{"line_number":298,"context_line":"                                  \"failed with %(error)s.\"),"},{"line_number":299,"context_line":"                              {\u0027volume\u0027: volume[\u0027id\u0027],"},{"line_number":300,"context_line":"                               \u0027error\u0027: e})"},{"line_number":301,"context_line":"                try:"},{"line_number":302,"context_line":"                    if virtual_disk:"},{"line_number":303,"context_line":"                        self._api.delete_virtual_disk(virtual_disk.Id, True)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffe62b97_4ba7a6be","line":300,"range":{"start_line":300,"start_character":31,"end_line":300,"end_character":41},"updated":"2017-03-28 15:16:05.000000000","message":"Exceptions should not be formatted into the message when using LOG.exception.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"51c8836f552c84570ef6a6c42e36cbe259248c98","unresolved":false,"context_lines":[{"line_number":297,"context_line":"                LOG.exception(_LE(\"Creation of volume %(volume)s \""},{"line_number":298,"context_line":"                                  \"failed with %(error)s.\"),"},{"line_number":299,"context_line":"                              {\u0027volume\u0027: volume[\u0027id\u0027],"},{"line_number":300,"context_line":"                               \u0027error\u0027: e})"},{"line_number":301,"context_line":"                try:"},{"line_number":302,"context_line":"                    if virtual_disk:"},{"line_number":303,"context_line":"                        self._api.delete_virtual_disk(virtual_disk.Id, True)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ff52f3f_9dd0e452","line":300,"range":{"start_line":300,"start_character":31,"end_line":300,"end_character":41},"in_reply_to":"ffe62b97_4ba7a6be","updated":"2017-04-13 14:49:48.000000000","message":"Done.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"4b8c427a4af7262da483c2cc45ea43a562ec4640","unresolved":false,"context_lines":[{"line_number":625,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":626,"context_line":"                LOG.exception(_LE(\"Creation of volume %(volume)s \""},{"line_number":627,"context_line":"                                  \"failed with %(error)s.\"),"},{"line_number":628,"context_line":"                              {\u0027volume\u0027: volume[\u0027id\u0027], \u0027error\u0027: e})"},{"line_number":629,"context_line":"                try:"},{"line_number":630,"context_line":"                    self._api.delete_virtual_disk(volume_virtual_disk.Id, True)"},{"line_number":631,"context_line":"                except datacore_exception.DataCoreException as e:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffe62b97_cbc97659","line":628,"range":{"start_line":628,"start_character":55,"end_line":628,"end_character":65},"updated":"2017-03-28 15:16:05.000000000","message":"remove","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"51c8836f552c84570ef6a6c42e36cbe259248c98","unresolved":false,"context_lines":[{"line_number":625,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":626,"context_line":"                LOG.exception(_LE(\"Creation of volume %(volume)s \""},{"line_number":627,"context_line":"                                  \"failed with %(error)s.\"),"},{"line_number":628,"context_line":"                              {\u0027volume\u0027: volume[\u0027id\u0027], \u0027error\u0027: e})"},{"line_number":629,"context_line":"                try:"},{"line_number":630,"context_line":"                    self._api.delete_virtual_disk(volume_virtual_disk.Id, True)"},{"line_number":631,"context_line":"                except datacore_exception.DataCoreException as e:"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ff52f3f_3dbf98fc","line":628,"range":{"start_line":628,"start_character":55,"end_line":628,"end_character":65},"in_reply_to":"ffe62b97_cbc97659","updated":"2017-04-13 14:49:48.000000000","message":"Done.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"4b8c427a4af7262da483c2cc45ea43a562ec4640","unresolved":false,"context_lines":[{"line_number":695,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":696,"context_line":"                LOG.exception(_LE(\"Split operation failed for snapshot \""},{"line_number":697,"context_line":"                                  \"%(snapshot)s with %(error)s.\"),"},{"line_number":698,"context_line":"                              {\u0027snapshot\u0027: snapshot.Id, \u0027error\u0027: e})"},{"line_number":699,"context_line":"                try:"},{"line_number":700,"context_line":"                    logical_disk_copy \u003d datacore_utils.get_first("},{"line_number":701,"context_line":"                        lambda disk: ("}],"source_content_type":"text/x-python","patch_set":1,"id":"ffe62b97_8bd48eea","line":698,"range":{"start_line":698,"start_character":56,"end_line":698,"end_character":66},"updated":"2017-03-28 15:16:05.000000000","message":"remove","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"51c8836f552c84570ef6a6c42e36cbe259248c98","unresolved":false,"context_lines":[{"line_number":695,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":696,"context_line":"                LOG.exception(_LE(\"Split operation failed for snapshot \""},{"line_number":697,"context_line":"                                  \"%(snapshot)s with %(error)s.\"),"},{"line_number":698,"context_line":"                              {\u0027snapshot\u0027: snapshot.Id, \u0027error\u0027: e})"},{"line_number":699,"context_line":"                try:"},{"line_number":700,"context_line":"                    logical_disk_copy \u003d datacore_utils.get_first("},{"line_number":701,"context_line":"                        lambda disk: ("}],"source_content_type":"text/x-python","patch_set":1,"id":"9ff52f3f_fd36d0b4","line":698,"range":{"start_line":698,"start_character":56,"end_line":698,"end_character":66},"in_reply_to":"ffe62b97_8bd48eea","updated":"2017-04-13 14:49:48.000000000","message":"Done.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"35b5109909834986b9fd485bbf686648819425ff","unresolved":false,"context_lines":[{"line_number":67,"context_line":"CONF.register_opts(datacore_opts)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"class DataCoreVolumeDriver(driver.BaseVD, driver.SnapshotVD, driver.ExtendVD):"},{"line_number":71,"context_line":"    \"\"\"DataCore SANsymphony base volume driver.\"\"\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    STORAGE_PROTOCOL \u003d \u0027N/A\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_820f9e86","line":70,"updated":"2017-05-24 21:21:36.000000000","message":"Needs cinder.interface.volumedriver decorator.","commit_id":"72bbcd40d41e20059fad5be879aa9d82f2b5d64e"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"c4f8d03b6214c30dc45bc49b304e1ee3365fce51","unresolved":false,"context_lines":[{"line_number":67,"context_line":"CONF.register_opts(datacore_opts)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"class DataCoreVolumeDriver(driver.BaseVD, driver.SnapshotVD, driver.ExtendVD):"},{"line_number":71,"context_line":"    \"\"\"DataCore SANsymphony base volume driver.\"\"\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    STORAGE_PROTOCOL \u003d \u0027N/A\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_f2fbb375","line":70,"in_reply_to":"ff0f0b1f_72be83d5","updated":"2017-05-25 13:50:54.000000000","message":"Oops, you are right here and below. Sorry about that, please ignore.","commit_id":"72bbcd40d41e20059fad5be879aa9d82f2b5d64e"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"1f7666951d4a042392dea4cfb057fe103f0c6b9a","unresolved":false,"context_lines":[{"line_number":67,"context_line":"CONF.register_opts(datacore_opts)"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"class DataCoreVolumeDriver(driver.BaseVD, driver.SnapshotVD, driver.ExtendVD):"},{"line_number":71,"context_line":"    \"\"\"DataCore SANsymphony base volume driver.\"\"\""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    STORAGE_PROTOCOL \u003d \u0027N/A\u0027"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_72be83d5","line":70,"in_reply_to":"ff0f0b1f_820f9e86","updated":"2017-05-25 13:48:43.000000000","message":"Sean McGinnis, it is a base class for the cinder.volume.drivers.datacore.iscsi.ISCSIVolumeDriver and cinder.volume.drivers.datacore.fc.FibreChannelVolumeDriver concrete volume driver implementations. So, I\u0027d like to avoid usage of cinder.interface.volumedriver decorator on DataCoreVolumeDriver. Maybe we need to rename driver.py module to common.py to get more consistency with other implementations.","commit_id":"72bbcd40d41e20059fad5be879aa9d82f2b5d64e"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"35b5109909834986b9fd485bbf686648819425ff","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    VALID_VOLUME_TYPE_KEYS \u003d (DATACORE_DISK_TYPE_KEY,"},{"line_number":87,"context_line":"                              DATACORE_STORAGE_PROFILE_KEY,"},{"line_number":88,"context_line":"                              DATACORE_DISK_POOLS_KEY,)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":91,"context_line":"        super(DataCoreVolumeDriver, self).__init__(*args, **kwargs)"},{"line_number":92,"context_line":"        self.configuration.append_config_values(san.san_opts)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_622a4adb","line":89,"updated":"2017-05-24 21:21:36.000000000","message":"Needs VERSION and CI_WIKI_NAME constants.","commit_id":"72bbcd40d41e20059fad5be879aa9d82f2b5d64e"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"1f7666951d4a042392dea4cfb057fe103f0c6b9a","unresolved":false,"context_lines":[{"line_number":86,"context_line":"    VALID_VOLUME_TYPE_KEYS \u003d (DATACORE_DISK_TYPE_KEY,"},{"line_number":87,"context_line":"                              DATACORE_STORAGE_PROFILE_KEY,"},{"line_number":88,"context_line":"                              DATACORE_DISK_POOLS_KEY,)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":91,"context_line":"        super(DataCoreVolumeDriver, self).__init__(*args, **kwargs)"},{"line_number":92,"context_line":"        self.configuration.append_config_values(san.san_opts)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff0f0b1f_3297eb3c","line":89,"in_reply_to":"ff0f0b1f_622a4adb","updated":"2017-05-25 13:48:43.000000000","message":"Sean McGinnis, I\u0027d like to keep VERSION and CI_WIKI_NAME info in the concrete driver implementations.","commit_id":"72bbcd40d41e20059fad5be879aa9d82f2b5d64e"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"9612d3b6e776fd98e57a46b1b4aa512001a4a3d0","unresolved":false,"context_lines":[{"line_number":158,"context_line":"        :param refresh: Whether to get refreshed information"},{"line_number":159,"context_line":"        \"\"\""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        if refresh:"},{"line_number":162,"context_line":"            performance_data \u003d self._api.get_performance_by_type("},{"line_number":163,"context_line":"                [\u0027DiskPoolPerformance\u0027])"},{"line_number":164,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7f287b81_8094a9e9","line":161,"updated":"2017-09-05 18:09:19.000000000","message":"Probably cleaner to write this method as\n\n    if not refresh:\n        return  ...\n\n    \u003cthe rest\u003e","commit_id":"72bbcd40d41e20059fad5be879aa9d82f2b5d64e"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b61596ff4c475a37797fe287f8cdd75891a32eea","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    cfg.IntOpt(\u0027datacore_disk_failed_delay\u0027,"},{"line_number":60,"context_line":"               default\u003d15,"},{"line_number":61,"context_line":"               min\u003d0,"},{"line_number":62,"context_line":"               help\u003d\u0027Seconds to wait for DataCore virtual \u0027"},{"line_number":63,"context_line":"                    \u0027disk to come from \"Failed\" state.\u0027),"},{"line_number":64,"context_line":"]"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_ed1880d4","line":63,"range":{"start_line":62,"start_character":21,"end_line":63,"end_character":54},"updated":"2017-11-20 23:05:02.000000000","message":"This not clear.  what does \u0027disk to come from \"Failed\" state.\u0027 mean?  Meaning how long before marking a virtual disk failed?  Something else?","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"38a18c610c027d74ef0245c539f58863309f75d3","unresolved":false,"context_lines":[{"line_number":59,"context_line":"    cfg.IntOpt(\u0027datacore_disk_failed_delay\u0027,"},{"line_number":60,"context_line":"               default\u003d15,"},{"line_number":61,"context_line":"               min\u003d0,"},{"line_number":62,"context_line":"               help\u003d\u0027Seconds to wait for DataCore virtual \u0027"},{"line_number":63,"context_line":"                    \u0027disk to come from \"Failed\" state.\u0027),"},{"line_number":64,"context_line":"]"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_cfdad749","line":63,"range":{"start_line":62,"start_character":21,"end_line":63,"end_character":54},"in_reply_to":"ff82abbf_ed1880d4","updated":"2017-11-27 06:03:43.000000000","message":"There are cases when the storage may report that a virtual disk is in failed state. As an example it is when we change virtual disk source to clone it. To distinguish such cases from ones when a virtual disk actually is in a failed state we added this option.\n\nI have changed the phrasing. Please let me know if it is still unclear.","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b61596ff4c475a37797fe287f8cdd75891a32eea","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        profile_id \u003d self._get_storage_profile_id(profile_name)"},{"line_number":311,"context_line":"        pool_names \u003d volume_options[self.DATACORE_DISK_POOLS_KEY]"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        if src_virtual_disk.DiskStatus !\u003d \u0027Online\u0027:"},{"line_number":314,"context_line":"            LOG.warning(\"Virtual disk %(disk)s is in %(state)s state.\","},{"line_number":315,"context_line":"                        {\u0027disk\u0027: src_virtual_disk.Id,"},{"line_number":316,"context_line":"                         \u0027state\u0027: src_virtual_disk.DiskStatus})"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        snapshot_virtual_disk \u003d self._create_virtual_disk_copy("},{"line_number":319,"context_line":"            src_virtual_disk,"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_ed1e406f","line":316,"range":{"start_line":313,"start_character":0,"end_line":316,"end_character":63},"updated":"2017-11-20 23:05:02.000000000","message":"This lacks context.  Can you update this message to explain why it is a warning to the user?  At least indicate they are trying to snapshot something in a bad status?","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b61596ff4c475a37797fe287f8cdd75891a32eea","unresolved":false,"context_lines":[{"line_number":405,"context_line":"        reserved_percentage \u003d 100.0 * reserved / total if total else 0.0"},{"line_number":406,"context_line":"        ratio \u003d self.configuration.max_over_subscription_ratio"},{"line_number":407,"context_line":"        stats_data \u003d {"},{"line_number":408,"context_line":"            \u0027vendor_name\u0027: \u0027DataCore\u0027, \u0027QoS_support\u0027: False,"},{"line_number":409,"context_line":"            \"volume_backend_name\": self.get_volume_backend_name(),"},{"line_number":410,"context_line":"            \"driver_version\": self.get_version(),"},{"line_number":411,"context_line":"            \"storage_protocol\": self.get_storage_protocol(),"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_d0fe7304","line":408,"range":{"start_line":408,"start_character":39,"end_line":408,"end_character":60},"updated":"2017-11-20 23:05:02.000000000","message":"Can you move this to its own line for readability?","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b61596ff4c475a37797fe287f8cdd75891a32eea","unresolved":false,"context_lines":[{"line_number":533,"context_line":"                raise loopingcall.LoopingCallDone(virtual_disk)"},{"line_number":534,"context_line":"            elif (virtual_disk.DiskStatus !\u003d \u0027FailedRedundancy\u0027"},{"line_number":535,"context_line":"                  and time.time() - start_time \u003e\u003d disk_failed_delay):"},{"line_number":536,"context_line":"                msg \u003d (_(\"Virtual disk %(disk)s is in %(state)s state.\")"},{"line_number":537,"context_line":"                       % {\u0027disk\u0027: virtual_disk.Id,"},{"line_number":538,"context_line":"                          \u0027state\u0027: virtual_disk.DiskStatus})"},{"line_number":539,"context_line":"                LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_101cdb68","line":536,"range":{"start_line":536,"start_character":26,"end_line":536,"end_character":70},"updated":"2017-11-20 23:05:02.000000000","message":"Assuming this will go with a message earlier that you waiting for a disk to come online?  If not, should add that detail here.","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b61596ff4c475a37797fe287f8cdd75891a32eea","unresolved":false,"context_lines":[{"line_number":547,"context_line":"                                                      raise_not_found\u003dTrue)"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        if src_virtual_disk.DiskStatus !\u003d \u0027Online\u0027:"},{"line_number":550,"context_line":"            LOG.warning(\"Virtual disk %(disk)s is in %(state)s state.\","},{"line_number":551,"context_line":"                        {\u0027disk\u0027: src_virtual_disk.Id,"},{"line_number":552,"context_line":"                         \u0027state\u0027: src_virtual_disk.DiskStatus})"},{"line_number":553,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_b0264fb7","line":550,"range":{"start_line":550,"start_character":25,"end_line":550,"end_character":69},"updated":"2017-11-20 23:05:02.000000000","message":"Same comment here.","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b61596ff4c475a37797fe287f8cdd75891a32eea","unresolved":false,"context_lines":[{"line_number":651,"context_line":"                raise loopingcall.LoopingCallDone(snapshot_data)"},{"line_number":652,"context_line":"            elif (snapshot_data.State !\u003d \u0027Healthy\u0027"},{"line_number":653,"context_line":"                  and snapshot_data.Failure !\u003d \u0027NoFailure\u0027):"},{"line_number":654,"context_line":"                msg \u003d (_(\"Snapshot %(snapshot)s is in %(state)s state.\")"},{"line_number":655,"context_line":"                       % {\u0027snapshot\u0027: snapshot_data.Id,"},{"line_number":656,"context_line":"                          \u0027state\u0027: snapshot_data.State})"},{"line_number":657,"context_line":"                LOG.error(msg)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_30323ff3","line":654,"range":{"start_line":654,"start_character":25,"end_line":654,"end_character":69},"updated":"2017-11-20 23:05:02.000000000","message":"Same comment ehre.","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b61596ff4c475a37797fe287f8cdd75891a32eea","unresolved":false,"context_lines":[{"line_number":671,"context_line":"            self._api.delete_snapshot(snapshot.Id)"},{"line_number":672,"context_line":"        except Exception:"},{"line_number":673,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":674,"context_line":"                LOG.exception(\"Split operation failed for snapshot \""},{"line_number":675,"context_line":"                              \"%(snapshot)s.\", {\u0027snapshot\u0027: snapshot.Id})"},{"line_number":676,"context_line":"                try:"},{"line_number":677,"context_line":"                    logical_disk_copy \u003d datacore_utils.get_first("}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_9056ab06","line":674,"range":{"start_line":674,"start_character":29,"end_line":674,"end_character":30},"updated":"2017-11-20 23:05:02.000000000","message":"_(","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"ef82310833dd229bf1bfd02c61bdd54c58060184","unresolved":false,"context_lines":[{"line_number":671,"context_line":"            self._api.delete_snapshot(snapshot.Id)"},{"line_number":672,"context_line":"        except Exception:"},{"line_number":673,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":674,"context_line":"                LOG.exception(\"Split operation failed for snapshot \""},{"line_number":675,"context_line":"                              \"%(snapshot)s.\", {\u0027snapshot\u0027: snapshot.Id})"},{"line_number":676,"context_line":"                try:"},{"line_number":677,"context_line":"                    logical_disk_copy \u003d datacore_utils.get_first("}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_850add23","line":674,"range":{"start_line":674,"start_character":29,"end_line":674,"end_character":30},"in_reply_to":"ff82abbf_9056ab06","updated":"2017-11-21 10:50:09.000000000","message":"This is only used for the log, so current code is correct without _().","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"ef82310833dd229bf1bfd02c61bdd54c58060184","unresolved":false,"context_lines":[{"line_number":60,"context_line":"               default\u003d15,"},{"line_number":61,"context_line":"               min\u003d0,"},{"line_number":62,"context_line":"               help\u003d\u0027Seconds to wait for DataCore virtual \u0027"},{"line_number":63,"context_line":"                    \u0027disk to come from \"Failed\" state.\u0027),"},{"line_number":64,"context_line":"]"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff82abbf_6812105b","line":63,"updated":"2017-11-21 10:50:09.000000000","message":"Jay\u0027s comment from last patchset has not been addressed.","commit_id":"579f7d263bb513e1ddb34d5a1a2e0fb3aee88904"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"38a18c610c027d74ef0245c539f58863309f75d3","unresolved":false,"context_lines":[{"line_number":60,"context_line":"               default\u003d15,"},{"line_number":61,"context_line":"               min\u003d0,"},{"line_number":62,"context_line":"               help\u003d\u0027Seconds to wait for DataCore virtual \u0027"},{"line_number":63,"context_line":"                    \u0027disk to come from \"Failed\" state.\u0027),"},{"line_number":64,"context_line":"]"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"CONF \u003d cfg.CONF"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff82abbf_2f67c3bf","line":63,"in_reply_to":"ff82abbf_6812105b","updated":"2017-11-27 06:03:43.000000000","message":"Done","commit_id":"579f7d263bb513e1ddb34d5a1a2e0fb3aee88904"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"ef82310833dd229bf1bfd02c61bdd54c58060184","unresolved":false,"context_lines":[{"line_number":311,"context_line":"        pool_names \u003d volume_options[self.DATACORE_DISK_POOLS_KEY]"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        if src_virtual_disk.DiskStatus !\u003d \u0027Online\u0027:"},{"line_number":314,"context_line":"            LOG.warning(\"Virtual disk %(disk)s is in %(state)s state.\","},{"line_number":315,"context_line":"                        {\u0027disk\u0027: src_virtual_disk.Id,"},{"line_number":316,"context_line":"                         \u0027state\u0027: src_virtual_disk.DiskStatus})"},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ff82abbf_a8081828","line":314,"updated":"2017-11-21 10:50:09.000000000","message":"Jay\u0027s comment from last patchset has not been addressed.","commit_id":"579f7d263bb513e1ddb34d5a1a2e0fb3aee88904"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"38a18c610c027d74ef0245c539f58863309f75d3","unresolved":false,"context_lines":[{"line_number":311,"context_line":"        pool_names \u003d volume_options[self.DATACORE_DISK_POOLS_KEY]"},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"        if src_virtual_disk.DiskStatus !\u003d \u0027Online\u0027:"},{"line_number":314,"context_line":"            LOG.warning(\"Virtual disk %(disk)s is in %(state)s state.\","},{"line_number":315,"context_line":"                        {\u0027disk\u0027: src_virtual_disk.Id,"},{"line_number":316,"context_line":"                         \u0027state\u0027: src_virtual_disk.DiskStatus})"},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ff82abbf_cf5737ca","line":314,"in_reply_to":"ff82abbf_a8081828","updated":"2017-11-27 06:03:43.000000000","message":"Done","commit_id":"579f7d263bb513e1ddb34d5a1a2e0fb3aee88904"}],"cinder/volume/drivers/datacore/exception.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"f0187fe9a5872028ed0607f00f27240b555dc406","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from cinder.i18n import _"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class DataCoreException(exception.CinderException):"},{"line_number":22,"context_line":"    \"\"\"Base DataCore Exception.\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    message \u003d _(\u0027DataCore exception.\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffe62b97_9ceed61f","line":21,"updated":"2017-03-29 20:02:48.000000000","message":"This class should extend the more specific exception.VolumeDriverException instead of CinderException.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"51c8836f552c84570ef6a6c42e36cbe259248c98","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from cinder.i18n import _"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class DataCoreException(exception.CinderException):"},{"line_number":22,"context_line":"    \"\"\"Base DataCore Exception.\"\"\""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    message \u003d _(\u0027DataCore exception.\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ff52f3f_1d18541b","line":21,"in_reply_to":"ffe62b97_9ceed61f","updated":"2017-04-13 14:49:48.000000000","message":"Changed to extend the VolumeBackendAPIException exception.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"}],"cinder/volume/drivers/datacore/fc.py":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"960b982c84ac5d278913986f4c2803a3a884fdaa","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                raise cinder_exception.InvalidConnectorException("},{"line_number":77,"context_line":"                    missing\u003drequired)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def initialize_connection(self, volume, connector):"},{"line_number":80,"context_line":"        \"\"\"Allow connection to connector and return connection info."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        :param volume: Volume object"}],"source_content_type":"text/x-python","patch_set":2,"id":"9ff52f3f_7d552050","line":79,"updated":"2017-04-13 14:44:55.000000000","message":"Needs fczm decorator. See [0] for an example.\n\n[0] https://github.com/openstack/cinder/blob/master/cinder/volume/drivers/dell/dell_storagecenter_fc.py#L77\n\nAlso needed for terminiate_connection","commit_id":"4d50a98ff5e096c3d8a488236bb711a1f52a8053"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"a3068fbce1e995e5f468a15f94af23f76fbb0678","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                raise cinder_exception.InvalidConnectorException("},{"line_number":77,"context_line":"                    missing\u003drequired)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def initialize_connection(self, volume, connector):"},{"line_number":80,"context_line":"        \"\"\"Allow connection to connector and return connection info."},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"        :param volume: Volume object"}],"source_content_type":"text/x-python","patch_set":2,"id":"7ffa3b31_ebd02453","line":79,"in_reply_to":"9ff52f3f_7d552050","updated":"2017-04-17 17:30:03.000000000","message":"Done.","commit_id":"4d50a98ff5e096c3d8a488236bb711a1f52a8053"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"82d67e6ff4373210a814d1b57f56d1e29314a2b7","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    VERSION \u003d \u00271.0.0\u0027"},{"line_number":44,"context_line":"    STORAGE_PROTOCOL \u003d \u0027FibreChannel\u0027"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":47,"context_line":"        super(FibreChannelVolumeDriver, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ffa3b31_807228ac","line":44,"range":{"start_line":44,"start_character":4,"end_line":44,"end_character":37},"updated":"2017-04-20 18:23:56.000000000","message":"It would be better to set this to \u0027FC\u0027 to match most other FC drivers, since this is returned in get_volume_stats.","commit_id":"9a8502651ac29d5a272e76fa9bc409165d1c352c"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"a7213cb03a0f1f1e685af6c872414a70f40a45b6","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    \"\"\""},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    VERSION \u003d \u00271.0.0\u0027"},{"line_number":44,"context_line":"    STORAGE_PROTOCOL \u003d \u0027FibreChannel\u0027"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":47,"context_line":"        super(FibreChannelVolumeDriver, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f044301_af93e85a","line":44,"range":{"start_line":44,"start_character":4,"end_line":44,"end_character":37},"in_reply_to":"7ffa3b31_807228ac","updated":"2017-05-11 09:36:18.000000000","message":"Done","commit_id":"9a8502651ac29d5a272e76fa9bc409165d1c352c"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"c6fbabc87279e93a34b0bb4d5a50ab909b0e6e25","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    VERSION \u003d \u00271.0.0\u0027"},{"line_number":44,"context_line":"    STORAGE_PROTOCOL \u003d \u0027FC\u0027"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":47,"context_line":"        super(FibreChannelVolumeDriver, self).__init__(*args, **kwargs)"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1f485f77_e6f0f3ff","line":45,"updated":"2017-11-15 20:41:46.000000000","message":"Missing CI_WIKI_NAME constant like here:\n\nhttps://github.com/openstack/cinder/blob/master/cinder/volume/drivers/lvm.py#L91","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b61596ff4c475a37797fe287f8cdd75891a32eea","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        virtual_disk \u003d self._get_virtual_disk_for(volume, raise_not_found\u003dTrue)"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"        if virtual_disk.DiskStatus !\u003d \u0027Online\u0027:"},{"line_number":79,"context_line":"            LOG.warning(\"Virtual disk: %(disk)s is in %(state)s state.\","},{"line_number":80,"context_line":"                        {\u0027disk\u0027: virtual_disk.Id,"},{"line_number":81,"context_line":"                         \u0027state\u0027: virtual_disk.DiskStatus})"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_5097c391","line":79,"range":{"start_line":79,"start_character":25,"end_line":79,"end_character":70},"updated":"2017-11-20 23:05:02.000000000","message":"Same comment as in previous reviews.  Need context.","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b61596ff4c475a37797fe287f8cdd75891a32eea","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    @fczm_utils.remove_fc_zone"},{"line_number":127,"context_line":"    def terminate_connection(self, volume, connector, **kwargs):"},{"line_number":128,"context_line":"        \"\"\"Disallow connection from connector."},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"        :param volume: Volume object"},{"line_number":131,"context_line":"        :param connector: Connector information"},{"line_number":132,"context_line":"        \"\"\""},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        return super(FibreChannelVolumeDriver, self).terminate_connection("},{"line_number":135,"context_line":"            volume, connector, **kwargs)"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_70d9a781","line":132,"range":{"start_line":128,"start_character":0,"end_line":132,"end_character":11},"updated":"2017-11-20 23:05:02.000000000","message":"Should add the return here.","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"c6fbabc87279e93a34b0bb4d5a50ab909b0e6e25","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        :param connector: Connector information"},{"line_number":132,"context_line":"        \"\"\""},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        return super(FibreChannelVolumeDriver, self).terminate_connection("},{"line_number":135,"context_line":"            volume, connector, **kwargs)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def _serve_virtual_disk(self, connector, virtual_disk_id):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f485f77_86201f4a","line":134,"updated":"2017-11-15 20:41:46.000000000","message":"This doesn\u0027t appear to return a model update. Will need to return information for the fczm to work. Similar to here:\n\nhttps://github.com/openstack/cinder/blob/master/cinder/volume/drivers/hpe/hpe_3par_fc.py#L280","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"472d2519e58d09e5e3fe709ee4022eb13add5ece","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        :param connector: Connector information"},{"line_number":132,"context_line":"        \"\"\""},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        return super(FibreChannelVolumeDriver, self).terminate_connection("},{"line_number":135,"context_line":"            volume, connector, **kwargs)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def _serve_virtual_disk(self, connector, virtual_disk_id):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_2e5c2c4a","line":134,"in_reply_to":"1f485f77_86201f4a","updated":"2017-11-20 15:14:08.000000000","message":"Is it required to support Zone Manager?\n\nIt looks like support of Zone Manager is optional for Fibre Channel volume drivers:\nhttps://docs.openstack.org/mitaka/config-reference/block-storage/fc-zoning.html","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"38a18c610c027d74ef0245c539f58863309f75d3","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        :param connector: Connector information"},{"line_number":132,"context_line":"        \"\"\""},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        return super(FibreChannelVolumeDriver, self).terminate_connection("},{"line_number":135,"context_line":"            volume, connector, **kwargs)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def _serve_virtual_disk(self, connector, virtual_disk_id):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_f473277f","line":134,"in_reply_to":"ff82abbf_05c32def","updated":"2017-11-27 06:03:43.000000000","message":"Thanks Sean. We plan to add support of Zone Manager in our next update.","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"7d51db2350359efa2dcc15e2f7e175092f10bea3","unresolved":false,"context_lines":[{"line_number":131,"context_line":"        :param connector: Connector information"},{"line_number":132,"context_line":"        \"\"\""},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        return super(FibreChannelVolumeDriver, self).terminate_connection("},{"line_number":135,"context_line":"            volume, connector, **kwargs)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def _serve_virtual_disk(self, connector, virtual_disk_id):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_05c32def","line":134,"in_reply_to":"ff82abbf_2e5c2c4a","updated":"2017-11-21 10:45:51.000000000","message":"You either need to return the data, or get rid of the fczm decorator. Since it\u0027s trivial enough, I would recommend just returning the data so your customers can use automated zone management, but that is up to you.\n\nFWIW, I think you would be the only FC driver that does not, even though it is not a stated requirement for a driver.","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b61596ff4c475a37797fe287f8cdd75891a32eea","unresolved":false,"context_lines":[{"line_number":167,"context_line":"                        except datacore_exception.DataCoreException as e:"},{"line_number":168,"context_line":"                            LOG.info(\"Assigning initiator port %(initiator)s \""},{"line_number":169,"context_line":"                                     \"to client %(client)s failed with \""},{"line_number":170,"context_line":"                                     \"error %(error)s\","},{"line_number":171,"context_line":"                                     {\u0027initiator\u0027: initiator.Id,"},{"line_number":172,"context_line":"                                      \u0027client\u0027: client.Id,"},{"line_number":173,"context_line":"                                      \u0027error\u0027: e})"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_10e61b46","line":170,"range":{"start_line":170,"start_character":38,"end_line":170,"end_character":43},"updated":"2017-11-20 23:05:02.000000000","message":"error:","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"ef82310833dd229bf1bfd02c61bdd54c58060184","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        virtual_disk \u003d self._get_virtual_disk_for(volume, raise_not_found\u003dTrue)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        if virtual_disk.DiskStatus !\u003d \u0027Online\u0027:"},{"line_number":80,"context_line":"            LOG.warning(\"Virtual disk: %(disk)s is in %(state)s state.\","},{"line_number":81,"context_line":"                        {\u0027disk\u0027: virtual_disk.Id,"},{"line_number":82,"context_line":"                         \u0027state\u0027: virtual_disk.DiskStatus})"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ff82abbf_e82700b6","line":80,"updated":"2017-11-21 10:50:09.000000000","message":"Jay\u0027s comment from last patchset has not been addressed.","commit_id":"579f7d263bb513e1ddb34d5a1a2e0fb3aee88904"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"38a18c610c027d74ef0245c539f58863309f75d3","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        virtual_disk \u003d self._get_virtual_disk_for(volume, raise_not_found\u003dTrue)"},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"        if virtual_disk.DiskStatus !\u003d \u0027Online\u0027:"},{"line_number":80,"context_line":"            LOG.warning(\"Virtual disk: %(disk)s is in %(state)s state.\","},{"line_number":81,"context_line":"                        {\u0027disk\u0027: virtual_disk.Id,"},{"line_number":82,"context_line":"                         \u0027state\u0027: virtual_disk.DiskStatus})"},{"line_number":83,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ff82abbf_6ffdcbaf","line":80,"in_reply_to":"ff82abbf_e82700b6","updated":"2017-11-27 06:03:43.000000000","message":"Done","commit_id":"579f7d263bb513e1ddb34d5a1a2e0fb3aee88904"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"ef82310833dd229bf1bfd02c61bdd54c58060184","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        \"\"\"Disallow connection from connector."},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        :param volume: Volume object"},{"line_number":132,"context_line":"        :param connector: Connector information"},{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        return super(FibreChannelVolumeDriver, self).terminate_connection("}],"source_content_type":"text/x-python","patch_set":8,"id":"ff82abbf_082d8494","line":132,"updated":"2017-11-21 10:50:09.000000000","message":"Jay\u0027s comment from last patchset has not been addressed.","commit_id":"579f7d263bb513e1ddb34d5a1a2e0fb3aee88904"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"38a18c610c027d74ef0245c539f58863309f75d3","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        \"\"\"Disallow connection from connector."},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        :param volume: Volume object"},{"line_number":132,"context_line":"        :param connector: Connector information"},{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        return super(FibreChannelVolumeDriver, self).terminate_connection("}],"source_content_type":"text/x-python","patch_set":8,"id":"ff82abbf_aff753d3","line":132,"in_reply_to":"ff82abbf_082d8494","updated":"2017-11-27 06:03:43.000000000","message":"Done","commit_id":"579f7d263bb513e1ddb34d5a1a2e0fb3aee88904"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"ef82310833dd229bf1bfd02c61bdd54c58060184","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        :param connector: Connector information"},{"line_number":133,"context_line":"        \"\"\""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        return super(FibreChannelVolumeDriver, self).terminate_connection("},{"line_number":136,"context_line":"            volume, connector, **kwargs)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def _serve_virtual_disk(self, connector, virtual_disk_id):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ff82abbf_683bf0d0","line":135,"updated":"2017-11-21 10:50:09.000000000","message":"See comment added to previous patchset.","commit_id":"579f7d263bb513e1ddb34d5a1a2e0fb3aee88904"}],"cinder/volume/drivers/datacore/iscsi.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"f0187fe9a5872028ed0607f00f27240b555dc406","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    cfg.ListOpt(\u0027datacore_iscsi_unallowed_targets\u0027,"},{"line_number":36,"context_line":"                default\u003d[],"},{"line_number":37,"context_line":"                help\u003d\u0027List of iSCSI targets that cannot be used \u0027"},{"line_number":38,"context_line":"                     \u0027to attach volume.\u0027),"},{"line_number":39,"context_line":"    cfg.BoolOpt(\u0027datacore_iscsi_chap_enabled\u0027,"},{"line_number":40,"context_line":"                default\u003dFalse,"},{"line_number":41,"context_line":"                help\u003d\u0027Configure CHAP authentication for iSCSI connections.\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffe62b97_3c76aa71","line":38,"updated":"2017-03-29 20:02:48.000000000","message":"What is this option for?  Please include some text that would indicate why a deployer would set this.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"51c8836f552c84570ef6a6c42e36cbe259248c98","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    cfg.ListOpt(\u0027datacore_iscsi_unallowed_targets\u0027,"},{"line_number":36,"context_line":"                default\u003d[],"},{"line_number":37,"context_line":"                help\u003d\u0027List of iSCSI targets that cannot be used \u0027"},{"line_number":38,"context_line":"                     \u0027to attach volume.\u0027),"},{"line_number":39,"context_line":"    cfg.BoolOpt(\u0027datacore_iscsi_chap_enabled\u0027,"},{"line_number":40,"context_line":"                default\u003dFalse,"},{"line_number":41,"context_line":"                help\u003d\u0027Configure CHAP authentication for iSCSI connections.\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ff52f3f_fd5ff0e2","line":38,"in_reply_to":"ffe62b97_3c76aa71","updated":"2017-04-13 14:49:48.000000000","message":"Done.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"4b8c427a4af7262da483c2cc45ea43a562ec4640","unresolved":false,"context_lines":[{"line_number":364,"context_line":"                                  \"authentication for initiator %(initiator)s \""},{"line_number":365,"context_line":"                                  \"failed with error %(error)s.\"),"},{"line_number":366,"context_line":"                              {\u0027initiator\u0027: initiator.PortName,"},{"line_number":367,"context_line":"                               \u0027error\u0027: e})"},{"line_number":368,"context_line":"                try:"},{"line_number":369,"context_line":"                    for target in changed_targets:"},{"line_number":370,"context_line":"                        properties \u003d target.ServerPortProperties"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffe62b97_eb28bae2","line":367,"range":{"start_line":367,"start_character":32,"end_line":367,"end_character":41},"updated":"2017-03-28 15:16:05.000000000","message":"Remove","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"51c8836f552c84570ef6a6c42e36cbe259248c98","unresolved":false,"context_lines":[{"line_number":364,"context_line":"                                  \"authentication for initiator %(initiator)s \""},{"line_number":365,"context_line":"                                  \"failed with error %(error)s.\"),"},{"line_number":366,"context_line":"                              {\u0027initiator\u0027: initiator.PortName,"},{"line_number":367,"context_line":"                               \u0027error\u0027: e})"},{"line_number":368,"context_line":"                try:"},{"line_number":369,"context_line":"                    for target in changed_targets:"},{"line_number":370,"context_line":"                        properties \u003d target.ServerPortProperties"}],"source_content_type":"text/x-python","patch_set":1,"id":"9ff52f3f_9d5ea4e4","line":367,"range":{"start_line":367,"start_character":32,"end_line":367,"end_character":41},"in_reply_to":"ffe62b97_eb28bae2","updated":"2017-04-13 14:49:48.000000000","message":"Done.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"c6fbabc87279e93a34b0bb4d5a50ab909b0e6e25","unresolved":false,"context_lines":[{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    VERSION \u003d \u00271.0.0\u0027"},{"line_number":69,"context_line":"    STORAGE_PROTOCOL \u003d \u0027iSCSI\u0027"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":72,"context_line":"        super(ISCSIVolumeDriver, self).__init__(*args, **kwargs)"},{"line_number":73,"context_line":"        self.configuration.append_config_values(datacore_iscsi_opts)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f485f77_86c49f92","line":70,"updated":"2017-11-15 20:41:46.000000000","message":"Add CI_WIKI_NAME.","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b61596ff4c475a37797fe287f8cdd75891a32eea","unresolved":false,"context_lines":[{"line_number":120,"context_line":"        virtual_disk \u003d self._get_virtual_disk_for(volume, raise_not_found\u003dTrue)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        if virtual_disk.DiskStatus !\u003d \u0027Online\u0027:"},{"line_number":123,"context_line":"            LOG.warning(\"Virtual disk %(disk)s is in %(state)s state.\","},{"line_number":124,"context_line":"                        {\u0027disk\u0027: virtual_disk.Id,"},{"line_number":125,"context_line":"                         \u0027state\u0027: virtual_disk.DiskStatus})"},{"line_number":126,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_90cb0ba4","line":123,"range":{"start_line":123,"start_character":25,"end_line":123,"end_character":69},"updated":"2017-11-20 23:05:02.000000000","message":"Same comment here.","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b61596ff4c475a37797fe287f8cdd75891a32eea","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                logical_units[target] \u003d logical_unit"},{"line_number":219,"context_line":"        except Exception:"},{"line_number":220,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":221,"context_line":"                LOG.exception(\"Serve operation for virtual disk %(disk)s \""},{"line_number":222,"context_line":"                              \"failed with error.\","},{"line_number":223,"context_line":"                              {\u0027disk\u0027: virtual_disk.Id})"},{"line_number":224,"context_line":"                try:"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_70c20788","line":221,"range":{"start_line":221,"start_character":31,"end_line":221,"end_character":36},"updated":"2017-11-20 23:05:02.000000000","message":"Mapping","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b61596ff4c475a37797fe287f8cdd75891a32eea","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                        self._api.delete_target_domain(target_domain.Id)"},{"line_number":235,"context_line":"                except datacore_exception.DataCoreException as e:"},{"line_number":236,"context_line":"                    LOG.warning(\"An error occurred on a cleanup after \""},{"line_number":237,"context_line":"                                \"failed serve operation: %s.\", e)"},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"        return logical_units"},{"line_number":240,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_d03673b5","line":237,"range":{"start_line":237,"start_character":40,"end_line":237,"end_character":45},"updated":"2017-11-20 23:05:02.000000000","message":"mapping","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"ef82310833dd229bf1bfd02c61bdd54c58060184","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        virtual_disk \u003d self._get_virtual_disk_for(volume, raise_not_found\u003dTrue)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        if virtual_disk.DiskStatus !\u003d \u0027Online\u0027:"},{"line_number":124,"context_line":"            LOG.warning(\"Virtual disk %(disk)s is in %(state)s state.\","},{"line_number":125,"context_line":"                        {\u0027disk\u0027: virtual_disk.Id,"},{"line_number":126,"context_line":"                         \u0027state\u0027: virtual_disk.DiskStatus})"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ff82abbf_a856d805","line":124,"updated":"2017-11-21 10:50:09.000000000","message":"Jay\u0027s comment from last patchset has not been addressed.","commit_id":"579f7d263bb513e1ddb34d5a1a2e0fb3aee88904"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"38a18c610c027d74ef0245c539f58863309f75d3","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        virtual_disk \u003d self._get_virtual_disk_for(volume, raise_not_found\u003dTrue)"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":"        if virtual_disk.DiskStatus !\u003d \u0027Online\u0027:"},{"line_number":124,"context_line":"            LOG.warning(\"Virtual disk %(disk)s is in %(state)s state.\","},{"line_number":125,"context_line":"                        {\u0027disk\u0027: virtual_disk.Id,"},{"line_number":126,"context_line":"                         \u0027state\u0027: virtual_disk.DiskStatus})"},{"line_number":127,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ff82abbf_8ffa8fba","line":124,"in_reply_to":"ff82abbf_a856d805","updated":"2017-11-27 06:03:43.000000000","message":"Done","commit_id":"579f7d263bb513e1ddb34d5a1a2e0fb3aee88904"}],"cinder/volume/drivers/datacore/passwd.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"f0187fe9a5872028ed0607f00f27240b555dc406","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class FileStorage(object):"},{"line_number":32,"context_line":"    \"\"\"Represents a file as a dictionary.\"\"\""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ffe62b97_d7e9d7e2","line":30,"updated":"2017-03-29 20:02:48.000000000","message":"It\u0027s not clear to me whether coding a password store like this is actually any better than storing passwords in cinder.conf...","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"51c8836f552c84570ef6a6c42e36cbe259248c98","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class FileStorage(object):"},{"line_number":32,"context_line":"    \"\"\"Represents a file as a dictionary.\"\"\""},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9ff52f3f_9dba24dc","line":30,"in_reply_to":"ffe62b97_d7e9d7e2","updated":"2017-04-13 14:49:48.000000000","message":"Generally speaking the password store does not provider better security than cinder.conf. It is also based on file permissions in the same way as cinder.conf. But it looks for me like cinder.conf provides a user-defined configurations. On the other hand the driver uses the password store to store secrets generated at run time.\n\nBut, we may consider an option to use \"chap_username\" and \"chap_password\" config parameters if you\u0027d like to avoid usage of the password store because of additional complexity.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b61596ff4c475a37797fe287f8cdd75891a32eea","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    def open(self):"},{"line_number":40,"context_line":"        \"\"\"Open a file for simultaneous reading and writing."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        If the specified file does not exists, it will be created"},{"line_number":43,"context_line":"        with the 0600 access permissions for the current user, if needed"},{"line_number":44,"context_line":"        the appropriate directories will be created with the 0750 access"},{"line_number":45,"context_line":"        permissions for the current user."}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_d05f53e3","line":42,"range":{"start_line":42,"start_character":39,"end_line":42,"end_character":45},"updated":"2017-11-20 23:05:02.000000000","message":"exist","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"cb078ead257f2e3824b2f51e858d236186ae6982","unresolved":false,"context_lines":[{"line_number":79,"context_line":"        \"\"\""},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        if not isinstance(storage, dict):"},{"line_number":82,"context_line":"            msg \u003d _(\u0027%s is not a dict.\u0027) % repr(storage)"},{"line_number":83,"context_line":"            raise TypeError(msg)"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        self._file.seek(0)"}],"source_content_type":"text/x-python","patch_set":10,"id":"df87a7cf_7abf2bfb","line":82,"range":{"start_line":82,"start_character":43,"end_line":82,"end_character":47},"updated":"2017-12-04 17:13:17.000000000","message":"Should remove this and just make the format string %r.","commit_id":"747efde4709d7aa00f5d13d98d0036639e612945"}],"cinder/volume/drivers/datacore/utils.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"f0187fe9a5872028ed0607f00f27240b555dc406","unresolved":false,"context_lines":[{"line_number":29,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def retry(exceptions, timeout\u003dNone):"},{"line_number":33,"context_line":"    \"\"\"Decorator for retrying a function upon expected exceptions."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    The function retries for a given timeout."}],"source_content_type":"text/x-python","patch_set":1,"id":"ffe62b97_9c301658","line":32,"updated":"2017-03-29 20:02:48.000000000","message":"Please use the retry method in cinder/utils.py rather than adding this one.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"51c8836f552c84570ef6a6c42e36cbe259248c98","unresolved":false,"context_lines":[{"line_number":29,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def retry(exceptions, timeout\u003dNone):"},{"line_number":33,"context_line":"    \"\"\"Decorator for retrying a function upon expected exceptions."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    The function retries for a given timeout."}],"source_content_type":"text/x-python","patch_set":1,"id":"9ff52f3f_dd0aec88","line":32,"in_reply_to":"ffe62b97_9c301658","updated":"2017-04-13 14:49:48.000000000","message":"We have used a retry function from the retrying library because such one from the cinder/utils.py does not work well for us. We had a look for existing usage samples of cinder.utils.retry for our case in the Cinder source code such as retry for wait_for_quiesced method in the ...\\volume\\drivers\\netapp\\dataontap\\utils\\data_motion.py. It looks error-prone for me. May be we can add a timeout parameter to the retry function from the cinder/utils.py to stop retrying on timeout or exceeding a number of tries.","commit_id":"c691c087d4a3d01fc43d0bcaa5fe99f77bf8c2c9"},{"author":{"_account_id":7198,"name":"Jay Bryant","email":"jungleboyj@electronicjungle.net","username":"jsbryant"},"change_message_id":"b61596ff4c475a37797fe287f8cdd75891a32eea","unresolved":false,"context_lines":[{"line_number":19,"context_line":"import six"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def build_network_address(host, port):"}],"source_content_type":"text/x-python","patch_set":7,"id":"ff82abbf_900eabe3","line":22,"range":{"start_line":22,"start_character":0,"end_line":22,"end_character":33},"updated":"2017-11-20 23:05:02.000000000","message":"Doesn\u0027t look like LOG is used.","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"},{"author":{"_account_id":1736,"name":"Ivan Kolodyazhny","email":"e0ne@e0ne.info","username":"e0ne"},"change_message_id":"22a09b986e91524d9718d84751b784a231c02911","unresolved":false,"context_lines":[{"line_number":58,"context_line":"             specified predicate, if found; otherwise the default value"},{"line_number":59,"context_line":"    \"\"\""},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    return six.next((item for item in source if predicate(item)), default)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"def get_distinct_by(key, source):"}],"source_content_type":"text/x-python","patch_set":7,"id":"1f485f77_831b557f","line":61,"updated":"2017-11-16 15:15:00.000000000","message":"Please, re-use \u0027get_first\u0027 method here","commit_id":"89a65652c10b7a35cc285f4fffa9fbcda22cfbcc"}],"releasenotes/notes/add-datacore-volume-driver-3775797b0515f538.yaml":[{"author":{"_account_id":11904,"name":"Sean McGinnis","email":"sean.mcginnis@gmail.com","username":"SeanM"},"change_message_id":"960b982c84ac5d278913986f4c2803a3a884fdaa","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Added iSCSI and Fibre Channel volume drivers for the"},{"line_number":4,"context_line":"    DataCore’s SANsymphony and Hyper-converged Virtual SAN storage."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"9ff52f3f_fdbdb068","line":3,"range":{"start_line":3,"start_character":53,"end_line":3,"end_character":56},"updated":"2017-04-13 14:44:55.000000000","message":"Remove \"the\"","commit_id":"4d50a98ff5e096c3d8a488236bb711a1f52a8053"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"a3068fbce1e995e5f468a15f94af23f76fbb0678","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Added iSCSI and Fibre Channel volume drivers for the"},{"line_number":4,"context_line":"    DataCore’s SANsymphony and Hyper-converged Virtual SAN storage."}],"source_content_type":"text/x-yaml","patch_set":2,"id":"7ffa3b31_4b3718b2","line":3,"range":{"start_line":3,"start_character":53,"end_line":3,"end_character":56},"in_reply_to":"9ff52f3f_fdbdb068","updated":"2017-04-17 17:30:03.000000000","message":"Done.","commit_id":"4d50a98ff5e096c3d8a488236bb711a1f52a8053"}],"requirements.txt":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"82d67e6ff4373210a814d1b57f56d1e29314a2b7","unresolved":false,"context_lines":[{"line_number":63,"context_line":"tooz\u003e\u003d1.47.0 # Apache-2.0"},{"line_number":64,"context_line":"google-api-python-client\u003e\u003d1.4.2 # Apache-2.0"},{"line_number":65,"context_line":"castellan\u003e\u003d0.4.0 # Apache-2.0"},{"line_number":66,"context_line":"websocket-client\u003e\u003d0.32.0 # LGPLv2+"}],"source_content_type":"text/plain","patch_set":3,"id":"7ffa3b31_c03dd08f","line":66,"updated":"2017-04-20 18:23:56.000000000","message":"Add this to driver-requirements.txt instead of requirements.txt.","commit_id":"9a8502651ac29d5a272e76fa9bc409165d1c352c"},{"author":{"_account_id":22878,"name":"Michael Latchmansingh","email":"mlatchmansingh@datacore.com","username":"mlatchmansingh.datacore"},"change_message_id":"a7213cb03a0f1f1e685af6c872414a70f40a45b6","unresolved":false,"context_lines":[{"line_number":63,"context_line":"tooz\u003e\u003d1.47.0 # Apache-2.0"},{"line_number":64,"context_line":"google-api-python-client\u003e\u003d1.4.2 # Apache-2.0"},{"line_number":65,"context_line":"castellan\u003e\u003d0.4.0 # Apache-2.0"},{"line_number":66,"context_line":"websocket-client\u003e\u003d0.32.0 # LGPLv2+"}],"source_content_type":"text/plain","patch_set":3,"id":"3f044301_efad709b","line":66,"in_reply_to":"7ffa3b31_c03dd08f","updated":"2017-05-11 09:36:18.000000000","message":"Done","commit_id":"9a8502651ac29d5a272e76fa9bc409165d1c352c"}]}
