)]}'
{"nova/tests/unit/virt/xenapi/plugins/test_pluginlib_nova.py":[{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"15cfdc0d43f7c01933b2fd1f34cf1ac44f44453b","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        self.pluginlib_nova._vbd_unplug_with_retry(self.session,"},{"line_number":141,"context_line":"                                                   \u0027fake_vbd_ref\u0027)"},{"line_number":142,"context_line":"        self.assertTrue(1, self.session.xenapi.VBD.unplug.call_count)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_vbd_unplug_with_retry_detached_already(self):"},{"line_number":145,"context_line":"        def fake_vbd_unplug(*args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa0719c6_262a8690","line":142,"range":{"start_line":142,"start_character":13,"end_line":142,"end_character":23},"updated":"2016-03-24 04:39:38.000000000","message":"It should be \u0027assertEqual\u0027.","commit_id":"0f0375181f9e92faa7bc84b19863c0ce4c76c454"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"7de04c08f929f6d4ccb44a7454b22e0a8b80c7eb","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"        self.pluginlib_nova._vbd_unplug_with_retry(self.session,"},{"line_number":141,"context_line":"                                                   \u0027fake_vbd_ref\u0027)"},{"line_number":142,"context_line":"        self.assertTrue(1, self.session.xenapi.VBD.unplug.call_count)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    def test_vbd_unplug_with_retry_detached_already(self):"},{"line_number":145,"context_line":"        def fake_vbd_unplug(*args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa0719c6_414e84c1","line":142,"range":{"start_line":142,"start_character":13,"end_line":142,"end_character":23},"in_reply_to":"fa0719c6_262a8690","updated":"2016-03-24 05:45:28.000000000","message":"thanks. My mistake.","commit_id":"0f0375181f9e92faa7bc84b19863c0ce4c76c454"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"15cfdc0d43f7c01933b2fd1f34cf1ac44f44453b","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        self.pluginlib_nova.XenAPI.Failure \u003d FakeUnplugException"},{"line_number":150,"context_line":"        self.pluginlib_nova._vbd_unplug_with_retry(self.session,"},{"line_number":151,"context_line":"                                                   \u0027fake_vbd_ref\u0027)"},{"line_number":152,"context_line":"        self.assertTrue(1, self.session.xenapi.VBD.unplug.call_count)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def test_vbd_unplug_with_retry_seccuss_at_second_time(self):"},{"line_number":155,"context_line":"        def fake_vbd_unplug(*args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa0719c6_861b9280","line":152,"range":{"start_line":152,"start_character":13,"end_line":152,"end_character":23},"updated":"2016-03-24 04:39:38.000000000","message":"ditto","commit_id":"0f0375181f9e92faa7bc84b19863c0ce4c76c454"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"7de04c08f929f6d4ccb44a7454b22e0a8b80c7eb","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        self.pluginlib_nova.XenAPI.Failure \u003d FakeUnplugException"},{"line_number":150,"context_line":"        self.pluginlib_nova._vbd_unplug_with_retry(self.session,"},{"line_number":151,"context_line":"                                                   \u0027fake_vbd_ref\u0027)"},{"line_number":152,"context_line":"        self.assertTrue(1, self.session.xenapi.VBD.unplug.call_count)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def test_vbd_unplug_with_retry_seccuss_at_second_time(self):"},{"line_number":155,"context_line":"        def fake_vbd_unplug(*args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa0719c6_2149d0b7","line":152,"range":{"start_line":152,"start_character":13,"end_line":152,"end_character":23},"in_reply_to":"fa0719c6_861b9280","updated":"2016-03-24 05:45:28.000000000","message":"Done","commit_id":"0f0375181f9e92faa7bc84b19863c0ce4c76c454"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"15cfdc0d43f7c01933b2fd1f34cf1ac44f44453b","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        self.pluginlib_nova.XenAPI.Failure \u003d FakeUnplugException"},{"line_number":165,"context_line":"        self.pluginlib_nova._vbd_unplug_with_retry(self.session,"},{"line_number":166,"context_line":"                                                   \u0027fake_vbd_ref\u0027)"},{"line_number":167,"context_line":"        self.assertTrue(2, self.session.xenapi.VBD.unplug.call_count)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa0719c6_661e3e71","line":167,"range":{"start_line":167,"start_character":13,"end_line":167,"end_character":23},"updated":"2016-03-24 04:39:38.000000000","message":"ditto","commit_id":"0f0375181f9e92faa7bc84b19863c0ce4c76c454"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"7de04c08f929f6d4ccb44a7454b22e0a8b80c7eb","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        self.pluginlib_nova.XenAPI.Failure \u003d FakeUnplugException"},{"line_number":165,"context_line":"        self.pluginlib_nova._vbd_unplug_with_retry(self.session,"},{"line_number":166,"context_line":"                                                   \u0027fake_vbd_ref\u0027)"},{"line_number":167,"context_line":"        self.assertTrue(2, self.session.xenapi.VBD.unplug.call_count)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa0719c6_81ca5c19","line":167,"range":{"start_line":167,"start_character":13,"end_line":167,"end_character":23},"in_reply_to":"fa0719c6_661e3e71","updated":"2016-03-24 05:45:28.000000000","message":"Done","commit_id":"0f0375181f9e92faa7bc84b19863c0ce4c76c454"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"9da9d8c026d3bf47087aac9723c37ef644149e8b","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def test_exists(self):"},{"line_number":51,"context_line":"        fake_args \u003d {\u0027k1\u0027: \u0027v1\u0027, \u0027k2\u0027: \u0027v2\u0027}"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        def _test_exists_ok():"},{"line_number":54,"context_line":"            self.assertEqual(\u0027v1\u0027, self.pluginlib_nova.exists(fake_args, \u0027k1\u0027))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        def _test_exists_exception():"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_40b9642d","line":53,"updated":"2016-04-20 13:36:26.000000000","message":"These would be better as top-level tests.  I know they are simple, but just put fake_args as a class value rather than function and it should just be a simple case of moving these up a level and making the code simpler.","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"9d80bd814c826b775071c60f3f91fd71eed2c67f","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def test_exists(self):"},{"line_number":51,"context_line":"        fake_args \u003d {\u0027k1\u0027: \u0027v1\u0027, \u0027k2\u0027: \u0027v2\u0027}"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        def _test_exists_ok():"},{"line_number":54,"context_line":"            self.assertEqual(\u0027v1\u0027, self.pluginlib_nova.exists(fake_args, \u0027k1\u0027))"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        def _test_exists_exception():"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_6e01cfaf","line":53,"in_reply_to":"1a122d0e_40b9642d","updated":"2016-06-15 08:14:03.000000000","message":"Done","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"9da9d8c026d3bf47087aac9723c37ef644149e8b","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        mock_vbd_get_device \u003d self.mock_patch_object("},{"line_number":108,"context_line":"            self.session.xenapi.VBD,"},{"line_number":109,"context_line":"            \u0027get_device\u0027,"},{"line_number":110,"context_line":"            return_val\u003d\u0027fake_vbd_ref\u0027)"},{"line_number":111,"context_line":"        mock_vbd_unplug_with_retry \u003d self.mock_patch_object("},{"line_number":112,"context_line":"            self.pluginlib_nova,"},{"line_number":113,"context_line":"            \u0027_vbd_unplug_with_retry\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_a56faafa","line":110,"updated":"2016-04-20 13:36:26.000000000","message":"a device isn\u0027t a ref; it should be \u0027xvda\u0027","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"9d80bd814c826b775071c60f3f91fd71eed2c67f","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        mock_vbd_get_device \u003d self.mock_patch_object("},{"line_number":108,"context_line":"            self.session.xenapi.VBD,"},{"line_number":109,"context_line":"            \u0027get_device\u0027,"},{"line_number":110,"context_line":"            return_val\u003d\u0027fake_vbd_ref\u0027)"},{"line_number":111,"context_line":"        mock_vbd_unplug_with_retry \u003d self.mock_patch_object("},{"line_number":112,"context_line":"            self.pluginlib_nova,"},{"line_number":113,"context_line":"            \u0027_vbd_unplug_with_retry\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_4efe93af","line":110,"in_reply_to":"1a122d0e_a56faafa","updated":"2016-06-15 08:14:03.000000000","message":"Done","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"9da9d8c026d3bf47087aac9723c37ef644149e8b","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        def handle_function(vbd):"},{"line_number":119,"context_line":"            # the fake vbd handle function"},{"line_number":120,"context_line":"            return vbd"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        fake_vdi \u003d \u0027fake_vdi\u0027"},{"line_number":123,"context_line":"        return_value \u003d self.pluginlib_nova.with_vdi_in_dom0("}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_85ca6e19","line":120,"updated":"2016-04-20 13:36:26.000000000","message":"I think this should verify that mock_vbd_plug has been called, but mock_vbd_unplug has _not_ been called; i.e. that the handle_function is called while the VBD is plugged.\n\nI also think this should verify that vbd \u003d\u003d \u0027xvda\u0027, rather than passing it through as the return value.\nThen return \u0027function_called\u0027","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"9d80bd814c826b775071c60f3f91fd71eed2c67f","unresolved":false,"context_lines":[{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        def handle_function(vbd):"},{"line_number":119,"context_line":"            # the fake vbd handle function"},{"line_number":120,"context_line":"            return vbd"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        fake_vdi \u003d \u0027fake_vdi\u0027"},{"line_number":123,"context_line":"        return_value \u003d self.pluginlib_nova.with_vdi_in_dom0("}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_ae29f73c","line":120,"in_reply_to":"1a122d0e_85ca6e19","updated":"2016-06-15 08:14:03.000000000","message":"Done","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"9da9d8c026d3bf47087aac9723c37ef644149e8b","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        fake_vdi \u003d \u0027fake_vdi\u0027"},{"line_number":123,"context_line":"        return_value \u003d self.pluginlib_nova.with_vdi_in_dom0("},{"line_number":124,"context_line":"            self.session, fake_vdi, \u0027RO\u0027, handle_function)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        self.assertEqual(\u0027fake_vbd_ref\u0027, return_value)"},{"line_number":127,"context_line":"        self.assertTrue(mock_get_domain_0.called)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_a53deade","line":124,"updated":"2016-04-20 13:36:26.000000000","message":"read_only must be a boolean.  Suggest you pass false so it\u0027s RW","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"9d80bd814c826b775071c60f3f91fd71eed2c67f","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        fake_vdi \u003d \u0027fake_vdi\u0027"},{"line_number":123,"context_line":"        return_value \u003d self.pluginlib_nova.with_vdi_in_dom0("},{"line_number":124,"context_line":"            self.session, fake_vdi, \u0027RO\u0027, handle_function)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        self.assertEqual(\u0027fake_vbd_ref\u0027, return_value)"},{"line_number":127,"context_line":"        self.assertTrue(mock_get_domain_0.called)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_ee23ff56","line":124,"in_reply_to":"1a122d0e_a53deade","updated":"2016-06-15 08:14:03.000000000","message":"Done","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"9da9d8c026d3bf47087aac9723c37ef644149e8b","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        return_value \u003d self.pluginlib_nova.with_vdi_in_dom0("},{"line_number":124,"context_line":"            self.session, fake_vdi, \u0027RO\u0027, handle_function)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        self.assertEqual(\u0027fake_vbd_ref\u0027, return_value)"},{"line_number":127,"context_line":"        self.assertTrue(mock_get_domain_0.called)"},{"line_number":128,"context_line":"        self.assertTrue(mock_vbd_create.called)"},{"line_number":129,"context_line":"        self.assertTrue(mock_vbd_plug.called)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_45585656","line":126,"updated":"2016-04-20 13:36:26.000000000","message":"\u0027function_called\u0027","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"9d80bd814c826b775071c60f3f91fd71eed2c67f","unresolved":false,"context_lines":[{"line_number":123,"context_line":"        return_value \u003d self.pluginlib_nova.with_vdi_in_dom0("},{"line_number":124,"context_line":"            self.session, fake_vdi, \u0027RO\u0027, handle_function)"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        self.assertEqual(\u0027fake_vbd_ref\u0027, return_value)"},{"line_number":127,"context_line":"        self.assertTrue(mock_get_domain_0.called)"},{"line_number":128,"context_line":"        self.assertTrue(mock_vbd_create.called)"},{"line_number":129,"context_line":"        self.assertTrue(mock_vbd_plug.called)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_0e1beb1d","line":126,"in_reply_to":"1a122d0e_45585656","updated":"2016-06-15 08:14:03.000000000","message":"Done","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"9da9d8c026d3bf47087aac9723c37ef644149e8b","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        self.assertEqual(\u0027fake_vbd_ref\u0027, return_value)"},{"line_number":127,"context_line":"        self.assertTrue(mock_get_domain_0.called)"},{"line_number":128,"context_line":"        self.assertTrue(mock_vbd_create.called)"},{"line_number":129,"context_line":"        self.assertTrue(mock_vbd_plug.called)"},{"line_number":130,"context_line":"        self.assertTrue(mock_vbd_get_device.called)"},{"line_number":131,"context_line":"        self.assertTrue(mock_vbd_unplug_with_retry.called)"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_4055e4c3","line":128,"updated":"2016-04-20 13:36:26.000000000","message":"Perhaps we should be checking specific things here; for example, we don\u0027t care that get_domain_0 was actually called, all we care about is that vbd.create had vbd_rec[\u0027VM\u0027] \u003d \u0027fake_dom0_ref\u0027; so check that at the end and you can remove the tests for get_domain_0.called and vbd_create.called (since you\u0027re checking the fake XAPI)","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"9d80bd814c826b775071c60f3f91fd71eed2c67f","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        self.assertEqual(\u0027fake_vbd_ref\u0027, return_value)"},{"line_number":127,"context_line":"        self.assertTrue(mock_get_domain_0.called)"},{"line_number":128,"context_line":"        self.assertTrue(mock_vbd_create.called)"},{"line_number":129,"context_line":"        self.assertTrue(mock_vbd_plug.called)"},{"line_number":130,"context_line":"        self.assertTrue(mock_vbd_get_device.called)"},{"line_number":131,"context_line":"        self.assertTrue(mock_vbd_unplug_with_retry.called)"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_6e18af1f","line":128,"in_reply_to":"1a122d0e_4055e4c3","updated":"2016-06-15 08:14:03.000000000","message":"Done","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"9da9d8c026d3bf47087aac9723c37ef644149e8b","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        self.assertTrue(mock_get_domain_0.called)"},{"line_number":128,"context_line":"        self.assertTrue(mock_vbd_create.called)"},{"line_number":129,"context_line":"        self.assertTrue(mock_vbd_plug.called)"},{"line_number":130,"context_line":"        self.assertTrue(mock_vbd_get_device.called)"},{"line_number":131,"context_line":"        self.assertTrue(mock_vbd_unplug_with_retry.called)"},{"line_number":132,"context_line":"        self.assertTrue(mock_vbd_destroy.called)"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_65f4725a","line":130,"updated":"2016-04-20 13:36:26.000000000","message":"No need to ensure get_device was called.","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"9d80bd814c826b775071c60f3f91fd71eed2c67f","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        self.assertTrue(mock_get_domain_0.called)"},{"line_number":128,"context_line":"        self.assertTrue(mock_vbd_create.called)"},{"line_number":129,"context_line":"        self.assertTrue(mock_vbd_plug.called)"},{"line_number":130,"context_line":"        self.assertTrue(mock_vbd_get_device.called)"},{"line_number":131,"context_line":"        self.assertTrue(mock_vbd_unplug_with_retry.called)"},{"line_number":132,"context_line":"        self.assertTrue(mock_vbd_destroy.called)"},{"line_number":133,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_aed0d72c","line":130,"in_reply_to":"1a122d0e_65f4725a","updated":"2016-06-15 08:14:03.000000000","message":"Done","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"9da9d8c026d3bf47087aac9723c37ef644149e8b","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        self.assertTrue(mock_vbd_get_device.called)"},{"line_number":131,"context_line":"        self.assertTrue(mock_vbd_unplug_with_retry.called)"},{"line_number":132,"context_line":"        self.assertTrue(mock_vbd_destroy.called)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_vbd_unplug_with_retry_success_at_first_time(self):"},{"line_number":135,"context_line":"        def fake_vbd_unplug(*args, **kwargs):"},{"line_number":136,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_c01f3459","line":133,"updated":"2016-04-20 13:36:26.000000000","message":"Also check that the VBD record created (with reference \u0027fake_vbd_ref\u0027) is has [\u0027mode\u0027]\u003d\u0027RW\u0027","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"9d80bd814c826b775071c60f3f91fd71eed2c67f","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        self.assertTrue(mock_vbd_get_device.called)"},{"line_number":131,"context_line":"        self.assertTrue(mock_vbd_unplug_with_retry.called)"},{"line_number":132,"context_line":"        self.assertTrue(mock_vbd_destroy.called)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_vbd_unplug_with_retry_success_at_first_time(self):"},{"line_number":135,"context_line":"        def fake_vbd_unplug(*args, **kwargs):"},{"line_number":136,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":5,"id":"7aa08908_eedadf4a","line":133,"in_reply_to":"1a122d0e_c01f3459","updated":"2016-06-15 08:14:03.000000000","message":"Done","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"9da9d8c026d3bf47087aac9723c37ef644149e8b","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                                                   \u0027fake_vbd_ref\u0027)"},{"line_number":152,"context_line":"        self.assertEqual(1, self.session.xenapi.VBD.unplug.call_count)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"    def test_vbd_unplug_with_retry_seccuss_at_second_time(self):"},{"line_number":155,"context_line":"        def fake_vbd_unplug(*args, **kwargs):"},{"line_number":156,"context_line":"            if fake_vbd_unplug.called:"},{"line_number":157,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a122d0e_80bffc5f","line":154,"updated":"2016-04-20 13:36:26.000000000","message":"typo: success\n\nBut this raises a big issue... if DEVICE_DETACH_REJECTED is always returned, then it will always sleep and try again.\nPlease raise a bug for that.","commit_id":"cd1c20a7a2b41c255337dd11d870b4db55ec5985"},{"author":{"_account_id":6735,"name":"Bob Ball","email":"bob.ball@citrix.com","username":"bob-ball"},"change_message_id":"2a6d7192e0e175db54d921ded6005f4b4647633c","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        mock_get_this_host \u003d self.mock_patch_object("},{"line_number":73,"context_line":"            self.session.xenapi.session,"},{"line_number":74,"context_line":"            \u0027get_this_host\u0027,"},{"line_number":75,"context_line":"            return_val\u003d\u0027fake_fost_ref\u0027)"},{"line_number":76,"context_line":"        mock_get_vm_records \u003d self.mock_patch_object("},{"line_number":77,"context_line":"            self.session.xenapi.VM,"},{"line_number":78,"context_line":"            \u0027get_all_records_where\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"bacf61ea_eb78d72d","line":75,"updated":"2016-08-18 10:05:29.000000000","message":"fake_host_ref - presumably this isn\u0027t checked anywhere?","commit_id":"c5cf4b3beafbdc3c7c5604f148b86592d78717c7"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"e4918715a53276bd750f64efdbed487a1443ffab","unresolved":false,"context_lines":[{"line_number":72,"context_line":"        mock_get_this_host \u003d self.mock_patch_object("},{"line_number":73,"context_line":"            self.session.xenapi.session,"},{"line_number":74,"context_line":"            \u0027get_this_host\u0027,"},{"line_number":75,"context_line":"            return_val\u003d\u0027fake_fost_ref\u0027)"},{"line_number":76,"context_line":"        mock_get_vm_records \u003d self.mock_patch_object("},{"line_number":77,"context_line":"            self.session.xenapi.VM,"},{"line_number":78,"context_line":"            \u0027get_all_records_where\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"3ac371cc_ebb473d5","line":75,"in_reply_to":"bacf61ea_eb78d72d","updated":"2016-08-19 01:36:51.000000000","message":"Done","commit_id":"c5cf4b3beafbdc3c7c5604f148b86592d78717c7"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"075912b7fa74b4c2cbc31f91c0ea0f89a0196d56","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        mock_sysh_setFormatter \u003d self.mock_patch_object("},{"line_number":38,"context_line":"            self.pluginlib_nova.logging.handlers.SysLogHandler, \u0027setFormatter\u0027)"},{"line_number":39,"context_line":"        mock_Logger_addHandler \u003d self.mock_patch_object("},{"line_number":40,"context_line":"            self.pluginlib_nova.logging.Logger, \u0027addHandler\u0027)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        self.pluginlib_nova.configure_logging(name)"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_ceaea62d","line":40,"updated":"2016-09-12 16:54:20.000000000","message":"Same as later comment, usual pattern is to use decorators or context manager. Also, it\u0027s not usual to use camelCase in variable names.","commit_id":"c2ad65c82424071a921be43034c4eb081e9e67d8"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"88ff958c969977530542b9b689fcaeca93c0924d","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        mock_sysh_setFormatter \u003d self.mock_patch_object("},{"line_number":38,"context_line":"            self.pluginlib_nova.logging.handlers.SysLogHandler, \u0027setFormatter\u0027)"},{"line_number":39,"context_line":"        mock_Logger_addHandler \u003d self.mock_patch_object("},{"line_number":40,"context_line":"            self.pluginlib_nova.logging.Logger, \u0027addHandler\u0027)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        self.pluginlib_nova.configure_logging(name)"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"7a8ec9b2_b4eb11db","line":40,"in_reply_to":"9a89bdaa_ceaea62d","updated":"2016-09-19 03:58:07.000000000","message":"The camelCase variable names e.g. addHandler exist in the\nmodule of logging. So this test just use the same name for easy mapping.\n\nThese tests with plugin have some special things: the pluginlib module is imported at run time;\nthat\u0027s why we can\u0027t use the usual pattern. Please refer to this review:\n\nhttps://review.openstack.org/#/c/283962/5/nova/tests/unit/virt/xenapi/plugins/plugin_test.py\n\n        # XAPI plugins run in a py24 environment and may be not compatible with\n        # py34\u0027s syntax. In order to prevent unit test scanning the source file\n        # under py34 environment, the plugins will be imported with this\n        # function at run time.","commit_id":"c2ad65c82424071a921be43034c4eb081e9e67d8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"075912b7fa74b4c2cbc31f91c0ea0f89a0196d56","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        mock_get_vm_records \u003d self.mock_patch_object("},{"line_number":77,"context_line":"            self.session.xenapi.VM,"},{"line_number":78,"context_line":"            \u0027get_all_records_where\u0027,"},{"line_number":79,"context_line":"            return_val\u003d{\"fake_vm_ref\": \"fake_value\"})"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        ret_value \u003d self.pluginlib_nova._get_domain_0(self.session)"},{"line_number":82,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_eef9aa4f","line":79,"updated":"2016-09-12 16:54:20.000000000","message":"Same as later comment, usual pattern is to use decorators or context manager","commit_id":"c2ad65c82424071a921be43034c4eb081e9e67d8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"075912b7fa74b4c2cbc31f91c0ea0f89a0196d56","unresolved":false,"context_lines":[{"line_number":105,"context_line":"            \u0027_vbd_unplug_with_retry\u0027)"},{"line_number":106,"context_line":"        mock_vbd_destroy \u003d self.mock_patch_object("},{"line_number":107,"context_line":"            self.session.xenapi.VBD,"},{"line_number":108,"context_line":"            \u0027destroy\u0027)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"        def handle_function(vbd):"},{"line_number":111,"context_line":"            # the fake vbd handle function"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_2ec8f221","line":108,"updated":"2016-09-12 16:54:20.000000000","message":"The usual pattern for patching is usually with the decorators or the nested context manager, for example:\n\n @mock.patch.object(...)\n ...\n def do_test(mock_destroy, mock_unplug, ...):\n     result \u003d self.pluginlib_nova.with_vdi_in_dom0(...)\n\n do_test()\n\nor\n\n with test.nested(mock.patch.object(...),\n                  ...\n ) as (mock_getdom0, mock_create, ...):\n     result \u003d self.pluginlib_nova.with_vdi_in_dom0(...)","commit_id":"c2ad65c82424071a921be43034c4eb081e9e67d8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"075912b7fa74b4c2cbc31f91c0ea0f89a0196d56","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        self.assertEqual(\u0027RW\u0027, args[0][\u0027mode\u0027])"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def test_vbd_unplug_with_retry_success_at_first_time(self):"},{"line_number":130,"context_line":"        def fake_vbd_unplug(*args, **kwargs):"},{"line_number":131,"context_line":"            return"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        self.session.xenapi.VBD.unplug.side_effect \u003d fake_vbd_unplug"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        self.pluginlib_nova._vbd_unplug_with_retry(self.session,"},{"line_number":136,"context_line":"                                                   \u0027fake_vbd_ref\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_cedb067b","line":133,"range":{"start_line":130,"start_character":8,"end_line":133,"end_character":68},"updated":"2016-09-12 16:54:20.000000000","message":"-1 This is unnecessary.","commit_id":"c2ad65c82424071a921be43034c4eb081e9e67d8"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"88ff958c969977530542b9b689fcaeca93c0924d","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        self.assertEqual(\u0027RW\u0027, args[0][\u0027mode\u0027])"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def test_vbd_unplug_with_retry_success_at_first_time(self):"},{"line_number":130,"context_line":"        def fake_vbd_unplug(*args, **kwargs):"},{"line_number":131,"context_line":"            return"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"        self.session.xenapi.VBD.unplug.side_effect \u003d fake_vbd_unplug"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        self.pluginlib_nova._vbd_unplug_with_retry(self.session,"},{"line_number":136,"context_line":"                                                   \u0027fake_vbd_ref\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a8ec9b2_7487c9b4","line":133,"range":{"start_line":130,"start_character":8,"end_line":133,"end_character":68},"in_reply_to":"9a89bdaa_cedb067b","updated":"2016-09-19 03:58:07.000000000","message":"Done","commit_id":"c2ad65c82424071a921be43034c4eb081e9e67d8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"075912b7fa74b4c2cbc31f91c0ea0f89a0196d56","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        self.assertEqual(1, self.session.xenapi.VBD.unplug.call_count)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def test_vbd_unplug_with_retry_detached_already(self):"},{"line_number":140,"context_line":"        def fake_vbd_unplug(*args, **kwargs):"},{"line_number":141,"context_line":"            raise FakeUnplugException([\u0027DEVICE_ALREADY_DETACHED\u0027])"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        self.session.xenapi.VBD.unplug.side_effect \u003d fake_vbd_unplug"},{"line_number":144,"context_line":"        self.pluginlib_nova.XenAPI.Failure \u003d FakeUnplugException"},{"line_number":145,"context_line":"        self.pluginlib_nova._vbd_unplug_with_retry(self.session,"},{"line_number":146,"context_line":"                                                   \u0027fake_vbd_ref\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_0e8b2e69","line":143,"range":{"start_line":140,"start_character":8,"end_line":143,"end_character":68},"updated":"2016-09-12 16:54:20.000000000","message":"-1 Instead of this, you should just do:\n\n error \u003d FakeUnplugException([\u0027DEVICE_ALREADY_DETACHED\u0027])\n self.session.xenapi.VBD.unplug.side_effect \u003d error","commit_id":"c2ad65c82424071a921be43034c4eb081e9e67d8"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"88ff958c969977530542b9b689fcaeca93c0924d","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        self.assertEqual(1, self.session.xenapi.VBD.unplug.call_count)"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def test_vbd_unplug_with_retry_detached_already(self):"},{"line_number":140,"context_line":"        def fake_vbd_unplug(*args, **kwargs):"},{"line_number":141,"context_line":"            raise FakeUnplugException([\u0027DEVICE_ALREADY_DETACHED\u0027])"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        self.session.xenapi.VBD.unplug.side_effect \u003d fake_vbd_unplug"},{"line_number":144,"context_line":"        self.pluginlib_nova.XenAPI.Failure \u003d FakeUnplugException"},{"line_number":145,"context_line":"        self.pluginlib_nova._vbd_unplug_with_retry(self.session,"},{"line_number":146,"context_line":"                                                   \u0027fake_vbd_ref\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a8ec9b2_f49af912","line":143,"range":{"start_line":140,"start_character":8,"end_line":143,"end_character":68},"in_reply_to":"9a89bdaa_0e8b2e69","updated":"2016-09-19 03:58:07.000000000","message":"yeah, that\u0027s much better. Thanks.","commit_id":"c2ad65c82424071a921be43034c4eb081e9e67d8"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"075912b7fa74b4c2cbc31f91c0ea0f89a0196d56","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        self.assertEqual(1, self.session.xenapi.VBD.unplug.call_count)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def test_vbd_unplug_with_retry_success_at_second_time(self):"},{"line_number":150,"context_line":"        def fake_vbd_unplug(*args, **kwargs):"},{"line_number":151,"context_line":"            if fake_vbd_unplug.called:"},{"line_number":152,"context_line":"                return"},{"line_number":153,"context_line":"            else:"},{"line_number":154,"context_line":"                fake_vbd_unplug.called \u003d True"},{"line_number":155,"context_line":"                raise FakeUnplugException([\u0027DEVICE_DETACH_REJECTED\u0027])"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        fake_vbd_unplug.called \u003d False"},{"line_number":158,"context_line":"        self.session.xenapi.VBD.unplug.side_effect \u003d fake_vbd_unplug"},{"line_number":159,"context_line":"        self.pluginlib_nova.XenAPI.Failure \u003d FakeUnplugException"},{"line_number":160,"context_line":"        self.pluginlib_nova._vbd_unplug_with_retry(self.session,"},{"line_number":161,"context_line":"                                                   \u0027fake_vbd_ref\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"9a89bdaa_5b6976f8","line":158,"range":{"start_line":150,"start_character":8,"end_line":158,"end_character":68},"updated":"2016-09-12 16:54:20.000000000","message":"-1 Instead of doing this, you should just use a list for side_effect:\n\n side_effects \u003d [FakeUnplugException([\u0027DEVICE_DETACH_REJECTED\u0027]), None]\n self.session.xenapi.VBD.unplug.side_effect \u003d side_effects","commit_id":"c2ad65c82424071a921be43034c4eb081e9e67d8"},{"author":{"_account_id":17920,"name":"Jianghua Wang","email":"jianghua.wang@citrix.com","username":"wjhfresh"},"change_message_id":"88ff958c969977530542b9b689fcaeca93c0924d","unresolved":false,"context_lines":[{"line_number":147,"context_line":"        self.assertEqual(1, self.session.xenapi.VBD.unplug.call_count)"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def test_vbd_unplug_with_retry_success_at_second_time(self):"},{"line_number":150,"context_line":"        def fake_vbd_unplug(*args, **kwargs):"},{"line_number":151,"context_line":"            if fake_vbd_unplug.called:"},{"line_number":152,"context_line":"                return"},{"line_number":153,"context_line":"            else:"},{"line_number":154,"context_line":"                fake_vbd_unplug.called \u003d True"},{"line_number":155,"context_line":"                raise FakeUnplugException([\u0027DEVICE_DETACH_REJECTED\u0027])"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        fake_vbd_unplug.called \u003d False"},{"line_number":158,"context_line":"        self.session.xenapi.VBD.unplug.side_effect \u003d fake_vbd_unplug"},{"line_number":159,"context_line":"        self.pluginlib_nova.XenAPI.Failure \u003d FakeUnplugException"},{"line_number":160,"context_line":"        self.pluginlib_nova._vbd_unplug_with_retry(self.session,"},{"line_number":161,"context_line":"                                                   \u0027fake_vbd_ref\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a8ec9b2_149e8506","line":158,"range":{"start_line":150,"start_character":8,"end_line":158,"end_character":68},"in_reply_to":"9a89bdaa_5b6976f8","updated":"2016-09-19 03:58:07.000000000","message":"yeah, that\u0027s much better. Thanks.","commit_id":"c2ad65c82424071a921be43034c4eb081e9e67d8"}]}
