)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ea10cf3b6cd2a729aab03b8adfa37969b3ef58ec","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Added unique cookie to OVS firewall driver flows,"},{"line_number":10,"context_line":"to allow better flow tracking."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Modified port deletion during port binding. Now flows"},{"line_number":13,"context_line":"deleted are filtered by in_port and cookie; only flows"},{"line_number":14,"context_line":"with cookie not present in reserved ones or matching the"},{"line_number":15,"context_line":"cookie used by OVS agent will be deleted."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"1a122d0e_7b4f5834","line":13,"range":{"start_line":12,"start_character":48,"end_line":13,"end_character":7},"updated":"2016-05-04 09:16:06.000000000","message":"deleted flows","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ad8cd861e995d81ee7a28b629d9c10bfbedf0e38","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Added unique cookie to OVS firewall driver flows,"},{"line_number":10,"context_line":"to allow better flow tracking."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Modified port deletion during port binding. Now flows"},{"line_number":13,"context_line":"deleted are filtered by in_port and cookie; only flows"},{"line_number":14,"context_line":"with cookie not present in reserved ones or matching the"},{"line_number":15,"context_line":"cookie used by OVS agent will be deleted."},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":12,"id":"1a122d0e_6b81334d","line":13,"range":{"start_line":12,"start_character":48,"end_line":13,"end_character":7},"in_reply_to":"1a122d0e_7b4f5834","updated":"2016-05-09 08:55:27.000000000","message":"Done","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"7e0d301871e3a6ab3037862fab7b4e9931df8c98","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Modified port deletion during port binding. Now deleted"},{"line_number":13,"context_line":"flows are filtered by in_port and cookie; only flows"},{"line_number":14,"context_line":"with cookie not present in reserved ones or matching the"},{"line_number":15,"context_line":"cookie used by OVS agent will be deleted."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: Iecf9af21cf389c98db7f73379ccd05da18da44e9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"bacf61ea_0631685a","line":14,"range":{"start_line":14,"start_character":5,"end_line":14,"end_character":43},"updated":"2016-08-05 09:22:33.000000000","message":"for what is this part (\"cookie not present in reserved ones or\") necessary?\nis there any known external code which relies on this to remove their flows?","commit_id":"fa98ce73b5a23e0a40394f6201a50db707c688fc"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c39fcd3cc280761345f0d59e023a526e05ff44fe","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Modified port deletion during port binding. Now deleted"},{"line_number":13,"context_line":"flows are filtered by in_port and cookie; only flows"},{"line_number":14,"context_line":"with cookie not present in reserved ones or matching the"},{"line_number":15,"context_line":"cookie used by OVS agent will be deleted."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: Iecf9af21cf389c98db7f73379ccd05da18da44e9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"bacf61ea_2989df26","line":14,"range":{"start_line":14,"start_character":5,"end_line":14,"end_character":43},"in_reply_to":"bacf61ea_0631685a","updated":"2016-08-05 09:35:23.000000000","message":"\u003e is there any known external code which relies on this to remove their flows?\n\nYes, it\u0027s possible to find flows with other cookies. I found this problem during the OVS agent restart. If you stop and start again the agent, the cookies generated are different and it\u0027s needed to remove the old ones.","commit_id":"fa98ce73b5a23e0a40394f6201a50db707c688fc"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"f37579bdf010f2a7946c1f18aa133214070e2462","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Modified port deletion during port binding. Now deleted"},{"line_number":13,"context_line":"flows are filtered by in_port and cookie; only flows"},{"line_number":14,"context_line":"with cookie not present in reserved ones or matching the"},{"line_number":15,"context_line":"cookie used by OVS agent will be deleted."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: Iecf9af21cf389c98db7f73379ccd05da18da44e9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"bacf61ea_82898071","line":14,"range":{"start_line":14,"start_character":5,"end_line":14,"end_character":43},"in_reply_to":"bacf61ea_2989df26","updated":"2016-08-08 02:28:29.000000000","message":"my question was about external code.\n\nfor ovs-agent restart, cleanup_stale_flows is expected to remove old flows.","commit_id":"fa98ce73b5a23e0a40394f6201a50db707c688fc"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"5673532600ee33c3481f3d2ff409be2d36b42af5","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Modified port deletion during port binding. Now deleted"},{"line_number":13,"context_line":"flows are filtered by in_port and cookie; only flows"},{"line_number":14,"context_line":"with cookie not present in reserved ones or matching the"},{"line_number":15,"context_line":"cookie used by OVS agent will be deleted."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: Iecf9af21cf389c98db7f73379ccd05da18da44e9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"9ad45d7e_315ecb76","line":14,"range":{"start_line":14,"start_character":5,"end_line":14,"end_character":43},"in_reply_to":"bacf61ea_82898071","updated":"2016-08-09 13:14:21.000000000","message":"\u003e\u003e for ovs-agent restart, cleanup_stale_flows is expected to remove old flows.\n\nPrecisely this is the problem: \"cleanup_stale_flows\" is executed AFTER \"sg_agent\" sets the firewall flows. Because of that, some flows added by the current firewall agent (not former flows, added by other firewall threads not active) are being deleted.\n\nYou can check that:\n- Creating a SG.\n- Adding several rules.\n- Adding a new virtual machine.\n- Stop/start the agent (and the firewall inside it)\n--\u003e Some flows will be deleted.\n\nThis patch prevents this.","commit_id":"fa98ce73b5a23e0a40394f6201a50db707c688fc"}],"neutron/agent/linux/openvswitch_firewall/firewall.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ea10cf3b6cd2a729aab03b8adfa37969b3ef58ec","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from neutron.common import ipv6_utils"},{"line_number":27,"context_line":"from neutron.plugins.ml2.drivers.openvswitch.agent.common import constants \\"},{"line_number":28,"context_line":"        as ovs_consts"},{"line_number":29,"context_line":"from neutron.plugins.ml2.drivers.openvswitch.agent.ovs_agent_extension_api\\"},{"line_number":30,"context_line":"    import OVSCookieBridge"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_5bf89cc4","line":30,"range":{"start_line":29,"start_character":0,"end_line":30,"end_character":26},"updated":"2016-05-04 09:16:06.000000000","message":"We should import module, not just object: http://docs.openstack.org/developer/hacking/#imports","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ad8cd861e995d81ee7a28b629d9c10bfbedf0e38","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from neutron.common import ipv6_utils"},{"line_number":27,"context_line":"from neutron.plugins.ml2.drivers.openvswitch.agent.common import constants \\"},{"line_number":28,"context_line":"        as ovs_consts"},{"line_number":29,"context_line":"from neutron.plugins.ml2.drivers.openvswitch.agent.ovs_agent_extension_api\\"},{"line_number":30,"context_line":"    import OVSCookieBridge"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_ebc38388","line":30,"range":{"start_line":29,"start_character":0,"end_line":30,"end_character":26},"in_reply_to":"1a122d0e_5bf89cc4","updated":"2016-05-09 08:55:27.000000000","message":"Done","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"}],"neutron/plugins/ml2/drivers/openvswitch/agent/openflow/native/ofswitch.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d3e2e92510fc6c182676a19be78fe8aa900eba0b","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        cookies \u003d (set([f.cookie for f in self.dump_flows(**kwargs)]) -"},{"line_number":141,"context_line":"                   excluded_cookies)"},{"line_number":142,"context_line":"        for c in cookies:"},{"line_number":143,"context_line":"            LOG.warning(_LW(\"Deleting flow with cookie 0x%(cookie)x, extra\""},{"line_number":144,"context_line":"                            \" parameters: %(kwargs)s\"),"},{"line_number":145,"context_line":"                        {\u0027cookie\u0027: c, \u0027kwargs\u0027: kwargs})"},{"line_number":146,"context_line":"            self.delete_flows(cookie\u003dc, cookie_mask\u003d((1 \u003c\u003c 64) - 1), **kwargs)"}],"source_content_type":"text/x-python","patch_set":22,"id":"1aa78d24_70305857","line":143,"updated":"2016-07-04 13:55:46.000000000","message":"Won\u0027t this stop being a rare event anymore ? ^","commit_id":"9d436908e28b70d5b8a87d68f90d9de3fc458dc5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3159fb950ae6c850e4da565f95c7adbffc0cca5f","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        cookies \u003d (set([f.cookie for f in self.dump_flows(**kwargs)]) -"},{"line_number":141,"context_line":"                   excluded_cookies)"},{"line_number":142,"context_line":"        for c in cookies:"},{"line_number":143,"context_line":"            LOG.warning(_LW(\"Deleting flow with cookie 0x%(cookie)x, extra\""},{"line_number":144,"context_line":"                            \" parameters: %(kwargs)s\"),"},{"line_number":145,"context_line":"                        {\u0027cookie\u0027: c, \u0027kwargs\u0027: kwargs})"},{"line_number":146,"context_line":"            self.delete_flows(cookie\u003dc, cookie_mask\u003d((1 \u003c\u003c 64) - 1), **kwargs)"}],"source_content_type":"text/x-python","patch_set":22,"id":"1aa78d24_6a17c4a3","line":143,"in_reply_to":"1aa78d24_70305857","updated":"2016-07-04 15:00:21.000000000","message":"Do you mean to change \"warning\" to \"info\"?\n\nI\u0027ll change it.","commit_id":"9d436908e28b70d5b8a87d68f90d9de3fc458dc5"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"8504e545e2017a9dfab4b5d31ee96f06d28c04fe","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        cookies \u003d (set([f.cookie for f in self.dump_flows(**kwargs)]) -"},{"line_number":141,"context_line":"                   excluded_cookies)"},{"line_number":142,"context_line":"        for c in cookies:"},{"line_number":143,"context_line":"            LOG.info(_LI(\"Deleting flow with cookie 0x%(cookie)x, extra\""},{"line_number":144,"context_line":"                         \" parameters: %(kwargs)s\"),"},{"line_number":145,"context_line":"                     {\u0027cookie\u0027: c, \u0027kwargs\u0027: kwargs})"},{"line_number":146,"context_line":"            self.delete_flows(cookie\u003dc, cookie_mask\u003d((1 \u003c\u003c 64) - 1), **kwargs)"}],"source_content_type":"text/x-python","patch_set":25,"id":"dada55a8_5af3a19f","line":143,"updated":"2016-07-24 13:06:16.000000000","message":"please add space at the end of the line","commit_id":"f9b05fe11629fe3a2987356e2c2c4f90e334b48d"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"584d9be1c38cad73b853df17659145bf1cd7c928","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                              out_port\u003dofp.OFPP_ANY)"},{"line_number":122,"context_line":"        self._send_msg(msg)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def dump_flows(self, table_id\u003dNone, **kwargs):"},{"line_number":125,"context_line":"        (dp, ofp, ofpp) \u003d self._get_dp()"},{"line_number":126,"context_line":"        if table_id is None:"},{"line_number":127,"context_line":"            table_id \u003d ofp.OFPTT_ALL"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a71b18c_566749b6","line":124,"range":{"start_line":124,"start_character":40,"end_line":124,"end_character":48},"updated":"2016-12-06 11:23:32.000000000","message":"please follow the existing convention: match\u003dNone, **match_kwargs","commit_id":"b00dcca055ea2a398d43e7b72beba963b5eabab6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7e0d0f47683edd9b31515a3593897d3df9c74a7e","unresolved":false,"context_lines":[{"line_number":121,"context_line":"                              out_port\u003dofp.OFPP_ANY)"},{"line_number":122,"context_line":"        self._send_msg(msg)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def dump_flows(self, table_id\u003dNone, **kwargs):"},{"line_number":125,"context_line":"        (dp, ofp, ofpp) \u003d self._get_dp()"},{"line_number":126,"context_line":"        if table_id is None:"},{"line_number":127,"context_line":"            table_id \u003d ofp.OFPTT_ALL"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a71b18c_29aa7219","line":124,"range":{"start_line":124,"start_character":40,"end_line":124,"end_character":48},"in_reply_to":"3a71b18c_566749b6","updated":"2016-12-06 15:35:13.000000000","message":"Done","commit_id":"b00dcca055ea2a398d43e7b72beba963b5eabab6"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"584d9be1c38cad73b853df17659145bf1cd7c928","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            flows +\u003d rep.body"},{"line_number":136,"context_line":"        return flows"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def cleanup_flows(self, excluded_cookies\u003dNone, **kwargs):"},{"line_number":139,"context_line":"        excluded_cookies \u003d excluded_cookies or self.reserved_cookies"},{"line_number":140,"context_line":"        cookies \u003d (set([f.cookie for f in self.dump_flows(**kwargs)]) -"},{"line_number":141,"context_line":"                   excluded_cookies)"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a71b18c_960ba1d5","line":138,"range":{"start_line":138,"start_character":51,"end_line":138,"end_character":59},"updated":"2016-12-06 11:23:32.000000000","message":"ditto","commit_id":"b00dcca055ea2a398d43e7b72beba963b5eabab6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7e0d0f47683edd9b31515a3593897d3df9c74a7e","unresolved":false,"context_lines":[{"line_number":135,"context_line":"            flows +\u003d rep.body"},{"line_number":136,"context_line":"        return flows"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    def cleanup_flows(self, excluded_cookies\u003dNone, **kwargs):"},{"line_number":139,"context_line":"        excluded_cookies \u003d excluded_cookies or self.reserved_cookies"},{"line_number":140,"context_line":"        cookies \u003d (set([f.cookie for f in self.dump_flows(**kwargs)]) -"},{"line_number":141,"context_line":"                   excluded_cookies)"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a71b18c_49a5ee44","line":138,"range":{"start_line":138,"start_character":51,"end_line":138,"end_character":59},"in_reply_to":"3a71b18c_960ba1d5","updated":"2016-12-06 15:35:13.000000000","message":"Done","commit_id":"b00dcca055ea2a398d43e7b72beba963b5eabab6"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"88ad1a66af38224830bc8eee7fe1d7b49fd03fa1","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    def cleanup_flows(self, excluded_cookies\u003dNone, match\u003dNone, **match_kwargs):"},{"line_number":139,"context_line":"        excluded_cookies \u003d excluded_cookies or self.reserved_cookies"},{"line_number":140,"context_line":"        cookies \u003d (set([f.cookie for f in self.dump_flows("},{"line_number":141,"context_line":"            math\u003dmatch, **match_kwargs)]) - excluded_cookies)"},{"line_number":142,"context_line":"        for c in cookies:"},{"line_number":143,"context_line":"            LOG.info(_LI(\"Deleting flow with cookie 0x%(cookie)x, extra \""},{"line_number":144,"context_line":"                         \"parameters: %(kwargs)s\"),"}],"source_content_type":"text/x-python","patch_set":33,"id":"3a71b18c_c77b4c28","line":141,"range":{"start_line":141,"start_character":11,"end_line":141,"end_character":17},"updated":"2016-12-08 03:08:26.000000000","message":"typo","commit_id":"c717e81e08950061754636de958ae29b087c9e1c"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"243eaa5bc97fe77583a43b96cd35e7617cbe31e0","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    def cleanup_flows(self, excluded_cookies\u003dNone, match\u003dNone, **match_kwargs):"},{"line_number":139,"context_line":"        excluded_cookies \u003d excluded_cookies or self.reserved_cookies"},{"line_number":140,"context_line":"        cookies \u003d (set([f.cookie for f in self.dump_flows("},{"line_number":141,"context_line":"            math\u003dmatch, **match_kwargs)]) - excluded_cookies)"},{"line_number":142,"context_line":"        for c in cookies:"},{"line_number":143,"context_line":"            LOG.info(_LI(\"Deleting flow with cookie 0x%(cookie)x, extra \""},{"line_number":144,"context_line":"                         \"parameters: %(kwargs)s\"),"}],"source_content_type":"text/x-python","patch_set":33,"id":"3a71b18c_ce0fe02c","line":141,"range":{"start_line":141,"start_character":11,"end_line":141,"end_character":17},"in_reply_to":"3a71b18c_c77b4c28","updated":"2016-12-08 08:22:46.000000000","message":"Done","commit_id":"c717e81e08950061754636de958ae29b087c9e1c"}],"neutron/plugins/ml2/drivers/openvswitch/agent/openflow/ovs_ofctl/ofswitch.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ea10cf3b6cd2a729aab03b8adfa37969b3ef58ec","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        else:"},{"line_number":88,"context_line":"            super(OpenFlowSwitchMixin, self).remove_all_flows()"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def _filter_flows(self, flows, excluded_cookies\u003dset()):"},{"line_number":91,"context_line":"        LOG.debug(\"Bridge cookies used to filter flows: %s\","},{"line_number":92,"context_line":"                  excluded_cookies)"},{"line_number":93,"context_line":"        cookie_re \u003d re.compile(\u0027cookie\u003d(0x[A-Fa-f0-9]*)\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_1b25845b","line":90,"range":{"start_line":90,"start_character":35,"end_line":90,"end_character":57},"updated":"2016-05-04 09:16:06.000000000","message":"excluded_cookies\u003dNone):\n...\n excluded_cookies \u003d excluded_cookies or set()","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ad8cd861e995d81ee7a28b629d9c10bfbedf0e38","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        else:"},{"line_number":88,"context_line":"            super(OpenFlowSwitchMixin, self).remove_all_flows()"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def _filter_flows(self, flows, excluded_cookies\u003dset()):"},{"line_number":91,"context_line":"        LOG.debug(\"Bridge cookies used to filter flows: %s\","},{"line_number":92,"context_line":"                  excluded_cookies)"},{"line_number":93,"context_line":"        cookie_re \u003d re.compile(\u0027cookie\u003d(0x[A-Fa-f0-9]*)\u0027)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_a0436a6b","line":90,"range":{"start_line":90,"start_character":35,"end_line":90,"end_character":57},"in_reply_to":"1a122d0e_1b25845b","updated":"2016-05-09 08:55:27.000000000","message":"Done","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"0180046c62cabfbf59822c69a251eaf1bc5a6875","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                fl_table \u003d fl_table.group(1)"},{"line_number":105,"context_line":"                yield flow, fl_cookie, fl_table"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def cleanup_flows(self, excluded_cookies\u003dNone, **kwargs):"},{"line_number":108,"context_line":"        if kwargs:"},{"line_number":109,"context_line":"            flows \u003d self.dump_flows_filter(**kwargs)"},{"line_number":110,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_d906c184","line":107,"updated":"2016-05-02 03:22:23.000000000","message":"you need to update \"native\" variant too.","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ad8cd861e995d81ee7a28b629d9c10bfbedf0e38","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                fl_table \u003d fl_table.group(1)"},{"line_number":105,"context_line":"                yield flow, fl_cookie, fl_table"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def cleanup_flows(self, excluded_cookies\u003dNone, **kwargs):"},{"line_number":108,"context_line":"        if kwargs:"},{"line_number":109,"context_line":"            flows \u003d self.dump_flows_filter(**kwargs)"},{"line_number":110,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_0b187f74","line":107,"in_reply_to":"1a122d0e_9b199425","updated":"2016-05-09 08:55:27.000000000","message":"Done","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ea10cf3b6cd2a729aab03b8adfa37969b3ef58ec","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                fl_table \u003d fl_table.group(1)"},{"line_number":105,"context_line":"                yield flow, fl_cookie, fl_table"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def cleanup_flows(self, excluded_cookies\u003dNone, **kwargs):"},{"line_number":108,"context_line":"        if kwargs:"},{"line_number":109,"context_line":"            flows \u003d self.dump_flows_filter(**kwargs)"},{"line_number":110,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_9b199425","line":107,"in_reply_to":"1a122d0e_d906c184","updated":"2016-05-04 09:16:06.000000000","message":"+1","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ea10cf3b6cd2a729aab03b8adfa37969b3ef58ec","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            flows \u003d self.dump_flows_filter(**kwargs)"},{"line_number":110,"context_line":"        else:"},{"line_number":111,"context_line":"            flows \u003d self.dump_flows_all_tables()"},{"line_number":112,"context_line":"        if not excluded_cookies:"},{"line_number":113,"context_line":"            excluded_cookies \u003d self.reserved_cookies"},{"line_number":114,"context_line":"        for flow, cookie, table in self._filter_flows(flows,"},{"line_number":115,"context_line":"                excluded_cookies\u003dexcluded_cookies):"},{"line_number":116,"context_line":"            # deleting a stale flow should be rare."}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_fbdec83c","line":113,"range":{"start_line":112,"start_character":0,"end_line":113,"end_character":52},"updated":"2016-05-04 09:16:06.000000000","message":"excluded_cookies \u003d excluded_cookies or self.reserved_cookies","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ad8cd861e995d81ee7a28b629d9c10bfbedf0e38","unresolved":false,"context_lines":[{"line_number":109,"context_line":"            flows \u003d self.dump_flows_filter(**kwargs)"},{"line_number":110,"context_line":"        else:"},{"line_number":111,"context_line":"            flows \u003d self.dump_flows_all_tables()"},{"line_number":112,"context_line":"        if not excluded_cookies:"},{"line_number":113,"context_line":"            excluded_cookies \u003d self.reserved_cookies"},{"line_number":114,"context_line":"        for flow, cookie, table in self._filter_flows(flows,"},{"line_number":115,"context_line":"                excluded_cookies\u003dexcluded_cookies):"},{"line_number":116,"context_line":"            # deleting a stale flow should be rare."}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_e05d6249","line":113,"range":{"start_line":112,"start_character":0,"end_line":113,"end_character":52},"in_reply_to":"1a122d0e_fbdec83c","updated":"2016-05-09 08:55:27.000000000","message":"Done","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d3e2e92510fc6c182676a19be78fe8aa900eba0b","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                excluded_cookies\u003dexcluded_cookies):"},{"line_number":116,"context_line":"            # deleting a stale flow should be rare."},{"line_number":117,"context_line":"            # it might deserve some attention"},{"line_number":118,"context_line":"            LOG.warning(_LW(\"Deleting flow %s\"), flow)"},{"line_number":119,"context_line":"            kwargs[\u0027cookie\u0027] \u003d cookie + \u0027/-1\u0027"},{"line_number":120,"context_line":"            kwargs[\u0027table\u0027] \u003d table"},{"line_number":121,"context_line":"            self.delete_flows(**kwargs)"}],"source_content_type":"text/x-python","patch_set":22,"id":"1aa78d24_90ba24e0","line":118,"updated":"2016-07-04 13:55:46.000000000","message":"This won\u0027t be rare anymore as you\u0027re using it now to cleanup specific flows.","commit_id":"9d436908e28b70d5b8a87d68f90d9de3fc458dc5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3159fb950ae6c850e4da565f95c7adbffc0cca5f","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                excluded_cookies\u003dexcluded_cookies):"},{"line_number":116,"context_line":"            # deleting a stale flow should be rare."},{"line_number":117,"context_line":"            # it might deserve some attention"},{"line_number":118,"context_line":"            LOG.warning(_LW(\"Deleting flow %s\"), flow)"},{"line_number":119,"context_line":"            kwargs[\u0027cookie\u0027] \u003d cookie + \u0027/-1\u0027"},{"line_number":120,"context_line":"            kwargs[\u0027table\u0027] \u003d table"},{"line_number":121,"context_line":"            self.delete_flows(**kwargs)"}],"source_content_type":"text/x-python","patch_set":22,"id":"1aa78d24_4a7808f3","line":118,"in_reply_to":"1aa78d24_90ba24e0","updated":"2016-07-04 15:00:21.000000000","message":"Ditto. I\u0027ll change this. Thanks!","commit_id":"9d436908e28b70d5b8a87d68f90d9de3fc458dc5"}],"neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"0180046c62cabfbf59822c69a251eaf1bc5a6875","unresolved":false,"context_lines":[{"line_number":59,"context_line":"cfg.CONF.import_group(\u0027AGENT\u0027, \u0027neutron.plugins.ml2.drivers.openvswitch.\u0027"},{"line_number":60,"context_line":"                               \u0027agent.common.config\u0027)"},{"line_number":61,"context_line":"cfg.CONF.import_group(\u0027OVS\u0027, \u0027neutron.plugins.ml2.drivers.openvswitch.agent.\u0027"},{"line_number":62,"context_line":"                             \u0027common.config\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class _mac_mydialect(netaddr.mac_unix):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_19eaf9ac","line":62,"updated":"2016-05-02 03:22:23.000000000","message":"most changes in this file seem like unrelated whitespace changes.\nplease avoid them.","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ea10cf3b6cd2a729aab03b8adfa37969b3ef58ec","unresolved":false,"context_lines":[{"line_number":59,"context_line":"cfg.CONF.import_group(\u0027AGENT\u0027, \u0027neutron.plugins.ml2.drivers.openvswitch.\u0027"},{"line_number":60,"context_line":"                               \u0027agent.common.config\u0027)"},{"line_number":61,"context_line":"cfg.CONF.import_group(\u0027OVS\u0027, \u0027neutron.plugins.ml2.drivers.openvswitch.agent.\u0027"},{"line_number":62,"context_line":"                             \u0027common.config\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class _mac_mydialect(netaddr.mac_unix):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_3be160fd","line":62,"in_reply_to":"1a122d0e_19eaf9ac","updated":"2016-05-04 09:16:06.000000000","message":"+1","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"c9fe642322a9cc9287218d1c23c90d6146e9aa7f","unresolved":false,"context_lines":[{"line_number":59,"context_line":"cfg.CONF.import_group(\u0027AGENT\u0027, \u0027neutron.plugins.ml2.drivers.openvswitch.\u0027"},{"line_number":60,"context_line":"                               \u0027agent.common.config\u0027)"},{"line_number":61,"context_line":"cfg.CONF.import_group(\u0027OVS\u0027, \u0027neutron.plugins.ml2.drivers.openvswitch.agent.\u0027"},{"line_number":62,"context_line":"                             \u0027common.config\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class _mac_mydialect(netaddr.mac_unix):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_0b26cc15","line":62,"in_reply_to":"1a122d0e_19eaf9ac","updated":"2016-05-04 12:51:58.000000000","message":"yes, please avoid all kinds of unnecessary changes in a patch.","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ad8cd861e995d81ee7a28b629d9c10bfbedf0e38","unresolved":false,"context_lines":[{"line_number":59,"context_line":"cfg.CONF.import_group(\u0027AGENT\u0027, \u0027neutron.plugins.ml2.drivers.openvswitch.\u0027"},{"line_number":60,"context_line":"                               \u0027agent.common.config\u0027)"},{"line_number":61,"context_line":"cfg.CONF.import_group(\u0027OVS\u0027, \u0027neutron.plugins.ml2.drivers.openvswitch.agent.\u0027"},{"line_number":62,"context_line":"                             \u0027common.config\u0027)"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"class _mac_mydialect(netaddr.mac_unix):"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_547ce6b4","line":62,"in_reply_to":"1a122d0e_3be160fd","updated":"2016-05-09 08:55:27.000000000","message":"Done","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1ee600d332a8b376631834d45a0066aec4272213","unresolved":false,"context_lines":[{"line_number":58,"context_line":"from neutron.plugins.ml2.drivers.openvswitch.agent \\"},{"line_number":59,"context_line":"    import ovs_dvr_neutron_agent"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":63,"context_line":"cfg.CONF.import_group(\u0027AGENT\u0027, \u0027neutron.plugins.ml2.drivers.openvswitch.\u0027"},{"line_number":64,"context_line":"                      \u0027agent.common.config\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_f656bfd0","side":"PARENT","line":61,"updated":"2016-05-19 21:09:02.000000000","message":"nit: unrelated change\n\ntip, you can check your changes by doing git show HEAD  before sending for review.","commit_id":"79c1d7efc1a964836a98339e1e820ab6ebc5570e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a746c0fe2cbd7d9ad7f3938e2529d0862a229ea9","unresolved":false,"context_lines":[{"line_number":58,"context_line":"from neutron.plugins.ml2.drivers.openvswitch.agent \\"},{"line_number":59,"context_line":"    import ovs_dvr_neutron_agent"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":63,"context_line":"cfg.CONF.import_group(\u0027AGENT\u0027, \u0027neutron.plugins.ml2.drivers.openvswitch.\u0027"},{"line_number":64,"context_line":"                      \u0027agent.common.config\u0027)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_f8121756","side":"PARENT","line":61,"in_reply_to":"bab6814e_f656bfd0","updated":"2016-05-20 09:43:12.000000000","message":"Done","commit_id":"79c1d7efc1a964836a98339e1e820ab6ebc5570e"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1ee600d332a8b376631834d45a0066aec4272213","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"class LocalVLANMapping(object):"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def __init__(self, vlan, network_type, physical_network, segmentation_id,"},{"line_number":76,"context_line":"                 vif_ports\u003dNone):"},{"line_number":77,"context_line":"        if vif_ports is None:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_166263ad","side":"PARENT","line":74,"updated":"2016-05-19 21:09:02.000000000","message":"nit: unrelated change","commit_id":"79c1d7efc1a964836a98339e1e820ab6ebc5570e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a746c0fe2cbd7d9ad7f3938e2529d0862a229ea9","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"class LocalVLANMapping(object):"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    def __init__(self, vlan, network_type, physical_network, segmentation_id,"},{"line_number":76,"context_line":"                 vif_ports\u003dNone):"},{"line_number":77,"context_line":"        if vif_ports is None:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_785467fe","side":"PARENT","line":74,"in_reply_to":"bab6814e_166263ad","updated":"2016-05-20 09:43:12.000000000","message":"Done","commit_id":"79c1d7efc1a964836a98339e1e820ab6ebc5570e"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1ee600d332a8b376631834d45a0066aec4272213","unresolved":false,"context_lines":[{"line_number":2076,"context_line":"        with polling.get_polling_manager("},{"line_number":2077,"context_line":"            self.minimize_polling,"},{"line_number":2078,"context_line":"            self.ovsdb_monitor_respawn_interval) as pm:"},{"line_number":2079,"context_line":""},{"line_number":2080,"context_line":"            self.rpc_loop(polling_manager\u003dpm)"},{"line_number":2081,"context_line":""},{"line_number":2082,"context_line":"    def _handle_sigterm(self, signum, frame):"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_76b5afec","side":"PARENT","line":2079,"updated":"2016-05-19 21:09:02.000000000","message":"unrelated","commit_id":"79c1d7efc1a964836a98339e1e820ab6ebc5570e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a746c0fe2cbd7d9ad7f3938e2529d0862a229ea9","unresolved":false,"context_lines":[{"line_number":2076,"context_line":"        with polling.get_polling_manager("},{"line_number":2077,"context_line":"            self.minimize_polling,"},{"line_number":2078,"context_line":"            self.ovsdb_monitor_respawn_interval) as pm:"},{"line_number":2079,"context_line":""},{"line_number":2080,"context_line":"            self.rpc_loop(polling_manager\u003dpm)"},{"line_number":2081,"context_line":""},{"line_number":2082,"context_line":"    def _handle_sigterm(self, signum, frame):"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_38ee5fb4","side":"PARENT","line":2079,"in_reply_to":"bab6814e_76b5afec","updated":"2016-05-20 09:43:12.000000000","message":"Done","commit_id":"79c1d7efc1a964836a98339e1e820ab6ebc5570e"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1ee600d332a8b376631834d45a0066aec4272213","unresolved":false,"context_lines":[{"line_number":2109,"context_line":"    def _check_agent_configurations(self):"},{"line_number":2110,"context_line":"        if (self.enable_distributed_routing and self.enable_tunneling"},{"line_number":2111,"context_line":"            and not self.l2_pop):"},{"line_number":2112,"context_line":""},{"line_number":2113,"context_line":"            raise ValueError(_(\"DVR deployments for VXLAN/GRE/Geneve \""},{"line_number":2114,"context_line":"                               \"underlays require L2-pop to be enabled, \""},{"line_number":2115,"context_line":"                               \"in both the Agent and Server side.\"))"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_f6c99f79","side":"PARENT","line":2112,"updated":"2016-05-19 21:09:02.000000000","message":"unrelated","commit_id":"79c1d7efc1a964836a98339e1e820ab6ebc5570e"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a746c0fe2cbd7d9ad7f3938e2529d0862a229ea9","unresolved":false,"context_lines":[{"line_number":2109,"context_line":"    def _check_agent_configurations(self):"},{"line_number":2110,"context_line":"        if (self.enable_distributed_routing and self.enable_tunneling"},{"line_number":2111,"context_line":"            and not self.l2_pop):"},{"line_number":2112,"context_line":""},{"line_number":2113,"context_line":"            raise ValueError(_(\"DVR deployments for VXLAN/GRE/Geneve \""},{"line_number":2114,"context_line":"                               \"underlays require L2-pop to be enabled, \""},{"line_number":2115,"context_line":"                               \"in both the Agent and Server side.\"))"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_98c94b29","side":"PARENT","line":2112,"in_reply_to":"bab6814e_f6c99f79","updated":"2016-05-20 09:43:12.000000000","message":"Done","commit_id":"79c1d7efc1a964836a98339e1e820ab6ebc5570e"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1ee600d332a8b376631834d45a0066aec4272213","unresolved":false,"context_lines":[{"line_number":856,"context_line":"                continue"},{"line_number":857,"context_line":"            # Uninitialized port has tag set to []"},{"line_number":858,"context_line":"            if cur_tag and cur_tag !\u003d lvm.vlan:"},{"line_number":859,"context_line":"                self.int_br.cleanup_flows(excluded_cookies\u003d("},{"line_number":860,"context_line":"                    self.int_br.reserved_cookies -"},{"line_number":861,"context_line":"                    {self.int_br.default_cookie}),"},{"line_number":862,"context_line":"                    in_port\u003dport.ofport)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_313851a0","line":859,"updated":"2016-05-19 21:09:02.000000000","message":"Can we extract 859-862 to an auxiliary function, and explain in the docstring the logic behind excluding all the reserved cookies minus the default one? :)\n\n\nmay be self._cleanup_in_port_flows(port.ofport)","commit_id":"ba0096643b5cff823ef69277bb0ccbab3ff21a53"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a746c0fe2cbd7d9ad7f3938e2529d0862a229ea9","unresolved":false,"context_lines":[{"line_number":856,"context_line":"                continue"},{"line_number":857,"context_line":"            # Uninitialized port has tag set to []"},{"line_number":858,"context_line":"            if cur_tag and cur_tag !\u003d lvm.vlan:"},{"line_number":859,"context_line":"                self.int_br.cleanup_flows(excluded_cookies\u003d("},{"line_number":860,"context_line":"                    self.int_br.reserved_cookies -"},{"line_number":861,"context_line":"                    {self.int_br.default_cookie}),"},{"line_number":862,"context_line":"                    in_port\u003dport.ofport)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_18b39b99","line":859,"in_reply_to":"bab6814e_313851a0","updated":"2016-05-20 09:43:12.000000000","message":"Done","commit_id":"ba0096643b5cff823ef69277bb0ccbab3ff21a53"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1ee600d332a8b376631834d45a0066aec4272213","unresolved":false,"context_lines":[{"line_number":1986,"context_line":"                    tunnel_sync \u003d self.tunnel_sync()"},{"line_number":1987,"context_line":"                except Exception:"},{"line_number":1988,"context_line":"                    LOG.exception("},{"line_number":1989,"context_line":"                        _LE(\"Error while configuring tunnel endpoints\"))"},{"line_number":1990,"context_line":"                    tunnel_sync \u003d True"},{"line_number":1991,"context_line":"            ovs_restarted |\u003d (ovs_status \u003d\u003d constants.OVS_RESTARTED)"},{"line_number":1992,"context_line":"            devices_need_retry \u003d (any(failed_devices.values()) or"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_f61b5f19","line":1989,"updated":"2016-05-19 21:09:02.000000000","message":"unrelated","commit_id":"ba0096643b5cff823ef69277bb0ccbab3ff21a53"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a746c0fe2cbd7d9ad7f3938e2529d0862a229ea9","unresolved":false,"context_lines":[{"line_number":1986,"context_line":"                    tunnel_sync \u003d self.tunnel_sync()"},{"line_number":1987,"context_line":"                except Exception:"},{"line_number":1988,"context_line":"                    LOG.exception("},{"line_number":1989,"context_line":"                        _LE(\"Error while configuring tunnel endpoints\"))"},{"line_number":1990,"context_line":"                    tunnel_sync \u003d True"},{"line_number":1991,"context_line":"            ovs_restarted |\u003d (ovs_status \u003d\u003d constants.OVS_RESTARTED)"},{"line_number":1992,"context_line":"            devices_need_retry \u003d (any(failed_devices.values()) or"}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_584a4356","line":1989,"in_reply_to":"bab6814e_f61b5f19","updated":"2016-05-20 09:43:12.000000000","message":"Done","commit_id":"ba0096643b5cff823ef69277bb0ccbab3ff21a53"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"1ee600d332a8b376631834d45a0066aec4272213","unresolved":false,"context_lines":[{"line_number":1993,"context_line":"                any(failed_ancillary_devices.values()) or"},{"line_number":1994,"context_line":"                ports_not_ready_yet)"},{"line_number":1995,"context_line":"            if (self._agent_has_updates(polling_manager) or sync"},{"line_number":1996,"context_line":"                or devices_need_retry):"},{"line_number":1997,"context_line":"                try:"},{"line_number":1998,"context_line":"                    LOG.debug(\"Agent rpc_loop - iteration:%(iter_num)d - \""},{"line_number":1999,"context_line":"                              \"starting polling. Elapsed:%(elapsed).3f\","}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_d6ed7bf0","line":1996,"updated":"2016-05-19 21:09:02.000000000","message":"unrelated.","commit_id":"ba0096643b5cff823ef69277bb0ccbab3ff21a53"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a746c0fe2cbd7d9ad7f3938e2529d0862a229ea9","unresolved":false,"context_lines":[{"line_number":1993,"context_line":"                any(failed_ancillary_devices.values()) or"},{"line_number":1994,"context_line":"                ports_not_ready_yet)"},{"line_number":1995,"context_line":"            if (self._agent_has_updates(polling_manager) or sync"},{"line_number":1996,"context_line":"                or devices_need_retry):"},{"line_number":1997,"context_line":"                try:"},{"line_number":1998,"context_line":"                    LOG.debug(\"Agent rpc_loop - iteration:%(iter_num)d - \""},{"line_number":1999,"context_line":"                              \"starting polling. Elapsed:%(elapsed).3f\","}],"source_content_type":"text/x-python","patch_set":15,"id":"bab6814e_b8e08ffb","line":1996,"in_reply_to":"bab6814e_d6ed7bf0","updated":"2016-05-20 09:43:12.000000000","message":"Done","commit_id":"ba0096643b5cff823ef69277bb0ccbab3ff21a53"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"7c06bff4b0aeb97e529ccf6038cdf8d2d111b732","unresolved":false,"context_lines":[{"line_number":834,"context_line":"                self.int_br.set_db_attribute("},{"line_number":835,"context_line":"                    \"Port\", port.port_name, \"other_config\", other_config)"},{"line_number":836,"context_line":""},{"line_number":837,"context_line":"    def _cleanup_in_port_flows(self, in_port):"},{"line_number":838,"context_line":"        \u0027\u0027\u0027Cleanup the flows related to the input port passed as an argument."},{"line_number":839,"context_line":"        All stalled flows (with cookies not in \u0027reserved_cookies\u0027) and those"},{"line_number":840,"context_line":"        ones added by the agent (with cookie \u003d \u0027default_cookie\u0027) will be"}],"source_content_type":"text/x-python","patch_set":17,"id":"9abb7d3a_d5eb2caf","line":837,"range":{"start_line":837,"start_character":8,"end_line":837,"end_character":30},"updated":"2016-05-27 06:32:18.000000000","message":"the current style is to have this kind of methods in br_int.py,\nwith a bit more higher-level name.","commit_id":"094dd8585fbd74bb7da2d452383400a270e29fb7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"006781c5290cefadf71953a1070abd3f0f5d0b86","unresolved":false,"context_lines":[{"line_number":834,"context_line":"                self.int_br.set_db_attribute("},{"line_number":835,"context_line":"                    \"Port\", port.port_name, \"other_config\", other_config)"},{"line_number":836,"context_line":""},{"line_number":837,"context_line":"    def _cleanup_in_port_flows(self, in_port):"},{"line_number":838,"context_line":"        \u0027\u0027\u0027Cleanup the flows related to the input port passed as an argument."},{"line_number":839,"context_line":"        All stalled flows (with cookies not in \u0027reserved_cookies\u0027) and those"},{"line_number":840,"context_line":"        ones added by the agent (with cookie \u003d \u0027default_cookie\u0027) will be"}],"source_content_type":"text/x-python","patch_set":17,"id":"9abb7d3a_31515ed9","line":837,"range":{"start_line":837,"start_character":8,"end_line":837,"end_character":30},"in_reply_to":"9abb7d3a_d5eb2caf","updated":"2016-05-31 13:12:40.000000000","message":"The function is implemented in br_int. This function was created because of this proposal: https://review.openstack.org/#/c/295154/15/neutron/plugins/ml2/drivers/openvswitch/agent/ovs_neutron_agent.py@859\n\nThe point of this function is to explain what is br_int.cleanup_flows doing. Do you suggest me to remove this function and comment br_int.clean_up instead?","commit_id":"094dd8585fbd74bb7da2d452383400a270e29fb7"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"7c06bff4b0aeb97e529ccf6038cdf8d2d111b732","unresolved":false,"context_lines":[{"line_number":838,"context_line":"        \u0027\u0027\u0027Cleanup the flows related to the input port passed as an argument."},{"line_number":839,"context_line":"        All stalled flows (with cookies not in \u0027reserved_cookies\u0027) and those"},{"line_number":840,"context_line":"        ones added by the agent (with cookie \u003d \u0027default_cookie\u0027) will be"},{"line_number":841,"context_line":"        deleted. Flows added by agent extensions will remain intact."},{"line_number":842,"context_line":""},{"line_number":843,"context_line":"        :param in_port: input port number."},{"line_number":844,"context_line":"        \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"9abb7d3a_35e71814","line":841,"updated":"2016-05-27 06:32:18.000000000","message":"i\u0027m afraid that something more sophisticated [1] might be necessary.\nthis might work for SG, but i\u0027m not sure if it\u0027s appropriate for every other extensions.\nbesides that, i\u0027m not sure if this is the only place ovs-agent-core needs to avoid modifying extensions\u0027 flows.\n\n[1] like https://review.openstack.org/#/c/320439/","commit_id":"094dd8585fbd74bb7da2d452383400a270e29fb7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"006781c5290cefadf71953a1070abd3f0f5d0b86","unresolved":false,"context_lines":[{"line_number":838,"context_line":"        \u0027\u0027\u0027Cleanup the flows related to the input port passed as an argument."},{"line_number":839,"context_line":"        All stalled flows (with cookies not in \u0027reserved_cookies\u0027) and those"},{"line_number":840,"context_line":"        ones added by the agent (with cookie \u003d \u0027default_cookie\u0027) will be"},{"line_number":841,"context_line":"        deleted. Flows added by agent extensions will remain intact."},{"line_number":842,"context_line":""},{"line_number":843,"context_line":"        :param in_port: input port number."},{"line_number":844,"context_line":"        \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":17,"id":"9abb7d3a_71dac64d","line":841,"in_reply_to":"9abb7d3a_35e71814","updated":"2016-05-31 13:12:40.000000000","message":"I\u0027m aware of this new feature (thanks for the heads-up!!) and I\u0027m already helping to this. OVS firewall and OVS cookie features were developed at the same time, and this patch tries to join both together. I know, in the future, flows will be managed by [1], but now this bug solution is needed to work correctly.","commit_id":"094dd8585fbd74bb7da2d452383400a270e29fb7"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d3e2e92510fc6c182676a19be78fe8aa900eba0b","unresolved":false,"context_lines":[{"line_number":845,"context_line":"        :param in_port: input port number."},{"line_number":846,"context_line":"        \u0027\u0027\u0027"},{"line_number":847,"context_line":"        self.int_br.cleanup_flows(excluded_cookies\u003d("},{"line_number":848,"context_line":"            self.int_br.reserved_cookies - {self.int_br.default_cookie}),"},{"line_number":849,"context_line":"            in_port\u003din_port)"},{"line_number":850,"context_line":""},{"line_number":851,"context_line":"    def _bind_devices(self, need_binding_ports):"}],"source_content_type":"text/x-python","patch_set":22,"id":"1aa78d24_30bc1005","line":848,"updated":"2016-07-04 13:55:46.000000000","message":"We are calling the cookie bride, constructing parameters with details from inside int_br itself.\n\nCouldn\u0027t we calculate that in a separate functions (inside the cookie bridge) that does such calculation.\n\nI believe ovs_neutron_agent shouldn\u0027t know the internal details of int_br when calling it.\n\n\nMay be a cleanup_default_cookie flag?","commit_id":"9d436908e28b70d5b8a87d68f90d9de3fc458dc5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3159fb950ae6c850e4da565f95c7adbffc0cca5f","unresolved":false,"context_lines":[{"line_number":845,"context_line":"        :param in_port: input port number."},{"line_number":846,"context_line":"        \u0027\u0027\u0027"},{"line_number":847,"context_line":"        self.int_br.cleanup_flows(excluded_cookies\u003d("},{"line_number":848,"context_line":"            self.int_br.reserved_cookies - {self.int_br.default_cookie}),"},{"line_number":849,"context_line":"            in_port\u003din_port)"},{"line_number":850,"context_line":""},{"line_number":851,"context_line":"    def _bind_devices(self, need_binding_ports):"}],"source_content_type":"text/x-python","patch_set":22,"id":"1aa78d24_6d523e15","line":848,"in_reply_to":"1aa78d24_30bc1005","updated":"2016-07-04 15:00:21.000000000","message":"I agree with moving the internal calculation inside the br_int class.\n\nI don\u0027t see the point of having a cleanup_default_cookie flag. Can you explain it a bit more?","commit_id":"9d436908e28b70d5b8a87d68f90d9de3fc458dc5"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"d3e2e92510fc6c182676a19be78fe8aa900eba0b","unresolved":false,"context_lines":[{"line_number":872,"context_line":"                continue"},{"line_number":873,"context_line":"            # Uninitialized port has tag set to []"},{"line_number":874,"context_line":"            if cur_tag and cur_tag !\u003d lvm.vlan:"},{"line_number":875,"context_line":"                self._cleanup_in_port_flows(port.ofport)"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"            if self.prevent_arp_spoofing:"},{"line_number":878,"context_line":"                self.setup_arp_spoofing_protection(self.int_br,"}],"source_content_type":"text/x-python","patch_set":22,"id":"1aa78d24_d0ddcc43","line":875,"updated":"2016-07-04 13:55:46.000000000","message":"Please note this is now going to generate a warning inside cleanup_flows as it was supposed to be rare event, now it will be normal.\n\nMay be we should create separate functions.","commit_id":"9d436908e28b70d5b8a87d68f90d9de3fc458dc5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3159fb950ae6c850e4da565f95c7adbffc0cca5f","unresolved":false,"context_lines":[{"line_number":872,"context_line":"                continue"},{"line_number":873,"context_line":"            # Uninitialized port has tag set to []"},{"line_number":874,"context_line":"            if cur_tag and cur_tag !\u003d lvm.vlan:"},{"line_number":875,"context_line":"                self._cleanup_in_port_flows(port.ofport)"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"            if self.prevent_arp_spoofing:"},{"line_number":878,"context_line":"                self.setup_arp_spoofing_protection(self.int_br,"}],"source_content_type":"text/x-python","patch_set":22,"id":"1aa78d24_8d4dea74","line":875,"in_reply_to":"1aa78d24_d0ddcc43","updated":"2016-07-04 15:00:21.000000000","message":"I have changed the log level in \"cleanup_flows\" function.","commit_id":"9d436908e28b70d5b8a87d68f90d9de3fc458dc5"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"7e0d301871e3a6ab3037862fab7b4e9931df8c98","unresolved":false,"context_lines":[{"line_number":869,"context_line":"                continue"},{"line_number":870,"context_line":"            # Uninitialized port has tag set to []"},{"line_number":871,"context_line":"            if cur_tag and cur_tag !\u003d lvm.vlan:"},{"line_number":872,"context_line":"                self._cleanup_in_port_flows(port.ofport)"},{"line_number":873,"context_line":""},{"line_number":874,"context_line":"            if self.prevent_arp_spoofing:"},{"line_number":875,"context_line":"                self.setup_arp_spoofing_protection(self.int_br,"}],"source_content_type":"text/x-python","patch_set":26,"id":"bacf61ea_e60094ad","line":872,"updated":"2016-08-05 09:22:33.000000000","message":"i think this delete_flows meant to be the opposite of drop_port.  i guess it\u0027s better to give it a more concrete name.","commit_id":"fa98ce73b5a23e0a40394f6201a50db707c688fc"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c39fcd3cc280761345f0d59e023a526e05ff44fe","unresolved":false,"context_lines":[{"line_number":869,"context_line":"                continue"},{"line_number":870,"context_line":"            # Uninitialized port has tag set to []"},{"line_number":871,"context_line":"            if cur_tag and cur_tag !\u003d lvm.vlan:"},{"line_number":872,"context_line":"                self._cleanup_in_port_flows(port.ofport)"},{"line_number":873,"context_line":""},{"line_number":874,"context_line":"            if self.prevent_arp_spoofing:"},{"line_number":875,"context_line":"                self.setup_arp_spoofing_protection(self.int_br,"}],"source_content_type":"text/x-python","patch_set":26,"id":"bacf61ea_294b9f88","line":872,"in_reply_to":"bacf61ea_e60094ad","updated":"2016-08-05 09:35:23.000000000","message":"But the name is \"_cleanup_in_port_flows\", not \"delete_flows\". Which name do you propose? I\u0027m very bad at defining new names...","commit_id":"fa98ce73b5a23e0a40394f6201a50db707c688fc"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"9e960384bc8c906a80d86c8abb226cbe8008f689","unresolved":false,"context_lines":[{"line_number":872,"context_line":"                continue"},{"line_number":873,"context_line":"            # Uninitialized port has tag set to []"},{"line_number":874,"context_line":"            if cur_tag and cur_tag !\u003d lvm.vlan:"},{"line_number":875,"context_line":"                self._cleanup_in_port_flows(port.ofport)"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"            if self.prevent_arp_spoofing:"},{"line_number":878,"context_line":"                self.setup_arp_spoofing_protection(self.int_br,"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a629dbe_6eb6c4dd","line":875,"updated":"2016-11-08 10:13:25.000000000","message":"When this line is executed, ovsdb had a stale vlan_tag for the port. As ovsfw reads vlan_tag from ovsdb, ovsfw flows would have incorrect vlan_tags in this case.","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"aee3dd60ced193f6941b23c2da83c8e4947367d6","unresolved":false,"context_lines":[{"line_number":872,"context_line":"                continue"},{"line_number":873,"context_line":"            # Uninitialized port has tag set to []"},{"line_number":874,"context_line":"            if cur_tag and cur_tag !\u003d lvm.vlan:"},{"line_number":875,"context_line":"                self._cleanup_in_port_flows(port.ofport)"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"            if self.prevent_arp_spoofing:"},{"line_number":878,"context_line":"                self.setup_arp_spoofing_protection(self.int_br,"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a629dbe_902ce603","line":875,"in_reply_to":"9a629dbe_421e31bb","updated":"2016-11-09 05:23:12.000000000","message":"To put it differently,\n\nwhen L.875 is executed, ovsfw has done flow initialization with stale vlan_tags thus fw flows you are trying to preserve here are hosed.\nDon\u0027t you need a different approach such as re-initializing ovsfw in such cases?","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"537252b9d2c9c42f33247e66aadb5237c27f9681","unresolved":false,"context_lines":[{"line_number":872,"context_line":"                continue"},{"line_number":873,"context_line":"            # Uninitialized port has tag set to []"},{"line_number":874,"context_line":"            if cur_tag and cur_tag !\u003d lvm.vlan:"},{"line_number":875,"context_line":"                self._cleanup_in_port_flows(port.ofport)"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"            if self.prevent_arp_spoofing:"},{"line_number":878,"context_line":"                self.setup_arp_spoofing_protection(self.int_br,"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a629dbe_421e31bb","line":875,"in_reply_to":"9a629dbe_6eb6c4dd","updated":"2016-11-08 11:33:46.000000000","message":"That\u0027s the objective of this line: delete flows from ports with uninitialized or staled vlan tags (in OVS database).\n\nThe condition to execute this line is out of the scope of this change (was not modified, not needed).\n\nExcuse me but maybe I\u0027m not undestanding your assessment.","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"366cb525a19796195d9ea0e8a341bec15f2eff8b","unresolved":false,"context_lines":[{"line_number":872,"context_line":"                continue"},{"line_number":873,"context_line":"            # Uninitialized port has tag set to []"},{"line_number":874,"context_line":"            if cur_tag and cur_tag !\u003d lvm.vlan:"},{"line_number":875,"context_line":"                self._cleanup_in_port_flows(port.ofport)"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"            if self.prevent_arp_spoofing:"},{"line_number":878,"context_line":"                self.setup_arp_spoofing_protection(self.int_br,"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a629dbe_ce24fab0","line":875,"in_reply_to":"9a629dbe_902ce603","updated":"2016-11-09 10:53:27.000000000","message":"I understand now what are you saying, thanks.\n\nThere a two scenarios:\na) Fresh start, no uninitialized ports should exists.\nb) The ovs_agent is restarted (this patch was submitted to solve a problem in this case):\n* FW is using the tag information inside \"other_config\" variable, instead of using the \"tag\" variable. That means FW driver has the correct tag info.\n* The deletion of flows written by extensions (aka FW) must be deleted/modified by these extensions, not by this function.\n* At this point, FW has written its own flows (as you said). This function is going to delete only:\n * Stale flows added by the agent in previous executions (default cookie). Remember the agent is restarting.\n * Other flows, with in_port\u003dofport, with cookies not in reserved_cookies (weird flows)\n\n\n\u003e Don\u0027t you need a different approach such as re-initializing ovsfw in such cases?\n\nAs I said, FW is using the updated tag info, stored in \"other_config\". There is no need to reinitialize the FW.","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"0cb9f44fa21679050a1e3043f9eff2829d2c37df","unresolved":false,"context_lines":[{"line_number":872,"context_line":"                continue"},{"line_number":873,"context_line":"            # Uninitialized port has tag set to []"},{"line_number":874,"context_line":"            if cur_tag and cur_tag !\u003d lvm.vlan:"},{"line_number":875,"context_line":"                self._cleanup_in_port_flows(port.ofport)"},{"line_number":876,"context_line":""},{"line_number":877,"context_line":"            if self.prevent_arp_spoofing:"},{"line_number":878,"context_line":"                self.setup_arp_spoofing_protection(self.int_br,"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a629dbe_a59c1b10","line":875,"in_reply_to":"9a629dbe_ce24fab0","updated":"2016-11-10 04:32:27.000000000","message":"Thanks for the explanation.\n\nMy feeling is that this patchset is technically okay. My concern is the complexity. Please see my comment at L.1664.","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"0cb9f44fa21679050a1e3043f9eff2829d2c37df","unresolved":false,"context_lines":[{"line_number":1661,"context_line":"        added_ports \u003d port_info.get(\u0027added\u0027, set())"},{"line_number":1662,"context_line":"        self._add_port_tag_info(need_binding_devices)"},{"line_number":1663,"context_line":"        if security_disabled_ports:"},{"line_number":1664,"context_line":"            added_ports -\u003d set(security_disabled_ports)"},{"line_number":1665,"context_line":"        self.sg_agent.setup_port_filters(added_ports,"},{"line_number":1666,"context_line":"                                         port_info.get(\u0027updated\u0027, set()))"},{"line_number":1667,"context_line":"        failed_devices[\u0027added\u0027] |\u003d self._bind_devices(need_binding_devices)"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a629dbe_0570670a","line":1664,"updated":"2016-11-10 04:32:27.000000000","message":"Can we have something like below here instead?\n\nif cur_tag and cur_tag !\u003d lvm.vlan:\n    ...delete_flows(in_port\u003dport.ofport)\n    self.int_br.set_db_attribute(..., \"tag\", [])","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"7231af49e5ec341398cf8eb2cee20e9f82a51be0","unresolved":false,"context_lines":[{"line_number":1661,"context_line":"        added_ports \u003d port_info.get(\u0027added\u0027, set())"},{"line_number":1662,"context_line":"        self._add_port_tag_info(need_binding_devices)"},{"line_number":1663,"context_line":"        if security_disabled_ports:"},{"line_number":1664,"context_line":"            added_ports -\u003d set(security_disabled_ports)"},{"line_number":1665,"context_line":"        self.sg_agent.setup_port_filters(added_ports,"},{"line_number":1666,"context_line":"                                         port_info.get(\u0027updated\u0027, set()))"},{"line_number":1667,"context_line":"        failed_devices[\u0027added\u0027] |\u003d self._bind_devices(need_binding_devices)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3a71b18c_7c6e7197","line":1664,"in_reply_to":"3a71b18c_3df6f3d7","updated":"2016-12-02 06:50:00.000000000","message":"What I\u0027m saying is \"cannot we just clear stale flows just before setting up ovsfw?\"\n\nI noticed 3rd party flows are set up in treat_devices_added_or_updated, which runs slightly earlier.","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"241793e24a3bc673ef6192a9ad93928adad258d3","unresolved":false,"context_lines":[{"line_number":1661,"context_line":"        added_ports \u003d port_info.get(\u0027added\u0027, set())"},{"line_number":1662,"context_line":"        self._add_port_tag_info(need_binding_devices)"},{"line_number":1663,"context_line":"        if security_disabled_ports:"},{"line_number":1664,"context_line":"            added_ports -\u003d set(security_disabled_ports)"},{"line_number":1665,"context_line":"        self.sg_agent.setup_port_filters(added_ports,"},{"line_number":1666,"context_line":"                                         port_info.get(\u0027updated\u0027, set()))"},{"line_number":1667,"context_line":"        failed_devices[\u0027added\u0027] |\u003d self._bind_devices(need_binding_devices)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3a71b18c_80951e34","line":1664,"in_reply_to":"3a71b18c_455b982e","updated":"2016-12-06 09:47:28.000000000","message":"the \"other patch\": https://review.openstack.org/#/c/406731/","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a46f492245689dbb51307c1baa68267addba8cea","unresolved":false,"context_lines":[{"line_number":1661,"context_line":"        added_ports \u003d port_info.get(\u0027added\u0027, set())"},{"line_number":1662,"context_line":"        self._add_port_tag_info(need_binding_devices)"},{"line_number":1663,"context_line":"        if security_disabled_ports:"},{"line_number":1664,"context_line":"            added_ports -\u003d set(security_disabled_ports)"},{"line_number":1665,"context_line":"        self.sg_agent.setup_port_filters(added_ports,"},{"line_number":1666,"context_line":"                                         port_info.get(\u0027updated\u0027, set()))"},{"line_number":1667,"context_line":"        failed_devices[\u0027added\u0027] |\u003d self._bind_devices(need_binding_devices)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3a71b18c_455b982e","line":1664,"in_reply_to":"3a71b18c_7c6e7197","updated":"2016-12-02 08:01:27.000000000","message":"Propose this change in other patch","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2726375fb7fbd33c1dd0ff5f6cddba8c3abb135c","unresolved":false,"context_lines":[{"line_number":1661,"context_line":"        added_ports \u003d port_info.get(\u0027added\u0027, set())"},{"line_number":1662,"context_line":"        self._add_port_tag_info(need_binding_devices)"},{"line_number":1663,"context_line":"        if security_disabled_ports:"},{"line_number":1664,"context_line":"            added_ports -\u003d set(security_disabled_ports)"},{"line_number":1665,"context_line":"        self.sg_agent.setup_port_filters(added_ports,"},{"line_number":1666,"context_line":"                                         port_info.get(\u0027updated\u0027, set()))"},{"line_number":1667,"context_line":"        failed_devices[\u0027added\u0027] |\u003d self._bind_devices(need_binding_devices)"}],"source_content_type":"text/x-python","patch_set":29,"id":"5a74a57a_66afbce3","line":1664,"in_reply_to":"5a74a57a_0dc80574","updated":"2016-11-30 17:55:26.000000000","message":"This is not possible: firewall flows (and other possible extensions writing flows in OVS) have been set at this point. We can\u0027t just delete everything. This is the only reason of this patch!\n\nWe delete everything but extension flows written by this agent in this execution (stale ones are deleted). This function will delete everything else.","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"2fef65c41b425822db26bb60c75282a8b7a3bf43","unresolved":false,"context_lines":[{"line_number":1661,"context_line":"        added_ports \u003d port_info.get(\u0027added\u0027, set())"},{"line_number":1662,"context_line":"        self._add_port_tag_info(need_binding_devices)"},{"line_number":1663,"context_line":"        if security_disabled_ports:"},{"line_number":1664,"context_line":"            added_ports -\u003d set(security_disabled_ports)"},{"line_number":1665,"context_line":"        self.sg_agent.setup_port_filters(added_ports,"},{"line_number":1666,"context_line":"                                         port_info.get(\u0027updated\u0027, set()))"},{"line_number":1667,"context_line":"        failed_devices[\u0027added\u0027] |\u003d self._bind_devices(need_binding_devices)"}],"source_content_type":"text/x-python","patch_set":29,"id":"3a71b18c_3df6f3d7","line":1664,"in_reply_to":"5a74a57a_4059b25a","updated":"2016-12-01 08:45:50.000000000","message":"I was talking about function \"_bind_devices\":\n - Setup extension flows.\n - Bind devices\n    - Stale flow deletion","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"aaa78601ed30d483c726ece58d04819446c82e86","unresolved":false,"context_lines":[{"line_number":1661,"context_line":"        added_ports \u003d port_info.get(\u0027added\u0027, set())"},{"line_number":1662,"context_line":"        self._add_port_tag_info(need_binding_devices)"},{"line_number":1663,"context_line":"        if security_disabled_ports:"},{"line_number":1664,"context_line":"            added_ports -\u003d set(security_disabled_ports)"},{"line_number":1665,"context_line":"        self.sg_agent.setup_port_filters(added_ports,"},{"line_number":1666,"context_line":"                                         port_info.get(\u0027updated\u0027, set()))"},{"line_number":1667,"context_line":"        failed_devices[\u0027added\u0027] |\u003d self._bind_devices(need_binding_devices)"}],"source_content_type":"text/x-python","patch_set":29,"id":"5a74a57a_4059b25a","line":1664,"in_reply_to":"5a74a57a_66afbce3","updated":"2016-12-01 04:04:31.000000000","message":"Aren\u0027t ovsfw flows initialized in the next line?","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"b8cf301f62a575982f9badbd2b3643fd10f99f45","unresolved":false,"context_lines":[{"line_number":1661,"context_line":"        added_ports \u003d port_info.get(\u0027added\u0027, set())"},{"line_number":1662,"context_line":"        self._add_port_tag_info(need_binding_devices)"},{"line_number":1663,"context_line":"        if security_disabled_ports:"},{"line_number":1664,"context_line":"            added_ports -\u003d set(security_disabled_ports)"},{"line_number":1665,"context_line":"        self.sg_agent.setup_port_filters(added_ports,"},{"line_number":1666,"context_line":"                                         port_info.get(\u0027updated\u0027, set()))"},{"line_number":1667,"context_line":"        failed_devices[\u0027added\u0027] |\u003d self._bind_devices(need_binding_devices)"}],"source_content_type":"text/x-python","patch_set":29,"id":"5a74a57a_0dc80574","line":1664,"in_reply_to":"7a77a97e_17a6eb52","updated":"2016-11-30 09:03:09.000000000","message":"I\u0027m not proposing to move _bind_devices.\n\nIsn\u0027t ovsfw fine as long as we keep other_config.tag?\n\nIMO, delete_flows(in_port\u003dport.ofport) is kinda \"wipe out stale flows and reset to known good state at the beginning\". I\u0027d like to retain such operation if we can.","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"bbde4d9ab03566a97e5f764cee7a9db3e2110b46","unresolved":false,"context_lines":[{"line_number":1661,"context_line":"        added_ports \u003d port_info.get(\u0027added\u0027, set())"},{"line_number":1662,"context_line":"        self._add_port_tag_info(need_binding_devices)"},{"line_number":1663,"context_line":"        if security_disabled_ports:"},{"line_number":1664,"context_line":"            added_ports -\u003d set(security_disabled_ports)"},{"line_number":1665,"context_line":"        self.sg_agent.setup_port_filters(added_ports,"},{"line_number":1666,"context_line":"                                         port_info.get(\u0027updated\u0027, set()))"},{"line_number":1667,"context_line":"        failed_devices[\u0027added\u0027] |\u003d self._bind_devices(need_binding_devices)"}],"source_content_type":"text/x-python","patch_set":29,"id":"7a77a97e_17a6eb52","line":1664,"in_reply_to":"7a77a97e_edf0c693","updated":"2016-11-18 08:51:30.000000000","message":"I did that one year ago, to move \"_bind_devices\" before \"setup_port_filters\". The problem of doing this is there is a potential security issue: https://review.openstack.org/#/c/268192/. Security must be applied before cleaning stale flows.\n\nThe second point to keep in mind is you can\u0027t remove the tag infor from the ports because this information is needed in the firewall.\n\nThird, if you want to remove stale flows and tags from active ports, binding process (\"_bind_devices\") is the exact moment to this because you are verifying the tag information. Of course, as you say, this check could be done before applying the firewall. But using the changes I introduced in this patch is perfectly safe to do this in L875.\n\nAnother reason to introduce this patch is \"_cleanup_in_port_flows\" function now preserves other extension flows.","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"44618c236192f9758f235d56466e9a00687f53d4","unresolved":false,"context_lines":[{"line_number":1661,"context_line":"        added_ports \u003d port_info.get(\u0027added\u0027, set())"},{"line_number":1662,"context_line":"        self._add_port_tag_info(need_binding_devices)"},{"line_number":1663,"context_line":"        if security_disabled_ports:"},{"line_number":1664,"context_line":"            added_ports -\u003d set(security_disabled_ports)"},{"line_number":1665,"context_line":"        self.sg_agent.setup_port_filters(added_ports,"},{"line_number":1666,"context_line":"                                         port_info.get(\u0027updated\u0027, set()))"},{"line_number":1667,"context_line":"        failed_devices[\u0027added\u0027] |\u003d self._bind_devices(need_binding_devices)"}],"source_content_type":"text/x-python","patch_set":29,"id":"9a629dbe_26b2cc94","line":1664,"in_reply_to":"9a629dbe_0570670a","updated":"2016-11-10 09:29:07.000000000","message":"I can\u0027t do this here. Let me explain this assessment, defining the possible scenarios:\n\na) There is, for example, one port in \"security_disabled_ports\". This port was always in this set. That means the FW never set a rule for this port and, just in case, in L875 any stale flow is deleted.\n\nb) Another port change its security status to \"disabled\". The flows added by the FW will be deleted by this extension. \n\n\nIf the agent is restarted, the condition in L875 will delete any stale flow in the existing ports during the first loop.\n\nFurthermore, not only the FW apply new flows assigned to the ports. All extensions are able (until the OVS flow manager integration, maybe in Pike) to modify OVS tables. We should let the extensions themselves to control their own flows.","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"8430096fe36b6fa1fd2e274d564bb08a80aaf312","unresolved":false,"context_lines":[{"line_number":1661,"context_line":"        added_ports \u003d port_info.get(\u0027added\u0027, set())"},{"line_number":1662,"context_line":"        self._add_port_tag_info(need_binding_devices)"},{"line_number":1663,"context_line":"        if security_disabled_ports:"},{"line_number":1664,"context_line":"            added_ports -\u003d set(security_disabled_ports)"},{"line_number":1665,"context_line":"        self.sg_agent.setup_port_filters(added_ports,"},{"line_number":1666,"context_line":"                                         port_info.get(\u0027updated\u0027, set()))"},{"line_number":1667,"context_line":"        failed_devices[\u0027added\u0027] |\u003d self._bind_devices(need_binding_devices)"}],"source_content_type":"text/x-python","patch_set":29,"id":"7a77a97e_edf0c693","line":1664,"in_reply_to":"9a629dbe_26b2cc94","updated":"2016-11-17 06:04:00.000000000","message":"I meant to do the above outside the \"if security_disabled_ports:\".\nIf we clear stale flows and vlan tags here, it is before SG setup and L875 will not fire as the tag is cleared.","commit_id":"b2648ac67f6d8fd6b28a33a34fdbfbe4334f01a7"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"7ec7de26ddc5b0bc4d66fa05f4759b1271697d79","unresolved":false,"context_lines":[{"line_number":1190,"context_line":"        for ofport in ofports_deleted:"},{"line_number":1191,"context_line":"            if self.prevent_arp_spoofing:"},{"line_number":1192,"context_line":"                self.int_br.delete_arp_spoofing_protection(port\u003dofport)"},{"line_number":1193,"context_line":"            self.int_br.delete_flows(in_port\u003dofport)"},{"line_number":1194,"context_line":"        # store map for next iteration"},{"line_number":1195,"context_line":"        self.vifname_to_ofport_map \u003d current"},{"line_number":1196,"context_line":"        return moved_ports"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a71b18c_e2a7af08","line":1193,"range":{"start_line":1193,"start_character":12,"end_line":1193,"end_character":52},"updated":"2016-12-06 12:55:18.000000000","message":"is this ok for ovsfw?","commit_id":"b00dcca055ea2a398d43e7b72beba963b5eabab6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7e0d0f47683edd9b31515a3593897d3df9c74a7e","unresolved":false,"context_lines":[{"line_number":1190,"context_line":"        for ofport in ofports_deleted:"},{"line_number":1191,"context_line":"            if self.prevent_arp_spoofing:"},{"line_number":1192,"context_line":"                self.int_br.delete_arp_spoofing_protection(port\u003dofport)"},{"line_number":1193,"context_line":"            self.int_br.delete_flows(in_port\u003dofport)"},{"line_number":1194,"context_line":"        # store map for next iteration"},{"line_number":1195,"context_line":"        self.vifname_to_ofport_map \u003d current"},{"line_number":1196,"context_line":"        return moved_ports"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a71b18c_9eb3b397","line":1193,"range":{"start_line":1193,"start_character":12,"end_line":1193,"end_character":52},"in_reply_to":"3a71b18c_e2a7af08","updated":"2016-12-06 15:35:13.000000000","message":"In ovsfw, if the port is deleted, every flow related is deleted.\n\nI didn\u0027t find any problem with this line when I was manually testing the fw.","commit_id":"b00dcca055ea2a398d43e7b72beba963b5eabab6"}],"neutron/tests/common/net_helpers.py":[{"author":{"_account_id":9200,"name":"IWAMOTO Toshihiro","email":"iwamoto@valinux.co.jp","username":"toshii"},"change_message_id":"37cdaac91497248f84dde9b60cc9d1d9f612ef67","unresolved":false,"context_lines":[{"line_number":41,"context_line":"from neutron.db import db_base_plugin_common"},{"line_number":42,"context_line":"from neutron.plugins.ml2.drivers.linuxbridge.agent import \\"},{"line_number":43,"context_line":"    linuxbridge_neutron_agent as linuxbridge_agent"},{"line_number":44,"context_line":"from neutron.plugins.ml2.drivers.openvswitch.agent.openflow.ovs_ofctl import \\"},{"line_number":45,"context_line":"    ovs_bridge"},{"line_number":46,"context_line":"from neutron.tests import base as tests_base"},{"line_number":47,"context_line":"from neutron.tests.common import base as common_base"}],"source_content_type":"text/x-python","patch_set":18,"id":"7aa08908_226d169a","line":44,"updated":"2016-06-15 08:32:30.000000000","message":"Please avoid hardcoding ovs_ofctl.\n\nIt should use native.ovs_bridge if tests are using of_interface\u003dnative configuration.","commit_id":"7bf847b823ae5196212e684ce6465bc197604188"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"b074c70563801fc6aaade84949216cf3f19595fb","unresolved":false,"context_lines":[{"line_number":41,"context_line":"from neutron.db import db_base_plugin_common"},{"line_number":42,"context_line":"from neutron.plugins.ml2.drivers.linuxbridge.agent import \\"},{"line_number":43,"context_line":"    linuxbridge_neutron_agent as linuxbridge_agent"},{"line_number":44,"context_line":"from neutron.plugins.ml2.drivers.openvswitch.agent.openflow.ovs_ofctl import \\"},{"line_number":45,"context_line":"    ovs_bridge"},{"line_number":46,"context_line":"from neutron.tests import base as tests_base"},{"line_number":47,"context_line":"from neutron.tests.common import base as common_base"}],"source_content_type":"text/x-python","patch_set":18,"id":"5a9d85d2_f00e3ee4","line":44,"in_reply_to":"7aa08908_226d169a","updated":"2016-06-18 19:36:16.000000000","message":"Done","commit_id":"7bf847b823ae5196212e684ce6465bc197604188"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"fb86b2dff26fe9dcdff3b64a16f125c1b6838980","unresolved":false,"context_lines":[{"line_number":640,"context_line":"        tools.fail(\u0027Unexpected bridge type: %s\u0027 % type(bridge))"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":""},{"line_number":643,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":644,"context_line":"class OVSAgentBridgeFixture(br_cookie.OVSBridgeCookieMixin, ovs_lib.OVSBridge):"},{"line_number":645,"context_line":"    \"\"\"Create an AgentBridge."},{"line_number":646,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3aaa91ec_1ee44e39","line":643,"updated":"2016-07-01 08:03:33.000000000","message":"why abc?","commit_id":"0405957c2b87ccbd6c50c0b64184b6d94d816143"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c98687ba15c2a43572f1c6ac636a62092e2033a9","unresolved":false,"context_lines":[{"line_number":640,"context_line":"        tools.fail(\u0027Unexpected bridge type: %s\u0027 % type(bridge))"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":""},{"line_number":643,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":644,"context_line":"class OVSAgentBridgeFixture(br_cookie.OVSBridgeCookieMixin, ovs_lib.OVSBridge):"},{"line_number":645,"context_line":"    \"\"\"Create an AgentBridge."},{"line_number":646,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1aa78d24_efd8fd1f","line":643,"in_reply_to":"3aaa91ec_1ee44e39","updated":"2016-07-04 07:26:53.000000000","message":"In the first implementation I made an abstract class. But this is not anymore.","commit_id":"0405957c2b87ccbd6c50c0b64184b6d94d816143"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"fb86b2dff26fe9dcdff3b64a16f125c1b6838980","unresolved":false,"context_lines":[{"line_number":645,"context_line":"    \"\"\"Create an AgentBridge."},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"    :ivar port: created AgentBridge"},{"line_number":648,"context_line":"    :type port: AgentBridge"},{"line_number":649,"context_line":"    :ivar name: bridge name"},{"line_number":650,"context_line":"    :type name: string"},{"line_number":651,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":20,"id":"3aaa91ec_eea5d4b4","line":648,"updated":"2016-07-01 08:03:33.000000000","message":"?","commit_id":"0405957c2b87ccbd6c50c0b64184b6d94d816143"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c98687ba15c2a43572f1c6ac636a62092e2033a9","unresolved":false,"context_lines":[{"line_number":645,"context_line":"    \"\"\"Create an AgentBridge."},{"line_number":646,"context_line":""},{"line_number":647,"context_line":"    :ivar port: created AgentBridge"},{"line_number":648,"context_line":"    :type port: AgentBridge"},{"line_number":649,"context_line":"    :ivar name: bridge name"},{"line_number":650,"context_line":"    :type name: string"},{"line_number":651,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":20,"id":"1aa78d24_efa75d4d","line":648,"in_reply_to":"3aaa91ec_eea5d4b4","updated":"2016-07-04 07:26:53.000000000","message":"Done","commit_id":"0405957c2b87ccbd6c50c0b64184b6d94d816143"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"fb86b2dff26fe9dcdff3b64a16f125c1b6838980","unresolved":false,"context_lines":[{"line_number":649,"context_line":"    :ivar name: bridge name"},{"line_number":650,"context_line":"    :type name: string"},{"line_number":651,"context_line":"    \"\"\""},{"line_number":652,"context_line":"    "},{"line_number":653,"context_line":"    def __init__(self, name\u003dNone):"},{"line_number":654,"context_line":"        super(OVSAgentBridgeFixture, self).__init__(name)"},{"line_number":655,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3aaa91ec_3e92ea9e","line":652,"updated":"2016-07-01 08:03:33.000000000","message":"red box","commit_id":"0405957c2b87ccbd6c50c0b64184b6d94d816143"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c98687ba15c2a43572f1c6ac636a62092e2033a9","unresolved":false,"context_lines":[{"line_number":649,"context_line":"    :ivar name: bridge name"},{"line_number":650,"context_line":"    :type name: string"},{"line_number":651,"context_line":"    \"\"\""},{"line_number":652,"context_line":"    "},{"line_number":653,"context_line":"    def __init__(self, name\u003dNone):"},{"line_number":654,"context_line":"        super(OVSAgentBridgeFixture, self).__init__(name)"},{"line_number":655,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"1aa78d24_6f724de7","line":652,"in_reply_to":"3aaa91ec_3e92ea9e","updated":"2016-07-04 07:26:53.000000000","message":"Done","commit_id":"0405957c2b87ccbd6c50c0b64184b6d94d816143"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"96b7f7c049793c77428594b871b149ba847f2165","unresolved":false,"context_lines":[{"line_number":648,"context_line":"    :ivar bridge: created AgentBridge"},{"line_number":649,"context_line":"    :type bridge: OVSAgentBridge"},{"line_number":650,"context_line":"    \"\"\""},{"line_number":651,"context_line":"    "},{"line_number":652,"context_line":"    def __init__(self, name\u003dNone):"},{"line_number":653,"context_line":"        super(OVSAgentBridgeFixture, self).__init__(name)"},{"line_number":654,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"1aa78d24_832b1230","line":651,"updated":"2016-07-04 08:41:01.000000000","message":"please remove the whitespace","commit_id":"4905446dc5e5bd65a417c0a445c6e8d63d6352e9"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"54898e62b7b2415232843860a488e559e8dabc3a","unresolved":false,"context_lines":[{"line_number":648,"context_line":"    :ivar bridge: created AgentBridge"},{"line_number":649,"context_line":"    :type bridge: OVSAgentBridge"},{"line_number":650,"context_line":"    \"\"\""},{"line_number":651,"context_line":"    "},{"line_number":652,"context_line":"    def __init__(self, name\u003dNone):"},{"line_number":653,"context_line":"        super(OVSAgentBridgeFixture, self).__init__(name)"},{"line_number":654,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"1aa78d24_03ef22e9","line":651,"in_reply_to":"1aa78d24_832b1230","updated":"2016-07-04 08:42:42.000000000","message":"Done","commit_id":"4905446dc5e5bd65a417c0a445c6e8d63d6352e9"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"7e0d301871e3a6ab3037862fab7b4e9931df8c98","unresolved":false,"context_lines":[{"line_number":660,"context_line":"    :ivar name: bridge name"},{"line_number":661,"context_line":"    :type name: string"},{"line_number":662,"context_line":"    :ivar bridge: created AgentBridge"},{"line_number":663,"context_line":"    :type bridge: OVSAgentBridge"},{"line_number":664,"context_line":"    \"\"\""},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"    def __init__(self, name\u003dNone):"}],"source_content_type":"text/x-python","patch_set":26,"id":"bacf61ea_c0ee178a","line":663,"updated":"2016-08-05 09:22:33.000000000","message":"i couldn\u0027t find there attributes in this class.","commit_id":"fa98ce73b5a23e0a40394f6201a50db707c688fc"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c39fcd3cc280761345f0d59e023a526e05ff44fe","unresolved":false,"context_lines":[{"line_number":660,"context_line":"    :ivar name: bridge name"},{"line_number":661,"context_line":"    :type name: string"},{"line_number":662,"context_line":"    :ivar bridge: created AgentBridge"},{"line_number":663,"context_line":"    :type bridge: OVSAgentBridge"},{"line_number":664,"context_line":"    \"\"\""},{"line_number":665,"context_line":""},{"line_number":666,"context_line":"    def __init__(self, name\u003dNone):"}],"source_content_type":"text/x-python","patch_set":26,"id":"bacf61ea_c9ec83bd","line":663,"in_reply_to":"bacf61ea_c0ee178a","updated":"2016-08-05 09:35:23.000000000","message":"My fault! I\u0027ll remove them","commit_id":"fa98ce73b5a23e0a40394f6201a50db707c688fc"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"584d9be1c38cad73b853df17659145bf1cd7c928","unresolved":false,"context_lines":[{"line_number":700,"context_line":"        tools.fail(\u0027Unexpected bridge type: %s\u0027 % type(bridge))"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"class OVSAgentBridgeFixture(br_cookie.OVSBridgeCookieMixin, ovs_lib.OVSBridge):"},{"line_number":704,"context_line":"    \"\"\"Create an AgentBridge.\"\"\""},{"line_number":705,"context_line":""},{"line_number":706,"context_line":"    def __init__(self, name\u003dNone):"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a71b18c_731b7781","line":703,"range":{"start_line":703,"start_character":20,"end_line":703,"end_character":27},"updated":"2016-12-06 11:23:32.000000000","message":"the Fixture suffix is confusing.\n(it made me it\u0027s a subclass of fixtures.Fixture)","commit_id":"b00dcca055ea2a398d43e7b72beba963b5eabab6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7e0d0f47683edd9b31515a3593897d3df9c74a7e","unresolved":false,"context_lines":[{"line_number":700,"context_line":"        tools.fail(\u0027Unexpected bridge type: %s\u0027 % type(bridge))"},{"line_number":701,"context_line":""},{"line_number":702,"context_line":""},{"line_number":703,"context_line":"class OVSAgentBridgeFixture(br_cookie.OVSBridgeCookieMixin, ovs_lib.OVSBridge):"},{"line_number":704,"context_line":"    \"\"\"Create an AgentBridge.\"\"\""},{"line_number":705,"context_line":""},{"line_number":706,"context_line":"    def __init__(self, name\u003dNone):"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a71b18c_92fc82b9","line":703,"range":{"start_line":703,"start_character":20,"end_line":703,"end_character":27},"in_reply_to":"3a71b18c_731b7781","updated":"2016-12-06 15:35:13.000000000","message":"Done. I\u0027ll change that to OVSAgentBridgeAgnostic, because it\u0027s like an OVSAgentBridge without the specific controller implementation.","commit_id":"b00dcca055ea2a398d43e7b72beba963b5eabab6"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"584d9be1c38cad73b853df17659145bf1cd7c928","unresolved":false,"context_lines":[{"line_number":703,"context_line":"class OVSAgentBridgeFixture(br_cookie.OVSBridgeCookieMixin, ovs_lib.OVSBridge):"},{"line_number":704,"context_line":"    \"\"\"Create an AgentBridge.\"\"\""},{"line_number":705,"context_line":""},{"line_number":706,"context_line":"    def __init__(self, name\u003dNone):"},{"line_number":707,"context_line":"        super(OVSAgentBridgeFixture, self).__init__(name)"},{"line_number":708,"context_line":""},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"class OVSBridgeFixture(fixtures.Fixture):"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a71b18c_d3a1ab47","line":707,"range":{"start_line":706,"start_character":0,"end_line":707,"end_character":57},"updated":"2016-12-06 11:23:32.000000000","message":"seems unnecessary","commit_id":"b00dcca055ea2a398d43e7b72beba963b5eabab6"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"5968b4fde268b72f6d2d8e2bc5debb7cf92660bd","unresolved":false,"context_lines":[{"line_number":703,"context_line":"class OVSAgentBridgeFixture(br_cookie.OVSBridgeCookieMixin, ovs_lib.OVSBridge):"},{"line_number":704,"context_line":"    \"\"\"Create an AgentBridge.\"\"\""},{"line_number":705,"context_line":""},{"line_number":706,"context_line":"    def __init__(self, name\u003dNone):"},{"line_number":707,"context_line":"        super(OVSAgentBridgeFixture, self).__init__(name)"},{"line_number":708,"context_line":""},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"class OVSBridgeFixture(fixtures.Fixture):"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a71b18c_cdac9f8e","line":707,"range":{"start_line":706,"start_character":0,"end_line":707,"end_character":57},"in_reply_to":"3a71b18c_52f2ea06","updated":"2016-12-06 15:44:31.000000000","message":"i meant this __init__ method is unnecessary.","commit_id":"b00dcca055ea2a398d43e7b72beba963b5eabab6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a835fa70c2548e9943f78a56e4ec0a0bfa60d254","unresolved":false,"context_lines":[{"line_number":703,"context_line":"class OVSAgentBridgeFixture(br_cookie.OVSBridgeCookieMixin, ovs_lib.OVSBridge):"},{"line_number":704,"context_line":"    \"\"\"Create an AgentBridge.\"\"\""},{"line_number":705,"context_line":""},{"line_number":706,"context_line":"    def __init__(self, name\u003dNone):"},{"line_number":707,"context_line":"        super(OVSAgentBridgeFixture, self).__init__(name)"},{"line_number":708,"context_line":""},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"class OVSBridgeFixture(fixtures.Fixture):"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a71b18c_387aaf88","line":707,"range":{"start_line":706,"start_character":0,"end_line":707,"end_character":57},"in_reply_to":"3a71b18c_cdac9f8e","updated":"2016-12-06 15:56:22.000000000","message":"Ah! Ok, your are right.","commit_id":"b00dcca055ea2a398d43e7b72beba963b5eabab6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7e0d0f47683edd9b31515a3593897d3df9c74a7e","unresolved":false,"context_lines":[{"line_number":703,"context_line":"class OVSAgentBridgeFixture(br_cookie.OVSBridgeCookieMixin, ovs_lib.OVSBridge):"},{"line_number":704,"context_line":"    \"\"\"Create an AgentBridge.\"\"\""},{"line_number":705,"context_line":""},{"line_number":706,"context_line":"    def __init__(self, name\u003dNone):"},{"line_number":707,"context_line":"        super(OVSAgentBridgeFixture, self).__init__(name)"},{"line_number":708,"context_line":""},{"line_number":709,"context_line":""},{"line_number":710,"context_line":"class OVSBridgeFixture(fixtures.Fixture):"}],"source_content_type":"text/x-python","patch_set":32,"id":"3a71b18c_52f2ea06","line":707,"range":{"start_line":706,"start_character":0,"end_line":707,"end_character":57},"in_reply_to":"3a71b18c_d3a1ab47","updated":"2016-12-06 15:35:13.000000000","message":"It\u0027s a helper class to be called in OVSBridgeFixture(). I\u0027ll move that inside the other class.","commit_id":"b00dcca055ea2a398d43e7b72beba963b5eabab6"}],"neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/openflow/ovs_ofctl/test_ofswitch.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ea10cf3b6cd2a729aab03b8adfa37969b3ef58ec","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            \u0027cookie\u003d0x002, duration\u003d19.859s, table\u003d71, ip, in_port\u003d10\u0027,"},{"line_number":38,"context_line":"            \u0027cookie\u003d0x002, duration\u003d19.859s, table\u003d71, ipv6, in_port\u003d10\u0027]"},{"line_number":39,"context_line":"        self._mock_dump_flows_all_tables.return_value \u003d self._flows"},{"line_number":40,"context_line":"        self._mock_dump_flows_filter.return_value \u003d \\"},{"line_number":41,"context_line":"            self._flows[:2] + self._flows[4:6]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def tearDown(self):"},{"line_number":44,"context_line":"        super(OFSwitchTest, self).tearDown()"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_fbb1a8e1","line":41,"range":{"start_line":40,"start_character":0,"end_line":41,"end_character":46},"updated":"2016-05-04 09:16:06.000000000","message":"Nit: Parenthesis are prefered:\n  ...return_value \u003d (\n         self._flows ... )","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ad8cd861e995d81ee7a28b629d9c10bfbedf0e38","unresolved":false,"context_lines":[{"line_number":37,"context_line":"            \u0027cookie\u003d0x002, duration\u003d19.859s, table\u003d71, ip, in_port\u003d10\u0027,"},{"line_number":38,"context_line":"            \u0027cookie\u003d0x002, duration\u003d19.859s, table\u003d71, ipv6, in_port\u003d10\u0027]"},{"line_number":39,"context_line":"        self._mock_dump_flows_all_tables.return_value \u003d self._flows"},{"line_number":40,"context_line":"        self._mock_dump_flows_filter.return_value \u003d \\"},{"line_number":41,"context_line":"            self._flows[:2] + self._flows[4:6]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def tearDown(self):"},{"line_number":44,"context_line":"        super(OFSwitchTest, self).tearDown()"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_2bc45b3e","line":41,"range":{"start_line":40,"start_character":0,"end_line":41,"end_character":46},"in_reply_to":"1a122d0e_fbb1a8e1","updated":"2016-05-09 08:55:27.000000000","message":"Done","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ea10cf3b6cd2a729aab03b8adfa37969b3ef58ec","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self._mock_dump_flows_filter.return_value \u003d \\"},{"line_number":41,"context_line":"            self._flows[:2] + self._flows[4:6]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def tearDown(self):"},{"line_number":44,"context_line":"        super(OFSwitchTest, self).tearDown()"},{"line_number":45,"context_line":"        self._mock_dump_flows_all_tables.stop()"},{"line_number":46,"context_line":"        self._mock_dump_flows_filter.stop()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def test_filter_flows(self):"},{"line_number":49,"context_line":"        input_result \u003d ["}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_5bd09cf7","line":46,"range":{"start_line":43,"start_character":0,"end_line":46,"end_character":43},"updated":"2016-05-04 09:16:06.000000000","message":"We don\u0027t use tearDown, we use Fixtures instead. This is done automatically in base test case class.","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ad8cd861e995d81ee7a28b629d9c10bfbedf0e38","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self._mock_dump_flows_filter.return_value \u003d \\"},{"line_number":41,"context_line":"            self._flows[:2] + self._flows[4:6]"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def tearDown(self):"},{"line_number":44,"context_line":"        super(OFSwitchTest, self).tearDown()"},{"line_number":45,"context_line":"        self._mock_dump_flows_all_tables.stop()"},{"line_number":46,"context_line":"        self._mock_dump_flows_filter.stop()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def test_filter_flows(self):"},{"line_number":49,"context_line":"        input_result \u003d ["}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_a681c2fd","line":46,"range":{"start_line":43,"start_character":0,"end_line":46,"end_character":43},"in_reply_to":"1a122d0e_5bd09cf7","updated":"2016-05-09 08:55:27.000000000","message":"Done","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"ea10cf3b6cd2a729aab03b8adfa37969b3ef58ec","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @mock.patch.object(ofswitch.OpenFlowSwitchMixin, \u0027delete_flows\u0027)"},{"line_number":70,"context_line":"    def test_cleanup_flows_without_cookies(self, mock_del_flows):"},{"line_number":71,"context_line":"        self.ofswitch.reserved_cookies \u003d set([])"},{"line_number":72,"context_line":"        self.ofswitch.cleanup_flows()"},{"line_number":73,"context_line":"        call_list \u003d [mock.call(cookie\u003d\u00270x001/-1\u0027, table\u003d\u002771\u0027),"},{"line_number":74,"context_line":"                     mock.call(cookie\u003d\u00270x001/-1\u0027, table\u003d\u002771\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_1b98e469","line":71,"range":{"start_line":71,"start_character":45,"end_line":71,"end_character":47},"updated":"2016-05-04 09:16:06.000000000","message":"Nit: [] are not needed","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"ad8cd861e995d81ee7a28b629d9c10bfbedf0e38","unresolved":false,"context_lines":[{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    @mock.patch.object(ofswitch.OpenFlowSwitchMixin, \u0027delete_flows\u0027)"},{"line_number":70,"context_line":"    def test_cleanup_flows_without_cookies(self, mock_del_flows):"},{"line_number":71,"context_line":"        self.ofswitch.reserved_cookies \u003d set([])"},{"line_number":72,"context_line":"        self.ofswitch.cleanup_flows()"},{"line_number":73,"context_line":"        call_list \u003d [mock.call(cookie\u003d\u00270x001/-1\u0027, table\u003d\u002771\u0027),"},{"line_number":74,"context_line":"                     mock.call(cookie\u003d\u00270x001/-1\u0027, table\u003d\u002771\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a122d0e_46b8aec7","line":71,"range":{"start_line":71,"start_character":45,"end_line":71,"end_character":47},"in_reply_to":"1a122d0e_1b98e469","updated":"2016-05-09 08:55:27.000000000","message":"Done","commit_id":"ffe004f85bb75bee7ec3c9001ae217ca7c1b9634"}]}
