)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"bad38173b3d8fb62e92c093d6cdc789293bb9cd2","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Support for stateless security groups"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"NeutronLibImpact"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Partial-Bug: #1753466"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"3fa7e38b_2bba3de0","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":16},"updated":"2020-01-07 19:55:11.000000000","message":"I don\u0027t think this is needed since the changes to neutron-lib are already merged.","commit_id":"76c8510b305df1b74d0709d5e1814e800acce351"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"80d7064fad064e8fb0759e5575ffa205c0667f11","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Support for stateless security groups"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"NeutronLibImpact"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Partial-Bug: #1753466"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"3fa7e38b_d201d13a","line":9,"range":{"start_line":9,"start_character":0,"end_line":9,"end_character":16},"in_reply_to":"3fa7e38b_2bba3de0","updated":"2020-01-08 10:32:24.000000000","message":"Done","commit_id":"76c8510b305df1b74d0709d5e1814e800acce351"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"bad38173b3d8fb62e92c093d6cdc789293bb9cd2","unresolved":false,"context_lines":[{"line_number":11,"context_line":"Partial-Bug: #1753466"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Depends-On: https://review.opendev.org/696070/"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: Iae39a89b762786e4f05aa61aa0db634941806d41"},{"line_number":16,"context_line":"Signed-off-by: Aditya Reddy Nagaram \u003caditya_reddy.nagaram@nuagenetworks.net\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"3fa7e38b_0bdae148","line":14,"updated":"2020-01-07 19:55:11.000000000","message":"Since this is now being tracked in https://blueprints.launchpad.net/neutron/+spec/stateless-security-groups, we can now add:\n\nBlueprint: stateless-security-groups","commit_id":"76c8510b305df1b74d0709d5e1814e800acce351"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"80d7064fad064e8fb0759e5575ffa205c0667f11","unresolved":false,"context_lines":[{"line_number":11,"context_line":"Partial-Bug: #1753466"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Depends-On: https://review.opendev.org/696070/"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: Iae39a89b762786e4f05aa61aa0db634941806d41"},{"line_number":16,"context_line":"Signed-off-by: Aditya Reddy Nagaram \u003caditya_reddy.nagaram@nuagenetworks.net\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":26,"id":"3fa7e38b_f2fc0d40","line":14,"in_reply_to":"3fa7e38b_0bdae148","updated":"2020-01-08 10:32:24.000000000","message":"Done","commit_id":"76c8510b305df1b74d0709d5e1814e800acce351"}],"neutron/agent/linux/iptables_firewall.py":[{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"561e028436d9e88073662012d167fd34a9aa0fd4","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        return rules"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    def _are_sg_rules_stateful(self, security_group_rules):"},{"line_number":438,"context_line":"        for rule in security_group_rules:"},{"line_number":439,"context_line":"            if rule.get(\u0027stateful\u0027, True):"},{"line_number":440,"context_line":"                return True"},{"line_number":441,"context_line":"            else:"},{"line_number":442,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_a0dbd87a","line":439,"range":{"start_line":438,"start_character":0,"end_line":439,"end_character":42},"updated":"2019-11-18 16:51:39.000000000","message":"Everywhere else the stateful attribute is ascribed to the security_group, not the security group rule.  How does it get attached to the sg rule for this?","commit_id":"9e8a6624980beedd472de4a30809d27a4b167191"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"f940545db87065b500941549d051a2b5022f2a84","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        return rules"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    def _are_sg_rules_stateful(self, security_group_rules):"},{"line_number":438,"context_line":"        for rule in security_group_rules:"},{"line_number":439,"context_line":"            if rule.get(\u0027stateful\u0027, True):"},{"line_number":440,"context_line":"                return True"},{"line_number":441,"context_line":"            else:"},{"line_number":442,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_5b08cb25","line":439,"range":{"start_line":438,"start_character":0,"end_line":439,"end_character":42},"in_reply_to":"3fa7e38b_78290df0","updated":"2019-11-19 09:19:52.000000000","message":"Also there is more description in the link below about how the stateless attribute is interpreted in the security group:\n\nhttps://bugs.launchpad.net/neutron/+bug/1753466\n\nIf your question on the stateful attribute is being tagged to security group rule its done in \"securitygroups_rpc_base.py\"\n\nhttps://review.opendev.org/#/c/572767/14/neutron/db/securitygroups_rpc_base.py\n\nLet me know if you have any further questions regarding this.","commit_id":"9e8a6624980beedd472de4a30809d27a4b167191"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"8381c595f940c0f638b798fc6ad6071b7bf2de68","unresolved":false,"context_lines":[{"line_number":435,"context_line":"        return rules"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    def _are_sg_rules_stateful(self, security_group_rules):"},{"line_number":438,"context_line":"        for rule in security_group_rules:"},{"line_number":439,"context_line":"            if rule.get(\u0027stateful\u0027, True):"},{"line_number":440,"context_line":"                return True"},{"line_number":441,"context_line":"            else:"},{"line_number":442,"context_line":"                return False"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_78290df0","line":439,"range":{"start_line":438,"start_character":0,"end_line":439,"end_character":42},"in_reply_to":"3fa7e38b_a0dbd87a","updated":"2019-11-19 09:10:19.000000000","message":"If the security group has the attribute \"stateful\" set to False, then all the security rules in that security group are implemented as stateless.","commit_id":"9e8a6624980beedd472de4a30809d27a4b167191"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b8b135e3a8fee3ac4c3ee5e24e8ddc0cda3d416d","unresolved":false,"context_lines":[{"line_number":408,"context_line":"                        port_sg_rules.append(rule)"},{"line_number":409,"context_line":"                        break"},{"line_number":410,"context_line":"                    else:"},{"line_number":411,"context_line":"                        port_sg_rules.extend("},{"line_number":412,"context_line":"                            self._expand_sg_rule_with_remote_ips("},{"line_number":413,"context_line":"                                rule, port, constants.INGRESS_DIRECTION))"},{"line_number":414,"context_line":"                        if port_sg_rules:"},{"line_number":415,"context_line":"                            break"},{"line_number":416,"context_line":"                        else:"},{"line_number":417,"context_line":"                            port_sg_rules.extend("},{"line_number":418,"context_line":"                                self._expand_sg_rule_with_remote_ips("},{"line_number":419,"context_line":"                                    rule, port, constants.EGRESS_DIRECTION))"},{"line_number":420,"context_line":"                            if port_sg_rules:"},{"line_number":421,"context_line":"                                break"},{"line_number":422,"context_line":"        if self._are_sg_rules_stateful(port_sg_rules):"},{"line_number":423,"context_line":"            comment \u003d \u0027Set zone for %s\u0027 % port[\u0027device\u0027][4:]"},{"line_number":424,"context_line":"            conntrack \u003d \u0027--zone %s\u0027 % self.ipconntrack.get_device_zone(port)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_b9fde30a","line":421,"range":{"start_line":411,"start_character":24,"end_line":421,"end_character":37},"updated":"2020-01-13 10:00:11.000000000","message":"I\u0027m not sure if I understand correctly this. Why You stop adding rules for port if You will find any INGRESS rule? Why You don\u0027t try to add EGRESS rules too in such case?","commit_id":"1bd9daa0cba9b1513fcf608d7103b07d2d21540f"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"fab9e35173af4cc214eee03c099edd1cb42c1db7","unresolved":false,"context_lines":[{"line_number":408,"context_line":"                        port_sg_rules.append(rule)"},{"line_number":409,"context_line":"                        break"},{"line_number":410,"context_line":"                    else:"},{"line_number":411,"context_line":"                        port_sg_rules.extend("},{"line_number":412,"context_line":"                            self._expand_sg_rule_with_remote_ips("},{"line_number":413,"context_line":"                                rule, port, constants.INGRESS_DIRECTION))"},{"line_number":414,"context_line":"                        if port_sg_rules:"},{"line_number":415,"context_line":"                            break"},{"line_number":416,"context_line":"                        else:"},{"line_number":417,"context_line":"                            port_sg_rules.extend("},{"line_number":418,"context_line":"                                self._expand_sg_rule_with_remote_ips("},{"line_number":419,"context_line":"                                    rule, port, constants.EGRESS_DIRECTION))"},{"line_number":420,"context_line":"                            if port_sg_rules:"},{"line_number":421,"context_line":"                                break"},{"line_number":422,"context_line":"        if self._are_sg_rules_stateful(port_sg_rules):"},{"line_number":423,"context_line":"            comment \u003d \u0027Set zone for %s\u0027 % port[\u0027device\u0027][4:]"},{"line_number":424,"context_line":"            conntrack \u003d \u0027--zone %s\u0027 % self.ipconntrack.get_device_zone(port)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_6eb560f0","line":421,"range":{"start_line":411,"start_character":24,"end_line":421,"end_character":37},"in_reply_to":"3fa7e38b_b9fde30a","updated":"2020-01-13 11:13:52.000000000","message":"It would not make any difference if we add INGRESS or EGRESS, as this list of rules would just be used to determine if we were to add stateful rules or not.","commit_id":"1bd9daa0cba9b1513fcf608d7103b07d2d21540f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"784dd31a0c56a1420e5f88b5f3d43739e8224fd6","unresolved":false,"context_lines":[{"line_number":434,"context_line":"            rules.append(rule)"},{"line_number":435,"context_line":"        return rules"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    def _are_sg_rules_stateful(self, security_group_rules):"},{"line_number":438,"context_line":"        for rule in security_group_rules:"},{"line_number":439,"context_line":"            if rule.get(\u0027stateful\u0027, True):"},{"line_number":440,"context_line":"                return True"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_aeecb8bc","line":437,"updated":"2020-01-13 13:23:42.000000000","message":"If I\u0027m not wrong, a SG can have only stateful or stateless rules. In this case, this is shorter:\n\n\n  for rule in security_group_rules:\n    return rule.get(\u0027stateful\u0027, True)\n  return True","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"4aa8cd4034dfd26d65ac9cf94bcaba11d6dd542b","unresolved":false,"context_lines":[{"line_number":434,"context_line":"            rules.append(rule)"},{"line_number":435,"context_line":"        return rules"},{"line_number":436,"context_line":""},{"line_number":437,"context_line":"    def _are_sg_rules_stateful(self, security_group_rules):"},{"line_number":438,"context_line":"        for rule in security_group_rules:"},{"line_number":439,"context_line":"            if rule.get(\u0027stateful\u0027, True):"},{"line_number":440,"context_line":"                return True"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_e4be4f00","line":437,"in_reply_to":"3fa7e38b_aeecb8bc","updated":"2020-01-13 16:03:51.000000000","message":"Done","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"853759331329178e54749e4be7f5ce6b4bb0f30b","unresolved":false,"context_lines":[{"line_number":396,"context_line":"        # match by interface for bridge input"},{"line_number":397,"context_line":"        match_interface \u003d \u0027-i %s\u0027"},{"line_number":398,"context_line":"        match_physdev \u003d \u0027-m physdev --physdev-in %s\u0027"},{"line_number":399,"context_line":"        # comment to prevent duplicate warnings for different devices using"},{"line_number":400,"context_line":"        # same bridge. truncate start to remove prefixes"},{"line_number":401,"context_line":"        port_sg_rules \u003d []"},{"line_number":402,"context_line":"        if not any(port.get(\u0027device_owner\u0027, \u0027\u0027).startswith(prefix)"},{"line_number":403,"context_line":"                   for prefix in constants.DEVICE_OWNER_PREFIXES):"}],"source_content_type":"text/x-python","patch_set":36,"id":"3fa7e38b_dbd93455","line":400,"range":{"start_line":399,"start_character":0,"end_line":400,"end_character":56},"updated":"2020-01-21 15:44:04.000000000","message":"nit: this makes more sense in line 422 or 423","commit_id":"3e92d29b50e25332c8977ff6257ad274d11a3e86"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"4d2a38d4d6103dd3da17ae0db0f3e8706cf39a93","unresolved":false,"context_lines":[{"line_number":396,"context_line":"        # match by interface for bridge input"},{"line_number":397,"context_line":"        match_interface \u003d \u0027-i %s\u0027"},{"line_number":398,"context_line":"        match_physdev \u003d \u0027-m physdev --physdev-in %s\u0027"},{"line_number":399,"context_line":"        # comment to prevent duplicate warnings for different devices using"},{"line_number":400,"context_line":"        # same bridge. truncate start to remove prefixes"},{"line_number":401,"context_line":"        port_sg_rules \u003d []"},{"line_number":402,"context_line":"        if not any(port.get(\u0027device_owner\u0027, \u0027\u0027).startswith(prefix)"},{"line_number":403,"context_line":"                   for prefix in constants.DEVICE_OWNER_PREFIXES):"}],"source_content_type":"text/x-python","patch_set":36,"id":"3fa7e38b_f1d8cf24","line":400,"range":{"start_line":399,"start_character":0,"end_line":400,"end_character":56},"in_reply_to":"3fa7e38b_dbd93455","updated":"2020-01-21 16:38:45.000000000","message":"Done","commit_id":"3e92d29b50e25332c8977ff6257ad274d11a3e86"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4947d6a39cfe0a0fa0649375f9e6e9776493c63c","unresolved":false,"context_lines":[{"line_number":397,"context_line":"        match_interface \u003d \u0027-i %s\u0027"},{"line_number":398,"context_line":"        match_physdev \u003d \u0027-m physdev --physdev-in %s\u0027"},{"line_number":399,"context_line":"        port_sg_rules \u003d []"},{"line_number":400,"context_line":"        if not any(port.get(\u0027device_owner\u0027, \u0027\u0027).startswith(prefix)"},{"line_number":401,"context_line":"                   for prefix in constants.DEVICE_OWNER_PREFIXES):"},{"line_number":402,"context_line":"            port_sg_ids \u003d port.get(\u0027security_groups\u0027, [])"},{"line_number":403,"context_line":"            if port_sg_ids:"},{"line_number":404,"context_line":"                for rule in self.sg_rules.get(port_sg_ids[0], []):"},{"line_number":405,"context_line":"                    if self.enable_ipset:"},{"line_number":406,"context_line":"                        port_sg_rules.append(rule)"},{"line_number":407,"context_line":"                        break"},{"line_number":408,"context_line":"                    else:"},{"line_number":409,"context_line":"                        port_sg_rules.extend("},{"line_number":410,"context_line":"                            self._expand_sg_rule_with_remote_ips("},{"line_number":411,"context_line":"                                rule, port, constants.INGRESS_DIRECTION))"},{"line_number":412,"context_line":"                        if port_sg_rules:"},{"line_number":413,"context_line":"                            break"},{"line_number":414,"context_line":"                        else:"},{"line_number":415,"context_line":"                            port_sg_rules.extend("},{"line_number":416,"context_line":"                                self._expand_sg_rule_with_remote_ips("},{"line_number":417,"context_line":"                                    rule, port, constants.EGRESS_DIRECTION))"},{"line_number":418,"context_line":"                            if port_sg_rules:"},{"line_number":419,"context_line":"                                break"},{"line_number":420,"context_line":"        if self._are_sg_rules_stateful(port_sg_rules):"},{"line_number":421,"context_line":"            # comment to prevent duplicate warnings for different devices using"},{"line_number":422,"context_line":"            # same bridge. truncate start to remove prefixes"}],"source_content_type":"text/x-python","patch_set":48,"id":"1fa4df85_571a2a7d","line":419,"range":{"start_line":400,"start_character":8,"end_line":419,"end_character":37},"updated":"2020-02-28 09:51:12.000000000","message":"can You maybe move this to separate method? IMO it would be easier to ready later","commit_id":"03eb6eb2b98558264e2f32a65b699397d6cb832d"},{"author":{"_account_id":26106,"name":"Tom Stappaerts","email":"tom.stappaerts@nokia.com","username":"TomStappaerts"},"change_message_id":"9dc1305aabc6e256fd574cdcde6a8590b8eaded3","unresolved":false,"context_lines":[{"line_number":397,"context_line":"        match_interface \u003d \u0027-i %s\u0027"},{"line_number":398,"context_line":"        match_physdev \u003d \u0027-m physdev --physdev-in %s\u0027"},{"line_number":399,"context_line":"        port_sg_rules \u003d []"},{"line_number":400,"context_line":"        if not any(port.get(\u0027device_owner\u0027, \u0027\u0027).startswith(prefix)"},{"line_number":401,"context_line":"                   for prefix in constants.DEVICE_OWNER_PREFIXES):"},{"line_number":402,"context_line":"            port_sg_ids \u003d port.get(\u0027security_groups\u0027, [])"},{"line_number":403,"context_line":"            if port_sg_ids:"},{"line_number":404,"context_line":"                for rule in self.sg_rules.get(port_sg_ids[0], []):"},{"line_number":405,"context_line":"                    if self.enable_ipset:"},{"line_number":406,"context_line":"                        port_sg_rules.append(rule)"},{"line_number":407,"context_line":"                        break"},{"line_number":408,"context_line":"                    else:"},{"line_number":409,"context_line":"                        port_sg_rules.extend("},{"line_number":410,"context_line":"                            self._expand_sg_rule_with_remote_ips("},{"line_number":411,"context_line":"                                rule, port, constants.INGRESS_DIRECTION))"},{"line_number":412,"context_line":"                        if port_sg_rules:"},{"line_number":413,"context_line":"                            break"},{"line_number":414,"context_line":"                        else:"},{"line_number":415,"context_line":"                            port_sg_rules.extend("},{"line_number":416,"context_line":"                                self._expand_sg_rule_with_remote_ips("},{"line_number":417,"context_line":"                                    rule, port, constants.EGRESS_DIRECTION))"},{"line_number":418,"context_line":"                            if port_sg_rules:"},{"line_number":419,"context_line":"                                break"},{"line_number":420,"context_line":"        if self._are_sg_rules_stateful(port_sg_rules):"},{"line_number":421,"context_line":"            # comment to prevent duplicate warnings for different devices using"},{"line_number":422,"context_line":"            # same bridge. truncate start to remove prefixes"}],"source_content_type":"text/x-python","patch_set":48,"id":"1fa4df85_329c5c5c","line":419,"range":{"start_line":400,"start_character":8,"end_line":419,"end_character":37},"in_reply_to":"1fa4df85_571a2a7d","updated":"2020-02-28 12:25:48.000000000","message":"Agreed","commit_id":"03eb6eb2b98558264e2f32a65b699397d6cb832d"}],"neutron/db/migration/alembic_migrations/versions/rocky/expand/18a7e90ae768_add_security_group_stateful.py":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"8c87feeaa79afbe6ce564e0234e2239e2a1df880","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    op.add_column(\u0027securitygroups\u0027,"},{"line_number":39,"context_line":"                  sa.Column(\u0027stateful\u0027,"},{"line_number":40,"context_line":"                            sa.Boolean(),"},{"line_number":41,"context_line":"                            default\u003dTrue, server_default\u003dsa.sql.true(),"},{"line_number":42,"context_line":"                            nullable\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_e314c3eb","line":41,"range":{"start_line":41,"start_character":28,"end_line":41,"end_character":41},"updated":"2018-06-07 09:19:59.000000000","message":"https://docs.openstack.org/neutron/ocata/devref/db_layer.html#difference-between-default-and-server-default-parameters-for-columns - do not need to set default\u003dTrue in migration.","commit_id":"95678320665174fb362a8e846436b519a239084c"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"6feaf0f40d7d203d677e1d95f5a9c505ac0ae654","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    op.add_column(\u0027securitygroups\u0027,"},{"line_number":39,"context_line":"                  sa.Column(\u0027stateful\u0027,"},{"line_number":40,"context_line":"                            sa.Boolean(),"},{"line_number":41,"context_line":"                            default\u003dTrue, server_default\u003dsa.sql.true(),"},{"line_number":42,"context_line":"                            nullable\u003dFalse))"}],"source_content_type":"text/x-python","patch_set":2,"id":"5f7c97a3_8a7ab6b7","line":41,"range":{"start_line":41,"start_character":28,"end_line":41,"end_character":41},"in_reply_to":"5f7c97a3_e314c3eb","updated":"2018-06-07 15:38:33.000000000","message":"Done","commit_id":"95678320665174fb362a8e846436b519a239084c"}],"neutron/db/migration/alembic_migrations/versions/ussuri/expand/18a7e90ae768_add_security_group_stateful.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c19a30da2b47c483edd89265cc95e312c5d46759","unresolved":false,"context_lines":[{"line_number":30,"context_line":"revision \u003d \u002718a7e90ae768\u0027"},{"line_number":31,"context_line":"down_revision \u003d \u00272217c4222de6\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# milestone identifier, used by neutron-db-manage"},{"line_number":34,"context_line":"neutron_milestone \u003d [migration.USSURI]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def upgrade():"}],"source_content_type":"text/x-python","patch_set":50,"id":"1fa4df85_1e9d9d58","line":34,"range":{"start_line":33,"start_character":0,"end_line":34,"end_character":38},"updated":"2020-02-29 14:28:41.000000000","message":"This is added when a new DB branch is open. Now you should remove it.","commit_id":"dd469ed336bccc4b2a9cbd491c8f9025d8862a83"},{"author":{"_account_id":26106,"name":"Tom Stappaerts","email":"tom.stappaerts@nokia.com","username":"TomStappaerts"},"change_message_id":"7f59f2eeae9a6d5d043c75c59d734fb0ac7ca87b","unresolved":false,"context_lines":[{"line_number":30,"context_line":"revision \u003d \u002718a7e90ae768\u0027"},{"line_number":31,"context_line":"down_revision \u003d \u00272217c4222de6\u0027"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"# milestone identifier, used by neutron-db-manage"},{"line_number":34,"context_line":"neutron_milestone \u003d [migration.USSURI]"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"def upgrade():"}],"source_content_type":"text/x-python","patch_set":50,"id":"1fa4df85_a2746769","line":34,"range":{"start_line":33,"start_character":0,"end_line":34,"end_character":38},"in_reply_to":"1fa4df85_1e9d9d58","updated":"2020-03-02 10:51:10.000000000","message":"thx","commit_id":"dd469ed336bccc4b2a9cbd491c8f9025d8862a83"}],"neutron/db/models/securitygroup.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4947d6a39cfe0a0fa0649375f9e6e9776493c63c","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    name \u003d sa.Column(sa.String(db_const.NAME_FIELD_SIZE))"},{"line_number":32,"context_line":"    stateful \u003d sa.Column(sa.Boolean,"},{"line_number":33,"context_line":"                         default\u003dTrue, server_default\u003dsql.true(),"},{"line_number":34,"context_line":"                         nullable\u003dFalse)"},{"line_number":35,"context_line":"    rbac_entries \u003d sa.orm.relationship(rbac_db_models.SecurityGroupRBAC,"},{"line_number":36,"context_line":"                                       backref\u003d\u0027security_group\u0027,"}],"source_content_type":"text/x-python","patch_set":48,"id":"1fa4df85_9707421d","line":33,"range":{"start_line":33,"start_character":39,"end_line":33,"end_character":64},"updated":"2020-02-28 09:51:12.000000000","message":"nit: I\u0027m not sure if this is needed here. It\u0027s needed in alembic migration scripts but probably not here.","commit_id":"03eb6eb2b98558264e2f32a65b699397d6cb832d"},{"author":{"_account_id":26106,"name":"Tom Stappaerts","email":"tom.stappaerts@nokia.com","username":"TomStappaerts"},"change_message_id":"9dc1305aabc6e256fd574cdcde6a8590b8eaded3","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    name \u003d sa.Column(sa.String(db_const.NAME_FIELD_SIZE))"},{"line_number":32,"context_line":"    stateful \u003d sa.Column(sa.Boolean,"},{"line_number":33,"context_line":"                         default\u003dTrue, server_default\u003dsql.true(),"},{"line_number":34,"context_line":"                         nullable\u003dFalse)"},{"line_number":35,"context_line":"    rbac_entries \u003d sa.orm.relationship(rbac_db_models.SecurityGroupRBAC,"},{"line_number":36,"context_line":"                                       backref\u003d\u0027security_group\u0027,"}],"source_content_type":"text/x-python","patch_set":48,"id":"1fa4df85_f29d6457","line":33,"range":{"start_line":33,"start_character":39,"end_line":33,"end_character":64},"in_reply_to":"1fa4df85_9707421d","updated":"2020-02-28 12:25:48.000000000","message":"I don\u0027t think it is needed either.","commit_id":"03eb6eb2b98558264e2f32a65b699397d6cb832d"},{"author":{"_account_id":26106,"name":"Tom Stappaerts","email":"tom.stappaerts@nokia.com","username":"TomStappaerts"},"change_message_id":"7f59f2eeae9a6d5d043c75c59d734fb0ac7ca87b","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    name \u003d sa.Column(sa.String(db_const.NAME_FIELD_SIZE))"},{"line_number":32,"context_line":"    stateful \u003d sa.Column(sa.Boolean,"},{"line_number":33,"context_line":"                         default\u003dTrue, server_default\u003dsql.true(),"},{"line_number":34,"context_line":"                         nullable\u003dFalse)"},{"line_number":35,"context_line":"    rbac_entries \u003d sa.orm.relationship(rbac_db_models.SecurityGroupRBAC,"},{"line_number":36,"context_line":"                                       backref\u003d\u0027security_group\u0027,"}],"source_content_type":"text/x-python","patch_set":48,"id":"1fa4df85_423253a9","line":33,"range":{"start_line":33,"start_character":39,"end_line":33,"end_character":64},"in_reply_to":"1fa4df85_9ea8ad77","updated":"2020-03-02 10:51:10.000000000","message":"Alright thx for clarifying","commit_id":"03eb6eb2b98558264e2f32a65b699397d6cb832d"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c19a30da2b47c483edd89265cc95e312c5d46759","unresolved":false,"context_lines":[{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    name \u003d sa.Column(sa.String(db_const.NAME_FIELD_SIZE))"},{"line_number":32,"context_line":"    stateful \u003d sa.Column(sa.Boolean,"},{"line_number":33,"context_line":"                         default\u003dTrue, server_default\u003dsql.true(),"},{"line_number":34,"context_line":"                         nullable\u003dFalse)"},{"line_number":35,"context_line":"    rbac_entries \u003d sa.orm.relationship(rbac_db_models.SecurityGroupRBAC,"},{"line_number":36,"context_line":"                                       backref\u003d\u0027security_group\u0027,"}],"source_content_type":"text/x-python","patch_set":48,"id":"1fa4df85_9ea8ad77","line":33,"range":{"start_line":33,"start_character":39,"end_line":33,"end_character":64},"in_reply_to":"1fa4df85_f29d6457","updated":"2020-02-29 14:28:41.000000000","message":"It is needed. The migration and the model definitions should match.\n\nhttps://377bf8bc600ab6503289-d78d8ef0830aa9db46429a25978bd123.ssl.cf5.rackcdn.com/572767/50/check/neutron-functional/5dd47ef/testr_results.html","commit_id":"03eb6eb2b98558264e2f32a65b699397d6cb832d"}],"neutron/db/securitygroups_db.py":[{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"546121c1032e496c00185dfa2e9808e408a7a035","unresolved":false,"context_lines":[{"line_number":608,"context_line":""},{"line_number":609,"context_line":"    def _validate_sgs_for_port(self, context):"},{"line_number":610,"context_line":"        stateful \u003d True"},{"line_number":611,"context_line":"        msg \u003d \"Cannot apply stateful and stateless security groups for a port\""},{"line_number":612,"context_line":"        for sg in context.current.get(\u0027security_groups\u0027):"},{"line_number":613,"context_line":"            if context.current[\u0027security_groups\u0027].index(sg) \u003d\u003d 0:"},{"line_number":614,"context_line":"                stateful \u003d (self.get_security_group("}],"source_content_type":"text/x-python","patch_set":15,"id":"3fa7e38b_dc769cd5","line":611,"updated":"2019-11-25 20:54:40.000000000","message":"I would make this a little clearer by saying \"Cannot apply both stateful and stateless security groups on the same port at the same time\".  After all, this may operate in non-obvious ways and be unclear to some customers.  It might be even more helpful for a customer debugging the issue if you return additional information, something like:\n\n\"Cannot apply stateful security group \u003cUUID1\u003e to port \u003cUUID2\u003e, it already has stateless security group \u003cUUID3\u003e applied to it.\"","commit_id":"5a20e6a144c3c265b166dfaab0c8e7a9d527a8bd"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"bad38173b3d8fb62e92c093d6cdc789293bb9cd2","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        s \u003d security_group[\u0027security_group\u0027]"},{"line_number":271,"context_line":"        if \u0027stateful\u0027 in s:"},{"line_number":272,"context_line":"            filters \u003d {\u0027security_group_id\u0027: [id]}"},{"line_number":273,"context_line":"            with db_api.context_manager.reader.using(context):"},{"line_number":274,"context_line":"                ports \u003d self._get_port_security_group_bindings(context,"},{"line_number":275,"context_line":"                                                               filters)"},{"line_number":276,"context_line":"                if ports:"}],"source_content_type":"text/x-python","patch_set":26,"id":"3fa7e38b_0b5421fc","line":273,"updated":"2020-01-07 19:55:11.000000000","message":"Why not get rid of this \u0027with\u0027 and decorate the function with this decorator?\n\n    @db_api.CONTEXT_READER\n\nAlternatively change the with statement to this in order to keep consistent with the new engine facade style:\n\n    with db_api.CONTEXT_READER.using(context):","commit_id":"76c8510b305df1b74d0709d5e1814e800acce351"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"80d7064fad064e8fb0759e5575ffa205c0667f11","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        s \u003d security_group[\u0027security_group\u0027]"},{"line_number":271,"context_line":"        if \u0027stateful\u0027 in s:"},{"line_number":272,"context_line":"            filters \u003d {\u0027security_group_id\u0027: [id]}"},{"line_number":273,"context_line":"            with db_api.context_manager.reader.using(context):"},{"line_number":274,"context_line":"                ports \u003d self._get_port_security_group_bindings(context,"},{"line_number":275,"context_line":"                                                               filters)"},{"line_number":276,"context_line":"                if ports:"}],"source_content_type":"text/x-python","patch_set":26,"id":"3fa7e38b_b2f21568","line":273,"in_reply_to":"3fa7e38b_0b5421fc","updated":"2020-01-08 10:32:24.000000000","message":"Done","commit_id":"76c8510b305df1b74d0709d5e1814e800acce351"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"bad38173b3d8fb62e92c093d6cdc789293bb9cd2","unresolved":false,"context_lines":[{"line_number":628,"context_line":"            if context.current[\u0027security_groups\u0027].index(sg) \u003d\u003d 0:"},{"line_number":629,"context_line":"                stateful \u003d (self.get_security_group("},{"line_number":630,"context_line":"                    context._plugin_context, sg).get(\u0027stateful\u0027))"},{"line_number":631,"context_line":"            if (stateful !\u003d self.get_security_group("},{"line_number":632,"context_line":"                    context._plugin_context, sg).get(\u0027stateful\u0027)):"},{"line_number":633,"context_line":"                raise ext_sg.SecurityGroupConflict(reason\u003dmsg)"},{"line_number":634,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"3fa7e38b_cba7e908","line":631,"range":{"start_line":631,"start_character":1,"end_line":631,"end_character":52},"updated":"2020-01-07 19:55:11.000000000","message":"I think this should be an elif.  Otherwise for the first security group you are fetching the stateful value twice, which is unnecessary.","commit_id":"76c8510b305df1b74d0709d5e1814e800acce351"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"80d7064fad064e8fb0759e5575ffa205c0667f11","unresolved":false,"context_lines":[{"line_number":628,"context_line":"            if context.current[\u0027security_groups\u0027].index(sg) \u003d\u003d 0:"},{"line_number":629,"context_line":"                stateful \u003d (self.get_security_group("},{"line_number":630,"context_line":"                    context._plugin_context, sg).get(\u0027stateful\u0027))"},{"line_number":631,"context_line":"            if (stateful !\u003d self.get_security_group("},{"line_number":632,"context_line":"                    context._plugin_context, sg).get(\u0027stateful\u0027)):"},{"line_number":633,"context_line":"                raise ext_sg.SecurityGroupConflict(reason\u003dmsg)"},{"line_number":634,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"3fa7e38b_5293a100","line":631,"range":{"start_line":631,"start_character":1,"end_line":631,"end_character":52},"in_reply_to":"3fa7e38b_cba7e908","updated":"2020-01-08 10:32:24.000000000","message":"Done","commit_id":"76c8510b305df1b74d0709d5e1814e800acce351"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b8b135e3a8fee3ac4c3ee5e24e8ddc0cda3d416d","unresolved":false,"context_lines":[{"line_number":622,"context_line":""},{"line_number":623,"context_line":"    def _validate_sgs_for_port(self, context):"},{"line_number":624,"context_line":"        stateful \u003d True"},{"line_number":625,"context_line":"        msg \u003d (\"Cannot apply both stateful and stateless security\""},{"line_number":626,"context_line":"               \" groups on the same port at the same time\")"},{"line_number":627,"context_line":"        for sg in context.current.get(\u0027security_groups\u0027):"},{"line_number":628,"context_line":"            if context.current[\u0027security_groups\u0027].index(sg) \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_eb3942d0","line":625,"updated":"2020-01-13 10:00:11.000000000","message":"You should use translate method for that also","commit_id":"1bd9daa0cba9b1513fcf608d7103b07d2d21540f"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"fab9e35173af4cc214eee03c099edd1cb42c1db7","unresolved":false,"context_lines":[{"line_number":622,"context_line":""},{"line_number":623,"context_line":"    def _validate_sgs_for_port(self, context):"},{"line_number":624,"context_line":"        stateful \u003d True"},{"line_number":625,"context_line":"        msg \u003d (\"Cannot apply both stateful and stateless security\""},{"line_number":626,"context_line":"               \" groups on the same port at the same time\")"},{"line_number":627,"context_line":"        for sg in context.current.get(\u0027security_groups\u0027):"},{"line_number":628,"context_line":"            if context.current[\u0027security_groups\u0027].index(sg) \u003d\u003d 0:"}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_ebfce241","line":625,"in_reply_to":"3fa7e38b_eb3942d0","updated":"2020-01-13 11:13:52.000000000","message":"The translate is done in the SecurityGroupConflict, so I suppose its fine as it is.","commit_id":"1bd9daa0cba9b1513fcf608d7103b07d2d21540f"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b8b135e3a8fee3ac4c3ee5e24e8ddc0cda3d416d","unresolved":false,"context_lines":[{"line_number":623,"context_line":"    def _validate_sgs_for_port(self, context):"},{"line_number":624,"context_line":"        stateful \u003d True"},{"line_number":625,"context_line":"        msg \u003d (\"Cannot apply both stateful and stateless security\""},{"line_number":626,"context_line":"               \" groups on the same port at the same time\")"},{"line_number":627,"context_line":"        for sg in context.current.get(\u0027security_groups\u0027):"},{"line_number":628,"context_line":"            if context.current[\u0027security_groups\u0027].index(sg) \u003d\u003d 0:"},{"line_number":629,"context_line":"                stateful \u003d (self.get_security_group("}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_4b55f6f8","line":626,"range":{"start_line":626,"start_character":16,"end_line":626,"end_character":17},"updated":"2020-01-13 10:00:11.000000000","message":"nit: the convention is that we put such space as last char in line above always","commit_id":"1bd9daa0cba9b1513fcf608d7103b07d2d21540f"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b8b135e3a8fee3ac4c3ee5e24e8ddc0cda3d416d","unresolved":false,"context_lines":[{"line_number":625,"context_line":"        msg \u003d (\"Cannot apply both stateful and stateless security\""},{"line_number":626,"context_line":"               \" groups on the same port at the same time\")"},{"line_number":627,"context_line":"        for sg in context.current.get(\u0027security_groups\u0027):"},{"line_number":628,"context_line":"            if context.current[\u0027security_groups\u0027].index(sg) \u003d\u003d 0:"},{"line_number":629,"context_line":"                stateful \u003d (self.get_security_group("},{"line_number":630,"context_line":"                    context._plugin_context, sg).get(\u0027stateful\u0027))"},{"line_number":631,"context_line":"            elif (stateful !\u003d self.get_security_group("},{"line_number":632,"context_line":"                    context._plugin_context, sg).get(\u0027stateful\u0027)):"},{"line_number":633,"context_line":"                raise ext_sg.SecurityGroupConflict(reason\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_ebd5c249","line":630,"range":{"start_line":628,"start_character":12,"end_line":630,"end_character":65},"updated":"2020-01-13 10:00:11.000000000","message":"personally I would move this outside the \"for\" loop and in loop start iterating from second element always. There would be no this a bit strange IMO \"if...elif...\" block there.","commit_id":"1bd9daa0cba9b1513fcf608d7103b07d2d21540f"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"fab9e35173af4cc214eee03c099edd1cb42c1db7","unresolved":false,"context_lines":[{"line_number":625,"context_line":"        msg \u003d (\"Cannot apply both stateful and stateless security\""},{"line_number":626,"context_line":"               \" groups on the same port at the same time\")"},{"line_number":627,"context_line":"        for sg in context.current.get(\u0027security_groups\u0027):"},{"line_number":628,"context_line":"            if context.current[\u0027security_groups\u0027].index(sg) \u003d\u003d 0:"},{"line_number":629,"context_line":"                stateful \u003d (self.get_security_group("},{"line_number":630,"context_line":"                    context._plugin_context, sg).get(\u0027stateful\u0027))"},{"line_number":631,"context_line":"            elif (stateful !\u003d self.get_security_group("},{"line_number":632,"context_line":"                    context._plugin_context, sg).get(\u0027stateful\u0027)):"},{"line_number":633,"context_line":"                raise ext_sg.SecurityGroupConflict(reason\u003dmsg)"}],"source_content_type":"text/x-python","patch_set":27,"id":"3fa7e38b_6bb7928a","line":630,"range":{"start_line":628,"start_character":12,"end_line":630,"end_character":65},"in_reply_to":"3fa7e38b_ebd5c249","updated":"2020-01-13 11:13:52.000000000","message":"If the security groups is empty then the loop is never executed, however, if we move out then we would have to add extra validation to see if the security groups is not empty and then only use the first element for validation. So I think this fine.","commit_id":"1bd9daa0cba9b1513fcf608d7103b07d2d21540f"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"784dd31a0c56a1420e5f88b5f3d43739e8224fd6","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        s \u003d security_group[\u0027security_group\u0027]"},{"line_number":271,"context_line":"        if \u0027stateful\u0027 in s:"},{"line_number":272,"context_line":"            filters \u003d {\u0027security_group_id\u0027: [id]}"},{"line_number":273,"context_line":"            with db_api.CONTEXT_READER.using(context):"},{"line_number":274,"context_line":"                ports \u003d self._get_port_security_group_bindings(context,"},{"line_number":275,"context_line":"                                                               filters)"},{"line_number":276,"context_line":"                if ports:"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_ae4838b4","line":273,"updated":"2020-01-13 13:23:42.000000000","message":"We should avoid creating new DB contexts. Can we move this one to the next writter context? Every OpenStack version is slower than the previous one because of this.","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"4aa8cd4034dfd26d65ac9cf94bcaba11d6dd542b","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        s \u003d security_group[\u0027security_group\u0027]"},{"line_number":271,"context_line":"        if \u0027stateful\u0027 in s:"},{"line_number":272,"context_line":"            filters \u003d {\u0027security_group_id\u0027: [id]}"},{"line_number":273,"context_line":"            with db_api.CONTEXT_READER.using(context):"},{"line_number":274,"context_line":"                ports \u003d self._get_port_security_group_bindings(context,"},{"line_number":275,"context_line":"                                                               filters)"},{"line_number":276,"context_line":"                if ports:"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_8403dbbd","line":273,"in_reply_to":"3fa7e38b_ae4838b4","updated":"2020-01-13 16:03:51.000000000","message":"We need this before notifying, so I am not sure we can avoid this.","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"784dd31a0c56a1420e5f88b5f3d43739e8224fd6","unresolved":false,"context_lines":[{"line_number":624,"context_line":"        stateful \u003d True"},{"line_number":625,"context_line":"        msg \u003d (\"Cannot apply both stateful and stateless security \""},{"line_number":626,"context_line":"               \"groups on the same port at the same time\")"},{"line_number":627,"context_line":"        for sg in context.current.get(\u0027security_groups\u0027):"},{"line_number":628,"context_line":"            if context.current[\u0027security_groups\u0027].index(sg) \u003d\u003d 0:"},{"line_number":629,"context_line":"                stateful \u003d (self.get_security_group("},{"line_number":630,"context_line":"                    context._plugin_context, sg).get(\u0027stateful\u0027))"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_04328bf4","line":627,"updated":"2020-01-13 13:23:42.000000000","message":"So here you want to check all \"stateful\" parameters of all SGs are the same. This works also for empty lists.\n\nstateful \u003d [sg.get(\u0027stateful\u0027, True) for sg in\n            context.current.get(\u0027security_groups\u0027))]\nif not all(x\u003d\u003dstateful[0] for x in stateful):\n  msg \u003d (\"Cannot apply both stateful and stateless security \"\n         \"groups on the same port at the same time\")\n  raise ext_sg.SecurityGroupConflict(reason\u003dmsg)","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"4aa8cd4034dfd26d65ac9cf94bcaba11d6dd542b","unresolved":false,"context_lines":[{"line_number":624,"context_line":"        stateful \u003d True"},{"line_number":625,"context_line":"        msg \u003d (\"Cannot apply both stateful and stateless security \""},{"line_number":626,"context_line":"               \"groups on the same port at the same time\")"},{"line_number":627,"context_line":"        for sg in context.current.get(\u0027security_groups\u0027):"},{"line_number":628,"context_line":"            if context.current[\u0027security_groups\u0027].index(sg) \u003d\u003d 0:"},{"line_number":629,"context_line":"                stateful \u003d (self.get_security_group("},{"line_number":630,"context_line":"                    context._plugin_context, sg).get(\u0027stateful\u0027))"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_0474cb36","line":627,"in_reply_to":"3fa7e38b_04328bf4","updated":"2020-01-13 16:03:51.000000000","message":"Done","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f8a533adc33887e8647d831af636ed57651036d9","unresolved":false,"context_lines":[{"line_number":278,"context_line":"    @db_api.retry_if_session_inactive()"},{"line_number":279,"context_line":"    def update_security_group(self, context, id, security_group):"},{"line_number":280,"context_line":"        s \u003d security_group[\u0027security_group\u0027]"},{"line_number":281,"context_line":"        if \u0027stateful\u0027 in s:"},{"line_number":282,"context_line":"            filters \u003d {\u0027security_group_id\u0027: [id]}"},{"line_number":283,"context_line":"            with db_api.CONTEXT_READER.using(context):"},{"line_number":284,"context_line":"                ports \u003d self._get_port_security_group_bindings(context,"},{"line_number":285,"context_line":"                                                               filters)"},{"line_number":286,"context_line":"                if ports:"},{"line_number":287,"context_line":"                    raise ext_sg.SecurityGroupInUse(id\u003did)"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        kwargs \u003d {"},{"line_number":290,"context_line":"            \u0027context\u0027: context,"}],"source_content_type":"text/x-python","patch_set":45,"id":"3fa7e38b_8e848ab3","line":287,"range":{"start_line":281,"start_character":27,"end_line":287,"end_character":58},"updated":"2020-02-13 15:15:59.000000000","message":"Sorry, why this operation? I don\u0027t understand it.\n\nIf \"stateful\" is not changing, why it should fail?","commit_id":"79cc605c989b63c739a36b5097cbefa901ef6355"},{"author":{"_account_id":26106,"name":"Tom Stappaerts","email":"tom.stappaerts@nokia.com","username":"TomStappaerts"},"change_message_id":"3fc6ecddf38d354c9593cbdab593ed2ee4167f2a","unresolved":false,"context_lines":[{"line_number":278,"context_line":"    @db_api.retry_if_session_inactive()"},{"line_number":279,"context_line":"    def update_security_group(self, context, id, security_group):"},{"line_number":280,"context_line":"        s \u003d security_group[\u0027security_group\u0027]"},{"line_number":281,"context_line":"        if \u0027stateful\u0027 in s:"},{"line_number":282,"context_line":"            filters \u003d {\u0027security_group_id\u0027: [id]}"},{"line_number":283,"context_line":"            with db_api.CONTEXT_READER.using(context):"},{"line_number":284,"context_line":"                ports \u003d self._get_port_security_group_bindings(context,"},{"line_number":285,"context_line":"                                                               filters)"},{"line_number":286,"context_line":"                if ports:"},{"line_number":287,"context_line":"                    raise ext_sg.SecurityGroupInUse(id\u003did)"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        kwargs \u003d {"},{"line_number":290,"context_line":"            \u0027context\u0027: context,"}],"source_content_type":"text/x-python","patch_set":45,"id":"3fa7e38b_5a47281c","line":287,"range":{"start_line":281,"start_character":27,"end_line":287,"end_character":58},"in_reply_to":"3fa7e38b_8e848ab3","updated":"2020-02-13 17:22:20.000000000","message":"Are you saying we shouldn\u0027t block this or are you saying we should only block when you update and the updated value differs from the original one?","commit_id":"79cc605c989b63c739a36b5097cbefa901ef6355"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4947d6a39cfe0a0fa0649375f9e6e9776493c63c","unresolved":false,"context_lines":[{"line_number":278,"context_line":"    @db_api.retry_if_session_inactive()"},{"line_number":279,"context_line":"    def update_security_group(self, context, id, security_group):"},{"line_number":280,"context_line":"        s \u003d security_group[\u0027security_group\u0027]"},{"line_number":281,"context_line":"        if \u0027stateful\u0027 in s:"},{"line_number":282,"context_line":"            filters \u003d {\u0027security_group_id\u0027: [id]}"},{"line_number":283,"context_line":"            with db_api.CONTEXT_READER.using(context):"},{"line_number":284,"context_line":"                ports \u003d self._get_port_security_group_bindings(context,"},{"line_number":285,"context_line":"                                                               filters)"},{"line_number":286,"context_line":"                if ports:"},{"line_number":287,"context_line":"                    raise ext_sg.SecurityGroupInUse(id\u003did)"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        kwargs \u003d {"},{"line_number":290,"context_line":"            \u0027context\u0027: context,"}],"source_content_type":"text/x-python","patch_set":48,"id":"1fa4df85_921c306b","line":287,"range":{"start_line":281,"start_character":8,"end_line":287,"end_character":58},"updated":"2020-02-28 09:51:12.000000000","message":"I think this is good thing to test in neutron API tests","commit_id":"03eb6eb2b98558264e2f32a65b699397d6cb832d"},{"author":{"_account_id":26106,"name":"Tom Stappaerts","email":"tom.stappaerts@nokia.com","username":"TomStappaerts"},"change_message_id":"9dc1305aabc6e256fd574cdcde6a8590b8eaded3","unresolved":false,"context_lines":[{"line_number":278,"context_line":"    @db_api.retry_if_session_inactive()"},{"line_number":279,"context_line":"    def update_security_group(self, context, id, security_group):"},{"line_number":280,"context_line":"        s \u003d security_group[\u0027security_group\u0027]"},{"line_number":281,"context_line":"        if \u0027stateful\u0027 in s:"},{"line_number":282,"context_line":"            filters \u003d {\u0027security_group_id\u0027: [id]}"},{"line_number":283,"context_line":"            with db_api.CONTEXT_READER.using(context):"},{"line_number":284,"context_line":"                ports \u003d self._get_port_security_group_bindings(context,"},{"line_number":285,"context_line":"                                                               filters)"},{"line_number":286,"context_line":"                if ports:"},{"line_number":287,"context_line":"                    raise ext_sg.SecurityGroupInUse(id\u003did)"},{"line_number":288,"context_line":""},{"line_number":289,"context_line":"        kwargs \u003d {"},{"line_number":290,"context_line":"            \u0027context\u0027: context,"}],"source_content_type":"text/x-python","patch_set":48,"id":"1fa4df85_9207501d","line":287,"range":{"start_line":281,"start_character":8,"end_line":287,"end_character":58},"in_reply_to":"1fa4df85_921c306b","updated":"2020-02-28 12:25:48.000000000","message":"Agreed","commit_id":"03eb6eb2b98558264e2f32a65b699397d6cb832d"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4947d6a39cfe0a0fa0649375f9e6e9776493c63c","unresolved":false,"context_lines":[{"line_number":632,"context_line":""},{"line_number":633,"context_line":"    @staticmethod"},{"line_number":634,"context_line":"    def _validate_sgs_for_port(security_groups):"},{"line_number":635,"context_line":"        if not security_groups:"},{"line_number":636,"context_line":"            return"},{"line_number":637,"context_line":"        if not len(set(sg.stateful for sg in security_groups)) \u003d\u003d 1:"},{"line_number":638,"context_line":"            msg \u003d (\"Cannot apply both stateful and stateless security \""},{"line_number":639,"context_line":"                   \"groups on the same port at the same time\")"},{"line_number":640,"context_line":"            raise ext_sg.SecurityGroupConflict(reason\u003dmsg)"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"    def _validate_security_group_rules(self, context, security_group_rules):"},{"line_number":643,"context_line":"        sg_id \u003d self._validate_single_tenant_and_group(security_group_rules)"}],"source_content_type":"text/x-python","patch_set":48,"id":"1fa4df85_d2406838","line":640,"range":{"start_line":635,"start_character":8,"end_line":640,"end_character":58},"updated":"2020-02-28 09:51:12.000000000","message":"that should be also covered by API test in neutron-tempest-plugin","commit_id":"03eb6eb2b98558264e2f32a65b699397d6cb832d"}],"neutron/db/securitygroups_rpc_base.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"784dd31a0c56a1420e5f88b5f3d43739e8224fd6","unresolved":false,"context_lines":[{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    @db_api.retry_if_session_inactive()"},{"line_number":431,"context_line":"    def _is_security_group_stateful(self, context, sg_id):"},{"line_number":432,"context_line":"        security_group \u003d context.session.query("},{"line_number":433,"context_line":"            sg_models.SecurityGroup).filter_by(id\u003dsg_id).first()"},{"line_number":434,"context_line":"        return security_group.stateful"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_8ebc5c6c","line":434,"range":{"start_line":432,"start_character":8,"end_line":434,"end_character":38},"updated":"2020-01-13 13:23:42.000000000","message":"Can you implement this method in the SecurityGroup OVO? You can implement a method called \"get_sg_by_id\"","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"4aa8cd4034dfd26d65ac9cf94bcaba11d6dd542b","unresolved":false,"context_lines":[{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    @db_api.retry_if_session_inactive()"},{"line_number":431,"context_line":"    def _is_security_group_stateful(self, context, sg_id):"},{"line_number":432,"context_line":"        security_group \u003d context.session.query("},{"line_number":433,"context_line":"            sg_models.SecurityGroup).filter_by(id\u003dsg_id).first()"},{"line_number":434,"context_line":"        return security_group.stateful"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_ba8b8ebf","line":434,"range":{"start_line":432,"start_character":8,"end_line":434,"end_character":38},"in_reply_to":"3fa7e38b_8ebc5c6c","updated":"2020-01-13 16:03:51.000000000","message":"Implemented it here:\n\nhttps://review.opendev.org/#/c/572767/28/neutron/api/rpc/handlers/securitygroups_rpc.py","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"04121cb9c2301632ae1ca9e28cce451c63f3d65e","unresolved":false,"context_lines":[{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    @db_api.retry_if_session_inactive()"},{"line_number":431,"context_line":"    def _is_security_group_stateful(self, context, sg_id):"},{"line_number":432,"context_line":"        security_group \u003d context.session.query("},{"line_number":433,"context_line":"            sg_models.SecurityGroup).filter_by(id\u003dsg_id).first()"},{"line_number":434,"context_line":"        return security_group.stateful"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_d512db55","line":434,"range":{"start_line":432,"start_character":8,"end_line":434,"end_character":38},"in_reply_to":"3fa7e38b_ba8b8ebf","updated":"2020-01-13 16:18:53.000000000","message":"This is retrieving a value from the RPC cache. What I\u0027m saying is to implement, in the SecurityGroup OVO [1] this method, to avoid here to make a query. Instead of this, you can hide this implementation inside the OVO itself.\n\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/objects/securitygroup.py#L35","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"7a444fe7a73ff09a79b132e1edeb05c6b64fbe22","unresolved":false,"context_lines":[{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    @db_api.retry_if_session_inactive()"},{"line_number":431,"context_line":"    def _is_security_group_stateful(self, context, sg_id):"},{"line_number":432,"context_line":"        security_group \u003d context.session.query("},{"line_number":433,"context_line":"            sg_models.SecurityGroup).filter_by(id\u003dsg_id).first()"},{"line_number":434,"context_line":"        return security_group.stateful"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_d69977cf","line":434,"range":{"start_line":432,"start_character":8,"end_line":434,"end_character":38},"in_reply_to":"3fa7e38b_d512db55","updated":"2020-01-14 10:50:11.000000000","message":"Done","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4947d6a39cfe0a0fa0649375f9e6e9776493c63c","unresolved":false,"context_lines":[{"line_number":361,"context_line":"        Return True if the security group associated with the given ID"},{"line_number":362,"context_line":"        is stateful, else False."},{"line_number":363,"context_line":"        \"\"\""},{"line_number":364,"context_line":"        raise NotImplementedError()"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"class SecurityGroupServerRpcMixin(SecurityGroupInfoAPIMixin,"}],"source_content_type":"text/x-python","patch_set":48,"id":"1fa4df85_529b18c8","line":364,"updated":"2020-02-28 09:51:12.000000000","message":"shouldn\u0027t we simply return True here for backward compatibility?","commit_id":"03eb6eb2b98558264e2f32a65b699397d6cb832d"},{"author":{"_account_id":26106,"name":"Tom Stappaerts","email":"tom.stappaerts@nokia.com","username":"TomStappaerts"},"change_message_id":"9dc1305aabc6e256fd574cdcde6a8590b8eaded3","unresolved":false,"context_lines":[{"line_number":361,"context_line":"        Return True if the security group associated with the given ID"},{"line_number":362,"context_line":"        is stateful, else False."},{"line_number":363,"context_line":"        \"\"\""},{"line_number":364,"context_line":"        raise NotImplementedError()"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":""},{"line_number":367,"context_line":"class SecurityGroupServerRpcMixin(SecurityGroupInfoAPIMixin,"}],"source_content_type":"text/x-python","patch_set":48,"id":"1fa4df85_46091d2a","line":364,"in_reply_to":"1fa4df85_529b18c8","updated":"2020-02-28 12:25:48.000000000","message":"agreed","commit_id":"03eb6eb2b98558264e2f32a65b699397d6cb832d"}],"neutron/extensions/securitygroup.py":[{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"561e028436d9e88073662012d167fd34a9aa0fd4","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                      \u0027validate\u0027: {"},{"line_number":235,"context_line":"                          \u0027type:string\u0027: db_const.PROJECT_ID_FIELD_SIZE},"},{"line_number":236,"context_line":"                      \u0027is_visible\u0027: True, \u0027is_filter\u0027: True},"},{"line_number":237,"context_line":"        \u0027stateful\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":238,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: True,"},{"line_number":239,"context_line":"                     \u0027convert_to\u0027: converters.convert_to_boolean},"},{"line_number":240,"context_line":"        SECURITYGROUPRULES: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":241,"context_line":"                             \u0027is_visible\u0027: True},"},{"line_number":242,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_c0aa94d0","line":239,"range":{"start_line":237,"start_character":0,"end_line":239,"end_character":66},"updated":"2019-11-18 16:51:39.000000000","message":"I think this should be a new extension to neutron, which means the API ref part (this) would need to be added to neutron-lib.  Here is an extension that is adding attributes for routers [1] and here is the template you can copy and use as a base [2].\n\n[1] https://opendev.org/openstack/neutron-lib/src/branch/master/neutron_lib/api/definitions/routerservicetype.py\n[2] https://opendev.org/openstack/neutron-lib/src/branch/master/neutron_lib/api/definitions/_dummy.py","commit_id":"9e8a6624980beedd472de4a30809d27a4b167191"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"8381c595f940c0f638b798fc6ad6071b7bf2de68","unresolved":false,"context_lines":[{"line_number":234,"context_line":"                      \u0027validate\u0027: {"},{"line_number":235,"context_line":"                          \u0027type:string\u0027: db_const.PROJECT_ID_FIELD_SIZE},"},{"line_number":236,"context_line":"                      \u0027is_visible\u0027: True, \u0027is_filter\u0027: True},"},{"line_number":237,"context_line":"        \u0027stateful\u0027: {\u0027allow_post\u0027: True, \u0027allow_put\u0027: True,"},{"line_number":238,"context_line":"                     \u0027is_visible\u0027: True, \u0027default\u0027: True,"},{"line_number":239,"context_line":"                     \u0027convert_to\u0027: converters.convert_to_boolean},"},{"line_number":240,"context_line":"        SECURITYGROUPRULES: {\u0027allow_post\u0027: False, \u0027allow_put\u0027: False,"},{"line_number":241,"context_line":"                             \u0027is_visible\u0027: True},"},{"line_number":242,"context_line":"    },"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_d8f4c157","line":239,"range":{"start_line":237,"start_character":0,"end_line":239,"end_character":66},"in_reply_to":"3fa7e38b_c0aa94d0","updated":"2019-11-19 09:10:19.000000000","message":"I am not sure, just like security group rules below, I think \"stateful\" is very much a property of a security group.","commit_id":"9e8a6624980beedd472de4a30809d27a4b167191"}],"neutron/objects/securitygroup.py":[{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"561e028436d9e88073662012d167fd34a9aa0fd4","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":89,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":90,"context_line":"        if _target_version \u003c (1, 1):"},{"line_number":91,"context_line":"            primitive.pop(\u0027shared\u0027)"},{"line_number":92,"context_line":"            primitive.pop(\u0027stateful\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @classmethod"},{"line_number":95,"context_line":"    def get_bound_tenant_ids(cls, context, obj_id):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_60fde0b0","line":92,"range":{"start_line":90,"start_character":0,"end_line":92,"end_character":37},"updated":"2019-11-18 16:51:39.000000000","message":"This should be:\n\n        if _target_version \u003c (1, 1):\n            primitive.pop(\u0027shared\u0027)\n        if _target_version \u003c (1, 2):\n            primitive.pop(\u0027stateful\u0027)","commit_id":"9e8a6624980beedd472de4a30809d27a4b167191"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"8381c595f940c0f638b798fc6ad6071b7bf2de68","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":89,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"},{"line_number":90,"context_line":"        if _target_version \u003c (1, 1):"},{"line_number":91,"context_line":"            primitive.pop(\u0027shared\u0027)"},{"line_number":92,"context_line":"            primitive.pop(\u0027stateful\u0027)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @classmethod"},{"line_number":95,"context_line":"    def get_bound_tenant_ids(cls, context, obj_id):"}],"source_content_type":"text/x-python","patch_set":14,"id":"3fa7e38b_98e089ce","line":92,"range":{"start_line":90,"start_character":0,"end_line":92,"end_character":37},"in_reply_to":"3fa7e38b_60fde0b0","updated":"2019-11-19 09:10:19.000000000","message":"Done","commit_id":"9e8a6624980beedd472de4a30809d27a4b167191"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"784dd31a0c56a1420e5f88b5f3d43739e8224fd6","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027name\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":50,"context_line":"        \u0027stateful\u0027: obj_fields.BooleanField(default\u003dTrue, nullable\u003dFalse),"},{"line_number":51,"context_line":"        \u0027is_default\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":52,"context_line":"        \u0027rules\u0027: obj_fields.ListOfObjectsField("},{"line_number":53,"context_line":"            \u0027SecurityGroupRule\u0027, nullable\u003dTrue"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_0ea86c1f","line":50,"range":{"start_line":50,"start_character":58,"end_line":50,"end_character":72},"updated":"2020-01-13 13:23:42.000000000","message":"not needed, the default \"nullable \"value is False","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"4aa8cd4034dfd26d65ac9cf94bcaba11d6dd542b","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        \u0027name\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":48,"context_line":"        \u0027project_id\u0027: obj_fields.StringField(nullable\u003dTrue),"},{"line_number":49,"context_line":"        \u0027shared\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":50,"context_line":"        \u0027stateful\u0027: obj_fields.BooleanField(default\u003dTrue, nullable\u003dFalse),"},{"line_number":51,"context_line":"        \u0027is_default\u0027: obj_fields.BooleanField(default\u003dFalse),"},{"line_number":52,"context_line":"        \u0027rules\u0027: obj_fields.ListOfObjectsField("},{"line_number":53,"context_line":"            \u0027SecurityGroupRule\u0027, nullable\u003dTrue"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_7f9ae875","line":50,"range":{"start_line":50,"start_character":58,"end_line":50,"end_character":72},"in_reply_to":"3fa7e38b_0ea86c1f","updated":"2020-01-13 16:03:51.000000000","message":"Done","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"784dd31a0c56a1420e5f88b5f3d43739e8224fd6","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        if _target_version \u003c (1, 1):"},{"line_number":91,"context_line":"            primitive.pop(\u0027shared\u0027)"},{"line_number":92,"context_line":"        if _target_version \u003c (1, 2):"},{"line_number":93,"context_line":"            primitive.pop(\u0027stateful\u0027)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @classmethod"},{"line_number":96,"context_line":"    def get_bound_tenant_ids(cls, context, obj_id):"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_2e66882a","line":93,"updated":"2020-01-13 13:23:42.000000000","message":"You need to implement a OVO version degradation test. Something like current NetworkRBAC test \"test_object_version_degradation_1_1_to_1_0_no_id_no_project_id\"","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"4aa8cd4034dfd26d65ac9cf94bcaba11d6dd542b","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        if _target_version \u003c (1, 1):"},{"line_number":91,"context_line":"            primitive.pop(\u0027shared\u0027)"},{"line_number":92,"context_line":"        if _target_version \u003c (1, 2):"},{"line_number":93,"context_line":"            primitive.pop(\u0027stateful\u0027)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    @classmethod"},{"line_number":96,"context_line":"    def get_bound_tenant_ids(cls, context, obj_id):"}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_fa9b4662","line":93,"in_reply_to":"3fa7e38b_2e66882a","updated":"2020-01-13 16:03:51.000000000","message":"Done","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c0da8b2d9b061f4abe104094b4406f1a89b4ee13","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @staticmethod"},{"line_number":95,"context_line":"    def is_security_group_stateful(context, sg_id):"},{"line_number":96,"context_line":"        return SecurityGroup.get_sg_by_id(context, sg_id).stateful"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":99,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_e811f651","line":96,"updated":"2020-01-17 09:06:30.000000000","message":"why You simply didn\u0027t use get_object() method here?","commit_id":"c979b3e065d6fbe4a92182f846a684ceaf41e304"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"ab7d6d31ae604b136aebb843c98331f7560beb57","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @staticmethod"},{"line_number":95,"context_line":"    def is_security_group_stateful(context, sg_id):"},{"line_number":96,"context_line":"        return SecurityGroup.get_sg_by_id(context, sg_id).stateful"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def obj_make_compatible(self, primitive, target_version):"},{"line_number":99,"context_line":"        _target_version \u003d versionutils.convert_version_to_tuple(target_version)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3fa7e38b_9e175854","line":96,"in_reply_to":"3fa7e38b_e811f651","updated":"2020-01-17 12:52:57.000000000","message":"Done","commit_id":"c979b3e065d6fbe4a92182f846a684ceaf41e304"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7bdeb021ad7d68f0f88696253ba7a848fc2e554c","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @classmethod"},{"line_number":89,"context_line":"    def get_sg_by_id(cls, context, sg_id):"},{"line_number":90,"context_line":"        sg_obj \u003d super(SecurityGroup, cls).get_object(context, id\u003dsg_id)"},{"line_number":91,"context_line":"        return sg_obj"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":36,"id":"3fa7e38b_a3c3f48b","line":90,"range":{"start_line":90,"start_character":8,"end_line":90,"end_character":16},"updated":"2020-01-21 11:58:41.000000000","message":"nit: simple \"return\" here would be enough","commit_id":"3e92d29b50e25332c8977ff6257ad274d11a3e86"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"4d2a38d4d6103dd3da17ae0db0f3e8706cf39a93","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @classmethod"},{"line_number":89,"context_line":"    def get_sg_by_id(cls, context, sg_id):"},{"line_number":90,"context_line":"        sg_obj \u003d super(SecurityGroup, cls).get_object(context, id\u003dsg_id)"},{"line_number":91,"context_line":"        return sg_obj"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def obj_make_compatible(self, primitive, target_version):"}],"source_content_type":"text/x-python","patch_set":36,"id":"3fa7e38b_d1e353d6","line":90,"range":{"start_line":90,"start_character":8,"end_line":90,"end_character":16},"in_reply_to":"3fa7e38b_a3c3f48b","updated":"2020-01-21 16:38:45.000000000","message":"Done","commit_id":"3e92d29b50e25332c8977ff6257ad274d11a3e86"}],"neutron/plugins/ml2/drivers/mech_agent.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"784dd31a0c56a1420e5f88b5f3d43739e8224fd6","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        pass"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def create_port_precommit(self, context):"},{"line_number":62,"context_line":"        if context.current.get(\u0027security_groups\u0027):"},{"line_number":63,"context_line":"            self._validate_sgs_for_port(context)"},{"line_number":64,"context_line":"        self._insert_provisioning_block(context)"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_016d9d00","line":62,"updated":"2020-01-13 13:23:42.000000000","message":"You are already checking this in the method. You can skip it here.","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"4aa8cd4034dfd26d65ac9cf94bcaba11d6dd542b","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        pass"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def create_port_precommit(self, context):"},{"line_number":62,"context_line":"        if context.current.get(\u0027security_groups\u0027):"},{"line_number":63,"context_line":"            self._validate_sgs_for_port(context)"},{"line_number":64,"context_line":"        self._insert_provisioning_block(context)"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"3fa7e38b_df943c44","line":62,"in_reply_to":"3fa7e38b_016d9d00","updated":"2020-01-13 16:03:51.000000000","message":"Done","commit_id":"3dd04f4743d40a7848269463dd34c38ab529ce60"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"398047d8fdf72428f48fe6db2ce932bb76393991","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":35,"context_line":"class AgentMechanismDriverBase(api.MechanismDriver, SecurityGroupDbMixin):"},{"line_number":36,"context_line":"    \"\"\"Base class for drivers that attach to networks using an L2 agent."},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    The AgentMechanismDriverBase provides common code for mechanism"}],"source_content_type":"text/x-python","patch_set":41,"id":"3fa7e38b_6af0e1fd","line":35,"range":{"start_line":35,"start_character":52,"end_line":35,"end_character":72},"updated":"2020-01-31 00:34:25.000000000","message":"Please see my comment to L62","commit_id":"a6e227b3e183f0acfaafb5c2700bc761b8d3b842"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"398047d8fdf72428f48fe6db2ce932bb76393991","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        pass"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def create_port_precommit(self, context):"},{"line_number":62,"context_line":"        self._validate_sgs_for_port(context)"},{"line_number":63,"context_line":"        self._insert_provisioning_block(context)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def update_port_precommit(self, context):"}],"source_content_type":"text/x-python","patch_set":41,"id":"3fa7e38b_4aeba510","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":44},"updated":"2020-01-31 00:34:25.000000000","message":"Why do we have to make this call in the mechanism driver, which shouldn\u0027t be concerned with security groups? Why pollute the mechanism manager with concepts / abstractions that don\u0027t belong in it? This call might as well be made right before calling the mechanism driver here https://github.com/openstack/neutron/blob/520f7cb4a0863c054b8b8716c064b1976cef98d0/neutron/plugins/ml2/plugin.py#L1393, which inherits from SecurityGroupDbMixin anyways. Another alternative is to create an ML2 extension. An example of this approach is here: https://review.opendev.org/#/c/700755/13/neutron/plugins/ml2/extensions/tag_ports_during_bulk_creation.py","commit_id":"a6e227b3e183f0acfaafb5c2700bc761b8d3b842"},{"author":{"_account_id":26106,"name":"Tom Stappaerts","email":"tom.stappaerts@nokia.com","username":"TomStappaerts"},"change_message_id":"4e475e702676054a11aeeb735a83852e242b5fac","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        pass"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def create_port_precommit(self, context):"},{"line_number":62,"context_line":"        self._validate_sgs_for_port(context)"},{"line_number":63,"context_line":"        self._insert_provisioning_block(context)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def update_port_precommit(self, context):"}],"source_content_type":"text/x-python","patch_set":41,"id":"3fa7e38b_3aa0898e","line":62,"range":{"start_line":62,"start_character":8,"end_line":62,"end_character":44},"in_reply_to":"3fa7e38b_4aeba510","updated":"2020-02-07 15:27:22.000000000","message":"I agree","commit_id":"a6e227b3e183f0acfaafb5c2700bc761b8d3b842"},{"author":{"_account_id":4694,"name":"Miguel Lavalle","email":"miguel@mlavalle.com","username":"minsel"},"change_message_id":"398047d8fdf72428f48fe6db2ce932bb76393991","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self._insert_provisioning_block(context)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def update_port_precommit(self, context):"},{"line_number":66,"context_line":"        self._validate_sgs_for_port(context)"},{"line_number":67,"context_line":"        if context.host \u003d\u003d context.original_host:"},{"line_number":68,"context_line":"            return"},{"line_number":69,"context_line":"        self._insert_provisioning_block(context)"}],"source_content_type":"text/x-python","patch_set":41,"id":"3fa7e38b_4ac40595","line":66,"range":{"start_line":66,"start_character":8,"end_line":66,"end_character":44},"updated":"2020-01-31 00:34:25.000000000","message":"Please see my comment to L62. The only difference is that the call can be made from here: https://github.com/openstack/neutron/blob/520f7cb4a0863c054b8b8716c064b1976cef98d0/neutron/plugins/ml2/plugin.py#L1737","commit_id":"a6e227b3e183f0acfaafb5c2700bc761b8d3b842"}],"neutron/plugins/ml2/drivers/ovn/mech_driver/mech_driver.py":[{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"934454ddc30530d383263edaa9ecd4059a1099d6","unresolved":false,"context_lines":[{"line_number":439,"context_line":"        if self._is_port_provisioning_required(port, context.host):"},{"line_number":440,"context_line":"            self._insert_port_provisioning_block(context._plugin_context,"},{"line_number":441,"context_line":"                                                 port[\u0027id\u0027])"},{"line_number":442,"context_line":"        import pdb; pdb.set_trace()"},{"line_number":443,"context_line":"        ovn_revision_numbers_db.create_initial_revision("},{"line_number":444,"context_line":"            context._plugin_context, port[\u0027id\u0027], ovn_const.TYPE_PORTS)"},{"line_number":445,"context_line":""}],"source_content_type":"text/x-python","patch_set":44,"id":"3fa7e38b_66ef0786","line":442,"updated":"2020-02-12 17:27:00.000000000","message":"Understandable that sometimes these leak upstream, but the upstream unit test etc. jobs won\u0027t work with this here.","commit_id":"23b49b93e50de3d03287a9dc8d361d3d9f1b6e3c"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4947d6a39cfe0a0fa0649375f9e6e9776493c63c","unresolved":false,"context_lines":[{"line_number":439,"context_line":"        if self._is_port_provisioning_required(port, context.host):"},{"line_number":440,"context_line":"            self._insert_port_provisioning_block(context._plugin_context,"},{"line_number":441,"context_line":"                                                 port[\u0027id\u0027])"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        ovn_revision_numbers_db.create_initial_revision("},{"line_number":444,"context_line":"            context._plugin_context, port[\u0027id\u0027], ovn_const.TYPE_PORTS)"},{"line_number":445,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"1fa4df85_d2ae28e6","side":"PARENT","line":442,"updated":"2020-02-28 09:51:12.000000000","message":"unrelated change","commit_id":"f71b6b361ee2d840877217b764c90ae234a09c00"},{"author":{"_account_id":26106,"name":"Tom Stappaerts","email":"tom.stappaerts@nokia.com","username":"TomStappaerts"},"change_message_id":"9dc1305aabc6e256fd574cdcde6a8590b8eaded3","unresolved":false,"context_lines":[{"line_number":439,"context_line":"        if self._is_port_provisioning_required(port, context.host):"},{"line_number":440,"context_line":"            self._insert_port_provisioning_block(context._plugin_context,"},{"line_number":441,"context_line":"                                                 port[\u0027id\u0027])"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"        ovn_revision_numbers_db.create_initial_revision("},{"line_number":444,"context_line":"            context._plugin_context, port[\u0027id\u0027], ovn_const.TYPE_PORTS)"},{"line_number":445,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"1fa4df85_86287586","side":"PARENT","line":442,"in_reply_to":"1fa4df85_d2ae28e6","updated":"2020-02-28 12:25:48.000000000","message":"thx","commit_id":"f71b6b361ee2d840877217b764c90ae234a09c00"}],"neutron/plugins/ml2/plugin.py":[{"author":{"_account_id":24791,"name":"Maciej Jozefczyk","email":"jeicam.pl@gmail.com","username":"maciej.jozefczyk"},"change_message_id":"fd39f69d8be21f26a689795b77b3fbcd78f36054","unresolved":false,"context_lines":[{"line_number":1392,"context_line":"            kwargs \u003d {\u0027context\u0027: context, \u0027port\u0027: result}"},{"line_number":1393,"context_line":"            registry.notify("},{"line_number":1394,"context_line":"                resources.PORT, events.PRECOMMIT_CREATE, self, **kwargs)"},{"line_number":1395,"context_line":"            self._validate_sgs_for_port(mech_context)"},{"line_number":1396,"context_line":"            self.mechanism_manager.create_port_precommit(mech_context)"},{"line_number":1397,"context_line":"            self._setup_dhcp_agent_provisioning_component(context, result)"},{"line_number":1398,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"3fa7e38b_95e25901","line":1395,"range":{"start_line":1395,"start_character":12,"end_line":1395,"end_character":53},"updated":"2020-02-13 11:55:09.000000000","message":"It started to fail because of this line.\n\nMore info:\n\n\u003cralonsoh\u003e TomStappaerts, maciejjozefczyk lucasagomes: this test is trying to check what is happening if another thread is taking first the same IP (IPAllocations register)\n\u003cralonsoh\u003e by creating a \"grenade\" IPAllocations class\n\u003cralonsoh\u003e that explodes when the transaction is done\n\u003cralonsoh\u003e that means when the precommit notification is done\n\u003cralonsoh\u003e the query in \"_get_standard_attr_id\" will return nothing for this port ID, because this transaction will fail\n\u003cralonsoh\u003e in this case, you should overwrite this test for OVN mech driver and patch any OVN notification","commit_id":"79cc605c989b63c739a36b5097cbefa901ef6355"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f8a533adc33887e8647d831af636ed57651036d9","unresolved":false,"context_lines":[{"line_number":1392,"context_line":"            kwargs \u003d {\u0027context\u0027: context, \u0027port\u0027: result}"},{"line_number":1393,"context_line":"            registry.notify("},{"line_number":1394,"context_line":"                resources.PORT, events.PRECOMMIT_CREATE, self, **kwargs)"},{"line_number":1395,"context_line":"            self._validate_sgs_for_port(mech_context)"},{"line_number":1396,"context_line":"            self.mechanism_manager.create_port_precommit(mech_context)"},{"line_number":1397,"context_line":"            self._setup_dhcp_agent_provisioning_component(context, result)"},{"line_number":1398,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"3fa7e38b_4e19b2cf","line":1395,"range":{"start_line":1395,"start_character":12,"end_line":1395,"end_character":53},"in_reply_to":"3fa7e38b_95e25901","updated":"2020-02-13 15:15:59.000000000","message":"I have some concerns about the DB read operation done inside this method.\n\nIMO, this DB read operation is not needed because in L1378 you are reading first the SGs for this port. My proposal is to modify \"_get_security_groups_on_port\" to return the requested_sgs_id and the valid_sgs. E.g.: http://paste.openstack.org/show/789528/. There you are returning the list of SG objects related to this port.\n\nThen here you can pass this list and implement \"_validate_sgs_for_port\" in this way: http://paste.openstack.org/show/789529/\n\nThis will reduce the number of times we access to the DB and we\u0027ll keep the API performance similar to previous versions.\n\nBTW, this has a collateral effect: the UT failing will pass.","commit_id":"79cc605c989b63c739a36b5097cbefa901ef6355"}],"releasenotes/notes/dvr-ovs-agent-6052a8d60fddde22.yaml":[{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"86b3cbe6ee814397274d196801243713b95d6af4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":49,"id":"1fa4df85_3c5aeef2","updated":"2020-02-28 13:47:31.000000000","message":"Deleting this seems unrelated and wrong, error from rebasing?","commit_id":"e4446df6976a67b9667ab637cfb638f3bb697b70"},{"author":{"_account_id":26106,"name":"Tom Stappaerts","email":"tom.stappaerts@nokia.com","username":"TomStappaerts"},"change_message_id":"e43a015c8b9d74b2e45424d733e694ebb1a33707","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":49,"id":"1fa4df85_7a84e65e","in_reply_to":"1fa4df85_3c5aeef2","updated":"2020-02-28 15:06:41.000000000","message":"Thanks for catching!","commit_id":"e4446df6976a67b9667ab637cfb638f3bb697b70"}],"releasenotes/notes/stateful-security-group-04b2902ed9c44e4f.yaml":[{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"bad38173b3d8fb62e92c093d6cdc789293bb9cd2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Support stateless security groups."},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"features:"},{"line_number":6,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":26,"id":"3fa7e38b_0b0c21e9","line":3,"updated":"2020-01-07 19:55:11.000000000","message":"Keep in mind that the contents of this file are not kept together - they are all batched by type.  So for example your feature string will be put in an unordered \u0027Features\u0027 section along with all the other features, and later there will be an \u0027Upgrades\u0027 section that will have your upgrades string in it.\n\nYou also need to note that this is for iptables_hybrid and not OVS or OVN firewall drivers.\n\nThe practical upshot of this is that each of your lines needs to be self-sufficient.  So I would delete the prelude and change the features to read: \"Added support for a new stateless security group api extension that implements stateless security groups for the iptables_hybrid firewall driver.\"  The upgrade line is probably fine as is.","commit_id":"76c8510b305df1b74d0709d5e1814e800acce351"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"80d7064fad064e8fb0759e5575ffa205c0667f11","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude: \u003e"},{"line_number":3,"context_line":"    Support stateless security groups."},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"features:"},{"line_number":6,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":26,"id":"3fa7e38b_d286b1ba","line":3,"in_reply_to":"3fa7e38b_0b0c21e9","updated":"2020-01-08 10:32:24.000000000","message":"Done","commit_id":"76c8510b305df1b74d0709d5e1814e800acce351"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b8b135e3a8fee3ac4c3ee5e24e8ddc0cda3d416d","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for a new stateless secuity group api extension that"},{"line_number":5,"context_line":"    implements stateless securty groups for the ip_tables_hybrid firewall"},{"line_number":6,"context_line":"    driver."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_cbb5661b","line":5,"range":{"start_line":5,"start_character":48,"end_line":5,"end_character":64},"updated":"2020-01-13 10:00:11.000000000","message":"s/ip_tables/iptables\nand also in neutron/agent/linux/iptables_firewall.py I see that it\u0027s implemented for iptables driver. This driver is base for iptables_hybrid but it is also used e.g. by linuxbridge agent. So it should be mentioned that this is implemented for both iptables drivers IMO.\n\nAlso, what about openvswitch fw driver and ovn solutions? Do You have plans to implement this feature for those too? Or if not, how it will work in such case? Will this parameter be silently ignored by such drivers and rules will be applied as stateful always?","commit_id":"1bd9daa0cba9b1513fcf608d7103b07d2d21540f"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"b8b135e3a8fee3ac4c3ee5e24e8ddc0cda3d416d","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for a new stateless secuity group api extension that"},{"line_number":5,"context_line":"    implements stateless securty groups for the ip_tables_hybrid firewall"},{"line_number":6,"context_line":"    driver."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_0bbcde05","line":5,"range":{"start_line":5,"start_character":25,"end_line":5,"end_character":32},"updated":"2020-01-13 10:00:11.000000000","message":"s/securty/security","commit_id":"1bd9daa0cba9b1513fcf608d7103b07d2d21540f"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"ab7d6d31ae604b136aebb843c98331f7560beb57","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for a new stateless secuity group api extension that"},{"line_number":5,"context_line":"    implements stateless securty groups for the ip_tables_hybrid firewall"},{"line_number":6,"context_line":"    driver."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_7e14dc50","line":5,"range":{"start_line":5,"start_character":48,"end_line":5,"end_character":64},"in_reply_to":"3fa7e38b_083b32c9","updated":"2020-01-17 12:52:57.000000000","message":"when the user sets stateful to false with OVN, then the rules will still be stateful as OVN does not know about stateful attribute.","commit_id":"1bd9daa0cba9b1513fcf608d7103b07d2d21540f"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c0da8b2d9b061f4abe104094b4406f1a89b4ee13","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for a new stateless secuity group api extension that"},{"line_number":5,"context_line":"    implements stateless securty groups for the ip_tables_hybrid firewall"},{"line_number":6,"context_line":"    driver."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_083b32c9","line":5,"range":{"start_line":5,"start_character":48,"end_line":5,"end_character":64},"in_reply_to":"3fa7e38b_2b2e7af9","updated":"2020-01-17 09:06:30.000000000","message":"yes, but my question was more about case like when e.g. ovn driver is used and someone creates security group with stateful\u003dFalse. How it will work in such case? Should we maybe think about some validation like we have e.g. in QoS rules and raise error in API in such case? Or silently ignore it and apply such rule as statefull on the backend?","commit_id":"1bd9daa0cba9b1513fcf608d7103b07d2d21540f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"853759331329178e54749e4be7f5ce6b4bb0f30b","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for a new stateless secuity group api extension that"},{"line_number":5,"context_line":"    implements stateless securty groups for the ip_tables_hybrid firewall"},{"line_number":6,"context_line":"    driver."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_3ed2b6ff","line":5,"range":{"start_line":5,"start_character":48,"end_line":5,"end_character":64},"in_reply_to":"3fa7e38b_636f3c93","updated":"2020-01-21 15:44:04.000000000","message":"For what it\u0027s worth the trunk plugin has logic to check support/compatibility of an extension by a mech driver. However that would be a completely different design to how this change looks today. At ps36 I would not push for such a redesign.","commit_id":"1bd9daa0cba9b1513fcf608d7103b07d2d21540f"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"4d2a38d4d6103dd3da17ae0db0f3e8706cf39a93","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for a new stateless secuity group api extension that"},{"line_number":5,"context_line":"    implements stateless securty groups for the ip_tables_hybrid firewall"},{"line_number":6,"context_line":"    driver."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_b4756588","line":5,"range":{"start_line":5,"start_character":48,"end_line":5,"end_character":64},"in_reply_to":"3fa7e38b_636f3c93","updated":"2020-01-21 16:38:45.000000000","message":"I now added it to the security section of the release notes.","commit_id":"1bd9daa0cba9b1513fcf608d7103b07d2d21540f"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"7bdeb021ad7d68f0f88696253ba7a848fc2e554c","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for a new stateless secuity group api extension that"},{"line_number":5,"context_line":"    implements stateless securty groups for the ip_tables_hybrid firewall"},{"line_number":6,"context_line":"    driver."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_636f3c93","line":5,"range":{"start_line":5,"start_character":48,"end_line":5,"end_character":64},"in_reply_to":"3fa7e38b_7e14dc50","updated":"2020-01-21 11:58:41.000000000","message":"that\u0027s not perfect for sure but probably as \"first step\" it can be like that.\nWe should only at least document this behaviour properly. Maybe You should add some note about stateful/stateless SG rules to our docs, e.g. https://docs.openstack.org/neutron/latest/contributor/internals/security_group_api.html","commit_id":"1bd9daa0cba9b1513fcf608d7103b07d2d21540f"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"fab9e35173af4cc214eee03c099edd1cb42c1db7","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for a new stateless secuity group api extension that"},{"line_number":5,"context_line":"    implements stateless securty groups for the ip_tables_hybrid firewall"},{"line_number":6,"context_line":"    driver."},{"line_number":7,"context_line":"upgrade:"},{"line_number":8,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":27,"id":"3fa7e38b_2b2e7af9","line":5,"range":{"start_line":5,"start_character":48,"end_line":5,"end_character":64},"in_reply_to":"3fa7e38b_cbb5661b","updated":"2020-01-13 11:13:52.000000000","message":"since the default value for stateful parameter is set to true, there should not be any issue for the drivers which do not support this. Currently there is no plan yet for solutions in OVN and fw driver.","commit_id":"1bd9daa0cba9b1513fcf608d7103b07d2d21540f"},{"author":{"_account_id":16385,"name":"Kris Sterckx","email":"kris.sterckx@nuagenetworks.net","username":"KrisSterckx"},"change_message_id":"240fee782fe8dec5d6aee0407aa9726455b32549","unresolved":false,"context_lines":[{"line_number":10,"context_line":"security:"},{"line_number":11,"context_line":"  - |"},{"line_number":12,"context_line":"    The \"stateless security group\" feature does not work with"},{"line_number":13,"context_line":"    OVN driver as the driver is not aware of the \"stateful\" atrribute"},{"line_number":14,"context_line":"    in the security group. If \"stateful\" atrribute is provided with a \"false\""},{"line_number":15,"context_line":"    value then the attribute value is ignored and the security group would"},{"line_number":16,"context_line":"    behave as stateful."}],"source_content_type":"text/x-yaml","patch_set":38,"id":"3fa7e38b_5cdd05dc","line":13,"updated":"2020-01-24 16:15:58.000000000","message":"attribute","commit_id":"53d5625d669cb9923432d412d112282d8ce13700"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"aa602bca78373db20f1297b1bab577d4482d3162","unresolved":false,"context_lines":[{"line_number":10,"context_line":"security:"},{"line_number":11,"context_line":"  - |"},{"line_number":12,"context_line":"    The \"stateless security group\" feature does not work with"},{"line_number":13,"context_line":"    OVN driver as the driver is not aware of the \"stateful\" atrribute"},{"line_number":14,"context_line":"    in the security group. If \"stateful\" atrribute is provided with a \"false\""},{"line_number":15,"context_line":"    value then the attribute value is ignored and the security group would"},{"line_number":16,"context_line":"    behave as stateful."}],"source_content_type":"text/x-yaml","patch_set":38,"id":"3fa7e38b_31006003","line":13,"in_reply_to":"3fa7e38b_5cdd05dc","updated":"2020-01-27 14:38:23.000000000","message":"Done","commit_id":"53d5625d669cb9923432d412d112282d8ce13700"},{"author":{"_account_id":16385,"name":"Kris Sterckx","email":"kris.sterckx@nuagenetworks.net","username":"KrisSterckx"},"change_message_id":"240fee782fe8dec5d6aee0407aa9726455b32549","unresolved":false,"context_lines":[{"line_number":11,"context_line":"  - |"},{"line_number":12,"context_line":"    The \"stateless security group\" feature does not work with"},{"line_number":13,"context_line":"    OVN driver as the driver is not aware of the \"stateful\" atrribute"},{"line_number":14,"context_line":"    in the security group. If \"stateful\" atrribute is provided with a \"false\""},{"line_number":15,"context_line":"    value then the attribute value is ignored and the security group would"},{"line_number":16,"context_line":"    behave as stateful."}],"source_content_type":"text/x-yaml","patch_set":38,"id":"3fa7e38b_7cd801ec","line":14,"updated":"2020-01-24 16:15:58.000000000","message":"attribute\n\nalso, should be False maybe","commit_id":"53d5625d669cb9923432d412d112282d8ce13700"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"aa602bca78373db20f1297b1bab577d4482d3162","unresolved":false,"context_lines":[{"line_number":11,"context_line":"  - |"},{"line_number":12,"context_line":"    The \"stateless security group\" feature does not work with"},{"line_number":13,"context_line":"    OVN driver as the driver is not aware of the \"stateful\" atrribute"},{"line_number":14,"context_line":"    in the security group. If \"stateful\" atrribute is provided with a \"false\""},{"line_number":15,"context_line":"    value then the attribute value is ignored and the security group would"},{"line_number":16,"context_line":"    behave as stateful."}],"source_content_type":"text/x-yaml","patch_set":38,"id":"3fa7e38b_91059417","line":14,"in_reply_to":"3fa7e38b_7cd801ec","updated":"2020-01-27 14:38:23.000000000","message":"Done","commit_id":"53d5625d669cb9923432d412d112282d8ce13700"},{"author":{"_account_id":16385,"name":"Kris Sterckx","email":"kris.sterckx@nuagenetworks.net","username":"KrisSterckx"},"change_message_id":"cfb791ba3b0db8641870219146fe6dd69bd4d466","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for a new stateless secuity group api extension that"},{"line_number":5,"context_line":"    implements stateless security groups for the iptables drivers."},{"line_number":6,"context_line":"upgrade:"},{"line_number":7,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":39,"id":"3fa7e38b_7691d144","line":4,"updated":"2020-01-28 22:16:50.000000000","message":"security","commit_id":"428dd03f30d95f3a53c7e6ff66407059ce2d2b8b"},{"author":{"_account_id":16385,"name":"Kris Sterckx","email":"kris.sterckx@nuagenetworks.net","username":"KrisSterckx"},"change_message_id":"cfb791ba3b0db8641870219146fe6dd69bd4d466","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for a new stateless secuity group api extension that"},{"line_number":5,"context_line":"    implements stateless security groups for the iptables drivers."},{"line_number":6,"context_line":"upgrade:"},{"line_number":7,"context_line":"  - |"},{"line_number":8,"context_line":"    Currently existing security groups will all be set to stateful during"}],"source_content_type":"text/x-yaml","patch_set":39,"id":"3fa7e38b_369fd951","line":5,"updated":"2020-01-28 22:16:50.000000000","message":"Add info about new \"stateful\" attribute here?","commit_id":"428dd03f30d95f3a53c7e6ff66407059ce2d2b8b"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"33c74e432c129be334062f045be5a337ffcf724e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for a new stateless secuity group api extension that"},{"line_number":5,"context_line":"    implements stateless security groups for the iptables drivers."},{"line_number":6,"context_line":"upgrade:"},{"line_number":7,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":40,"id":"3fa7e38b_e73bc632","line":4,"range":{"start_line":4,"start_character":24,"end_line":4,"end_character":65},"updated":"2020-01-29 14:28:02.000000000","message":"The api extension is stateful-security-group.","commit_id":"33e4d9652d74c8e94165151a539bbb22213e8124"},{"author":{"_account_id":24919,"name":"aditya_reddy.nagaram@nuagenetworks.net","display_name":"Aditya Reddy Nagaram","email":"aditya_reddy.nagaram@nuagenetworks.net","username":"adityarn"},"change_message_id":"e95488257ef636bb9b4ef48fe54acf37468e9524","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for a new stateless secuity group api extension that"},{"line_number":5,"context_line":"    implements stateless security groups for the iptables drivers."},{"line_number":6,"context_line":"upgrade:"},{"line_number":7,"context_line":"  - |"}],"source_content_type":"text/x-yaml","patch_set":40,"id":"3fa7e38b_523cd38f","line":4,"range":{"start_line":4,"start_character":24,"end_line":4,"end_character":65},"in_reply_to":"3fa7e38b_e73bc632","updated":"2020-01-29 16:58:24.000000000","message":"Done","commit_id":"33e4d9652d74c8e94165151a539bbb22213e8124"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"4947d6a39cfe0a0fa0649375f9e6e9776493c63c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for a new stateful-security-group api extension that"},{"line_number":5,"context_line":"    implements stateless security groups for the iptables drivers."}],"source_content_type":"text/x-yaml","patch_set":48,"id":"1fa4df85_32cf7cb1","line":2,"updated":"2020-02-28 09:51:12.000000000","message":"I think that this is pretty big new feature which deserves also for \"prelude\" section.","commit_id":"03eb6eb2b98558264e2f32a65b699397d6cb832d"},{"author":{"_account_id":26106,"name":"Tom Stappaerts","email":"tom.stappaerts@nokia.com","username":"TomStappaerts"},"change_message_id":"9dc1305aabc6e256fd574cdcde6a8590b8eaded3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support for a new stateful-security-group api extension that"},{"line_number":5,"context_line":"    implements stateless security groups for the iptables drivers."}],"source_content_type":"text/x-yaml","patch_set":48,"id":"1fa4df85_e98c9a80","line":2,"in_reply_to":"1fa4df85_32cf7cb1","updated":"2020-02-28 12:25:48.000000000","message":"ok, let me know if that suffices :)","commit_id":"03eb6eb2b98558264e2f32a65b699397d6cb832d"},{"author":{"_account_id":13252,"name":"Dr. Jens Harbott","display_name":"Jens Harbott (frickler)","email":"frickler@offenerstapel.de","username":"jrosenboom"},"change_message_id":"86b3cbe6ee814397274d196801243713b95d6af4","unresolved":false,"context_lines":[{"line_number":13,"context_line":"security:"},{"line_number":14,"context_line":"  - |"},{"line_number":15,"context_line":"    The \"stateless security group\" feature does not work with"},{"line_number":16,"context_line":"    OVN driver as the driver is not aware of the \"stateful\" attribute"},{"line_number":17,"context_line":"    in the security group. If \"stateful\" attribute is provided with a \"False\""},{"line_number":18,"context_line":"    value then the attribute value is ignored and the security group would"},{"line_number":19,"context_line":"    behave as stateful."}],"source_content_type":"text/x-yaml","patch_set":49,"id":"1fa4df85_3c0f4ee2","line":16,"range":{"start_line":16,"start_character":4,"end_line":16,"end_character":7},"updated":"2020-02-28 13:47:31.000000000","message":"It also doesn\u0027t seem to work with the OVS native driver, is that correct? If yes, should likely be added here.","commit_id":"e4446df6976a67b9667ab637cfb638f3bb697b70"},{"author":{"_account_id":26106,"name":"Tom Stappaerts","email":"tom.stappaerts@nokia.com","username":"TomStappaerts"},"change_message_id":"e43a015c8b9d74b2e45424d733e694ebb1a33707","unresolved":false,"context_lines":[{"line_number":13,"context_line":"security:"},{"line_number":14,"context_line":"  - |"},{"line_number":15,"context_line":"    The \"stateless security group\" feature does not work with"},{"line_number":16,"context_line":"    OVN driver as the driver is not aware of the \"stateful\" attribute"},{"line_number":17,"context_line":"    in the security group. If \"stateful\" attribute is provided with a \"False\""},{"line_number":18,"context_line":"    value then the attribute value is ignored and the security group would"},{"line_number":19,"context_line":"    behave as stateful."}],"source_content_type":"text/x-yaml","patch_set":49,"id":"1fa4df85_9a876262","line":16,"range":{"start_line":16,"start_character":4,"end_line":16,"end_character":7},"in_reply_to":"1fa4df85_3c0f4ee2","updated":"2020-02-28 15:06:41.000000000","message":"Indeed","commit_id":"e4446df6976a67b9667ab637cfb638f3bb697b70"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c19a30da2b47c483edd89265cc95e312c5d46759","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support to create stateless security groups."},{"line_number":5,"context_line":"features:"}],"source_content_type":"text/x-yaml","patch_set":50,"id":"1fa4df85_5e3555f6","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":8},"updated":"2020-02-29 14:28:41.000000000","message":"To avoid the reno error, you need to format this section like this:\n\nprelude: \u003e","commit_id":"dd469ed336bccc4b2a9cbd491c8f9025d8862a83"},{"author":{"_account_id":26106,"name":"Tom Stappaerts","email":"tom.stappaerts@nokia.com","username":"TomStappaerts"},"change_message_id":"7f59f2eeae9a6d5d043c75c59d734fb0ac7ca87b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"prelude:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Added support to create stateless security groups."},{"line_number":5,"context_line":"features:"}],"source_content_type":"text/x-yaml","patch_set":50,"id":"1fa4df85_c2e2c301","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":8},"in_reply_to":"1fa4df85_5e3555f6","updated":"2020-03-02 10:51:10.000000000","message":"thx!","commit_id":"dd469ed336bccc4b2a9cbd491c8f9025d8862a83"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"bc30cc2a8cb009c81ca9ec3a1866c20bbc512b8d","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    the alembic migration."},{"line_number":12,"context_line":"security:"},{"line_number":13,"context_line":"  - |"},{"line_number":14,"context_line":"    The \"stateless security group\" feature does not work with"},{"line_number":15,"context_line":"    OVS nor OVN driver as the driver is not aware of the \"stateful\" attribute"},{"line_number":16,"context_line":"    in the security group. If \"stateful\" attribute is provided with a \"False\""},{"line_number":17,"context_line":"    value then the attribute value is ignored and the security group would"}],"source_content_type":"text/x-yaml","patch_set":52,"id":"1fa4df85_adce812a","line":14,"range":{"start_line":14,"start_character":8,"end_line":14,"end_character":34},"updated":"2020-03-03 10:56:40.000000000","message":"sorry for yet another late nit but You should use `` `` instead of \" \" to highlight something in rendered release notes","commit_id":"b2fcce010123082cd4af691902dd3518c2963e7e"}]}
