)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"b596687d8ba92a9ce595395ab7d5f3febbef83f0","unresolved":false,"context_lines":[{"line_number":9,"context_line":"If a non existing volume is deleted the NetApp"},{"line_number":10,"context_line":"iSCSI eseries driver throws a KeyError Exception"},{"line_number":11,"context_line":"in the delete_volume method."},{"line_number":12,"context_line":"This situation can occurr if the user manually deletes"},{"line_number":13,"context_line":"a LUN in the NetApp controller directly or if the"},{"line_number":14,"context_line":"delete operation initiated via cinder is interrupted,"},{"line_number":15,"context_line":"which leaves the system in an inconsistent state."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"3a50d1a3_b042670d","line":12,"updated":"2015-07-23 18:41:48.000000000","message":"s/ocurr/occur/\n\nMight as well fix this if you are pushing another patch.","commit_id":"3444e7c7bd1b0843624c217df8d7e2ef1abd2922"},{"author":{"_account_id":2759,"name":"Huang Zhiteng","email":"winston.d@gmail.com","username":"zhiteng-huang"},"change_message_id":"66d761f47ff95ded992a0de66bfcf3baf1e83cec","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     ubaumann \u003copenstack@m.ubaumann.ch\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-07-23 22:17:47 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fixes bug in deletion of a non existing volume"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"If a non existing volume is deleted the NetApp"},{"line_number":10,"context_line":"iSCSI eseries driver throws a KeyError Exception"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"3a50d1a3_558e5928","line":7,"updated":"2015-07-24 08:37:21.000000000","message":"Would you please add \u0027NetApp:\u0027 to the title to limit the scope?  Thanks.","commit_id":"770b910cff13100d1bfc9b80c4c7e38d11c959c3"}],"cinder/tests/unit/volume/drivers/netapp/eseries/test_library.py":[{"author":{"_account_id":9366,"name":"Andrew Kerr","email":"andrew.kerr@netapp.com","username":"andrew-kerr"},"change_message_id":"2af68bf147c6624413249e03ba786b9e13e81b5f","unresolved":false,"context_lines":[{"line_number":774,"context_line":"        self.assertEqual(0, self.library._client.delete_volume.call_count)"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":"    def test_delete_non_existing_volume(self):"},{"line_number":777,"context_line":"        # manipulate to a non existed id"},{"line_number":778,"context_line":"        volume2 \u003d get_fake_volume()"},{"line_number":779,"context_line":"        volume2[\u0027name_id\u0027] \u003d \u002788888888-4444-4444-4444-cccccccccccc\u0027"},{"line_number":780,"context_line":"        self.library.delete_volume(volume2)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a50d1a3_8bb89676","line":777,"updated":"2015-07-23 01:55:43.000000000","message":"s/non existed/nonexistent","commit_id":"4b3fdb4e90a1748650e3ee1e04fbea9d447949bb"},{"author":{"_account_id":10485,"name":"Ankit Agrawal","email":"ankitagrawal8188@gmail.com","username":"ankitagrawal"},"change_message_id":"e204b3bcfe5d62d8aeb3a1b91f95ce073fa525f8","unresolved":false,"context_lines":[{"line_number":774,"context_line":"        self.assertEqual(0, self.library._client.delete_volume.call_count)"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":"    def test_delete_non_existing_volume(self):"},{"line_number":777,"context_line":"        # manipulate to a nonexistent id"},{"line_number":778,"context_line":"        volume2 \u003d get_fake_volume()"},{"line_number":779,"context_line":"        volume2[\u0027name_id\u0027] \u003d \u002788888888-4444-4444-4444-cccccccccccc\u0027"},{"line_number":780,"context_line":"        self.library.delete_volume(volume2)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_2b3a8999","line":777,"updated":"2015-07-23 11:21:01.000000000","message":"use \"\"\" for doc strings.\n\"\"\"Manipulate to a nonexistent id.\"\"\"","commit_id":"438e1a401bcfa607206df002c0cabb8caff54592"},{"author":{"_account_id":17468,"name":"ubaumann","email":"openstack@m.ubaumann.ch","username":"ubaumann"},"change_message_id":"6665db08f3254457de419e7371594abdfab2f69f","unresolved":false,"context_lines":[{"line_number":774,"context_line":"        self.assertEqual(0, self.library._client.delete_volume.call_count)"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":"    def test_delete_non_existing_volume(self):"},{"line_number":777,"context_line":"        # manipulate to a nonexistent id"},{"line_number":778,"context_line":"        volume2 \u003d get_fake_volume()"},{"line_number":779,"context_line":"        volume2[\u0027name_id\u0027] \u003d \u002788888888-4444-4444-4444-cccccccccccc\u0027"},{"line_number":780,"context_line":"        self.library.delete_volume(volume2)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_8e7babbd","line":777,"in_reply_to":"3a50d1a3_2b3a8999","updated":"2015-07-23 11:43:09.000000000","message":"This is just a bug fix and I\u0027m not interested in refactoring the whole driver\n\nps: it\u0027s a line comment and not a doc string","commit_id":"438e1a401bcfa607206df002c0cabb8caff54592"},{"author":{"_account_id":10485,"name":"Ankit Agrawal","email":"ankitagrawal8188@gmail.com","username":"ankitagrawal"},"change_message_id":"7791a8f73d1273fbb7fbb5b4833594373e33fdb7","unresolved":false,"context_lines":[{"line_number":774,"context_line":"        self.assertEqual(0, self.library._client.delete_volume.call_count)"},{"line_number":775,"context_line":""},{"line_number":776,"context_line":"    def test_delete_non_existing_volume(self):"},{"line_number":777,"context_line":"        # manipulate to a nonexistent id"},{"line_number":778,"context_line":"        volume2 \u003d get_fake_volume()"},{"line_number":779,"context_line":"        volume2[\u0027name_id\u0027] \u003d \u002788888888-4444-4444-4444-cccccccccccc\u0027"},{"line_number":780,"context_line":"        self.library.delete_volume(volume2)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_31bd16d8","line":777,"in_reply_to":"3a50d1a3_8e7babbd","updated":"2015-07-23 12:02:14.000000000","message":"If its a line comment then I think you should capitalize it manipulate \u003d\u003e Manipulate and should also add a period at the end of the comment.\n\nps: I am not asking to refactor the whole driver, but you should follow the standards for the code you are adding.","commit_id":"438e1a401bcfa607206df002c0cabb8caff54592"},{"author":{"_account_id":10485,"name":"Ankit Agrawal","email":"ankitagrawal8188@gmail.com","username":"ankitagrawal"},"change_message_id":"e204b3bcfe5d62d8aeb3a1b91f95ce073fa525f8","unresolved":false,"context_lines":[{"line_number":776,"context_line":"    def test_delete_non_existing_volume(self):"},{"line_number":777,"context_line":"        # manipulate to a nonexistent id"},{"line_number":778,"context_line":"        volume2 \u003d get_fake_volume()"},{"line_number":779,"context_line":"        volume2[\u0027name_id\u0027] \u003d \u002788888888-4444-4444-4444-cccccccccccc\u0027"},{"line_number":780,"context_line":"        self.library.delete_volume(volume2)"},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"    def test_map_volume_to_host_volume_not_mapped(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_cb7a0524","line":779,"updated":"2015-07-23 11:21:01.000000000","message":"Can you please also add a negative test case to assert that KeyError exception is raised while deleting a non existing volume.","commit_id":"438e1a401bcfa607206df002c0cabb8caff54592"},{"author":{"_account_id":17468,"name":"ubaumann","email":"openstack@m.ubaumann.ch","username":"ubaumann"},"change_message_id":"6665db08f3254457de419e7371594abdfab2f69f","unresolved":false,"context_lines":[{"line_number":776,"context_line":"    def test_delete_non_existing_volume(self):"},{"line_number":777,"context_line":"        # manipulate to a nonexistent id"},{"line_number":778,"context_line":"        volume2 \u003d get_fake_volume()"},{"line_number":779,"context_line":"        volume2[\u0027name_id\u0027] \u003d \u002788888888-4444-4444-4444-cccccccccccc\u0027"},{"line_number":780,"context_line":"        self.library.delete_volume(volume2)"},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"    def test_map_volume_to_host_volume_not_mapped(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_ce00d336","line":779,"in_reply_to":"3a50d1a3_cb7a0524","updated":"2015-07-23 11:43:09.000000000","message":"Please read the commit msg!","commit_id":"438e1a401bcfa607206df002c0cabb8caff54592"},{"author":{"_account_id":10485,"name":"Ankit Agrawal","email":"ankitagrawal8188@gmail.com","username":"ankitagrawal"},"change_message_id":"7791a8f73d1273fbb7fbb5b4833594373e33fdb7","unresolved":false,"context_lines":[{"line_number":776,"context_line":"    def test_delete_non_existing_volume(self):"},{"line_number":777,"context_line":"        # manipulate to a nonexistent id"},{"line_number":778,"context_line":"        volume2 \u003d get_fake_volume()"},{"line_number":779,"context_line":"        volume2[\u0027name_id\u0027] \u003d \u002788888888-4444-4444-4444-cccccccccccc\u0027"},{"line_number":780,"context_line":"        self.library.delete_volume(volume2)"},{"line_number":781,"context_line":""},{"line_number":782,"context_line":"    def test_map_volume_to_host_volume_not_mapped(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_91f66a5b","line":779,"in_reply_to":"3a50d1a3_ce00d336","updated":"2015-07-23 12:02:14.000000000","message":"This unit test case does not inform why we need to catch that KeyError exception. As per my understanding delete_volume will raise KeyError while calling self._get_volume.\n\nSo can you please add a unit test case to check this point or can add some asserts to address this point.","commit_id":"438e1a401bcfa607206df002c0cabb8caff54592"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"b596687d8ba92a9ce595395ab7d5f3febbef83f0","unresolved":false,"context_lines":[{"line_number":785,"context_line":"        volume2 \u003d get_fake_volume()"},{"line_number":786,"context_line":"        # Change to a nonexistent id."},{"line_number":787,"context_line":"        volume2[\u0027name_id\u0027] \u003d \u002788888888-4444-4444-4444-cccccccccccc\u0027"},{"line_number":788,"context_line":"        self.library.delete_volume(volume2)"},{"line_number":789,"context_line":""},{"line_number":790,"context_line":"    def test_map_volume_to_host_volume_not_mapped(self):"},{"line_number":791,"context_line":"        \"\"\"Map the volume directly to destination host.\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_95b4fd81","line":788,"updated":"2015-07-23 18:41:48.000000000","message":"From http://docs.openstack.org/developer/hacking/#unit-tests-and-assertraises: \"A properly written test asserts that a particular behavior occurs.\"  You can do this by collecting the returned value of the delete_volume call (python implicit None)\n     result \u003d self.library.delete_volume(volume2)\nand then testing it via:\n     self.assertEqual(None, result)","commit_id":"3444e7c7bd1b0843624c217df8d7e2ef1abd2922"},{"author":{"_account_id":17468,"name":"ubaumann","email":"openstack@m.ubaumann.ch","username":"ubaumann"},"change_message_id":"3e1cfa7dafbe56fd07da8808f354bb3ac27cdea2","unresolved":false,"context_lines":[{"line_number":785,"context_line":"        volume2 \u003d get_fake_volume()"},{"line_number":786,"context_line":"        # Change to a nonexistent id."},{"line_number":787,"context_line":"        volume2[\u0027name_id\u0027] \u003d \u002788888888-4444-4444-4444-cccccccccccc\u0027"},{"line_number":788,"context_line":"        self.library.delete_volume(volume2)"},{"line_number":789,"context_line":""},{"line_number":790,"context_line":"    def test_map_volume_to_host_volume_not_mapped(self):"},{"line_number":791,"context_line":"        \"\"\"Map the volume directly to destination host.\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_666669ee","line":788,"in_reply_to":"3a50d1a3_0bc77064","updated":"2015-07-23 19:12:04.000000000","message":"I will do a self.assertNone(self.library.delete_volume(volume2))\n\nI\u0027m sorry. This is my first bug fix. I was thinking it\u0027s a really easy one.","commit_id":"3444e7c7bd1b0843624c217df8d7e2ef1abd2922"},{"author":{"_account_id":9366,"name":"Andrew Kerr","email":"andrew.kerr@netapp.com","username":"andrew-kerr"},"change_message_id":"8f4e526bc62e037e75eb9273d43f153bbf403700","unresolved":false,"context_lines":[{"line_number":785,"context_line":"        volume2 \u003d get_fake_volume()"},{"line_number":786,"context_line":"        # Change to a nonexistent id."},{"line_number":787,"context_line":"        volume2[\u0027name_id\u0027] \u003d \u002788888888-4444-4444-4444-cccccccccccc\u0027"},{"line_number":788,"context_line":"        self.library.delete_volume(volume2)"},{"line_number":789,"context_line":""},{"line_number":790,"context_line":"    def test_map_volume_to_host_volume_not_mapped(self):"},{"line_number":791,"context_line":"        \"\"\"Map the volume directly to destination host.\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_0bc77064","line":788,"in_reply_to":"3a50d1a3_2b4fcc34","updated":"2015-07-23 19:02:51.000000000","message":"If you go this route then\n\n self.assertNone(result)\n\nwould be more correct","commit_id":"3444e7c7bd1b0843624c217df8d7e2ef1abd2922"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"96a3500f18ffc140aaf2167ef78ef96427e2505e","unresolved":false,"context_lines":[{"line_number":785,"context_line":"        volume2 \u003d get_fake_volume()"},{"line_number":786,"context_line":"        # Change to a nonexistent id."},{"line_number":787,"context_line":"        volume2[\u0027name_id\u0027] \u003d \u002788888888-4444-4444-4444-cccccccccccc\u0027"},{"line_number":788,"context_line":"        self.library.delete_volume(volume2)"},{"line_number":789,"context_line":""},{"line_number":790,"context_line":"    def test_map_volume_to_host_volume_not_mapped(self):"},{"line_number":791,"context_line":"        \"\"\"Map the volume directly to destination host.\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_8bb2a004","line":788,"in_reply_to":"3a50d1a3_2b4fcc34","updated":"2015-07-23 19:02:36.000000000","message":"Thanks.   The assert here explicitly assures us that an  exception wasn\u0027t raised because of the nonexistent id, which is I think the point of this test.  I do understand that the test would fail anyways if an assert was raised for that reason, but this way is considered better form :-)","commit_id":"3444e7c7bd1b0843624c217df8d7e2ef1abd2922"},{"author":{"_account_id":17468,"name":"ubaumann","email":"openstack@m.ubaumann.ch","username":"ubaumann"},"change_message_id":"88030693af27f1a0a644600a3f72a3d722c7bb59","unresolved":false,"context_lines":[{"line_number":785,"context_line":"        volume2 \u003d get_fake_volume()"},{"line_number":786,"context_line":"        # Change to a nonexistent id."},{"line_number":787,"context_line":"        volume2[\u0027name_id\u0027] \u003d \u002788888888-4444-4444-4444-cccccccccccc\u0027"},{"line_number":788,"context_line":"        self.library.delete_volume(volume2)"},{"line_number":789,"context_line":""},{"line_number":790,"context_line":"    def test_map_volume_to_host_volume_not_mapped(self):"},{"line_number":791,"context_line":"        \"\"\"Map the volume directly to destination host.\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"3a50d1a3_2b4fcc34","line":788,"in_reply_to":"3a50d1a3_95b4fd81","updated":"2015-07-23 18:58:25.000000000","message":"The method delete_volume will always return None so I could do a self.assertEquel(None, None), but I will do a self.assertEqual(None, result) for future releases. ;)","commit_id":"3444e7c7bd1b0843624c217df8d7e2ef1abd2922"},{"author":{"_account_id":2861,"name":"Vincent Hou","email":"shou@us.ibm.com","username":"houshengbo"},"change_message_id":"95872d639a2ecb8f3a0c53120fb25b05f5c4b4bb","unresolved":false,"context_lines":[{"line_number":779,"context_line":"        volume2[\u0027name_id\u0027] \u003d \u002788888888-4444-4444-4444-cccccccccccc\u0027"},{"line_number":780,"context_line":"        self.assertRaises(KeyError,"},{"line_number":781,"context_line":"                          self.library._get_volume,"},{"line_number":782,"context_line":"                          volume2[\u0027name_id\u0027])"},{"line_number":783,"context_line":""},{"line_number":784,"context_line":"    def test_delete_non_existing_volume(self):"},{"line_number":785,"context_line":"        volume2 \u003d get_fake_volume()"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a50d1a3_63727f13","line":782,"updated":"2015-07-27 06:02:40.000000000","message":"In the commit message, we have \"If a non existing volume is deleted the NetApp iSCSI eseries driver throws a KeyError Exception\nin the delete_volume method.\" \n\nDo you mean the delete_method from the library or the client?\nIt is clearly indicated here that self.library._get_volume raises the KeyError. \n\nPlease make the message more precise. I suggest you add some comments to the def delete_volume(self, volume) as well.\n\nThanks.","commit_id":"eccf433fd716ac5f61cafbb490ddeed0a6827531"}],"cinder/volume/drivers/netapp/eseries/library.py":[{"author":{"_account_id":10485,"name":"Ankit Agrawal","email":"ankitagrawal8188@gmail.com","username":"ankitagrawal"},"change_message_id":"e204b3bcfe5d62d8aeb3a1b91f95ce073fa525f8","unresolved":false,"context_lines":[{"line_number":476,"context_line":"            vol \u003d self._get_volume(volume[\u0027name_id\u0027])"},{"line_number":477,"context_line":"            self._client.delete_volume(vol[\u0027volumeRef\u0027])"},{"line_number":478,"context_line":"        except (exception.NetAppDriverException, KeyError):"},{"line_number":479,"context_line":"            LOG.warning(_LI(\"Volume %s already deleted.\"), volume[\u0027id\u0027])"},{"line_number":480,"context_line":"            return"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"    def create_snapshot(self, snapshot):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_0bb22de5","line":479,"updated":"2015-07-23 11:21:01.000000000","message":"Please use _LW instead of _LI for warning log messages.","commit_id":"438e1a401bcfa607206df002c0cabb8caff54592"},{"author":{"_account_id":17468,"name":"ubaumann","email":"openstack@m.ubaumann.ch","username":"ubaumann"},"change_message_id":"6665db08f3254457de419e7371594abdfab2f69f","unresolved":false,"context_lines":[{"line_number":476,"context_line":"            vol \u003d self._get_volume(volume[\u0027name_id\u0027])"},{"line_number":477,"context_line":"            self._client.delete_volume(vol[\u0027volumeRef\u0027])"},{"line_number":478,"context_line":"        except (exception.NetAppDriverException, KeyError):"},{"line_number":479,"context_line":"            LOG.warning(_LI(\"Volume %s already deleted.\"), volume[\u0027id\u0027])"},{"line_number":480,"context_line":"            return"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"    def create_snapshot(self, snapshot):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_4e1e0371","line":479,"in_reply_to":"3a50d1a3_0bb22de5","updated":"2015-07-23 11:43:09.000000000","message":"This is just a bug fix and I\u0027m not intrested in refactor the whole driver","commit_id":"438e1a401bcfa607206df002c0cabb8caff54592"},{"author":{"_account_id":10485,"name":"Ankit Agrawal","email":"ankitagrawal8188@gmail.com","username":"ankitagrawal"},"change_message_id":"7791a8f73d1273fbb7fbb5b4833594373e33fdb7","unresolved":false,"context_lines":[{"line_number":476,"context_line":"            vol \u003d self._get_volume(volume[\u0027name_id\u0027])"},{"line_number":477,"context_line":"            self._client.delete_volume(vol[\u0027volumeRef\u0027])"},{"line_number":478,"context_line":"        except (exception.NetAppDriverException, KeyError):"},{"line_number":479,"context_line":"            LOG.warning(_LI(\"Volume %s already deleted.\"), volume[\u0027id\u0027])"},{"line_number":480,"context_line":"            return"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"    def create_snapshot(self, snapshot):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_5ca1d9f6","line":479,"in_reply_to":"3a50d1a3_4e1e0371","updated":"2015-07-23 12:02:14.000000000","message":"You don\u0027t need to refactor the whole driver as it has already been fixed throught the cinder code. I just asked to make this change because you are updating this exception.\n\nBut if you think that it should be addressed separately I\u0027m ok with that.","commit_id":"438e1a401bcfa607206df002c0cabb8caff54592"},{"author":{"_account_id":16258,"name":"nikesh","email":"nike.niec@gmail.com","username":"nikem"},"change_message_id":"e38824e41c2822cbcf512f537adfa335bceda2c9","unresolved":false,"context_lines":[{"line_number":476,"context_line":"            vol \u003d self._get_volume(volume[\u0027name_id\u0027])"},{"line_number":477,"context_line":"            self._client.delete_volume(vol[\u0027volumeRef\u0027])"},{"line_number":478,"context_line":"        except (exception.NetAppDriverException, KeyError):"},{"line_number":479,"context_line":"            LOG.warning(_LI(\"Volume %s already deleted.\"), volume[\u0027id\u0027])"},{"line_number":480,"context_line":"            return"},{"line_number":481,"context_line":""},{"line_number":482,"context_line":"    def create_snapshot(self, snapshot):"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a50d1a3_451c9969","line":479,"in_reply_to":"3a50d1a3_5ca1d9f6","updated":"2015-07-23 13:36:36.000000000","message":"I agreed with Ankit.","commit_id":"438e1a401bcfa607206df002c0cabb8caff54592"}]}
