)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"92431c2061ca9731795bd068d8ac3d32cad64a7d","unresolved":false,"context_lines":[{"line_number":17,"context_line":"This change relaxed a conditional that prevents the right list of"},{"line_number":18,"context_line":"routers to be compiled and returned from the server to the agent."},{"line_number":19,"context_line":"The agent on the other hand needs to make sure to allocate the"},{"line_number":20,"context_line":"right type of router based on what is being returned to the server."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Closes-bug: #1733987"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ff82abbf_326a7119","line":20,"range":{"start_line":20,"start_character":53,"end_line":20,"end_character":55},"updated":"2017-11-29 18:29:34.000000000","message":"from","commit_id":"5c9d73dd262206b5d2e5ff37b58f6249e73161af"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"ccd5562b1bc4af725542debd2df5ecf2b5e77100","unresolved":false,"context_lines":[{"line_number":17,"context_line":"This change relaxed a conditional that prevents the right list of"},{"line_number":18,"context_line":"routers to be compiled and returned from the server to the agent."},{"line_number":19,"context_line":"The agent on the other hand needs to make sure to allocate the"},{"line_number":20,"context_line":"right type of router based on what is being returned to the server."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Closes-bug: #1733987"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"ff82abbf_375a6082","line":20,"range":{"start_line":20,"start_character":53,"end_line":20,"end_character":55},"in_reply_to":"ff82abbf_326a7119","updated":"2017-11-29 20:02:38.000000000","message":"Done","commit_id":"5c9d73dd262206b5d2e5ff37b58f6249e73161af"}],"neutron/agent/l3/agent.py":[{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"277ec04f5caf7b5b3db9e5c5783ea8538445c898","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        if router.get(\u0027distributed\u0027):"},{"line_number":322,"context_line":"            kwargs[\u0027host\u0027] \u003d self.host"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        if router.get(\u0027distributed\u0027) and router.get(\u0027ha\u0027):"},{"line_number":325,"context_line":"            # if the router does not contain information about the HA interface"},{"line_number":326,"context_line":"            # this means that this DVR+HA router needs to host only the edge"},{"line_number":327,"context_line":"            # side of it, typically because it\u0027s landing on a node that needs"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_fcb5ff32","line":324,"updated":"2017-11-27 19:26:28.000000000","message":"The only issue that I see is with \u0027HA\u0027 enabled, (active/standby) do we expect the \u0027ha\u0027 router to be on both the nodes active with this change.","commit_id":"e2e4787e880fca1d3cae3d193999394bce1fccc1"},{"author":{"_account_id":7016,"name":"Swaminathan Vasudevan","email":"swvasude@cisco.com","username":"souminathan"},"change_message_id":"1a2b67dd8b9808f71c759ee79bbe2e8088da5ace","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        if router.get(\u0027distributed\u0027):"},{"line_number":322,"context_line":"            kwargs[\u0027host\u0027] \u003d self.host"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        if router.get(\u0027distributed\u0027) and router.get(\u0027ha\u0027):"},{"line_number":325,"context_line":"            # if the router does not contain information about the HA interface"},{"line_number":326,"context_line":"            # this means that this DVR+HA router needs to host only the edge"},{"line_number":327,"context_line":"            # side of it, typically because it\u0027s landing on a node that needs"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_f6199679","line":324,"in_reply_to":"ff82abbf_c22cd003","updated":"2017-11-27 23:12:32.000000000","message":"So my question was to understand the impact on the router namespaces on both the nodes where there are DHCP servers and if HA is enabled. If the router is only active on a single Node and passive on the other node.","commit_id":"e2e4787e880fca1d3cae3d193999394bce1fccc1"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"a3576e7e345f7eaeb1c7e7ebc0ae2e659c514d9b","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        if router.get(\u0027distributed\u0027):"},{"line_number":322,"context_line":"            kwargs[\u0027host\u0027] \u003d self.host"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        if router.get(\u0027distributed\u0027) and router.get(\u0027ha\u0027):"},{"line_number":325,"context_line":"            # if the router does not contain information about the HA interface"},{"line_number":326,"context_line":"            # this means that this DVR+HA router needs to host only the edge"},{"line_number":327,"context_line":"            # side of it, typically because it\u0027s landing on a node that needs"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_d137bcfe","line":324,"in_reply_to":"ff82abbf_f6199679","updated":"2017-11-28 01:27:29.000000000","message":"Without this change the router namespace would not show up on the node that is running both the DHCP agent in charge of the network and the L3 agent in charge of of one of the router replicas. It\u0027s my understanding that to make traffic flow from the DHCP namespace and out, we\u0027d only need the DvrEdge side of the router.\n\nDid I get what you mean?","commit_id":"e2e4787e880fca1d3cae3d193999394bce1fccc1"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"ee051309da022874e15e37ebdd45db3b359ea019","unresolved":false,"context_lines":[{"line_number":321,"context_line":"        if router.get(\u0027distributed\u0027):"},{"line_number":322,"context_line":"            kwargs[\u0027host\u0027] \u003d self.host"},{"line_number":323,"context_line":""},{"line_number":324,"context_line":"        if router.get(\u0027distributed\u0027) and router.get(\u0027ha\u0027):"},{"line_number":325,"context_line":"            # if the router does not contain information about the HA interface"},{"line_number":326,"context_line":"            # this means that this DVR+HA router needs to host only the edge"},{"line_number":327,"context_line":"            # side of it, typically because it\u0027s landing on a node that needs"}],"source_content_type":"text/x-python","patch_set":4,"id":"ff82abbf_c22cd003","line":324,"in_reply_to":"ff82abbf_fcb5ff32","updated":"2017-11-27 20:57:31.000000000","message":"I am not sure I understand how to parse your feedback and address your concern. Could you rephrase, please?","commit_id":"e2e4787e880fca1d3cae3d193999394bce1fccc1"}],"neutron/db/l3_hamode_db.py":[{"author":{"_account_id":10267,"name":"venkata anil","email":"anilvenkata@redhat.com","username":"anil"},"change_message_id":"e812af8abf1b3930cc9c409e6725eb59e004b1f8","unresolved":false,"context_lines":[{"line_number":618,"context_line":"        # or \u0027dvr_no_external\u0027 mode (as opposed to \u0027dvr_snat\u0027), then we want to"},{"line_number":619,"context_line":"        # always return it even though it\u0027s missing the \u0027_ha_interface\u0027 key."},{"line_number":620,"context_line":"        return [r for r in list(routers_dict.values())"},{"line_number":621,"context_line":"                if (agent_mode \u003d\u003d constants.L3_AGENT_MODE_DVR or"},{"line_number":622,"context_line":"                    agent_mode \u003d\u003d n_const.L3_AGENT_MODE_DVR_NO_EXTERNAL or"},{"line_number":623,"context_line":"                    not r.get(\u0027ha\u0027) or r.get(constants.HA_INTERFACE_KEY))]"},{"line_number":624,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_d5ee9a20","side":"PARENT","line":621,"updated":"2017-11-29 11:33:02.000000000","message":"I am trying to understand the existing code. I feel the comments above and the code here are not matching.\n\nTwo things:\n1) if \"dvr\" or \"dvr_no_external\" or \"missing _ha_interface\" \u003d\u003e should be represented as \n  if (agent_mode \u003d\u003d constants.L3_AGENT_MODE_DVR or\n      agent_mode \u003d\u003d n_const.L3_AGENT_MODE_DVR_NO_EXTERNAL or\n      not r.get(constants.HA_INTERFACE_KEY))              \n2) if it is \"not r.get(\u0027ha\u0027)\", how come it can have \"r.get(constants.HA_INTERFACE_KEY)\"? i.e only HA router will have HA interface.","commit_id":"618ee8658f601ca9ea3d9ec3ed2f5ef16a2b592f"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"ccd5562b1bc4af725542debd2df5ecf2b5e77100","unresolved":false,"context_lines":[{"line_number":618,"context_line":"        # or \u0027dvr_no_external\u0027 mode (as opposed to \u0027dvr_snat\u0027), then we want to"},{"line_number":619,"context_line":"        # always return it even though it\u0027s missing the \u0027_ha_interface\u0027 key."},{"line_number":620,"context_line":"        return [r for r in list(routers_dict.values())"},{"line_number":621,"context_line":"                if (agent_mode \u003d\u003d constants.L3_AGENT_MODE_DVR or"},{"line_number":622,"context_line":"                    agent_mode \u003d\u003d n_const.L3_AGENT_MODE_DVR_NO_EXTERNAL or"},{"line_number":623,"context_line":"                    not r.get(\u0027ha\u0027) or r.get(constants.HA_INTERFACE_KEY))]"},{"line_number":624,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_3a5567fa","side":"PARENT","line":621,"in_reply_to":"ff82abbf_d5ee9a20","updated":"2017-11-29 20:02:38.000000000","message":"\u003e I am trying to understand the existing code. I feel the comments\n \u003e above and the code here are not matching.\n\nThe old comment or the new one? :)\n\n \u003e \n \u003e Two things:\n \u003e 1) if \"dvr\" or \"dvr_no_external\" or \"missing _ha_interface\" \u003d\u003e\n \u003e should be represented as\n \u003e if (agent_mode \u003d\u003d constants.L3_AGENT_MODE_DVR or\n \u003e agent_mode \u003d\u003d n_const.L3_AGENT_MODE_DVR_NO_EXTERNAL or\n \u003e not r.get(constants.HA_INTERFACE_KEY))\n\nThe way I understood this is that because of the OR operator this can eval to True even if the HA interface is missing.\n\n \u003e 2) if it is \"not r.get(\u0027ha\u0027)\", how come it can have\n \u003e \"r.get(constants.HA_INTERFACE_KEY)\"? i.e only HA router will have\n \u003e HA interface.\n\nThat\u0027s my understanding too. However r.get(constants.HA_INTERFACE_KEY) can eval to None even if it\u0027s a HA router (but distributed), where the agent requesting the update is not part of the VRRP cluster, but simply one that needs to service a DVR serviceable port.","commit_id":"618ee8658f601ca9ea3d9ec3ed2f5ef16a2b592f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"e11e69f9fa550cdb6acad177eda78c2a0853600d","unresolved":false,"context_lines":[{"line_number":619,"context_line":"        # to figure out what kind of router setup is needed."},{"line_number":620,"context_line":"        # NOTE(armax): best to be specific on what kinds of agent modes"},{"line_number":621,"context_line":"        # we expect, thus this is done this way vs agent_mode !\u003d legacy"},{"line_number":622,"context_line":"        any_dvr_agent \u003d ("},{"line_number":623,"context_line":"            agent_mode in (constants.L3_AGENT_MODE_DVR_SNAT,"},{"line_number":624,"context_line":"                           constants.L3_AGENT_MODE_DVR,"},{"line_number":625,"context_line":"                           n_const.L3_AGENT_MODE_DVR_NO_EXTERNAL)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_34db3e4f","line":622,"range":{"start_line":622,"start_character":8,"end_line":622,"end_character":21},"updated":"2017-11-29 19:24:26.000000000","message":"nit: L635 uses dvr_agent_mode :p\n\nWhich led me to see a small optimization below.","commit_id":"5c9d73dd262206b5d2e5ff37b58f6249e73161af"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"ccd5562b1bc4af725542debd2df5ecf2b5e77100","unresolved":false,"context_lines":[{"line_number":619,"context_line":"        # to figure out what kind of router setup is needed."},{"line_number":620,"context_line":"        # NOTE(armax): best to be specific on what kinds of agent modes"},{"line_number":621,"context_line":"        # we expect, thus this is done this way vs agent_mode !\u003d legacy"},{"line_number":622,"context_line":"        any_dvr_agent \u003d ("},{"line_number":623,"context_line":"            agent_mode in (constants.L3_AGENT_MODE_DVR_SNAT,"},{"line_number":624,"context_line":"                           constants.L3_AGENT_MODE_DVR,"},{"line_number":625,"context_line":"                           n_const.L3_AGENT_MODE_DVR_NO_EXTERNAL)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_b7e2f09e","line":622,"range":{"start_line":622,"start_character":8,"end_line":622,"end_character":21},"in_reply_to":"ff82abbf_34db3e4f","updated":"2017-11-29 20:02:38.000000000","message":"Done","commit_id":"5c9d73dd262206b5d2e5ff37b58f6249e73161af"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"e11e69f9fa550cdb6acad177eda78c2a0853600d","unresolved":false,"context_lines":[{"line_number":626,"context_line":"        )"},{"line_number":627,"context_line":"        return [r for r in list(routers_dict.values())"},{"line_number":628,"context_line":"                if (any_dvr_agent or"},{"line_number":629,"context_line":"                    not r.get(\u0027ha\u0027) or r.get(constants.HA_INTERFACE_KEY))]"},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"    @log_helpers.log_method_call"},{"line_number":632,"context_line":"    def get_ha_sync_data_for_host(self, context, host, agent,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_97524c12","line":629,"updated":"2017-11-29 19:24:26.000000000","message":"Anil had a good question on the comment, it is confusing.","commit_id":"5c9d73dd262206b5d2e5ff37b58f6249e73161af"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"ccd5562b1bc4af725542debd2df5ecf2b5e77100","unresolved":false,"context_lines":[{"line_number":626,"context_line":"        )"},{"line_number":627,"context_line":"        return [r for r in list(routers_dict.values())"},{"line_number":628,"context_line":"                if (any_dvr_agent or"},{"line_number":629,"context_line":"                    not r.get(\u0027ha\u0027) or r.get(constants.HA_INTERFACE_KEY))]"},{"line_number":630,"context_line":""},{"line_number":631,"context_line":"    @log_helpers.log_method_call"},{"line_number":632,"context_line":"    def get_ha_sync_data_for_host(self, context, host, agent,"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_d7dd34dd","line":629,"in_reply_to":"ff82abbf_97524c12","updated":"2017-11-29 20:02:38.000000000","message":"Let me know if my answer makes sense.","commit_id":"5c9d73dd262206b5d2e5ff37b58f6249e73161af"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"e11e69f9fa550cdb6acad177eda78c2a0853600d","unresolved":false,"context_lines":[{"line_number":635,"context_line":"        dvr_agent_mode \u003d ("},{"line_number":636,"context_line":"            agent_mode in [constants.L3_AGENT_MODE_DVR_SNAT,"},{"line_number":637,"context_line":"                           constants.L3_AGENT_MODE_DVR,"},{"line_number":638,"context_line":"                           n_const.L3_AGENT_MODE_DVR_NO_EXTERNAL])"},{"line_number":639,"context_line":"        if (dvr_agent_mode and n_utils.is_extension_supported("},{"line_number":640,"context_line":"                self, constants.L3_DISTRIBUTED_EXT_ALIAS)):"},{"line_number":641,"context_line":"            # DVR has to be handled differently"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_d470d242","line":638,"updated":"2017-11-29 19:24:26.000000000","message":"The only caller of _process_sync_ha_data() already did this....","commit_id":"5c9d73dd262206b5d2e5ff37b58f6249e73161af"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"ccd5562b1bc4af725542debd2df5ecf2b5e77100","unresolved":false,"context_lines":[{"line_number":635,"context_line":"        dvr_agent_mode \u003d ("},{"line_number":636,"context_line":"            agent_mode in [constants.L3_AGENT_MODE_DVR_SNAT,"},{"line_number":637,"context_line":"                           constants.L3_AGENT_MODE_DVR,"},{"line_number":638,"context_line":"                           n_const.L3_AGENT_MODE_DVR_NO_EXTERNAL])"},{"line_number":639,"context_line":"        if (dvr_agent_mode and n_utils.is_extension_supported("},{"line_number":640,"context_line":"                self, constants.L3_DISTRIBUTED_EXT_ALIAS)):"},{"line_number":641,"context_line":"            # DVR has to be handled differently"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_77f22872","line":638,"in_reply_to":"ff82abbf_d470d242","updated":"2017-11-29 20:02:38.000000000","message":"Done","commit_id":"5c9d73dd262206b5d2e5ff37b58f6249e73161af"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"e11e69f9fa550cdb6acad177eda78c2a0853600d","unresolved":false,"context_lines":[{"line_number":644,"context_line":"        else:"},{"line_number":645,"context_line":"            sync_data \u003d super(L3_HA_NAT_db_mixin, self).get_sync_data(context,"},{"line_number":646,"context_line":"                                                            router_ids, active)"},{"line_number":647,"context_line":"        return self._process_sync_ha_data(context, sync_data, host, agent_mode)"},{"line_number":648,"context_line":""},{"line_number":649,"context_line":"    @classmethod"},{"line_number":650,"context_line":"    def _set_router_states(cls, context, bindings, states):"}],"source_content_type":"text/x-python","patch_set":5,"id":"ff82abbf_14a07a8f","line":647,"updated":"2017-11-29 19:24:26.000000000","message":"... so it could just pass \u0027dvr_agent_mode\u0027 along.","commit_id":"5c9d73dd262206b5d2e5ff37b58f6249e73161af"}]}
