)]}'
{"neutron/agent/l3/ha_router.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"ac9c36b05a6564bd1b9abc0bb30ab455e1d4b12b","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        if self.router.get(\u0027_ha_state\u0027) \u003d\u003d \u0027active\u0027:"},{"line_number":103,"context_line":"            return \u0027master\u0027"},{"line_number":104,"context_line":"        else:"},{"line_number":105,"context_line":"            return \"backup\""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def initialize(self, process_monitor):"},{"line_number":108,"context_line":"        super(HaRouter, self).initialize(process_monitor)"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_e4cd3386","line":105,"updated":"2017-02-15 02:16:22.000000000","message":"super nit: this one uses \" instead of \u0027\n\nAnd in a follow-up we really should make constants out of these strings","commit_id":"23efd39f70387445211e1454243f331a2b5bbc61"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"24f2d0225e1104aced05418ac03f41af7a9fa068","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        if self.router.get(\u0027_ha_state\u0027) \u003d\u003d \u0027active\u0027:"},{"line_number":103,"context_line":"            return \u0027master\u0027"},{"line_number":104,"context_line":"        else:"},{"line_number":105,"context_line":"            return \"backup\""},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def initialize(self, process_monitor):"},{"line_number":108,"context_line":"        super(HaRouter, self).initialize(process_monitor)"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_d81c396c","line":105,"in_reply_to":"fa31d9ce_e4cd3386","updated":"2017-02-15 17:58:28.000000000","message":"I was looking for constants for them, and didn\u0027t find them during development. I agree with you that constants should be defined for them with a follow-up","commit_id":"23efd39f70387445211e1454243f331a2b5bbc61"}],"neutron/agent/l3/router_info.py":[{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"7d40b343505be2f9ca4fa5473d88643aa5a68007","unresolved":false,"context_lines":[{"line_number":554,"context_line":"                    self.agent.pd.disable_subnet(self.router_id, subnet[\u0027id\u0027])"},{"line_number":555,"context_line":"                    del self.pd_subnets[subnet[\u0027id\u0027]]"},{"line_number":556,"context_line":""},{"line_number":557,"context_line":"        print updated_ports"},{"line_number":558,"context_line":"        updated_cidrs \u003d []"},{"line_number":559,"context_line":"        if updated_ports:"},{"line_number":560,"context_line":"            for index, p in enumerate(internal_ports):"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa31d9ce_b2ed88b9","line":557,"range":{"start_line":557,"start_character":14,"end_line":557,"end_character":27},"updated":"2017-02-17 15:04:31.000000000","message":"without using update_router in the tests, updated_ports will be always [] in those unit tests.\n\nI added it here just for illustration. Will remove in follow-up revision.","commit_id":"0b3c9fdb24876799892bd4cb82726457f608a11f"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"7d40b343505be2f9ca4fa5473d88643aa5a68007","unresolved":false,"context_lines":[{"line_number":583,"context_line":"                                                           old_prefix,"},{"line_number":584,"context_line":"                                                           updated_cidrs)"},{"line_number":585,"context_line":"                            self.pd_subnets[subnet[\u0027id\u0027]] \u003d subnet[\u0027cidr\u0027]"},{"line_number":586,"context_line":"                            enable_ra \u003d True"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"        # Enable RA"},{"line_number":589,"context_line":"        if enable_ra:"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa31d9ce_52028c3f","line":586,"range":{"start_line":586,"start_character":40,"end_line":586,"end_character":44},"updated":"2017-02-17 15:04:31.000000000","message":"code from 572 to 586 could be incorporated at 559. updated_ports should be identical to set(current_port_ids) \u0026 set(existing_port_ids). I was trying to address that in one of my abandoned patch.","commit_id":"0b3c9fdb24876799892bd4cb82726457f608a11f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"09a7f549562f2c15baf0ec5e28e808d7ea4ee741","unresolved":false,"context_lines":[{"line_number":583,"context_line":"                                                           old_prefix,"},{"line_number":584,"context_line":"                                                           updated_cidrs)"},{"line_number":585,"context_line":"                            self.pd_subnets[subnet[\u0027id\u0027]] \u003d subnet[\u0027cidr\u0027]"},{"line_number":586,"context_line":"                            enable_ra \u003d True"},{"line_number":587,"context_line":""},{"line_number":588,"context_line":"        # Enable RA"},{"line_number":589,"context_line":"        if enable_ra:"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa31d9ce_8635a2dc","line":586,"range":{"start_line":586,"start_character":40,"end_line":586,"end_character":44},"in_reply_to":"fa31d9ce_52028c3f","updated":"2017-02-17 15:54:36.000000000","message":"Maybe you can address that in a follow-up.","commit_id":"0b3c9fdb24876799892bd4cb82726457f608a11f"}],"neutron/agent/linux/dibbler.py":[{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c994b76f7d82995c04851332646631b836dc55a8","unresolved":false,"context_lines":[{"line_number":52,"context_line":"bind-to-address {{ bind_address }}"},{"line_number":53,"context_line":"# ask for address"},{"line_number":54,"context_line":"   {% if hint_prefix !\u003d None %}"},{"line_number":55,"context_line":"   pd 1 {"},{"line_number":56,"context_line":"       prefix {{ hint_prefix }}"},{"line_number":57,"context_line":"   }"},{"line_number":58,"context_line":"   {% else %}"},{"line_number":59,"context_line":"    pd 1"},{"line_number":60,"context_line":"   {% endif %}"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_01e8d80f","line":57,"range":{"start_line":55,"start_character":0,"end_line":57,"end_character":4},"updated":"2017-01-18 12:18:23.000000000","message":"should be indented to the same level as L59","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"2698479e9215248a522c44b7900df25b05682e3e","unresolved":false,"context_lines":[{"line_number":52,"context_line":"bind-to-address {{ bind_address }}"},{"line_number":53,"context_line":"# ask for address"},{"line_number":54,"context_line":"   {% if hint_prefix !\u003d None %}"},{"line_number":55,"context_line":"   pd 1 {"},{"line_number":56,"context_line":"       prefix {{ hint_prefix }}"},{"line_number":57,"context_line":"   }"},{"line_number":58,"context_line":"   {% else %}"},{"line_number":59,"context_line":"    pd 1"},{"line_number":60,"context_line":"   {% endif %}"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_cee543dd","line":57,"range":{"start_line":55,"start_character":0,"end_line":57,"end_character":4},"in_reply_to":"7a3c09a3_01e8d80f","updated":"2017-01-18 18:51:53.000000000","message":"Done","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"ac9c36b05a6564bd1b9abc0bb30ab455e1d4b12b","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def _is_dibbler_client_running(self):"},{"line_number":84,"context_line":"        return utils.get_value_from_file(self.pid_path)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _generate_dibbler_conf(self, ex_gw_ifname, lla, hint_prefix):"},{"line_number":87,"context_line":"        dcwa \u003d self.dibbler_client_working_area"},{"line_number":88,"context_line":"        script_path \u003d utils.get_conf_file_name(dcwa, \u0027notify\u0027, \u0027sh\u0027, True)"},{"line_number":89,"context_line":"        buf \u003d six.StringIO()"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_c4d3cf02","line":86,"range":{"start_line":86,"start_character":56,"end_line":86,"end_character":67},"updated":"2017-02-15 02:16:22.000000000","message":"s/prefix - I\u0027m not sure why the name hint_prefix?","commit_id":"23efd39f70387445211e1454243f331a2b5bbc61"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"24f2d0225e1104aced05418ac03f41af7a9fa068","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    def _is_dibbler_client_running(self):"},{"line_number":84,"context_line":"        return utils.get_value_from_file(self.pid_path)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    def _generate_dibbler_conf(self, ex_gw_ifname, lla, hint_prefix):"},{"line_number":87,"context_line":"        dcwa \u003d self.dibbler_client_working_area"},{"line_number":88,"context_line":"        script_path \u003d utils.get_conf_file_name(dcwa, \u0027notify\u0027, \u0027sh\u0027, True)"},{"line_number":89,"context_line":"        buf \u003d six.StringIO()"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_189ed1b8","line":86,"range":{"start_line":86,"start_character":56,"end_line":86,"end_character":67},"in_reply_to":"fa31d9ce_c4d3cf02","updated":"2017-02-15 17:58:28.000000000","message":"the term comes from the RFC 3633.","commit_id":"23efd39f70387445211e1454243f331a2b5bbc61"}],"neutron/agent/linux/pd.py":[{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c994b76f7d82995c04851332646631b836dc55a8","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            if pd_info and pd_info.old_prefix !\u003d prefix:"},{"line_number":114,"context_line":"                old_prefix \u003d pd_info.old_prefix"},{"line_number":115,"context_line":"                pd_info.old_prefix \u003d prefix"},{"line_number":116,"context_line":"                pd_info.prefix \u003d prefix"},{"line_number":117,"context_line":"                return old_prefix"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @utils.synchronized(\"l3-agent-pd\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_6343a413","line":116,"range":{"start_line":116,"start_character":16,"end_line":116,"end_character":39},"updated":"2017-01-18 12:18:23.000000000","message":"Could you explain why this is needed? I can\u0027t see it myself.","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"2698479e9215248a522c44b7900df25b05682e3e","unresolved":false,"context_lines":[{"line_number":113,"context_line":"            if pd_info and pd_info.old_prefix !\u003d prefix:"},{"line_number":114,"context_line":"                old_prefix \u003d pd_info.old_prefix"},{"line_number":115,"context_line":"                pd_info.old_prefix \u003d prefix"},{"line_number":116,"context_line":"                pd_info.prefix \u003d prefix"},{"line_number":117,"context_line":"                return old_prefix"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    @utils.synchronized(\"l3-agent-pd\")"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_0e010b3a","line":116,"range":{"start_line":116,"start_character":16,"end_line":116,"end_character":39},"in_reply_to":"7a3c09a3_6343a413","updated":"2017-01-18 18:51:53.000000000","message":"This is needed on the standby to keep the prefix current as the active.","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3357a9ffac4528178fd42054ae8fa048927086b0","unresolved":false,"context_lines":[{"line_number":370,"context_line":"def add_router(resource, event, l3_agent, **kwargs):"},{"line_number":371,"context_line":"    added_router \u003d kwargs[\u0027router\u0027]"},{"line_number":372,"context_line":"    router_type \u003d \"standalone\""},{"line_number":373,"context_line":"    if isinstance(added_router, ha_router.HaRouter):"},{"line_number":374,"context_line":"        # The method is called as part of BEFORE_CREATE notification."},{"line_number":375,"context_line":"        # The router object hasn\u0027t been fully initialized."},{"line_number":376,"context_line":"        # For example HaRouter.ha_state is not available."}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_6846ee24","line":373,"updated":"2017-01-25 21:21:08.000000000","message":"I\u0027m reluctant to have any knowledge of HA in the PD code it would be good to keep it separate.  See https://review.openstack.org/#/c/277657/ for what we did w/DVR changes.  For example, here we could have code that calls into the class to determine if this router is \"special\".  So most of the code wouldn\u0027t change.","commit_id":"0d420244ea50e0a16cf96946c65a6230aedf9d0d"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"6aa0b15103a1428abfcb91645a01370890b2b520","unresolved":false,"context_lines":[{"line_number":370,"context_line":"def add_router(resource, event, l3_agent, **kwargs):"},{"line_number":371,"context_line":"    added_router \u003d kwargs[\u0027router\u0027]"},{"line_number":372,"context_line":"    router_type \u003d \"standalone\""},{"line_number":373,"context_line":"    if isinstance(added_router, ha_router.HaRouter):"},{"line_number":374,"context_line":"        # The method is called as part of BEFORE_CREATE notification."},{"line_number":375,"context_line":"        # The router object hasn\u0027t been fully initialized."},{"line_number":376,"context_line":"        # For example HaRouter.ha_state is not available."}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_f86fe88f","line":373,"in_reply_to":"3a461143_6846ee24","updated":"2017-01-26 14:43:51.000000000","message":"It sounds good. I can add get_router_type() in router_info and HaRouter.","commit_id":"0d420244ea50e0a16cf96946c65a6230aedf9d0d"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3357a9ffac4528178fd42054ae8fa048927086b0","unresolved":false,"context_lines":[{"line_number":376,"context_line":"        # For example HaRouter.ha_state is not available."},{"line_number":377,"context_line":"        # Therefore, use _ha_state from the router dictionary."},{"line_number":378,"context_line":"        if added_router.router.get(\u0027_ha_state\u0027) \u003d\u003d \u0027active\u0027:"},{"line_number":379,"context_line":"            router_type \u003d \u0027master\u0027"},{"line_number":380,"context_line":"        else:"},{"line_number":381,"context_line":"            router_type \u003d \u0027backup\u0027"},{"line_number":382,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_28094696","line":379,"updated":"2017-01-25 21:21:08.000000000","message":"You have three types, but master and standalone seem to be treated similarly on L67, so we can probably just use two values.","commit_id":"0d420244ea50e0a16cf96946c65a6230aedf9d0d"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"6aa0b15103a1428abfcb91645a01370890b2b520","unresolved":false,"context_lines":[{"line_number":376,"context_line":"        # For example HaRouter.ha_state is not available."},{"line_number":377,"context_line":"        # Therefore, use _ha_state from the router dictionary."},{"line_number":378,"context_line":"        if added_router.router.get(\u0027_ha_state\u0027) \u003d\u003d \u0027active\u0027:"},{"line_number":379,"context_line":"            router_type \u003d \u0027master\u0027"},{"line_number":380,"context_line":"        else:"},{"line_number":381,"context_line":"            router_type \u003d \u0027backup\u0027"},{"line_number":382,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_780a18d4","line":379,"in_reply_to":"3a461143_28094696","updated":"2017-01-26 14:43:51.000000000","message":"I can remove \u0027standalone\u0027.","commit_id":"0d420244ea50e0a16cf96946c65a6230aedf9d0d"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"ac9c36b05a6564bd1b9abc0bb30ab455e1d4b12b","unresolved":false,"context_lines":[{"line_number":271,"context_line":"            return"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"        router[\u0027router_type\u0027] \u003d state"},{"line_number":274,"context_line":"        if state \u003d\u003d \u0027backup\u0027:"},{"line_number":275,"context_line":"            for pd_info in six.itervalues(router[\u0027subnets\u0027]):"},{"line_number":276,"context_line":"                self._delete_lla(router, pd_info.get_bind_lla_with_mask())"},{"line_number":277,"context_line":"                if pd_info.client_started:"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_25e550a7","line":274,"updated":"2017-02-15 02:16:22.000000000","message":"So there are really two modes - master and not master, I think that would be better than even having the PD code know about master/backup.","commit_id":"23efd39f70387445211e1454243f331a2b5bbc61"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"24f2d0225e1104aced05418ac03f41af7a9fa068","unresolved":false,"context_lines":[{"line_number":271,"context_line":"            return"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"        router[\u0027router_type\u0027] \u003d state"},{"line_number":274,"context_line":"        if state \u003d\u003d \u0027backup\u0027:"},{"line_number":275,"context_line":"            for pd_info in six.itervalues(router[\u0027subnets\u0027]):"},{"line_number":276,"context_line":"                self._delete_lla(router, pd_info.get_bind_lla_with_mask())"},{"line_number":277,"context_line":"                if pd_info.client_started:"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_98756165","line":274,"in_reply_to":"fa31d9ce_25e550a7","updated":"2017-02-15 17:58:28.000000000","message":"I guess the same argument can be applied to the HA code as well. \n\nThe original patch (with standalone definition) gives more information (e.g. in the debug msg).\n\nThe change you made in patch 10 should work, and thanks for making that change.","commit_id":"23efd39f70387445211e1454243f331a2b5bbc61"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"e617f69057735ccf167a95bb5e381c63bee3ac54","unresolved":false,"context_lines":[{"line_number":271,"context_line":"            return"},{"line_number":272,"context_line":""},{"line_number":273,"context_line":"        router[\u0027router_type\u0027] \u003d state"},{"line_number":274,"context_line":"        if state \u003d\u003d \u0027backup\u0027:"},{"line_number":275,"context_line":"            for pd_info in six.itervalues(router[\u0027subnets\u0027]):"},{"line_number":276,"context_line":"                self._delete_lla(router, pd_info.get_bind_lla_with_mask())"},{"line_number":277,"context_line":"                if pd_info.client_started:"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_d8f19996","line":274,"in_reply_to":"fa31d9ce_98756165","updated":"2017-02-15 18:06:43.000000000","message":"Right, I was thinking that all the PD code needs is a boolean - should I start or not.  If it needs more we can put it here, but didn\u0027t seem necessary.","commit_id":"23efd39f70387445211e1454243f331a2b5bbc61"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"ac9c36b05a6564bd1b9abc0bb30ab455e1d4b12b","unresolved":false,"context_lines":[{"line_number":311,"context_line":"                        if not pd_info.driver:"},{"line_number":312,"context_line":"                            pd_info.driver \u003d self.pd_dhcp_driver("},{"line_number":313,"context_line":"                                router_id, subnet_id, pd_info.ri_ifname)"},{"line_number":314,"context_line":"                        hint_prefix \u003d None"},{"line_number":315,"context_line":"                        if (pd_info.prefix !\u003d"},{"line_number":316,"context_line":"                                l3_constants.PROVISIONAL_IPV6_PD_PREFIX):"},{"line_number":317,"context_line":"                            hint_prefix \u003d pd_info.prefix"}],"source_content_type":"text/x-python","patch_set":9,"id":"fa31d9ce_d04d493f","line":314,"updated":"2017-02-15 02:16:22.000000000","message":"Ok, so here\u0027s why you used hint_prefix in the other file, but I see no reason it can\u0027t be \u0027prefix\u0027 here.","commit_id":"23efd39f70387445211e1454243f331a2b5bbc61"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"1602fa5147cfd1746ca09168d8b8948d325f8a65","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            LOG.debug(\"Update server with prefixes: %s\", prefix_update)"},{"line_number":150,"context_line":"            self.notifier(self.context, prefix_update)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def delete_router_pd(self, router, force\u003dFalse):"},{"line_number":153,"context_line":"        if not self._is_pd_master_router(router) and not force:"},{"line_number":154,"context_line":"            return"},{"line_number":155,"context_line":"        prefix_update \u003d {}"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa31d9ce_d3541acb","line":152,"range":{"start_line":152,"start_character":39,"end_line":152,"end_character":44},"updated":"2017-02-15 18:20:50.000000000","message":"This method deletes the pd clients, and send prefix update if any. If it\u0027s running in backup node, no pd client has been spawn, therefore it doesn\u0027t need to be called. I don\u0027t see it\u0027s necessary to add the \u0027force\u0027 flag in here","commit_id":"8618eda61403b268db66f0a5041a1cccab4e737d"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"c6a1110cae048b332707a1ce6c0d3ecdf138667e","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            LOG.debug(\"Update server with prefixes: %s\", prefix_update)"},{"line_number":150,"context_line":"            self.notifier(self.context, prefix_update)"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def delete_router_pd(self, router, force\u003dFalse):"},{"line_number":153,"context_line":"        if not self._is_pd_master_router(router) and not force:"},{"line_number":154,"context_line":"            return"},{"line_number":155,"context_line":"        prefix_update \u003d {}"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa31d9ce_e5eb1111","line":152,"range":{"start_line":152,"start_character":39,"end_line":152,"end_character":44},"in_reply_to":"fa31d9ce_d3541acb","updated":"2017-02-15 18:42:08.000000000","message":"Done","commit_id":"8618eda61403b268db66f0a5041a1cccab4e737d"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"af45290c42b9c8772c47eba250ce6411c5f330b5","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        preserve_ips \u003d []"},{"line_number":178,"context_line":"        router \u003d self.routers.get(router_id)"},{"line_number":179,"context_line":"        if router is not None:"},{"line_number":180,"context_line":"            for pd_info in six.itervalues(router[\u0027subnets\u0027]):"},{"line_number":181,"context_line":"                preserve_ips.append(pd_info.get_bind_lla_with_mask())"},{"line_number":182,"context_line":"        return preserve_ips"},{"line_number":183,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3a1ff146_b0c5a65c","line":180,"updated":"2017-03-14 23:45:05.000000000","message":"please don\u0027t make these kind of changes in the future unless these are really huge dictionaries (\u003e100 items). The performance change is negligible for dictionaries this small so it\u0027s not worth the uglier function from another library and the impact to back-portability.","commit_id":"f324026eb5939d2a6ff116894042cd7a8397630e"}],"neutron/tests/common/l3_test_common.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3357a9ffac4528178fd42054ae8fa048927086b0","unresolved":false,"context_lines":[{"line_number":296,"context_line":"        for subnet in intf[\u0027subnets\u0027]:"},{"line_number":297,"context_line":"            if (ipv6_utils.is_ipv6_pd_enabled(subnet) and"},{"line_number":298,"context_line":"                subnet[\u0027cidr\u0027] \u003d\u003d n_const.PROVISIONAL_IPV6_PD_PREFIX):"},{"line_number":299,"context_line":"                subnet[\u0027cidr\u0027] \u003d \"2001:cafe:cafe:%d::/64\" % ifno"},{"line_number":300,"context_line":"                pd_intfs.append(intf)"},{"line_number":301,"context_line":"                break"},{"line_number":302,"context_line":"    return pd_intfs"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_08d5b2e6","line":299,"range":{"start_line":299,"start_character":39,"end_line":299,"end_character":43},"updated":"2017-01-25 21:21:08.000000000","message":"nit: db8","commit_id":"0d420244ea50e0a16cf96946c65a6230aedf9d0d"}],"neutron/tests/unit/agent/l3/test_agent.py":[{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c994b76f7d82995c04851332646631b836dc55a8","unresolved":false,"context_lines":[{"line_number":2473,"context_line":""},{"line_number":2474,"context_line":"    def _pd_setup_agent_router(self, enable_ha\u003dFalse):"},{"line_number":2475,"context_line":"        router \u003d l3_test_common.prepare_router_data()"},{"line_number":2476,"context_line":"        agent \u003d l3_agent.L3NATAgent(HOSTNAME, self.conf)"},{"line_number":2477,"context_line":"        agent._router_added(router[\u0027id\u0027], router)"},{"line_number":2478,"context_line":"        # Make sure radvd monitor is created"},{"line_number":2479,"context_line":"        ri \u003d agent.router_info[router[\u0027id\u0027]]"},{"line_number":2480,"context_line":"        if not ri.radvd:"},{"line_number":2481,"context_line":"            ri.radvd \u003d ra.DaemonMonitor(router[\u0027id\u0027],"},{"line_number":2482,"context_line":"                                        ri.ns_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_2905fd0f","line":2479,"range":{"start_line":2476,"start_character":56,"end_line":2479,"end_character":44},"updated":"2017-01-18 12:18:23.000000000","message":"Could you explain briefly why these changes are needed? Thanks","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"2698479e9215248a522c44b7900df25b05682e3e","unresolved":false,"context_lines":[{"line_number":2473,"context_line":""},{"line_number":2474,"context_line":"    def _pd_setup_agent_router(self, enable_ha\u003dFalse):"},{"line_number":2475,"context_line":"        router \u003d l3_test_common.prepare_router_data()"},{"line_number":2476,"context_line":"        agent \u003d l3_agent.L3NATAgent(HOSTNAME, self.conf)"},{"line_number":2477,"context_line":"        agent._router_added(router[\u0027id\u0027], router)"},{"line_number":2478,"context_line":"        # Make sure radvd monitor is created"},{"line_number":2479,"context_line":"        ri \u003d agent.router_info[router[\u0027id\u0027]]"},{"line_number":2480,"context_line":"        if not ri.radvd:"},{"line_number":2481,"context_line":"            ri.radvd \u003d ra.DaemonMonitor(router[\u0027id\u0027],"},{"line_number":2482,"context_line":"                                        ri.ns_name,"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_b163fa40","line":2479,"range":{"start_line":2476,"start_character":56,"end_line":2479,"end_character":44},"in_reply_to":"7a3c09a3_2905fd0f","updated":"2017-01-18 18:51:53.000000000","message":"The purpose of this routine is to create a router in the agent. So the above lines are sufficient to achieve that.","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c994b76f7d82995c04851332646631b836dc55a8","unresolved":false,"context_lines":[{"line_number":2626,"context_line":"        def pd_notifier(context, prefix_update):"},{"line_number":2627,"context_line":"            self.pd_update \u003d prefix_update"},{"line_number":2628,"context_line":"            for subnet_id, prefix in six.iteritems(prefix_update):"},{"line_number":2629,"context_line":"                gateway_ip \u003d \u0027%s1\u0027 % netaddr.IPNetwork(prefix).network"},{"line_number":2630,"context_line":"                for intf in new_intfs:"},{"line_number":2631,"context_line":"                    for fip in intf[\u0027fixed_ips\u0027]:"},{"line_number":2632,"context_line":"                        if fip[\u0027subnet_id\u0027] \u003d\u003d subnet_id:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_89fb5178","line":2629,"range":{"start_line":2629,"start_character":29,"end_line":2629,"end_character":70},"updated":"2017-01-18 12:18:23.000000000","message":"can we use .first() for this?","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"2698479e9215248a522c44b7900df25b05682e3e","unresolved":false,"context_lines":[{"line_number":2626,"context_line":"        def pd_notifier(context, prefix_update):"},{"line_number":2627,"context_line":"            self.pd_update \u003d prefix_update"},{"line_number":2628,"context_line":"            for subnet_id, prefix in six.iteritems(prefix_update):"},{"line_number":2629,"context_line":"                gateway_ip \u003d \u0027%s1\u0027 % netaddr.IPNetwork(prefix).network"},{"line_number":2630,"context_line":"                for intf in new_intfs:"},{"line_number":2631,"context_line":"                    for fip in intf[\u0027fixed_ips\u0027]:"},{"line_number":2632,"context_line":"                        if fip[\u0027subnet_id\u0027] \u003d\u003d subnet_id:"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_b4d3e85e","line":2629,"range":{"start_line":2629,"start_character":29,"end_line":2629,"end_character":70},"in_reply_to":"7a3c09a3_89fb5178","updated":"2017-01-18 18:51:53.000000000","message":"can you clarify? I tried netaddr.IPNetwork(prefix).network.first, but the result is a string of digits","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c994b76f7d82995c04851332646631b836dc55a8","unresolved":false,"context_lines":[{"line_number":2686,"context_line":"        # Add the gateway interface"},{"line_number":2687,"context_line":"        self._pd_add_gw_interface(agent, router, ri)"},{"line_number":2688,"context_line":""},{"line_number":2689,"context_line":"        update_router \u003d copy.deepcopy(router)"},{"line_number":2690,"context_line":"        pd_intfs \u003d l3_test_common.get_unassigned_pd_interfaces(update_router)"},{"line_number":2691,"context_line":""},{"line_number":2692,"context_line":"        # Get one prefix"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_74119c03","line":2689,"range":{"start_line":2689,"start_character":8,"end_line":2689,"end_character":45},"updated":"2017-01-18 12:18:23.000000000","message":"Why do we need to have two versions of the same router object? I can\u0027t see them being compared before/after, for example.","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"2698479e9215248a522c44b7900df25b05682e3e","unresolved":false,"context_lines":[{"line_number":2686,"context_line":"        # Add the gateway interface"},{"line_number":2687,"context_line":"        self._pd_add_gw_interface(agent, router, ri)"},{"line_number":2688,"context_line":""},{"line_number":2689,"context_line":"        update_router \u003d copy.deepcopy(router)"},{"line_number":2690,"context_line":"        pd_intfs \u003d l3_test_common.get_unassigned_pd_interfaces(update_router)"},{"line_number":2691,"context_line":""},{"line_number":2692,"context_line":"        # Get one prefix"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_54756430","line":2689,"range":{"start_line":2689,"start_character":8,"end_line":2689,"end_character":45},"in_reply_to":"7a3c09a3_74119c03","updated":"2017-01-18 18:51:53.000000000","message":"this is to simulate the way that agent works to process router updates. With this new instance, _pd_get_prefixes will populate the pd prefix into the router data, and the following ri.process() will detect the change and perform proper actions on the update.","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c994b76f7d82995c04851332646631b836dc55a8","unresolved":false,"context_lines":[{"line_number":2728,"context_line":"        # Add the gateway interface"},{"line_number":2729,"context_line":"        self._pd_add_gw_interface(agent, router, ri)"},{"line_number":2730,"context_line":""},{"line_number":2731,"context_line":"        update_router \u003d copy.deepcopy(router)"},{"line_number":2732,"context_line":"        pd_intfs \u003d l3_test_common.get_unassigned_pd_interfaces(update_router)"},{"line_number":2733,"context_line":""},{"line_number":2734,"context_line":"        # Get one prefix"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_b493045a","line":2731,"range":{"start_line":2731,"start_character":8,"end_line":2731,"end_character":45},"updated":"2017-01-18 12:18:23.000000000","message":"Ditto L2689","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"2698479e9215248a522c44b7900df25b05682e3e","unresolved":false,"context_lines":[{"line_number":2728,"context_line":"        # Add the gateway interface"},{"line_number":2729,"context_line":"        self._pd_add_gw_interface(agent, router, ri)"},{"line_number":2730,"context_line":""},{"line_number":2731,"context_line":"        update_router \u003d copy.deepcopy(router)"},{"line_number":2732,"context_line":"        pd_intfs \u003d l3_test_common.get_unassigned_pd_interfaces(update_router)"},{"line_number":2733,"context_line":""},{"line_number":2734,"context_line":"        # Get one prefix"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_b4b928ce","line":2731,"range":{"start_line":2731,"start_character":8,"end_line":2731,"end_character":45},"in_reply_to":"7a3c09a3_b493045a","updated":"2017-01-18 18:51:53.000000000","message":"the reason is the same as given at L2689. \nIt\u0027s the same reason for the similar changes in below.","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c994b76f7d82995c04851332646631b836dc55a8","unresolved":false,"context_lines":[{"line_number":2742,"context_line":"        self._pd_assert_radvd_calls(ri)"},{"line_number":2743,"context_line":""},{"line_number":2744,"context_line":"        # Now remove the gw interface"},{"line_number":2745,"context_line":"        self._pd_remove_gw_interface(pd_intfs, agent, update_router, ri)"},{"line_number":2746,"context_line":""},{"line_number":2747,"context_line":"    @mock.patch.object(dibbler.PDDibbler, \u0027get_prefix\u0027, autospec\u003dTrue)"},{"line_number":2748,"context_line":"    @mock.patch.object(dibbler.os, \u0027getpid\u0027, return_value\u003d1234)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_2e18a3d2","line":2745,"updated":"2017-01-18 12:18:23.000000000","message":"why is the ri.process() removed?","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"2698479e9215248a522c44b7900df25b05682e3e","unresolved":false,"context_lines":[{"line_number":2742,"context_line":"        self._pd_assert_radvd_calls(ri)"},{"line_number":2743,"context_line":""},{"line_number":2744,"context_line":"        # Now remove the gw interface"},{"line_number":2745,"context_line":"        self._pd_remove_gw_interface(pd_intfs, agent, update_router, ri)"},{"line_number":2746,"context_line":""},{"line_number":2747,"context_line":"    @mock.patch.object(dibbler.PDDibbler, \u0027get_prefix\u0027, autospec\u003dTrue)"},{"line_number":2748,"context_line":"    @mock.patch.object(dibbler.os, \u0027getpid\u0027, return_value\u003d1234)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_17959e87","line":2745,"in_reply_to":"7a3c09a3_2e18a3d2","updated":"2017-01-18 18:51:53.000000000","message":"Similar as _pd_remove_interfaces() (see test_pd_add_remove_2_subnets in below), for the purpose of this test, _pd_remove_gw_interface() itself is sufficient. That\u0027s why I have it removed. What do you think?","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c994b76f7d82995c04851332646631b836dc55a8","unresolved":false,"context_lines":[{"line_number":2770,"context_line":"        # Add the gateway interface"},{"line_number":2771,"context_line":"        self._pd_add_gw_interface(agent, router, ri)"},{"line_number":2772,"context_line":""},{"line_number":2773,"context_line":"        update_router \u003d copy.deepcopy(router)"},{"line_number":2774,"context_line":"        pd_intfs \u003d l3_test_common.get_unassigned_pd_interfaces(update_router)"},{"line_number":2775,"context_line":""},{"line_number":2776,"context_line":"        # Get prefixes"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_f4990c7a","line":2773,"range":{"start_line":2773,"start_character":8,"end_line":2773,"end_character":45},"updated":"2017-01-18 12:18:23.000000000","message":"Ditto L2689","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c994b76f7d82995c04851332646631b836dc55a8","unresolved":false,"context_lines":[{"line_number":2809,"context_line":"        l3_test_common.router_append_pd_enabled_subnet(router, count\u003d1)"},{"line_number":2810,"context_line":"        ri.process()"},{"line_number":2811,"context_line":""},{"line_number":2812,"context_line":"        update_router \u003d copy.deepcopy(router)"},{"line_number":2813,"context_line":"        pd_intfs \u003d l3_test_common.get_unassigned_pd_interfaces(update_router)"},{"line_number":2814,"context_line":""},{"line_number":2815,"context_line":"        # Get prefixes"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_348e342e","line":2812,"range":{"start_line":2812,"start_character":8,"end_line":2812,"end_character":45},"updated":"2017-01-18 12:18:23.000000000","message":"Ditto L2689","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c994b76f7d82995c04851332646631b836dc55a8","unresolved":false,"context_lines":[{"line_number":2827,"context_line":"        l3_test_common.router_append_pd_enabled_subnet(router, count\u003d1)"},{"line_number":2828,"context_line":"        ri.process()"},{"line_number":2829,"context_line":""},{"line_number":2830,"context_line":"        update_router \u003d copy.deepcopy(update_router)"},{"line_number":2831,"context_line":"        pd_intfs1 \u003d l3_test_common.get_unassigned_pd_interfaces(update_router)"},{"line_number":2832,"context_line":""},{"line_number":2833,"context_line":"        # Get prefixes"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_74843c0a","line":2830,"range":{"start_line":2830,"start_character":8,"end_line":2830,"end_character":52},"updated":"2017-01-18 12:18:23.000000000","message":"Ditto L2689","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c994b76f7d82995c04851332646631b836dc55a8","unresolved":false,"context_lines":[{"line_number":2878,"context_line":"        self.assertFalse(self.external_process.called)"},{"line_number":2879,"context_line":"        self.assertFalse(mock_get_prefix.called)"},{"line_number":2880,"context_line":""},{"line_number":2881,"context_line":"        upd_router \u003d copy.deepcopy(router)"},{"line_number":2882,"context_line":"        pd_intfs \u003d l3_test_common.assign_prefix_for_pd_interfaces(upd_router)"},{"line_number":2883,"context_line":""},{"line_number":2884,"context_line":"        # Update the router with the new prefix"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_d475f031","line":2881,"range":{"start_line":2881,"start_character":8,"end_line":2881,"end_character":42},"updated":"2017-01-18 12:18:23.000000000","message":"Ditto L2689","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c994b76f7d82995c04851332646631b836dc55a8","unresolved":false,"context_lines":[{"line_number":2925,"context_line":"        self.assertFalse(self.external_process.called)"},{"line_number":2926,"context_line":"        self.assertFalse(mock_get_prefix.called)"},{"line_number":2927,"context_line":""},{"line_number":2928,"context_line":"        upd_router \u003d copy.deepcopy(router)"},{"line_number":2929,"context_line":"        pd_intfs \u003d l3_test_common.get_unassigned_pd_interfaces(upd_router)"},{"line_number":2930,"context_line":""},{"line_number":2931,"context_line":"        # Turn the router to be active"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_5498206a","line":2928,"range":{"start_line":2928,"start_character":8,"end_line":2928,"end_character":42},"updated":"2017-01-18 12:18:23.000000000","message":"Ditto L2689","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":6635,"name":"John Davidge","email":"john.davidge@rackspace.com","username":"john-davidge"},"change_message_id":"c994b76f7d82995c04851332646631b836dc55a8","unresolved":false,"context_lines":[{"line_number":2967,"context_line":"        self._pd_add_gw_interface(agent, router, ri)"},{"line_number":2968,"context_line":"        ri.process()"},{"line_number":2969,"context_line":""},{"line_number":2970,"context_line":"        upd_router \u003d copy.deepcopy(router)"},{"line_number":2971,"context_line":"        pd_intfs \u003d l3_test_common.get_unassigned_pd_interfaces(upd_router)"},{"line_number":2972,"context_line":""},{"line_number":2973,"context_line":"        # Get prefixes"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a3c09a3_d4ac108e","line":2970,"range":{"start_line":2970,"start_character":8,"end_line":2970,"end_character":42},"updated":"2017-01-18 12:18:23.000000000","message":"Ditto L2689","commit_id":"0ad79e0fcf8d88d613783073e33bedcdba6a5f18"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"a01de563e0b7f2b6701d83cb033521659ca3e6eb","unresolved":false,"context_lines":[{"line_number":2913,"context_line":"        l3_test_common.router_append_pd_enabled_subnet(router, count\u003d1)"},{"line_number":2914,"context_line":"        ri.process()"},{"line_number":2915,"context_line":""},{"line_number":2916,"context_line":"        update_router \u003d copy.deepcopy(update_router)"},{"line_number":2917,"context_line":"        pd_intfs1 \u003d l3_test_common.get_unassigned_pd_interfaces(update_router)"},{"line_number":2918,"context_line":""},{"line_number":2919,"context_line":"        # Get prefixes"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa31d9ce_4cbe8fd5","line":2916,"updated":"2017-02-16 21:30:52.000000000","message":"This doesn\u0027t seem necessary.","commit_id":"06561d1835158b3f4848d5bcf243aa4496675197"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"091e948e3ac1f4888dbb4b645f043b6b821d9d1e","unresolved":false,"context_lines":[{"line_number":2913,"context_line":"        l3_test_common.router_append_pd_enabled_subnet(router, count\u003d1)"},{"line_number":2914,"context_line":"        ri.process()"},{"line_number":2915,"context_line":""},{"line_number":2916,"context_line":"        update_router \u003d copy.deepcopy(update_router)"},{"line_number":2917,"context_line":"        pd_intfs1 \u003d l3_test_common.get_unassigned_pd_interfaces(update_router)"},{"line_number":2918,"context_line":""},{"line_number":2919,"context_line":"        # Get prefixes"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa31d9ce_af761dd6","line":2916,"in_reply_to":"fa31d9ce_4cbe8fd5","updated":"2017-02-16 22:12:03.000000000","message":"John had similar comments in patch set 4. See my response over there.","commit_id":"06561d1835158b3f4848d5bcf243aa4496675197"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"3a7b2f7e886aa2954953d03d6d457987352f7087","unresolved":false,"context_lines":[{"line_number":2913,"context_line":"        l3_test_common.router_append_pd_enabled_subnet(router, count\u003d1)"},{"line_number":2914,"context_line":"        ri.process()"},{"line_number":2915,"context_line":""},{"line_number":2916,"context_line":"        update_router \u003d copy.deepcopy(update_router)"},{"line_number":2917,"context_line":"        pd_intfs1 \u003d l3_test_common.get_unassigned_pd_interfaces(update_router)"},{"line_number":2918,"context_line":""},{"line_number":2919,"context_line":"        # Get prefixes"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa31d9ce_fa48d5ce","line":2916,"in_reply_to":"fa31d9ce_af761dd6","updated":"2017-02-16 22:32:43.000000000","message":"Well, all the other ones are making a copy of \u0027router\u0027, this is making a copy of itself.  If I remove it the test still passes.","commit_id":"06561d1835158b3f4848d5bcf243aa4496675197"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"a01de563e0b7f2b6701d83cb033521659ca3e6eb","unresolved":false,"context_lines":[{"line_number":2964,"context_line":"        self.assertFalse(self.external_process.called)"},{"line_number":2965,"context_line":"        self.assertFalse(mock_get_prefix.called)"},{"line_number":2966,"context_line":""},{"line_number":2967,"context_line":"        upd_router \u003d copy.deepcopy(router)"},{"line_number":2968,"context_line":"        pd_intfs \u003d l3_test_common.assign_prefix_for_pd_interfaces(upd_router)"},{"line_number":2969,"context_line":""},{"line_number":2970,"context_line":"        # Update the router with the new prefix"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa31d9ce_ccca7f6e","line":2967,"range":{"start_line":2967,"start_character":8,"end_line":2967,"end_character":18},"updated":"2017-02-16 21:30:52.000000000","message":"nit: update_router to match the above","commit_id":"06561d1835158b3f4848d5bcf243aa4496675197"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"091e948e3ac1f4888dbb4b645f043b6b821d9d1e","unresolved":false,"context_lines":[{"line_number":2964,"context_line":"        self.assertFalse(self.external_process.called)"},{"line_number":2965,"context_line":"        self.assertFalse(mock_get_prefix.called)"},{"line_number":2966,"context_line":""},{"line_number":2967,"context_line":"        upd_router \u003d copy.deepcopy(router)"},{"line_number":2968,"context_line":"        pd_intfs \u003d l3_test_common.assign_prefix_for_pd_interfaces(upd_router)"},{"line_number":2969,"context_line":""},{"line_number":2970,"context_line":"        # Update the router with the new prefix"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa31d9ce_2f494d8f","line":2967,"range":{"start_line":2967,"start_character":8,"end_line":2967,"end_character":18},"in_reply_to":"fa31d9ce_ccca7f6e","updated":"2017-02-16 22:12:03.000000000","message":"I will make it the same","commit_id":"06561d1835158b3f4848d5bcf243aa4496675197"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"a01de563e0b7f2b6701d83cb033521659ca3e6eb","unresolved":false,"context_lines":[{"line_number":3011,"context_line":"        self.assertFalse(self.external_process.called)"},{"line_number":3012,"context_line":"        self.assertFalse(mock_get_prefix.called)"},{"line_number":3013,"context_line":""},{"line_number":3014,"context_line":"        upd_router \u003d copy.deepcopy(router)"},{"line_number":3015,"context_line":"        pd_intfs \u003d l3_test_common.get_unassigned_pd_interfaces(upd_router)"},{"line_number":3016,"context_line":""},{"line_number":3017,"context_line":"        # Turn the router to be active"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa31d9ce_6caa7387","line":3014,"updated":"2017-02-16 21:30:52.000000000","message":"same","commit_id":"06561d1835158b3f4848d5bcf243aa4496675197"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"091e948e3ac1f4888dbb4b645f043b6b821d9d1e","unresolved":false,"context_lines":[{"line_number":3011,"context_line":"        self.assertFalse(self.external_process.called)"},{"line_number":3012,"context_line":"        self.assertFalse(mock_get_prefix.called)"},{"line_number":3013,"context_line":""},{"line_number":3014,"context_line":"        upd_router \u003d copy.deepcopy(router)"},{"line_number":3015,"context_line":"        pd_intfs \u003d l3_test_common.get_unassigned_pd_interfaces(upd_router)"},{"line_number":3016,"context_line":""},{"line_number":3017,"context_line":"        # Turn the router to be active"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa31d9ce_6f43456d","line":3014,"in_reply_to":"fa31d9ce_6caa7387","updated":"2017-02-16 22:12:03.000000000","message":"ditto","commit_id":"06561d1835158b3f4848d5bcf243aa4496675197"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"a01de563e0b7f2b6701d83cb033521659ca3e6eb","unresolved":false,"context_lines":[{"line_number":3053,"context_line":"        self._pd_add_gw_interface(agent, router, ri)"},{"line_number":3054,"context_line":"        ri.process()"},{"line_number":3055,"context_line":""},{"line_number":3056,"context_line":"        upd_router \u003d copy.deepcopy(router)"},{"line_number":3057,"context_line":"        pd_intfs \u003d l3_test_common.get_unassigned_pd_interfaces(upd_router)"},{"line_number":3058,"context_line":""},{"line_number":3059,"context_line":"        # Get prefixes"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa31d9ce_ac946b44","line":3056,"updated":"2017-02-16 21:30:52.000000000","message":"same","commit_id":"06561d1835158b3f4848d5bcf243aa4496675197"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"091e948e3ac1f4888dbb4b645f043b6b821d9d1e","unresolved":false,"context_lines":[{"line_number":3053,"context_line":"        self._pd_add_gw_interface(agent, router, ri)"},{"line_number":3054,"context_line":"        ri.process()"},{"line_number":3055,"context_line":""},{"line_number":3056,"context_line":"        upd_router \u003d copy.deepcopy(router)"},{"line_number":3057,"context_line":"        pd_intfs \u003d l3_test_common.get_unassigned_pd_interfaces(upd_router)"},{"line_number":3058,"context_line":""},{"line_number":3059,"context_line":"        # Get prefixes"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa31d9ce_cf5a7150","line":3056,"in_reply_to":"fa31d9ce_ac946b44","updated":"2017-02-16 22:12:03.000000000","message":"ditto","commit_id":"06561d1835158b3f4848d5bcf243aa4496675197"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"a01de563e0b7f2b6701d83cb033521659ca3e6eb","unresolved":false,"context_lines":[{"line_number":3090,"context_line":""},{"line_number":3091,"context_line":"        pddib._generate_dibbler_conf(\"ex_gw_ifname\","},{"line_number":3092,"context_line":"                                     \"fe80::f816:3eff:fef5:a04e\","},{"line_number":3093,"context_line":"                                     \"2001:420:2c50:2026::/64\")"},{"line_number":3094,"context_line":"        expected \u003d \u0027bind-to-address fe80::f816:3eff:fef5:a04e\\n\u0027\\"},{"line_number":3095,"context_line":"                   \u0027# ask for address\\n   \\n    pd 1 \u0027\\"},{"line_number":3096,"context_line":"                   \u0027{\\n        prefix 2001:420:2c50:2026::/64\\n    }\\n   \\n}\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa31d9ce_0c73b74e","line":3093,"range":{"start_line":3093,"start_character":43,"end_line":3093,"end_character":46},"updated":"2017-02-16 21:30:52.000000000","message":"s/db8","commit_id":"06561d1835158b3f4848d5bcf243aa4496675197"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"091e948e3ac1f4888dbb4b645f043b6b821d9d1e","unresolved":false,"context_lines":[{"line_number":3090,"context_line":""},{"line_number":3091,"context_line":"        pddib._generate_dibbler_conf(\"ex_gw_ifname\","},{"line_number":3092,"context_line":"                                     \"fe80::f816:3eff:fef5:a04e\","},{"line_number":3093,"context_line":"                                     \"2001:420:2c50:2026::/64\")"},{"line_number":3094,"context_line":"        expected \u003d \u0027bind-to-address fe80::f816:3eff:fef5:a04e\\n\u0027\\"},{"line_number":3095,"context_line":"                   \u0027# ask for address\\n   \\n    pd 1 \u0027\\"},{"line_number":3096,"context_line":"                   \u0027{\\n        prefix 2001:420:2c50:2026::/64\\n    }\\n   \\n}\u0027"}],"source_content_type":"text/x-python","patch_set":11,"id":"fa31d9ce_ef573524","line":3093,"range":{"start_line":3093,"start_character":43,"end_line":3093,"end_character":46},"in_reply_to":"fa31d9ce_0c73b74e","updated":"2017-02-16 22:12:03.000000000","message":"will change","commit_id":"06561d1835158b3f4848d5bcf243aa4496675197"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"7d40b343505be2f9ca4fa5473d88643aa5a68007","unresolved":false,"context_lines":[{"line_number":2780,"context_line":"            ri.get_internal_device_name(pd_intfs[0][\u0027id\u0027]),"},{"line_number":2781,"context_line":"            ip_cidrs\u003dl3router.common_utils.fixed_ip_cidrs("},{"line_number":2782,"context_line":"                pd_intfs[0][\u0027fixed_ips\u0027]),"},{"line_number":2783,"context_line":"            namespace\u003dri.ns_name)"},{"line_number":2784,"context_line":"        self._pd_assert_update_subnet_calls(router[\u0027id\u0027], pd_intfs,"},{"line_number":2785,"context_line":"                                            mock_pd_update_subnet)"},{"line_number":2786,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa31d9ce_d59ae6c4","line":2783,"range":{"start_line":2783,"start_character":32,"end_line":2783,"end_character":33},"updated":"2017-02-17 15:04:31.000000000","message":"this check should have been necessary for the test. With it added, the deep copy() and use of an updated router are required.\n\nSee the abandoned patch https://review.openstack.org/#/c/399662/1/neutron/agent/l3/router_info.py. The update_router is needed due to the change in router_info.py in that patch. Although the patch was abandoned, I mentioned the issue in router_info.py in my comments.","commit_id":"0b3c9fdb24876799892bd4cb82726457f608a11f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"09a7f549562f2c15baf0ec5e28e808d7ea4ee741","unresolved":false,"context_lines":[{"line_number":2780,"context_line":"            ri.get_internal_device_name(pd_intfs[0][\u0027id\u0027]),"},{"line_number":2781,"context_line":"            ip_cidrs\u003dl3router.common_utils.fixed_ip_cidrs("},{"line_number":2782,"context_line":"                pd_intfs[0][\u0027fixed_ips\u0027]),"},{"line_number":2783,"context_line":"            namespace\u003dri.ns_name)"},{"line_number":2784,"context_line":"        self._pd_assert_update_subnet_calls(router[\u0027id\u0027], pd_intfs,"},{"line_number":2785,"context_line":"                                            mock_pd_update_subnet)"},{"line_number":2786,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa31d9ce_e6fe5e04","line":2783,"range":{"start_line":2783,"start_character":32,"end_line":2783,"end_character":33},"in_reply_to":"fa31d9ce_d59ae6c4","updated":"2017-02-17 15:54:36.000000000","message":"I don\u0027t have a problem with this deepcopy just the one below","commit_id":"0b3c9fdb24876799892bd4cb82726457f608a11f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"09a7f549562f2c15baf0ec5e28e808d7ea4ee741","unresolved":false,"context_lines":[{"line_number":2918,"context_line":"        l3_test_common.router_append_pd_enabled_subnet(router, count\u003d1)"},{"line_number":2919,"context_line":"        ri.process()"},{"line_number":2920,"context_line":""},{"line_number":2921,"context_line":"        update_router \u003d copy.deepcopy(update_router)"},{"line_number":2922,"context_line":"        pd_intfs1 \u003d l3_test_common.get_unassigned_pd_interfaces(update_router)"},{"line_number":2923,"context_line":""},{"line_number":2924,"context_line":"        # Get prefixes"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa31d9ce_bb2ac38e","line":2921,"range":{"start_line":2921,"start_character":38,"end_line":2921,"end_character":51},"updated":"2017-02-17 15:54:36.000000000","message":"This is the one that I still question.  Because I don\u0027t see what it\u0027s doing, and removing it doesn\u0027t make the test fail.","commit_id":"0b3c9fdb24876799892bd4cb82726457f608a11f"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"e9e5b426793dff2b400cc6daa6ada50a2f2e48a2","unresolved":false,"context_lines":[{"line_number":2918,"context_line":"        l3_test_common.router_append_pd_enabled_subnet(router, count\u003d1)"},{"line_number":2919,"context_line":"        ri.process()"},{"line_number":2920,"context_line":""},{"line_number":2921,"context_line":"        update_router \u003d copy.deepcopy(update_router)"},{"line_number":2922,"context_line":"        pd_intfs1 \u003d l3_test_common.get_unassigned_pd_interfaces(update_router)"},{"line_number":2923,"context_line":""},{"line_number":2924,"context_line":"        # Get prefixes"}],"source_content_type":"text/x-python","patch_set":13,"id":"da36d5c6_dd340b4c","line":2921,"range":{"start_line":2921,"start_character":38,"end_line":2921,"end_character":51},"in_reply_to":"da36d5c6_af62bdab","updated":"2017-02-17 22:33:14.000000000","message":"Hmm, I think that  I misunderstood your comments earlier. I\u0027ll get back to you early next week.","commit_id":"0b3c9fdb24876799892bd4cb82726457f608a11f"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"163c21666e7e3e06dc4925d3920d80d6162d0fa9","unresolved":false,"context_lines":[{"line_number":2918,"context_line":"        l3_test_common.router_append_pd_enabled_subnet(router, count\u003d1)"},{"line_number":2919,"context_line":"        ri.process()"},{"line_number":2920,"context_line":""},{"line_number":2921,"context_line":"        update_router \u003d copy.deepcopy(update_router)"},{"line_number":2922,"context_line":"        pd_intfs1 \u003d l3_test_common.get_unassigned_pd_interfaces(update_router)"},{"line_number":2923,"context_line":""},{"line_number":2924,"context_line":"        # Get prefixes"}],"source_content_type":"text/x-python","patch_set":13,"id":"da36d5c6_d6cf60ae","line":2921,"range":{"start_line":2921,"start_character":38,"end_line":2921,"end_character":51},"in_reply_to":"da36d5c6_dd340b4c","updated":"2017-02-20 20:10:32.000000000","message":"Thanks Brian. It\u0027s a bug. line 2918 should be\nl3_test_common.router_append_pd_enabled_subnet(update_router, count\u003d1)","commit_id":"0b3c9fdb24876799892bd4cb82726457f608a11f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"c21282b8a76d56430844c3cc5edddce9a0213e80","unresolved":false,"context_lines":[{"line_number":2918,"context_line":"        l3_test_common.router_append_pd_enabled_subnet(router, count\u003d1)"},{"line_number":2919,"context_line":"        ri.process()"},{"line_number":2920,"context_line":""},{"line_number":2921,"context_line":"        update_router \u003d copy.deepcopy(update_router)"},{"line_number":2922,"context_line":"        pd_intfs1 \u003d l3_test_common.get_unassigned_pd_interfaces(update_router)"},{"line_number":2923,"context_line":""},{"line_number":2924,"context_line":"        # Get prefixes"}],"source_content_type":"text/x-python","patch_set":13,"id":"da36d5c6_af62bdab","line":2921,"range":{"start_line":2921,"start_character":38,"end_line":2921,"end_character":51},"in_reply_to":"fa31d9ce_996d049c","updated":"2017-02-17 20:46:09.000000000","message":"The test still passes even copying L2779 here, with or without the deepcopy.\n\nI must be missing something simple:\n\nfoo \u003d deepcopy(bar) - looks fine\n\nfoo \u003d deepcopy(foo) - ?\n\n\nI changed the code to this:\n\n    upd \u003d copy.deepcopy(update_router)\n    self.assertEqual(upd, update_router)\n\nAnd that succeeds.  Do I need to go re-take some python courses? :)","commit_id":"0b3c9fdb24876799892bd4cb82726457f608a11f"},{"author":{"_account_id":6685,"name":"Baodong (Robert) Li","email":"baoli@cisco.com","username":"baoli"},"change_message_id":"dab0321a98ae7d3b53c7419cc4d09edef506a999","unresolved":false,"context_lines":[{"line_number":2918,"context_line":"        l3_test_common.router_append_pd_enabled_subnet(router, count\u003d1)"},{"line_number":2919,"context_line":"        ri.process()"},{"line_number":2920,"context_line":""},{"line_number":2921,"context_line":"        update_router \u003d copy.deepcopy(update_router)"},{"line_number":2922,"context_line":"        pd_intfs1 \u003d l3_test_common.get_unassigned_pd_interfaces(update_router)"},{"line_number":2923,"context_line":""},{"line_number":2924,"context_line":"        # Get prefixes"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa31d9ce_996d049c","line":2921,"range":{"start_line":2921,"start_character":38,"end_line":2921,"end_character":51},"in_reply_to":"fa31d9ce_bb2ac38e","updated":"2017-02-17 17:51:24.000000000","message":"Let me see if I can explain it. \n\nline 2918 added a new pd-enabled subnet, line 2919 caused the subnet to be added into pd. line 2921 makes a copy of the router, and get the pd interface\u0027s handle from update_router. line 2925 causes the pd_infs to be populated with the prefix (by simulating the pd process). Without line 2921 and 2922 (as in the line 2879 in the base version at left), line 2925 would update the pd interface data in the \u0027router\u0027 (rather than in update_router). But keep in mind as a result of line 2919, the pd intf is cached  in ri.internal_ports (see line 538 at _process_internal_ports() in router_info.py)\n\nNow ri.process should be called with updated prefix and fixed_ips (just like it is called by receiving an update from neutron server).\n\nNote that without doing the copy, line 2925 would update the \u0027router\u0027 (rather than the update_router). So later on in router_info _process_internal_ports(), updated_ports will be empty since identical data is being compared (at line 481 in router_info.py).\n\nAgain, adding line 2779 here will cause the test to fail without using update_router. If you agree, I can add it to every relevant test. Even without adding it, doing so everywhere would make it consistent across the relevant tests.\n\nHopefully, the above will make it a bit clearer.","commit_id":"0b3c9fdb24876799892bd4cb82726457f608a11f"}]}
