)]}'
{"neutron/agent/linux/ip_lib.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4b89380595157d16089df21c54a1f22c6a972ebc","unresolved":false,"context_lines":[{"line_number":629,"context_line":"                      \"to %(addr)s on %(iface)s in namespace %(ns)s\")"},{"line_number":630,"context_line":"            LOG.exception(msg, {\u0027addr\u0027: address,"},{"line_number":631,"context_line":"                                \u0027iface\u0027: iface_name,"},{"line_number":632,"context_line":"                                \u0027ns\u0027: ns_name})"},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"    if count \u003e 0:"},{"line_number":635,"context_line":"        eventlet.spawn_n(arping)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_f8be8863","line":632,"updated":"2015-01-12 22:10:52.000000000","message":"I\u0027m not a big fan of the code duplication.  Can\u0027t you just move this outside this function as _arping() and then call it from here and between the addr.add/addr.del below?  Let me give that a quick try.","commit_id":"5f5f1ab93bbd8411473b4511ee503f20df35a49e"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"c9fd28f9e87fe48a6c132a47957df5a773e97649","unresolved":false,"context_lines":[{"line_number":629,"context_line":"                      \"to %(addr)s on %(iface)s in namespace %(ns)s\")"},{"line_number":630,"context_line":"            LOG.exception(msg, {\u0027addr\u0027: address,"},{"line_number":631,"context_line":"                                \u0027iface\u0027: iface_name,"},{"line_number":632,"context_line":"                                \u0027ns\u0027: ns_name})"},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"    if count \u003e 0:"},{"line_number":635,"context_line":"        eventlet.spawn_n(arping)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_ea394bd0","line":632,"in_reply_to":"3a961159_ee8a4219","updated":"2015-01-13 00:43:51.000000000","message":"I agee with Brian. What he suggested seems perfect (Define this version of arping at the module level then use it on lines 635 and 653).","commit_id":"5f5f1ab93bbd8411473b4511ee503f20df35a49e"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"73d10983d0cc2f6a3a9291343e1a31a49394226b","unresolved":false,"context_lines":[{"line_number":629,"context_line":"                      \"to %(addr)s on %(iface)s in namespace %(ns)s\")"},{"line_number":630,"context_line":"            LOG.exception(msg, {\u0027addr\u0027: address,"},{"line_number":631,"context_line":"                                \u0027iface\u0027: iface_name,"},{"line_number":632,"context_line":"                                \u0027ns\u0027: ns_name})"},{"line_number":633,"context_line":""},{"line_number":634,"context_line":"    if count \u003e 0:"},{"line_number":635,"context_line":"        eventlet.spawn_n(arping)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a961159_ee8a4219","line":632,"in_reply_to":"3a961159_f8be8863","updated":"2015-01-12 23:02:41.000000000","message":"My threshold for code duplication is a bit higher.  Ping me and let me know what you come up with.  Eliminating code duplication in all cases sometimes leads to more difficult code.  But, I\u0027m willing to discuss the pros and cons.","commit_id":"5f5f1ab93bbd8411473b4511ee503f20df35a49e"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"1d897bc0a9b78349d15e9de7710108ac75048617","unresolved":false,"context_lines":[{"line_number":636,"context_line":"        _arping(ns_name, iface_name, address, count, root_helper)"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"    if count \u003e 0:"},{"line_number":639,"context_line":"        eventlet.spawn_n(arping)"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"def send_garp_for_proxyarp(ns_name, iface_name, address, count, root_helper):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_ce7ac3b9","line":639,"updated":"2015-01-13 19:17:59.000000000","message":"why not using:\n\n  eventlet.spawn_n(_arping, ns_name, iface_name, address, count, root_helper)","commit_id":"aedd6dec2bd6f10a613c89632554c49942cf64e0"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e3db6e619833bcaa60ee9cca784d004be4f1d2df","unresolved":false,"context_lines":[{"line_number":636,"context_line":"        _arping(ns_name, iface_name, address, count, root_helper)"},{"line_number":637,"context_line":""},{"line_number":638,"context_line":"    if count \u003e 0:"},{"line_number":639,"context_line":"        eventlet.spawn_n(arping)"},{"line_number":640,"context_line":""},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"def send_garp_for_proxyarp(ns_name, iface_name, address, count, root_helper):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_02873a13","line":639,"in_reply_to":"3a961159_ce7ac3b9","updated":"2015-01-13 21:30:02.000000000","message":"It is symmetrical with the other one.  The unit test uses a side_effect for spawn_n to test both versions pretty easily.  The symmetry helps the test.  It is not much different than your suggested way of doing it.","commit_id":"aedd6dec2bd6f10a613c89632554c49942cf64e0"},{"author":{"_account_id":8873,"name":"Assaf Muller","email":"amuller@redhat.com","username":"amuller"},"change_message_id":"4edb92b843d2927a40e3d6df8e76e4c53ae7c6da","unresolved":false,"context_lines":[{"line_number":647,"context_line":"    won\u0027t actually have the address configured.  We actually need to configure"},{"line_number":648,"context_line":"    the address on the interface and then remove it when the proxy arp has been"},{"line_number":649,"context_line":"    sent."},{"line_number":650,"context_line":"    \"\"\""},{"line_number":651,"context_line":"    def arping():"},{"line_number":652,"context_line":"        # Configure the address on the interface"},{"line_number":653,"context_line":"        device \u003d IPDevice(iface_name, root_helper, namespace\u003dns_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_2210bdaa","line":650,"updated":"2015-01-13 17:21:11.000000000","message":"Maybe \u0027arping_with_temporary_address\u0027","commit_id":"aedd6dec2bd6f10a613c89632554c49942cf64e0"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e3db6e619833bcaa60ee9cca784d004be4f1d2df","unresolved":false,"context_lines":[{"line_number":647,"context_line":"    won\u0027t actually have the address configured.  We actually need to configure"},{"line_number":648,"context_line":"    the address on the interface and then remove it when the proxy arp has been"},{"line_number":649,"context_line":"    sent."},{"line_number":650,"context_line":"    \"\"\""},{"line_number":651,"context_line":"    def arping():"},{"line_number":652,"context_line":"        # Configure the address on the interface"},{"line_number":653,"context_line":"        device \u003d IPDevice(iface_name, root_helper, namespace\u003dns_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_827a4a23","line":650,"in_reply_to":"3a961159_2210bdaa","updated":"2015-01-13 21:30:02.000000000","message":"Done","commit_id":"aedd6dec2bd6f10a613c89632554c49942cf64e0"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"1d897bc0a9b78349d15e9de7710108ac75048617","unresolved":false,"context_lines":[{"line_number":657,"context_line":"        _arping(ns_name, iface_name, address, count, root_helper)"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"        # Delete the address from the interface"},{"line_number":660,"context_line":"        device.addr.delete(net.version, str(net))"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"    if count \u003e 0:"},{"line_number":663,"context_line":"        eventlet.spawn_n(arping)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_0e33eb13","line":660,"updated":"2015-01-13 19:17:59.000000000","message":"imo, we should avoid defining complex functions in an other function as it makes unit test more difficult","commit_id":"aedd6dec2bd6f10a613c89632554c49942cf64e0"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e3db6e619833bcaa60ee9cca784d004be4f1d2df","unresolved":false,"context_lines":[{"line_number":657,"context_line":"        _arping(ns_name, iface_name, address, count, root_helper)"},{"line_number":658,"context_line":""},{"line_number":659,"context_line":"        # Delete the address from the interface"},{"line_number":660,"context_line":"        device.addr.delete(net.version, str(net))"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"    if count \u003e 0:"},{"line_number":663,"context_line":"        eventlet.spawn_n(arping)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_e2e06e28","line":660,"in_reply_to":"3a961159_0e33eb13","updated":"2015-01-13 21:30:02.000000000","message":"It was pretty easy to unit test this by mocking spawn_n.  Do you have an issue with the way I wrote the unit test?","commit_id":"aedd6dec2bd6f10a613c89632554c49942cf64e0"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"286a883dc986a92727389d85e9178a9e4d2986f9","unresolved":false,"context_lines":[{"line_number":651,"context_line":"    def arping_with_temporary_address():"},{"line_number":652,"context_line":"        # Configure the address on the interface"},{"line_number":653,"context_line":"        device \u003d IPDevice(iface_name, root_helper, namespace\u003dns_name)"},{"line_number":654,"context_line":"        net \u003d netaddr.IPNetwork(str(address) + \u0027/32\u0027)"},{"line_number":655,"context_line":"        device.addr.add(net.version, str(net), str(net.broadcast))"},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"        _arping(ns_name, iface_name, address, count, root_helper)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_83221eff","line":654,"updated":"2015-01-15 00:45:46.000000000","message":"too bad we lost the use of the constant here.","commit_id":"0a0fe811d54d35956596bff565de871e1ead99d7"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e785521d81c9797ec32fef85ace9c4471000a058","unresolved":false,"context_lines":[{"line_number":651,"context_line":"    def arping_with_temporary_address():"},{"line_number":652,"context_line":"        # Configure the address on the interface"},{"line_number":653,"context_line":"        device \u003d IPDevice(iface_name, root_helper, namespace\u003dns_name)"},{"line_number":654,"context_line":"        net \u003d netaddr.IPNetwork(str(address) + \u0027/32\u0027)"},{"line_number":655,"context_line":"        device.addr.add(net.version, str(net), str(net.broadcast))"},{"line_number":656,"context_line":""},{"line_number":657,"context_line":"        _arping(ns_name, iface_name, address, count, root_helper)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_3f7ed61b","line":654,"in_reply_to":"3a961159_83221eff","updated":"2015-01-15 05:45:00.000000000","message":"You\u0027re right.  A loose end I should have tied up.  It turns out appending the string is completely unnecessary.","commit_id":"0a0fe811d54d35956596bff565de871e1ead99d7"}],"neutron/tests/functional/agent/test_l3_agent.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d3098a22aec424a07655fea614850ad85e0e0f4e","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                          \u0027%s/external/pids\u0027 % temp_dir)"},{"line_number":89,"context_line":"        conf.set_override(\u0027host\u0027, host)"},{"line_number":90,"context_line":"        agent \u003d l3_test_agent.TestL3NATAgent(host, conf)"},{"line_number":91,"context_line":"        mock.patch.object(ip_lib, \u0027send_gratuitous_arp\u0027).start()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        return agent"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_759a4563","line":91,"updated":"2015-01-15 01:19:28.000000000","message":"Perhaps you need to mock","commit_id":"0a0fe811d54d35956596bff565de871e1ead99d7"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e785521d81c9797ec32fef85ace9c4471000a058","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                          \u0027%s/external/pids\u0027 % temp_dir)"},{"line_number":89,"context_line":"        conf.set_override(\u0027host\u0027, host)"},{"line_number":90,"context_line":"        agent \u003d l3_test_agent.TestL3NATAgent(host, conf)"},{"line_number":91,"context_line":"        mock.patch.object(ip_lib, \u0027send_gratuitous_arp\u0027).start()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        return agent"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_df64f2b4","line":91,"in_reply_to":"3a961159_759a4563","updated":"2015-01-15 05:45:00.000000000","message":"?","commit_id":"0a0fe811d54d35956596bff565de871e1ead99d7"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4d359b327a1a45c55018f78e042ec3d2003fabf7","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                          \u0027%s/external/pids\u0027 % temp_dir)"},{"line_number":89,"context_line":"        conf.set_override(\u0027host\u0027, host)"},{"line_number":90,"context_line":"        agent \u003d l3_test_agent.TestL3NATAgent(host, conf)"},{"line_number":91,"context_line":"        mock.patch.object(ip_lib, \u0027send_gratuitous_arp\u0027).start()"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        return agent"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_7a25cc08","line":91,"in_reply_to":"3a961159_df64f2b4","updated":"2015-01-15 06:24:52.000000000","message":"brainfart on the wrong file :)","commit_id":"0a0fe811d54d35956596bff565de871e1ead99d7"}],"neutron/tests/unit/test_l3_agent.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"286a883dc986a92727389d85e9178a9e4d2986f9","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        self.external_process \u003d self.external_process_p.start()"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        self.send_arp_p \u003d mock.patch("},{"line_number":206,"context_line":"            \u0027neutron.agent.linux.ip_lib.send_gratuitous_arp\u0027)"},{"line_number":207,"context_line":"        self.send_arp \u003d self.send_arp_p.start()"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        self.dvr_cls_p \u003d mock.patch(\u0027neutron.agent.linux.interface.NullDriver\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_23e40aa7","line":206,"updated":"2015-01-15 00:45:46.000000000","message":"I wish we could move away from using strings to express mocks. We could use actual imports and it would be a lot more effective. No action required on your part though.","commit_id":"0a0fe811d54d35956596bff565de871e1ead99d7"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"e1967c6d7a1625b2d9950f42b40e0608bcd27f34","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        self.external_process \u003d self.external_process_p.start()"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        self.send_arp_p \u003d mock.patch("},{"line_number":206,"context_line":"            \u0027neutron.agent.linux.ip_lib.send_gratuitous_arp\u0027)"},{"line_number":207,"context_line":"        self.send_arp \u003d self.send_arp_p.start()"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        self.dvr_cls_p \u003d mock.patch(\u0027neutron.agent.linux.interface.NullDriver\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_3a318459","line":206,"in_reply_to":"3a961159_1f0afad1","updated":"2015-01-15 06:23:28.000000000","message":"Don\u0027t thank me! Thank the CI that led us to it...otherwise we would have missed it!","commit_id":"0a0fe811d54d35956596bff565de871e1ead99d7"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"d3098a22aec424a07655fea614850ad85e0e0f4e","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        self.external_process \u003d self.external_process_p.start()"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        self.send_arp_p \u003d mock.patch("},{"line_number":206,"context_line":"            \u0027neutron.agent.linux.ip_lib.send_gratuitous_arp\u0027)"},{"line_number":207,"context_line":"        self.send_arp \u003d self.send_arp_p.start()"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        self.dvr_cls_p \u003d mock.patch(\u0027neutron.agent.linux.interface.NullDriver\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_557f09df","line":206,"in_reply_to":"3a961159_23e40aa7","updated":"2015-01-15 01:19:28.000000000","message":"I think you need to mock the proxyarp method too:\n\n        self.send_parp_p \u003d mock.patch(\n            \u0027neutron.agent.linux.ip_lib.send_garp_for_proxyarp\u0027)\n        self.send_parp \u003d self.send_parp_p.start()","commit_id":"0a0fe811d54d35956596bff565de871e1ead99d7"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e785521d81c9797ec32fef85ace9c4471000a058","unresolved":false,"context_lines":[{"line_number":203,"context_line":"        self.external_process \u003d self.external_process_p.start()"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"        self.send_arp_p \u003d mock.patch("},{"line_number":206,"context_line":"            \u0027neutron.agent.linux.ip_lib.send_gratuitous_arp\u0027)"},{"line_number":207,"context_line":"        self.send_arp \u003d self.send_arp_p.start()"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"        self.dvr_cls_p \u003d mock.patch(\u0027neutron.agent.linux.interface.NullDriver\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a961159_1f0afad1","line":206,"in_reply_to":"3a961159_557f09df","updated":"2015-01-15 05:45:00.000000000","message":"You\u0027re awesome, armax!  Good find.  Now that you point it out it seems so obvious yet I didn\u0027t figure it out.\n\nRegarding using strings to express mocks.  I agree with you.  However, changing it here brought inconsistency that seemed a bit out of place for this patch.","commit_id":"0a0fe811d54d35956596bff565de871e1ead99d7"}],"neutron/tests/unit/test_linux_ip_lib.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"1d897bc0a9b78349d15e9de7710108ac75048617","unresolved":false,"context_lines":[{"line_number":920,"context_line":""},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"class TestArpPing(TestIPCmdBase):"},{"line_number":923,"context_line":"    def _test_arping(self, function, address, spawn_n, IPWrapper):"},{"line_number":924,"context_line":"        spawn_n.side_effect \u003d lambda f: f()"},{"line_number":925,"context_line":"        function(mock.sentinel.ns_name,"},{"line_number":926,"context_line":"                 mock.sentinel.iface_name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_311f265d","line":923,"updated":"2015-01-13 19:17:59.000000000","message":"i would prefer \"ip_wrapper_class\" instead of IPWrapper","commit_id":"aedd6dec2bd6f10a613c89632554c49942cf64e0"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"8547fc9bd7b7111dc7aa8efffb728962a203cd19","unresolved":false,"context_lines":[{"line_number":920,"context_line":""},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"class TestArpPing(TestIPCmdBase):"},{"line_number":923,"context_line":"    def _test_arping(self, function, address, spawn_n, IPWrapper):"},{"line_number":924,"context_line":"        spawn_n.side_effect \u003d lambda f: f()"},{"line_number":925,"context_line":"        function(mock.sentinel.ns_name,"},{"line_number":926,"context_line":"                 mock.sentinel.iface_name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_3d345749","line":923,"in_reply_to":"3a961159_2207d6ca","updated":"2015-01-13 21:41:43.000000000","message":"\"IPWrapper\" is confusing as it\u0027s not (ip_lib.)IPWrapper and it doesn\u0027t follow python coding style (which implies in gerrit/eclipse invalid and confusing code colorization).","commit_id":"aedd6dec2bd6f10a613c89632554c49942cf64e0"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e3db6e619833bcaa60ee9cca784d004be4f1d2df","unresolved":false,"context_lines":[{"line_number":920,"context_line":""},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"class TestArpPing(TestIPCmdBase):"},{"line_number":923,"context_line":"    def _test_arping(self, function, address, spawn_n, IPWrapper):"},{"line_number":924,"context_line":"        spawn_n.side_effect \u003d lambda f: f()"},{"line_number":925,"context_line":"        function(mock.sentinel.ns_name,"},{"line_number":926,"context_line":"                 mock.sentinel.iface_name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_2207d6ca","line":923,"in_reply_to":"3a961159_311f265d","updated":"2015-01-13 21:30:02.000000000","message":"Why?  It isn\u0027t shadowing anything.  I tend to prefer IPWrapper because it helps me see that it is representing a class.  _class doesn\u0027t really do that for me.\n\nNeither ip_wrapper_class nor IPWrapper indicates that it is a mock.  Changing the name to indicate it is a mock is the only reason I could thinking of to use a different name.  But, the context just isn\u0027t that difficult to follow here.\n\nI\u0027m happy to hearing your reason for your preference and consider it.","commit_id":"aedd6dec2bd6f10a613c89632554c49942cf64e0"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"57cdbcc27bd05878177fa93975d7a1ad9a050d95","unresolved":false,"context_lines":[{"line_number":920,"context_line":""},{"line_number":921,"context_line":""},{"line_number":922,"context_line":"class TestArpPing(TestIPCmdBase):"},{"line_number":923,"context_line":"    def _test_arping(self, function, address, spawn_n, IPWrapper):"},{"line_number":924,"context_line":"        spawn_n.side_effect \u003d lambda f: f()"},{"line_number":925,"context_line":"        function(mock.sentinel.ns_name,"},{"line_number":926,"context_line":"                 mock.sentinel.iface_name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_66caaf6f","line":923,"in_reply_to":"3a961159_3d345749","updated":"2015-01-14 17:21:58.000000000","message":"It is meant to stand-in for ip_lib.IPWrapper.  I\u0027d prefer that it look for like IPWrapper than ip_wrapper_class.  How about changing it to something like mIPWrapper to indicate its role as a stand-in?","commit_id":"aedd6dec2bd6f10a613c89632554c49942cf64e0"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"1d897bc0a9b78349d15e9de7710108ac75048617","unresolved":false,"context_lines":[{"line_number":968,"context_line":"                                             mock.sentinel.root_helper,"},{"line_number":969,"context_line":"                                             namespace\u003dmock.sentinel.ns_name)"},{"line_number":970,"context_line":"            self.assertEqual([mock.call.add(4, address + \u0027/32\u0027, address)],"},{"line_number":971,"context_line":"                             device.addr.mock_calls)"},{"line_number":972,"context_line":"            device.addr.reset_mock()"},{"line_number":973,"context_line":""},{"line_number":974,"context_line":"        ip_wrapper.netns.execute.side_effect \u003d check_added_address"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_71660ef0","line":971,"updated":"2015-01-13 19:17:59.000000000","message":"the same is equivalent?\n\n  device.addr.add.assert_called_once_with(4, ...)","commit_id":"aedd6dec2bd6f10a613c89632554c49942cf64e0"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e3db6e619833bcaa60ee9cca784d004be4f1d2df","unresolved":false,"context_lines":[{"line_number":968,"context_line":"                                             mock.sentinel.root_helper,"},{"line_number":969,"context_line":"                                             namespace\u003dmock.sentinel.ns_name)"},{"line_number":970,"context_line":"            self.assertEqual([mock.call.add(4, address + \u0027/32\u0027, address)],"},{"line_number":971,"context_line":"                             device.addr.mock_calls)"},{"line_number":972,"context_line":"            device.addr.reset_mock()"},{"line_number":973,"context_line":""},{"line_number":974,"context_line":"        ip_wrapper.netns.execute.side_effect \u003d check_added_address"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_a244a619","line":971,"in_reply_to":"3a961159_71660ef0","updated":"2015-01-13 21:30:02.000000000","message":"It isn\u0027t equivalent.  This above also eliminates any other calls to device.addr.delete, for example.  But, I can change this to be more explicit about that.","commit_id":"aedd6dec2bd6f10a613c89632554c49942cf64e0"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"1d897bc0a9b78349d15e9de7710108ac75048617","unresolved":false,"context_lines":[{"line_number":980,"context_line":"        device \u003d IPDevice(mock.sentinel.iface_name,"},{"line_number":981,"context_line":"                          mock.sentinel.root_helper,"},{"line_number":982,"context_line":"                          namespace\u003dmock.sentinel.ns_name)"},{"line_number":983,"context_line":"        self.assertEqual([mock.call.delete(4, address + \u0027/32\u0027)],"},{"line_number":984,"context_line":"                         device.addr.mock_calls)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_b16076d0","line":983,"updated":"2015-01-13 19:17:59.000000000","message":"itto","commit_id":"aedd6dec2bd6f10a613c89632554c49942cf64e0"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"e3db6e619833bcaa60ee9cca784d004be4f1d2df","unresolved":false,"context_lines":[{"line_number":980,"context_line":"        device \u003d IPDevice(mock.sentinel.iface_name,"},{"line_number":981,"context_line":"                          mock.sentinel.root_helper,"},{"line_number":982,"context_line":"                          namespace\u003dmock.sentinel.ns_name)"},{"line_number":983,"context_line":"        self.assertEqual([mock.call.delete(4, address + \u0027/32\u0027)],"},{"line_number":984,"context_line":"                         device.addr.mock_calls)"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a961159_c25372e0","line":983,"in_reply_to":"3a961159_b16076d0","updated":"2015-01-13 21:30:02.000000000","message":"Done","commit_id":"aedd6dec2bd6f10a613c89632554c49942cf64e0"}]}
