)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"b6f43bf469c520af3753ebd052a472ffdfeb43b4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"9a061dce_48019037","updated":"2016-04-07 10:35:02.000000000","message":"Please follow https://wiki.openstack.org/wiki/GitCommitMessages#Summary_of_Git_commit_message_structure","commit_id":"435e43859fd01cb793676eab7576f05bddc821e9"}],"neutron/agent/l3/dvr_fip_ns.py":[{"author":{"_account_id":14852,"name":"QingchuanHao","email":"haoqingchuan@caicloud.io","username":"QingchuanHao"},"change_message_id":"3e9ef6c94259d40ff650f323e02b4eefb4db2e46","unresolved":false,"context_lines":[{"line_number":235,"context_line":"                                  ip_cidr, \u0027dev\u0027, interface_name])"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def _check_device_ip(self, interface_name, namespace, ip_cidr):"},{"line_number":238,"context_line":"        device \u003d ip_lib.IPDevice(interface_name, namespace)"},{"line_number":239,"context_line":"        existing_cidrs \u003d [add[\u0027cidr\u0027] for addr in device.addr.list()]"},{"line_number":240,"context_line":"        if ip_cidr in existing_cidrs:"},{"line_number":241,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a061dce_4e6cee9b","line":238,"range":{"start_line":238,"start_character":8,"end_line":238,"end_character":58},"updated":"2016-04-07 13:57:46.000000000","message":"To Fix: device \u003d ip_lib.IPDevice(interface_name,self.root_helper,namespace\u003dnamespace)","commit_id":"435e43859fd01cb793676eab7576f05bddc821e9"},{"author":{"_account_id":12237,"name":"Qijing Li","email":"qijing_li@symantec.com","username":"stack"},"change_message_id":"f89829f7128bd25b698647b1d6e7ece118f6a827","unresolved":false,"context_lines":[{"line_number":236,"context_line":""},{"line_number":237,"context_line":"    def _check_device_ip(self, interface_name, namespace, ip_cidr):"},{"line_number":238,"context_line":"        device \u003d ip_lib.IPDevice(interface_name, namespace)"},{"line_number":239,"context_line":"        existing_cidrs \u003d [add[\u0027cidr\u0027] for addr in device.addr.list()]"},{"line_number":240,"context_line":"        if ip_cidr in existing_cidrs:"},{"line_number":241,"context_line":"            return True"},{"line_number":242,"context_line":"        return False "}],"source_content_type":"text/x-python","patch_set":1,"id":"9a061dce_388801c5","line":239,"range":{"start_line":239,"start_character":29,"end_line":239,"end_character":31},"updated":"2016-04-06 20:14:46.000000000","message":"typo: add","commit_id":"435e43859fd01cb793676eab7576f05bddc821e9"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"b6f43bf469c520af3753ebd052a472ffdfeb43b4","unresolved":false,"context_lines":[{"line_number":259,"context_line":"            int_dev \u003d ip_wrapper.add_veth(rtr_2_fip_name,"},{"line_number":260,"context_line":"                                          fip_2_rtr_name,"},{"line_number":261,"context_line":"                                          fip_ns_name)"},{"line_number":262,"context_line":"        if self._check_device_ip(rtr_2_fip_name, ri.ns_name, str(rtr_2_fip)):"},{"line_number":263,"context_line":"            self._internal_ns_interface_added(str(rtr_2_fip),"},{"line_number":264,"context_line":"                                              rtr_2_fip_name,"},{"line_number":265,"context_line":"                                              ri.ns_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a061dce_098035f4","line":262,"range":{"start_line":262,"start_character":8,"end_line":262,"end_character":11},"updated":"2016-04-07 10:35:02.000000000","message":"if not self._check_device_ip?","commit_id":"435e43859fd01cb793676eab7576f05bddc821e9"},{"author":{"_account_id":14852,"name":"QingchuanHao","email":"haoqingchuan@caicloud.io","username":"QingchuanHao"},"change_message_id":"3e9ef6c94259d40ff650f323e02b4eefb4db2e46","unresolved":false,"context_lines":[{"line_number":259,"context_line":"            int_dev \u003d ip_wrapper.add_veth(rtr_2_fip_name,"},{"line_number":260,"context_line":"                                          fip_2_rtr_name,"},{"line_number":261,"context_line":"                                          fip_ns_name)"},{"line_number":262,"context_line":"        if self._check_device_ip(rtr_2_fip_name, ri.ns_name, str(rtr_2_fip)):"},{"line_number":263,"context_line":"            self._internal_ns_interface_added(str(rtr_2_fip),"},{"line_number":264,"context_line":"                                              rtr_2_fip_name,"},{"line_number":265,"context_line":"                                              ri.ns_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a061dce_6e3292a8","line":262,"range":{"start_line":262,"start_character":8,"end_line":262,"end_character":11},"in_reply_to":"9a061dce_098035f4","updated":"2016-04-07 13:57:46.000000000","message":"I will change it right now","commit_id":"435e43859fd01cb793676eab7576f05bddc821e9"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"b6f43bf469c520af3753ebd052a472ffdfeb43b4","unresolved":false,"context_lines":[{"line_number":263,"context_line":"            self._internal_ns_interface_added(str(rtr_2_fip),"},{"line_number":264,"context_line":"                                              rtr_2_fip_name,"},{"line_number":265,"context_line":"                                              ri.ns_name)"},{"line_number":266,"context_line":"        if self._check_device_ip(fip_2_rtr_name, fip_ns_name, str(fip_2_rtr)):"},{"line_number":267,"context_line":"            self._internal_ns_interface_added(str(fip_2_rtr),"},{"line_number":268,"context_line":"                                              fip_2_rtr_name,"},{"line_number":269,"context_line":"                                              fip_ns_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a061dce_294419b5","line":266,"range":{"start_line":266,"start_character":11,"end_line":266,"end_character":32},"updated":"2016-04-07 10:35:02.000000000","message":"Isn\u0027t it cheaper to forcibly recreate interfaces rather than adding more checks?","commit_id":"435e43859fd01cb793676eab7576f05bddc821e9"},{"author":{"_account_id":14852,"name":"QingchuanHao","email":"haoqingchuan@caicloud.io","username":"QingchuanHao"},"change_message_id":"3e9ef6c94259d40ff650f323e02b4eefb4db2e46","unresolved":false,"context_lines":[{"line_number":263,"context_line":"            self._internal_ns_interface_added(str(rtr_2_fip),"},{"line_number":264,"context_line":"                                              rtr_2_fip_name,"},{"line_number":265,"context_line":"                                              ri.ns_name)"},{"line_number":266,"context_line":"        if self._check_device_ip(fip_2_rtr_name, fip_ns_name, str(fip_2_rtr)):"},{"line_number":267,"context_line":"            self._internal_ns_interface_added(str(fip_2_rtr),"},{"line_number":268,"context_line":"                                              fip_2_rtr_name,"},{"line_number":269,"context_line":"                                              fip_ns_name)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a061dce_4e34eedc","line":266,"range":{"start_line":266,"start_character":11,"end_line":266,"end_character":32},"in_reply_to":"9a061dce_294419b5","updated":"2016-04-07 13:57:46.000000000","message":"Thank you for your comment. To recreate the interfaces will raise a \"File exists\" RuntimeError, which should also be taken into consideration.","commit_id":"435e43859fd01cb793676eab7576f05bddc821e9"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"baf0a423abe14fd5029021f19cbbb51e743403d9","unresolved":false,"context_lines":[{"line_number":237,"context_line":"    def _check_device_ip(self, interface_name, namespace, ip_cidr):"},{"line_number":238,"context_line":"        device \u003d ip_lib.IPDevice(interface_name, self.root_helper, namespace)"},{"line_number":239,"context_line":"        existing_cidrs \u003d [addr[\u0027cidr\u0027] for addr in device.addr.list()]"},{"line_number":240,"context_line":"        if ip_cidr in existing_cidrs:"},{"line_number":241,"context_line":"            return True"},{"line_number":242,"context_line":"        return False "},{"line_number":243,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_71f7fcd2","line":240,"range":{"start_line":240,"start_character":8,"end_line":240,"end_character":36},"updated":"2016-04-07 16:49:08.000000000","message":"nit:  You could easily replace these last four lines with this:\n\n  return ip_cidr in [addr[\u0027cidr\u0027] for addr in device.addr.list()]\n\nIMO, being unnecessarily explicit in code just makes it look more complex.  But, it isn\u0027t a big deal so I\u0027ll leave it up to you.  Actually, the variable \"existing_cidrs\" does add a little bit of readability.  So, maybe this:\n\n  existing_cidrs \u003d [addr[\u0027cidr\u0027] for addr in device.addr.list()]\n  return ip_cidr in existing_cidrs","commit_id":"47cf46cf8086a62b3d94e793b26e4328a7f90c70"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"2dd384811115ca69b7a584840d5d6c8f4f43fe7c","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        existing_cidrs \u003d [addr[\u0027cidr\u0027] for addr in device.addr.list()]"},{"line_number":240,"context_line":"        if ip_cidr in existing_cidrs:"},{"line_number":241,"context_line":"            return True"},{"line_number":242,"context_line":"        return False "},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def create_rtr_2_fip_link(self, ri):"},{"line_number":245,"context_line":"        \"\"\"Create interface between router and Floating IP namespace.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_c33d672c","line":242,"updated":"2016-04-07 15:31:49.000000000","message":"This looks like something good to add to ip_lib.py, right below device_exists_with_ips_and_mac()\n\ndef device_exists_with_ips(device_name, ip_cidrs, namespace\u003dNone):\n    ...","commit_id":"47cf46cf8086a62b3d94e793b26e4328a7f90c70"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"baf0a423abe14fd5029021f19cbbb51e743403d9","unresolved":false,"context_lines":[{"line_number":239,"context_line":"        existing_cidrs \u003d [addr[\u0027cidr\u0027] for addr in device.addr.list()]"},{"line_number":240,"context_line":"        if ip_cidr in existing_cidrs:"},{"line_number":241,"context_line":"            return True"},{"line_number":242,"context_line":"        return False "},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"    def create_rtr_2_fip_link(self, ri):"},{"line_number":245,"context_line":"        \"\"\"Create interface between router and Floating IP namespace.\"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_f152ec11","line":242,"in_reply_to":"9a061dce_c33d672c","updated":"2016-04-07 16:49:08.000000000","message":"nit:  Also, note the whitespace error.  It is likely the reason for the pep8 failure.","commit_id":"47cf46cf8086a62b3d94e793b26e4328a7f90c70"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"2dd384811115ca69b7a584840d5d6c8f4f43fe7c","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        if not self._check_device_ip(rtr_2_fip_name, ri.ns_name, str(rtr_2_fip)):"},{"line_number":263,"context_line":"            self._internal_ns_interface_added(str(rtr_2_fip),"},{"line_number":264,"context_line":"                                              rtr_2_fip_name,"},{"line_number":265,"context_line":"                                              ri.ns_name)"},{"line_number":266,"context_line":"        if not self._check_device_ip(fip_2_rtr_name, fip_ns_name, str(fip_2_rtr)):"},{"line_number":267,"context_line":"            self._internal_ns_interface_added(str(fip_2_rtr),"},{"line_number":268,"context_line":"                                              fip_2_rtr_name,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_1e6cd29a","line":265,"updated":"2016-04-07 15:31:49.000000000","message":"The other alternative is to not check the IP is there, but always call self._internal_ns_interface_added() and have it catch any exceptions.","commit_id":"47cf46cf8086a62b3d94e793b26e4328a7f90c70"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"baf0a423abe14fd5029021f19cbbb51e743403d9","unresolved":false,"context_lines":[{"line_number":262,"context_line":"        if not self._check_device_ip(rtr_2_fip_name, ri.ns_name, str(rtr_2_fip)):"},{"line_number":263,"context_line":"            self._internal_ns_interface_added(str(rtr_2_fip),"},{"line_number":264,"context_line":"                                              rtr_2_fip_name,"},{"line_number":265,"context_line":"                                              ri.ns_name)"},{"line_number":266,"context_line":"        if not self._check_device_ip(fip_2_rtr_name, fip_ns_name, str(fip_2_rtr)):"},{"line_number":267,"context_line":"            self._internal_ns_interface_added(str(fip_2_rtr),"},{"line_number":268,"context_line":"                                              fip_2_rtr_name,"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_d1c36836","line":265,"in_reply_to":"9a061dce_1e6cd29a","updated":"2016-04-07 16:49:08.000000000","message":"++ I like the pattern Brian suggests better.","commit_id":"47cf46cf8086a62b3d94e793b26e4328a7f90c70"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"2dd384811115ca69b7a584840d5d6c8f4f43fe7c","unresolved":false,"context_lines":[{"line_number":277,"context_line":"            rtr_2_fip_device.link.set_mtu(mtu)"},{"line_number":278,"context_line":"            fip_2_rtr_device.link.set_mtu(mtu)"},{"line_number":279,"context_line":"        rtr_2_fip_device.link.set_up()"},{"line_number":280,"context_line":"        fip_2_rtr_device.link.set_up()"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"        # add default route for the link local interface"},{"line_number":283,"context_line":"        rtr_2_fip_device.route.add_gateway(str(fip_2_rtr.ip), table\u003dFIP_RT_TBL)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a061dce_9ea46208","line":280,"updated":"2016-04-07 15:31:49.000000000","message":"The MTU should only need to be set once, at device creation time.  So these should stay as they were, but move after L261 inside the device creation \u0027if\u0027.","commit_id":"47cf46cf8086a62b3d94e793b26e4328a7f90c70"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"baa361ac8f25ce5f3a0d0505ecb4599ca3a49657","unresolved":false,"context_lines":[{"line_number":232,"context_line":"    def _add_cidr_to_fip_device(self, device, ip_cidr):"},{"line_number":233,"context_line":"        IP_EXISTS \u003d \u0027RTNETLINK answers: File exists\u0027"},{"line_number":234,"context_line":"        try:"},{"line_number":235,"context_line":"            device.addr.add(ip_cidr)"},{"line_number":236,"context_line":"        except RuntimeError as rte:"},{"line_number":237,"context_line":"            with excutils.save_and_reraise_exception() as ctx:"},{"line_number":238,"context_line":"                if IP_EXISTS in str(rte):"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a18252c_263e1b28","line":235,"updated":"2016-04-14 15:52:16.000000000","message":"I think this is causing the failure.  The ip_lib code adds \"brd $IP\" when creating the interface, and the subsequent add_gateway() call on L274 is trying to assign that broadcast address as the default route.\n\nI\u0027m going to tweak ip_lib to have an \"add broadcast\" option that defaults to True to see if that fixes it.","commit_id":"85516a658f72cdebd8cf27684e0058635f0614ca"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"cb623cadd46484ed370ce2ee8a0f6fc51af22e07","unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def _add_cidr_to_fip_device(self, device, ip_cidr):"},{"line_number":233,"context_line":"        IP_EXISTS \u003d \u0027RTNETLINK answers: File exists\u0027"},{"line_number":234,"context_line":"        try:"},{"line_number":235,"context_line":"            device.addr.add(ip_cidr, add_broadcast\u003dFalse)"},{"line_number":236,"context_line":"        except RuntimeError as rte:"},{"line_number":237,"context_line":"            with excutils.save_and_reraise_exception() as ctx:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_17dceb71","line":234,"updated":"2016-04-14 16:31:12.000000000","message":"Instead of always adding the address to the interface and then checking for the error message.\nWill it be ok to first check if the device has an ip address and if not try to add one.","commit_id":"5485668c3e5cb97c6a28251835526a2bcf349ee9"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8fec2c70fc1befc3244685e31d55dc7a623e6e53","unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def _add_cidr_to_fip_device(self, device, ip_cidr):"},{"line_number":233,"context_line":"        IP_EXISTS \u003d \u0027RTNETLINK answers: File exists\u0027"},{"line_number":234,"context_line":"        try:"},{"line_number":235,"context_line":"            device.addr.add(ip_cidr, add_broadcast\u003dFalse)"},{"line_number":236,"context_line":"        except RuntimeError as rte:"},{"line_number":237,"context_line":"            with excutils.save_and_reraise_exception() as ctx:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_c782aac7","line":234,"in_reply_to":"5a18252c_14b33bea","updated":"2016-04-15 02:05:37.000000000","message":"Yes, I\u0027ve been tending to follow the try/except logic here, since it also avoids a rootwrap/iproute call.  The only downside is when the error string is too generic to know we have the right failure.  Since I\u0027ll be re-factoring for the below I\u0027ll try and change this since it\u0027s probably a rare event anyways, so the second /sbin/ip call won\u0027t happen.","commit_id":"5485668c3e5cb97c6a28251835526a2bcf349ee9"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"1128dc967948566c1af9e8be09803305d5379786","unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def _add_cidr_to_fip_device(self, device, ip_cidr):"},{"line_number":233,"context_line":"        IP_EXISTS \u003d \u0027RTNETLINK answers: File exists\u0027"},{"line_number":234,"context_line":"        try:"},{"line_number":235,"context_line":"            device.addr.add(ip_cidr, add_broadcast\u003dFalse)"},{"line_number":236,"context_line":"        except RuntimeError as rte:"},{"line_number":237,"context_line":"            with excutils.save_and_reraise_exception() as ctx:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_a01b25c9","line":234,"in_reply_to":"5a18252c_17dceb71","updated":"2016-04-14 19:14:51.000000000","message":"I think we could add a:\n\nif not device.addr.list(to\u003dip_cidr):\n\ninstead of the try/except\n\nAnyone else have a preference?","commit_id":"5485668c3e5cb97c6a28251835526a2bcf349ee9"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"636f24ec8f559769e19e5427e86c72f0cfc55418","unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def _add_cidr_to_fip_device(self, device, ip_cidr):"},{"line_number":233,"context_line":"        IP_EXISTS \u003d \u0027RTNETLINK answers: File exists\u0027"},{"line_number":234,"context_line":"        try:"},{"line_number":235,"context_line":"            device.addr.add(ip_cidr, add_broadcast\u003dFalse)"},{"line_number":236,"context_line":"        except RuntimeError as rte:"},{"line_number":237,"context_line":"            with excutils.save_and_reraise_exception() as ctx:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_14b33bea","line":234,"in_reply_to":"5a18252c_43585b8a","updated":"2016-04-14 20:54:01.000000000","message":"I don\u0027t mind the try / except.  I strongly prefer it as a general pattern over a check-and-set pattern.  The latter tends to introduce races in to the code where conditions can change after the check and still cause the set to fail anyway.\n\nHowever, Brian\u0027s suggestion seems to also avoid a race condition.  I haven\u0027t looked at the details of the call but the pattern is effectively equivalent to try / except in these respects.  So, I don\u0027t have an objection to that.  I just don\u0027t think it needs to change.","commit_id":"5485668c3e5cb97c6a28251835526a2bcf349ee9"},{"author":{"_account_id":12237,"name":"Qijing Li","email":"qijing_li@symantec.com","username":"stack"},"change_message_id":"fb0d7d7c79ed371f1605c382370c07cc6aaa31d5","unresolved":false,"context_lines":[{"line_number":231,"context_line":""},{"line_number":232,"context_line":"    def _add_cidr_to_fip_device(self, device, ip_cidr):"},{"line_number":233,"context_line":"        IP_EXISTS \u003d \u0027RTNETLINK answers: File exists\u0027"},{"line_number":234,"context_line":"        try:"},{"line_number":235,"context_line":"            device.addr.add(ip_cidr, add_broadcast\u003dFalse)"},{"line_number":236,"context_line":"        except RuntimeError as rte:"},{"line_number":237,"context_line":"            with excutils.save_and_reraise_exception() as ctx:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_43585b8a","line":234,"in_reply_to":"5a18252c_a01b25c9","updated":"2016-04-14 19:41:06.000000000","message":"vote +1 for \"if not device.add.list(to\u003dip_cidr):\"","commit_id":"5485668c3e5cb97c6a28251835526a2bcf349ee9"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"131b0f35d55dc60cda8734c3c33a7cb9f1ca7820","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        if ri.rtr_fip_subnet is None:"},{"line_number":252,"context_line":"            ri.rtr_fip_subnet \u003d self.local_subnets.allocate(ri.router_id)"},{"line_number":253,"context_line":"        rtr_2_fip, fip_2_rtr \u003d ri.rtr_fip_subnet.get_pair()"},{"line_number":254,"context_line":"        rtr_2_fip_dev \u003d ip_lib.IPDevice(rtr_2_fip_name, namespace\u003dri.ns_name)"},{"line_number":255,"context_line":"        fip_2_rtr_dev \u003d ip_lib.IPDevice(fip_2_rtr_name, namespace\u003dfip_ns_name)"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if not rtr_2_fip_dev.exists():"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_0ff682f8","line":254,"range":{"start_line":254,"start_character":8,"end_line":254,"end_character":21},"updated":"2016-04-14 21:10:05.000000000","message":"It looks like you\u0027ve done some refactoring here to set up these two IPDevice instances up front to use them throughout.  See our documented best practices about this [1].  Would you mind submitting a pure refactor \n\n [1] http://docs.openstack.org/developer/neutron/devref/effective_neutron.html#scoping-your-patch-appropriately","commit_id":"5485668c3e5cb97c6a28251835526a2bcf349ee9"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"8fec2c70fc1befc3244685e31d55dc7a623e6e53","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        if ri.rtr_fip_subnet is None:"},{"line_number":252,"context_line":"            ri.rtr_fip_subnet \u003d self.local_subnets.allocate(ri.router_id)"},{"line_number":253,"context_line":"        rtr_2_fip, fip_2_rtr \u003d ri.rtr_fip_subnet.get_pair()"},{"line_number":254,"context_line":"        rtr_2_fip_dev \u003d ip_lib.IPDevice(rtr_2_fip_name, namespace\u003dri.ns_name)"},{"line_number":255,"context_line":"        fip_2_rtr_dev \u003d ip_lib.IPDevice(fip_2_rtr_name, namespace\u003dfip_ns_name)"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        if not rtr_2_fip_dev.exists():"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_47c4da3e","line":254,"range":{"start_line":254,"start_character":8,"end_line":254,"end_character":21},"in_reply_to":"5a18252c_0ff682f8","updated":"2016-04-15 02:05:37.000000000","message":"Right, I did this once I moved L270-271 out from under the \u0027if\u0027 since we needed them to try and add the IP addresses.  I can create a set-up patch for some of it.","commit_id":"5485668c3e5cb97c6a28251835526a2bcf349ee9"}]}
