)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"e1028ab22dc13eebe129ba6d17b2139dd0701dce","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"batch updates to firewall ports"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"One of two patches that fixes bug #1194438."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"In the iptables firewall driver, each port method (update_port_filter,"},{"line_number":12,"context_line":"prepare_port_filter, remove_port_filter) makes O(N) calls, where"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAPn%2F%2FbvU%3D","line":9,"updated":"2013-07-02 01:53:03.000000000","message":"Is it worth referencing the other review if ready?","commit_id":"9dff266821411529febd4d2b3e8741b8569d4b6f"},{"author":{"_account_id":7500,"name":"Peter Feiner","email":"peter@gridcentric.ca","username":"peter"},"change_message_id":"d2448b7b744372330bd96d82dc3586e3748c1b3c","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"batch updates to firewall ports"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"One of two patches that fixes bug #1194438."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"In the iptables firewall driver, each port method (update_port_filter,"},{"line_number":12,"context_line":"prepare_port_filter, remove_port_filter) makes O(N) calls, where"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"AAAAPn%2F%2FTW0%3D","line":9,"in_reply_to":"AAAAPn%2F%2FbvU%3D","updated":"2013-07-04 14:21:51.000000000","message":"The other review is https://review.openstack.org/#/c/35512/. The other commit message mentions the bug #, so I don\u0027t think adding the other commit\u0027s id is necessary for cross referencing.","commit_id":"9dff266821411529febd4d2b3e8741b8569d4b6f"}],"neutron/agent/firewall.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"872c3392a338f0c3bac1be49754137eeee7d0096","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    __metaclass__ \u003d abc.ABCMeta"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"    def prepare_port_filter(self, ports):"},{"line_number":58,"context_line":"        \"\"\"Prepare filters for the ports."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"        This method should be called before the ports are created."}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2F0Ls%3D","line":57,"updated":"2013-07-22 20:23:40.000000000","message":"I\u0027m hoping that there is a way to accomplish this optimization without changing the interface here.  Could result in less code.","commit_id":"0d403c466e2fcc69fbb4d1d8b1938c85399543c6"}],"neutron/agent/linux/iptables_firewall.py":[{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"872c3392a338f0c3bac1be49754137eeee7d0096","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def prepare_port_filter(self, port):"},{"line_number":56,"context_line":"        LOG.debug(_(\"Preparing device (%s) filter\"), port[\u0027device\u0027])"},{"line_number":57,"context_line":"        self._remove_chains()"},{"line_number":58,"context_line":"        self.filtered_ports[port[\u0027device\u0027]] \u003d port"},{"line_number":59,"context_line":"        # each security group has it own chains"},{"line_number":60,"context_line":"        self._setup_chains()"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2F0LM%3D","side":"PARENT","line":57,"updated":"2013-07-22 20:23:40.000000000","message":"It looks like you\u0027re trying to avoid the _remove_chains, _setup_chains calls.  Do I have that right?\n\nCan we possibly extend the \"defer_apply\" mechanism that is already present in this class to batch this up instead of changing the interface to this class?  The advantages of such an approach include:\n\n1.  The changes would be confined to this class\u0027s implementation only instead of spread across three files.  This results in a simpler change that is easier to review.\n2.  It is likely to change fewer tests.","commit_id":"5294b8a90c7a6a9c1d149b03c6fcb2dc51f04241"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"872c3392a338f0c3bac1be49754137eeee7d0096","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        self.filtered_ports[port[\u0027device\u0027]] \u003d port"},{"line_number":59,"context_line":"        # each security group has it own chains"},{"line_number":60,"context_line":"        self._setup_chains()"},{"line_number":61,"context_line":"        self.iptables.apply()"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def update_port_filter(self, port):"},{"line_number":64,"context_line":"        LOG.debug(_(\"Updating device (%s) filter\"), port[\u0027device\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAQn%2F%2F0Lo%3D","side":"PARENT","line":61,"updated":"2013-07-22 20:23:40.000000000","message":"This called to apply is already deferred since this method is called under:\n\nwith self.firewall.defer_apply():","commit_id":"5294b8a90c7a6a9c1d149b03c6fcb2dc51f04241"}],"neutron/tests/unit/test_iptables_firewall.py":[{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"afd742ca78b1c3f64b13c482d8636fd05e9fc5a3","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from copy import deepcopy"},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":"from mock import call"},{"line_number":21,"context_line":"from oslo.config import cfg"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FjqA%3D","line":18,"updated":"2013-07-29 09:03:02.000000000","message":"Use module-level imports:\nimport copy\nand then:\ncopy.deepcopy()","commit_id":"a3dcf64f9d8ef4cb4c5b57b4e3a5816c801d103a"},{"author":{"_account_id":7500,"name":"Peter Feiner","email":"peter@gridcentric.ca","username":"peter"},"change_message_id":"e16ae69a0822e842aaef18246b0b62fdb236f1bb","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from copy import deepcopy"},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":"from mock import call"},{"line_number":21,"context_line":"from oslo.config import cfg"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FjEg%3D","line":18,"in_reply_to":"AAAAQn%2F%2FjqA%3D","updated":"2013-07-29 13:38:51.000000000","message":"Done","commit_id":"a3dcf64f9d8ef4cb4c5b57b4e3a5816c801d103a"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"afd742ca78b1c3f64b13c482d8636fd05e9fc5a3","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        self.firewall \u003d IptablesFirewallDriver()"},{"line_number":56,"context_line":"        self.firewall.iptables \u003d self.iptables_inst"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def _fake_port(self, i\u003dNone):"},{"line_number":59,"context_line":"        return {\u0027device\u0027: \u0027tapfake_dev\u0027,"},{"line_number":60,"context_line":"                \u0027mac_address\u0027: \u0027ff:ff:ff:ff\u0027,"},{"line_number":61,"context_line":"                \u0027fixed_ips\u0027: [FAKE_IP[\u0027IPv4\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2Fjpw%3D","line":58,"updated":"2013-07-29 09:03:02.000000000","message":"unused. remove?","commit_id":"a3dcf64f9d8ef4cb4c5b57b4e3a5816c801d103a"},{"author":{"_account_id":7500,"name":"Peter Feiner","email":"peter@gridcentric.ca","username":"peter"},"change_message_id":"e16ae69a0822e842aaef18246b0b62fdb236f1bb","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        self.firewall \u003d IptablesFirewallDriver()"},{"line_number":56,"context_line":"        self.firewall.iptables \u003d self.iptables_inst"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def _fake_port(self, i\u003dNone):"},{"line_number":59,"context_line":"        return {\u0027device\u0027: \u0027tapfake_dev\u0027,"},{"line_number":60,"context_line":"                \u0027mac_address\u0027: \u0027ff:ff:ff:ff\u0027,"},{"line_number":61,"context_line":"                \u0027fixed_ips\u0027: [FAKE_IP[\u0027IPv4\u0027],"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAQn%2F%2FjEc%3D","line":58,"in_reply_to":"AAAAQn%2F%2Fjpw%3D","updated":"2013-07-29 13:38:51.000000000","message":"Done","commit_id":"a3dcf64f9d8ef4cb4c5b57b4e3a5816c801d103a"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"f0d2c166e76791a322d01b2e764f3e61c42ef06f","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import copy"},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":"from mock import call"},{"line_number":21,"context_line":"from oslo.config import cfg"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQn%2F%2Fi6Y%3D","line":18,"updated":"2013-07-29 14:19:14.000000000","message":"nit: since python stdlib - need to be separated (blank line after)","commit_id":"75c309bb61ae0e97b8f4490e6a831e8f1f3432e9"},{"author":{"_account_id":7500,"name":"Peter Feiner","email":"peter@gridcentric.ca","username":"peter"},"change_message_id":"ef1074eeffef295c6749eff5cbaf351a568f666e","unresolved":false,"context_lines":[{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import copy"},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":"from mock import call"},{"line_number":21,"context_line":"from oslo.config import cfg"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAQn%2F%2Fi5Q%3D","line":18,"in_reply_to":"AAAAQn%2F%2Fi6Y%3D","updated":"2013-07-29 14:21:52.000000000","message":"Done","commit_id":"75c309bb61ae0e97b8f4490e6a831e8f1f3432e9"}],"quantum/tests/unit/test_iptables_firewall.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"e1028ab22dc13eebe129ba6d17b2139dd0701dce","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_prepare_port_filter_with_no_sg(self):"},{"line_number":64,"context_line":"        port \u003d self._fake_port()"},{"line_number":65,"context_line":"        self.firewall.prepare_port_filter([port])"},{"line_number":66,"context_line":"        calls \u003d [call.add_chain(\u0027sg-fallback\u0027),"},{"line_number":67,"context_line":"                 call.add_rule(\u0027sg-fallback\u0027, \u0027-j DROP\u0027),"},{"line_number":68,"context_line":"                 call.ensure_remove_chain(\u0027sg-chain\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2Fbvg%3D","line":65,"updated":"2013-07-02 01:53:03.000000000","message":"how about adding tests for lists of ports of len\u003e1?","commit_id":"9dff266821411529febd4d2b3e8741b8569d4b6f"},{"author":{"_account_id":7500,"name":"Peter Feiner","email":"peter@gridcentric.ca","username":"peter"},"change_message_id":"d2448b7b744372330bd96d82dc3586e3748c1b3c","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    def test_prepare_port_filter_with_no_sg(self):"},{"line_number":64,"context_line":"        port \u003d self._fake_port()"},{"line_number":65,"context_line":"        self.firewall.prepare_port_filter([port])"},{"line_number":66,"context_line":"        calls \u003d [call.add_chain(\u0027sg-fallback\u0027),"},{"line_number":67,"context_line":"                 call.add_rule(\u0027sg-fallback\u0027, \u0027-j DROP\u0027),"},{"line_number":68,"context_line":"                 call.ensure_remove_chain(\u0027sg-chain\u0027),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2FTWw%3D","line":65,"in_reply_to":"AAAAPn%2F%2Fbvg%3D","updated":"2013-07-04 14:21:51.000000000","message":"good point. i\u0027ll add some tests.","commit_id":"9dff266821411529febd4d2b3e8741b8569d4b6f"}],"quantum/tests/unit/test_security_groups_rpc.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"e1028ab22dc13eebe129ba6d17b2139dd0701dce","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        self.agent.remove_devices_filter([\u0027fake_device\u0027])"},{"line_number":454,"context_line":"        # ignore device which is not filtered"},{"line_number":455,"context_line":"        self.firewall.assert_has_calls(["},{"line_number":456,"context_line":"            call.prepare_port_filter([self.fake_device]),"},{"line_number":457,"context_line":"            call.remove_port_filter([self.fake_device]),"},{"line_number":458,"context_line":"        ])"},{"line_number":459,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2Fbvc%3D","line":456,"updated":"2013-07-02 01:53:03.000000000","message":"similar consideration as done previously.","commit_id":"9dff266821411529febd4d2b3e8741b8569d4b6f"},{"author":{"_account_id":7500,"name":"Peter Feiner","email":"peter@gridcentric.ca","username":"peter"},"change_message_id":"d2448b7b744372330bd96d82dc3586e3748c1b3c","unresolved":false,"context_lines":[{"line_number":453,"context_line":"        self.agent.remove_devices_filter([\u0027fake_device\u0027])"},{"line_number":454,"context_line":"        # ignore device which is not filtered"},{"line_number":455,"context_line":"        self.firewall.assert_has_calls(["},{"line_number":456,"context_line":"            call.prepare_port_filter([self.fake_device]),"},{"line_number":457,"context_line":"            call.remove_port_filter([self.fake_device]),"},{"line_number":458,"context_line":"        ])"},{"line_number":459,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAPn%2F%2FTWs%3D","line":456,"in_reply_to":"AAAAPn%2F%2Fbvc%3D","updated":"2013-07-04 14:21:51.000000000","message":"will add tests","commit_id":"9dff266821411529febd4d2b3e8741b8569d4b6f"}]}
