)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"167c0a57f5089bba1cb4586b683e9e034bb8e1b0","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Cedric Brandily \u003czzelle@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2014-05-22 15:10:21 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"OVS flows apply concurrently"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Co-Authored-By: Édouard Thuleau \u003cedouard.thuleau@cloudwatt.com\u003e"},{"line_number":10,"context_line":"Change-Id: I1f260629ef95b98ee80e2ff946c3606da8fe7608"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"1ae5cdf2_c7ac288b","line":7,"updated":"2014-06-19 11:43:10.000000000","message":"this would need a bug report associated with it.","commit_id":"55fbc50543555f3673e2577430011bd3ce5f0ed3"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"864cd59a0bdb1b9e18d7f675d33d0fdc8f581d1a","unresolved":false,"context_lines":[{"line_number":12,"context_line":"other greenthread: it was impossible to ensure that all flows are"},{"line_number":13,"context_line":"applied in a unique OVSBridge.defer_apply_off call. This change"},{"line_number":14,"context_line":"ensures that all flows defined using a DeferredOVSBridge are applied"},{"line_number":15,"context_line":"on DeferredOVSBridge.apply_flows or DeferredOVSBridge.__exit_ if not"},{"line_number":16,"context_line":"exception is raised."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Author:         Cedric Brandily \u003czzelle@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"baada198_54ca086f","line":15,"range":{"start_line":15,"start_character":54,"end_line":15,"end_character":61},"updated":"2014-07-09 03:59:23.000000000","message":"__exit__","commit_id":"0e2ff493bde9a66afc6d3fb6c6699647b14e6d8b"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f73d15c0d13875743617d0e32fa713ba98aced7b","unresolved":false,"context_lines":[{"line_number":12,"context_line":"other greenthread: it was impossible to ensure that all flows are"},{"line_number":13,"context_line":"applied in a unique OVSBridge.defer_apply_off call. This change"},{"line_number":14,"context_line":"ensures that all flows defined using a DeferredOVSBridge are applied"},{"line_number":15,"context_line":"on DeferredOVSBridge.apply_flows or DeferredOVSBridge.__exit_ if not"},{"line_number":16,"context_line":"exception is raised."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Author:         Cedric Brandily \u003czzelle@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"baada198_a954e921","line":15,"in_reply_to":"baada198_54ca086f","updated":"2014-07-09 09:03:34.000000000","message":"Done","commit_id":"0e2ff493bde9a66afc6d3fb6c6699647b14e6d8b"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"864cd59a0bdb1b9e18d7f675d33d0fdc8f581d1a","unresolved":false,"context_lines":[{"line_number":16,"context_line":"exception is raised."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Author:         Cedric Brandily \u003czzelle@gmail.com\u003e"},{"line_number":19,"context_line":"Co-Authored-By: Édouard Thuleau \u003cedouard.thuleau@cloudwatt.com\u003e"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Related-bug: #1263866"},{"line_number":22,"context_line":"Change-Id: I1f260629ef95b98ee80e2ff946c3606da8fe7608"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"baada198_f4aa3c84","line":19,"range":{"start_line":19,"start_character":16,"end_line":19,"end_character":17},"updated":"2014-07-09 03:59:23.000000000","message":"please try to avoid non-ascii chars.","commit_id":"0e2ff493bde9a66afc6d3fb6c6699647b14e6d8b"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f73d15c0d13875743617d0e32fa713ba98aced7b","unresolved":false,"context_lines":[{"line_number":16,"context_line":"exception is raised."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Author:         Cedric Brandily \u003czzelle@gmail.com\u003e"},{"line_number":19,"context_line":"Co-Authored-By: Édouard Thuleau \u003cedouard.thuleau@cloudwatt.com\u003e"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Related-bug: #1263866"},{"line_number":22,"context_line":"Change-Id: I1f260629ef95b98ee80e2ff946c3606da8fe7608"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"baada198_e93501f8","line":19,"in_reply_to":"baada198_f4aa3c84","updated":"2014-07-09 09:03:34.000000000","message":"Done","commit_id":"0e2ff493bde9a66afc6d3fb6c6699647b14e6d8b"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"c9dfe39f7baff53767343eebcac4d10004c67192","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"OVS flows apply concurrently using a deferred OVSBridge"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change is an improvement of https://review.openstack.org/63917"},{"line_number":10,"context_line":"which provides a cleaner implementation. Previously flows were"},{"line_number":11,"context_line":"applied on OVSBridge.defer_apply_off which could be called by an"},{"line_number":12,"context_line":"other greenthread: it was impossible to ensure that all flows are"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"baada198_31083b2d","line":9,"updated":"2014-07-09 11:08:57.000000000","message":"perhaps put commit id here rather than gerrit link (this will make it easier to find related patch with git log)","commit_id":"ce54029f2a6d5a61c460b26b2366c6f03cc5635c"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"d52e33ff47b90f7ac021544c2fe6b2566f71a106","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"OVS flows apply concurrently using a deferred OVSBridge"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change is an improvement of https://review.openstack.org/63917"},{"line_number":10,"context_line":"which provides a cleaner implementation. Previously flows were"},{"line_number":11,"context_line":"applied on OVSBridge.defer_apply_off which could be called by an"},{"line_number":12,"context_line":"other greenthread: it was impossible to ensure that all flows are"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"baada198_f42a312b","line":9,"in_reply_to":"baada198_31083b2d","updated":"2014-07-09 11:18:06.000000000","message":"Done","commit_id":"ce54029f2a6d5a61c460b26b2366c6f03cc5635c"}],"neutron/agent/l2population_rpc.py":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"c7e7dc17f11a075d6da50cfe1080fccdcb8450fb","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        :remote_ip: remote ip address."},{"line_number":88,"context_line":"        :param lvm: a local VLAN map of network."},{"line_number":89,"context_line":"        :param ofport: a port to add."},{"line_number":90,"context_line":"        \u0027\u0027\u0027"},{"line_number":91,"context_line":"        pass"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_5a08ca26","line":90,"updated":"2014-08-04 08:16:12.000000000","message":"please update docstring.","commit_id":"1ba4b69dc936ea753c3d91b74418dce3da00b372"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"61f1338733aa220b142ff98b1ec7574d89978a20","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        :remote_ip: remote ip address."},{"line_number":88,"context_line":"        :param lvm: a local VLAN map of network."},{"line_number":89,"context_line":"        :param ofport: a port to add."},{"line_number":90,"context_line":"        \u0027\u0027\u0027"},{"line_number":91,"context_line":"        pass"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_e901d004","line":90,"in_reply_to":"baada198_5a08ca26","updated":"2014-08-04 11:34:11.000000000","message":"Done","commit_id":"1ba4b69dc936ea753c3d91b74418dce3da00b372"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"c7e7dc17f11a075d6da50cfe1080fccdcb8450fb","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        :remote_ip: remote ip address."},{"line_number":105,"context_line":"        :param lvm: local VLAN map of network."},{"line_number":106,"context_line":"        :param ofport: a port to delete."},{"line_number":107,"context_line":"        \u0027\u0027\u0027"},{"line_number":108,"context_line":"        pass"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_9a0d0238","line":107,"updated":"2014-08-04 08:16:12.000000000","message":"ditto","commit_id":"1ba4b69dc936ea753c3d91b74418dce3da00b372"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"61f1338733aa220b142ff98b1ec7574d89978a20","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        :remote_ip: remote ip address."},{"line_number":105,"context_line":"        :param lvm: local VLAN map of network."},{"line_number":106,"context_line":"        :param ofport: a port to delete."},{"line_number":107,"context_line":"        \u0027\u0027\u0027"},{"line_number":108,"context_line":"        pass"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_29082826","line":107,"in_reply_to":"baada198_9a0d0238","updated":"2014-08-04 11:34:11.000000000","message":"Done","commit_id":"1ba4b69dc936ea753c3d91b74418dce3da00b372"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"c7e7dc17f11a075d6da50cfe1080fccdcb8450fb","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        :param remote_ip: an ip for port to setup."},{"line_number":120,"context_line":"        :param network_type: a type of network."},{"line_number":121,"context_line":"        :returns: a ofport value. the value 0 means to be unavailable port."},{"line_number":122,"context_line":"        \u0027\u0027\u0027"},{"line_number":123,"context_line":"        pass"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_ba180677","line":122,"updated":"2014-08-04 08:16:12.000000000","message":"ditto","commit_id":"1ba4b69dc936ea753c3d91b74418dce3da00b372"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"61f1338733aa220b142ff98b1ec7574d89978a20","unresolved":false,"context_lines":[{"line_number":119,"context_line":"        :param remote_ip: an ip for port to setup."},{"line_number":120,"context_line":"        :param network_type: a type of network."},{"line_number":121,"context_line":"        :returns: a ofport value. the value 0 means to be unavailable port."},{"line_number":122,"context_line":"        \u0027\u0027\u0027"},{"line_number":123,"context_line":"        pass"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"    @abc.abstractmethod"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_4912bc58","line":122,"in_reply_to":"baada198_ba180677","updated":"2014-08-04 11:34:11.000000000","message":"Done","commit_id":"1ba4b69dc936ea753c3d91b74418dce3da00b372"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"c7e7dc17f11a075d6da50cfe1080fccdcb8450fb","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        :param tun_ofport: a port value to cleanup."},{"line_number":135,"context_line":"        :param tunnel_type: a type of tunnel."},{"line_number":136,"context_line":"        \u0027\u0027\u0027"},{"line_number":137,"context_line":"        pass"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def get_agent_ports(self, fdb_entries, local_vlan_map):"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_da13fa56","line":136,"updated":"2014-08-04 08:16:12.000000000","message":"ditto","commit_id":"1ba4b69dc936ea753c3d91b74418dce3da00b372"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"61f1338733aa220b142ff98b1ec7574d89978a20","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        :param tun_ofport: a port value to cleanup."},{"line_number":135,"context_line":"        :param tunnel_type: a type of tunnel."},{"line_number":136,"context_line":"        \u0027\u0027\u0027"},{"line_number":137,"context_line":"        pass"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"    def get_agent_ports(self, fdb_entries, local_vlan_map):"}],"source_content_type":"text/x-python","patch_set":10,"id":"baada198_690dc034","line":136,"in_reply_to":"baada198_da13fa56","updated":"2014-08-04 11:34:11.000000000","message":"Done","commit_id":"1ba4b69dc936ea753c3d91b74418dce3da00b372"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"cfe75615c49652acccaae8a9cdf7a3f663449b9d","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        on bridge."},{"line_number":83,"context_line":"        And you may edit some information for local arp respond."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        :param br: OVSBridge on which add_fdb_flow should be applied"},{"line_number":86,"context_line":"        :param port_info: list to include mac and ip."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"            [mac, ip]"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_897cd4b7","line":85,"range":{"start_line":85,"start_character":19,"end_line":85,"end_character":28},"updated":"2014-08-04 11:59:01.000000000","message":"can you please use less-OVS-specific wording in this module?\neg. s/OVSBridge/a bridge/","commit_id":"243da687bb6b94cba4751b18295b7b5fd3639bda"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"0f0f51340c2f6179ac1be5b60a9ae6068c9327a5","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        on bridge."},{"line_number":83,"context_line":"        And you may edit some information for local arp respond."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"        :param br: OVSBridge on which add_fdb_flow should be applied"},{"line_number":86,"context_line":"        :param port_info: list to include mac and ip."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"            [mac, ip]"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_0ca7f2bc","line":85,"in_reply_to":"baada198_897cd4b7","updated":"2014-08-04 13:12:25.000000000","message":"Done","commit_id":"243da687bb6b94cba4751b18295b7b5fd3639bda"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"f7019a5832e9de856a275747de142fd18b36efc5","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        :param br: represent the bridge on which add_fdb_flow should be"},{"line_number":86,"context_line":"        applied."},{"line_number":87,"context_line":"        :param port_info: list to include mac and ip."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"            [mac, ip]"},{"line_number":90,"context_line":"        :remote_ip: remote ip address."},{"line_number":91,"context_line":"        :param lvm: a local VLAN map of network."}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_a67b76f2","line":88,"updated":"2014-08-04 17:38:41.000000000","message":"nit:  extra line should not be added.","commit_id":"83aad21f2debc7025ea8f185277f10efb2c7909e"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"a3b9d2066e63592818a1b7343ac4c7043c01dce1","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        :param br: represent the bridge on which add_fdb_flow should be"},{"line_number":86,"context_line":"        applied."},{"line_number":87,"context_line":"        :param port_info: list to include mac and ip."},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"            [mac, ip]"},{"line_number":90,"context_line":"        :remote_ip: remote ip address."},{"line_number":91,"context_line":"        :param lvm: a local VLAN map of network."}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_01188274","line":88,"in_reply_to":"baada198_a67b76f2","updated":"2014-08-04 22:50:07.000000000","message":"Done","commit_id":"83aad21f2debc7025ea8f185277f10efb2c7909e"}],"neutron/agent/linux/ovs_lib.py":[{"author":{"_account_id":2888,"name":"Mathieu Rohon","email":"mathieu.rohon@gmail.com","username":"mathieu-rohon"},"change_message_id":"1c88d9048c9e5867aa6c4cc08ad076a896b9c113","unresolved":false,"context_lines":[{"line_number":434,"context_line":"        self.actionflows.append((\u0027del\u0027, kwargs))"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    def apply_flows(self):"},{"line_number":437,"context_line":"        actionflows \u003d self.actionflows"},{"line_number":438,"context_line":"        self.actionflows \u003d []"},{"line_number":439,"context_line":"        if not actionflows:"},{"line_number":440,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_54009b33","line":437,"updated":"2014-05-19 12:49:55.000000000","message":"shouldn\u0027t you use dict.copy instead of \"\u003d\" to avoid executing commands that are added to the actionflows dict when apply_flows is called explicitly, outside the __exit__ method","commit_id":"2d5656d3da7600f59166f12619aed252ab05aac2"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f522fb2cf712c81a5ab023319b0824b68f173d70","unresolved":false,"context_lines":[{"line_number":434,"context_line":"        self.actionflows.append((\u0027del\u0027, kwargs))"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":"    def apply_flows(self):"},{"line_number":437,"context_line":"        actionflows \u003d self.actionflows"},{"line_number":438,"context_line":"        self.actionflows \u003d []"},{"line_number":439,"context_line":"        if not actionflows:"},{"line_number":440,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":3,"id":"7adec928_6a1cce6a","line":437,"in_reply_to":"7adec928_54009b33","updated":"2014-05-19 13:15:14.000000000","message":"I should document that actionflow is a tuple of (action,flow) and (self.)actionflows are lists.\n\nactionflows to apply are fixed by self.actionflows \u003d []. Indeed \n * before add/mod/delete_flow append to self.actionflows \u003d\u003d actionflows, \n * after self.actionflows !\u003d actionflows so add/mod/delete_flow append to the \"new\" self.actionflows and actionflows cannot be updated.\n\nIMHO, apply_flows is thread-safe.","commit_id":"2d5656d3da7600f59166f12619aed252ab05aac2"},{"author":{"_account_id":8190,"name":"Drew Thorstensen (thorst)","email":"thorst@us.ibm.com","username":"thorst"},"change_message_id":"6d69976795f3ce311759d3797522d6c176bb501f","unresolved":false,"context_lines":[{"line_number":434,"context_line":"            raise Exception(msg)"},{"line_number":435,"context_line":""},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"class DeferredOVSBridge(object):"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    def __init__(self, ovs_bridge, full_ordered\u003dFalse,"},{"line_number":440,"context_line":"                 order\u003d(\u0027add\u0027, \u0027mod\u0027, \u0027del\u0027)):"}],"source_content_type":"text/x-python","patch_set":5,"id":"7adec928_cbd39336","line":437,"updated":"2014-05-23 19:50:51.000000000","message":"I think it would be good to have a comment for the class indicating its role.  I\u0027d recommend it in the __init__ method too, specifically what the full_ordered provides.","commit_id":"55fbc50543555f3673e2577430011bd3ce5f0ed3"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"f3797b005e8ec357581a9b53ecbe0c67782ff4ac","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        self.br \u003d br"},{"line_number":476,"context_line":"        self.full_ordered \u003d full_ordered"},{"line_number":477,"context_line":"        self.order \u003d order"},{"line_number":478,"context_line":"        self.actionflows \u003d []"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    def __getattr__(self, name):"},{"line_number":481,"context_line":"        if name in self.ALLOWED_PASSTHROUGHS:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_c0746038","line":478,"updated":"2014-06-25 10:00:47.000000000","message":"really pedant nit ... consider flow_actions for this variable name.","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"ad28df54d0ada44873a8a246e7943c83d0ce920c","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        self.br \u003d br"},{"line_number":476,"context_line":"        self.full_ordered \u003d full_ordered"},{"line_number":477,"context_line":"        self.order \u003d order"},{"line_number":478,"context_line":"        self.actionflows \u003d []"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    def __getattr__(self, name):"},{"line_number":481,"context_line":"        if name in self.ALLOWED_PASSTHROUGHS:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_56cf3157","line":478,"in_reply_to":"1ae5cdf2_03a3adb1","updated":"2014-06-25 13:55:19.000000000","message":"Done","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"3a607a7c065fa2f44448e5e7d12ffcff3c0b04f5","unresolved":false,"context_lines":[{"line_number":475,"context_line":"        self.br \u003d br"},{"line_number":476,"context_line":"        self.full_ordered \u003d full_ordered"},{"line_number":477,"context_line":"        self.order \u003d order"},{"line_number":478,"context_line":"        self.actionflows \u003d []"},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"    def __getattr__(self, name):"},{"line_number":481,"context_line":"        if name in self.ALLOWED_PASSTHROUGHS:"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_03a3adb1","line":478,"in_reply_to":"1ae5cdf2_c0746038","updated":"2014-06-25 12:49:20.000000000","message":"self.actionflows stores (action, flow) tuples ... action_flow_tuples is perhaps cleaner","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"f3797b005e8ec357581a9b53ecbe0c67782ff4ac","unresolved":false,"context_lines":[{"line_number":480,"context_line":"    def __getattr__(self, name):"},{"line_number":481,"context_line":"        if name in self.ALLOWED_PASSTHROUGHS:"},{"line_number":482,"context_line":"            return getattr(self.br, name)"},{"line_number":483,"context_line":"        raise AttributeError(name)"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"    def add_flow(self, **kwargs):"},{"line_number":486,"context_line":"        self.actionflows.append((\u0027add\u0027, kwargs))"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_2006e485","line":483,"updated":"2014-06-25 10:00:47.000000000","message":"I understand this is smart, but code-wise here we would need probably even less lines by explicitly defining the add_port and delete_port on DeferredOVSBridge and have them call methods with the same name on the wrapped class.","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"3a607a7c065fa2f44448e5e7d12ffcff3c0b04f5","unresolved":false,"context_lines":[{"line_number":480,"context_line":"    def __getattr__(self, name):"},{"line_number":481,"context_line":"        if name in self.ALLOWED_PASSTHROUGHS:"},{"line_number":482,"context_line":"            return getattr(self.br, name)"},{"line_number":483,"context_line":"        raise AttributeError(name)"},{"line_number":484,"context_line":""},{"line_number":485,"context_line":"    def add_flow(self, **kwargs):"},{"line_number":486,"context_line":"        self.actionflows.append((\u0027add\u0027, kwargs))"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_36cc65bb","line":483,"in_reply_to":"1ae5cdf2_2006e485","updated":"2014-06-25 12:49:20.000000000","message":"It seems OpenFlow FW will use this class and they could need new passthroughs that\u0027s why i choose a generic approach.","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"f3797b005e8ec357581a9b53ecbe0c67782ff4ac","unresolved":false,"context_lines":[{"line_number":498,"context_line":"            return"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"        if not self.full_ordered:"},{"line_number":501,"context_line":"            weights \u003d dict((y, x) for x, y in enumerate(self.order))"},{"line_number":502,"context_line":"            actionflows.sort(key\u003dlambda af: weights[af[0]])"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"        grouped \u003d itertools.groupby(actionflows, key\u003doperator.itemgetter(0))"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_20bc24db","line":501,"updated":"2014-06-25 10:00:47.000000000","message":"why not build the weights dict in __init__ ?","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"3a607a7c065fa2f44448e5e7d12ffcff3c0b04f5","unresolved":false,"context_lines":[{"line_number":498,"context_line":"            return"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"        if not self.full_ordered:"},{"line_number":501,"context_line":"            weights \u003d dict((y, x) for x, y in enumerate(self.order))"},{"line_number":502,"context_line":"            actionflows.sort(key\u003dlambda af: weights[af[0]])"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"        grouped \u003d itertools.groupby(actionflows, key\u003doperator.itemgetter(0))"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_838edd30","line":501,"in_reply_to":"1ae5cdf2_20bc24db","updated":"2014-06-25 12:49:20.000000000","message":"Good catch, will do","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"ad28df54d0ada44873a8a246e7943c83d0ce920c","unresolved":false,"context_lines":[{"line_number":498,"context_line":"            return"},{"line_number":499,"context_line":""},{"line_number":500,"context_line":"        if not self.full_ordered:"},{"line_number":501,"context_line":"            weights \u003d dict((y, x) for x, y in enumerate(self.order))"},{"line_number":502,"context_line":"            actionflows.sort(key\u003dlambda af: weights[af[0]])"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"        grouped \u003d itertools.groupby(actionflows, key\u003doperator.itemgetter(0))"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_f480354b","line":501,"in_reply_to":"1ae5cdf2_838edd30","updated":"2014-06-25 13:55:19.000000000","message":"Done","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"f3797b005e8ec357581a9b53ecbe0c67782ff4ac","unresolved":false,"context_lines":[{"line_number":501,"context_line":"            weights \u003d dict((y, x) for x, y in enumerate(self.order))"},{"line_number":502,"context_line":"            actionflows.sort(key\u003dlambda af: weights[af[0]])"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"        grouped \u003d itertools.groupby(actionflows, key\u003doperator.itemgetter(0))"},{"line_number":505,"context_line":"        for action, actionflows in grouped:"},{"line_number":506,"context_line":"            flows \u003d [f for __, f in actionflows]"},{"line_number":507,"context_line":"            self.br.do_action_flows(action, flows)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_207b44f5","line":504,"updated":"2014-06-25 10:00:47.000000000","message":"if the actionflows are sorted by \u0027action\u0027 according to the weight assigned to the action, is the groupby needed as well? sorting should ensure that once you move from \u0027add\u0027 to \u0027mod\u0027, for instance, you won\u0027t see \u0027add\u0027 anymore...","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"3a607a7c065fa2f44448e5e7d12ffcff3c0b04f5","unresolved":false,"context_lines":[{"line_number":501,"context_line":"            weights \u003d dict((y, x) for x, y in enumerate(self.order))"},{"line_number":502,"context_line":"            actionflows.sort(key\u003dlambda af: weights[af[0]])"},{"line_number":503,"context_line":""},{"line_number":504,"context_line":"        grouped \u003d itertools.groupby(actionflows, key\u003doperator.itemgetter(0))"},{"line_number":505,"context_line":"        for action, actionflows in grouped:"},{"line_number":506,"context_line":"            flows \u003d [f for __, f in actionflows]"},{"line_number":507,"context_line":"            self.br.do_action_flows(action, flows)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_239ee907","line":504,"in_reply_to":"1ae5cdf2_207b44f5","updated":"2014-06-25 12:49:20.000000000","message":"In the context, it allows to group in iterable consecutive flows associated to the same action ... it is required even if actionflows is sorted and i prefer not to do the cut manually.","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"f3797b005e8ec357581a9b53ecbe0c67782ff4ac","unresolved":false,"context_lines":[{"line_number":503,"context_line":""},{"line_number":504,"context_line":"        grouped \u003d itertools.groupby(actionflows, key\u003doperator.itemgetter(0))"},{"line_number":505,"context_line":"        for action, actionflows in grouped:"},{"line_number":506,"context_line":"            flows \u003d [f for __, f in actionflows]"},{"line_number":507,"context_line":"            self.br.do_action_flows(action, flows)"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"    def __enter__(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_8093385b","line":506,"updated":"2014-06-25 10:00:47.000000000","message":"nit - use single underscore for ignored variable or maybe just actionflows.values","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"3a607a7c065fa2f44448e5e7d12ffcff3c0b04f5","unresolved":false,"context_lines":[{"line_number":503,"context_line":""},{"line_number":504,"context_line":"        grouped \u003d itertools.groupby(actionflows, key\u003doperator.itemgetter(0))"},{"line_number":505,"context_line":"        for action, actionflows in grouped:"},{"line_number":506,"context_line":"            flows \u003d [f for __, f in actionflows]"},{"line_number":507,"context_line":"            self.br.do_action_flows(action, flows)"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"    def __enter__(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_8375fd34","line":506,"in_reply_to":"1ae5cdf2_8093385b","updated":"2014-06-25 12:49:20.000000000","message":"Will do","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"ad28df54d0ada44873a8a246e7943c83d0ce920c","unresolved":false,"context_lines":[{"line_number":503,"context_line":""},{"line_number":504,"context_line":"        grouped \u003d itertools.groupby(actionflows, key\u003doperator.itemgetter(0))"},{"line_number":505,"context_line":"        for action, actionflows in grouped:"},{"line_number":506,"context_line":"            flows \u003d [f for __, f in actionflows]"},{"line_number":507,"context_line":"            self.br.do_action_flows(action, flows)"},{"line_number":508,"context_line":""},{"line_number":509,"context_line":"    def __enter__(self):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_9444511a","line":506,"in_reply_to":"1ae5cdf2_8375fd34","updated":"2014-06-25 13:55:19.000000000","message":"Done","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"f3797b005e8ec357581a9b53ecbe0c67782ff4ac","unresolved":false,"context_lines":[{"line_number":514,"context_line":"            self.apply_flows()"},{"line_number":515,"context_line":"            return True"},{"line_number":516,"context_line":"        LOG.error(_(\"OVS flows could not be applied on bridge %s\"),"},{"line_number":517,"context_line":"                  self.br.br_name)"},{"line_number":518,"context_line":""},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"def get_bridge_for_iface(root_helper, iface):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_e0fcfcb7","line":517,"updated":"2014-06-25 10:00:47.000000000","message":"minor: consider logging also the exception reason here. (the traceback should appear anyway in the logs, I think)","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"ad28df54d0ada44873a8a246e7943c83d0ce920c","unresolved":false,"context_lines":[{"line_number":514,"context_line":"            self.apply_flows()"},{"line_number":515,"context_line":"            return True"},{"line_number":516,"context_line":"        LOG.error(_(\"OVS flows could not be applied on bridge %s\"),"},{"line_number":517,"context_line":"                  self.br.br_name)"},{"line_number":518,"context_line":""},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"def get_bridge_for_iface(root_helper, iface):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_d44ed937","line":517,"in_reply_to":"1ae5cdf2_c36f055f","updated":"2014-06-25 13:55:19.000000000","message":"Done","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"3a607a7c065fa2f44448e5e7d12ffcff3c0b04f5","unresolved":false,"context_lines":[{"line_number":514,"context_line":"            self.apply_flows()"},{"line_number":515,"context_line":"            return True"},{"line_number":516,"context_line":"        LOG.error(_(\"OVS flows could not be applied on bridge %s\"),"},{"line_number":517,"context_line":"                  self.br.br_name)"},{"line_number":518,"context_line":""},{"line_number":519,"context_line":""},{"line_number":520,"context_line":"def get_bridge_for_iface(root_helper, iface):"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_c36f055f","line":517,"in_reply_to":"1ae5cdf2_e0fcfcb7","updated":"2014-06-25 12:49:20.000000000","message":"good catch, will do","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"864cd59a0bdb1b9e18d7f675d33d0fdc8f581d1a","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def do_action_flows(self, action, kwargs_list):"},{"line_number":194,"context_line":"        flow_strs \u003d [_build_flow_expr_str(kw, action) for kw in kwargs_list]"},{"line_number":195,"context_line":"        self.run_ofctl(\u0027%s-flows\u0027 % action, [\u0027-\u0027], \u0027\\n\u0027.join(flow_strs))"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def add_flow(self, **kwargs):"},{"line_number":198,"context_line":"        return self.do_action_flows(\u0027add\u0027, [kwargs])"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_d79ffab2","line":195,"updated":"2014-07-09 03:59:23.000000000","message":"add return here or remove return from callers.","commit_id":"0e2ff493bde9a66afc6d3fb6c6699647b14e6d8b"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f73d15c0d13875743617d0e32fa713ba98aced7b","unresolved":false,"context_lines":[{"line_number":192,"context_line":""},{"line_number":193,"context_line":"    def do_action_flows(self, action, kwargs_list):"},{"line_number":194,"context_line":"        flow_strs \u003d [_build_flow_expr_str(kw, action) for kw in kwargs_list]"},{"line_number":195,"context_line":"        self.run_ofctl(\u0027%s-flows\u0027 % action, [\u0027-\u0027], \u0027\\n\u0027.join(flow_strs))"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"    def add_flow(self, **kwargs):"},{"line_number":198,"context_line":"        return self.do_action_flows(\u0027add\u0027, [kwargs])"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_49242dc6","line":195,"in_reply_to":"baada198_d79ffab2","updated":"2014-07-09 09:03:34.000000000","message":"Done","commit_id":"0e2ff493bde9a66afc6d3fb6c6699647b14e6d8b"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"864cd59a0bdb1b9e18d7f675d33d0fdc8f581d1a","unresolved":false,"context_lines":[{"line_number":517,"context_line":"    def __exit__(self, exc_type, exc_value, traceback):"},{"line_number":518,"context_line":"        if exc_type is None:"},{"line_number":519,"context_line":"            self.apply_flows()"},{"line_number":520,"context_line":"            return True"},{"line_number":521,"context_line":"        LOG.exception(_(\"OVS flows could not be applied on bridge %s\"),"},{"line_number":522,"context_line":"                      self.br.br_name)"},{"line_number":523,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_b430c408","line":520,"updated":"2014-07-09 03:59:23.000000000","message":"isn\u0027t this return value ignored?\n\nhttps://docs.python.org/2.7/reference/compound_stmts.html#the-with-statement","commit_id":"0e2ff493bde9a66afc6d3fb6c6699647b14e6d8b"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"f73d15c0d13875743617d0e32fa713ba98aced7b","unresolved":false,"context_lines":[{"line_number":517,"context_line":"    def __exit__(self, exc_type, exc_value, traceback):"},{"line_number":518,"context_line":"        if exc_type is None:"},{"line_number":519,"context_line":"            self.apply_flows()"},{"line_number":520,"context_line":"            return True"},{"line_number":521,"context_line":"        LOG.exception(_(\"OVS flows could not be applied on bridge %s\"),"},{"line_number":522,"context_line":"                      self.br.br_name)"},{"line_number":523,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_490b4d2b","line":520,"in_reply_to":"baada198_b430c408","updated":"2014-07-09 09:03:34.000000000","message":"Done","commit_id":"0e2ff493bde9a66afc6d3fb6c6699647b14e6d8b"},{"author":{"_account_id":6447,"name":"Avishay Balderman","email":"avishayb@radware.com","username":"avishayb"},"change_message_id":"2c10c862e2c8d246af971efcb092111133eaaf8c","unresolved":false,"context_lines":[{"line_number":495,"context_line":"        self.action_flow_tuples.append((\u0027del\u0027, kwargs))"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    def apply_flows(self):"},{"line_number":498,"context_line":"        action_flow_tuples \u003d self.action_flow_tuples"},{"line_number":499,"context_line":"        self.action_flow_tuples \u003d []"},{"line_number":500,"context_line":"        if not action_flow_tuples:"},{"line_number":501,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_e939d0a3","line":498,"updated":"2014-08-04 11:46:14.000000000","message":"# cleaner - return as soon as know you have to return\n    action_flow_tuples \u003d self.action_flow_tuples\n    if not action_flow_tuples:\n        return    \n    self.action_flow_tuples \u003d []","commit_id":"243da687bb6b94cba4751b18295b7b5fd3639bda"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"912f425cb2714bbbfdafc37a5df356b363552919","unresolved":false,"context_lines":[{"line_number":495,"context_line":"        self.action_flow_tuples.append((\u0027del\u0027, kwargs))"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    def apply_flows(self):"},{"line_number":498,"context_line":"        action_flow_tuples \u003d self.action_flow_tuples"},{"line_number":499,"context_line":"        self.action_flow_tuples \u003d []"},{"line_number":500,"context_line":"        if not action_flow_tuples:"},{"line_number":501,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_fd77c68b","line":498,"in_reply_to":"baada198_6cc86e75","updated":"2014-08-04 13:21:46.000000000","message":"I don\u0027t think we\u0027ll ever use native threads... at least not in the near future!\n\nAnyway, Cedric\u0027s code looks safer.","commit_id":"243da687bb6b94cba4751b18295b7b5fd3639bda"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"868b4f7aded386f90e2f1824e04718d80bcd8d49","unresolved":false,"context_lines":[{"line_number":495,"context_line":"        self.action_flow_tuples.append((\u0027del\u0027, kwargs))"},{"line_number":496,"context_line":""},{"line_number":497,"context_line":"    def apply_flows(self):"},{"line_number":498,"context_line":"        action_flow_tuples \u003d self.action_flow_tuples"},{"line_number":499,"context_line":"        self.action_flow_tuples \u003d []"},{"line_number":500,"context_line":"        if not action_flow_tuples:"},{"line_number":501,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_6cc86e75","line":498,"in_reply_to":"baada198_e939d0a3","updated":"2014-08-04 12:16:38.000000000","message":"Your proposal is greenthread-safe but not thread-safe, indeed a (action, flow) can be added in action_flow_tuples between the test and the return.","commit_id":"243da687bb6b94cba4751b18295b7b5fd3639bda"}],"neutron/plugins/openvswitch/agent/ovs_neutron_agent.py":[{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"094c8766b4d25a8ccfd9d5be017b13b32512cf25","unresolved":false,"context_lines":[{"line_number":1023,"context_line":"            LOG.debug(_(\"No VIF port for port %s defined on agent.\"), port_id)"},{"line_number":1024,"context_line":""},{"line_number":1025,"context_line":"    def setup_tunnel_port(self, br, port_name, remote_ip, tunnel_type):"},{"line_number":1026,"context_line":"        ofport \u003d self.tun_br.add_tunnel_port(port_name,"},{"line_number":1027,"context_line":"                                             remote_ip,"},{"line_number":1028,"context_line":"                                             self.local_ip,"},{"line_number":1029,"context_line":"                                             tunnel_type,"}],"source_content_type":"text/x-python","patch_set":5,"id":"7adec928_3f72a311","line":1026,"range":{"start_line":1026,"start_character":22,"end_line":1026,"end_character":28},"updated":"2014-05-22 13:44:58.000000000","message":"using both of deferred \u0027br\u0027 and self.tun_br in a method is confusing.\nhow about making DeferredOVSBridge pass-though add_tunnel_port etc?","commit_id":"55fbc50543555f3673e2577430011bd3ce5f0ed3"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"f3797b005e8ec357581a9b53ecbe0c67782ff4ac","unresolved":false,"context_lines":[{"line_number":325,"context_line":"            agent_ports.pop(self.local_ip, None)"},{"line_number":326,"context_line":"            if not len(agent_ports):"},{"line_number":327,"context_line":"                continue"},{"line_number":328,"context_line":"            with self.tun_br.deferred() as deferred_br:"},{"line_number":329,"context_line":"                for agent_ip, ports in agent_ports.items():"},{"line_number":330,"context_line":"                    # Ensure we have a tunnel port with this remote agent"},{"line_number":331,"context_line":"                    ofport \u003d self.tun_br_ofports["}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_20c98425","line":328,"updated":"2014-06-25 10:00:47.000000000","message":"I wonder if there is a reason for not just making tun_br a deferred bridge instance and avoid the deferred call\n\nNot a big deal, this is more of a curiosity - but this if possible will probably end up making the patch simpler","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"3a607a7c065fa2f44448e5e7d12ffcff3c0b04f5","unresolved":false,"context_lines":[{"line_number":325,"context_line":"            agent_ports.pop(self.local_ip, None)"},{"line_number":326,"context_line":"            if not len(agent_ports):"},{"line_number":327,"context_line":"                continue"},{"line_number":328,"context_line":"            with self.tun_br.deferred() as deferred_br:"},{"line_number":329,"context_line":"                for agent_ip, ports in agent_ports.items():"},{"line_number":330,"context_line":"                    # Ensure we have a tunnel port with this remote agent"},{"line_number":331,"context_line":"                    ofport \u003d self.tun_br_ofports["}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_e08dd72b","line":328,"in_reply_to":"1ae5cdf2_20c98425","updated":"2014-06-25 12:49:20.000000000","message":"The bug #1263866 solves by this patch was caused by concurrent gthreads using the same tun_br, a deferred_br is created per fdb_* call so no concurrence troubles on deferred_br.actionflows ... if we replace tun_br by deferred_br we will have the same trouble on deferred_br.\n\nI will document that deferred is thread-safe but not DeferredOVSBridge","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"ad28df54d0ada44873a8a246e7943c83d0ce920c","unresolved":false,"context_lines":[{"line_number":325,"context_line":"            agent_ports.pop(self.local_ip, None)"},{"line_number":326,"context_line":"            if not len(agent_ports):"},{"line_number":327,"context_line":"                continue"},{"line_number":328,"context_line":"            with self.tun_br.deferred() as deferred_br:"},{"line_number":329,"context_line":"                for agent_ip, ports in agent_ports.items():"},{"line_number":330,"context_line":"                    # Ensure we have a tunnel port with this remote agent"},{"line_number":331,"context_line":"                    ofport \u003d self.tun_br_ofports["}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_944d31c8","line":328,"in_reply_to":"1ae5cdf2_e08dd72b","updated":"2014-06-25 13:55:19.000000000","message":"Done","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"}],"neutron/tests/unit/agent/linux/test_ovs_lib.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"f3797b005e8ec357581a9b53ecbe0c67782ff4ac","unresolved":false,"context_lines":[{"line_number":290,"context_line":"                      root_helper\u003dself.root_helper),"},{"line_number":291,"context_line":"            mock.call([\"ovs-ofctl\", \"add-flows\", self.BR_NAME, \u0027-\u0027],"},{"line_number":292,"context_line":"                      process_input\u003d\"hard_timeout\u003d0,idle_timeout\u003d0,priority\u003d4,\""},{"line_number":293,"context_line":"                                    \"nw_src\u003d%s,arp,actions\u003ddrop\" % cidr,"},{"line_number":294,"context_line":"                      root_helper\u003dself.root_helper),"},{"line_number":295,"context_line":"        ]"},{"line_number":296,"context_line":"        self.execute.assert_has_calls(expected_calls)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_0062c815","line":293,"updated":"2014-06-25 10:00:47.000000000","message":"is this change related to this patch?","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"3a607a7c065fa2f44448e5e7d12ffcff3c0b04f5","unresolved":false,"context_lines":[{"line_number":290,"context_line":"                      root_helper\u003dself.root_helper),"},{"line_number":291,"context_line":"            mock.call([\"ovs-ofctl\", \"add-flows\", self.BR_NAME, \u0027-\u0027],"},{"line_number":292,"context_line":"                      process_input\u003d\"hard_timeout\u003d0,idle_timeout\u003d0,priority\u003d4,\""},{"line_number":293,"context_line":"                                    \"nw_src\u003d%s,arp,actions\u003ddrop\" % cidr,"},{"line_number":294,"context_line":"                      root_helper\u003dself.root_helper),"},{"line_number":295,"context_line":"        ]"},{"line_number":296,"context_line":"        self.execute.assert_has_calls(expected_calls)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1ae5cdf2_6c3d43dd","line":293,"in_reply_to":"1ae5cdf2_0062c815","updated":"2014-06-25 12:49:20.000000000","message":"Yes, previously add_flow is done by:\n\n ovs-ofctl add-flow BR_NAME %flow%\n\nnow add-flow is done by something like:\n\n echo %flow% | ovs-ofctl add-flow BR_NAME -\n\nThe new implementation allows to pass multiple flows:\n\n echo \u0027\\n\u0027.join(%flows%) | ovs-ofctl add-flow BR_NAME -","commit_id":"0fcffbd8e71bd1e3ec9a9a4799e36d6cb22b3ba3"}]}
