)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9970,"name":"John Kasperski","email":"jckasper@linux.vnet.ibm.com","username":"jckasper"},"change_message_id":"63884a6306fa8f94b1f45b37ea239344d936c328","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Neil Jerram \u003cNeil.Jerram@metaswitch.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-07-27 16:23:03 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"ip_lib: support creating Linux dummy interface"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I5485c187bc44bac3c2942c4fc9e5a502912a81a2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3a50d1a3_bee387d8","line":7,"updated":"2015-07-28 04:05:00.000000000","message":"bug # or blueprint # ?","commit_id":"90df8a6821355e7e2ccb4ff59f1c0996030909ad"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"4f9adea25a43c37c1c24ffa858dbdb7873df59b7","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Neil Jerram \u003cNeil.Jerram@metaswitch.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2015-07-27 16:23:03 +0100"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"ip_lib: support creating Linux dummy interface"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I5485c187bc44bac3c2942c4fc9e5a502912a81a2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3a50d1a3_3853076d","line":7,"in_reply_to":"3a50d1a3_bee387d8","updated":"2015-07-28 07:59:44.000000000","message":"Will do.","commit_id":"90df8a6821355e7e2ccb4ff59f1c0996030909ad"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"290dd40d04987aed36c278780c3284386312fafb","unresolved":false,"context_lines":[{"line_number":13,"context_line":"interface (in conjunction with use of Dnsmasq\u0027s --bridge-interface"},{"line_number":14,"context_line":"feature) is suitable for that purpose."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Partial-Bug: #1472704"},{"line_number":17,"context_line":"Change-Id: I5485c187bc44bac3c2942c4fc9e5a502912a81a2"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"fa1b9901_c1833855","line":16,"updated":"2015-08-19 02:36:20.000000000","message":"This bug does not mention dummy interfaces and states that the work has been moved to plugin project.  Should we not reference a bug to add support for dummy interfaces?","commit_id":"4bae8fadde73c17d31ac33744d342dfd40a60417"}],"neutron/agent/linux/ip_lib.py":[{"author":{"_account_id":9970,"name":"John Kasperski","email":"jckasper@linux.vnet.ibm.com","username":"jckasper"},"change_message_id":"63884a6306fa8f94b1f45b37ea239344d936c328","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        \"\"\"Delete a virtual interface between two namespaces.\"\"\""},{"line_number":153,"context_line":"        self._as_root([], \u0027link\u0027, (\u0027del\u0027, name))"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def add_dummy(self, name):"},{"line_number":156,"context_line":"        \"\"\"Create a Linux dummy interface with the given name.\"\"\""},{"line_number":157,"context_line":"        args \u003d [\u0027add\u0027, name, \u0027type\u0027, \u0027dummy\u0027]"},{"line_number":158,"context_line":"        self._as_root(\u0027\u0027, \u0027link\u0027, tuple(args))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_febeefac","line":155,"updated":"2015-07-28 04:05:00.000000000","message":"Unclear what the dummy is here.  :-)   How about:  add_dummy_interface()  instead.\n\nMaybe it is just me, but I don\u0027t care for the term \"dummy\".  Can we come up with a more descriptive term:   fake, mock, temporary, pseudo, no-op, null .. something ?","commit_id":"90df8a6821355e7e2ccb4ff59f1c0996030909ad"},{"author":{"_account_id":9970,"name":"John Kasperski","email":"jckasper@linux.vnet.ibm.com","username":"jckasper"},"change_message_id":"9b727fb6c626276f260630cb3eab68c20f4fafab","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        \"\"\"Delete a virtual interface between two namespaces.\"\"\""},{"line_number":153,"context_line":"        self._as_root([], \u0027link\u0027, (\u0027del\u0027, name))"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def add_dummy(self, name):"},{"line_number":156,"context_line":"        \"\"\"Create a Linux dummy interface with the given name.\"\"\""},{"line_number":157,"context_line":"        args \u003d [\u0027add\u0027, name, \u0027type\u0027, \u0027dummy\u0027]"},{"line_number":158,"context_line":"        self._as_root(\u0027\u0027, \u0027link\u0027, tuple(args))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_9a0a1a1f","line":155,"in_reply_to":"3a50d1a3_785c2f7d","updated":"2015-07-29 04:12:15.000000000","message":"Didn\u0027t realize that.  Ok.","commit_id":"90df8a6821355e7e2ccb4ff59f1c0996030909ad"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"4f9adea25a43c37c1c24ffa858dbdb7873df59b7","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        \"\"\"Delete a virtual interface between two namespaces.\"\"\""},{"line_number":153,"context_line":"        self._as_root([], \u0027link\u0027, (\u0027del\u0027, name))"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def add_dummy(self, name):"},{"line_number":156,"context_line":"        \"\"\"Create a Linux dummy interface with the given name.\"\"\""},{"line_number":157,"context_line":"        args \u003d [\u0027add\u0027, name, \u0027type\u0027, \u0027dummy\u0027]"},{"line_number":158,"context_line":"        self._as_root(\u0027\u0027, \u0027link\u0027, tuple(args))"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a50d1a3_785c2f7d","line":155,"in_reply_to":"3a50d1a3_febeefac","updated":"2015-07-28 07:59:44.000000000","message":"\u0027dummy\u0027 is Linux\u0027s own name for this type of interface, so surely it would be confusing to call it something else?\n\nAlso, \u0027add_dummy\u0027, rather than \u0027add_dummy_interface\u0027, is consistent with the code above using \u0027add_veth\u0027 rather than \u0027add_veth_interface\u0027.","commit_id":"90df8a6821355e7e2ccb4ff59f1c0996030909ad"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f972aeb870330ca7b109b4904d336b0a8fb19934","unresolved":false,"context_lines":[{"line_number":155,"context_line":"    def add_dummy(self, name):"},{"line_number":156,"context_line":"        \"\"\"Create a Linux dummy interface with the given name.\"\"\""},{"line_number":157,"context_line":"        args \u003d [\u0027add\u0027, name, \u0027type\u0027, \u0027dummy\u0027]"},{"line_number":158,"context_line":"        self._as_root(\u0027\u0027, \u0027link\u0027, tuple(args))"},{"line_number":159,"context_line":"        return IPDevice(name, self.namespace)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def ensure_namespace(self, name):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_dbd854f2","line":158,"updated":"2015-08-04 02:48:10.000000000","message":"For consistency this should be like add_tuntap():\n\nself._as_root([], \u0027link\u0027, (\u0027add\u0027, name, \u0027type\u0027, \u0027dummy\u0027))","commit_id":"cf60983cf53aa0690e439c2fe131abc887045314"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3d5b6e779965881bf5b02a304dce29047bb09967","unresolved":false,"context_lines":[{"line_number":155,"context_line":"    def add_dummy(self, name):"},{"line_number":156,"context_line":"        \"\"\"Create a Linux dummy interface with the given name.\"\"\""},{"line_number":157,"context_line":"        args \u003d [\u0027add\u0027, name, \u0027type\u0027, \u0027dummy\u0027]"},{"line_number":158,"context_line":"        self._as_root(\u0027\u0027, \u0027link\u0027, tuple(args))"},{"line_number":159,"context_line":"        return IPDevice(name, self.namespace)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def ensure_namespace(self, name):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_b65a1e4f","line":158,"in_reply_to":"1a4dcd0f_dbd854f2","updated":"2015-08-04 14:07:58.000000000","message":"Done","commit_id":"cf60983cf53aa0690e439c2fe131abc887045314"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"f972aeb870330ca7b109b4904d336b0a8fb19934","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        \"\"\"Create a Linux dummy interface with the given name.\"\"\""},{"line_number":157,"context_line":"        args \u003d [\u0027add\u0027, name, \u0027type\u0027, \u0027dummy\u0027]"},{"line_number":158,"context_line":"        self._as_root(\u0027\u0027, \u0027link\u0027, tuple(args))"},{"line_number":159,"context_line":"        return IPDevice(name, self.namespace)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def ensure_namespace(self, name):"},{"line_number":162,"context_line":"        if not self.netns.exists(name):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_1ba47c55","line":159,"updated":"2015-08-04 02:48:10.000000000","message":"Please use a keyword argument here, namespace\u003dself.namespace","commit_id":"cf60983cf53aa0690e439c2fe131abc887045314"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"3d5b6e779965881bf5b02a304dce29047bb09967","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        \"\"\"Create a Linux dummy interface with the given name.\"\"\""},{"line_number":157,"context_line":"        args \u003d [\u0027add\u0027, name, \u0027type\u0027, \u0027dummy\u0027]"},{"line_number":158,"context_line":"        self._as_root(\u0027\u0027, \u0027link\u0027, tuple(args))"},{"line_number":159,"context_line":"        return IPDevice(name, self.namespace)"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def ensure_namespace(self, name):"},{"line_number":162,"context_line":"        if not self.netns.exists(name):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a4dcd0f_76549620","line":159,"in_reply_to":"1a4dcd0f_1ba47c55","updated":"2015-08-04 14:07:58.000000000","message":"Done","commit_id":"cf60983cf53aa0690e439c2fe131abc887045314"}],"neutron/tests/functional/agent/linux/test_ip_lib.py":[{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"50b8896d95d5c6326c29ff024b6c0c55e06ed8af","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    def _check_for_device_name(self, ip, name, should_exist):"},{"line_number":169,"context_line":"        devices \u003d [d for d in ip.get_devices()"},{"line_number":170,"context_line":"                   if d.name \u003d\u003d name]"},{"line_number":171,"context_line":"        self.assertEqual(len(devices), (1 if should_exist else 0))"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def test_dummy_exists(self):"},{"line_number":174,"context_line":"        attr \u003d self.generate_device_details()"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a4dcd0f_ecb42936","line":171,"updated":"2015-08-11 09:43:32.000000000","message":"the following seems better:\n\n exist \u003d any(d for d in ip.get_devices() if d.name \u003d\u003d name)\n self.assertEqual(should_exist, exist)","commit_id":"037fad9b850fa7244da3f7c491fb7af0ba67271a"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"ec723924eb845929f38ea247a4b633d496d90449","unresolved":false,"context_lines":[{"line_number":168,"context_line":"    def _check_for_device_name(self, ip, name, should_exist):"},{"line_number":169,"context_line":"        devices \u003d [d for d in ip.get_devices()"},{"line_number":170,"context_line":"                   if d.name \u003d\u003d name]"},{"line_number":171,"context_line":"        self.assertEqual(len(devices), (1 if should_exist else 0))"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def test_dummy_exists(self):"},{"line_number":174,"context_line":"        attr \u003d self.generate_device_details()"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_f0e1bdff","line":171,"in_reply_to":"1a4dcd0f_ecb42936","updated":"2015-08-17 15:16:27.000000000","message":"Agreed, thanks.","commit_id":"037fad9b850fa7244da3f7c491fb7af0ba67271a"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"50b8896d95d5c6326c29ff024b6c0c55e06ed8af","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        self.assertEqual(len(devices), (1 if should_exist else 0))"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def test_dummy_exists(self):"},{"line_number":174,"context_line":"        attr \u003d self.generate_device_details()"},{"line_number":175,"context_line":"        ip \u003d ip_lib.IPWrapper(namespace\u003dattr.namespace)"},{"line_number":176,"context_line":"        ip.netns.add(attr.namespace)"},{"line_number":177,"context_line":"        self.addCleanup(ip.netns.delete, attr.namespace)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a4dcd0f_6c12590b","line":174,"updated":"2015-08-11 09:43:32.000000000","message":"seems overkill to call generate_device_details()","commit_id":"037fad9b850fa7244da3f7c491fb7af0ba67271a"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"ec723924eb845929f38ea247a4b633d496d90449","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        self.assertEqual(len(devices), (1 if should_exist else 0))"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def test_dummy_exists(self):"},{"line_number":174,"context_line":"        attr \u003d self.generate_device_details()"},{"line_number":175,"context_line":"        ip \u003d ip_lib.IPWrapper(namespace\u003dattr.namespace)"},{"line_number":176,"context_line":"        ip.netns.add(attr.namespace)"},{"line_number":177,"context_line":"        self.addCleanup(ip.netns.delete, attr.namespace)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_2bf34675","line":174,"in_reply_to":"1a4dcd0f_6c12590b","updated":"2015-08-17 15:16:27.000000000","message":"OK...","commit_id":"037fad9b850fa7244da3f7c491fb7af0ba67271a"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"50b8896d95d5c6326c29ff024b6c0c55e06ed8af","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def test_dummy_exists(self):"},{"line_number":174,"context_line":"        attr \u003d self.generate_device_details()"},{"line_number":175,"context_line":"        ip \u003d ip_lib.IPWrapper(namespace\u003dattr.namespace)"},{"line_number":176,"context_line":"        ip.netns.add(attr.namespace)"},{"line_number":177,"context_line":"        self.addCleanup(ip.netns.delete, attr.namespace)"},{"line_number":178,"context_line":"        device \u003d ip.add_dummy(attr.name, 9999)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a4dcd0f_ecb98916","line":175,"updated":"2015-08-11 09:43:32.000000000","message":"prefer:\n\n  namespace \u003d self.useFixture(net_helper.NamespaceFixture()).namespace\n  name \u003d base.get_rand_name()","commit_id":"037fad9b850fa7244da3f7c491fb7af0ba67271a"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"ec723924eb845929f38ea247a4b633d496d90449","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def test_dummy_exists(self):"},{"line_number":174,"context_line":"        attr \u003d self.generate_device_details()"},{"line_number":175,"context_line":"        ip \u003d ip_lib.IPWrapper(namespace\u003dattr.namespace)"},{"line_number":176,"context_line":"        ip.netns.add(attr.namespace)"},{"line_number":177,"context_line":"        self.addCleanup(ip.netns.delete, attr.namespace)"},{"line_number":178,"context_line":"        device \u003d ip.add_dummy(attr.name, 9999)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_abff5633","line":175,"in_reply_to":"1a4dcd0f_ecb98916","updated":"2015-08-17 15:16:27.000000000","message":"Thanks.  I don\u0027t believe that\u0027s correct in detail (because I also need the IP wrapper), but I think I see your point, and will reflect this in next upload.","commit_id":"037fad9b850fa7244da3f7c491fb7af0ba67271a"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"50b8896d95d5c6326c29ff024b6c0c55e06ed8af","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        ip \u003d ip_lib.IPWrapper(namespace\u003dattr.namespace)"},{"line_number":176,"context_line":"        ip.netns.add(attr.namespace)"},{"line_number":177,"context_line":"        self.addCleanup(ip.netns.delete, attr.namespace)"},{"line_number":178,"context_line":"        device \u003d ip.add_dummy(attr.name, 9999)"},{"line_number":179,"context_line":"        self.addCleanup(self._safe_delete_device, device)"},{"line_number":180,"context_line":"        self._check_for_device_name(ip, attr.name, True)"},{"line_number":181,"context_line":"        device.link.delete()"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a4dcd0f_acece129","line":178,"updated":"2015-08-11 09:43:32.000000000","message":"device \u003d ip.add_dummy(attr.name)","commit_id":"037fad9b850fa7244da3f7c491fb7af0ba67271a"},{"author":{"_account_id":13734,"name":"Nell Jerram","email":"nell@tigera.io","username":"neiljerram"},"change_message_id":"ec723924eb845929f38ea247a4b633d496d90449","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        ip \u003d ip_lib.IPWrapper(namespace\u003dattr.namespace)"},{"line_number":176,"context_line":"        ip.netns.add(attr.namespace)"},{"line_number":177,"context_line":"        self.addCleanup(ip.netns.delete, attr.namespace)"},{"line_number":178,"context_line":"        device \u003d ip.add_dummy(attr.name, 9999)"},{"line_number":179,"context_line":"        self.addCleanup(self._safe_delete_device, device)"},{"line_number":180,"context_line":"        self._check_for_device_name(ip, attr.name, True)"},{"line_number":181,"context_line":"        device.link.delete()"}],"source_content_type":"text/x-python","patch_set":8,"id":"fa1b9901_f0b8dde7","line":178,"in_reply_to":"1a4dcd0f_acece129","updated":"2015-08-17 15:16:27.000000000","message":"Done","commit_id":"037fad9b850fa7244da3f7c491fb7af0ba67271a"}]}
