)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"change_message_id":"4b1aaed6a788b3cf741e4df7c4aae631c52144e7","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"FWaaS integration with service type framewrok"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch is submitted for discussion."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"The patch integrate FWaaS to service type framework. \u0027provider\u0027"},{"line_number":12,"context_line":"attribute can be specified when the firewall is created"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"AAAAUH%2F94FA%3D","line":9,"updated":"2014-02-02 20:09:28.000000000","message":"can we remove the above line?","commit_id":"d68aa32a66f2ab32e19cc2260429cfc4267dcd34"}],"etc/neutron.conf":[{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"change_message_id":"4b1aaed6a788b3cf741e4df7c4aae631c52144e7","unresolved":false,"context_lines":[{"line_number":395,"context_line":"# Otherwise comment the HA Proxy line"},{"line_number":396,"context_line":"#service_provider \u003d LOADBALANCER:Radware:neutron.services.loadbalancer.drivers.radware.driver.LoadBalancerDriver:default"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"service_provider\u003dFIREWALL:IPTables:neutron.services.firewall.plugin_drivers.l3reference.firewall_l3_driver.FirewallL3Driver:default"}],"source_content_type":"text/plain","patch_set":5,"id":"AAAAUH%2F94FE%3D","line":398,"updated":"2014-02-02 20:09:28.000000000","message":"shouldn\u0027t this be commented out here, with default config being set to this?","commit_id":"d68aa32a66f2ab32e19cc2260429cfc4267dcd34"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"4c6f0fefcbba4bd5de89fa9aa969c265591a73b6","unresolved":false,"context_lines":[{"line_number":395,"context_line":"# Otherwise comment the HA Proxy line"},{"line_number":396,"context_line":"#service_provider \u003d LOADBALANCER:Radware:neutron.services.loadbalancer.drivers.radware.driver.LoadBalancerDriver:default"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"service_provider\u003dFIREWALL:IPTables:neutron.services.firewall.plugin_drivers.l3reference.firewall_l3_driver.FirewallL3Driver:default"}],"source_content_type":"text/plain","patch_set":5,"id":"AAAAUH%2F93Nk%3D","line":398,"in_reply_to":"AAAAUH%2F94FE%3D","updated":"2014-02-03 06:42:18.000000000","message":"My understanding is this file is used by devstack when initiating Neutron. I think setting the default to be the reference driver is right.","commit_id":"d68aa32a66f2ab32e19cc2260429cfc4267dcd34"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"change_message_id":"addb64ec23f40c7c9163ac1810c280428ced05f7","unresolved":false,"context_lines":[{"line_number":395,"context_line":"# Otherwise comment the HA Proxy line"},{"line_number":396,"context_line":"#service_provider \u003d LOADBALANCER:Radware:neutron.services.loadbalancer.drivers.radware.driver.LoadBalancerDriver:default"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"service_provider\u003dFIREWALL:IPTables:neutron.services.firewall.plugin_drivers.l3reference.firewall_l3_driver.FirewallL3Driver:default"}],"source_content_type":"text/plain","patch_set":6,"id":"AAAAUH%2F9lFg%3D","line":398,"updated":"2014-02-05 22:15:13.000000000","message":"Per our earlier discussion I think this probably needs to be commented out (like in the LBaaS case) and then have devstack configure it.\n\nAlso, I we probably need to add a DocImpact tag here assuming we have to make changes to admin guide to indicate the new method of configuring the driver.","commit_id":"2c8d4236d69ce3094a649518015cd2f34477dc6a"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"change_message_id":"1c889e4e5dc8b0b43a067daa72dfd8fe02d25d0f","unresolved":false,"context_lines":[{"line_number":394,"context_line":"# If you want to keep the HA Proxy as the default lbaas driver, remove the attribute default from the line below."},{"line_number":395,"context_line":"# Otherwise comment the HA Proxy line"},{"line_number":396,"context_line":"#service_provider \u003d LOADBALANCER:Radware:neutron.services.loadbalancer.drivers.radware.driver.LoadBalancerDriver:default"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"service_provider\u003dFIREWALL:IPTables:neutron.services.firewall.plugin_drivers.l3reference.firewall_l3_driver.FirewallL3Driver:default"}],"source_content_type":"text/plain","patch_set":9,"id":"AAAAUX%2F%2FIL8%3D","line":397,"updated":"2014-02-16 18:16:20.000000000","message":"Can we add a line of comment here (so that there is no confusion with the security groups firewall driver):\n\n  #Default driver for FWaaS, performs IPTables configuration on Neutron router\u0027s internal interfaces, filters traffic going into and out of the subnet","commit_id":"a515dfc2a4313729e705a6f0e9436da97b11bbdf"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"change_message_id":"00da45f6114f0b20800a7db86e8877658ec2265d","unresolved":false,"context_lines":[{"line_number":394,"context_line":"# If you want to keep the HA Proxy as the default lbaas driver, remove the attribute default from the line below."},{"line_number":395,"context_line":"# Otherwise comment the HA Proxy line"},{"line_number":396,"context_line":"#service_provider \u003d LOADBALANCER:Radware:neutron.services.loadbalancer.drivers.radware.driver.LoadBalancerDriver:default"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"service_provider\u003dFIREWALL:IPTables:neutron.services.firewall.plugin_drivers.l3reference.firewall_l3_driver.FirewallL3Driver:default"}],"source_content_type":"text/plain","patch_set":9,"id":"AAAAUX%2F%2FHoo%3D","line":397,"in_reply_to":"AAAAUX%2F%2FIHw%3D","updated":"2014-02-17 00:37:59.000000000","message":"Actually, I confused this with the agent side driver. I think this should read as:\n\n  #Default plugin side driver for FWaaS, interacts with the agent side driver that performs IPTables configuration on Neutron router\u0027s internal interfaces and filters traffic going into and out of the subnet","commit_id":"a515dfc2a4313729e705a6f0e9436da97b11bbdf"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"bf0330efc59f7ce796579ea6616514d39ff7431c","unresolved":false,"context_lines":[{"line_number":394,"context_line":"# If you want to keep the HA Proxy as the default lbaas driver, remove the attribute default from the line below."},{"line_number":395,"context_line":"# Otherwise comment the HA Proxy line"},{"line_number":396,"context_line":"#service_provider \u003d LOADBALANCER:Radware:neutron.services.loadbalancer.drivers.radware.driver.LoadBalancerDriver:default"},{"line_number":397,"context_line":""},{"line_number":398,"context_line":"service_provider\u003dFIREWALL:IPTables:neutron.services.firewall.plugin_drivers.l3reference.firewall_l3_driver.FirewallL3Driver:default"}],"source_content_type":"text/plain","patch_set":9,"id":"AAAAUX%2F%2FIHw%3D","line":397,"in_reply_to":"AAAAUX%2F%2FIL8%3D","updated":"2014-02-16 19:26:06.000000000","message":"OK.","commit_id":"a515dfc2a4313729e705a6f0e9436da97b11bbdf"}],"neutron/db/firewall/firewall_db.py":[{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"change_message_id":"4b1aaed6a788b3cf741e4df7c4aae631c52144e7","unresolved":false,"context_lines":[{"line_number":129,"context_line":"               \u0027admin_state_up\u0027: fw[\u0027admin_state_up\u0027],"},{"line_number":130,"context_line":"               \u0027status\u0027: fw[\u0027status\u0027],"},{"line_number":131,"context_line":"               \u0027firewall_policy_id\u0027: fw[\u0027firewall_policy_id\u0027],"},{"line_number":132,"context_line":"               \u0027provider\u0027: \u0027\u0027}"},{"line_number":133,"context_line":"        if fw.provider:"},{"line_number":134,"context_line":"            res[\u0027provider\u0027] \u003d fw.provider.provider_name"},{"line_number":135,"context_line":"        return self._fields(res, fields)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F94EU%3D","line":132,"updated":"2014-02-02 20:09:28.000000000","message":"perhaps we don\u0027t want to do the above? If provider is not set, we don\u0027t populate it...","commit_id":"d68aa32a66f2ab32e19cc2260429cfc4267dcd34"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"d6541e9ec69ec446432242d1b7be5522f89410a1","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                                   sa.ForeignKey(\u0027firewall_policies.id\u0027),"},{"line_number":71,"context_line":"                                   nullable\u003dTrue)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    provider \u003d orm.relationship("},{"line_number":74,"context_line":"        st_db.ProviderResourceAssociation,"},{"line_number":75,"context_line":"        cascade\u003d\u0027all, delete-orphan\u0027,"},{"line_number":76,"context_line":"        uselist\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F9gbQ%3D","line":73,"updated":"2014-02-06 13:49:04.000000000","message":"even though this patch doesn\u0027t introduce schema change, there should be some sort of migration added to create associations to yet unassociated resources. Otherwise it seems that existing resources will be inaccessible.\nI think the approach needs to be discussed.","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"165c8779b0e9a056998aa0ca3ee781dc317717de","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                                   sa.ForeignKey(\u0027firewall_policies.id\u0027),"},{"line_number":71,"context_line":"                                   nullable\u003dTrue)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    provider \u003d orm.relationship("},{"line_number":74,"context_line":"        st_db.ProviderResourceAssociation,"},{"line_number":75,"context_line":"        cascade\u003d\u0027all, delete-orphan\u0027,"},{"line_number":76,"context_line":"        uselist\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FgIQ%3D","line":73,"in_reply_to":"AAAAUH%2F9aNk%3D","updated":"2014-02-12 18:57:03.000000000","message":"ok, i\u0027m fine with that.","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"c8b2c4c90cdc3e4dd64f2b359fd67f614ec31f00","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                                   sa.ForeignKey(\u0027firewall_policies.id\u0027),"},{"line_number":71,"context_line":"                                   nullable\u003dTrue)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    provider \u003d orm.relationship("},{"line_number":74,"context_line":"        st_db.ProviderResourceAssociation,"},{"line_number":75,"context_line":"        cascade\u003d\u0027all, delete-orphan\u0027,"},{"line_number":76,"context_line":"        uselist\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F9aNk%3D","line":73,"in_reply_to":"AAAAUH%2F9bkU%3D","updated":"2014-02-07 04:18:22.000000000","message":"I agree with Sumit about his suggestion on FWaaS. It\u0027s a more important problem to my other patch on L3 service.\n\nI am thinking if it\u0027s OK to associate the resource to the default provider. For installation that use the plugin that doesn\u0027t support service framework, the plugin will just ignore the provider parameter; if the plugin wants to move to service framework, then the vendor should handle upgrade and associate those currently un-associated resources to their own provider.\n\nIs it a possible approach?","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"change_message_id":"d2eddde82a6183576834e03243a9121cdfc5b20f","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                                   sa.ForeignKey(\u0027firewall_policies.id\u0027),"},{"line_number":71,"context_line":"                                   nullable\u003dTrue)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    provider \u003d orm.relationship("},{"line_number":74,"context_line":"        st_db.ProviderResourceAssociation,"},{"line_number":75,"context_line":"        cascade\u003d\u0027all, delete-orphan\u0027,"},{"line_number":76,"context_line":"        uselist\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F9bkU%3D","line":73,"in_reply_to":"AAAAUH%2F9cOA%3D","updated":"2014-02-06 23:20:59.000000000","message":"Thanks Eugene. I understand your concern a little better now and I believe it has to do with migrations related to existing installations. However, FWaaS was experimental in Havana release, and I do not believe we have any deployments in production yet for which this change would break their deployment. So from that perspective I think we can ignore this.","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"80066e0f843145e6976b63cfd0411ad5c37f5f9d","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                                   sa.ForeignKey(\u0027firewall_policies.id\u0027),"},{"line_number":71,"context_line":"                                   nullable\u003dTrue)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    provider \u003d orm.relationship("},{"line_number":74,"context_line":"        st_db.ProviderResourceAssociation,"},{"line_number":75,"context_line":"        cascade\u003d\u0027all, delete-orphan\u0027,"},{"line_number":76,"context_line":"        uselist\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F9cOA%3D","line":73,"in_reply_to":"AAAAUH%2F9dcA%3D","updated":"2014-02-06 21:54:25.000000000","message":"Sumit, it was not exactly similar, however I agree that the problem could have addressed better in lbaas then it was in that commit.\nSo for LBaaS we require admin to have no lbaas resources (pools) prior to migration from grizzly to havana. That\u0027s not the best solution of course.\n\nSo here we either need to do the same for example associate all existing fwaas resources to a default provider.\nAs far as I recall, the discussion was around such move: do we associate with default one automatically? It it desirable? What if there is several providers, but no default one. So we haven\u0027t reach consensus for lbaas on that and decided to provide more strict requirement.","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"change_message_id":"f45cc4a6ccf2f44bcacd7b81f8ce22c0a002ed45","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                                   sa.ForeignKey(\u0027firewall_policies.id\u0027),"},{"line_number":71,"context_line":"                                   nullable\u003dTrue)"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    provider \u003d orm.relationship("},{"line_number":74,"context_line":"        st_db.ProviderResourceAssociation,"},{"line_number":75,"context_line":"        cascade\u003d\u0027all, delete-orphan\u0027,"},{"line_number":76,"context_line":"        uselist\u003dFalse,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F9dcA%3D","line":73,"in_reply_to":"AAAAUH%2F9gbQ%3D","updated":"2014-02-06 19:06:59.000000000","message":"We seem to have introduced a similar change to LBaaS without having to provide a db migration:\n https://github.com/openstack/neutron/commit/88dd89b2ff68db9ce58078f0adf0bb4b5a789918\n\nAren\u0027t the associations you are referring to in the ORM layer, and if so shouldn\u0027t this work without have to do anything more? Just trying to understand...","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"3c0cf66a4692fabd5c5798a5f5ad40af4a129859","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        st_db.ProviderResourceAssociation,"},{"line_number":75,"context_line":"        cascade\u003d\u0027all, delete-orphan\u0027,"},{"line_number":76,"context_line":"        uselist\u003dFalse,"},{"line_number":77,"context_line":"        lazy\u003d\"joined\","},{"line_number":78,"context_line":"        primaryjoin\u003d\"Firewall.id\u003d\u003dProviderResourceAssociation.resource_id\","},{"line_number":79,"context_line":"        foreign_keys\u003d[st_db.ProviderResourceAssociation.resource_id]"},{"line_number":80,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2BopI%3D","line":77,"updated":"2014-02-20 03:49:03.000000000","message":"just want to know if we also need to add \u0027provider\u0027 field for firewall extension similar with practice like VPNaaS (https://review.openstack.org/#/c/41827/23/neutron/extensions/vpnaas.py) ?","commit_id":"97949c88f02e9885a42acbce9eb005e18612253b"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"32c35da23f80fd58fb650bd3654bcb7de8f38a5d","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        st_db.ProviderResourceAssociation,"},{"line_number":75,"context_line":"        cascade\u003d\u0027all, delete-orphan\u0027,"},{"line_number":76,"context_line":"        uselist\u003dFalse,"},{"line_number":77,"context_line":"        lazy\u003d\"joined\","},{"line_number":78,"context_line":"        primaryjoin\u003d\"Firewall.id\u003d\u003dProviderResourceAssociation.resource_id\","},{"line_number":79,"context_line":"        foreign_keys\u003d[st_db.ProviderResourceAssociation.resource_id]"},{"line_number":80,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAAUX%2F%2BnuY%3D","line":77,"in_reply_to":"AAAAUX%2F%2BopI%3D","updated":"2014-02-20 06:29:39.000000000","message":"Thanks. It was missed during cherry pick.","commit_id":"97949c88f02e9885a42acbce9eb005e18612253b"}],"neutron/services/firewall/fwaas_plugin.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"17e54995a29ac0ead1049ae3caf3a00785f26be9","unresolved":false,"context_lines":[{"line_number":19,"context_line":"# @author: Gary Duan, gduan@varmour.com, vArmour Networks"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron.api.v2 import attributes"},{"line_number":22,"context_line":"from neutron.common import exceptions as q_exc"},{"line_number":23,"context_line":"from neutron.db import api as qdbapi"},{"line_number":24,"context_line":"from neutron.db.firewall import firewall_db"},{"line_number":25,"context_line":"from neutron.db import servicetype_db as st_db"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9qCE%3D","line":22,"updated":"2013-12-09 08:09:59.000000000","message":"nit: n_exc","commit_id":"cf9258f1da0bfd3845cffc4c018b1de1eea0c7d9"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"17e54995a29ac0ead1049ae3caf3a00785f26be9","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from neutron.db import servicetype_db as st_db"},{"line_number":26,"context_line":"from neutron.extensions import firewall as fw_ext"},{"line_number":27,"context_line":"from neutron.openstack.common import log as logging"},{"line_number":28,"context_line":"from neutron.plugins.common import constants as consts"},{"line_number":29,"context_line":"from neutron.services import provider_configuration as pconf"},{"line_number":30,"context_line":"from neutron.services import service_base"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9p%2Fw%3D","line":28,"updated":"2013-12-09 08:09:59.000000000","message":"why changing from const to consts?","commit_id":"cf9258f1da0bfd3845cffc4c018b1de1eea0c7d9"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"17e54995a29ac0ead1049ae3caf3a00785f26be9","unresolved":false,"context_lines":[{"line_number":73,"context_line":"            msg \u003d _(\"Error retrieving provider for firewall %s\") % id"},{"line_number":74,"context_line":"            raise q_exc.Invalid(msg)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def _get_provider_name(self, context, firewall):"},{"line_number":77,"context_line":"        if (\u0027provider\u0027 in firewall and"},{"line_number":78,"context_line":"            firewall[\u0027provider\u0027] !\u003d attributes.ATTR_NOT_SPECIFIED):"},{"line_number":79,"context_line":"            p_name \u003d pconf.normalize_provider_name(firewall[\u0027provider\u0027])"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9qBM%3D","line":76,"updated":"2013-12-09 08:09:59.000000000","message":"I think this func should be moved to service_base, as it\u0027s  the same for all services","commit_id":"cf9258f1da0bfd3845cffc4c018b1de1eea0c7d9"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"17e54995a29ac0ead1049ae3caf3a00785f26be9","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                fw_db.status \u003d status"},{"line_number":112,"context_line":"                return True"},{"line_number":113,"context_line":"            else:"},{"line_number":114,"context_line":"                fw_db.status \u003d consts.ERROR"},{"line_number":115,"context_line":"                return False"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def firewall_deleted(self, context, firewall_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9qAg%3D","line":114,"updated":"2013-12-09 08:09:59.000000000","message":"can you please clarify why setting to ERROR if status is not ACTIVE or INACTIVE?","commit_id":"cf9258f1da0bfd3845cffc4c018b1de1eea0c7d9"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"3fc5586397249ca5f0a27a1038ae837f6254bfdd","unresolved":false,"context_lines":[{"line_number":111,"context_line":"                fw_db.status \u003d status"},{"line_number":112,"context_line":"                return True"},{"line_number":113,"context_line":"            else:"},{"line_number":114,"context_line":"                fw_db.status \u003d consts.ERROR"},{"line_number":115,"context_line":"                return False"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def firewall_deleted(self, context, firewall_id):"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9KOA%3D","line":114,"in_reply_to":"AAAATn%2F9qAg%3D","updated":"2013-12-20 03:08:08.000000000","message":"This is a callback function from firewall agent or plugin driver. If the given status is not as expected, it just sets the status to ERROR. It\u0027s the existing code logic.","commit_id":"cf9258f1da0bfd3845cffc4c018b1de1eea0c7d9"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"17e54995a29ac0ead1049ae3caf3a00785f26be9","unresolved":false,"context_lines":[{"line_number":167,"context_line":"        drivers \u003d dict()"},{"line_number":168,"context_line":"        for fw_id in fwp[\u0027firewall_list\u0027]:"},{"line_number":169,"context_line":"            driver \u003d self._get_driver(context, fw_id)"},{"line_number":170,"context_line":"            if not driver:"},{"line_number":171,"context_line":"                continue"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"            if driver in drivers:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9p%2Fk%3D","line":170,"updated":"2013-12-09 08:09:59.000000000","message":"seems this check not needed as _get_driver() will either return a driver or raise an exception","commit_id":"cf9258f1da0bfd3845cffc4c018b1de1eea0c7d9"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"165c8779b0e9a056998aa0ca3ee781dc317717de","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                                                            firewall_id)"},{"line_number":125,"context_line":"            return True"},{"line_number":126,"context_line":"        else:"},{"line_number":127,"context_line":"            fw_db.status \u003d const.ERROR"},{"line_number":128,"context_line":"            LOG.warn(_(\u0027Firewall %s is not in pending delete state.\u0027),"},{"line_number":129,"context_line":"                     firewall_id)"},{"line_number":130,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FgEc%3D","line":127,"updated":"2014-02-12 18:57:03.000000000","message":"i\u0027m not sure status will be updated here, because statement is not under transaction. It might make sense to wrap whole method into transaction rather then L121-124","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"831cdf187dd7c2a78a9ce1e4f4c2a4e7b9c645a8","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                                                            firewall_id)"},{"line_number":125,"context_line":"            return True"},{"line_number":126,"context_line":"        else:"},{"line_number":127,"context_line":"            fw_db.status \u003d const.ERROR"},{"line_number":128,"context_line":"            LOG.warn(_(\u0027Firewall %s is not in pending delete state.\u0027),"},{"line_number":129,"context_line":"                     firewall_id)"},{"line_number":130,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FeVM%3D","line":127,"in_reply_to":"AAAAUX%2F%2FgEc%3D","updated":"2014-02-12 23:09:22.000000000","message":"Will fix it.","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"165c8779b0e9a056998aa0ca3ee781dc317717de","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    def get_firewalls_for_driver(self, context, driver):"},{"line_number":133,"context_line":"        for p_name in self.drivers:"},{"line_number":134,"context_line":"            if self.drivers[p_name] \u003d\u003d driver:"},{"line_number":135,"context_line":"                return [fw for fw in self.get_firewalls(context)"},{"line_number":136,"context_line":"                        if fw[\u0027provider\u0027] \u003d\u003d p_name]"},{"line_number":137,"context_line":"        return []"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FgDc%3D","line":135,"updated":"2014-02-12 18:57:03.000000000","message":"that method is called from get_firewalls_for_tenant, but looks like it doesn\u0027t apply filtering by tenant_id","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"831cdf187dd7c2a78a9ce1e4f4c2a4e7b9c645a8","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    def get_firewalls_for_driver(self, context, driver):"},{"line_number":133,"context_line":"        for p_name in self.drivers:"},{"line_number":134,"context_line":"            if self.drivers[p_name] \u003d\u003d driver:"},{"line_number":135,"context_line":"                return [fw for fw in self.get_firewalls(context)"},{"line_number":136,"context_line":"                        if fw[\u0027provider\u0027] \u003d\u003d p_name]"},{"line_number":137,"context_line":"        return []"},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FeVQ%3D","line":135,"in_reply_to":"AAAAUX%2F%2FgDc%3D","updated":"2014-02-12 23:09:22.000000000","message":"Please see my comment in plugin_drivers/l3reference/firewall_l3_driver.py","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e27e587cdf0362c035cc4e3164049a1bf5d5023f","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    def _load_drivers(self):"},{"line_number":64,"context_line":"        \"\"\"Loads plugin-drivers specified in configuration.\"\"\""},{"line_number":65,"context_line":"        self.drivers, self.default_provider \u003d service_base.load_drivers("},{"line_number":66,"context_line":"            const.FIREWALL, self)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"    def _get_driver(self, context, id):"},{"line_number":69,"context_line":"        firewall \u003d self.get_firewall(context, id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2BuzE%3D","line":66,"updated":"2014-02-19 14:25:26.000000000","message":"You need to handle orphaned drivers here. See LBaaS/VPNaaS code for detail.","commit_id":"35d630adbdeaf22a6c2e0c3670cc00f11be49b93"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e27e587cdf0362c035cc4e3164049a1bf5d5023f","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    def _get_provider_name(self, context, firewall):"},{"line_number":77,"context_line":"        if (\u0027provider\u0027 in firewall and"},{"line_number":78,"context_line":"            firewall[\u0027provider\u0027] !\u003d attributes.ATTR_NOT_SPECIFIED):"},{"line_number":79,"context_line":"            p_name \u003d pconf.normalize_provider_name(firewall[\u0027provider\u0027])"},{"line_number":80,"context_line":"            if p_name not in self.drivers:"},{"line_number":81,"context_line":"                raise pconf.ServiceProviderNotFound("}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2Buyw%3D","line":78,"updated":"2014-02-19 14:25:26.000000000","message":"Please use api.v2.attributes.is_attr_set() method to determine the attribute is set.","commit_id":"35d630adbdeaf22a6c2e0c3670cc00f11be49b93"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e27e587cdf0362c035cc4e3164049a1bf5d5023f","unresolved":false,"context_lines":[{"line_number":104,"context_line":""},{"line_number":105,"context_line":"    def set_firewall_status(self, context, firewall_id, status):"},{"line_number":106,"context_line":"        \"\"\"driver uses this to set a firewall\u0027s status.\"\"\""},{"line_number":107,"context_line":"        LOG.debug(_(\"set_firewall_status() called\"))"},{"line_number":108,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":109,"context_line":"            fw_db \u003d self._get_firewall(context, firewall_id)"},{"line_number":110,"context_line":"            if status in (const.ACTIVE, const.INACTIVE):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2Buyc%3D","line":107,"updated":"2014-02-19 14:25:26.000000000","message":"How about using neutron.common.log.log?","commit_id":"35d630adbdeaf22a6c2e0c3670cc00f11be49b93"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e27e587cdf0362c035cc4e3164049a1bf5d5023f","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                         firewall_id)"},{"line_number":131,"context_line":"                return False"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def get_firewalls_for_driver(self, context, driver):"},{"line_number":134,"context_line":"        for p_name in self.drivers:"},{"line_number":135,"context_line":"            if self.drivers[p_name] \u003d\u003d driver:"},{"line_number":136,"context_line":"                return [fw for fw in self.get_firewalls(context)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2BuyM%3D","line":133,"updated":"2014-02-19 14:25:26.000000000","message":"I think this is a private method. If so, the method name should start with _.","commit_id":"35d630adbdeaf22a6c2e0c3670cc00f11be49b93"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"5f8bbff06153bfffd9aa180c60fbd08f52b8e35e","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                         firewall_id)"},{"line_number":131,"context_line":"                return False"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def get_firewalls_for_driver(self, context, driver):"},{"line_number":134,"context_line":"        for p_name in self.drivers:"},{"line_number":135,"context_line":"            if self.drivers[p_name] \u003d\u003d driver:"},{"line_number":136,"context_line":"                return [fw for fw in self.get_firewalls(context)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2Bl78%3D","line":133,"in_reply_to":"AAAAUX%2F%2BtGM%3D","updated":"2014-02-20 10:10:39.000000000","message":"Thanks for the clarification. I got it. Hopefully it is nice we have docstring for public methods, but it is just my preference.","commit_id":"35d630adbdeaf22a6c2e0c3670cc00f11be49b93"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"a899d53ec3187fcd4a5ba71f755c25bcc43fbbd2","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                         firewall_id)"},{"line_number":131,"context_line":"                return False"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def get_firewalls_for_driver(self, context, driver):"},{"line_number":134,"context_line":"        for p_name in self.drivers:"},{"line_number":135,"context_line":"            if self.drivers[p_name] \u003d\u003d driver:"},{"line_number":136,"context_line":"                return [fw for fw in self.get_firewalls(context)"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2BtGM%3D","line":133,"in_reply_to":"AAAAUX%2F%2BuyM%3D","updated":"2014-02-19 17:30:22.000000000","message":"Thanks for reviewing the patch. \n\nThis function is called in plugin_drivers/l3reference/firewall_l3_driver.py, also should be used by any plugin side driver to get a list of firewalls, so it\u0027s a public function.","commit_id":"35d630adbdeaf22a6c2e0c3670cc00f11be49b93"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"3f0083a3b5bc4cc98100978a6bca86ffed5a7284","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        if lost_providers:"},{"line_number":77,"context_line":"            msg \u003d _(\"Delete associated firewalls before removing \""},{"line_number":78,"context_line":"                    \"providers %s\") % list(lost_providers)"},{"line_number":79,"context_line":"            LOG.exception(msg)"},{"line_number":80,"context_line":"            raise SystemExit(msg)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _load_drivers(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2FjgM%3D","line":79,"updated":"2014-02-26 00:04:53.000000000","message":"Is this redundant, due to the SystemExit traceback and info?","commit_id":"be2899f12781ddadaafb0708112ef3192cf5a0a8"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"062c5bfeb869c26cf3e5798e8e1134fda4cebc71","unresolved":false,"context_lines":[{"line_number":76,"context_line":"        if lost_providers:"},{"line_number":77,"context_line":"            msg \u003d _(\"Delete associated firewalls before removing \""},{"line_number":78,"context_line":"                    \"providers %s\") % list(lost_providers)"},{"line_number":79,"context_line":"            LOG.exception(msg)"},{"line_number":80,"context_line":"            raise SystemExit(msg)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _load_drivers(self):"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2FjN4%3D","line":79,"in_reply_to":"AAAAU3%2F%2FjgM%3D","updated":"2014-02-26 07:05:46.000000000","message":"For this one, I just copied the code from LBaaS and VPNaaS.","commit_id":"be2899f12781ddadaafb0708112ef3192cf5a0a8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"3f0083a3b5bc4cc98100978a6bca86ffed5a7284","unresolved":false,"context_lines":[{"line_number":186,"context_line":"            self._ensure_update_firewall_policy(context,"},{"line_number":187,"context_line":"                                                fw_rule[\u0027firewall_policy_id\u0027])"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    \u0027\u0027\u0027 One firewall policy can be used by firewalls of different providers."},{"line_number":190,"context_line":"    This function is to return a map of drivers with firewalls that are"},{"line_number":191,"context_line":"    associated with the policy."},{"line_number":192,"context_line":"    \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fjgs%3D","line":189,"updated":"2014-02-26 00:04:53.000000000","message":"Move down inside of function as a docstring. Use double quotes.","commit_id":"be2899f12781ddadaafb0708112ef3192cf5a0a8"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"062c5bfeb869c26cf3e5798e8e1134fda4cebc71","unresolved":false,"context_lines":[{"line_number":186,"context_line":"            self._ensure_update_firewall_policy(context,"},{"line_number":187,"context_line":"                                                fw_rule[\u0027firewall_policy_id\u0027])"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    \u0027\u0027\u0027 One firewall policy can be used by firewalls of different providers."},{"line_number":190,"context_line":"    This function is to return a map of drivers with firewalls that are"},{"line_number":191,"context_line":"    associated with the policy."},{"line_number":192,"context_line":"    \u0027\u0027\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2FjNs%3D","line":189,"in_reply_to":"AAAAU3%2F%2Fjgs%3D","updated":"2014-02-26 07:05:46.000000000","message":"Done.","commit_id":"be2899f12781ddadaafb0708112ef3192cf5a0a8"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"29f8a63243adddf18434ad7b7f3a5b7886f9f78a","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                                                fw_rule[\u0027firewall_policy_id\u0027])"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def _get_driver_map_by_fwp(self, context, fwp):"},{"line_number":190,"context_line":"        \"\"\"One firewall policy can be used by firewalls of different"},{"line_number":191,"context_line":"        providers. This function returns a map of drivers to firewalls"},{"line_number":192,"context_line":"        that are associated with the policy."},{"line_number":193,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAU3%2F%2FeRg%3D","line":190,"updated":"2014-02-26 12:34:06.000000000","message":"Nit. See PEP257 Summary on one line w/period. Rest can be on additional lines, followed by a blank line.","commit_id":"044d33130d8e45407ab79bcddc4e5103895f7b21"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"56090b11225e80126776d0762f731d46b45f7ba7","unresolved":false,"context_lines":[{"line_number":187,"context_line":"                                                fw_rule[\u0027firewall_policy_id\u0027])"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def _get_driver_map_by_fwp(self, context, fwp):"},{"line_number":190,"context_line":"        \"\"\"One firewall policy can be used by firewalls of different"},{"line_number":191,"context_line":"        providers. This function returns a map of drivers to firewalls"},{"line_number":192,"context_line":"        that are associated with the policy."},{"line_number":193,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAVX%2F%2FuJY%3D","line":190,"in_reply_to":"AAAAU3%2F%2FeRg%3D","updated":"2014-02-28 19:29:40.000000000","message":"Done.","commit_id":"044d33130d8e45407ab79bcddc4e5103895f7b21"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"bd9976a9898bd948fec8af0ef82aa03d2176057e","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            return self.drivers[firewall[\u0027provider\u0027]]"},{"line_number":95,"context_line":"        except KeyError:"},{"line_number":96,"context_line":"            msg \u003d _(\"Error retrieving provider for firewall %s\") % id"},{"line_number":97,"context_line":"            raise q_exc.Invalid(msg)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def _get_provider_name(self, context, firewall):"},{"line_number":100,"context_line":"        if attributes.is_attr_set(firewall.get(\u0027provider\u0027)):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVX%2F%2FrQ4%3D","line":97,"updated":"2014-03-01 07:28:28.000000000","message":"default provider is set by _get_provider_name when a firewall is created. Invalid exception should be raised when a user request is bad, but this case is not. It is an error in neutron server, so 5xx http response should be returned.","commit_id":"a62841b5f3932504a15b79a7182e5cef42350433"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"26eed806574880a15c6bb714fa9c262b1fb99f8f","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            return self.drivers[firewall[\u0027provider\u0027]]"},{"line_number":95,"context_line":"        except KeyError:"},{"line_number":96,"context_line":"            msg \u003d _(\"Error retrieving provider for firewall %s\") % id"},{"line_number":97,"context_line":"            raise q_exc.Invalid(msg)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def _get_provider_name(self, context, firewall):"},{"line_number":100,"context_line":"        if attributes.is_attr_set(firewall.get(\u0027provider\u0027)):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVn%2F%2F9vg%3D","line":97,"in_reply_to":"AAAAVX%2F%2Fopw%3D","updated":"2014-03-03 05:48:41.000000000","message":"Is there a case where a provider is not associated with the firewall? It is the point which confuses me.\n\nIn my understanding, create_firewall ensures some provider is associated with the firewall (default or some other provider) at L.221. Thus I think firewall[\u0027provider\u0027] always exists and has a valid value.\n\nAnyway raising \"Invalid\" looks incorrect because it is not a user input error but a kind of system error.\n\nI hope my understanding is correct.","commit_id":"a62841b5f3932504a15b79a7182e5cef42350433"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"ee604d15b83b457e8bb639a0d25340ce25d42caf","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            return self.drivers[firewall[\u0027provider\u0027]]"},{"line_number":95,"context_line":"        except KeyError:"},{"line_number":96,"context_line":"            msg \u003d _(\"Error retrieving provider for firewall %s\") % id"},{"line_number":97,"context_line":"            raise q_exc.Invalid(msg)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def _get_provider_name(self, context, firewall):"},{"line_number":100,"context_line":"        if attributes.is_attr_set(firewall.get(\u0027provider\u0027)):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVX%2F%2Fopw%3D","line":97,"in_reply_to":"AAAAVX%2F%2FrQ4%3D","updated":"2014-03-02 09:03:54.000000000","message":"I think this really depends on how the function is invoked. If it\u0027s called by update_firewall, it could be user error.","commit_id":"a62841b5f3932504a15b79a7182e5cef42350433"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"b5dbca90853b5acde6ce6766c81c9d127a0a0503","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            return self.drivers[firewall[\u0027provider\u0027]]"},{"line_number":95,"context_line":"        except KeyError:"},{"line_number":96,"context_line":"            msg \u003d _(\"Error retrieving provider for firewall %s\") % id"},{"line_number":97,"context_line":"            raise q_exc.Invalid(msg)"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def _get_provider_name(self, context, firewall):"},{"line_number":100,"context_line":"        if attributes.is_attr_set(firewall.get(\u0027provider\u0027)):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVn%2F%2F3C8%3D","line":97,"in_reply_to":"AAAAVn%2F%2F9vg%3D","updated":"2014-03-03 19:01:00.000000000","message":"I think you are right. I misunderstood what you mean. Looks like LB code is doing the same thing, but I can change it here.","commit_id":"a62841b5f3932504a15b79a7182e5cef42350433"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"bd9976a9898bd948fec8af0ef82aa03d2176057e","unresolved":false,"context_lines":[{"line_number":156,"context_line":"        for p_name in self.drivers:"},{"line_number":157,"context_line":"            if self.drivers[p_name] \u003d\u003d driver:"},{"line_number":158,"context_line":"                return [fw for fw in self.get_firewalls(context)"},{"line_number":159,"context_line":"                        if fw[\u0027provider\u0027] \u003d\u003d p_name]"},{"line_number":160,"context_line":"        return []"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    def _set_firewall_pending_update(self, context, fw_id):"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVX%2F%2FrPo%3D","line":159,"updated":"2014-03-01 07:28:28.000000000","message":"Could you implement this by using db query? It would be more efficient.\n\n  query \u003d session.query(fw_db.Firewall)\n  query \u003d query.join(st_db.ProviderResourceAssociation,\n           fw_db.Firewall.Pool.id \u003d\u003d st_db.ProviderResourceAssociation.resource_id)\n  query \u003d query.filter(st_db.ProviderResourceAssociation.provider_name \u003d\u003d \u0027haproxy\u0027)\n  return [self._make_firewall_dict(fw) for fw in query]","commit_id":"a62841b5f3932504a15b79a7182e5cef42350433"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"bd9976a9898bd948fec8af0ef82aa03d2176057e","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        status_update \u003d {\"firewall\": {\"status\": const.PENDING_UPDATE}}"},{"line_number":164,"context_line":"        fw \u003d super(FirewallPlugin, self).update_firewall(context, fw_id,"},{"line_number":165,"context_line":"                                                         status_update)"},{"line_number":166,"context_line":"        return fw"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def _ensure_update_firewall(self, context, firewall_id):"},{"line_number":169,"context_line":"        fwall \u003d self.get_firewall(context, firewall_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVX%2F%2FrOk%3D","line":166,"updated":"2014-03-01 07:28:28.000000000","message":"return super(FirewallPlugin, self).update_firewall(...)","commit_id":"a62841b5f3932504a15b79a7182e5cef42350433"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"bd9976a9898bd948fec8af0ef82aa03d2176057e","unresolved":false,"context_lines":[{"line_number":194,"context_line":"        that are associated with the policy."},{"line_number":195,"context_line":"        \"\"\""},{"line_number":196,"context_line":"        drivers \u003d dict()"},{"line_number":197,"context_line":"        for fw_id in fwp[\u0027firewall_list\u0027]:"},{"line_number":198,"context_line":"            driver \u003d self._get_driver(context, fw_id)"},{"line_number":199,"context_line":"            if driver in drivers:"},{"line_number":200,"context_line":"                drivers[driver].append(fw_id)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVX%2F%2FrNw%3D","line":197,"updated":"2014-03-01 07:28:28.000000000","message":"This operation costs much if we have more firewalls. In DB layer, we can retrieve firewall list with a specific policy and provider of firewall will be retrieved with joined query (lazy\u003d\"joined\" is specified). I would suggest to use db query for this operation.","commit_id":"a62841b5f3932504a15b79a7182e5cef42350433"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"0ec8703cc15112da392918ae16e461c1e5a8047f","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _load_drivers(self):"},{"line_number":83,"context_line":"        \"\"\"Loads plugin-drivers specified in configuration.\"\"\""},{"line_number":84,"context_line":"        self.drivers, self.default_provider \u003d service_base.load_drivers("},{"line_number":85,"context_line":"            const.FIREWALL, self)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        ctx \u003d context.get_admin_context(load_admin_roles\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2Fq%2Bw%3D","line":84,"updated":"2014-03-04 18:44:51.000000000","message":"Do you have tests that exercise the plugin northbound APIs?  If so, I see a race condition in the test cases with VPN and LB and you may see it here as well.","commit_id":"687c0973a7542377c3499eca9ea669f52c546b43"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"4fbe97a5b2d52c709ae3be5c8aee8f64e3232139","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _load_drivers(self):"},{"line_number":83,"context_line":"        \"\"\"Loads plugin-drivers specified in configuration.\"\"\""},{"line_number":84,"context_line":"        self.drivers, self.default_provider \u003d service_base.load_drivers("},{"line_number":85,"context_line":"            const.FIREWALL, self)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        ctx \u003d context.get_admin_context(load_admin_roles\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2Fqz4%3D","line":84,"in_reply_to":"AAAAVn%2F%2Fq%2Bw%3D","updated":"2014-03-04 19:01:43.000000000","message":"Do you mean when all VPN, LB and FW try to load the driver?","commit_id":"687c0973a7542377c3499eca9ea669f52c546b43"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"7fcf09f8a7335f9973220a602ffe08b53cb664dc","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _load_drivers(self):"},{"line_number":83,"context_line":"        \"\"\"Loads plugin-drivers specified in configuration.\"\"\""},{"line_number":84,"context_line":"        self.drivers, self.default_provider \u003d service_base.load_drivers("},{"line_number":85,"context_line":"            const.FIREWALL, self)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        ctx \u003d context.get_admin_context(load_admin_roles\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2Fl0Q%3D","line":84,"in_reply_to":"AAAAVn%2F%2FqWM%3D","updated":"2014-03-05 06:55:20.000000000","message":"I think Jenkins voted +1 and I don\u0027t see this problem, but it might be because I don\u0027t have many parallel threads.\n\nIt should be fixed in the framework, right? Or in the new framework, whatever it is.","commit_id":"687c0973a7542377c3499eca9ea669f52c546b43"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"3b9b695a36fac3693a0f5f66ee379f7d07b1f8dc","unresolved":false,"context_lines":[{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _load_drivers(self):"},{"line_number":83,"context_line":"        \"\"\"Loads plugin-drivers specified in configuration.\"\"\""},{"line_number":84,"context_line":"        self.drivers, self.default_provider \u003d service_base.load_drivers("},{"line_number":85,"context_line":"            const.FIREWALL, self)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"        ctx \u003d context.get_admin_context(load_admin_roles\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2FqWM%3D","line":84,"in_reply_to":"AAAAVn%2F%2Fqz4%3D","updated":"2014-03-04 19:46:58.000000000","message":"I see that when a full tox run occurs, or a run fo neutron.tests.unit.services, I was seeing cases where the VPN plugin was failing to load the service driver and that the Service Type Manager had loaded the LB configuration. Appears to be a race condition when tox is running tests in parallel.\n\nI would see full tox run passing on my system, but failing if I ran the subset from services, and it was failing on Jenkins.\n\nAre you getting clean runs when doing tox from services?\nDoes Jenkins run clean?\n\nI had to do a workaround of forcing the STM to reparse the configuration to run consistently.","commit_id":"687c0973a7542377c3499eca9ea669f52c546b43"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"0ec8703cc15112da392918ae16e461c1e5a8047f","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _get_driver(self, context, id):"},{"line_number":92,"context_line":"        firewall \u003d self.get_firewall(context, id)"},{"line_number":93,"context_line":"        return self.drivers[firewall[\u0027provider\u0027]]"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _get_provider_name(self, context, firewall):"},{"line_number":96,"context_line":"        if attributes.is_attr_set(firewall.get(\u0027provider\u0027)):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2FrAk%3D","line":93,"updated":"2014-03-04 18:44:51.000000000","message":"I thought Service Type Frame work was not going to be included in I-3, therefore won\u0027t have this, right?","commit_id":"687c0973a7542377c3499eca9ea669f52c546b43"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"7fcf09f8a7335f9973220a602ffe08b53cb664dc","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _get_driver(self, context, id):"},{"line_number":92,"context_line":"        firewall \u003d self.get_firewall(context, id)"},{"line_number":93,"context_line":"        return self.drivers[firewall[\u0027provider\u0027]]"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _get_provider_name(self, context, firewall):"},{"line_number":96,"context_line":"        if attributes.is_attr_set(firewall.get(\u0027provider\u0027)):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2Flzs%3D","line":93,"in_reply_to":"AAAAVn%2F%2FqVM%3D","updated":"2014-03-05 06:55:20.000000000","message":"Eventually, the frontend have to map to a driver implementation, \u0027provider\u0027 might become an internal thing.","commit_id":"687c0973a7542377c3499eca9ea669f52c546b43"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"3b9b695a36fac3693a0f5f66ee379f7d07b1f8dc","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _get_driver(self, context, id):"},{"line_number":92,"context_line":"        firewall \u003d self.get_firewall(context, id)"},{"line_number":93,"context_line":"        return self.drivers[firewall[\u0027provider\u0027]]"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _get_provider_name(self, context, firewall):"},{"line_number":96,"context_line":"        if attributes.is_attr_set(firewall.get(\u0027provider\u0027)):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2FqVM%3D","line":93,"in_reply_to":"AAAAVn%2F%2FqxY%3D","updated":"2014-03-04 19:46:58.000000000","message":"Just wondering how this will work, if there is no \u0027provider\u0027 attribute?","commit_id":"687c0973a7542377c3499eca9ea669f52c546b43"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"4fbe97a5b2d52c709ae3be5c8aee8f64e3232139","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _get_driver(self, context, id):"},{"line_number":92,"context_line":"        firewall \u003d self.get_firewall(context, id)"},{"line_number":93,"context_line":"        return self.drivers[firewall[\u0027provider\u0027]]"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    def _get_provider_name(self, context, firewall):"},{"line_number":96,"context_line":"        if attributes.is_attr_set(firewall.get(\u0027provider\u0027)):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAVn%2F%2FqxY%3D","line":93,"in_reply_to":"AAAAVn%2F%2FrAk%3D","updated":"2014-03-04 19:01:43.000000000","message":"From what I know, there are several options for what will eventually end up in I release. The decision has not been finalized yet.","commit_id":"687c0973a7542377c3499eca9ea669f52c546b43"}],"neutron/services/firewall/plugin_drivers/__init__.py":[{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"change_message_id":"4b1aaed6a788b3cf741e4df7c4aae631c52144e7","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":14,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F94D4%3D","line":16,"updated":"2014-02-02 20:09:28.000000000","message":"per new prescribed convention, this module needs to be empty.","commit_id":"d68aa32a66f2ab32e19cc2260429cfc4267dcd34"}],"neutron/services/firewall/plugin_drivers/l3reference/__init__.py":[{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"change_message_id":"4b1aaed6a788b3cf741e4df7c4aae631c52144e7","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":14,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":15,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":16,"context_line":"#    under the License."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F94D0%3D","line":16,"updated":"2014-02-02 20:09:28.000000000","message":"ditto","commit_id":"d68aa32a66f2ab32e19cc2260429cfc4267dcd34"}],"neutron/services/firewall/plugin_drivers/l3reference/firewall_l3_driver.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"9e7b2cea1af004fdbc3ca343eb427dba2489e755","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 Big Switch Networks, Inc."},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FgKg%3D","line":1,"updated":"2014-02-12 18:51:29.000000000","message":"Pull vim line.\nCopyright add 2014","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"165c8779b0e9a056998aa0ca3ee781dc317717de","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 Big Switch Networks, Inc."},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FgBo%3D","line":1,"updated":"2014-02-12 18:57:03.000000000","message":"please remove vim lines (it\u0027s a new recent rule) in the newly added files","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"165c8779b0e9a056998aa0ca3ee781dc317717de","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        LOG.debug(_(\"get_firewalls_for_tenant() called\"))"},{"line_number":58,"context_line":"        fw_list \u003d ["},{"line_number":59,"context_line":"            self.plugin.make_firewall_dict_with_rules(context, fw[\u0027id\u0027])"},{"line_number":60,"context_line":"            for fw in self.plugin.get_firewalls_for_driver(context,"},{"line_number":61,"context_line":"                                                           self.driver)"},{"line_number":62,"context_line":"        ]"},{"line_number":63,"context_line":"        return fw_list"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FgDM%3D","line":60,"updated":"2014-02-12 18:57:03.000000000","message":"get_firewalls_for_driver doesn\u0027t filter firewalls by tenant_id, is that ok?","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"dcb4a03ebe27301c07530b132b5f786bbacfdfaa","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        LOG.debug(_(\"get_firewalls_for_tenant() called\"))"},{"line_number":58,"context_line":"        fw_list \u003d ["},{"line_number":59,"context_line":"            self.plugin.make_firewall_dict_with_rules(context, fw[\u0027id\u0027])"},{"line_number":60,"context_line":"            for fw in self.plugin.get_firewalls_for_driver(context,"},{"line_number":61,"context_line":"                                                           self.driver)"},{"line_number":62,"context_line":"        ]"},{"line_number":63,"context_line":"        return fw_list"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FcwE%3D","line":60,"in_reply_to":"AAAAUX%2F%2FdN8%3D","updated":"2014-02-13 05:33:37.000000000","message":"Hi, Eugene,\n\nI reviewed the code and did more test, I think think the behavior is as expected. The context is made by tenant_id, so the firewall instances are limited by the tenant.","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"cad2b7ebc5ef79e5046f310a98de42593d55367d","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        LOG.debug(_(\"get_firewalls_for_tenant() called\"))"},{"line_number":58,"context_line":"        fw_list \u003d ["},{"line_number":59,"context_line":"            self.plugin.make_firewall_dict_with_rules(context, fw[\u0027id\u0027])"},{"line_number":60,"context_line":"            for fw in self.plugin.get_firewalls_for_driver(context,"},{"line_number":61,"context_line":"                                                           self.driver)"},{"line_number":62,"context_line":"        ]"},{"line_number":63,"context_line":"        return fw_list"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FdN8%3D","line":60,"in_reply_to":"AAAAUX%2F%2FeVo%3D","updated":"2014-02-13 03:20:47.000000000","message":"I was confused between admin user with admin context. I will test more cases.","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"831cdf187dd7c2a78a9ce1e4f4c2a4e7b9c645a8","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        LOG.debug(_(\"get_firewalls_for_tenant() called\"))"},{"line_number":58,"context_line":"        fw_list \u003d ["},{"line_number":59,"context_line":"            self.plugin.make_firewall_dict_with_rules(context, fw[\u0027id\u0027])"},{"line_number":60,"context_line":"            for fw in self.plugin.get_firewalls_for_driver(context,"},{"line_number":61,"context_line":"                                                           self.driver)"},{"line_number":62,"context_line":"        ]"},{"line_number":63,"context_line":"        return fw_list"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FeVo%3D","line":60,"in_reply_to":"AAAAUX%2F%2FgDM%3D","updated":"2014-02-12 23:09:22.000000000","message":"The function is a RPC call from FWaaSL3PluginApi::get_firewalls_for_tenant(), then from several   places. Every place passes in the \u0027context\u0027 made for the tenant, so I think it only gets the firewall instance of the tenant. However, I am not sure about the \u0027admin\u0027 tenant. It can see firewall instances in all tenants.","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"165c8779b0e9a056998aa0ca3ee781dc317717de","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    def get_firewalls_for_tenant_without_rules(self, context, **kwargs):"},{"line_number":66,"context_line":"        \"\"\"Agent uses this to get all firewalls for a tenant.\"\"\""},{"line_number":67,"context_line":"        LOG.debug(_(\"get_firewalls_for_tenant_without_rules() called\"))"},{"line_number":68,"context_line":"        return self.plugin.get_firewalls_for_driver(context, self.driver)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def get_tenants_with_firewalls(self, context, **kwargs):"},{"line_number":71,"context_line":"        \"\"\"Agent uses this to get all tenants that have firewalls.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FgCQ%3D","line":68,"updated":"2014-02-12 18:57:03.000000000","message":"same as above","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"831cdf187dd7c2a78a9ce1e4f4c2a4e7b9c645a8","unresolved":false,"context_lines":[{"line_number":65,"context_line":"    def get_firewalls_for_tenant_without_rules(self, context, **kwargs):"},{"line_number":66,"context_line":"        \"\"\"Agent uses this to get all firewalls for a tenant.\"\"\""},{"line_number":67,"context_line":"        LOG.debug(_(\"get_firewalls_for_tenant_without_rules() called\"))"},{"line_number":68,"context_line":"        return self.plugin.get_firewalls_for_driver(context, self.driver)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def get_tenants_with_firewalls(self, context, **kwargs):"},{"line_number":71,"context_line":"        \"\"\"Agent uses this to get all tenants that have firewalls.\"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FeXg%3D","line":68,"in_reply_to":"AAAAUX%2F%2FgCQ%3D","updated":"2014-02-12 23:09:22.000000000","message":"This function doesn\u0027t seem to be called anywhere. I copied the class here. I think I can remove it.","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e27e587cdf0362c035cc4e3164049a1bf5d5023f","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def set_firewall_status(self, context, firewall_id, status, **kwargs):"},{"line_number":44,"context_line":"        \"\"\"Agent uses this to set a firewall\u0027s status.\"\"\""},{"line_number":45,"context_line":"        LOG.debug(_(\"set_firewall_status() called\"))"},{"line_number":46,"context_line":"        return self.plugin.set_firewall_status(context, firewall_id, status)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def firewall_deleted(self, context, firewall_id, **kwargs):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2Bu04%3D","line":45,"updated":"2014-02-19 14:25:26.000000000","message":"you can use neutron.common.log log decorator. (I usually import it as call_log)\n\n  @call_log.log\n  def set_firewall_status(...)","commit_id":"35d630adbdeaf22a6c2e0c3670cc00f11be49b93"}],"neutron/services/firewall/plugin_drivers/noop/firewall_noop_driver.py":[{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"change_message_id":"addb64ec23f40c7c9163ac1810c280428ced05f7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 vArmour Networks Inc."},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAUH%2F9lHg%3D","line":1,"updated":"2014-02-05 22:15:13.000000000","message":"we decided to move noop drivers to the test director, see:    https://github.com/openstack/neutron/blob/master/neutron/tests/unit/services/firewall/agents/test_firewall_agent_api.py#L30","commit_id":"2c8d4236d69ce3094a649518015cd2f34477dc6a"}],"neutron/services/firewall/plugin_drivers/plugin_driver_base.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"17e54995a29ac0ead1049ae3caf3a00785f26be9","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import abc"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class FWaaSPluginDriverBase(object):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    __metaclass__ \u003d abc.ABCMeta"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAATn%2F9p%2Bo%3D","line":22,"updated":"2013-12-09 08:09:59.000000000","message":"__metaclass__ cannot be used in python3, please import six , add @six.add_metaclass(abc.ABCMeta) here and remove #25.","commit_id":"cf9258f1da0bfd3845cffc4c018b1de1eea0c7d9"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"9e7b2cea1af004fdbc3ca343eb427dba2489e755","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 vArmour Networks Inc."},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FgJo%3D","line":1,"updated":"2014-02-12 18:51:29.000000000","message":"ditto","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"3f0083a3b5bc4cc98100978a6bca86ffed5a7284","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    @abc.abstractmethod"},{"line_number":26,"context_line":"    def create_firewall(self, context, fw):"},{"line_number":27,"context_line":"        \"\"\""},{"line_number":28,"context_line":"        fw: newly created firewall"},{"line_number":29,"context_line":"        \"\"\""},{"line_number":30,"context_line":"        pass"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2Fjfw%3D","line":28,"updated":"2014-02-26 00:04:53.000000000","message":"PEP257 single line doc string, on same line as triple quotes, with a period.\n\nMulitple line docstrings, have single line w/period, and then rest separated by a blank line.","commit_id":"be2899f12781ddadaafb0708112ef3192cf5a0a8"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"062c5bfeb869c26cf3e5798e8e1134fda4cebc71","unresolved":false,"context_lines":[{"line_number":25,"context_line":"    @abc.abstractmethod"},{"line_number":26,"context_line":"    def create_firewall(self, context, fw):"},{"line_number":27,"context_line":"        \"\"\""},{"line_number":28,"context_line":"        fw: newly created firewall"},{"line_number":29,"context_line":"        \"\"\""},{"line_number":30,"context_line":"        pass"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAU3%2F%2FhA0%3D","line":28,"in_reply_to":"AAAAU3%2F%2Fjfw%3D","updated":"2014-02-26 07:05:46.000000000","message":"Done.","commit_id":"be2899f12781ddadaafb0708112ef3192cf5a0a8"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"bd9976a9898bd948fec8af0ef82aa03d2176057e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"# @author: Gary Duan, gduan@varmour.com, vArmour Networks"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import abc"},{"line_number":19,"context_line":"import six"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVX%2F%2FrNg%3D","line":19,"updated":"2014-03-01 07:28:28.000000000","message":"six is a third paty module","commit_id":"a62841b5f3932504a15b79a7182e5cef42350433"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"ee604d15b83b457e8bb639a0d25340ce25d42caf","unresolved":false,"context_lines":[{"line_number":16,"context_line":"# @author: Gary Duan, gduan@varmour.com, vArmour Networks"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import abc"},{"line_number":19,"context_line":"import six"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVX%2F%2Fpbs%3D","line":19,"in_reply_to":"AAAAVX%2F%2FrNg%3D","updated":"2014-03-02 09:03:54.000000000","message":"Done. Added an empty line.","commit_id":"a62841b5f3932504a15b79a7182e5cef42350433"}],"neutron/tests/unit/db/firewall/test_db_firewall.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"9e7b2cea1af004fdbc3ca343eb427dba2489e755","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                             \u0027firewall_policy_id\u0027: firewall_policy_id,"},{"line_number":241,"context_line":"                             \u0027admin_state_up\u0027: admin_state_up,"},{"line_number":242,"context_line":"                             \u0027tenant_id\u0027: self._tenant_id}}"},{"line_number":243,"context_line":"        if \u0027proivder\u0027 in kwargs and kwargs[\u0027provider\u0027] is not None:"},{"line_number":244,"context_line":"            data[\u0027firewall\u0027][\u0027provider\u0027] \u003d kwargs[\u0027provider\u0027]"},{"line_number":245,"context_line":"        firewall_req \u003d self.new_create_request(\u0027firewalls\u0027, data, fmt)"},{"line_number":246,"context_line":"        firewall_res \u003d firewall_req.get_response(self.ext_api)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FgJI%3D","line":243,"updated":"2014-02-12 18:51:29.000000000","message":"proivder -\u003e provider\n\nCheck your UTs that you have a test case with provider specified so that this code is triggered.","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e27e587cdf0362c035cc4e3164049a1bf5d5023f","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                                  [fw_provider],"},{"line_number":84,"context_line":"                                  \u0027service_providers\u0027)"},{"line_number":85,"context_line":"        #force service type manager to reload configuration:"},{"line_number":86,"context_line":"        sdb.ServiceTypeManager._instance \u003d None"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        fdb.Firewall_db_mixin.supported_extension_aliases \u003d [\"fwaas\"]"},{"line_number":89,"context_line":"        super(FirewallPluginDbTestCase, self).setUp("}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2Buv0%3D","line":86,"updated":"2014-02-19 14:25:26.000000000","message":"It is not related to db fw plugin. Can we move it to test_firewall_plugin?","commit_id":"35d630adbdeaf22a6c2e0c3670cc00f11be49b93"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"6bd9a4f6521c2f37702cfd5a4ef7929707732fb1","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                                  [fw_provider],"},{"line_number":84,"context_line":"                                  \u0027service_providers\u0027)"},{"line_number":85,"context_line":"        #force service type manager to reload configuration:"},{"line_number":86,"context_line":"        sdb.ServiceTypeManager._instance \u003d None"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        fdb.Firewall_db_mixin.supported_extension_aliases \u003d [\"fwaas\"]"},{"line_number":89,"context_line":"        super(FirewallPluginDbTestCase, self).setUp("}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2Bqtg%3D","line":86,"in_reply_to":"AAAAUX%2F%2BtFI%3D","updated":"2014-02-19 22:29:07.000000000","message":"It doesn\u0027t seem to work. I got a lot of \"FAIL: process-returncode\" error. LoadBalancer defines similar logic in DB test case class too. I will keep it here for now.","commit_id":"35d630adbdeaf22a6c2e0c3670cc00f11be49b93"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"a899d53ec3187fcd4a5ba71f755c25bcc43fbbd2","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                                  [fw_provider],"},{"line_number":84,"context_line":"                                  \u0027service_providers\u0027)"},{"line_number":85,"context_line":"        #force service type manager to reload configuration:"},{"line_number":86,"context_line":"        sdb.ServiceTypeManager._instance \u003d None"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        fdb.Firewall_db_mixin.supported_extension_aliases \u003d [\"fwaas\"]"},{"line_number":89,"context_line":"        super(FirewallPluginDbTestCase, self).setUp("}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2BtFI%3D","line":86,"in_reply_to":"AAAAUX%2F%2Buv0%3D","updated":"2014-02-19 17:30:22.000000000","message":"Will do.","commit_id":"35d630adbdeaf22a6c2e0c3670cc00f11be49b93"}],"neutron/tests/unit/services/firewall/plugin_drivers/l3reference/__init__.py":[{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"change_message_id":"4b1aaed6a788b3cf741e4df7c4aae631c52144e7","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT"},{"line_number":13,"context_line":"#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the"},{"line_number":14,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":15,"context_line":"#    under the License."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAUH%2F94Dk%3D","line":15,"updated":"2014-02-02 20:09:28.000000000","message":"ditto","commit_id":"d68aa32a66f2ab32e19cc2260429cfc4267dcd34"}],"neutron/tests/unit/services/firewall/plugin_drivers/l3reference/test_reference_driver.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"9e7b2cea1af004fdbc3ca343eb427dba2489e755","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# vim: tabstop\u003d4 shiftwidth\u003d4 softtabstop\u003d4"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Copyright 2013 Big Switch Networks, Inc."},{"line_number":4,"context_line":"# All Rights Reserved."}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FgIw%3D","line":1,"updated":"2014-02-12 18:51:29.000000000","message":"vim pull\ncopyright.","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"9e7b2cea1af004fdbc3ca343eb427dba2489e755","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from neutron import context"},{"line_number":26,"context_line":"from neutron.extensions import firewall"},{"line_number":27,"context_line":"from neutron.plugins.common import constants as const"},{"line_number":28,"context_line":"from neutron.services.firewall.plugin_drivers.l3reference import \\"},{"line_number":29,"context_line":"    firewall_l3_driver"},{"line_number":30,"context_line":"from neutron.tests import base"},{"line_number":31,"context_line":"from neutron.tests.unit.db.firewall import test_db_firewall"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FgFA%3D","line":28,"updated":"2014-02-12 18:51:29.000000000","message":"eliminate backslash re:HACKING guidelines.","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"831cdf187dd7c2a78a9ce1e4f4c2a4e7b9c645a8","unresolved":false,"context_lines":[{"line_number":25,"context_line":"from neutron import context"},{"line_number":26,"context_line":"from neutron.extensions import firewall"},{"line_number":27,"context_line":"from neutron.plugins.common import constants as const"},{"line_number":28,"context_line":"from neutron.services.firewall.plugin_drivers.l3reference import \\"},{"line_number":29,"context_line":"    firewall_l3_driver"},{"line_number":30,"context_line":"from neutron.tests import base"},{"line_number":31,"context_line":"from neutron.tests.unit.db.firewall import test_db_firewall"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2Felk%3D","line":28,"in_reply_to":"AAAAUX%2F%2FgFA%3D","updated":"2014-02-12 23:09:22.000000000","message":"Paul,\n\nI don\u0027t see it in HACKIng guideline. Are you suggesting using,\nfrom xxxx import (\n    firewall_l3_drvier\n)\n?","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"165c8779b0e9a056998aa0ca3ee781dc317717de","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                        self.plugin.make_firewall_dict_with_rules(ctx,"},{"line_number":136,"context_line":"                                                                  fw_id)"},{"line_number":137,"context_line":"                    )"},{"line_number":138,"context_line":"                    print res"},{"line_number":139,"context_line":"                    self.assertEqual(res[0], fw_rules)"},{"line_number":140,"context_line":"                    self._compare_firewall_rule_lists("},{"line_number":141,"context_line":"                        fwp_id, fr, res[0][\u0027firewall_rule_list\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2Ff88%3D","line":138,"updated":"2014-02-12 18:57:03.000000000","message":"i think that could be removed.","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"831cdf187dd7c2a78a9ce1e4f4c2a4e7b9c645a8","unresolved":false,"context_lines":[{"line_number":135,"context_line":"                        self.plugin.make_firewall_dict_with_rules(ctx,"},{"line_number":136,"context_line":"                                                                  fw_id)"},{"line_number":137,"context_line":"                    )"},{"line_number":138,"context_line":"                    print res"},{"line_number":139,"context_line":"                    self.assertEqual(res[0], fw_rules)"},{"line_number":140,"context_line":"                    self._compare_firewall_rule_lists("},{"line_number":141,"context_line":"                        fwp_id, fr, res[0][\u0027firewall_rule_list\u0027])"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2FelY%3D","line":138,"in_reply_to":"AAAAUX%2F%2Ff88%3D","updated":"2014-02-12 23:09:22.000000000","message":"Thanks.","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"165c8779b0e9a056998aa0ca3ee781dc317717de","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                for fw in res:"},{"line_number":157,"context_line":"                    del fw[\u0027shared\u0027]"},{"line_number":158,"context_line":"                    del fw[\u0027provider\u0027]"},{"line_number":159,"context_line":"                print res"},{"line_number":160,"context_line":"                self.assertEqual(res, fw_list)"},{"line_number":161,"context_line":""},{"line_number":162,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUX%2F%2Ff9c%3D","line":159,"updated":"2014-02-12 18:57:03.000000000","message":"i think that could be removed.","commit_id":"addaf0fefc74acf3d93192ebc4cfd0d4e33ea179"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"bd9976a9898bd948fec8af0ef82aa03d2176057e","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.callbacks \u003d driver.callbacks"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_set_firewall_status(self):"},{"line_number":53,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":54,"context_line":"        with self.firewall_policy(no_delete\u003dTrue) as fwp:"},{"line_number":55,"context_line":"            fwp_id \u003d fwp[\u0027firewall_policy\u0027][\u0027id\u0027]"},{"line_number":56,"context_line":"            with self.firewall(firewall_policy_id\u003dfwp_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVX%2F%2FrNY%3D","line":53,"updated":"2014-03-01 07:28:28.000000000","message":"In my understanding, unit tests use admin context by default. is it required?","commit_id":"a62841b5f3932504a15b79a7182e5cef42350433"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"ee604d15b83b457e8bb639a0d25340ce25d42caf","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        self.callbacks \u003d driver.callbacks"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def test_set_firewall_status(self):"},{"line_number":53,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":54,"context_line":"        with self.firewall_policy(no_delete\u003dTrue) as fwp:"},{"line_number":55,"context_line":"            fwp_id \u003d fwp[\u0027firewall_policy\u0027][\u0027id\u0027]"},{"line_number":56,"context_line":"            with self.firewall(firewall_policy_id\u003dfwp_id,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVX%2F%2Fpas%3D","line":53,"in_reply_to":"AAAAVX%2F%2FrNY%3D","updated":"2014-03-02 09:03:54.000000000","message":"Done. I can\u0027t change other files because existing code already use get_admin_context()","commit_id":"a62841b5f3932504a15b79a7182e5cef42350433"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"bd9976a9898bd948fec8af0ef82aa03d2176057e","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                    fw_db \u003d self.plugin._get_firewall(ctx, fw_id)"},{"line_number":81,"context_line":"                    fw_db[\u0027status\u0027] \u003d const.PENDING_DELETE"},{"line_number":82,"context_line":"                    ctx.session.flush()"},{"line_number":83,"context_line":"                    res \u003d self.callbacks.firewall_deleted(ctx, fw_id)"},{"line_number":84,"context_line":"                    self.assertTrue(res)"},{"line_number":85,"context_line":"                    self.assertRaises(firewall.FirewallNotFound,"},{"line_number":86,"context_line":"                                      self.plugin.get_firewall,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVX%2F%2FrM8%3D","line":83,"updated":"2014-03-01 07:28:28.000000000","message":"It should be outside of the transaction because it is not related to status update.","commit_id":"a62841b5f3932504a15b79a7182e5cef42350433"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"ee604d15b83b457e8bb639a0d25340ce25d42caf","unresolved":false,"context_lines":[{"line_number":80,"context_line":"                    fw_db \u003d self.plugin._get_firewall(ctx, fw_id)"},{"line_number":81,"context_line":"                    fw_db[\u0027status\u0027] \u003d const.PENDING_DELETE"},{"line_number":82,"context_line":"                    ctx.session.flush()"},{"line_number":83,"context_line":"                    res \u003d self.callbacks.firewall_deleted(ctx, fw_id)"},{"line_number":84,"context_line":"                    self.assertTrue(res)"},{"line_number":85,"context_line":"                    self.assertRaises(firewall.FirewallNotFound,"},{"line_number":86,"context_line":"                                      self.plugin.get_firewall,"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAVX%2F%2Fpaw%3D","line":83,"in_reply_to":"AAAAVX%2F%2FrM8%3D","updated":"2014-03-02 09:03:54.000000000","message":"Done.","commit_id":"a62841b5f3932504a15b79a7182e5cef42350433"}],"neutron/tests/unit/services/firewall/test_fwaas_plugin.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e27e587cdf0362c035cc4e3164049a1bf5d5023f","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":271,"context_line":"        def_driver \u003d self.plugin.drivers[self.plugin.default_provider]"},{"line_number":272,"context_line":"        fws \u003d self.plugin.get_firewalls_for_driver(ctx, def_driver)"},{"line_number":273,"context_line":"        self.assertEqual(len(fws), 0)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    def test_policy_2_driver_mapping(self):"},{"line_number":276,"context_line":"        self._test_create_firewall_with_provider()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2BuwE%3D","line":273,"updated":"2014-02-19 14:25:26.000000000","message":"assertFalse(fws)","commit_id":"35d630adbdeaf22a6c2e0c3670cc00f11be49b93"},{"author":{"_account_id":7576,"name":"Gary Duan","email":"garyduan@gmail.com","username":"garyduan"},"change_message_id":"be69aecb60e9f7eca8a6a67e3ba2e47331637db8","unresolved":false,"context_lines":[{"line_number":270,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":271,"context_line":"        def_driver \u003d self.plugin.drivers[self.plugin.default_provider]"},{"line_number":272,"context_line":"        fws \u003d self.plugin.get_firewalls_for_driver(ctx, def_driver)"},{"line_number":273,"context_line":"        self.assertEqual(len(fws), 0)"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    def test_policy_2_driver_mapping(self):"},{"line_number":276,"context_line":"        self._test_create_firewall_with_provider()"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAAUX%2F%2Br34%3D","line":273,"in_reply_to":"AAAAUX%2F%2BuwE%3D","updated":"2014-02-19 19:53:57.000000000","message":"I personally prefer 0 over False, as it\u0027s a numeric comparison.","commit_id":"35d630adbdeaf22a6c2e0c3670cc00f11be49b93"}]}
