)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5997,"name":"Walt","display_name":"Hemna","email":"waboring@hemna.com","username":"walter-boring","status":"SAP"},"change_message_id":"a8ad32c14c26a4a564bfd1921e40ba6f25b86dc2","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change introduces the iscsi"},{"line_number":10,"context_line":"driver for NetApp eseries family of storage"},{"line_number":11,"context_line":"systems."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Related-Bug: 1278567"},{"line_number":14,"context_line":"Implements: blueprint netapp-eseries--cinder-driver"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"AAAAVX%2F%2F1KU%3D","line":11,"updated":"2014-02-28 00:40:36.000000000","message":"Need to provide the link to the passing certification results here please.","commit_id":"7d2bc63c2bb74e2d03bfbffcda156f87a3538400"}],"cinder/tests/test_netapp_eseries_iscsi.py":[{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"d8ca224343debe7cc7eac4856f11dc8d31b3a1e3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright (c) 2012 NetApp, Inc."},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUX%2F%2FEEk%3D","line":1,"updated":"2014-02-17 12:38:09.000000000","message":"Please remove vim lines","commit_id":"dc44c293605930f5c76a72e7401861392bf8f31f"},{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"d8ca224343debe7cc7eac4856f11dc8d31b3a1e3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright (c) 2012 NetApp, Inc."},{"line_number":4,"context_line":"# All Rights Reserved."},{"line_number":5,"context_line":"#"},{"line_number":6,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUX%2F%2FECs%3D","line":3,"updated":"2014-02-17 12:38:09.000000000","message":"Copyright year","commit_id":"dc44c293605930f5c76a72e7401861392bf8f31f"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"f69da0578df5e2c818ec65d41f75313f46c280e3","unresolved":false,"context_lines":[{"line_number":663,"context_line":"        self.assertEqual(connection_info[\u0027driver_volume_type\u0027], \u0027iscsi\u0027)"},{"line_number":664,"context_line":"        properties \u003d connection_info[\u0027data\u0027]"},{"line_number":665,"context_line":"        if not properties:"},{"line_number":666,"context_line":"            raise AssertionError(\u0027Target portal is none\u0027)"},{"line_number":667,"context_line":"        self.driver.terminate_connection(self.volume, self.connector)"},{"line_number":668,"context_line":"        self.driver.delete_volume(self.volume)"},{"line_number":669,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUX%2F%2B1IM%3D","line":666,"updated":"2014-02-18 18:51:58.000000000","message":"Why is your test raising like this?  If you have to do this (and I\u0027m not sure why your test would be indeterminent to need it) you should be doing an asserEqual or something along those lines using the testing framework.","commit_id":"ec6cf035d3a242c9ab5e8e68e7f811722effdf70"},{"author":{"_account_id":2243,"name":"John Griffith","email":"john.griffith8@gmail.com","username":"john-griffith"},"change_message_id":"f69da0578df5e2c818ec65d41f75313f46c280e3","unresolved":false,"context_lines":[{"line_number":681,"context_line":"        self.assertEqual(connection_info[\u0027driver_volume_type\u0027], \u0027iscsi\u0027)"},{"line_number":682,"context_line":"        properties \u003d connection_info[\u0027data\u0027]"},{"line_number":683,"context_line":"        if not properties:"},{"line_number":684,"context_line":"            raise AssertionError(\u0027Target portal is none\u0027)"},{"line_number":685,"context_line":""},{"line_number":686,"context_line":"    def test_vol_stats(self):"},{"line_number":687,"context_line":"        self.driver.get_volume_stats(refresh\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAAUX%2F%2B1H4%3D","line":684,"updated":"2014-02-18 18:51:58.000000000","message":"Same as above","commit_id":"ec6cf035d3a242c9ab5e8e68e7f811722effdf70"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6f4c60eea2721c3e15b9225f6c0b5eebecf1278b","unresolved":false,"context_lines":[{"line_number":669,"context_line":"    def test_cloned_volume_destroy(self):"},{"line_number":670,"context_line":"        self.driver.create_volume(self.volume)"},{"line_number":671,"context_line":"        self.driver.create_cloned_volume(self.snapshot, self.volume)"},{"line_number":672,"context_line":"        self.driver.delete_volume(self.snapshot)"},{"line_number":673,"context_line":"        self.driver.delete_volume(self.volume)"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"    def test_map_by_creating_host(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fnq0%3D","line":672,"updated":"2014-02-25 16:38:41.000000000","message":"Is there some mix up here between delete_volume() and self.snapshot?  Doesn\u0027t seem to read right.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"a4805d38e1034b22c515302b6cff82c6ba57f94d","unresolved":false,"context_lines":[{"line_number":669,"context_line":"    def test_cloned_volume_destroy(self):"},{"line_number":670,"context_line":"        self.driver.create_volume(self.volume)"},{"line_number":671,"context_line":"        self.driver.create_cloned_volume(self.snapshot, self.volume)"},{"line_number":672,"context_line":"        self.driver.delete_volume(self.snapshot)"},{"line_number":673,"context_line":"        self.driver.delete_volume(self.volume)"},{"line_number":674,"context_line":""},{"line_number":675,"context_line":"    def test_map_by_creating_host(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fm0s%3D","line":672,"in_reply_to":"AAAAU3%2F%2Fnq0%3D","updated":"2014-02-25 17:46:13.000000000","message":"yeah doesnt seem ok. ll verify it.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"}],"cinder/volume/drivers/netapp/common.py":[{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"27071ade079e145d175acf40ff0e02dc82bb616c","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            \u0027nfs\u0027:"},{"line_number":46,"context_line":"            \u0027cinder.volume.drivers.netapp.nfs.NetAppDirect7modeNfsDriver\u0027"},{"line_number":47,"context_line":"        }, \u0027eseries\u0027:"},{"line_number":48,"context_line":"        {"},{"line_number":49,"context_line":"            \u0027iscsi\u0027: \u0027cinder.volume.drivers.netapp.eseries.iscsi.Driver\u0027"},{"line_number":50,"context_line":"        },"},{"line_number":51,"context_line":"     }"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2F%2Bfo%3D","line":48,"updated":"2014-03-03 02:19:47.000000000","message":"nit, you want this formatted over like the others?","commit_id":"947ef79a415b94ebf93c40fccd8c5024fbc47a8d"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"832b71bc689446c4d323aef0bfe1a5b91d6a89ac","unresolved":false,"context_lines":[{"line_number":45,"context_line":"            \u0027nfs\u0027:"},{"line_number":46,"context_line":"            \u0027cinder.volume.drivers.netapp.nfs.NetAppDirect7modeNfsDriver\u0027"},{"line_number":47,"context_line":"        }, \u0027eseries\u0027:"},{"line_number":48,"context_line":"        {"},{"line_number":49,"context_line":"            \u0027iscsi\u0027: \u0027cinder.volume.drivers.netapp.eseries.iscsi.Driver\u0027"},{"line_number":50,"context_line":"        },"},{"line_number":51,"context_line":"     }"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2F9vM%3D","line":48,"in_reply_to":"AAAAVn%2F%2F%2Bfo%3D","updated":"2014-03-03 05:43:57.000000000","message":"Not sure if I understand it. You mean it does not appear to be formatted?","commit_id":"947ef79a415b94ebf93c40fccd8c5024fbc47a8d"}],"cinder/volume/drivers/netapp/eseries/client.py":[{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"d8ca224343debe7cc7eac4856f11dc8d31b3a1e3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright (c) 2012 NetApp, Inc."},{"line_number":4,"context_line":"# Copyright (c) 2012 OpenStack Foundation"},{"line_number":5,"context_line":"# All Rights Reserved."},{"line_number":6,"context_line":"#"},{"line_number":7,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUX%2F%2FECE%3D","line":4,"updated":"2014-02-17 12:38:09.000000000","message":"No vim line + copyright year + not sure if you want to include openstack foundation - test file did not include it","commit_id":"dc44c293605930f5c76a72e7401861392bf8f31f"},{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"3a18994672fc6dc245a7e3cfe9e57a23809d9512","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014 NetApp, Inc."},{"line_number":2,"context_line":"# Copyright (c) 2014 OpenStack Foundation"},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2BkQY%3D","line":2,"updated":"2014-02-20 13:44:46.000000000","message":"Are you sure you want this copyright line here?  Your unit test file doesn\u0027t include it - please make consistent so your lawyers don\u0027t yell at you :)","commit_id":"c9378984a94c3b4f891f32bb3ae17bd3647aa3f2"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"3df62a5321be96ad474e2b0d45b5d283d965d962","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014 NetApp, Inc."},{"line_number":2,"context_line":"# Copyright (c) 2014 OpenStack Foundation"},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2BjiI%3D","line":2,"in_reply_to":"AAAAUX%2F%2BkQY%3D","updated":"2014-02-20 14:58:37.000000000","message":"Oh...I want to be legally correct...will fix it.","commit_id":"c9378984a94c3b4f891f32bb3ae17bd3647aa3f2"},{"author":{"_account_id":9190,"name":"Glenn M. Gobeli","email":"glenn.gobeli@gmail.com","username":"ggobeli"},"change_message_id":"1cb1f4b03aeb21d35f86e891749ea56cec7b93f9","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                raise exception.NotFound(_(\u0027Storage system id not set.\u0027))"},{"line_number":101,"context_line":"            kwargs[\u0027system-id\u0027] \u003d self._system_id"},{"line_number":102,"context_line":"        path \u003d path.format(**kwargs)"},{"line_number":103,"context_line":"        self._endpoint \u003d \u0027%s/\u0027 % self._endpoint if\\"},{"line_number":104,"context_line":"            not self._endpoint.endswith(\u0027/\u0027) else self._endpoint"},{"line_number":105,"context_line":"        return urlparse.urljoin(self._endpoint, path.lstrip(\u0027/\u0027))"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fx4U%3D","line":103,"updated":"2014-02-24 21:03:46.000000000","message":"Wouldn\u0027t this be more readable if it were stated as:\n  if not self._endpoint.endswith(\u0027/\u0027)\n      self._endpoint \u003d \"%s/\" % self._endpoint","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"751751538d0c8bb2756f30e3f259ecf9f8dd4261","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                raise exception.NotFound(_(\u0027Storage system id not set.\u0027))"},{"line_number":101,"context_line":"            kwargs[\u0027system-id\u0027] \u003d self._system_id"},{"line_number":102,"context_line":"        path \u003d path.format(**kwargs)"},{"line_number":103,"context_line":"        self._endpoint \u003d \u0027%s/\u0027 % self._endpoint if\\"},{"line_number":104,"context_line":"            not self._endpoint.endswith(\u0027/\u0027) else self._endpoint"},{"line_number":105,"context_line":"        return urlparse.urljoin(self._endpoint, path.lstrip(\u0027/\u0027))"},{"line_number":106,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fqlc%3D","line":103,"in_reply_to":"AAAAU3%2F%2Fx4U%3D","updated":"2014-02-25 11:30:28.000000000","message":"It depends on how one finds things readable. For me one statement is more readable. ll change it once the other change on which this depends gets accepted.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6f4c60eea2721c3e15b9225f6c0b5eebecf1278b","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        \"\"\"Creates host on array.\"\"\""},{"line_number":197,"context_line":"        path \u003d \"/storage-systems/{system-id}/hosts\""},{"line_number":198,"context_line":"        data \u003d {\u0027name\u0027: label, \u0027hostType\u0027: host_type}"},{"line_number":199,"context_line":"        data.setdefault(\u0027groupId\u0027, group_id) if group_id else None"},{"line_number":200,"context_line":"        data.setdefault(\u0027ports\u0027, ports) if ports else None"},{"line_number":201,"context_line":"        return self._invoke(\u0027POST\u0027, path, data)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fnhs%3D","line":199,"updated":"2014-02-25 16:38:41.000000000","message":"Why \"else None\"?\n\nIs this really intended to be setdefault() or just update()?  Seems odd.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"012d09f80d3f4f24b5490f6201266920cb679283","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        \"\"\"Creates host on array.\"\"\""},{"line_number":197,"context_line":"        path \u003d \"/storage-systems/{system-id}/hosts\""},{"line_number":198,"context_line":"        data \u003d {\u0027name\u0027: label, \u0027hostType\u0027: host_type}"},{"line_number":199,"context_line":"        data.setdefault(\u0027groupId\u0027, group_id) if group_id else None"},{"line_number":200,"context_line":"        data.setdefault(\u0027ports\u0027, ports) if ports else None"},{"line_number":201,"context_line":"        return self._invoke(\u0027POST\u0027, path, data)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAVX%2F%2F8Ug%3D","line":199,"in_reply_to":"AAAAU3%2F%2Fnhs%3D","updated":"2014-02-27 08:16:32.000000000","message":"eric group_id is optional. Dont want to pas it in the dict if comes as none, so using setdefault.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"a4805d38e1034b22c515302b6cff82c6ba57f94d","unresolved":false,"context_lines":[{"line_number":196,"context_line":"        \"\"\"Creates host on array.\"\"\""},{"line_number":197,"context_line":"        path \u003d \"/storage-systems/{system-id}/hosts\""},{"line_number":198,"context_line":"        data \u003d {\u0027name\u0027: label, \u0027hostType\u0027: host_type}"},{"line_number":199,"context_line":"        data.setdefault(\u0027groupId\u0027, group_id) if group_id else None"},{"line_number":200,"context_line":"        data.setdefault(\u0027ports\u0027, ports) if ports else None"},{"line_number":201,"context_line":"        return self._invoke(\u0027POST\u0027, path, data)"},{"line_number":202,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fm2E%3D","line":199,"in_reply_to":"AAAAU3%2F%2Fnhs%3D","updated":"2014-02-25 17:46:13.000000000","message":"will look into it.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6f4c60eea2721c3e15b9225f6c0b5eebecf1278b","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        \"\"\"Registers storage system with web service.\"\"\""},{"line_number":289,"context_line":"        path \u003d \"/storage-systems\""},{"line_number":290,"context_line":"        data \u003d {\u0027controllerAddresses\u0027: controller_addresses}"},{"line_number":291,"context_line":"        data.setdefault(\u0027wwn\u0027, wwn) if wwn else None"},{"line_number":292,"context_line":"        data.setdefault(\u0027password\u0027, password) if password else None"},{"line_number":293,"context_line":"        return self._invoke(\u0027POST\u0027, path, data, use_system\u003dFalse)"},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fnik%3D","line":291,"updated":"2014-02-25 16:38:41.000000000","message":"Why \"else None\"?\n\nIs this really intended to be setdefault() or just update()?  Seems odd.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"012d09f80d3f4f24b5490f6201266920cb679283","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        \"\"\"Registers storage system with web service.\"\"\""},{"line_number":289,"context_line":"        path \u003d \"/storage-systems\""},{"line_number":290,"context_line":"        data \u003d {\u0027controllerAddresses\u0027: controller_addresses}"},{"line_number":291,"context_line":"        data.setdefault(\u0027wwn\u0027, wwn) if wwn else None"},{"line_number":292,"context_line":"        data.setdefault(\u0027password\u0027, password) if password else None"},{"line_number":293,"context_line":"        return self._invoke(\u0027POST\u0027, path, data, use_system\u003dFalse)"},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAVX%2F%2F8T8%3D","line":291,"in_reply_to":"AAAAU3%2F%2Fnik%3D","updated":"2014-02-27 08:16:32.000000000","message":"Same as above.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"a4805d38e1034b22c515302b6cff82c6ba57f94d","unresolved":false,"context_lines":[{"line_number":288,"context_line":"        \"\"\"Registers storage system with web service.\"\"\""},{"line_number":289,"context_line":"        path \u003d \"/storage-systems\""},{"line_number":290,"context_line":"        data \u003d {\u0027controllerAddresses\u0027: controller_addresses}"},{"line_number":291,"context_line":"        data.setdefault(\u0027wwn\u0027, wwn) if wwn else None"},{"line_number":292,"context_line":"        data.setdefault(\u0027password\u0027, password) if password else None"},{"line_number":293,"context_line":"        return self._invoke(\u0027POST\u0027, path, data, use_system\u003dFalse)"},{"line_number":294,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fm1U%3D","line":291,"in_reply_to":"AAAAU3%2F%2Fnik%3D","updated":"2014-02-25 17:46:13.000000000","message":"done.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"27071ade079e145d175acf40ff0e02dc82bb616c","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def invoke_service(self, method\u003d\u0027GET\u0027, url\u003dNone, params\u003dNone, data\u003dNone,"},{"line_number":63,"context_line":"                       headers\u003dNone, timeout\u003dNone, verify\u003dFalse):"},{"line_number":64,"context_line":"        url \u003d url or self._endpoint"},{"line_number":65,"context_line":"        response \u003d self.conn.request(method, url, params, data,"},{"line_number":66,"context_line":"                                     headers\u003dheaders, timeout\u003dtimeout,"},{"line_number":67,"context_line":"                                     verify\u003dverify)"},{"line_number":68,"context_line":"        self._eval_response(response)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2F%2BtM%3D","line":65,"updated":"2014-03-03 02:19:47.000000000","message":"What if the endpoint is not available or the request timed out? It looks like up the stack it catches just VolumeDriverException and _eval_response just checks response codes if we even manage to get a response back. I mention this because not everything in the manager does a broad catch all exception like create volume, so this could crash the manager process.","commit_id":"947ef79a415b94ebf93c40fccd8c5024fbc47a8d"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"832b71bc689446c4d323aef0bfe1a5b91d6a89ac","unresolved":false,"context_lines":[{"line_number":62,"context_line":"    def invoke_service(self, method\u003d\u0027GET\u0027, url\u003dNone, params\u003dNone, data\u003dNone,"},{"line_number":63,"context_line":"                       headers\u003dNone, timeout\u003dNone, verify\u003dFalse):"},{"line_number":64,"context_line":"        url \u003d url or self._endpoint"},{"line_number":65,"context_line":"        response \u003d self.conn.request(method, url, params, data,"},{"line_number":66,"context_line":"                                     headers\u003dheaders, timeout\u003dtimeout,"},{"line_number":67,"context_line":"                                     verify\u003dverify)"},{"line_number":68,"context_line":"        self._eval_response(response)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2F9xk%3D","line":65,"in_reply_to":"AAAAVn%2F%2F%2BtM%3D","updated":"2014-03-03 05:43:57.000000000","message":"Agree. For this same reason we used to catch Exception but we were asked to change it in one of the reviews. Probably I can shift invoke logic in a try catch and catch all exceptions and only throw back known exception","commit_id":"947ef79a415b94ebf93c40fccd8c5024fbc47a8d"},{"author":{"_account_id":7236,"name":"Kiyohiro Adachi","email":"kiy-adachi@vx.jp.nec.com","username":"kadachi"},"change_message_id":"012c1c00ebbe66d9f8e3beeb621ade7dd5147c26","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        except Exception as e:"},{"line_number":72,"context_line":"            LOG.exception(_(\"Unexpected error while invoking web service.\""},{"line_number":73,"context_line":"                            \" Error - %s.\"), e)"},{"line_number":74,"context_line":"            raise exception.VolumeDriverException("},{"line_number":75,"context_line":"                _(\"Invoking web service failed.\"))"},{"line_number":76,"context_line":"        self._eval_response(response)"},{"line_number":77,"context_line":"        return response"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAVn%2F%2F8ds%3D","line":74,"updated":"2014-03-03 09:22:08.000000000","message":"It is recommended that as a subclass of VolumeDriverException, to define the exception of driver-specific. I think.","commit_id":"78077334fe0535fd90170675daffd5c03278ce41"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"4859eeb998ca1b8089632a2d8a0089d9ca50e563","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        except Exception as e:"},{"line_number":72,"context_line":"            LOG.exception(_(\"Unexpected error while invoking web service.\""},{"line_number":73,"context_line":"                            \" Error - %s.\"), e)"},{"line_number":74,"context_line":"            raise exception.VolumeDriverException("},{"line_number":75,"context_line":"                _(\"Invoking web service failed.\"))"},{"line_number":76,"context_line":"        self._eval_response(response)"},{"line_number":77,"context_line":"        return response"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAVn%2F%2F8RE%3D","line":74,"in_reply_to":"AAAAVn%2F%2F8ds%3D","updated":"2014-03-03 09:32:58.000000000","message":"Hi Kiyohiro, Its a recommendation and is useful if we want to have separate error code/message in newly defined exception. At this point we are ok with using VolumeDriverException as its the minimum crieteria to be fulfilled for catching errors at different places in c-vol. Cinder core is ok with use using VolumeDriverException. We will consider it in coming features.","commit_id":"78077334fe0535fd90170675daffd5c03278ce41"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"98c10224a6e10467da8094197ab05f193d91b8b8","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        except Exception as e:"},{"line_number":72,"context_line":"            LOG.exception(_(\"Unexpected error while invoking web service.\""},{"line_number":73,"context_line":"                            \" Error - %s.\"), e)"},{"line_number":74,"context_line":"            raise exception.VolumeDriverException("},{"line_number":75,"context_line":"                _(\"Invoking web service failed.\"))"},{"line_number":76,"context_line":"        self._eval_response(response)"},{"line_number":77,"context_line":"        return response"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAVn%2F%2F7gU%3D","line":74,"in_reply_to":"AAAAVn%2F%2F8ds%3D","updated":"2014-03-03 10:54:48.000000000","message":"I think I can make a new exception for NetApp drivers though it does not seem essential but good to have.","commit_id":"78077334fe0535fd90170675daffd5c03278ce41"}],"cinder/volume/drivers/netapp/eseries/iscsi.py":[{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"d8ca224343debe7cc7eac4856f11dc8d31b3a1e3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Copyright (c) 2012 NetApp, Inc."},{"line_number":4,"context_line":"# Copyright (c) 2012 OpenStack Foundation"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAUX%2F%2FDYU%3D","line":1,"updated":"2014-02-17 12:38:09.000000000","message":"Same as previous","commit_id":"dc44c293605930f5c76a72e7401861392bf8f31f"},{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"3a18994672fc6dc245a7e3cfe9e57a23809d9512","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright (c) 2014 NetApp, Inc."},{"line_number":2,"context_line":"# Copyright (c) 2014 OpenStack Foundation"},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"},{"line_number":5,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2BkQI%3D","line":2,"updated":"2014-02-20 13:44:46.000000000","message":"Same comment as client.py","commit_id":"c9378984a94c3b4f891f32bb3ae17bd3647aa3f2"},{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"8119f141a7a3dacb95b5ab5aaab869f0b3f484c7","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"\"\"\""},{"line_number":16,"context_line":"ISCSI driver for NetApp E-series storage systems."},{"line_number":17,"context_line":"\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import socket"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2Bhr4%3D","line":16,"updated":"2014-02-20 17:53:35.000000000","message":"iSCSI","commit_id":"bd178ff502ced5110e194a62d0815e126590fc1a"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"05c54f446eaca1b7a362732e20add7569b01077a","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":"\"\"\""},{"line_number":16,"context_line":"ISCSI driver for NetApp E-series storage systems."},{"line_number":17,"context_line":"\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"import socket"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2BhQI%3D","line":16,"in_reply_to":"AAAAUX%2F%2Bhr4%3D","updated":"2014-02-20 18:36:46.000000000","message":"Will fix it.","commit_id":"bd178ff502ced5110e194a62d0815e126590fc1a"},{"author":{"_account_id":4355,"name":"Avishay Traeger","email":"avishay@stratoscale.com","username":"avishay-il"},"change_message_id":"8119f141a7a3dacb95b5ab5aaab869f0b3f484c7","unresolved":false,"context_lines":[{"line_number":358,"context_line":"            job \u003d None"},{"line_number":359,"context_line":"            job \u003d self._client.create_volume_copy_job(src_vol[\u0027id\u0027],"},{"line_number":360,"context_line":"                                                      dst_vol[\u0027volumeRef\u0027])"},{"line_number":361,"context_line":"            while True:"},{"line_number":362,"context_line":"                j_st \u003d self._client.list_vol_copy_job(job[\u0027volcopyRef\u0027])"},{"line_number":363,"context_line":"                if (j_st[\u0027status\u0027] \u003d\u003d \u0027inProgress\u0027 or j_st[\u0027status\u0027] \u003d\u003d"},{"line_number":364,"context_line":"                        \u0027pending\u0027 or j_st[\u0027status\u0027] \u003d\u003d \u0027unknown\u0027):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2Bhqo%3D","line":361,"updated":"2014-02-20 17:53:35.000000000","message":"I would add a timeout here.\n\nAlso note that if Cinder crashes during this long copy operation you the admin will need to manually delete dst_vol on the storage.  No need to fix this now but keep it in mind.","commit_id":"bd178ff502ced5110e194a62d0815e126590fc1a"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"05c54f446eaca1b7a362732e20add7569b01077a","unresolved":false,"context_lines":[{"line_number":358,"context_line":"            job \u003d None"},{"line_number":359,"context_line":"            job \u003d self._client.create_volume_copy_job(src_vol[\u0027id\u0027],"},{"line_number":360,"context_line":"                                                      dst_vol[\u0027volumeRef\u0027])"},{"line_number":361,"context_line":"            while True:"},{"line_number":362,"context_line":"                j_st \u003d self._client.list_vol_copy_job(job[\u0027volcopyRef\u0027])"},{"line_number":363,"context_line":"                if (j_st[\u0027status\u0027] \u003d\u003d \u0027inProgress\u0027 or j_st[\u0027status\u0027] \u003d\u003d"},{"line_number":364,"context_line":"                        \u0027pending\u0027 or j_st[\u0027status\u0027] \u003d\u003d \u0027unknown\u0027):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAUX%2F%2BhQU%3D","line":361,"in_reply_to":"AAAAUX%2F%2Bhqo%3D","updated":"2014-02-20 18:36:46.000000000","message":"If cinder crashes then it needs to be cleaned manually. This is a downside of implementing transactional logic in the caller. This is the case as of now.","commit_id":"bd178ff502ced5110e194a62d0815e126590fc1a"},{"author":{"_account_id":9366,"name":"Andrew Kerr","email":"andrew.kerr@netapp.com","username":"andrew-kerr"},"change_message_id":"cca6bea16bb02a1b3d1f08df0322a9140815a91d","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from cinder import exception"},{"line_number":24,"context_line":"from cinder.openstack.common import excutils"},{"line_number":25,"context_line":"from cinder.openstack.common import log as logging"},{"line_number":26,"context_line":"from cinder import units"},{"line_number":27,"context_line":"from cinder.volume import driver"},{"line_number":28,"context_line":"from cinder.volume.drivers.netapp.eseries import client"},{"line_number":29,"context_line":"from cinder.volume.drivers.netapp.options import netapp_basicauth_opts"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2F%2FD0%3D","line":26,"updated":"2014-02-23 02:33:25.000000000","message":"should use cinder.openstack.common for units module","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"56567bf32b049a688441409699992179bdc47cd4","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from cinder import exception"},{"line_number":24,"context_line":"from cinder.openstack.common import excutils"},{"line_number":25,"context_line":"from cinder.openstack.common import log as logging"},{"line_number":26,"context_line":"from cinder import units"},{"line_number":27,"context_line":"from cinder.volume import driver"},{"line_number":28,"context_line":"from cinder.volume.drivers.netapp.eseries import client"},{"line_number":29,"context_line":"from cinder.volume.drivers.netapp.options import netapp_basicauth_opts"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2F%2BD4%3D","line":26,"in_reply_to":"AAAAU3%2F%2F%2FD0%3D","updated":"2014-02-23 08:55:48.000000000","message":"This proposed change is still not merged. Its not possible to change driver as of now.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":9190,"name":"Glenn M. Gobeli","email":"glenn.gobeli@gmail.com","username":"ggobeli"},"change_message_id":"1cb1f4b03aeb21d35f86e891749ea56cec7b93f9","unresolved":false,"context_lines":[{"line_number":66,"context_line":"                         \u0027snapshots\u0027: {\u0027label_ref\u0027: {}, \u0027ref_snap\u0027: {}}}"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def do_setup(self, context):"},{"line_number":69,"context_line":"        \"\"\"Any initialisation the volume driver does while starting.\"\"\""},{"line_number":70,"context_line":"        self._check_flags()"},{"line_number":71,"context_line":"        self._client \u003d client.RestClient("},{"line_number":72,"context_line":"            scheme\u003dself.configuration.netapp_transport_type,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fxsg%3D","line":69,"updated":"2014-02-24 21:03:46.000000000","message":"\"initialisation\" misspelled. Should be initialization.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6f4c60eea2721c3e15b9225f6c0b5eebecf1278b","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        for flag in required_flags:"},{"line_number":84,"context_line":"            if not getattr(self.configuration, flag, None):"},{"line_number":85,"context_line":"                msg \u003d _(\u0027%s is not set.\u0027) % flag"},{"line_number":86,"context_line":"                raise exception.InvalidInput(reason\u003dmsg)"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def check_for_setup_error(self):"},{"line_number":89,"context_line":"        self._check_storage_system()"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2FnkA%3D","line":86,"updated":"2014-02-25 16:38:41.000000000","message":"May be easier to understand as exception.InvalidConfigurationValue with value\u003dNone.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6f4c60eea2721c3e15b9225f6c0b5eebecf1278b","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        ips \u003d self.configuration.netapp_controller_ips"},{"line_number":104,"context_line":"        ips \u003d [i.strip() for i in ips.split(\",\")]"},{"line_number":105,"context_line":"        ips \u003d filter(lambda x: True if _resolve_host(x) else False, ips)"},{"line_number":106,"context_line":"        host \u003d utils.resolve_hostname("},{"line_number":107,"context_line":"            self.configuration.netapp_server_hostname)"},{"line_number":108,"context_line":"        if not ips:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fnn8%3D","line":105,"updated":"2014-02-25 16:38:41.000000000","message":"Generates pylint:\n\nW:105,14: map/filter on lambda could be replaced by comprehension (deprecated-lambda)\n\nThis is optional but it makes sense to me that this would be easier done as ips \u003d [x for x in ips if _resolve_host(x)].","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":9366,"name":"Andrew Kerr","email":"andrew.kerr@netapp.com","username":"andrew-kerr"},"change_message_id":"cca6bea16bb02a1b3d1f08df0322a9140815a91d","unresolved":false,"context_lines":[{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def _get_sorted_avl_storage_pools(self, size_gb):"},{"line_number":303,"context_line":"        \"\"\"Returns storage pools sorted on available capacity.\"\"\""},{"line_number":304,"context_line":"        size \u003d size_gb * units.GiB"},{"line_number":305,"context_line":"        pools \u003d self._client.list_storage_pools()"},{"line_number":306,"context_line":"        sorted_pools \u003d sorted(pools, key\u003dlambda x:"},{"line_number":307,"context_line":"                              (int(x.get(\u0027totalRaidedSpace\u0027, 0))"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2F%2FDs%3D","line":304,"updated":"2014-02-23 02:33:25.000000000","message":"GiB should be Gi (see above)","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6f4c60eea2721c3e15b9225f6c0b5eebecf1278b","unresolved":false,"context_lines":[{"line_number":306,"context_line":"        sorted_pools \u003d sorted(pools, key\u003dlambda x:"},{"line_number":307,"context_line":"                              (int(x.get(\u0027totalRaidedSpace\u0027, 0))"},{"line_number":308,"context_line":"                               - int(x.get(\u0027usedSpace\u0027, 0))), reverse\u003dTrue)"},{"line_number":309,"context_line":"        avl_pools \u003d filter(lambda x: (x[\u0027volumeGroupRef\u0027]"},{"line_number":310,"context_line":"                                      in self._objects[\u0027disk_pool_refs\u0027]) and"},{"line_number":311,"context_line":"                           (int(x.get(\u0027totalRaidedSpace\u0027, 0)) -"},{"line_number":312,"context_line":"                            int(x.get(\u0027usedSpace\u0027, 0) \u003e\u003d size)), sorted_pools)"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fnnk%3D","line":309,"updated":"2014-02-25 16:38:41.000000000","message":"Consider same comment as above re: filter vs. list comprehension.  (Optional.)","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6f4c60eea2721c3e15b9225f6c0b5eebecf1278b","unresolved":false,"context_lines":[{"line_number":308,"context_line":"                               - int(x.get(\u0027usedSpace\u0027, 0))), reverse\u003dTrue)"},{"line_number":309,"context_line":"        avl_pools \u003d filter(lambda x: (x[\u0027volumeGroupRef\u0027]"},{"line_number":310,"context_line":"                                      in self._objects[\u0027disk_pool_refs\u0027]) and"},{"line_number":311,"context_line":"                           (int(x.get(\u0027totalRaidedSpace\u0027, 0)) -"},{"line_number":312,"context_line":"                            int(x.get(\u0027usedSpace\u0027, 0) \u003e\u003d size)), sorted_pools)"},{"line_number":313,"context_line":"        if not avl_pools:"},{"line_number":314,"context_line":"            msg \u003d _(\"No storage pool found with available capacity %s.\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fnmw%3D","line":311,"updated":"2014-02-25 16:38:41.000000000","message":"Should _client.list_storage_pools() not return something that already has these cast to int?","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"a4805d38e1034b22c515302b6cff82c6ba57f94d","unresolved":false,"context_lines":[{"line_number":308,"context_line":"                               - int(x.get(\u0027usedSpace\u0027, 0))), reverse\u003dTrue)"},{"line_number":309,"context_line":"        avl_pools \u003d filter(lambda x: (x[\u0027volumeGroupRef\u0027]"},{"line_number":310,"context_line":"                                      in self._objects[\u0027disk_pool_refs\u0027]) and"},{"line_number":311,"context_line":"                           (int(x.get(\u0027totalRaidedSpace\u0027, 0)) -"},{"line_number":312,"context_line":"                            int(x.get(\u0027usedSpace\u0027, 0) \u003e\u003d size)), sorted_pools)"},{"line_number":313,"context_line":"        if not avl_pools:"},{"line_number":314,"context_line":"            msg \u003d _(\"No storage pool found with available capacity %s.\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fm5Y%3D","line":311,"in_reply_to":"AAAAU3%2F%2Fnmw%3D","updated":"2014-02-25 17:46:13.000000000","message":"This is an issue with current middleware that we interact. Its safe to cast to int as sometimes we get string.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":9366,"name":"Andrew Kerr","email":"andrew.kerr@netapp.com","username":"andrew-kerr"},"change_message_id":"cca6bea16bb02a1b3d1f08df0322a9140815a91d","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        LOG.debug(_(\"Creating snap vol for group %s\"), group[\u0027label\u0027])"},{"line_number":345,"context_line":"        image \u003d self._get_cached_snap_grp_image(snapshot_id)"},{"line_number":346,"context_line":"        label \u003d utils.convert_uuid_to_es_fmt(uuid.uuid4())"},{"line_number":347,"context_line":"        capacity \u003d int(image[\u0027pitCapacity\u0027]) / units.GiB"},{"line_number":348,"context_line":"        storage_pools \u003d self._get_sorted_avl_storage_pools(capacity)"},{"line_number":349,"context_line":"        s_id \u003d storage_pools[0][\u0027volumeGroupRef\u0027]"},{"line_number":350,"context_line":"        return self._client.create_snapshot_volume(image[\u0027pitRef\u0027], label,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2F%2FDk%3D","line":347,"updated":"2014-02-23 02:33:25.000000000","message":"same as above: GiB -\u003e Gi","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6f4c60eea2721c3e15b9225f6c0b5eebecf1278b","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        LOG.debug(_(\"Creating snap vol for group %s\"), group[\u0027label\u0027])"},{"line_number":345,"context_line":"        image \u003d self._get_cached_snap_grp_image(snapshot_id)"},{"line_number":346,"context_line":"        label \u003d utils.convert_uuid_to_es_fmt(uuid.uuid4())"},{"line_number":347,"context_line":"        capacity \u003d int(image[\u0027pitCapacity\u0027]) / units.GiB"},{"line_number":348,"context_line":"        storage_pools \u003d self._get_sorted_avl_storage_pools(capacity)"},{"line_number":349,"context_line":"        s_id \u003d storage_pools[0][\u0027volumeGroupRef\u0027]"},{"line_number":350,"context_line":"        return self._client.create_snapshot_volume(image[\u0027pitRef\u0027], label,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fnls%3D","line":347,"updated":"2014-02-25 16:38:41.000000000","message":"self._get_cached_snap_grp_image() should probably return an object with this already cast to int() so you don\u0027t have to here?","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"a4805d38e1034b22c515302b6cff82c6ba57f94d","unresolved":false,"context_lines":[{"line_number":344,"context_line":"        LOG.debug(_(\"Creating snap vol for group %s\"), group[\u0027label\u0027])"},{"line_number":345,"context_line":"        image \u003d self._get_cached_snap_grp_image(snapshot_id)"},{"line_number":346,"context_line":"        label \u003d utils.convert_uuid_to_es_fmt(uuid.uuid4())"},{"line_number":347,"context_line":"        capacity \u003d int(image[\u0027pitCapacity\u0027]) / units.GiB"},{"line_number":348,"context_line":"        storage_pools \u003d self._get_sorted_avl_storage_pools(capacity)"},{"line_number":349,"context_line":"        s_id \u003d storage_pools[0][\u0027volumeGroupRef\u0027]"},{"line_number":350,"context_line":"        return self._client.create_snapshot_volume(image[\u0027pitRef\u0027], label,"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fm4o%3D","line":347,"in_reply_to":"AAAAU3%2F%2Fnls%3D","updated":"2014-02-25 17:46:13.000000000","message":"This is again the middleware thing. We cache the exact json structure and it comes as string as well. Its better to cast it.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":9366,"name":"Andrew Kerr","email":"andrew.kerr@netapp.com","username":"andrew-kerr"},"change_message_id":"cca6bea16bb02a1b3d1f08df0322a9140815a91d","unresolved":false,"context_lines":[{"line_number":417,"context_line":"        snap_grp, snap_image \u003d None, None"},{"line_number":418,"context_line":"        snapshot_name \u003d utils.convert_uuid_to_es_fmt(snapshot[\u0027id\u0027])"},{"line_number":419,"context_line":"        vol \u003d self._get_volume(snapshot[\u0027volume_id\u0027])"},{"line_number":420,"context_line":"        vol_size_gb \u003d int(vol[\u0027totalSizeInBytes\u0027]) / units.GiB"},{"line_number":421,"context_line":"        pools \u003d self._get_sorted_avl_storage_pools(vol_size_gb)"},{"line_number":422,"context_line":"        try:"},{"line_number":423,"context_line":"            snap_grp \u003d self._client.create_snapshot_group("}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2F%2FDg%3D","line":420,"updated":"2014-02-23 02:33:25.000000000","message":"Same as above","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":9366,"name":"Andrew Kerr","email":"andrew.kerr@netapp.com","username":"andrew-kerr"},"change_message_id":"cca6bea16bb02a1b3d1f08df0322a9140815a91d","unresolved":false,"context_lines":[{"line_number":623,"context_line":"            if pool[\u0027volumeGroupRef\u0027] in self._objects[\u0027disk_pool_refs\u0027]:"},{"line_number":624,"context_line":"                tot_bytes \u003d tot_bytes + int(pool.get(\u0027totalRaidedSpace\u0027, 0))"},{"line_number":625,"context_line":"                used_bytes \u003d used_bytes + int(pool.get(\u0027usedSpace\u0027, 0))"},{"line_number":626,"context_line":"        self._stats[\u0027free_capacity_gb\u0027] \u003d (tot_bytes - used_bytes) / units.GiB"},{"line_number":627,"context_line":"        self._stats[\u0027total_capacity_gb\u0027] \u003d tot_bytes / units.GiB"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"    def extend_volume(self, volume, new_size):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2F%2FDc%3D","line":626,"updated":"2014-02-23 02:33:25.000000000","message":"Same as above","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":9366,"name":"Andrew Kerr","email":"andrew.kerr@netapp.com","username":"andrew-kerr"},"change_message_id":"cca6bea16bb02a1b3d1f08df0322a9140815a91d","unresolved":false,"context_lines":[{"line_number":624,"context_line":"                tot_bytes \u003d tot_bytes + int(pool.get(\u0027totalRaidedSpace\u0027, 0))"},{"line_number":625,"context_line":"                used_bytes \u003d used_bytes + int(pool.get(\u0027usedSpace\u0027, 0))"},{"line_number":626,"context_line":"        self._stats[\u0027free_capacity_gb\u0027] \u003d (tot_bytes - used_bytes) / units.GiB"},{"line_number":627,"context_line":"        self._stats[\u0027total_capacity_gb\u0027] \u003d tot_bytes / units.GiB"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"    def extend_volume(self, volume, new_size):"},{"line_number":630,"context_line":"        \"\"\"Extend an existing volume to the new size.\"\"\""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2F%2FDY%3D","line":627,"updated":"2014-02-23 02:33:25.000000000","message":"Same as above","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"bf1a1f8297d8d8a007a3cb2a68ed152f19d75297","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from cinder.volume.drivers.netapp.options import netapp_eseries_opts"},{"line_number":32,"context_line":"from cinder.volume.drivers.netapp.options import netapp_transport_opts"},{"line_number":33,"context_line":"from cinder.volume.drivers.netapp import utils"},{"line_number":34,"context_line":"from oslo.config import cfg"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2F%2BAc%3D","line":34,"updated":"2014-03-03 04:25:06.000000000","message":"fix import order http://docs.openstack.org/developer/hacking/#imports","commit_id":"947ef79a415b94ebf93c40fccd8c5024fbc47a8d"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"832b71bc689446c4d323aef0bfe1a5b91d6a89ac","unresolved":false,"context_lines":[{"line_number":31,"context_line":"from cinder.volume.drivers.netapp.options import netapp_eseries_opts"},{"line_number":32,"context_line":"from cinder.volume.drivers.netapp.options import netapp_transport_opts"},{"line_number":33,"context_line":"from cinder.volume.drivers.netapp import utils"},{"line_number":34,"context_line":"from oslo.config import cfg"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2F9xY%3D","line":34,"in_reply_to":"AAAAVn%2F%2F%2BAc%3D","updated":"2014-03-03 05:43:57.000000000","message":"done","commit_id":"947ef79a415b94ebf93c40fccd8c5024fbc47a8d"},{"author":{"_account_id":170,"name":"Mike Perez","email":"thingee@gmail.com","username":"thingee"},"change_message_id":"bf1a1f8297d8d8a007a3cb2a68ed152f19d75297","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            if ((status \u003d\u003d \u0027nevercontacted\u0027) or"},{"line_number":143,"context_line":"                    (password_not_in_sync and status \u003d\u003d \u0027passwordoutofsync\u0027)):"},{"line_number":144,"context_line":"                LOG.info(_(\u0027Waiting for web service array communication.\u0027))"},{"line_number":145,"context_line":"                time.sleep(self.SLEEP_SECS)"},{"line_number":146,"context_line":"                comm_time \u003d comm_time + self.SLEEP_SECS"},{"line_number":147,"context_line":"                if comm_time \u003e\u003d sa_comm_timeout:"},{"line_number":148,"context_line":"                    msg \u003d _(\"Failure in communication between web service and\""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2F9%2F4%3D","line":145,"updated":"2014-03-03 04:25:06.000000000","message":"Have you considered loopingcall which uses greenthreads? https://github.com/openstack/cinder/blob/master/cinder/openstack/common/loopingcall.py\n\nEMC has a driver that\u0027s using it for example https://review.openstack.org/#/c/73672/19/cinder/volume/drivers/emc/emc_vnx_cli.py","commit_id":"947ef79a415b94ebf93c40fccd8c5024fbc47a8d"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"832b71bc689446c4d323aef0bfe1a5b91d6a89ac","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            if ((status \u003d\u003d \u0027nevercontacted\u0027) or"},{"line_number":143,"context_line":"                    (password_not_in_sync and status \u003d\u003d \u0027passwordoutofsync\u0027)):"},{"line_number":144,"context_line":"                LOG.info(_(\u0027Waiting for web service array communication.\u0027))"},{"line_number":145,"context_line":"                time.sleep(self.SLEEP_SECS)"},{"line_number":146,"context_line":"                comm_time \u003d comm_time + self.SLEEP_SECS"},{"line_number":147,"context_line":"                if comm_time \u003e\u003d sa_comm_timeout:"},{"line_number":148,"context_line":"                    msg \u003d _(\"Failure in communication between web service and\""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2F9vk%3D","line":145,"in_reply_to":"AAAAVn%2F%2F9%2F4%3D","updated":"2014-03-03 05:43:57.000000000","message":"This piece is called while checking for set up error at the start. Green threads are useful for cooperative yielding while doing long waiting jobs. We do sleep if the status is not as we expect and so allow chance for others to be scheduled and run. Also this can go upto a max of 60 secs. I think we are ok using regular thread scheduling and sleep for this part. Will definitely thin using green threads in other scenarios.","commit_id":"947ef79a415b94ebf93c40fccd8c5024fbc47a8d"},{"author":{"_account_id":7236,"name":"Kiyohiro Adachi","email":"kiy-adachi@vx.jp.nec.com","username":"kadachi"},"change_message_id":"012c1c00ebbe66d9f8e3beeb621ade7dd5147c26","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        \"\"\"Checks whether system is registered and has good status.\"\"\""},{"line_number":123,"context_line":"        try:"},{"line_number":124,"context_line":"            system \u003d self._client.list_storage_system()"},{"line_number":125,"context_line":"        except exception.VolumeDriverException:"},{"line_number":126,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":127,"context_line":"                msg \u003d _(\"System with controller addresses [%s] is not\""},{"line_number":128,"context_line":"                        \" registered with web service.\")"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAVn%2F%2F8bY%3D","line":125,"updated":"2014-03-03 09:22:08.000000000","message":"It is recommended that as a subclass of VolumeDriverException, to define the exception of driver-specific. I think.","commit_id":"78077334fe0535fd90170675daffd5c03278ce41"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"4859eeb998ca1b8089632a2d8a0089d9ca50e563","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        \"\"\"Checks whether system is registered and has good status.\"\"\""},{"line_number":123,"context_line":"        try:"},{"line_number":124,"context_line":"            system \u003d self._client.list_storage_system()"},{"line_number":125,"context_line":"        except exception.VolumeDriverException:"},{"line_number":126,"context_line":"            with excutils.save_and_reraise_exception():"},{"line_number":127,"context_line":"                msg \u003d _(\"System with controller addresses [%s] is not\""},{"line_number":128,"context_line":"                        \" registered with web service.\")"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAVn%2F%2F8QI%3D","line":125,"in_reply_to":"AAAAVn%2F%2F8bY%3D","updated":"2014-03-03 09:32:58.000000000","message":"Its a recommendation and is useful if we want to have separate error code/message in newly defined exception. At this point we are ok with using VolumeDriverException as its the minimum crieteria to be fulfilled for catching errors at different places in c-vol. Cinder core is ok with use using VolumeDriverException. We will consider it in coming features.","commit_id":"78077334fe0535fd90170675daffd5c03278ce41"}],"cinder/volume/drivers/netapp/options.py":[{"author":{"_account_id":4523,"name":"Eric Harney","email":"eharney@redhat.com","username":"eharney"},"change_message_id":"6f4c60eea2721c3e15b9225f6c0b5eebecf1278b","unresolved":false,"context_lines":[{"line_number":146,"context_line":"    cfg.StrOpt(\u0027netapp_controller_ips\u0027,"},{"line_number":147,"context_line":"               default\u003dNone,"},{"line_number":148,"context_line":"               help\u003d(\u0027This option is only utilized when the storage family \u0027"},{"line_number":149,"context_line":"                     \u0027is configured to eseries. This option is used to \u0027"},{"line_number":150,"context_line":"                     \u0027restrict provisioning to the specified controllers. \u0027"},{"line_number":151,"context_line":"                     \u0027Specify the value of this option to be a comma \u0027"},{"line_number":152,"context_line":"                     \u0027separated list of controller hostnames or IP addresses \u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fnuk%3D","line":149,"updated":"2014-02-25 16:38:41.000000000","message":"Here you have \"eseries\" but it\u0027s \"E-Series\" most other places.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"},{"author":{"_account_id":6094,"name":"Navneet Singh","email":"navsinghnitd@gmail.com","username":"singn"},"change_message_id":"a4805d38e1034b22c515302b6cff82c6ba57f94d","unresolved":false,"context_lines":[{"line_number":146,"context_line":"    cfg.StrOpt(\u0027netapp_controller_ips\u0027,"},{"line_number":147,"context_line":"               default\u003dNone,"},{"line_number":148,"context_line":"               help\u003d(\u0027This option is only utilized when the storage family \u0027"},{"line_number":149,"context_line":"                     \u0027is configured to eseries. This option is used to \u0027"},{"line_number":150,"context_line":"                     \u0027restrict provisioning to the specified controllers. \u0027"},{"line_number":151,"context_line":"                     \u0027Specify the value of this option to be a comma \u0027"},{"line_number":152,"context_line":"                     \u0027separated list of controller hostnames or IP addresses \u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fm2o%3D","line":149,"in_reply_to":"AAAAU3%2F%2Fnuk%3D","updated":"2014-02-25 17:46:13.000000000","message":"E-series is the product line name and eseries is the storage family name in common.py. We refer the family here.","commit_id":"b7d31c020949286b30a2cac0624c03590bb98092"}]}
