)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"95511e8b06ef8c27681ef1c228ea8c3dfc4c8dcd","unresolved":false,"context_lines":[{"line_number":18,"context_line":"hybrid_iptables driver to  4097 - 65535. While OVS based"},{"line_number":19,"context_line":"port security driver can use zones based on local vlan range 1 - 4096"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Change-Id: I4d51637ed1de8fe85b4982a03410d4a3f637ea3f"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"5f93b717_fe6318db","line":21,"updated":"2018-01-26 16:44:36.000000000","message":"Please file a bug so it can be referenced here.","commit_id":"cd6e21f9e12f63bf23d40bf7b0ad89c7278cbf3a"}],"neutron/agent/linux/ip_conntrack.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"95511e8b06ef8c27681ef1c228ea8c3dfc4c8dcd","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":"CONTRACK_MGRS \u003d {}"},{"line_number":26,"context_line":"MAX_CONNTRACK_ZONES \u003d 65535"},{"line_number":27,"context_line":"ZONE_START \u003d 4097"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"@lockutils.synchronized(\u0027conntrack\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f93b717_6a14234f","line":27,"updated":"2018-01-26 16:44:36.000000000","message":"How are you coordinating the range with Fwaas?  Isn\u0027t it using this file as well?  It seems we have to define ranges for each, which should live in neutron-lib constants file - that can be done in a follow-on.","commit_id":"cd6e21f9e12f63bf23d40bf7b0ad89c7278cbf3a"},{"author":{"_account_id":5109,"name":"chandanc","email":"chandan.dutta.chowdhury@gmail.com","username":"chandanc"},"change_message_id":"4451ac9d7b1c58a27fb79a95d204366b9beb2503","unresolved":false,"context_lines":[{"line_number":24,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":25,"context_line":"CONTRACK_MGRS \u003d {}"},{"line_number":26,"context_line":"MAX_CONNTRACK_ZONES \u003d 65535"},{"line_number":27,"context_line":"ZONE_START \u003d 4097"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"@lockutils.synchronized(\u0027conntrack\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f93b717_1e4b64b0","line":27,"in_reply_to":"5f93b717_6a14234f","updated":"2018-01-26 17:11:53.000000000","message":"As FWaaS is using local vlans to assign the conntrack zone, it is limited to the vlan range of 4k zones. I agree we can follow up with moving to neutron-lib constants","commit_id":"cd6e21f9e12f63bf23d40bf7b0ad89c7278cbf3a"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d8aa4ed247071b1b0386e6e5ed59daf0a1c61ea9","unresolved":false,"context_lines":[{"line_number":195,"context_line":"            if last \u003e\u003d ZONE_START:"},{"line_number":196,"context_line":"                return last + 1"},{"line_number":197,"context_line":"            else:"},{"line_number":198,"context_line":"                return ZONE_START"},{"line_number":199,"context_line":"        for index, used in enumerate(zones_in_use):"},{"line_number":200,"context_line":"            if used - index !\u003d ZONE_START:"},{"line_number":201,"context_line":"                # gap found, let\u0027s use it!"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f93b717_1d5d58e8","line":198,"updated":"2018-01-30 20:59:49.000000000","message":"can\u0027t it be something like:\n\n    return max(last+1, ZONE_START)\n\ninstead of this if...else... block","commit_id":"4f1baa7c9ec62a3ecbe2e8c5843a40727a896c87"},{"author":{"_account_id":5109,"name":"chandanc","email":"chandan.dutta.chowdhury@gmail.com","username":"chandanc"},"change_message_id":"06ba8b497b875e51d9c6a4633e22c37b25e97892","unresolved":false,"context_lines":[{"line_number":195,"context_line":"            if last \u003e\u003d ZONE_START:"},{"line_number":196,"context_line":"                return last + 1"},{"line_number":197,"context_line":"            else:"},{"line_number":198,"context_line":"                return ZONE_START"},{"line_number":199,"context_line":"        for index, used in enumerate(zones_in_use):"},{"line_number":200,"context_line":"            if used - index !\u003d ZONE_START:"},{"line_number":201,"context_line":"                # gap found, let\u0027s use it!"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f93b717_b1ed6cf1","line":198,"in_reply_to":"5f93b717_1d5d58e8","updated":"2018-01-31 01:14:14.000000000","message":"Done","commit_id":"4f1baa7c9ec62a3ecbe2e8c5843a40727a896c87"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"c587f4f34d27495450e82ff289c7f9535aff3485","unresolved":false,"context_lines":[{"line_number":195,"context_line":"            if last \u003e\u003d ZONE_START:"},{"line_number":196,"context_line":"                return last + 1"},{"line_number":197,"context_line":"            else:"},{"line_number":198,"context_line":"                return ZONE_START"},{"line_number":199,"context_line":"        for index, used in enumerate(zones_in_use):"},{"line_number":200,"context_line":"            if used - index !\u003d ZONE_START:"},{"line_number":201,"context_line":"                # gap found, let\u0027s use it!"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f93b717_531bd1ce","line":198,"in_reply_to":"5f93b717_1d5d58e8","updated":"2018-01-30 22:47:53.000000000","message":"I also have a question. In the case where we execute L198, shouldn\u0027t we just go and try to find a gap in the L199 loop?","commit_id":"4f1baa7c9ec62a3ecbe2e8c5843a40727a896c87"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5456b09b7e0e70ac7773f82020be17d65df1c42f","unresolved":false,"context_lines":[{"line_number":195,"context_line":"            if last \u003e\u003d ZONE_START:"},{"line_number":196,"context_line":"                return last + 1"},{"line_number":197,"context_line":"            else:"},{"line_number":198,"context_line":"                return ZONE_START"},{"line_number":199,"context_line":"        for index, used in enumerate(zones_in_use):"},{"line_number":200,"context_line":"            if used - index !\u003d ZONE_START:"},{"line_number":201,"context_line":"                # gap found, let\u0027s use it!"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f93b717_1db30a0c","line":198,"in_reply_to":"5f93b717_51ad0899","updated":"2018-01-31 08:58:36.000000000","message":"I agree with chandanc here. IMO it\u0027s fine like it is now.","commit_id":"4f1baa7c9ec62a3ecbe2e8c5843a40727a896c87"},{"author":{"_account_id":5109,"name":"chandanc","email":"chandan.dutta.chowdhury@gmail.com","username":"chandanc"},"change_message_id":"06ba8b497b875e51d9c6a4633e22c37b25e97892","unresolved":false,"context_lines":[{"line_number":195,"context_line":"            if last \u003e\u003d ZONE_START:"},{"line_number":196,"context_line":"                return last + 1"},{"line_number":197,"context_line":"            else:"},{"line_number":198,"context_line":"                return ZONE_START"},{"line_number":199,"context_line":"        for index, used in enumerate(zones_in_use):"},{"line_number":200,"context_line":"            if used - index !\u003d ZONE_START:"},{"line_number":201,"context_line":"                # gap found, let\u0027s use it!"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f93b717_51ad0899","line":198,"in_reply_to":"5f93b717_531bd1ce","updated":"2018-01-31 01:14:14.000000000","message":"I think the idea is, it is cheaper to calculate the next zone by incrementing the last zone, then to loop through the range to find the gap. Also the possibility of exhausting the range on a compute node is low, so looping to find gap might be totally avoided in most cases.","commit_id":"4f1baa7c9ec62a3ecbe2e8c5843a40727a896c87"}],"neutron/tests/unit/agent/linux/test_iptables_firewall.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"95511e8b06ef8c27681ef1c228ea8c3dfc4c8dcd","unresolved":false,"context_lines":[{"line_number":2201,"context_line":"            self.assertEqual(i,"},{"line_number":2202,"context_line":"                   self.firewall.ipconntrack._generate_device_zone(i))"},{"line_number":2203,"context_line":""},{"line_number":2204,"context_line":"        # 4105 and 4106 are taken so next should be 11"},{"line_number":2205,"context_line":"        self.assertEqual(4107,"},{"line_number":2206,"context_line":"                   self.firewall.ipconntrack._generate_device_zone(\u0027p11\u0027))"},{"line_number":2207,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f93b717_2a605b01","line":2204,"range":{"start_line":2204,"start_character":52,"end_line":2204,"end_character":54},"updated":"2018-01-26 16:44:36.000000000","message":"s/4107","commit_id":"cd6e21f9e12f63bf23d40bf7b0ad89c7278cbf3a"},{"author":{"_account_id":5109,"name":"chandanc","email":"chandan.dutta.chowdhury@gmail.com","username":"chandanc"},"change_message_id":"e2d433268773b0df712d9b05e445f96216fb6709","unresolved":false,"context_lines":[{"line_number":2201,"context_line":"            self.assertEqual(i,"},{"line_number":2202,"context_line":"                   self.firewall.ipconntrack._generate_device_zone(i))"},{"line_number":2203,"context_line":""},{"line_number":2204,"context_line":"        # 4105 and 4106 are taken so next should be 11"},{"line_number":2205,"context_line":"        self.assertEqual(4107,"},{"line_number":2206,"context_line":"                   self.firewall.ipconntrack._generate_device_zone(\u0027p11\u0027))"},{"line_number":2207,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"5f93b717_440c72ec","line":2204,"range":{"start_line":2204,"start_character":52,"end_line":2204,"end_character":54},"in_reply_to":"5f93b717_2a605b01","updated":"2018-01-30 15:53:34.000000000","message":"done","commit_id":"cd6e21f9e12f63bf23d40bf7b0ad89c7278cbf3a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"95511e8b06ef8c27681ef1c228ea8c3dfc4c8dcd","unresolved":false,"context_lines":[{"line_number":2216,"context_line":"        with testtools.ExpectedException(n_exc.CTZoneExhaustedError):"},{"line_number":2217,"context_line":"            self.firewall.ipconntrack._find_open_zone()"},{"line_number":2218,"context_line":""},{"line_number":2219,"context_line":"        # with it full, try again, this should trigger a cleanup and return 1"},{"line_number":2220,"context_line":"        self.assertEqual(4097,"},{"line_number":2221,"context_line":"                   self.firewall.ipconntrack._generate_device_zone(\u0027p12\u0027))"},{"line_number":2222,"context_line":"        self.assertEqual({\u0027p12\u0027: 4097},"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f93b717_ea59135a","line":2219,"range":{"start_line":2219,"start_character":76,"end_line":2219,"end_character":77},"updated":"2018-01-26 16:44:36.000000000","message":"s/4097\n\nActually, since you include the ip_conntrack module you should use the constant here instead of the number directly.","commit_id":"cd6e21f9e12f63bf23d40bf7b0ad89c7278cbf3a"},{"author":{"_account_id":5109,"name":"chandanc","email":"chandan.dutta.chowdhury@gmail.com","username":"chandanc"},"change_message_id":"e2d433268773b0df712d9b05e445f96216fb6709","unresolved":false,"context_lines":[{"line_number":2216,"context_line":"        with testtools.ExpectedException(n_exc.CTZoneExhaustedError):"},{"line_number":2217,"context_line":"            self.firewall.ipconntrack._find_open_zone()"},{"line_number":2218,"context_line":""},{"line_number":2219,"context_line":"        # with it full, try again, this should trigger a cleanup and return 1"},{"line_number":2220,"context_line":"        self.assertEqual(4097,"},{"line_number":2221,"context_line":"                   self.firewall.ipconntrack._generate_device_zone(\u0027p12\u0027))"},{"line_number":2222,"context_line":"        self.assertEqual({\u0027p12\u0027: 4097},"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f93b717_0412ea09","line":2219,"range":{"start_line":2219,"start_character":76,"end_line":2219,"end_character":77},"in_reply_to":"5f93b717_ea59135a","updated":"2018-01-30 15:53:34.000000000","message":"done","commit_id":"cd6e21f9e12f63bf23d40bf7b0ad89c7278cbf3a"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"d8aa4ed247071b1b0386e6e5ed59daf0a1c61ea9","unresolved":false,"context_lines":[{"line_number":61,"context_line":"-A neutron-openvswi-PREROUTING -m physdev --physdev-in qvb61634509-31 -j CT --zone 4098"},{"line_number":62,"context_line":"-A neutron-openvswi-PREROUTING -m physdev --physdev-in tap61634509-31 -j CT --zone 4098"},{"line_number":63,"context_line":"-A neutron-openvswi-PREROUTING -m physdev --physdev-in qvb8f46cf18-12 -j CT --zone 4104"},{"line_number":64,"context_line":"-A neutron-openvswi-PREROUTING -m physdev --physdev-in tap8f46cf18-12 -j CT --zone 4104"},{"line_number":65,"context_line":"COMMIT"},{"line_number":66,"context_line":"# Completed on Fri Jul 31 16:13:28 2015"},{"line_number":67,"context_line":"\"\"\"  # noqa"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f93b717_bd230456","line":64,"range":{"start_line":64,"start_character":83,"end_line":64,"end_character":87},"updated":"2018-01-30 20:59:49.000000000","message":"here old value \"9\" is replaced with \"4104\" but in L100 same value \"9\" is replaced with \"4105\". Is this difference intentional?","commit_id":"4f1baa7c9ec62a3ecbe2e8c5843a40727a896c87"},{"author":{"_account_id":5109,"name":"chandanc","email":"chandan.dutta.chowdhury@gmail.com","username":"chandanc"},"change_message_id":"06ba8b497b875e51d9c6a4633e22c37b25e97892","unresolved":false,"context_lines":[{"line_number":61,"context_line":"-A neutron-openvswi-PREROUTING -m physdev --physdev-in qvb61634509-31 -j CT --zone 4098"},{"line_number":62,"context_line":"-A neutron-openvswi-PREROUTING -m physdev --physdev-in tap61634509-31 -j CT --zone 4098"},{"line_number":63,"context_line":"-A neutron-openvswi-PREROUTING -m physdev --physdev-in qvb8f46cf18-12 -j CT --zone 4104"},{"line_number":64,"context_line":"-A neutron-openvswi-PREROUTING -m physdev --physdev-in tap8f46cf18-12 -j CT --zone 4104"},{"line_number":65,"context_line":"COMMIT"},{"line_number":66,"context_line":"# Completed on Fri Jul 31 16:13:28 2015"},{"line_number":67,"context_line":"\"\"\"  # noqa"}],"source_content_type":"text/x-python","patch_set":3,"id":"5f93b717_31815cfc","line":64,"range":{"start_line":64,"start_character":83,"end_line":64,"end_character":87},"in_reply_to":"5f93b717_bd230456","updated":"2018-01-31 01:14:14.000000000","message":"Thanks, I missed it. Fixed now","commit_id":"4f1baa7c9ec62a3ecbe2e8c5843a40727a896c87"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"4333c520212cbb230a449fb5fcd4a28049d6150b","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        self.firewall.ipconntrack \u003d ip_conntrack.IpConntrackManager("},{"line_number":106,"context_line":"              get_rules_for_table_func, filtered_ports\u003dfiltered_ports,"},{"line_number":107,"context_line":"              unfiltered_ports\u003ddict())"},{"line_number":108,"context_line":"        self.firewall.ipconntrack._device_zone_map \u003d self._dev_zone_map"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _fake_port(self):"},{"line_number":111,"context_line":"        return {\u0027device\u0027: \u0027tapfake_dev\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_57b898e3","side":"PARENT","line":108,"updated":"2018-01-31 03:02:57.000000000","message":"Think the tests will fail removing this.","commit_id":"7e3d6a18fb928bcd303a44c1736d0d6ca9c7f0ab"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5456b09b7e0e70ac7773f82020be17d65df1c42f","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        self.firewall.ipconntrack \u003d ip_conntrack.IpConntrackManager("},{"line_number":106,"context_line":"              get_rules_for_table_func, filtered_ports\u003dfiltered_ports,"},{"line_number":107,"context_line":"              unfiltered_ports\u003ddict())"},{"line_number":108,"context_line":"        self.firewall.ipconntrack._device_zone_map \u003d self._dev_zone_map"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _fake_port(self):"},{"line_number":111,"context_line":"        return {\u0027device\u0027: \u0027tapfake_dev\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_7da7aebe","side":"PARENT","line":108,"in_reply_to":"5f93b717_1a5eb543","updated":"2018-01-31 08:58:36.000000000","message":"Tests passed without it but why You removed it?","commit_id":"7e3d6a18fb928bcd303a44c1736d0d6ca9c7f0ab"},{"author":{"_account_id":5109,"name":"chandanc","email":"chandan.dutta.chowdhury@gmail.com","username":"chandanc"},"change_message_id":"131cd3401e5f9fd06ae3cc4d4a5ccbbc4d227bef","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        self.firewall.ipconntrack \u003d ip_conntrack.IpConntrackManager("},{"line_number":106,"context_line":"              get_rules_for_table_func, filtered_ports\u003dfiltered_ports,"},{"line_number":107,"context_line":"              unfiltered_ports\u003ddict())"},{"line_number":108,"context_line":"        self.firewall.ipconntrack._device_zone_map \u003d self._dev_zone_map"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _fake_port(self):"},{"line_number":111,"context_line":"        return {\u0027device\u0027: \u0027tapfake_dev\u0027,"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_1a5eb543","side":"PARENT","line":108,"in_reply_to":"5f93b717_57b898e3","updated":"2018-01-31 04:23:28.000000000","message":"I am fixing my own karma :)\nI tested it locally.","commit_id":"7e3d6a18fb928bcd303a44c1736d0d6ca9c7f0ab"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"ed8515d5eb7c838e17e89b357f5383ca218e0fac","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        self.firewall.ipconntrack \u003d ip_conntrack.IpConntrackManager("},{"line_number":106,"context_line":"              get_rules_for_table_func, filtered_ports\u003dfiltered_ports,"},{"line_number":107,"context_line":"              unfiltered_ports\u003ddict())"},{"line_number":108,"context_line":"        self.firewall.ipconntrack._device_zone_map \u003d self._dev_zone_map"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _fake_port(self):"},{"line_number":111,"context_line":"        return {\u0027device\u0027: \u0027tapfake_dev\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f93b717_3eca6e4d","side":"PARENT","line":108,"updated":"2018-01-31 18:49:11.000000000","message":"I confirmed this is unnecessary because get_rules_for_table_func at L.102 will populate _device_zone_map.","commit_id":"7e3d6a18fb928bcd303a44c1736d0d6ca9c7f0ab"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"ed8515d5eb7c838e17e89b357f5383ca218e0fac","unresolved":false,"context_lines":[{"line_number":2191,"context_line":"        # initial data has 4097, 4098, and 4105 in use."},{"line_number":2192,"context_line":"        # we fill from top up first."},{"line_number":2193,"context_line":"        self.assertEqual(4106,"},{"line_number":2194,"context_line":"                   self.firewall.ipconntrack._generate_device_zone(\u0027test\u0027))"},{"line_number":2195,"context_line":""},{"line_number":2196,"context_line":"        # once it\u0027s maxed out, it scans for gaps"},{"line_number":2197,"context_line":"        self.firewall.ipconntrack._device_zone_map[\u0027someport\u0027] \u003d ("}],"source_content_type":"text/x-python","patch_set":5,"id":"5f93b717_fed406eb","line":2194,"updated":"2018-01-31 18:49:11.000000000","message":"(no action needed) the indent level of wrapped lines in assertEqual in this module are different from other modules, but it looks too much to be touched in this patch.","commit_id":"9a620f6ea51f5696310283869e68f6a1d49164d1"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"ed8515d5eb7c838e17e89b357f5383ca218e0fac","unresolved":false,"context_lines":[{"line_number":2211,"context_line":""},{"line_number":2212,"context_line":"        # fill it up and then make sure an extra throws an error"},{"line_number":2213,"context_line":"        for i in range(ip_conntrack.ZONE_START,"},{"line_number":2214,"context_line":"            ip_conntrack.MAX_CONNTRACK_ZONES):"},{"line_number":2215,"context_line":"            self.firewall.ipconntrack._device_zone_map[\u0027dev-%s\u0027 % i] \u003d i"},{"line_number":2216,"context_line":"        with testtools.ExpectedException(n_exc.CTZoneExhaustedError):"},{"line_number":2217,"context_line":"            self.firewall.ipconntrack._find_open_zone()"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f93b717_3eceee81","line":2214,"updated":"2018-01-31 18:49:11.000000000","message":"nit: the indent level looks tricky. I would suggest:\n\n for i in range(ip_conntrack.ZONE_START,\n                ip_conntrack.MAX_CONNTRACK_ZONES):","commit_id":"9a620f6ea51f5696310283869e68f6a1d49164d1"}]}
