)]}'
{"cinder/tests/unit/volume/drivers/test_infinidat.py":[{"author":{"_account_id":23602,"name":"Michael Dovgal","email":"dovgalmichael@gmail.com","username":"mdovgal"},"change_message_id":"787d1e7ccb8b09e8297b4cfa819435c2de983b4f","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.driver \u003d infinidat.InfiniboxVolumeDriver("},{"line_number":58,"context_line":"            configuration\u003dself.configuration)"},{"line_number":59,"context_line":"        self._system \u003d self._infinibox_mock()"},{"line_number":60,"context_line":"        infinisdk \u003d mock.Mock()"},{"line_number":61,"context_line":"        capacity \u003d mock.Mock()"},{"line_number":62,"context_line":"        infinidat.infinisdk \u003d infinisdk"},{"line_number":63,"context_line":"        infinidat.capacity \u003d capacity"},{"line_number":64,"context_line":"        capacity.byte \u003d 1"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_605f8fe5","line":61,"range":{"start_line":60,"start_character":0,"end_line":61,"end_character":30},"updated":"2017-01-16 13:51:56.000000000","message":"Are these variables available from other parts of code?\nOr it\u0027s just the way how to mock python modules?","commit_id":"e9a56e66c3896e5f738b54b6ed58ecebc98be987"},{"author":{"_account_id":22683,"name":"Arnon Yaari","email":"arnony@infinidat.com","username":"arnony"},"change_message_id":"e4977e29506777246011748c1797708cf61a9de0","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        self.driver \u003d infinidat.InfiniboxVolumeDriver("},{"line_number":58,"context_line":"            configuration\u003dself.configuration)"},{"line_number":59,"context_line":"        self._system \u003d self._infinibox_mock()"},{"line_number":60,"context_line":"        infinisdk \u003d mock.Mock()"},{"line_number":61,"context_line":"        capacity \u003d mock.Mock()"},{"line_number":62,"context_line":"        infinidat.infinisdk \u003d infinisdk"},{"line_number":63,"context_line":"        infinidat.capacity \u003d capacity"},{"line_number":64,"context_line":"        capacity.byte \u003d 1"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_5ef028c9","line":61,"range":{"start_line":60,"start_character":0,"end_line":61,"end_character":30},"in_reply_to":"7a3c09a3_605f8fe5","updated":"2017-01-19 09:39:01.000000000","message":"It\u0027s just the way to mock the python modules in the driver\u0027s code. The next two lines are the assignment into the driver code, and the lines after that are the mocked attributes.","commit_id":"e9a56e66c3896e5f738b54b6ed58ecebc98be987"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0d5c872fca638c79f7b717a9e714ec2d49835c19","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        infinisdk \u003d mock.Mock()"},{"line_number":60,"context_line":"        capacity \u003d mock.Mock()"},{"line_number":61,"context_line":"        infinidat.infinisdk \u003d infinisdk"},{"line_number":62,"context_line":"        infinidat.capacity \u003d capacity"},{"line_number":63,"context_line":"        capacity.byte \u003d 1"},{"line_number":64,"context_line":"        capacity.GiB \u003d units.Gi"},{"line_number":65,"context_line":"        infinisdk.core.exceptions.InfiniSDKException \u003d FakeInfinisdkException"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f013ff3_a9910655","line":62,"updated":"2017-05-16 11:17:15.000000000","message":"-1: You should patch these 2 libraries and not make assignments.","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"},{"author":{"_account_id":22683,"name":"Arnon Yaari","email":"arnony@infinidat.com","username":"arnony"},"change_message_id":"fb1cb3fe25e41a4b97962a8f9ea97ade58546f57","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        infinisdk \u003d mock.Mock()"},{"line_number":60,"context_line":"        capacity \u003d mock.Mock()"},{"line_number":61,"context_line":"        infinidat.infinisdk \u003d infinisdk"},{"line_number":62,"context_line":"        infinidat.capacity \u003d capacity"},{"line_number":63,"context_line":"        capacity.byte \u003d 1"},{"line_number":64,"context_line":"        capacity.GiB \u003d units.Gi"},{"line_number":65,"context_line":"        infinisdk.core.exceptions.InfiniSDKException \u003d FakeInfinisdkException"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f013ff3_5d4d7798","line":62,"in_reply_to":"1f013ff3_a9910655","updated":"2017-05-17 14:00:22.000000000","message":"Done","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0d5c872fca638c79f7b717a9e714ec2d49835c19","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        self.assertEqual(0, result[\"free_capacity_gb\"])"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def test_get_volume_stats_pool_not_found(self):"},{"line_number":105,"context_line":"        self._system.pools.safe_get.return_value \u003d None"},{"line_number":106,"context_line":"        self.assertRaises(exception.VolumeDriverException,"},{"line_number":107,"context_line":"                          self.driver.get_volume_stats)"},{"line_number":108,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1f013ff3_a99fc64e","line":105,"updated":"2017-05-16 11:17:15.000000000","message":"nit: we should check the method has been called, that way we are sure this is the cause of the failure. Same with the rest of the mocks we are doing in the other tests.","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"a527569c815a258c613428a4012b5fe5f10cb5e4","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        self.assertEqual(0, result[\"free_capacity_gb\"])"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def test_get_volume_stats_pool_not_found(self):"},{"line_number":103,"context_line":"        self._system.pools.safe_get.return_value \u003d None"},{"line_number":104,"context_line":"        self.assertRaises(exception.VolumeDriverException,"},{"line_number":105,"context_line":"                          self.driver.get_volume_stats)"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ff0f0b1f_0a300756","line":103,"updated":"2017-05-18 09:15:52.000000000","message":"nit: we should check the method has been called, that way we are sure this is the cause of the failure. Same with the rest of the mocks we are doing in the other tests.","commit_id":"a5e445c3673362bf2d7eb9510422b6ca7083da1b"},{"author":{"_account_id":22683,"name":"Arnon Yaari","email":"arnony@infinidat.com","username":"arnony"},"change_message_id":"533b74879a95601f2ad44a296290286cf565b654","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        self.assertEqual(0, result[\"free_capacity_gb\"])"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def test_get_volume_stats_pool_not_found(self):"},{"line_number":103,"context_line":"        self._system.pools.safe_get.return_value \u003d None"},{"line_number":104,"context_line":"        self.assertRaises(exception.VolumeDriverException,"},{"line_number":105,"context_line":"                          self.driver.get_volume_stats)"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ff0f0b1f_f675b999","line":103,"in_reply_to":"ff0f0b1f_0a300756","updated":"2017-05-18 12:47:05.000000000","message":"I believe the \"assertRaises\" cover that. There wouldn\u0027t be exceptions from the tested functions if these methods hadn\u0027t returned \"bad\" values.","commit_id":"a5e445c3673362bf2d7eb9510422b6ca7083da1b"}],"cinder/volume/drivers/infinidat.py":[{"author":{"_account_id":23602,"name":"Michael Dovgal","email":"dovgalmichael@gmail.com","username":"mdovgal"},"change_message_id":"787d1e7ccb8b09e8297b4cfa819435c2de983b4f","unresolved":false,"context_lines":[{"line_number":34,"context_line":"from cinder.volume import utils as vol_utils"},{"line_number":35,"context_line":"from cinder.zonemanager import utils as fczm_utils"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"try:"},{"line_number":38,"context_line":"    import capacity"},{"line_number":39,"context_line":"    import infinisdk"},{"line_number":40,"context_line":"except ImportError:"},{"line_number":41,"context_line":"    capacity \u003d None"},{"line_number":42,"context_line":"    infinisdk \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_85f2cd6d","line":42,"range":{"start_line":37,"start_character":0,"end_line":42,"end_character":20},"updated":"2017-01-16 13:51:56.000000000","message":"Is it possible, if infinisdk is installed and capacity isn\u0027t? In that case after the first import error infinisdk will be None either?","commit_id":"e9a56e66c3896e5f738b54b6ed58ecebc98be987"},{"author":{"_account_id":22683,"name":"Arnon Yaari","email":"arnony@infinidat.com","username":"arnony"},"change_message_id":"e4977e29506777246011748c1797708cf61a9de0","unresolved":false,"context_lines":[{"line_number":34,"context_line":"from cinder.volume import utils as vol_utils"},{"line_number":35,"context_line":"from cinder.zonemanager import utils as fczm_utils"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"try:"},{"line_number":38,"context_line":"    import capacity"},{"line_number":39,"context_line":"    import infinisdk"},{"line_number":40,"context_line":"except ImportError:"},{"line_number":41,"context_line":"    capacity \u003d None"},{"line_number":42,"context_line":"    infinisdk \u003d None"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_fbe1d1d1","line":42,"range":{"start_line":37,"start_character":0,"end_line":42,"end_character":20},"in_reply_to":"7a3c09a3_85f2cd6d","updated":"2017-01-19 09:39:01.000000000","message":"\"capacity\" is a dependency of \"infinisdk\".  The module I\u0027m actually interested in checking is infinisdk, but I have to put the import of \"capacity\" in the same try/except too. So I treat both as one, and if either one is not installed, I set both to None and later fail in do_setup. I understand this is confusing, I will add a comment","commit_id":"e9a56e66c3896e5f738b54b6ed58ecebc98be987"},{"author":{"_account_id":23602,"name":"Michael Dovgal","email":"dovgalmichael@gmail.com","username":"mdovgal"},"change_message_id":"787d1e7ccb8b09e8297b4cfa819435c2de983b4f","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def do_setup(self, context):"},{"line_number":88,"context_line":"        \"\"\"Driver initialization\"\"\""},{"line_number":89,"context_line":"        if infinisdk is None:"},{"line_number":90,"context_line":"            msg \u003d _(\"Missing \u0027infinisdk\u0027 python module, ensure the library\""},{"line_number":91,"context_line":"                    \" is installed and available.\")"},{"line_number":92,"context_line":"            raise exception.VolumeDriverException(msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_a02177a1","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":29},"updated":"2017-01-16 13:51:56.000000000","message":"here we also need to add capacity module check","commit_id":"e9a56e66c3896e5f738b54b6ed58ecebc98be987"},{"author":{"_account_id":22683,"name":"Arnon Yaari","email":"arnony@infinidat.com","username":"arnony"},"change_message_id":"e4977e29506777246011748c1797708cf61a9de0","unresolved":false,"context_lines":[{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def do_setup(self, context):"},{"line_number":88,"context_line":"        \"\"\"Driver initialization\"\"\""},{"line_number":89,"context_line":"        if infinisdk is None:"},{"line_number":90,"context_line":"            msg \u003d _(\"Missing \u0027infinisdk\u0027 python module, ensure the library\""},{"line_number":91,"context_line":"                    \" is installed and available.\")"},{"line_number":92,"context_line":"            raise exception.VolumeDriverException(msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_5b266517","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":29},"in_reply_to":"7a3c09a3_a02177a1","updated":"2017-01-19 09:39:01.000000000","message":"Like in the comment above, the module I\u0027m actually interested in checking is infinisdk, and capacity is a dependency so this should be fine. (I assume no one will install infinisdk and then explicitly uninstall capacity or any other dependent module)","commit_id":"e9a56e66c3896e5f738b54b6ed58ecebc98be987"},{"author":{"_account_id":23602,"name":"Michael Dovgal","email":"dovgalmichael@gmail.com","username":"mdovgal"},"change_message_id":"787d1e7ccb8b09e8297b4cfa819435c2de983b4f","unresolved":false,"context_lines":[{"line_number":234,"context_line":"            free_capacity_bytes \u003d (pool.get_free_physical_capacity() /"},{"line_number":235,"context_line":"                                   capacity.byte)"},{"line_number":236,"context_line":"            physical_capacity_bytes \u003d (pool.get_physical_capacity() /"},{"line_number":237,"context_line":"                                       capacity.byte)"},{"line_number":238,"context_line":"            free_capacity_gb \u003d float(free_capacity_bytes) / units.Gi"},{"line_number":239,"context_line":"            total_capacity_gb \u003d float(physical_capacity_bytes) / units.Gi"},{"line_number":240,"context_line":"            self._volume_stats \u003d dict(volume_backend_name\u003dself._backend_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_2508392c","line":237,"range":{"start_line":237,"start_character":39,"end_line":237,"end_character":47},"updated":"2017-01-16 13:51:56.000000000","message":"And if capacity module is None here (as an example) we will have an error","commit_id":"e9a56e66c3896e5f738b54b6ed58ecebc98be987"},{"author":{"_account_id":22683,"name":"Arnon Yaari","email":"arnony@infinidat.com","username":"arnony"},"change_message_id":"e4977e29506777246011748c1797708cf61a9de0","unresolved":false,"context_lines":[{"line_number":234,"context_line":"            free_capacity_bytes \u003d (pool.get_free_physical_capacity() /"},{"line_number":235,"context_line":"                                   capacity.byte)"},{"line_number":236,"context_line":"            physical_capacity_bytes \u003d (pool.get_physical_capacity() /"},{"line_number":237,"context_line":"                                       capacity.byte)"},{"line_number":238,"context_line":"            free_capacity_gb \u003d float(free_capacity_bytes) / units.Gi"},{"line_number":239,"context_line":"            total_capacity_gb \u003d float(physical_capacity_bytes) / units.Gi"},{"line_number":240,"context_line":"            self._volume_stats \u003d dict(volume_backend_name\u003dself._backend_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a3905b3_db5fb573","line":237,"range":{"start_line":237,"start_character":39,"end_line":237,"end_character":47},"in_reply_to":"7a3c09a3_2508392c","updated":"2017-01-19 09:39:01.000000000","message":"do_setup will fail if either capacity or infinisdk are None so we shouldn\u0027t get here if either is missing.","commit_id":"e9a56e66c3896e5f738b54b6ed58ecebc98be987"},{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"01455bef80d608737c3e65e8dcf9cf062c74c438","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    # capacity is a dependency of infinisdk, so if infinisdk is available"},{"line_number":38,"context_line":"    # then capacity should be available too"},{"line_number":39,"context_line":"    import capacity"},{"line_number":40,"context_line":"    import infinisdk"},{"line_number":41,"context_line":"except ImportError:"},{"line_number":42,"context_line":"    capacity \u003d None"},{"line_number":43,"context_line":"    infinisdk \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_447a5878","line":40,"updated":"2017-02-14 17:25:48.000000000","message":"what are the licenses of these packages?","commit_id":"d819bbe8955e44fe75a9c70107b9532c13bfdf32"},{"author":{"_account_id":22683,"name":"Arnon Yaari","email":"arnony@infinidat.com","username":"arnony"},"change_message_id":"1f195e8162a53e2c89d0e4b6b3fe8887ebb418ff","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    # capacity is a dependency of infinisdk, so if infinisdk is available"},{"line_number":38,"context_line":"    # then capacity should be available too"},{"line_number":39,"context_line":"    import capacity"},{"line_number":40,"context_line":"    import infinisdk"},{"line_number":41,"context_line":"except ImportError:"},{"line_number":42,"context_line":"    capacity \u003d None"},{"line_number":43,"context_line":"    infinisdk \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa31d9ce_f85cb67e","line":40,"in_reply_to":"fa31d9ce_447a5878","updated":"2017-02-15 09:22:15.000000000","message":"The license of infinisdk is BSD-3: https://pypi.python.org/pypi/infinisdk\nThe dependencies, like capacity, should also be ok: https://pypi.python.org/pypi/capacity","commit_id":"d819bbe8955e44fe75a9c70107b9532c13bfdf32"},{"author":{"_account_id":22683,"name":"Arnon Yaari","email":"arnony@infinidat.com","username":"arnony"},"change_message_id":"27f65631d7c449af8c3b47c635739d95265df0f5","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    # capacity is a dependency of infinisdk, so if infinisdk is available"},{"line_number":38,"context_line":"    # then capacity should be available too"},{"line_number":39,"context_line":"    import capacity"},{"line_number":40,"context_line":"    import infinisdk"},{"line_number":41,"context_line":"except ImportError:"},{"line_number":42,"context_line":"    capacity \u003d None"},{"line_number":43,"context_line":"    infinisdk \u003d None"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba2be162_9e03f441","line":40,"in_reply_to":"fa31d9ce_f85cb67e","updated":"2017-03-02 15:19:05.000000000","message":"Done","commit_id":"d819bbe8955e44fe75a9c70107b9532c13bfdf32"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"228f571b883b86e2b778b7ce5dc4918d760287a6","unresolved":false,"context_lines":[{"line_number":248,"context_line":"        pool \u003d self._get_infinidat_pool()"},{"line_number":249,"context_line":"        volume_name \u003d self._make_volume_name(volume)"},{"line_number":250,"context_line":"        provtype \u003d \"THIN\" if self.configuration.san_thin_provision else \"THICK\""},{"line_number":251,"context_line":"        size \u003d volume.size * capacity.GiB"},{"line_number":252,"context_line":"        return self._system.volumes.create(name\u003dvolume_name,"},{"line_number":253,"context_line":"                                           pool\u003dpool,"},{"line_number":254,"context_line":"                                           provtype\u003dprovtype,"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a25e98e_60b9ae2e","line":251,"updated":"2017-03-13 20:11:52.000000000","message":"We already use oslo_utils units.Gi all through Cinder for this.\n\nAll uses in this file seem to be covered there -- please use that like the rest of Cinder instead of pulling in a new python module just for units (capacity).","commit_id":"3cde16e56545ea42632f80e5e4d74e130bffd763"},{"author":{"_account_id":22683,"name":"Arnon Yaari","email":"arnony@infinidat.com","username":"arnony"},"change_message_id":"25c529c94aa8e5d434fb4673686689d9902b7366","unresolved":false,"context_lines":[{"line_number":248,"context_line":"        pool \u003d self._get_infinidat_pool()"},{"line_number":249,"context_line":"        volume_name \u003d self._make_volume_name(volume)"},{"line_number":250,"context_line":"        provtype \u003d \"THIN\" if self.configuration.san_thin_provision else \"THICK\""},{"line_number":251,"context_line":"        size \u003d volume.size * capacity.GiB"},{"line_number":252,"context_line":"        return self._system.volumes.create(name\u003dvolume_name,"},{"line_number":253,"context_line":"                                           pool\u003dpool,"},{"line_number":254,"context_line":"                                           provtype\u003dprovtype,"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a1ff146_1924a2ad","line":251,"in_reply_to":"7a25e98e_60b9ae2e","updated":"2017-03-16 10:41:31.000000000","message":"capacity.GiB is an object, not an int. The library \"infinisdk\" expects a \"capacity\" object and not an int for the size argument, so this is intentional.","commit_id":"3cde16e56545ea42632f80e5e4d74e130bffd763"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"a90f1bcd2c67cbd6f3adab516a7b70fe355205bb","unresolved":false,"context_lines":[{"line_number":265,"context_line":"        \"\"\"Delete a volume from the backend.\"\"\""},{"line_number":266,"context_line":"        volume_name \u003d self._make_volume_name(volume)"},{"line_number":267,"context_line":"        try:"},{"line_number":268,"context_line":"            volume \u003d self._get_infinidat_volume_by_name(volume_name)"},{"line_number":269,"context_line":"        except exception.InvalidVolume:"},{"line_number":270,"context_line":"            return      # volume not found"},{"line_number":271,"context_line":"        if volume.has_children():"}],"source_content_type":"text/x-python","patch_set":11,"id":"ffe62b97_ff9874c0","line":268,"updated":"2017-05-01 16:45:28.000000000","message":"Would be better to use a different variable name here as some of the other methods do rather than shadowing the \"volume\" variable.","commit_id":"440b63f4b92dd56612039aa88acbf68e405e1553"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0d5c872fca638c79f7b717a9e714ec2d49835c19","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        except infinisdk.core.exceptions.InfiniSDKException as ex:"},{"line_number":65,"context_line":"            # text_type(ex) includes http code and url"},{"line_number":66,"context_line":"            msg \u003d _(\u0027Caught exception from infinisdk: %(exception)s\u0027) % {"},{"line_number":67,"context_line":"                \u0027exception\u0027: six.text_type(ex)}"},{"line_number":68,"context_line":"            LOG.exception(msg)"},{"line_number":69,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dmsg)"},{"line_number":70,"context_line":"    return wrapper"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f013ff3_89b88a2a","line":67,"range":{"start_line":67,"start_character":29,"end_line":67,"end_character":42},"updated":"2017-05-16 11:17:15.000000000","message":"-1: We should not be using six.text_type here, since you are already using the _ method it will be done automatically with the %s formatting.\n\nAlso since we only have 1 parameter we could do:\n\n msg \u003d _(\u0027Caught exception from infinisdk: %s\u0027) % ex","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"},{"author":{"_account_id":22683,"name":"Arnon Yaari","email":"arnony@infinidat.com","username":"arnony"},"change_message_id":"fb1cb3fe25e41a4b97962a8f9ea97ade58546f57","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        except infinisdk.core.exceptions.InfiniSDKException as ex:"},{"line_number":65,"context_line":"            # text_type(ex) includes http code and url"},{"line_number":66,"context_line":"            msg \u003d _(\u0027Caught exception from infinisdk: %(exception)s\u0027) % {"},{"line_number":67,"context_line":"                \u0027exception\u0027: six.text_type(ex)}"},{"line_number":68,"context_line":"            LOG.exception(msg)"},{"line_number":69,"context_line":"            raise exception.VolumeBackendAPIException(data\u003dmsg)"},{"line_number":70,"context_line":"    return wrapper"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f013ff3_670c423b","line":67,"range":{"start_line":67,"start_character":29,"end_line":67,"end_character":42},"in_reply_to":"1f013ff3_89b88a2a","updated":"2017-05-17 14:00:22.000000000","message":"Done","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0d5c872fca638c79f7b717a9e714ec2d49835c19","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"@interface.volumedriver"},{"line_number":74,"context_line":"class InfiniboxVolumeDriver(san.SanDriver):"},{"line_number":75,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    # ThirdPartySystems wiki page"},{"line_number":78,"context_line":"    CI_WIKI_NAME \u003d \"INFINIDAT_Cinder_CI\""}],"source_content_type":"text/x-python","patch_set":12,"id":"1f013ff3_69477e4d","line":75,"updated":"2017-05-16 11:17:15.000000000","message":"? No version bump?  I would assume changing the driver to use the library would have a version bump.","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"},{"author":{"_account_id":22683,"name":"Arnon Yaari","email":"arnony@infinidat.com","username":"arnony"},"change_message_id":"fb1cb3fe25e41a4b97962a8f9ea97ade58546f57","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"@interface.volumedriver"},{"line_number":74,"context_line":"class InfiniboxVolumeDriver(san.SanDriver):"},{"line_number":75,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":76,"context_line":""},{"line_number":77,"context_line":"    # ThirdPartySystems wiki page"},{"line_number":78,"context_line":"    CI_WIKI_NAME \u003d \"INFINIDAT_Cinder_CI\""}],"source_content_type":"text/x-python","patch_set":12,"id":"1f013ff3_a7636ab1","line":75,"in_reply_to":"1f013ff3_69477e4d","updated":"2017-05-17 14:00:22.000000000","message":"Done","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"5c5f7868fa20ed14a26cc7b4da7365b2828785d1","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        if infinisdk is None:"},{"line_number":88,"context_line":"            msg \u003d _(\"Missing \u0027infinisdk\u0027 python module, ensure the library\""},{"line_number":89,"context_line":"                    \" is installed and available.\")"},{"line_number":90,"context_line":"            raise exception.VolumeDriverException(msg)"},{"line_number":91,"context_line":"        auth \u003d (self.configuration.san_login,"},{"line_number":92,"context_line":"                self.configuration.san_password)"},{"line_number":93,"context_line":"        management_address \u003d self.configuration.san_ip"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f013ff3_d38cfc80","line":90,"range":{"start_line":90,"start_character":18,"end_line":90,"end_character":54},"updated":"2017-05-16 12:49:07.000000000","message":"exception.VolumeDriverException(message\u003dmsg)","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"},{"author":{"_account_id":22683,"name":"Arnon Yaari","email":"arnony@infinidat.com","username":"arnony"},"change_message_id":"fb1cb3fe25e41a4b97962a8f9ea97ade58546f57","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        if infinisdk is None:"},{"line_number":88,"context_line":"            msg \u003d _(\"Missing \u0027infinisdk\u0027 python module, ensure the library\""},{"line_number":89,"context_line":"                    \" is installed and available.\")"},{"line_number":90,"context_line":"            raise exception.VolumeDriverException(msg)"},{"line_number":91,"context_line":"        auth \u003d (self.configuration.san_login,"},{"line_number":92,"context_line":"                self.configuration.san_password)"},{"line_number":93,"context_line":"        management_address \u003d self.configuration.san_ip"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f013ff3_87098e2d","line":90,"range":{"start_line":90,"start_character":18,"end_line":90,"end_character":54},"in_reply_to":"1f013ff3_d38cfc80","updated":"2017-05-17 14:00:22.000000000","message":"Done","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0d5c872fca638c79f7b717a9e714ec2d49835c19","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        auth \u003d (self.configuration.san_login,"},{"line_number":92,"context_line":"                self.configuration.san_password)"},{"line_number":93,"context_line":"        management_address \u003d self.configuration.san_ip"},{"line_number":94,"context_line":"        self._system \u003d infinisdk.InfiniBox(management_address, auth\u003dauth)"},{"line_number":95,"context_line":"        self._system.login()"},{"line_number":96,"context_line":"        backend_name \u003d self.configuration.safe_get(\u0027volume_backend_name\u0027)"},{"line_number":97,"context_line":"        self._backend_name \u003d backend_name or self.__class__.__name__"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f013ff3_6eed44ee","line":94,"range":{"start_line":94,"start_character":13,"end_line":94,"end_character":20},"updated":"2017-05-16 11:17:15.000000000","message":"nit: I\u0027m not sure this is the best name...","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0d5c872fca638c79f7b717a9e714ec2d49835c19","unresolved":false,"context_lines":[{"line_number":155,"context_line":"    def _get_mapping(self, host, volume):"},{"line_number":156,"context_line":"        existing_mapping \u003d host.get_luns()"},{"line_number":157,"context_line":"        for mapping in existing_mapping:"},{"line_number":158,"context_line":"            if mapping.get_volume() \u003d\u003d volume:"},{"line_number":159,"context_line":"                return mapping"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def _get_or_create_mapping(self, host, volume):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f013ff3_4ec72814","line":158,"updated":"2017-05-16 11:17:15.000000000","message":"We are adding more checks here since we\u0027ll also be checking the size, serial, name, etc.  But I guess it should be fine.","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0d5c872fca638c79f7b717a9e714ec2d49835c19","unresolved":false,"context_lines":[{"line_number":214,"context_line":"                continue      # volume mapping not found"},{"line_number":215,"context_line":"        # check if the host now doesn\u0027t have mappings, to delete host_entry"},{"line_number":216,"context_line":"        # if needed"},{"line_number":217,"context_line":"        if len(host.get_luns()) \u003d\u003d 0:"},{"line_number":218,"context_line":"            host.safe_delete()"},{"line_number":219,"context_line":"            # Create initiator-target mapping."},{"line_number":220,"context_line":"            target_wwpns \u003d list(self._get_online_fc_ports())"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f013ff3_0eb80074","line":217,"updated":"2017-05-16 11:17:15.000000000","message":"nit: if get_luns return a normal iterable (list, tuple) it would be more pythonic doing `if not host.get_luns():","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0d5c872fca638c79f7b717a9e714ec2d49835c19","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        # check if the host now doesn\u0027t have mappings, to delete host_entry"},{"line_number":216,"context_line":"        # if needed"},{"line_number":217,"context_line":"        if len(host.get_luns()) \u003d\u003d 0:"},{"line_number":218,"context_line":"            host.safe_delete()"},{"line_number":219,"context_line":"            # Create initiator-target mapping."},{"line_number":220,"context_line":"            target_wwpns \u003d list(self._get_online_fc_ports())"},{"line_number":221,"context_line":"            target_wwpns, init_target_map \u003d self._build_initiator_target_map("}],"source_content_type":"text/x-python","patch_set":12,"id":"1f013ff3_ee4a747e","line":218,"updated":"2017-05-16 11:17:15.000000000","message":"-1: If I\u0027m not mistaken this is a behavioral change that should not be included in this patch that should only focus on changing the code to use the library.","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"},{"author":{"_account_id":22683,"name":"Arnon Yaari","email":"arnony@infinidat.com","username":"arnony"},"change_message_id":"fb1cb3fe25e41a4b97962a8f9ea97ade58546f57","unresolved":false,"context_lines":[{"line_number":215,"context_line":"        # check if the host now doesn\u0027t have mappings, to delete host_entry"},{"line_number":216,"context_line":"        # if needed"},{"line_number":217,"context_line":"        if len(host.get_luns()) \u003d\u003d 0:"},{"line_number":218,"context_line":"            host.safe_delete()"},{"line_number":219,"context_line":"            # Create initiator-target mapping."},{"line_number":220,"context_line":"            target_wwpns \u003d list(self._get_online_fc_ports())"},{"line_number":221,"context_line":"            target_wwpns, init_target_map \u003d self._build_initiator_target_map("}],"source_content_type":"text/x-python","patch_set":12,"id":"1f013ff3_276f5a93","line":218,"in_reply_to":"1f013ff3_ee4a747e","updated":"2017-05-17 14:00:22.000000000","message":"Done","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"},{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0d5c872fca638c79f7b717a9e714ec2d49835c19","unresolved":false,"context_lines":[{"line_number":344,"context_line":"    def _asssert_volume_not_mapped(self, volume):"},{"line_number":345,"context_line":"        # copy is not atomic so we can\u0027t clone while the volume is mapped"},{"line_number":346,"context_line":"        infinidat_volume \u003d self._get_infinidat_volume(volume)"},{"line_number":347,"context_line":"        if len(infinidat_volume.get_logical_units()) \u003d\u003d 0:"},{"line_number":348,"context_line":"            return"},{"line_number":349,"context_line":""},{"line_number":350,"context_line":"        # volume has mappings"}],"source_content_type":"text/x-python","patch_set":12,"id":"1f013ff3_494de270","line":347,"updated":"2017-05-16 11:17:15.000000000","message":"nit: more pythonic: `if not infinidat_volume.get_logical_units()):`","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"}],"driver-requirements.txt":[{"author":{"_account_id":9535,"name":"Gorka Eguileor","email":"geguileo@redhat.com","username":"Gorka"},"change_message_id":"0d5c872fca638c79f7b717a9e714ec2d49835c19","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"# INFINIDAT"},{"line_number":41,"context_line":"infinisdk # BSD-3"},{"line_number":42,"context_line":"capacity # BSD"}],"source_content_type":"text/plain","patch_set":12,"id":"1f013ff3_4e2e0844","line":42,"updated":"2017-05-16 11:17:15.000000000","message":"?: Are we sure we don\u0027t want to set a min/max version?","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"},{"author":{"_account_id":22683,"name":"Arnon Yaari","email":"arnony@infinidat.com","username":"arnony"},"change_message_id":"fb1cb3fe25e41a4b97962a8f9ea97ade58546f57","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"# INFINIDAT"},{"line_number":41,"context_line":"infinisdk # BSD-3"},{"line_number":42,"context_line":"capacity # BSD"}],"source_content_type":"text/plain","patch_set":12,"id":"1f013ff3_273cfabd","line":42,"in_reply_to":"1f013ff3_4e2e0844","updated":"2017-05-17 14:00:22.000000000","message":"It\u0027s not necessary","commit_id":"8815d14add5f0223958499173e02ecd59ca9f8e7"}]}
