)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"b0740d5522da87978adda58c62a7a1cc2a5fd5a4","unresolved":false,"context_lines":[{"line_number":11,"context_line":"* adds generic vpn_rpc drivers"},{"line_number":12,"context_line":"  generic vpn_rpc driver send rpc messages"},{"line_number":13,"context_line":"  for a topic of vpn_rpc_\u003cprovider_name\u003e"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Implements blueprint vpn-service-types-integration"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I9e195dfaee21b1cf204cb9b9fc773bc9e5af5936"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"AAAAUX%2F%2FWtc%3D","line":14,"updated":"2014-02-13 19:12:57.000000000","message":"Since this is adding a new attribute to the API, should we add \"DocImpact\" here to alert the fact we should update the API documentation as well?","commit_id":"65b96e7efc739cb5ef58b31138f4bdcb6b0709e9"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"cf232108b518f662e7e74f69eb17638dbf4e0e13","unresolved":false,"context_lines":[{"line_number":11,"context_line":"* adds generic vpn_rpc drivers"},{"line_number":12,"context_line":"  generic vpn_rpc driver send rpc messages"},{"line_number":13,"context_line":"  for a topic of vpn_rpc_\u003cprovider_name\u003e"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Implements blueprint vpn-service-types-integration"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Change-Id: I9e195dfaee21b1cf204cb9b9fc773bc9e5af5936"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"AAAAUX%2F%2FCwU%3D","line":14,"in_reply_to":"AAAAUX%2F%2FWtc%3D","updated":"2014-02-17 13:37:51.000000000","message":"Done","commit_id":"65b96e7efc739cb5ef58b31138f4bdcb6b0709e9"}],"etc/neutron.conf":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"f6a19bcccaee44de4848861dcdff5ce9aa6eec31","unresolved":false,"context_lines":[{"line_number":377,"context_line":"#service_compression_throughput\u003d100"},{"line_number":378,"context_line":"#service_cache\u003d20"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"#service_provider\u003dVPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default"}],"source_content_type":"text/plain","patch_set":18,"id":"AAAATn%2F%2F%2FJM%3D","line":380,"updated":"2013-10-24 08:18:28.000000000","message":"seems it shouldn\u0027t be in the radware section","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"change_message_id":"83a66425a22b0f89ef6e0e11d226c65a0eac473f","unresolved":false,"context_lines":[{"line_number":377,"context_line":"#service_compression_throughput\u003d100"},{"line_number":378,"context_line":"#service_cache\u003d20"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"#service_provider\u003dVPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default"}],"source_content_type":"text/plain","patch_set":18,"id":"AAAATn%2F%2FHNc%3D","line":380,"in_reply_to":"AAAATn%2F%2F%2FJM%3D","updated":"2013-11-14 10:07:45.000000000","message":"it maybe the following format:\n\n[service_providers]\n\nservice_provider\u003d[\u0027LOADBALANCER:Haproxy:neutron.services.loadbalancer.drivers.haproxy.plugin_driver.Ha\nproxyOnHostPluginDriver:default\u0027, \u0027VPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default\u0027]","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"57aced4d41c28ab2545dc580fdc75aa3d50ae067","unresolved":false,"context_lines":[{"line_number":377,"context_line":"#service_compression_throughput\u003d100"},{"line_number":378,"context_line":"#service_cache\u003d20"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"#service_provider\u003dVPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default"}],"source_content_type":"text/plain","patch_set":18,"id":"AAAATn%2F%2BYGo%3D","line":380,"in_reply_to":"AAAATn%2F%2FGrA%3D","updated":"2013-11-26 18:51:39.000000000","message":"Done","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"fe0d36bcd8bc88a47f97b6b1bdcf1053c2191f50","unresolved":false,"context_lines":[{"line_number":377,"context_line":"#service_compression_throughput\u003d100"},{"line_number":378,"context_line":"#service_cache\u003d20"},{"line_number":379,"context_line":""},{"line_number":380,"context_line":"#service_provider\u003dVPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default"}],"source_content_type":"text/plain","patch_set":18,"id":"AAAATn%2F%2FGrA%3D","line":380,"in_reply_to":"AAAATn%2F%2FHNc%3D","updated":"2013-11-14 11:55:01.000000000","message":"service_providers format is well-defined: it\u0027s multi-line option","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"bc86b7819865940a65844252cc2408cf39dafa7a","unresolved":false,"context_lines":[{"line_number":373,"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":374,"context_line":"# Otherwise comment the HA Proxy line"},{"line_number":375,"context_line":"#service_provider \u003d LOADBALANCER:Radware:neutron.services.loadbalancer.drivers.radware.driver.LoadBalancerDriver:default"},{"line_number":376,"context_line":"#service_provider\u003dVPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"[radware]"},{"line_number":379,"context_line":"#vdirect_address\u003d0.0.0.0"}],"source_content_type":"text/plain","patch_set":19,"id":"AAAATn%2F%2BVuA%3D","line":376,"updated":"2013-11-27 07:26:01.000000000","message":"default for service_provider option is empty list, so you need to uncomment this.\nThat also causes neutron to terminate at startup.","commit_id":"7566491194b8fe05679976c7b53c30550ecfdfa8"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"9ca16249a6d2a94558363b63cee113fa5890f473","unresolved":false,"context_lines":[{"line_number":373,"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":374,"context_line":"# Otherwise comment the HA Proxy line"},{"line_number":375,"context_line":"#service_provider \u003d LOADBALANCER:Radware:neutron.services.loadbalancer.drivers.radware.driver.LoadBalancerDriver:default"},{"line_number":376,"context_line":"#service_provider\u003dVPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"[radware]"},{"line_number":379,"context_line":"#vdirect_address\u003d0.0.0.0"}],"source_content_type":"text/plain","patch_set":19,"id":"AAAATn%2F%2BS2s%3D","line":376,"in_reply_to":"AAAATn%2F%2BVuA%3D","updated":"2013-11-27 18:58:56.000000000","message":"Thanks. I fixed this.\nBTW, the user who won\u0027t use vpn need also this configuration?","commit_id":"7566491194b8fe05679976c7b53c30550ecfdfa8"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"bc86b7819865940a65844252cc2408cf39dafa7a","unresolved":false,"context_lines":[{"line_number":375,"context_line":"#service_provider \u003d LOADBALANCER:Radware:neutron.services.loadbalancer.drivers.radware.driver.LoadBalancerDriver:default"},{"line_number":376,"context_line":"#service_provider\u003dVPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"[radware]"},{"line_number":379,"context_line":"#vdirect_address\u003d0.0.0.0"},{"line_number":380,"context_line":"#service_ha_pair\u003dFalse"},{"line_number":381,"context_line":"#service_throughput\u003d1000"}],"source_content_type":"text/plain","patch_set":19,"id":"AAAATn%2F%2BVuU%3D","line":378,"updated":"2013-11-27 07:26:01.000000000","message":"that section seems to get here from old code. Currently it\u0027s in services.conf","commit_id":"7566491194b8fe05679976c7b53c30550ecfdfa8"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"9ca16249a6d2a94558363b63cee113fa5890f473","unresolved":false,"context_lines":[{"line_number":375,"context_line":"#service_provider \u003d LOADBALANCER:Radware:neutron.services.loadbalancer.drivers.radware.driver.LoadBalancerDriver:default"},{"line_number":376,"context_line":"#service_provider\u003dVPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"[radware]"},{"line_number":379,"context_line":"#vdirect_address\u003d0.0.0.0"},{"line_number":380,"context_line":"#service_ha_pair\u003dFalse"},{"line_number":381,"context_line":"#service_throughput\u003d1000"}],"source_content_type":"text/plain","patch_set":19,"id":"AAAATn%2F%2BS24%3D","line":378,"in_reply_to":"AAAATn%2F%2BVuU%3D","updated":"2013-11-27 18:58:56.000000000","message":"my bad. Thanks","commit_id":"7566491194b8fe05679976c7b53c30550ecfdfa8"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"43689e36d167d4ec7cb2f9e321a600e47e741de8","unresolved":false,"context_lines":[{"line_number":376,"context_line":"#service_provider\u003dVPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default"},{"line_number":377,"context_line":""},{"line_number":378,"context_line":"[radware]"},{"line_number":379,"context_line":"#vdirect_address\u003d0.0.0.0"},{"line_number":380,"context_line":"#service_ha_pair\u003dFalse"},{"line_number":381,"context_line":"#service_throughput\u003d1000"},{"line_number":382,"context_line":"#service_ssl_throughput\u003d200"}],"source_content_type":"text/plain","patch_set":19,"id":"AAAATn%2F%2BW3w%3D","line":379,"updated":"2013-11-27 00:30:10.000000000","message":"I hope there exist one blank space after #, just keep the consistent with other parts of configuration file, the following are similar","commit_id":"7566491194b8fe05679976c7b53c30550ecfdfa8"},{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"43689e36d167d4ec7cb2f9e321a600e47e741de8","unresolved":false,"context_lines":[{"line_number":377,"context_line":""},{"line_number":378,"context_line":"[radware]"},{"line_number":379,"context_line":"#vdirect_address\u003d0.0.0.0"},{"line_number":380,"context_line":"#service_ha_pair\u003dFalse"},{"line_number":381,"context_line":"#service_throughput\u003d1000"},{"line_number":382,"context_line":"#service_ssl_throughput\u003d200"},{"line_number":383,"context_line":"#service_compression_throughput\u003d100"}],"source_content_type":"text/plain","patch_set":19,"id":"AAAATn%2F%2BW2c%3D","line":380,"updated":"2013-11-27 00:30:10.000000000","message":"and also leave one blank space on either side of \u003d, just keep the consistent with other parts of configuration file, the following are similar","commit_id":"7566491194b8fe05679976c7b53c30550ecfdfa8"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"9ca16249a6d2a94558363b63cee113fa5890f473","unresolved":false,"context_lines":[{"line_number":377,"context_line":""},{"line_number":378,"context_line":"[radware]"},{"line_number":379,"context_line":"#vdirect_address\u003d0.0.0.0"},{"line_number":380,"context_line":"#service_ha_pair\u003dFalse"},{"line_number":381,"context_line":"#service_throughput\u003d1000"},{"line_number":382,"context_line":"#service_ssl_throughput\u003d200"},{"line_number":383,"context_line":"#service_compression_throughput\u003d100"}],"source_content_type":"text/plain","patch_set":19,"id":"AAAATn%2F%2BS3A%3D","line":380,"in_reply_to":"AAAATn%2F%2BW2c%3D","updated":"2013-11-27 18:58:56.000000000","message":"Done","commit_id":"7566491194b8fe05679976c7b53c30550ecfdfa8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"11e47de0aee001046874e24cb09617c9e4a0dd30","unresolved":false,"context_lines":[{"line_number":372,"context_line":"# In order to activate Radware\u0027s lbaas driver you need to uncomment the next line."},{"line_number":373,"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":374,"context_line":"# Otherwise comment the HA Proxy line"},{"line_number":375,"context_line":"#service_provider\u003dLOADBALANCER:Radware:neutron.services.loadbalancer.drivers.radware.driver.LoadBalancerDriver:default"},{"line_number":376,"context_line":"service_provider\u003dVPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default"}],"source_content_type":"text/plain","patch_set":20,"id":"AAAATn%2F9IQU%3D","line":375,"updated":"2013-12-16 15:25:24.000000000","message":"nit:  This whitespace change doesn\u0027t seem to relate to this patch.","commit_id":"65b96e7efc739cb5ef58b31138f4bdcb6b0709e9"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e7cb201e49a9b22c357ec29fc19e3fdc9409fd4f","unresolved":false,"context_lines":[{"line_number":372,"context_line":"# In order to activate Radware\u0027s lbaas driver you need to uncomment the next line."},{"line_number":373,"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":374,"context_line":"# Otherwise comment the HA Proxy line"},{"line_number":375,"context_line":"#service_provider\u003dLOADBALANCER:Radware:neutron.services.loadbalancer.drivers.radware.driver.LoadBalancerDriver:default"},{"line_number":376,"context_line":"service_provider\u003dVPN:openswan:neutron.services.vpn.service_drivers.ipsec.IPsecVPNDriver:default"}],"source_content_type":"text/plain","patch_set":20,"id":"AAAATn%2F9Hzw%3D","line":375,"in_reply_to":"AAAATn%2F9IQU%3D","updated":"2014-01-22 12:10:58.000000000","message":"I think such small stylistic change is justified within unrelated patch.","commit_id":"65b96e7efc739cb5ef58b31138f4bdcb6b0709e9"}],"neutron/db/vpn/vpn_db.py":[{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"2b84f3850bb2cb0d0aa87049bfb6229706bd1e36","unresolved":false,"context_lines":[{"line_number":513,"context_line":"               \u0027subnet_id\u0027: vpnservice[\u0027subnet_id\u0027],"},{"line_number":514,"context_line":"               \u0027router_id\u0027: vpnservice[\u0027router_id\u0027],"},{"line_number":515,"context_line":"               \u0027admin_state_up\u0027: vpnservice[\u0027admin_state_up\u0027],"},{"line_number":516,"context_line":"               \u0027status\u0027: vpnservice[\u0027status\u0027]}"},{"line_number":517,"context_line":"        if vpnservice.provider:"},{"line_number":518,"context_line":"            res[\u0027provider\u0027] \u003d vpnservice.provider.provider_name"},{"line_number":519,"context_line":"        return self._fields(res, fields)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2FlNw%3D","line":516,"updated":"2013-09-03 08:43:39.000000000","message":"I think \u0027provider\u0027 should be initiated in res with an empty string as neutronclient will be looking for it (not sure however)","commit_id":"f4ec9e1258acf04af63e11b3bc7d8a869d17a403"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"96e048c04a2d30ce03e85b0dad95d09f49a9ae11","unresolved":false,"context_lines":[{"line_number":513,"context_line":"               \u0027subnet_id\u0027: vpnservice[\u0027subnet_id\u0027],"},{"line_number":514,"context_line":"               \u0027router_id\u0027: vpnservice[\u0027router_id\u0027],"},{"line_number":515,"context_line":"               \u0027admin_state_up\u0027: vpnservice[\u0027admin_state_up\u0027],"},{"line_number":516,"context_line":"               \u0027status\u0027: vpnservice[\u0027status\u0027]}"},{"line_number":517,"context_line":"        if vpnservice.provider:"},{"line_number":518,"context_line":"            res[\u0027provider\u0027] \u003d vpnservice.provider.provider_name"},{"line_number":519,"context_line":"        return self._fields(res, fields)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2FkV4%3D","line":516,"in_reply_to":"AAAASn%2F%2FlNw%3D","updated":"2013-09-03 12:12:58.000000000","message":"it\u0027s not necessary","commit_id":"f4ec9e1258acf04af63e11b3bc7d8a869d17a403"}],"neutron/services/vpn/plugin.py":[{"author":{"_account_id":2711,"name":"Zhang Hua","display_name":"Zhang Hua","email":"joshua.zhang@canonical.com","username":"zhhuabj"},"change_message_id":"3e6a87b00de3e52c218d4c1110a7ba00d5e6fb55","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    supported_extension_aliases \u003d [\"vpnaas\", \"service-type\"]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self):"},{"line_number":42,"context_line":"        \"\"\"Initialization for the loadbalancer service plugin.\"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        super(VPNPlugin, self).__init__()"},{"line_number":45,"context_line":"        self.service_type_manager \u003d st_db.ServiceTypeManager.get_instance()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F%2BcA%3D","line":42,"updated":"2013-08-14 10:34:32.000000000","message":"loadbalancer -\u003e vpn","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"6d7aeef792bf8355865fe6eb86f65b44c0322014","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    supported_extension_aliases \u003d [\"vpnaas\", \"service-type\"]"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def __init__(self):"},{"line_number":42,"context_line":"        \"\"\"Initialization for the loadbalancer service plugin.\"\"\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        super(VPNPlugin, self).__init__()"},{"line_number":45,"context_line":"        self.service_type_manager \u003d st_db.ServiceTypeManager.get_instance()"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F9Ds%3D","line":42,"in_reply_to":"AAAARH%2F%2F%2BcA%3D","updated":"2013-08-14 18:27:30.000000000","message":"Done","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"41b37fcd5b8baa78419608afb5e723fb65032b7f","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        \"\"\"Loads plugin-drivers specified in configuration.\"\"\""},{"line_number":50,"context_line":"        self.drivers, self.default_provider \u003d service_base.load_drivers("},{"line_number":51,"context_line":"            constants.VPN, self)"},{"line_number":52,"context_line":"        # noop driver will be used for unassociated"},{"line_number":53,"context_line":"        # vpnservice to preserve correctness of db operations"},{"line_number":54,"context_line":"        #TODO(nati) add noop driver"},{"line_number":55,"context_line":"        self.noop_driver \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F%2BE0%3D","line":52,"updated":"2013-08-14 13:12:20.000000000","message":"Should a noop driver be used, or just associate with the default driver?\n\nDo we require that there is a default driver?","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"6d7aeef792bf8355865fe6eb86f65b44c0322014","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        \"\"\"Loads plugin-drivers specified in configuration.\"\"\""},{"line_number":50,"context_line":"        self.drivers, self.default_provider \u003d service_base.load_drivers("},{"line_number":51,"context_line":"            constants.VPN, self)"},{"line_number":52,"context_line":"        # noop driver will be used for unassociated"},{"line_number":53,"context_line":"        # vpnservice to preserve correctness of db operations"},{"line_number":54,"context_line":"        #TODO(nati) add noop driver"},{"line_number":55,"context_line":"        self.noop_driver \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F9Dk%3D","line":52,"in_reply_to":"AAAARH%2F%2F%2BE0%3D","updated":"2013-08-14 18:27:30.000000000","message":"We should discuss this on the original patch ( service framework support for lbaas)\nNoop is needed when the operator removes services","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"41b37fcd5b8baa78419608afb5e723fb65032b7f","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        self.noop_driver \u003d None"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":58,"context_line":"        # update status of the pools if they have lost their providers"},{"line_number":59,"context_line":"        self._remove_orphan_vpnservice_associations(ctx, self.drivers.keys())"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _remove_orphan_vpnservice_associations(self, context, provider_names):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F%2BEg%3D","line":58,"updated":"2013-08-14 13:12:20.000000000","message":"pools -\u003e services","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"6d7aeef792bf8355865fe6eb86f65b44c0322014","unresolved":false,"context_lines":[{"line_number":55,"context_line":"        self.noop_driver \u003d None"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":58,"context_line":"        # update status of the pools if they have lost their providers"},{"line_number":59,"context_line":"        self._remove_orphan_vpnservice_associations(ctx, self.drivers.keys())"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _remove_orphan_vpnservice_associations(self, context, provider_names):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F9Dg%3D","line":58,"in_reply_to":"AAAARH%2F%2F%2BEg%3D","updated":"2013-08-14 18:27:30.000000000","message":"Done","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"41b37fcd5b8baa78419608afb5e723fb65032b7f","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        # update status of the pools if they have lost their providers"},{"line_number":59,"context_line":"        self._remove_orphan_vpnservice_associations(ctx, self.drivers.keys())"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _remove_orphan_vpnservice_associations(self, context, provider_names):"},{"line_number":62,"context_line":"        \"\"\"Removes remaining associations."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        If admin has not undeployed resources with provider that was deleted"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F%2BAk%3D","line":61,"updated":"2013-08-14 13:12:20.000000000","message":"Is there a test case that exercises this function?","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"6d7aeef792bf8355865fe6eb86f65b44c0322014","unresolved":false,"context_lines":[{"line_number":58,"context_line":"        # update status of the pools if they have lost their providers"},{"line_number":59,"context_line":"        self._remove_orphan_vpnservice_associations(ctx, self.drivers.keys())"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def _remove_orphan_vpnservice_associations(self, context, provider_names):"},{"line_number":62,"context_line":"        \"\"\"Removes remaining associations."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        If admin has not undeployed resources with provider that was deleted"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F8zI%3D","line":61,"in_reply_to":"AAAARH%2F%2F%2BAk%3D","updated":"2013-08-14 18:27:30.000000000","message":"Done","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"41b37fcd5b8baa78419608afb5e723fb65032b7f","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        from configuration, neutron has to remove associations and leave"},{"line_number":66,"context_line":"        resource in unassociated state. in fact, they become implicitly"},{"line_number":67,"context_line":"        associated with Noop driver."},{"line_number":68,"context_line":"        Note that statuses of pool objects are changed to ERROR."},{"line_number":69,"context_line":"        \"\"\""},{"line_number":70,"context_line":"        vpnservices \u003d self.get_vpnservices(context)"},{"line_number":71,"context_line":"        for vpnservice in vpnservices:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F%2BEU%3D","line":68,"updated":"2013-08-14 13:12:20.000000000","message":"pool -\u003e service","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"6d7aeef792bf8355865fe6eb86f65b44c0322014","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        from configuration, neutron has to remove associations and leave"},{"line_number":66,"context_line":"        resource in unassociated state. in fact, they become implicitly"},{"line_number":67,"context_line":"        associated with Noop driver."},{"line_number":68,"context_line":"        Note that statuses of pool objects are changed to ERROR."},{"line_number":69,"context_line":"        \"\"\""},{"line_number":70,"context_line":"        vpnservices \u003d self.get_vpnservices(context)"},{"line_number":71,"context_line":"        for vpnservice in vpnservices:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F9DY%3D","line":68,"in_reply_to":"AAAARH%2F%2F%2BEU%3D","updated":"2013-08-14 18:27:30.000000000","message":"Done","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"41b37fcd5b8baa78419608afb5e723fb65032b7f","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                    vpnservice[\u0027id\u0027],"},{"line_number":80,"context_line":"                    constants.ERROR)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _get_driver(self, context, obj):"},{"line_number":83,"context_line":"        provider_name \u003d \u0027\u0027"},{"line_number":84,"context_line":"        if \u0027provider\u0027 in obj:"},{"line_number":85,"context_line":"            provider_name \u003d obj[\u0027provider\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F%2BDM%3D","line":82,"updated":"2013-08-14 13:12:20.000000000","message":"Can we pick a more descriptive name than \u0027obj\u0027?","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"6d7aeef792bf8355865fe6eb86f65b44c0322014","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                    vpnservice[\u0027id\u0027],"},{"line_number":80,"context_line":"                    constants.ERROR)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _get_driver(self, context, obj):"},{"line_number":83,"context_line":"        provider_name \u003d \u0027\u0027"},{"line_number":84,"context_line":"        if \u0027provider\u0027 in obj:"},{"line_number":85,"context_line":"            provider_name \u003d obj[\u0027provider\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F9DQ%3D","line":82,"in_reply_to":"AAAARH%2F%2F%2BDM%3D","updated":"2013-08-14 18:27:30.000000000","message":"Done","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"41b37fcd5b8baa78419608afb5e723fb65032b7f","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            return pconf.normalize_provider_name(vpnservice[\u0027provider\u0027])"},{"line_number":99,"context_line":"        else:"},{"line_number":100,"context_line":"            if not self.default_provider:"},{"line_number":101,"context_line":"                raise n_exc.InvalidInput("},{"line_number":102,"context_line":"                    error_message\u003d_(\"No default provider specified \""},{"line_number":103,"context_line":"                                    \"for VPN\"))"},{"line_number":104,"context_line":"            return self.default_provider"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F%2BCg%3D","line":101,"updated":"2013-08-14 13:12:20.000000000","message":"Should there be a service type framework exception for missing default provider?","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"6d7aeef792bf8355865fe6eb86f65b44c0322014","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            return pconf.normalize_provider_name(vpnservice[\u0027provider\u0027])"},{"line_number":99,"context_line":"        else:"},{"line_number":100,"context_line":"            if not self.default_provider:"},{"line_number":101,"context_line":"                raise n_exc.InvalidInput("},{"line_number":102,"context_line":"                    error_message\u003d_(\"No default provider specified \""},{"line_number":103,"context_line":"                                    \"for VPN\"))"},{"line_number":104,"context_line":"            return self.default_provider"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F9DM%3D","line":101,"in_reply_to":"AAAARH%2F%2F%2BCg%3D","updated":"2013-08-14 18:27:30.000000000","message":"Le\u0027ts discuss this on the base patch.","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"41b37fcd5b8baa78419608afb5e723fb65032b7f","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        provider_name \u003d self._get_provider_name("},{"line_number":108,"context_line":"            context, vpnservice[\u0027vpnservice\u0027])"},{"line_number":109,"context_line":"        self.validate_provider(provider_name)"},{"line_number":110,"context_line":"        v \u003d super(VPNPlugin, self).create_vpnservice(context, vpnservice)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        self.service_type_manager.add_resource_association("},{"line_number":113,"context_line":"            context,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F%2BCQ%3D","line":110,"updated":"2013-08-14 13:12:20.000000000","message":"service vs v?","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"6d7aeef792bf8355865fe6eb86f65b44c0322014","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        provider_name \u003d self._get_provider_name("},{"line_number":108,"context_line":"            context, vpnservice[\u0027vpnservice\u0027])"},{"line_number":109,"context_line":"        self.validate_provider(provider_name)"},{"line_number":110,"context_line":"        v \u003d super(VPNPlugin, self).create_vpnservice(context, vpnservice)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"        self.service_type_manager.add_resource_association("},{"line_number":113,"context_line":"            context,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F9DI%3D","line":110,"in_reply_to":"AAAARH%2F%2F%2BCQ%3D","updated":"2013-08-14 18:27:30.000000000","message":"Done","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"41b37fcd5b8baa78419608afb5e723fb65032b7f","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def validate_provider(self, provider):"},{"line_number":125,"context_line":"        if provider not in self.drivers:"},{"line_number":126,"context_line":"            raise n_exc.InvalidInput("},{"line_number":127,"context_line":"                error_message\u003d_(\"No provider with name \u0027%s\u0027 found.\") %"},{"line_number":128,"context_line":"                provider)"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F%2BCE%3D","line":126,"updated":"2013-08-14 13:12:20.000000000","message":"Same question about having a more specific exception that applies to all service type framework exceptions.","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"6d7aeef792bf8355865fe6eb86f65b44c0322014","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def validate_provider(self, provider):"},{"line_number":125,"context_line":"        if provider not in self.drivers:"},{"line_number":126,"context_line":"            raise n_exc.InvalidInput("},{"line_number":127,"context_line":"                error_message\u003d_(\"No provider with name \u0027%s\u0027 found.\") %"},{"line_number":128,"context_line":"                provider)"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F9DE%3D","line":126,"in_reply_to":"AAAARH%2F%2F%2BCE%3D","updated":"2013-08-14 18:27:30.000000000","message":"ditto","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b42795c0943f65a75445f413d5b99eee18fb40d0","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if provider_name:"},{"line_number":92,"context_line":"            return self.drivers.get(provider_name, self.noop_driver)"},{"line_number":93,"context_line":"        # handle unassociated pools with noop driver"},{"line_number":94,"context_line":"        return self.noop_driver"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _get_provider_name(self, context, vpnservice):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8hw%3D","line":93,"updated":"2013-08-14 20:05:46.000000000","message":"pools -\u003e services","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"5bbce425e4d3e75f61959bdd583a49864d4228b4","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        if provider_name:"},{"line_number":92,"context_line":"            return self.drivers.get(provider_name, self.noop_driver)"},{"line_number":93,"context_line":"        # handle unassociated pools with noop driver"},{"line_number":94,"context_line":"        return self.noop_driver"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"    def _get_provider_name(self, context, vpnservice):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8Lo%3D","line":93,"in_reply_to":"AAAARH%2F%2F8hw%3D","updated":"2013-08-14 21:44:17.000000000","message":"Done","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b42795c0943f65a75445f413d5b99eee18fb40d0","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            constants.VPN,"},{"line_number":116,"context_line":"            provider_name, service[\u0027id\u0027])"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        #need to add provider name to pool dict,"},{"line_number":119,"context_line":"        #because provider was not known to db plugin at pool creation"},{"line_number":120,"context_line":"        service[\u0027provider\u0027] \u003d provider_name"},{"line_number":121,"context_line":"        driver \u003d self.drivers[provider_name]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8hs%3D","line":118,"updated":"2013-08-14 20:05:46.000000000","message":"pool -\u003e service","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"5bbce425e4d3e75f61959bdd583a49864d4228b4","unresolved":false,"context_lines":[{"line_number":115,"context_line":"            constants.VPN,"},{"line_number":116,"context_line":"            provider_name, service[\u0027id\u0027])"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        #need to add provider name to pool dict,"},{"line_number":119,"context_line":"        #because provider was not known to db plugin at pool creation"},{"line_number":120,"context_line":"        service[\u0027provider\u0027] \u003d provider_name"},{"line_number":121,"context_line":"        driver \u003d self.drivers[provider_name]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8Lc%3D","line":118,"in_reply_to":"AAAARH%2F%2F8hs%3D","updated":"2013-08-14 21:44:17.000000000","message":"Done","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b42795c0943f65a75445f413d5b99eee18fb40d0","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            provider_name, service[\u0027id\u0027])"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        #need to add provider name to pool dict,"},{"line_number":119,"context_line":"        #because provider was not known to db plugin at pool creation"},{"line_number":120,"context_line":"        service[\u0027provider\u0027] \u003d provider_name"},{"line_number":121,"context_line":"        driver \u003d self.drivers[provider_name]"},{"line_number":122,"context_line":"        driver.create_vpnservice(context, service)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8ho%3D","line":119,"updated":"2013-08-14 20:05:46.000000000","message":"pool-\u003eservice","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"5bbce425e4d3e75f61959bdd583a49864d4228b4","unresolved":false,"context_lines":[{"line_number":116,"context_line":"            provider_name, service[\u0027id\u0027])"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        #need to add provider name to pool dict,"},{"line_number":119,"context_line":"        #because provider was not known to db plugin at pool creation"},{"line_number":120,"context_line":"        service[\u0027provider\u0027] \u003d provider_name"},{"line_number":121,"context_line":"        driver \u003d self.drivers[provider_name]"},{"line_number":122,"context_line":"        driver.create_vpnservice(context, service)"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8LY%3D","line":119,"in_reply_to":"AAAARH%2F%2F8ho%3D","updated":"2013-08-14 21:44:17.000000000","message":"Done","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"60bac246a5410332f7004dd190b49c463d4c111a","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        # vpnservice to preserve correctness of db operations"},{"line_number":55,"context_line":"        self.noop_driver \u003d service_drivers.NoopVPNDriver(self)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":58,"context_line":"        # update status of the services if they have lost their providers"},{"line_number":59,"context_line":"        self._remove_orphan_vpnservice_associations(ctx, self.drivers.keys())"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2FuO4%3D","line":57,"updated":"2013-08-30 13:05:56.000000000","message":"Consider to prevent gate failure:\n\nctx \u003d context.get_admin_context(load_admin_roles\u003dFalse)","commit_id":"c065005cdb01321db287ac6876739616e8dd40f3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"20ce7756883c6e54eef992fbcb9cd29241a291c6","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        # vpnservice to preserve correctness of db operations"},{"line_number":55,"context_line":"        self.noop_driver \u003d service_drivers.NoopVPNDriver(self)"},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":58,"context_line":"        # update status of the services if they have lost their providers"},{"line_number":59,"context_line":"        self._remove_orphan_vpnservice_associations(ctx, self.drivers.keys())"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2Fl0w%3D","line":57,"in_reply_to":"AAAASn%2F%2FuO4%3D","updated":"2013-09-03 03:06:04.000000000","message":"Done","commit_id":"c065005cdb01321db287ac6876739616e8dd40f3"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"7a3637f2dfdd71b8a641577c79d67a53bae4da01","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        If admin has not undeployed resources with provider that was deleted"},{"line_number":65,"context_line":"        from configuration, neutron has to remove associations and leave"},{"line_number":66,"context_line":"        resource in unassociated state. in fact, they become implicitly"},{"line_number":67,"context_line":"        associated with Noop driver."},{"line_number":68,"context_line":"        Note that statuses of service objects are changed to ERROR."},{"line_number":69,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2FuIc%3D","line":66,"updated":"2013-08-30 13:40:54.000000000","message":"in -\u003e In","commit_id":"c065005cdb01321db287ac6876739616e8dd40f3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"20ce7756883c6e54eef992fbcb9cd29241a291c6","unresolved":false,"context_lines":[{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        If admin has not undeployed resources with provider that was deleted"},{"line_number":65,"context_line":"        from configuration, neutron has to remove associations and leave"},{"line_number":66,"context_line":"        resource in unassociated state. in fact, they become implicitly"},{"line_number":67,"context_line":"        associated with Noop driver."},{"line_number":68,"context_line":"        Note that statuses of service objects are changed to ERROR."},{"line_number":69,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2Fl0o%3D","line":66,"in_reply_to":"AAAASn%2F%2FuIc%3D","updated":"2013-09-03 03:06:04.000000000","message":"Done","commit_id":"c065005cdb01321db287ac6876739616e8dd40f3"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"7a3637f2dfdd71b8a641577c79d67a53bae4da01","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            if not self.default_provider:"},{"line_number":102,"context_line":"                raise n_exc.InvalidInput("},{"line_number":103,"context_line":"                    error_message\u003d_(\"No default provider specified \""},{"line_number":104,"context_line":"                                    \"for VPN\"))"},{"line_number":105,"context_line":"            return self.default_provider"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def create_vpnservice(self, context, vpnservice):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2FuIM%3D","line":104,"updated":"2013-08-30 13:40:54.000000000","message":"Include the vpnservice id in message?","commit_id":"c065005cdb01321db287ac6876739616e8dd40f3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"20ce7756883c6e54eef992fbcb9cd29241a291c6","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            if not self.default_provider:"},{"line_number":102,"context_line":"                raise n_exc.InvalidInput("},{"line_number":103,"context_line":"                    error_message\u003d_(\"No default provider specified \""},{"line_number":104,"context_line":"                                    \"for VPN\"))"},{"line_number":105,"context_line":"            return self.default_provider"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def create_vpnservice(self, context, vpnservice):"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2Fl0U%3D","line":104,"in_reply_to":"AAAASn%2F%2FuIM%3D","updated":"2013-09-03 03:06:04.000000000","message":"Done","commit_id":"c065005cdb01321db287ac6876739616e8dd40f3"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"75a182f84a56cfc813daeb0fc9afaed71b5b4358","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        self._check_orphan_vpnservice_associations(ctx, self.drivers.keys())"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def _check_orphan_vpnservice_associations(self, context, provider_names):"},{"line_number":57,"context_line":"        \"\"\"Check remaining associations."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        Administrator should delete all associations"},{"line_number":60,"context_line":"        before removing a provider"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2Fkas%3D","line":57,"updated":"2013-09-03 12:10:26.000000000","message":"Ensure no orphaned providers for existing services.","commit_id":"f4ec9e1258acf04af63e11b3bc7d8a869d17a403"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"75a182f84a56cfc813daeb0fc9afaed71b5b4358","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        \"\"\"Check remaining associations."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        Administrator should delete all associations"},{"line_number":60,"context_line":"        before removing a provider"},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        vpnservices \u003d self.get_vpnservices(context)"},{"line_number":63,"context_line":"        for vpnservice in vpnservices:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2Fkak%3D","line":60,"updated":"2013-09-03 12:10:26.000000000","message":"add period.","commit_id":"f4ec9e1258acf04af63e11b3bc7d8a869d17a403"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"35d61b4b0c85ccf5d62736e7b8ebbc03e65d852a","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        \"\"\"Check remaining associations."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        Administrator should delete all associations"},{"line_number":60,"context_line":"        before removing a provider"},{"line_number":61,"context_line":"        \"\"\""},{"line_number":62,"context_line":"        vpnservices \u003d self.get_vpnservices(context)"},{"line_number":63,"context_line":"        for vpnservice in vpnservices:"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2FhvQ%3D","line":60,"in_reply_to":"AAAASn%2F%2Fkak%3D","updated":"2013-09-03 19:47:20.000000000","message":"Done","commit_id":"f4ec9e1258acf04af63e11b3bc7d8a869d17a403"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"75a182f84a56cfc813daeb0fc9afaed71b5b4358","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        vpnservices \u003d self.get_vpnservices(context)"},{"line_number":63,"context_line":"        for vpnservice in vpnservices:"},{"line_number":64,"context_line":"            if vpnservice[\u0027provider\u0027] not in provider_names:"},{"line_number":65,"context_line":"                raise SystemExit(_(\"Delete associated vpnservice \""},{"line_number":66,"context_line":"                                   \"before removing provider %s\") %"},{"line_number":67,"context_line":"                                 vpnservice[\u0027provider\u0027])"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2FkaU%3D","line":65,"updated":"2013-09-03 12:10:26.000000000","message":"Rather than failing, if there is no provider any more, can we prevent provider from being removed, if services are still using provider?","commit_id":"f4ec9e1258acf04af63e11b3bc7d8a869d17a403"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"96e048c04a2d30ce03e85b0dad95d09f49a9ae11","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        vpnservices \u003d self.get_vpnservices(context)"},{"line_number":63,"context_line":"        for vpnservice in vpnservices:"},{"line_number":64,"context_line":"            if vpnservice[\u0027provider\u0027] not in provider_names:"},{"line_number":65,"context_line":"                raise SystemExit(_(\"Delete associated vpnservice \""},{"line_number":66,"context_line":"                                   \"before removing provider %s\") %"},{"line_number":67,"context_line":"                                 vpnservice[\u0027provider\u0027])"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2FkVc%3D","line":65,"in_reply_to":"AAAASn%2F%2FkaU%3D","updated":"2013-09-03 12:12:58.000000000","message":"No. providers are removed from conf file, there\u0027s not way to detect such condition at runtime.","commit_id":"f4ec9e1258acf04af63e11b3bc7d8a869d17a403"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7e9a76912555fa16c00f31fb50050b499a9979b8","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _get_provider_name(self, context, vpnservice):"},{"line_number":80,"context_line":"        if (\u0027provider\u0027 in vpnservice and"},{"line_number":81,"context_line":"            vpnservice[\u0027provider\u0027] !\u003d attrs.ATTR_NOT_SPECIFIED):"},{"line_number":82,"context_line":"            return pconf.normalize_provider_name(vpnservice[\u0027provider\u0027])"},{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            if not self.default_provider:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhKs%3D","line":81,"updated":"2013-09-03 21:24:13.000000000","message":"The usual way is:\n  if is_attr_set(vpnservice.get(\u0027provider\u0027)):","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"1c963f5e03e4a8d7266ddcd917896dc457def38e","unresolved":false,"context_lines":[{"line_number":78,"context_line":""},{"line_number":79,"context_line":"    def _get_provider_name(self, context, vpnservice):"},{"line_number":80,"context_line":"        if (\u0027provider\u0027 in vpnservice and"},{"line_number":81,"context_line":"            vpnservice[\u0027provider\u0027] !\u003d attrs.ATTR_NOT_SPECIFIED):"},{"line_number":82,"context_line":"            return pconf.normalize_provider_name(vpnservice[\u0027provider\u0027])"},{"line_number":83,"context_line":"        else:"},{"line_number":84,"context_line":"            if not self.default_provider:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhEk%3D","line":81,"in_reply_to":"AAAASn%2F%2FhKs%3D","updated":"2013-09-03 21:40:03.000000000","message":"Done","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7e9a76912555fa16c00f31fb50050b499a9979b8","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    def create_vpnservice(self, context, vpnservice):"},{"line_number":91,"context_line":"        provider_name \u003d self._get_provider_name("},{"line_number":92,"context_line":"            context, vpnservice[\u0027vpnservice\u0027])"},{"line_number":93,"context_line":"        self.validate_provider(provider_name)"},{"line_number":94,"context_line":"        service \u003d super(VPNPlugin, self).create_vpnservice(context, vpnservice)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        self.service_type_manager.add_resource_association("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhKo%3D","line":93,"updated":"2013-09-03 21:24:13.000000000","message":"It is better to merge _get_provider_name and validate_provider into one method (e.g., _associate_provider_for_vpnservice).","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"1c963f5e03e4a8d7266ddcd917896dc457def38e","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    def create_vpnservice(self, context, vpnservice):"},{"line_number":91,"context_line":"        provider_name \u003d self._get_provider_name("},{"line_number":92,"context_line":"            context, vpnservice[\u0027vpnservice\u0027])"},{"line_number":93,"context_line":"        self.validate_provider(provider_name)"},{"line_number":94,"context_line":"        service \u003d super(VPNPlugin, self).create_vpnservice(context, vpnservice)"},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        self.service_type_manager.add_resource_association("}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhEc%3D","line":93,"in_reply_to":"AAAASn%2F%2FhKo%3D","updated":"2013-09-03 21:40:03.000000000","message":"Done","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7e9a76912555fa16c00f31fb50050b499a9979b8","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        self.service_type_manager.add_resource_association("},{"line_number":97,"context_line":"            context,"},{"line_number":98,"context_line":"            constants.VPN,"},{"line_number":99,"context_line":"            provider_name, service[\u0027id\u0027])"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        #need to add provider name to vpnservice dict,"},{"line_number":102,"context_line":"        #because provider was not known to db plugin at vpnservice creation"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhKQ%3D","line":99,"updated":"2013-09-03 21:24:13.000000000","message":"How about making L.92-94 and L.97-100 into one method? It can be done by wrapping L.92-100 including db.create_vpnservice with a transaction.\n  with context.session.begin(subtransaction\u003dTrue):\n    provider_name \u003d self._associate_provider_for_vpnservice(context, vpnservice)\n    service \u003d super(VPNPlugin, self).create_vpnservice(..)","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"1c963f5e03e4a8d7266ddcd917896dc457def38e","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        self.service_type_manager.add_resource_association("},{"line_number":97,"context_line":"            context,"},{"line_number":98,"context_line":"            constants.VPN,"},{"line_number":99,"context_line":"            provider_name, service[\u0027id\u0027])"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        #need to add provider name to vpnservice dict,"},{"line_number":102,"context_line":"        #because provider was not known to db plugin at vpnservice creation"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhDY%3D","line":99,"in_reply_to":"AAAASn%2F%2FhKQ%3D","updated":"2013-09-03 21:40:03.000000000","message":"IMO, we need vpnservice id for associating provider","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"2d435ccaf7f0cd13419d80214f4863172ebf52e3","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _get_provider_name(self, context, vpnservice):"},{"line_number":86,"context_line":"        if attrs.is_attr_set(vpnservice.get(\u0027provider\u0027)):"},{"line_number":87,"context_line":"            self.validate_provider(vpnservice[\u0027provider\u0027])"},{"line_number":88,"context_line":"            return pconf.normalize_provider_name(vpnservice[\u0027provider\u0027])"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        if not self.default_provider:"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAASn%2F%2FdlY%3D","line":87,"updated":"2013-09-04 14:13:38.000000000","message":"you need to normalize the name first, otherwise proviver will be case sensitive","commit_id":"87c39a6a09cb9b987eb9d7b1a3b056eb565a8ecf"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"dc7d28434ac179c3cdba487c1ab7f5eb7552e967","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def _get_provider_name(self, context, vpnservice):"},{"line_number":86,"context_line":"        if attrs.is_attr_set(vpnservice.get(\u0027provider\u0027)):"},{"line_number":87,"context_line":"            self.validate_provider(vpnservice[\u0027provider\u0027])"},{"line_number":88,"context_line":"            return pconf.normalize_provider_name(vpnservice[\u0027provider\u0027])"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        if not self.default_provider:"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAASn%2F%2FcGw%3D","line":87,"in_reply_to":"AAAASn%2F%2FdlY%3D","updated":"2013-09-04 18:30:02.000000000","message":"Done","commit_id":"87c39a6a09cb9b987eb9d7b1a3b056eb565a8ecf"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"58dfa7788b82f88536510858c86b8e5f188f3014","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        self.service_type_manager.del_resource_associations(context, [id])"},{"line_number":133,"context_line":"        super(VPNDriverPlugin, self).delete_vpnservice(context, id)"},{"line_number":134,"context_line":"        driver \u003d self._get_driver_for_vpnservice(context, vpnservice)"},{"line_number":135,"context_line":"        driver.delete_vpnservice(context, vpnservice)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def create_ipsec_site_connection(self, context, ipsec_site_connection):"},{"line_number":138,"context_line":"        ipsec_site_connection \u003d super("}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAASn%2F%2FbW0%3D","line":135,"updated":"2013-09-04 21:09:39.000000000","message":"don\u0027t we want the driver to delete the resource before calling delete in the super?","commit_id":"fa6029e608fbc0bc4712c56493b43807bf46d535"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7494cb549339a9b14410ea842d4e5afa1f8c717b","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        self.service_type_manager.del_resource_associations(context, [id])"},{"line_number":133,"context_line":"        super(VPNDriverPlugin, self).delete_vpnservice(context, id)"},{"line_number":134,"context_line":"        driver \u003d self._get_driver_for_vpnservice(context, vpnservice)"},{"line_number":135,"context_line":"        driver.delete_vpnservice(context, vpnservice)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def create_ipsec_site_connection(self, context, ipsec_site_connection):"},{"line_number":138,"context_line":"        ipsec_site_connection \u003d super("}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAASn%2F%2Fa%2Bo%3D","line":135,"in_reply_to":"AAAASn%2F%2FbW0%3D","updated":"2013-09-04 23:26:03.000000000","message":"yes. This is current limitation of vpnaas.","commit_id":"fa6029e608fbc0bc4712c56493b43807bf46d535"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"change_message_id":"7eb288a8bd96e784f0ff8fd669238fabc94e3be6","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        \"\"\""},{"line_number":78,"context_line":"        vpnservices \u003d self.get_vpnservices(context)"},{"line_number":79,"context_line":"        for vpnservice in vpnservices:"},{"line_number":80,"context_line":"            if vpnservice[\u0027provider\u0027] not in provider_names:"},{"line_number":81,"context_line":"                raise SystemExit(_(\"Delete associated vpnservice \""},{"line_number":82,"context_line":"                                   \"before removing provider %s\") %"},{"line_number":83,"context_line":"                                 vpnservice[\u0027provider\u0027])"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAASn%2F%2FZVQ%3D","line":80,"updated":"2013-09-05 08:22:44.000000000","message":"would be usefull to get a set of all providers that were deleted while having active associations thus preventing multiple server start failures (for each provider separately). Pl. see same part of code in lbaas integration patch","commit_id":"9c6bf7ace354542a60af32efca76774ef6344f30"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"03209f424f4afbfb1deebf0cabb03bf8f3e55580","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        \"\"\""},{"line_number":78,"context_line":"        vpnservices \u003d self.get_vpnservices(context)"},{"line_number":79,"context_line":"        for vpnservice in vpnservices:"},{"line_number":80,"context_line":"            if vpnservice[\u0027provider\u0027] not in provider_names:"},{"line_number":81,"context_line":"                raise SystemExit(_(\"Delete associated vpnservice \""},{"line_number":82,"context_line":"                                   \"before removing provider %s\") %"},{"line_number":83,"context_line":"                                 vpnservice[\u0027provider\u0027])"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAASn%2F%2FZR8%3D","line":80,"in_reply_to":"AAAASn%2F%2FZVQ%3D","updated":"2013-09-05 08:31:57.000000000","message":"sure","commit_id":"9c6bf7ace354542a60af32efca76774ef6344f30"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"change_message_id":"83a66425a22b0f89ef6e0e11d226c65a0eac473f","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        updated_vpnservice \u003d super(VPNDriverPlugin, self).update_vpnservice("},{"line_number":131,"context_line":"            context, id, vpnservice)"},{"line_number":132,"context_line":"        driver \u003d self._get_driver_for_vpnservice(context, updated_vpnservice)"},{"line_number":133,"context_line":"        driver.update_vpnservice(context, old_vpnservice, updated_vpnservice)"},{"line_number":134,"context_line":"        return updated_vpnservice"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def delete_vpnservice(self, context, id):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2FHGg%3D","line":133,"updated":"2013-11-14 10:07:45.000000000","message":"whether the provider name should also be provided in updated_vpnservice?","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"57aced4d41c28ab2545dc580fdc75aa3d50ae067","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        updated_vpnservice \u003d super(VPNDriverPlugin, self).update_vpnservice("},{"line_number":131,"context_line":"            context, id, vpnservice)"},{"line_number":132,"context_line":"        driver \u003d self._get_driver_for_vpnservice(context, updated_vpnservice)"},{"line_number":133,"context_line":"        driver.update_vpnservice(context, old_vpnservice, updated_vpnservice)"},{"line_number":134,"context_line":"        return updated_vpnservice"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def delete_vpnservice(self, context, id):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BYGc%3D","line":133,"in_reply_to":"AAAATn%2F%2FGqg%3D","updated":"2013-11-26 18:51:39.000000000","message":"We can\u0027t update provider name here","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"fe0d36bcd8bc88a47f97b6b1bdcf1053c2191f50","unresolved":false,"context_lines":[{"line_number":130,"context_line":"        updated_vpnservice \u003d super(VPNDriverPlugin, self).update_vpnservice("},{"line_number":131,"context_line":"            context, id, vpnservice)"},{"line_number":132,"context_line":"        driver \u003d self._get_driver_for_vpnservice(context, updated_vpnservice)"},{"line_number":133,"context_line":"        driver.update_vpnservice(context, old_vpnservice, updated_vpnservice)"},{"line_number":134,"context_line":"        return updated_vpnservice"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def delete_vpnservice(self, context, id):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2FGqg%3D","line":133,"in_reply_to":"AAAATn%2F%2FHGg%3D","updated":"2013-11-14 11:55:01.000000000","message":"No. Why?","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"e7cb201e49a9b22c357ec29fc19e3fdc9409fd4f","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                              if vpnservice[\u0027provider\u0027] not in provider_names])"},{"line_number":85,"context_line":"        if lost_providers:"},{"line_number":86,"context_line":"            msg \u003d _(\"Delete associated vpnservices \""},{"line_number":87,"context_line":"                    \"before removings providers %s\") % list(lost_providers)"},{"line_number":88,"context_line":"            LOG.exception(msg)"},{"line_number":89,"context_line":"            raise SystemExit(msg)"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUH%2F%2BxPY%3D","line":87,"updated":"2014-01-22 12:10:58.000000000","message":"typo: before removing","commit_id":"65b96e7efc739cb5ef58b31138f4bdcb6b0709e9"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"cf232108b518f662e7e74f69eb17638dbf4e0e13","unresolved":false,"context_lines":[{"line_number":84,"context_line":"                              if vpnservice[\u0027provider\u0027] not in provider_names])"},{"line_number":85,"context_line":"        if lost_providers:"},{"line_number":86,"context_line":"            msg \u003d _(\"Delete associated vpnservices \""},{"line_number":87,"context_line":"                    \"before removings providers %s\") % list(lost_providers)"},{"line_number":88,"context_line":"            LOG.exception(msg)"},{"line_number":89,"context_line":"            raise SystemExit(msg)"},{"line_number":90,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2FC08%3D","line":87,"in_reply_to":"AAAAUH%2F%2BxPY%3D","updated":"2014-02-17 13:37:51.000000000","message":"Will change.","commit_id":"65b96e7efc739cb5ef58b31138f4bdcb6b0709e9"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"af30e159a1782b91b1fa374a3137d8701c79a329","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron.api.v2 import attributes as attrs"},{"line_number":22,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":23,"context_line":"from neutron import context"},{"line_number":24,"context_line":"from neutron.db import servicetype_db as st_db"},{"line_number":25,"context_line":"from neutron.db.vpn import vpn_db"},{"line_number":26,"context_line":"from neutron.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAU3%2F%2FwOQ%3D","line":23,"updated":"2014-02-25 01:32:36.000000000","message":"You are importing this module as \u0027context\u0027 when in several places \u0027context\u0027 is already used as an argument or local variable. I suggest import this module as n_ctx or something, to avoid confusion.","commit_id":"cacd750b332cb0aedd83dca80e589abd55c64c4a"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"1b80cc975e282d2da8e5d8485fef6c221ced6026","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from neutron.api.v2 import attributes as attrs"},{"line_number":22,"context_line":"from neutron.common import exceptions as n_exc"},{"line_number":23,"context_line":"from neutron import context"},{"line_number":24,"context_line":"from neutron.db import servicetype_db as st_db"},{"line_number":25,"context_line":"from neutron.db.vpn import vpn_db"},{"line_number":26,"context_line":"from neutron.openstack.common import log as logging"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAU3%2F%2Fuxs%3D","line":23,"in_reply_to":"AAAAU3%2F%2FwOQ%3D","updated":"2014-02-25 02:31:47.000000000","message":"Done","commit_id":"cacd750b332cb0aedd83dca80e589abd55c64c4a"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"af30e159a1782b91b1fa374a3137d8701c79a329","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        # check status of the services if they have lost their providers"},{"line_number":63,"context_line":"        self._check_orphan_vpnservice_associations(ctx, self.drivers.keys())"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _get_driver_for_vpnservice(self, context, resource):"},{"line_number":66,"context_line":"        provider_name \u003d resource[\u0027provider\u0027]"},{"line_number":67,"context_line":"        return self.drivers[provider_name]"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAU3%2F%2FvbM%3D","line":65,"updated":"2014-02-25 01:32:36.000000000","message":"context not used here.","commit_id":"cacd750b332cb0aedd83dca80e589abd55c64c4a"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"1b80cc975e282d2da8e5d8485fef6c221ced6026","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        # check status of the services if they have lost their providers"},{"line_number":63,"context_line":"        self._check_orphan_vpnservice_associations(ctx, self.drivers.keys())"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _get_driver_for_vpnservice(self, context, resource):"},{"line_number":66,"context_line":"        provider_name \u003d resource[\u0027provider\u0027]"},{"line_number":67,"context_line":"        return self.drivers[provider_name]"},{"line_number":68,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAU3%2F%2Fuwk%3D","line":65,"in_reply_to":"AAAAU3%2F%2FvbM%3D","updated":"2014-02-25 02:31:47.000000000","message":"Done","commit_id":"cacd750b332cb0aedd83dca80e589abd55c64c4a"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"af30e159a1782b91b1fa374a3137d8701c79a329","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            LOG.exception(msg)"},{"line_number":89,"context_line":"            raise SystemExit(msg)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _get_provider_name(self, context, vpnservice):"},{"line_number":92,"context_line":"        if attrs.is_attr_set(vpnservice.get(\u0027provider\u0027)):"},{"line_number":93,"context_line":"            provider_name \u003d pconf.normalize_provider_name("},{"line_number":94,"context_line":"                vpnservice[\u0027provider\u0027])"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAU3%2F%2Fvac%3D","line":91,"updated":"2014-02-25 01:32:36.000000000","message":"context not used here.","commit_id":"cacd750b332cb0aedd83dca80e589abd55c64c4a"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"1b80cc975e282d2da8e5d8485fef6c221ced6026","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            LOG.exception(msg)"},{"line_number":89,"context_line":"            raise SystemExit(msg)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def _get_provider_name(self, context, vpnservice):"},{"line_number":92,"context_line":"        if attrs.is_attr_set(vpnservice.get(\u0027provider\u0027)):"},{"line_number":93,"context_line":"            provider_name \u003d pconf.normalize_provider_name("},{"line_number":94,"context_line":"                vpnservice[\u0027provider\u0027])"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAU3%2F%2Fuwc%3D","line":91,"in_reply_to":"AAAAU3%2F%2Fvac%3D","updated":"2014-02-25 02:31:47.000000000","message":"Done","commit_id":"cacd750b332cb0aedd83dca80e589abd55c64c4a"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"af30e159a1782b91b1fa374a3137d8701c79a329","unresolved":false,"context_lines":[{"line_number":125,"context_line":"                error_message\u003d_(\"No provider with name \u0027%s\u0027 found.\") %"},{"line_number":126,"context_line":"                provider)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def update_vpnservice(self, context, id, vpnservice):"},{"line_number":129,"context_line":"        old_vpnservice \u003d self.get_vpnservice(context, id)"},{"line_number":130,"context_line":"        updated_vpnservice \u003d super(VPNDriverPlugin, self).update_vpnservice("},{"line_number":131,"context_line":"            context, id, vpnservice)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAU3%2F%2FvZo%3D","line":128,"updated":"2014-02-25 01:32:36.000000000","message":"Since id is a Python built-in function, I recommend renaming this argument to vpnservice_id.","commit_id":"cacd750b332cb0aedd83dca80e589abd55c64c4a"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"1b80cc975e282d2da8e5d8485fef6c221ced6026","unresolved":false,"context_lines":[{"line_number":125,"context_line":"                error_message\u003d_(\"No provider with name \u0027%s\u0027 found.\") %"},{"line_number":126,"context_line":"                provider)"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    def update_vpnservice(self, context, id, vpnservice):"},{"line_number":129,"context_line":"        old_vpnservice \u003d self.get_vpnservice(context, id)"},{"line_number":130,"context_line":"        updated_vpnservice \u003d super(VPNDriverPlugin, self).update_vpnservice("},{"line_number":131,"context_line":"            context, id, vpnservice)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAU3%2F%2FuwA%3D","line":128,"in_reply_to":"AAAAU3%2F%2FvZo%3D","updated":"2014-02-25 02:31:47.000000000","message":"I agree, but this is a common style in neutron, so I think this is also OK","commit_id":"cacd750b332cb0aedd83dca80e589abd55c64c4a"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"af30e159a1782b91b1fa374a3137d8701c79a329","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        driver.update_vpnservice(context, old_vpnservice, updated_vpnservice)"},{"line_number":134,"context_line":"        return updated_vpnservice"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def delete_vpnservice(self, context, id):"},{"line_number":137,"context_line":"        vpnservice \u003d self.get_vpnservice(context, id)"},{"line_number":138,"context_line":"        self.service_type_manager.del_resource_associations(context, [id])"},{"line_number":139,"context_line":"        super(VPNDriverPlugin, self).delete_vpnservice(context, id)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAU3%2F%2FvZg%3D","line":136,"updated":"2014-02-25 01:32:36.000000000","message":"id -\u003e vpnservice_id","commit_id":"cacd750b332cb0aedd83dca80e589abd55c64c4a"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"1b80cc975e282d2da8e5d8485fef6c221ced6026","unresolved":false,"context_lines":[{"line_number":133,"context_line":"        driver.update_vpnservice(context, old_vpnservice, updated_vpnservice)"},{"line_number":134,"context_line":"        return updated_vpnservice"},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"    def delete_vpnservice(self, context, id):"},{"line_number":137,"context_line":"        vpnservice \u003d self.get_vpnservice(context, id)"},{"line_number":138,"context_line":"        self.service_type_manager.del_resource_associations(context, [id])"},{"line_number":139,"context_line":"        super(VPNDriverPlugin, self).delete_vpnservice(context, id)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAU3%2F%2Fuv8%3D","line":136,"in_reply_to":"AAAAU3%2F%2FvZg%3D","updated":"2014-02-25 02:31:47.000000000","message":"commented above","commit_id":"cacd750b332cb0aedd83dca80e589abd55c64c4a"}],"neutron/services/vpn/service_drivers/__init__.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b42795c0943f65a75445f413d5b99eee18fb40d0","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    def delete_vpnservice(self, context, vpnservice):"},{"line_number":62,"context_line":"        pass"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    #vpnaas service may extend actions"},{"line_number":65,"context_line":"    #so we need handle that in noop"},{"line_number":66,"context_line":"    def __getattr__(self, key):"},{"line_number":67,"context_line":"        def noop_function(*args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8fI%3D","line":64,"updated":"2013-08-14 20:05:46.000000000","message":"Add as a docstring","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"5bbce425e4d3e75f61959bdd583a49864d4228b4","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    def delete_vpnservice(self, context, vpnservice):"},{"line_number":62,"context_line":"        pass"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    #vpnaas service may extend actions"},{"line_number":65,"context_line":"    #so we need handle that in noop"},{"line_number":66,"context_line":"    def __getattr__(self, key):"},{"line_number":67,"context_line":"        def noop_function(*args, **kwargs):"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8Ko%3D","line":64,"in_reply_to":"AAAARH%2F%2F8fI%3D","updated":"2013-08-14 21:44:17.000000000","message":"Done","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b42795c0943f65a75445f413d5b99eee18fb40d0","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        )"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    #vpnaas service may extend actions"},{"line_number":104,"context_line":"    #so we need handle there resources"},{"line_number":105,"context_line":"    def __getattr__(self, key):"},{"line_number":106,"context_line":"        def rpc_call_function(context, resource):"},{"line_number":107,"context_line":"            vpnservice \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8gc%3D","line":104,"updated":"2013-08-14 20:05:46.000000000","message":"there -\u003e their\n\nAdd this as a docstring.","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"5bbce425e4d3e75f61959bdd583a49864d4228b4","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        )"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"    #vpnaas service may extend actions"},{"line_number":104,"context_line":"    #so we need handle there resources"},{"line_number":105,"context_line":"    def __getattr__(self, key):"},{"line_number":106,"context_line":"        def rpc_call_function(context, resource):"},{"line_number":107,"context_line":"            vpnservice \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8KQ%3D","line":104,"in_reply_to":"AAAARH%2F%2F8gc%3D","updated":"2013-08-14 21:44:17.000000000","message":"Done","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b42795c0943f65a75445f413d5b99eee18fb40d0","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                vpnservice \u003d self.plugin.get_vpnservice("},{"line_number":110,"context_line":"                    context, resource[\u0027vpnservice_id\u0027])"},{"line_number":111,"context_line":"            else:"},{"line_number":112,"context_line":"                return"},{"line_number":113,"context_line":"            topic \u003d vpnservice[\u0027provider\u0027]"},{"line_number":114,"context_line":"            self.agent_rpc.call("},{"line_number":115,"context_line":"                context,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8gE%3D","line":112,"updated":"2013-08-14 20:05:46.000000000","message":"Should this just return or throw an exception?","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"5bbce425e4d3e75f61959bdd583a49864d4228b4","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                vpnservice \u003d self.plugin.get_vpnservice("},{"line_number":110,"context_line":"                    context, resource[\u0027vpnservice_id\u0027])"},{"line_number":111,"context_line":"            else:"},{"line_number":112,"context_line":"                return"},{"line_number":113,"context_line":"            topic \u003d vpnservice[\u0027provider\u0027]"},{"line_number":114,"context_line":"            self.agent_rpc.call("},{"line_number":115,"context_line":"                context,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8Jk%3D","line":112,"in_reply_to":"AAAARH%2F%2F8gE%3D","updated":"2013-08-14 21:44:17.000000000","message":"Done","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b42795c0943f65a75445f413d5b99eee18fb40d0","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                    context, resource[\u0027vpnservice_id\u0027])"},{"line_number":111,"context_line":"            else:"},{"line_number":112,"context_line":"                return"},{"line_number":113,"context_line":"            topic \u003d vpnservice[\u0027provider\u0027]"},{"line_number":114,"context_line":"            self.agent_rpc.call("},{"line_number":115,"context_line":"                context,"},{"line_number":116,"context_line":"                self.agent_rpc.make_msg(key,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8fk%3D","line":113,"updated":"2013-08-14 20:05:46.000000000","message":"Should the topic have the \"vpn_rpc_\" prefix?","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"5bbce425e4d3e75f61959bdd583a49864d4228b4","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                    context, resource[\u0027vpnservice_id\u0027])"},{"line_number":111,"context_line":"            else:"},{"line_number":112,"context_line":"                return"},{"line_number":113,"context_line":"            topic \u003d vpnservice[\u0027provider\u0027]"},{"line_number":114,"context_line":"            self.agent_rpc.call("},{"line_number":115,"context_line":"                context,"},{"line_number":116,"context_line":"                self.agent_rpc.make_msg(key,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8KM%3D","line":113,"in_reply_to":"AAAARH%2F%2F8fk%3D","updated":"2013-08-14 21:44:17.000000000","message":"Done","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b42795c0943f65a75445f413d5b99eee18fb40d0","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                topic\u003dtopic"},{"line_number":119,"context_line":"            )"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        def rpc_update_call_function("},{"line_number":122,"context_line":"            context, old_resource, resource):"},{"line_number":123,"context_line":"            vpnservice \u003d None"},{"line_number":124,"context_line":"            if \u0027vpnservice_id\u0027 in old_resource:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8e0%3D","line":121,"updated":"2013-08-14 20:05:46.000000000","message":"Add docstring","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"5bbce425e4d3e75f61959bdd583a49864d4228b4","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                topic\u003dtopic"},{"line_number":119,"context_line":"            )"},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"        def rpc_update_call_function("},{"line_number":122,"context_line":"            context, old_resource, resource):"},{"line_number":123,"context_line":"            vpnservice \u003d None"},{"line_number":124,"context_line":"            if \u0027vpnservice_id\u0027 in old_resource:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8JE%3D","line":121,"in_reply_to":"AAAARH%2F%2F8e0%3D","updated":"2013-08-14 21:44:17.000000000","message":"Done","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b42795c0943f65a75445f413d5b99eee18fb40d0","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                    context, resource[\u0027vpnservice_id\u0027])"},{"line_number":127,"context_line":"            else:"},{"line_number":128,"context_line":"                return"},{"line_number":129,"context_line":"            topic \u003d vpnservice[\u0027provider\u0027]"},{"line_number":130,"context_line":"            self.agent_rpc.call("},{"line_number":131,"context_line":"                context,"},{"line_number":132,"context_line":"                self.agent_rpc.make_msg(key,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8eo%3D","line":129,"updated":"2013-08-14 20:05:46.000000000","message":"Should topic have prefix?","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"5bbce425e4d3e75f61959bdd583a49864d4228b4","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                    context, resource[\u0027vpnservice_id\u0027])"},{"line_number":127,"context_line":"            else:"},{"line_number":128,"context_line":"                return"},{"line_number":129,"context_line":"            topic \u003d vpnservice[\u0027provider\u0027]"},{"line_number":130,"context_line":"            self.agent_rpc.call("},{"line_number":131,"context_line":"                context,"},{"line_number":132,"context_line":"                self.agent_rpc.make_msg(key,"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAARH%2F%2F8KI%3D","line":129,"in_reply_to":"AAAARH%2F%2F8eo%3D","updated":"2013-08-14 21:44:17.000000000","message":"Done","commit_id":"c9cd2997f8da15b1ae54fc2609ef1b786dcec7ca"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"e011964c5f8312a74e2f8b78cd3003a87a6e7fc9","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        pass"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def __getattr__(self, key):"},{"line_number":65,"context_line":"        \"\"\"handling create/update/delete method call"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        vpnaas service may extend actions"},{"line_number":68,"context_line":"        so we need handle that in noop"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAARH%2F%2F4zI%3D","line":65,"updated":"2013-08-15 17:59:45.000000000","message":"Period at end of line for summary line of multi-line docstring PEP 257. Same for the other docstrings in this file. Can add periods and end of other sentences too.","commit_id":"c065005cdb01321db287ac6876739616e8dd40f3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"20ce7756883c6e54eef992fbcb9cd29241a291c6","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        pass"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"    def __getattr__(self, key):"},{"line_number":65,"context_line":"        \"\"\"handling create/update/delete method call"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        vpnaas service may extend actions"},{"line_number":68,"context_line":"        so we need handle that in noop"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2Fl04%3D","line":65,"in_reply_to":"AAAARH%2F%2F4zI%3D","updated":"2013-09-03 03:06:04.000000000","message":"Done","commit_id":"c065005cdb01321db287ac6876739616e8dd40f3"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"e011964c5f8312a74e2f8b78cd3003a87a6e7fc9","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                vpnservice \u003d self.plugin.get_vpnservice("},{"line_number":124,"context_line":"                    context, resource[\u0027vpnservice_id\u0027])"},{"line_number":125,"context_line":"            else:"},{"line_number":126,"context_line":"                raise AttributeError()"},{"line_number":127,"context_line":"            topic \u003d \"vpn_rpc_%s\" % vpnservice[\u0027provider\u0027]"},{"line_number":128,"context_line":"            self.agent_rpc.call("},{"line_number":129,"context_line":"                context,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAARH%2F%2F4yI%3D","line":126,"updated":"2013-08-15 17:59:45.000000000","message":"Should we have a VPN specific exception defined?","commit_id":"c065005cdb01321db287ac6876739616e8dd40f3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"20ce7756883c6e54eef992fbcb9cd29241a291c6","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                vpnservice \u003d self.plugin.get_vpnservice("},{"line_number":124,"context_line":"                    context, resource[\u0027vpnservice_id\u0027])"},{"line_number":125,"context_line":"            else:"},{"line_number":126,"context_line":"                raise AttributeError()"},{"line_number":127,"context_line":"            topic \u003d \"vpn_rpc_%s\" % vpnservice[\u0027provider\u0027]"},{"line_number":128,"context_line":"            self.agent_rpc.call("},{"line_number":129,"context_line":"                context,"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAASn%2F%2Fl00%3D","line":126,"in_reply_to":"AAAARH%2F%2F4yI%3D","updated":"2013-09-03 03:06:04.000000000","message":"IMO, __getattr__ should raise AttributeError","commit_id":"c065005cdb01321db287ac6876739616e8dd40f3"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"75a182f84a56cfc813daeb0fc9afaed71b5b4358","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        \"\"\"Handling create/update/delete method call."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        vpnaas service may extend actions."},{"line_number":149,"context_line":"        so we need handle thier resources."},{"line_number":150,"context_line":"        \"\"\""},{"line_number":151,"context_line":"        def rpc_call_function(context, resource):"},{"line_number":152,"context_line":"            \"\"\"rpc call for create/delete"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2FkYg%3D","line":149,"updated":"2013-09-03 12:10:26.000000000","message":"Capitalize So, or use comma on previous line.","commit_id":"f4ec9e1258acf04af63e11b3bc7d8a869d17a403"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"107334a528f715db43f9005f6eac9066f093de64","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        \"\"\"Handling create/update/delete method call."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        vpnaas service may extend actions."},{"line_number":149,"context_line":"        so we need handle thier resources."},{"line_number":150,"context_line":"        \"\"\""},{"line_number":151,"context_line":"        def rpc_call_function(context, resource):"},{"line_number":152,"context_line":"            \"\"\"rpc call for create/delete"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2FhGM%3D","line":149,"in_reply_to":"AAAASn%2F%2FkYg%3D","updated":"2013-09-03 21:29:01.000000000","message":"Done","commit_id":"f4ec9e1258acf04af63e11b3bc7d8a869d17a403"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"75a182f84a56cfc813daeb0fc9afaed71b5b4358","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        so we need handle thier resources."},{"line_number":150,"context_line":"        \"\"\""},{"line_number":151,"context_line":"        def rpc_call_function(context, resource):"},{"line_number":152,"context_line":"            \"\"\"rpc call for create/delete"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"            This rpc call function notify"},{"line_number":155,"context_line":"            create/delete for that resource"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2FkYU%3D","line":152,"updated":"2013-09-03 12:10:26.000000000","message":"PEP8 add period at end of summary line. This and L 173","commit_id":"f4ec9e1258acf04af63e11b3bc7d8a869d17a403"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"107334a528f715db43f9005f6eac9066f093de64","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        so we need handle thier resources."},{"line_number":150,"context_line":"        \"\"\""},{"line_number":151,"context_line":"        def rpc_call_function(context, resource):"},{"line_number":152,"context_line":"            \"\"\"rpc call for create/delete"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"            This rpc call function notify"},{"line_number":155,"context_line":"            create/delete for that resource"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2FhGA%3D","line":152,"in_reply_to":"AAAASn%2F%2FkYU%3D","updated":"2013-09-03 21:29:01.000000000","message":"Done","commit_id":"f4ec9e1258acf04af63e11b3bc7d8a869d17a403"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"75a182f84a56cfc813daeb0fc9afaed71b5b4358","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        def rpc_call_function(context, resource):"},{"line_number":152,"context_line":"            \"\"\"rpc call for create/delete"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"            This rpc call function notify"},{"line_number":155,"context_line":"            create/delete for that resource"},{"line_number":156,"context_line":"            \"\"\""},{"line_number":157,"context_line":"            vpnservice \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2FkYQ%3D","line":154,"updated":"2013-09-03 12:10:26.000000000","message":"notify -\u003e notifies\n\nfor that -\u003e for specified\n\nAdd period at end.","commit_id":"f4ec9e1258acf04af63e11b3bc7d8a869d17a403"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"107334a528f715db43f9005f6eac9066f093de64","unresolved":false,"context_lines":[{"line_number":151,"context_line":"        def rpc_call_function(context, resource):"},{"line_number":152,"context_line":"            \"\"\"rpc call for create/delete"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"            This rpc call function notify"},{"line_number":155,"context_line":"            create/delete for that resource"},{"line_number":156,"context_line":"            \"\"\""},{"line_number":157,"context_line":"            vpnservice \u003d None"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2FhFY%3D","line":154,"in_reply_to":"AAAASn%2F%2FkYQ%3D","updated":"2013-09-03 21:29:01.000000000","message":"Done","commit_id":"f4ec9e1258acf04af63e11b3bc7d8a869d17a403"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"75a182f84a56cfc813daeb0fc9afaed71b5b4358","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        def rpc_update_call_function("},{"line_number":172,"context_line":"            context, old_resource, resource):"},{"line_number":173,"context_line":"            \"\"\"rpc call for update"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"            This rpc call function notify"},{"line_number":176,"context_line":"            create/delete for that resource"},{"line_number":177,"context_line":"            \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2FkYE%3D","line":174,"updated":"2013-09-03 12:10:26.000000000","message":"notify -\u003e notifies\n\nfor that -\u003e for specified\n\nadd period at end.","commit_id":"f4ec9e1258acf04af63e11b3bc7d8a869d17a403"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"107334a528f715db43f9005f6eac9066f093de64","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        def rpc_update_call_function("},{"line_number":172,"context_line":"            context, old_resource, resource):"},{"line_number":173,"context_line":"            \"\"\"rpc call for update"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"            This rpc call function notify"},{"line_number":176,"context_line":"            create/delete for that resource"},{"line_number":177,"context_line":"            \"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAASn%2F%2FhFU%3D","line":174,"in_reply_to":"AAAASn%2F%2FkYE%3D","updated":"2013-09-03 21:29:01.000000000","message":"Done","commit_id":"f4ec9e1258acf04af63e11b3bc7d8a869d17a403"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"416f5b152880c560f2436c068e924ecab74f8997","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        \"\"\"Handling create/update/delete method call."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        vpnaas service may extend actions."},{"line_number":149,"context_line":"        so we need handle thier resources."},{"line_number":150,"context_line":"        \"\"\""},{"line_number":151,"context_line":"        def rpc_call_function(context, resource):"},{"line_number":152,"context_line":"            \"\"\"rpc call for create/delete"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhTo%3D","line":149,"updated":"2013-09-03 20:51:15.000000000","message":"See my rev 5 comments on this file.","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"1c963f5e03e4a8d7266ddcd917896dc457def38e","unresolved":false,"context_lines":[{"line_number":146,"context_line":"        \"\"\"Handling create/update/delete method call."},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        vpnaas service may extend actions."},{"line_number":149,"context_line":"        so we need handle thier resources."},{"line_number":150,"context_line":"        \"\"\""},{"line_number":151,"context_line":"        def rpc_call_function(context, resource):"},{"line_number":152,"context_line":"            \"\"\"rpc call for create/delete"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhDI%3D","line":149,"in_reply_to":"AAAASn%2F%2FhTo%3D","updated":"2013-09-03 21:40:03.000000000","message":"Done","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7e9a76912555fa16c00f31fb50050b499a9979b8","unresolved":false,"context_lines":[{"line_number":159,"context_line":"                vpnservice \u003d self.plugin.get_vpnservice("},{"line_number":160,"context_line":"                    context, resource[\u0027vpnservice_id\u0027])"},{"line_number":161,"context_line":"            else:"},{"line_number":162,"context_line":"                raise AttributeError()"},{"line_number":163,"context_line":"            topic \u003d \"vpn_rpc_%s\" % vpnservice[\u0027provider\u0027]"},{"line_number":164,"context_line":"            self.agent_rpc.call("},{"line_number":165,"context_line":"                context,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhIg%3D","line":162,"updated":"2013-09-03 21:24:13.000000000","message":"Why is attributeerror raised? It just seems the resource is not a proper vpn service.\n\nAlso the logic can be as follows. I think it is easier to read.\n\n  if \u0027vpnservice_id\u0027 not in resource:\n      raise AttributeError()\n  vpnservice \u003d self.plugin.get_vpnservice(...)\n  topic \u003d ....\n  self.agent_rpc_call(...)","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"1c963f5e03e4a8d7266ddcd917896dc457def38e","unresolved":false,"context_lines":[{"line_number":159,"context_line":"                vpnservice \u003d self.plugin.get_vpnservice("},{"line_number":160,"context_line":"                    context, resource[\u0027vpnservice_id\u0027])"},{"line_number":161,"context_line":"            else:"},{"line_number":162,"context_line":"                raise AttributeError()"},{"line_number":163,"context_line":"            topic \u003d \"vpn_rpc_%s\" % vpnservice[\u0027provider\u0027]"},{"line_number":164,"context_line":"            self.agent_rpc.call("},{"line_number":165,"context_line":"                context,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhCo%3D","line":162,"in_reply_to":"AAAASn%2F%2FhIg%3D","updated":"2013-09-03 21:40:03.000000000","message":"Done","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"},{"author":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"change_message_id":"7b05177e21adf118c757df9584f68898f7c8e796","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                try:"},{"line_number":47,"context_line":"                    vpnservice_db \u003d plugin._get_vpn_service("},{"line_number":48,"context_line":"                        context, vpnservice[\u0027id\u0027])"},{"line_number":49,"context_line":"                except vpnaas.VPNServiceNotFound:"},{"line_number":50,"context_line":"                    continue"},{"line_number":51,"context_line":"                if (not utils.in_pending_status(vpnservice_db.status)"},{"line_number":52,"context_line":"                    or vpnservice[\u0027updated_pending_status\u0027]):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAASn%2F%2FbRQ%3D","line":49,"updated":"2013-09-04 21:31:45.000000000","message":"should this exception be logged here?","commit_id":"fa6029e608fbc0bc4712c56493b43807bf46d535"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7494cb549339a9b14410ea842d4e5afa1f8c717b","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                try:"},{"line_number":47,"context_line":"                    vpnservice_db \u003d plugin._get_vpn_service("},{"line_number":48,"context_line":"                        context, vpnservice[\u0027id\u0027])"},{"line_number":49,"context_line":"                except vpnaas.VPNServiceNotFound:"},{"line_number":50,"context_line":"                    continue"},{"line_number":51,"context_line":"                if (not utils.in_pending_status(vpnservice_db.status)"},{"line_number":52,"context_line":"                    or vpnservice[\u0027updated_pending_status\u0027]):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAASn%2F%2FasI%3D","line":49,"in_reply_to":"AAAASn%2F%2FbRQ%3D","updated":"2013-09-04 23:26:03.000000000","message":"Done","commit_id":"fa6029e608fbc0bc4712c56493b43807bf46d535"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"58dfa7788b82f88536510858c86b8e5f188f3014","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        Vpnaas service may extend actions,"},{"line_number":122,"context_line":"        so we need handle thier resources."},{"line_number":123,"context_line":"        \"\"\""},{"line_number":124,"context_line":"        def rpc_call_function(context, resource):"},{"line_number":125,"context_line":"            \"\"\"rpc call for create/delete."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"            This rpc call function notifies"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAASn%2F%2FbVs%3D","line":124,"updated":"2013-09-04 21:09:39.000000000","message":"Local methods seems a little too magical here.  Seems like we could do less magic here.","commit_id":"fa6029e608fbc0bc4712c56493b43807bf46d535"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7494cb549339a9b14410ea842d4e5afa1f8c717b","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        Vpnaas service may extend actions,"},{"line_number":122,"context_line":"        so we need handle thier resources."},{"line_number":123,"context_line":"        \"\"\""},{"line_number":124,"context_line":"        def rpc_call_function(context, resource):"},{"line_number":125,"context_line":"            \"\"\"rpc call for create/delete."},{"line_number":126,"context_line":""},{"line_number":127,"context_line":"            This rpc call function notifies"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAASn%2F%2Fa8E%3D","line":124,"in_reply_to":"AAAASn%2F%2FbVs%3D","updated":"2013-09-04 23:26:03.000000000","message":"Done","commit_id":"fa6029e608fbc0bc4712c56493b43807bf46d535"},{"author":{"_account_id":6676,"name":"zqfan","email":"aji.zqfan@gmail.com","username":"aji-zqfan"},"change_message_id":"7b05177e21adf118c757df9584f68898f7c8e796","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            \"\"\""},{"line_number":130,"context_line":"            vpnservice \u003d None"},{"line_number":131,"context_line":"            if \u0027vpnservice_id\u0027 not in resource:"},{"line_number":132,"context_line":"                raise AttributeError()"},{"line_number":133,"context_line":"            vpnservice \u003d self.plugin.get_vpnservice("},{"line_number":134,"context_line":"                context, resource[\u0027vpnservice_id\u0027])"},{"line_number":135,"context_line":"            topic \u003d \"vpn_rpc_%s\" % vpnservice[\u0027provider\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAASn%2F%2FbQs%3D","line":132,"updated":"2013-09-04 21:31:45.000000000","message":"is this exception catched and translated to a neutron exception? or this may cause 500 instead of 400, i cannot find ut to cover this","commit_id":"fa6029e608fbc0bc4712c56493b43807bf46d535"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7494cb549339a9b14410ea842d4e5afa1f8c717b","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            \"\"\""},{"line_number":130,"context_line":"            vpnservice \u003d None"},{"line_number":131,"context_line":"            if \u0027vpnservice_id\u0027 not in resource:"},{"line_number":132,"context_line":"                raise AttributeError()"},{"line_number":133,"context_line":"            vpnservice \u003d self.plugin.get_vpnservice("},{"line_number":134,"context_line":"                context, resource[\u0027vpnservice_id\u0027])"},{"line_number":135,"context_line":"            topic \u003d \"vpn_rpc_%s\" % vpnservice[\u0027provider\u0027]"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAASn%2F%2Fa70%3D","line":132,"in_reply_to":"AAAASn%2F%2FbQs%3D","updated":"2013-09-04 23:26:03.000000000","message":"500 is OK, because if we get this error, it is kind of plugin bug.\nI\u0027ll add test for this","commit_id":"fa6029e608fbc0bc4712c56493b43807bf46d535"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"fe0d36bcd8bc88a47f97b6b1bdcf1053c2191f50","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        \"\"\"Handling create/update/delete method call."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        Vpnaas service may extend actions,"},{"line_number":127,"context_line":"        so we need handle thier resources."},{"line_number":128,"context_line":"        \"\"\""},{"line_number":129,"context_line":"        def rpc_cast(context, *args):"},{"line_number":130,"context_line":"            \"\"\"Rpc for Resource Event call."}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2FGpw%3D","line":127,"updated":"2013-11-14 11:55:01.000000000","message":"typo: their","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"57aced4d41c28ab2545dc580fdc75aa3d50ae067","unresolved":false,"context_lines":[{"line_number":124,"context_line":"        \"\"\"Handling create/update/delete method call."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        Vpnaas service may extend actions,"},{"line_number":127,"context_line":"        so we need handle thier resources."},{"line_number":128,"context_line":"        \"\"\""},{"line_number":129,"context_line":"        def rpc_cast(context, *args):"},{"line_number":130,"context_line":"            \"\"\"Rpc for Resource Event call."}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BYGY%3D","line":127,"in_reply_to":"AAAATn%2F%2FGpw%3D","updated":"2013-11-26 18:51:39.000000000","message":"Done","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"51fe8a91298fe25d9a6e8c911ec3e54f08f99a99","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                kwargs[\u0027resource\u0027] \u003d args[0]"},{"line_number":141,"context_line":"            else:"},{"line_number":142,"context_line":"                #This method signature is undefined"},{"line_number":143,"context_line":"                raise AttributeError()"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            vpnservice_id \u003d kwargs[\u0027resource\u0027].get(\u0027vpnservice_id\u0027)"},{"line_number":146,"context_line":"            if not vpnservice_id:"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2F%2BpE%3D","line":143,"updated":"2013-10-24 11:42:04.000000000","message":"Should we add a message with the AttributeError to better describe the error (it\u0027s a programming error, so maybe not needed).","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"fe0d36bcd8bc88a47f97b6b1bdcf1053c2191f50","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                kwargs[\u0027resource\u0027] \u003d args[0]"},{"line_number":141,"context_line":"            else:"},{"line_number":142,"context_line":"                #This method signature is undefined"},{"line_number":143,"context_line":"                raise AttributeError()"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            vpnservice_id \u003d kwargs[\u0027resource\u0027].get(\u0027vpnservice_id\u0027)"},{"line_number":146,"context_line":"            if not vpnservice_id:"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2FGo8%3D","line":143,"in_reply_to":"AAAATn%2F%2F%2BpE%3D","updated":"2013-11-14 11:55:01.000000000","message":"Personally I don\u0027t think so, AttributeError is built-in exception that is suitable for cases like this.","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"57aced4d41c28ab2545dc580fdc75aa3d50ae067","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                kwargs[\u0027resource\u0027] \u003d args[0]"},{"line_number":141,"context_line":"            else:"},{"line_number":142,"context_line":"                #This method signature is undefined"},{"line_number":143,"context_line":"                raise AttributeError()"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            vpnservice_id \u003d kwargs[\u0027resource\u0027].get(\u0027vpnservice_id\u0027)"},{"line_number":146,"context_line":"            if not vpnservice_id:"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BYGQ%3D","line":143,"in_reply_to":"AAAATn%2F%2FGo8%3D","updated":"2013-11-26 18:51:39.000000000","message":"I agree with Eugene.\nThis is the method in __get_attr__ so AttributeError is suitable if there is no attribite","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"51fe8a91298fe25d9a6e8c911ec3e54f08f99a99","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            if not vpnservice_id:"},{"line_number":147,"context_line":"                #GenricVPNDriver defines only function which has"},{"line_number":148,"context_line":"                #a resource with vpnservice_id"},{"line_number":149,"context_line":"                raise AttributeError()"},{"line_number":150,"context_line":"            vpnservice \u003d self.plugin._get_vpnservice("},{"line_number":151,"context_line":"                context, vpnservice_id)"},{"line_number":152,"context_line":"            topic \u003d \"vpn_rpc_%s\" % vpnservice[\u0027provider\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2F%2BpA%3D","line":149,"updated":"2013-10-24 11:42:04.000000000","message":"Ditto.","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"57aced4d41c28ab2545dc580fdc75aa3d50ae067","unresolved":false,"context_lines":[{"line_number":146,"context_line":"            if not vpnservice_id:"},{"line_number":147,"context_line":"                #GenricVPNDriver defines only function which has"},{"line_number":148,"context_line":"                #a resource with vpnservice_id"},{"line_number":149,"context_line":"                raise AttributeError()"},{"line_number":150,"context_line":"            vpnservice \u003d self.plugin._get_vpnservice("},{"line_number":151,"context_line":"                context, vpnservice_id)"},{"line_number":152,"context_line":"            topic \u003d \"vpn_rpc_%s\" % vpnservice[\u0027provider\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BYGM%3D","line":149,"in_reply_to":"AAAATn%2F%2F%2BpA%3D","updated":"2013-11-26 18:51:39.000000000","message":"ditto","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"11e47de0aee001046874e24cb09617c9e4a0dd30","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.agent_rpc \u003d proxy.RpcProxy(\u0027generic_vpn_rpc\u0027, \u00271.0\u0027)"},{"line_number":91,"context_line":"        self.conn \u003d rpc.create_connection(new\u003dTrue)"},{"line_number":92,"context_line":"        self.conn.create_consumer("},{"line_number":93,"context_line":"            \u0027vpn_rpc\u0027,"},{"line_number":94,"context_line":"            self.callbacks.create_rpc_dispatcher(),"},{"line_number":95,"context_line":"            fanout\u003dFalse)"},{"line_number":96,"context_line":"        self.conn.consume_in_thread()"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F9IHo%3D","line":93,"updated":"2013-12-16 15:25:24.000000000","message":"Use a constant maybe for this?","commit_id":"65b96e7efc739cb5ef58b31138f4bdcb6b0709e9"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"cf232108b518f662e7e74f69eb17638dbf4e0e13","unresolved":false,"context_lines":[{"line_number":90,"context_line":"        self.agent_rpc \u003d proxy.RpcProxy(\u0027generic_vpn_rpc\u0027, \u00271.0\u0027)"},{"line_number":91,"context_line":"        self.conn \u003d rpc.create_connection(new\u003dTrue)"},{"line_number":92,"context_line":"        self.conn.create_consumer("},{"line_number":93,"context_line":"            \u0027vpn_rpc\u0027,"},{"line_number":94,"context_line":"            self.callbacks.create_rpc_dispatcher(),"},{"line_number":95,"context_line":"            fanout\u003dFalse)"},{"line_number":96,"context_line":"        self.conn.consume_in_thread()"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2FCyU%3D","line":93,"in_reply_to":"AAAATn%2F9IHo%3D","updated":"2014-02-17 13:37:51.000000000","message":"Only appears once, so skipping.","commit_id":"65b96e7efc739cb5ef58b31138f4bdcb6b0709e9"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"11e47de0aee001046874e24cb09617c9e4a0dd30","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            context,"},{"line_number":101,"context_line":"            self.agent_rpc.make_msg(\u0027create_vpnservice\u0027,"},{"line_number":102,"context_line":"                                    resource\u003dvpnservice),"},{"line_number":103,"context_line":"            topic\u003d\"vpn_rpc_%s\" % vpnservice[\u0027provider\u0027]"},{"line_number":104,"context_line":"        )"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def update_vpnservice(self, context, old_vpnservice, vpnservice):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F9IM4%3D","line":103,"updated":"2013-12-16 15:25:24.000000000","message":"Should vpn_rpc be a constant?","commit_id":"65b96e7efc739cb5ef58b31138f4bdcb6b0709e9"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"cf232108b518f662e7e74f69eb17638dbf4e0e13","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            context,"},{"line_number":101,"context_line":"            self.agent_rpc.make_msg(\u0027create_vpnservice\u0027,"},{"line_number":102,"context_line":"                                    resource\u003dvpnservice),"},{"line_number":103,"context_line":"            topic\u003d\"vpn_rpc_%s\" % vpnservice[\u0027provider\u0027]"},{"line_number":104,"context_line":"        )"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def update_vpnservice(self, context, old_vpnservice, vpnservice):"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAAUX%2F%2FCyM%3D","line":103,"in_reply_to":"AAAATn%2F9IM4%3D","updated":"2014-02-17 13:37:51.000000000","message":"Done","commit_id":"65b96e7efc739cb5ef58b31138f4bdcb6b0709e9"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"11e47de0aee001046874e24cb09617c9e4a0dd30","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                kwargs[\u0027resource\u0027] \u003d args[0]"},{"line_number":141,"context_line":"            else:"},{"line_number":142,"context_line":"                #This method signature is undefined"},{"line_number":143,"context_line":"                raise AttributeError()"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            vpnservice_id \u003d kwargs[\u0027resource\u0027].get(\u0027vpnservice_id\u0027)"},{"line_number":146,"context_line":"            if not vpnservice_id:"}],"source_content_type":"text/x-python","patch_set":20,"id":"AAAATn%2F9IME%3D","line":143,"updated":"2013-12-16 15:25:24.000000000","message":"Python normally returns TypeError on argument mismatch.","commit_id":"65b96e7efc739cb5ef58b31138f4bdcb6b0709e9"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9dd782286b2e5fe25664542392d81620808d6210","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import abc"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import six"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2Bu5s%3D","side":"PARENT","line":19,"updated":"2014-02-19 13:56:31.000000000","message":"It is not related to this patch.","commit_id":"7fb2d579ae5d14fdb538b6f7fde6f58b533c82ba"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9dd782286b2e5fe25664542392d81620808d6210","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    def __init__(self, plugin):"},{"line_number":91,"context_line":"        super(GenericVPNRpcDriver, self).__init__(plugin)"},{"line_number":92,"context_line":"        self.callbacks \u003d GenericVPNRpcCallback(self)"},{"line_number":93,"context_line":"        self.agent_rpc \u003d proxy.RpcProxy(\u0027generic_vpn_rpc\u0027, \u00271.0\u0027)"},{"line_number":94,"context_line":"        self.conn \u003d rpc.create_connection(new\u003dTrue)"},{"line_number":95,"context_line":"        self.conn.create_consumer("},{"line_number":96,"context_line":"            \u0027vpn_rpc\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2Bu%2BA%3D","line":93,"updated":"2014-02-19 13:56:31.000000000","message":"I prefer vpn_rpc_generic. It matches VPN_TOPIC_PREFIX.","commit_id":"ea7a68df7a424e50fe8d4bd5452f0d47fc7c8849"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"1689b0dad1f9f64a069b8882fbe96c8cd9e9e5a8","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    def __init__(self, plugin):"},{"line_number":91,"context_line":"        super(GenericVPNRpcDriver, self).__init__(plugin)"},{"line_number":92,"context_line":"        self.callbacks \u003d GenericVPNRpcCallback(self)"},{"line_number":93,"context_line":"        self.agent_rpc \u003d proxy.RpcProxy(\u0027generic_vpn_rpc\u0027, \u00271.0\u0027)"},{"line_number":94,"context_line":"        self.conn \u003d rpc.create_connection(new\u003dTrue)"},{"line_number":95,"context_line":"        self.conn.create_consumer("},{"line_number":96,"context_line":"            \u0027vpn_rpc\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2BunA%3D","line":93,"in_reply_to":"AAAAUX%2F%2Bu%2BA%3D","updated":"2014-02-19 14:42:33.000000000","message":"I agree with this comment, the naming would be good to keep consistent style-wise.","commit_id":"ea7a68df7a424e50fe8d4bd5452f0d47fc7c8849"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9dd782286b2e5fe25664542392d81620808d6210","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        self.agent_rpc \u003d proxy.RpcProxy(\u0027generic_vpn_rpc\u0027, \u00271.0\u0027)"},{"line_number":94,"context_line":"        self.conn \u003d rpc.create_connection(new\u003dTrue)"},{"line_number":95,"context_line":"        self.conn.create_consumer("},{"line_number":96,"context_line":"            \u0027vpn_rpc\u0027,"},{"line_number":97,"context_line":"            self.callbacks.create_rpc_dispatcher(),"},{"line_number":98,"context_line":"            fanout\u003dFalse)"},{"line_number":99,"context_line":"        self.conn.consume_in_thread()"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2Bu9c%3D","line":96,"updated":"2014-02-19 13:56:31.000000000","message":"Please  define VPN realated RPC topics as constants?","commit_id":"ea7a68df7a424e50fe8d4bd5452f0d47fc7c8849"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9dd782286b2e5fe25664542392d81620808d6210","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"        Vpnaas service may extend actions,"},{"line_number":130,"context_line":"        so we need handle their resources."},{"line_number":131,"context_line":"        \"\"\""},{"line_number":132,"context_line":"        def rpc_cast(context, *args):"},{"line_number":133,"context_line":"            \"\"\"Rpc for Resource Event call."},{"line_number":134,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2Bu5E%3D","line":131,"updated":"2014-02-19 13:56:31.000000000","message":"I would like to avoid this kind of auto mapping. Is there any example which help me understand the motivation?","commit_id":"ea7a68df7a424e50fe8d4bd5452f0d47fc7c8849"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"1689b0dad1f9f64a069b8882fbe96c8cd9e9e5a8","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            elif len(args) \u003d\u003d 1:"},{"line_number":143,"context_line":"                kwargs[\u0027resource\u0027] \u003d args[0]"},{"line_number":144,"context_line":"            else:"},{"line_number":145,"context_line":"                #This method signature is undefined"},{"line_number":146,"context_line":"                raise AttributeError()"},{"line_number":147,"context_line":""},{"line_number":148,"context_line":"            vpnservice_id \u003d kwargs[\u0027resource\u0027].get(\u0027vpnservice_id\u0027)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2Bumo%3D","line":145,"updated":"2014-02-19 14:42:33.000000000","message":"Nit: Space after #. Same for lines 150 and 151 below.","commit_id":"ea7a68df7a424e50fe8d4bd5452f0d47fc7c8849"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"1059e920bb5a55626b288729965d9261334cedae","unresolved":false,"context_lines":[{"line_number":29,"context_line":"class VpnDriver(object):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self, plugin):"},{"line_number":32,"context_line":"        self.plugin \u003d plugin"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @property"},{"line_number":35,"context_line":"    def service_type(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAUX%2F%2BfpQ%3D","line":32,"updated":"2014-02-20 21:32:59.000000000","message":"Can you explain this? I don\u0027t see where it gets called or used. Is class IPsecVPNDriver() meant to call this __init__?","commit_id":"659210e23795aa3253bb2732a218882b6864abc1"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"c37ceea48f319bd98275868ea6d3a767fa5d209d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"class VpnDriver(object):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self, plugin):"},{"line_number":32,"context_line":"        self.plugin \u003d plugin"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @property"},{"line_number":35,"context_line":"    def service_type(self):"}],"source_content_type":"text/x-python","patch_set":23,"id":"AAAAU3%2F%2F8ZE%3D","line":32,"in_reply_to":"AAAAUX%2F%2BfpQ%3D","updated":"2014-02-23 20:29:28.000000000","message":"\"plugin\" argument is required because service_base.load_drivers initializes each driver with \"plugin\" argument.\n\nAs you commented, IPsecVPNDriver should call super().","commit_id":"659210e23795aa3253bb2732a218882b6864abc1"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"80c4a16e0c69a2289b25f2612f763367ca8bbd45","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from neutron.openstack.common import log as logging"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAU3%2F%2F%2FIQ%3D","line":25,"updated":"2014-02-23 01:49:24.000000000","message":"Why are we adding this?","commit_id":"737824497b42d230232cf7a27cdf77238edeb263"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"ebe5fdeccb0d8ad6ddbf622f5a0d0f080cdf9879","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from neutron.openstack.common import log as logging"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"@six.add_metaclass(abc.ABCMeta)"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAU3%2F%2FyjE%3D","line":25,"in_reply_to":"AAAAU3%2F%2F%2FIQ%3D","updated":"2014-02-24 19:22:00.000000000","message":"Done","commit_id":"737824497b42d230232cf7a27cdf77238edeb263"},{"author":{"_account_id":7317,"name":"Bo Lin","email":"linb@vmware.com","username":"berlin"},"change_message_id":"3b7546eecfd266d88e9290a8930755f6a11df2ae","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":29,"context_line":"class VpnDriver(object):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self, plugin):"},{"line_number":32,"context_line":"        self.plugin \u003d plugin"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAU3%2F%2F%2BDg%3D","line":29,"updated":"2014-02-23 09:04:58.000000000","message":"why CRUD of ipsec_site_connection calls not in the template driver since plugin would call these driver calls?","commit_id":"737824497b42d230232cf7a27cdf77238edeb263"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6953139e33720c7b7f8e2d42fe5b80b614cc388a","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":29,"context_line":"class VpnDriver(object):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self, plugin):"},{"line_number":32,"context_line":"        self.plugin \u003d plugin"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAU3%2F%2F8YY%3D","line":29,"in_reply_to":"AAAAU3%2F%2F%2BDg%3D","updated":"2014-02-23 20:31:51.000000000","message":"This is because VpnDriver is not specific to IPsec. CRUD of ipsec_site_connection is specific APIs to IPsec driver. Does it make sense?","commit_id":"737824497b42d230232cf7a27cdf77238edeb263"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"ebe5fdeccb0d8ad6ddbf622f5a0d0f080cdf9879","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":29,"context_line":"class VpnDriver(object):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self, plugin):"},{"line_number":32,"context_line":"        self.plugin \u003d plugin"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAU3%2F%2Fyio%3D","line":29,"in_reply_to":"AAAAU3%2F%2F8YY%3D","updated":"2014-02-24 19:22:00.000000000","message":"I agree with Akihiro here.","commit_id":"737824497b42d230232cf7a27cdf77238edeb263"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"6953139e33720c7b7f8e2d42fe5b80b614cc388a","unresolved":false,"context_lines":[{"line_number":29,"context_line":"class VpnDriver(object):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self, plugin):"},{"line_number":32,"context_line":"        self.plugin \u003d plugin"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @property"},{"line_number":35,"context_line":"    def service_type(self):"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAU3%2F%2F8Yg%3D","line":32,"updated":"2014-02-23 20:31:51.000000000","message":"IPsecVPNDriver should call super() to ensure self.plugin is set.","commit_id":"737824497b42d230232cf7a27cdf77238edeb263"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"ebe5fdeccb0d8ad6ddbf622f5a0d0f080cdf9879","unresolved":false,"context_lines":[{"line_number":29,"context_line":"class VpnDriver(object):"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def __init__(self, plugin):"},{"line_number":32,"context_line":"        self.plugin \u003d plugin"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @property"},{"line_number":35,"context_line":"    def service_type(self):"}],"source_content_type":"text/x-python","patch_set":24,"id":"AAAAU3%2F%2Fyi4%3D","line":32,"in_reply_to":"AAAAU3%2F%2F8Yg%3D","updated":"2014-02-24 19:22:00.000000000","message":"Done","commit_id":"737824497b42d230232cf7a27cdf77238edeb263"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"4d648ca17a60dcb8b2a272e7280cb1a6dbf02365","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def __init__(self, service_plugin):"},{"line_number":27,"context_line":"        self.service_plugin \u003d service_plugin"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    @property"},{"line_number":30,"context_line":"    def service_type(self):"},{"line_number":31,"context_line":"        pass"},{"line_number":32,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAAU3%2F%2FkI8%3D","line":29,"updated":"2014-02-25 22:18:07.000000000","message":"This should be @abc.abstractproperty.","commit_id":"2db417b549d18a1ef76182a474b7e2197b5b6827"}],"neutron/services/vpn/service_drivers/ipsec.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"87dd41b8f74add236931431bd81d2ab746ca4e75","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class IPsecVpnDriverCallBack(object):"},{"line_number":35,"context_line":"    \"\"\"Callback for IPSecVpnDriver rpc.\"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    # history"},{"line_number":38,"context_line":"    #   1.0 Initial version"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAASn%2F%2FeGc%3D","line":35,"updated":"2013-09-04 13:15:18.000000000","message":"PEP257 blank line before class docstrings. Here and other classes in this file.","commit_id":"87c39a6a09cb9b987eb9d7b1a3b056eb565a8ecf"},{"author":{"_account_id":6072,"name":"Eugene Nikanorov","email":"enikanorov@mirantis.com","username":"enikanorov"},"change_message_id":"2d435ccaf7f0cd13419d80214f4863172ebf52e3","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"class IPsecVpnDriverCallBack(object):"},{"line_number":35,"context_line":"    \"\"\"Callback for IPSecVpnDriver rpc.\"\"\""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    # history"},{"line_number":38,"context_line":"    #   1.0 Initial version"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAASn%2F%2Fdxk%3D","line":35,"in_reply_to":"AAAASn%2F%2FeGc%3D","updated":"2013-09-04 14:13:38.000000000","message":"I think it\u0027s ok, since it\u0027s not a part of the change","commit_id":"87c39a6a09cb9b987eb9d7b1a3b056eb565a8ecf"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"87dd41b8f74add236931431bd81d2ab746ca4e75","unresolved":false,"context_lines":[{"line_number":68,"context_line":"                            version\u003dNone):"},{"line_number":69,"context_line":"        \"\"\"Notify update for the agent."},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"        This method will find where is the router, and"},{"line_number":72,"context_line":"        dispatch notification for the agent."},{"line_number":73,"context_line":"        \"\"\""},{"line_number":74,"context_line":"        adminContext \u003d context.is_admin and context or context.elevated()"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAASn%2F%2FeFw%3D","line":71,"updated":"2013-09-04 13:15:18.000000000","message":"Wording is awkward. Would this be \"This method will find host for router, and...\"?","commit_id":"87c39a6a09cb9b987eb9d7b1a3b056eb565a8ecf"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"87dd41b8f74add236931431bd81d2ab746ca4e75","unresolved":false,"context_lines":[{"line_number":161,"context_line":"    def _make_vpnservice_dict(self, vpnservice):"},{"line_number":162,"context_line":"        \"\"\"Convert vpnservice information for vpn agent."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        also converting parameter name for vpn agent driver"},{"line_number":165,"context_line":"        \"\"\""},{"line_number":166,"context_line":"        vpnservice_dict \u003d dict(vpnservice)"},{"line_number":167,"context_line":"        vpnservice_dict[\u0027ipsec_site_connections\u0027] \u003d []"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAASn%2F%2FeFA%3D","line":164,"updated":"2013-09-04 13:15:18.000000000","message":"\"Also, converting...\"  or \"Convert parameter name for...\"","commit_id":"87c39a6a09cb9b987eb9d7b1a3b056eb565a8ecf"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"87dd41b8f74add236931431bd81d2ab746ca4e75","unresolved":false,"context_lines":[{"line_number":174,"context_line":"            try:"},{"line_number":175,"context_line":"                netaddr.IPAddress(ipsec_site_connection[\u0027peer_id\u0027])"},{"line_number":176,"context_line":"            except netaddr.core.AddrFormatError:"},{"line_number":177,"context_line":"                ipsec_site_connection[\u0027peer_id\u0027] \u003d ("},{"line_number":178,"context_line":"                    \u0027@\u0027 + ipsec_site_connection[\u0027peer_id\u0027])"},{"line_number":179,"context_line":"            ipsec_site_connection_dict[\u0027ikepolicy\u0027] \u003d dict("},{"line_number":180,"context_line":"                ipsec_site_connection.ikepolicy)"}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAASn%2F%2FeEE%3D","line":177,"updated":"2013-09-04 13:15:18.000000000","message":"Wouldn\u0027t the peer_id have been validated already by client and server?","commit_id":"87c39a6a09cb9b987eb9d7b1a3b056eb565a8ecf"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"change_message_id":"58dfa7788b82f88536510858c86b8e5f188f3014","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        self._agent_notification(context, method, router_id)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class IPsecVPNDriver(service_drivers.VpnDriver):"},{"line_number":100,"context_line":"    \"\"\"VPN Service Driver class for IPsec.\"\"\""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def __init__(self, service_plugin):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAASn%2F%2FbVY%3D","side":"PARENT","line":99,"updated":"2013-09-04 21:09:39.000000000","message":"This is actually correct according to PEP8.","commit_id":"062ee16e09fb2ba7d89a80bdeb8de1eee978ac2e"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"7494cb549339a9b14410ea842d4e5afa1f8c717b","unresolved":false,"context_lines":[{"line_number":96,"context_line":"        self._agent_notification(context, method, router_id)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"class IPsecVPNDriver(service_drivers.VpnDriver):"},{"line_number":100,"context_line":"    \"\"\"VPN Service Driver class for IPsec.\"\"\""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def __init__(self, service_plugin):"}],"source_content_type":"text/x-python","patch_set":11,"id":"AAAASn%2F%2FatA%3D","side":"PARENT","line":99,"in_reply_to":"AAAASn%2F%2FbVY%3D","updated":"2013-09-04 23:26:03.000000000","message":"We have choosed VPN for all method, so we need to be consistent here.\n# may be we update VPN -\u003e Vpn in future.","commit_id":"062ee16e09fb2ba7d89a80bdeb8de1eee978ac2e"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"659ff8341c682b02055cf56ac10968c3303a2d2b","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        return n_rpc.PluginRpcDispatcher([self])"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def get_vpn_services_on_host(self, context, host\u003dNone):"},{"line_number":50,"context_line":"        \"\"\"Returns the vpnservices on the host.\"\"\""},{"line_number":51,"context_line":"        plugin \u003d self.driver.service_plugin"},{"line_number":52,"context_line":"        vpnservices \u003d plugin._get_agent_hosting_vpn_services("},{"line_number":53,"context_line":"            context, host)"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAU3%2F%2FxpM%3D","line":50,"updated":"2014-02-24 20:57:26.000000000","message":"Is this temp variable useful. Here and L59?","commit_id":"a03fb2fc5624d8e62128fa7d4f994c7fcae91c69"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"eceb6ec7c79be7b9cc2d730527233ef6551f96a5","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        return n_rpc.PluginRpcDispatcher([self])"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def get_vpn_services_on_host(self, context, host\u003dNone):"},{"line_number":50,"context_line":"        \"\"\"Returns the vpnservices on the host.\"\"\""},{"line_number":51,"context_line":"        plugin \u003d self.driver.service_plugin"},{"line_number":52,"context_line":"        vpnservices \u003d plugin._get_agent_hosting_vpn_services("},{"line_number":53,"context_line":"            context, host)"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAU3%2F%2Fw5w%3D","line":50,"in_reply_to":"AAAAU3%2F%2FxpM%3D","updated":"2014-02-24 22:19:51.000000000","message":"This is needed because of 80L limit","commit_id":"a03fb2fc5624d8e62128fa7d4f994c7fcae91c69"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"659ff8341c682b02055cf56ac10968c3303a2d2b","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    def __init__(self, service_plugin):"},{"line_number":105,"context_line":"        super(IPsecVPNDriver, self).__init__(service_plugin)"},{"line_number":106,"context_line":"        self.callbacks \u003d IPsecVpnDriverCallBack(self)"},{"line_number":107,"context_line":"        self.service_plugin \u003d service_plugin"},{"line_number":108,"context_line":"        self.conn \u003d rpc.create_connection(new\u003dTrue)"},{"line_number":109,"context_line":"        self.conn.create_consumer("},{"line_number":110,"context_line":"            topics.IPSEC_DRIVER_TOPIC,"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAU3%2F%2FxsU%3D","line":107,"updated":"2014-02-24 20:57:26.000000000","message":"Unneeded now.","commit_id":"a03fb2fc5624d8e62128fa7d4f994c7fcae91c69"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"eceb6ec7c79be7b9cc2d730527233ef6551f96a5","unresolved":false,"context_lines":[{"line_number":104,"context_line":"    def __init__(self, service_plugin):"},{"line_number":105,"context_line":"        super(IPsecVPNDriver, self).__init__(service_plugin)"},{"line_number":106,"context_line":"        self.callbacks \u003d IPsecVpnDriverCallBack(self)"},{"line_number":107,"context_line":"        self.service_plugin \u003d service_plugin"},{"line_number":108,"context_line":"        self.conn \u003d rpc.create_connection(new\u003dTrue)"},{"line_number":109,"context_line":"        self.conn.create_consumer("},{"line_number":110,"context_line":"            topics.IPSEC_DRIVER_TOPIC,"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAU3%2F%2Fw5o%3D","line":107,"in_reply_to":"AAAAU3%2F%2FxsU%3D","updated":"2014-02-24 22:19:51.000000000","message":"Done","commit_id":"a03fb2fc5624d8e62128fa7d4f994c7fcae91c69"}],"neutron/tests/unit/db/vpn/test_db_vpnaas.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"41b37fcd5b8baa78419608afb5e723fb65032b7f","unresolved":false,"context_lines":[{"line_number":789,"context_line":"                                     expected)"},{"line_number":790,"context_line":"                return vpnservice"},{"line_number":791,"context_line":""},{"line_number":792,"context_line":"    def test_create_vpnservice_with_invalid_provider(self):"},{"line_number":793,"context_line":"        \"\"\"Test case to create a vpnservice.\"\"\""},{"line_number":794,"context_line":"        with self.subnet(cidr\u003d\u002710.2.0.0/24\u0027) as subnet:"},{"line_number":795,"context_line":"            with self.router() as router:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F%2BBM%3D","line":792,"updated":"2013-08-14 13:12:20.000000000","message":"Name indicating a failure test case?","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"6d7aeef792bf8355865fe6eb86f65b44c0322014","unresolved":false,"context_lines":[{"line_number":789,"context_line":"                                     expected)"},{"line_number":790,"context_line":"                return vpnservice"},{"line_number":791,"context_line":""},{"line_number":792,"context_line":"    def test_create_vpnservice_with_invalid_provider(self):"},{"line_number":793,"context_line":"        \"\"\"Test case to create a vpnservice.\"\"\""},{"line_number":794,"context_line":"        with self.subnet(cidr\u003d\u002710.2.0.0/24\u0027) as subnet:"},{"line_number":795,"context_line":"            with self.router() as router:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F9C4%3D","line":792,"in_reply_to":"AAAARH%2F%2F%2BBM%3D","updated":"2013-08-14 18:27:30.000000000","message":"yes","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"41b37fcd5b8baa78419608afb5e723fb65032b7f","unresolved":false,"context_lines":[{"line_number":790,"context_line":"                return vpnservice"},{"line_number":791,"context_line":""},{"line_number":792,"context_line":"    def test_create_vpnservice_with_invalid_provider(self):"},{"line_number":793,"context_line":"        \"\"\"Test case to create a vpnservice.\"\"\""},{"line_number":794,"context_line":"        with self.subnet(cidr\u003d\u002710.2.0.0/24\u0027) as subnet:"},{"line_number":795,"context_line":"            with self.router() as router:"},{"line_number":796,"context_line":"                self._create_vpnservice("}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F%2BBQ%3D","line":793,"updated":"2013-08-14 13:12:20.000000000","message":"with an invalid provider.","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"6d7aeef792bf8355865fe6eb86f65b44c0322014","unresolved":false,"context_lines":[{"line_number":790,"context_line":"                return vpnservice"},{"line_number":791,"context_line":""},{"line_number":792,"context_line":"    def test_create_vpnservice_with_invalid_provider(self):"},{"line_number":793,"context_line":"        \"\"\"Test case to create a vpnservice.\"\"\""},{"line_number":794,"context_line":"        with self.subnet(cidr\u003d\u002710.2.0.0/24\u0027) as subnet:"},{"line_number":795,"context_line":"            with self.router() as router:"},{"line_number":796,"context_line":"                self._create_vpnservice("}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAARH%2F%2F9C8%3D","line":793,"in_reply_to":"AAAARH%2F%2F%2BBQ%3D","updated":"2013-08-14 18:27:30.000000000","message":"Done","commit_id":"ef2b961fba0f442567a7b89db28f9f7b4457280e"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7e9a76912555fa16c00f31fb50050b499a9979b8","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        )"},{"line_number":98,"context_line":"        app \u003d config.load_paste_app(\u0027extensions_test_app\u0027)"},{"line_number":99,"context_line":"        self.ext_api \u003d ExtensionMiddleware(app, ext_mgr\u003dext_mgr)"},{"line_number":100,"context_line":"        self.addCleanup(cfg.CONF.reset)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _create_ikepolicy(self, fmt,"},{"line_number":103,"context_line":"                          name\u003d\u0027ikepolicy1\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhIM%3D","line":100,"updated":"2013-09-03 21:24:13.000000000","message":"It is registered in neutron.tests.base.BaseTestCase, so it is unnecessary.","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"1c963f5e03e4a8d7266ddcd917896dc457def38e","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        )"},{"line_number":98,"context_line":"        app \u003d config.load_paste_app(\u0027extensions_test_app\u0027)"},{"line_number":99,"context_line":"        self.ext_api \u003d ExtensionMiddleware(app, ext_mgr\u003dext_mgr)"},{"line_number":100,"context_line":"        self.addCleanup(cfg.CONF.reset)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def _create_ikepolicy(self, fmt,"},{"line_number":103,"context_line":"                          name\u003d\u0027ikepolicy1\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhCU%3D","line":100,"in_reply_to":"AAAASn%2F%2FhIM%3D","updated":"2013-09-03 21:40:03.000000000","message":"Done","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7e9a76912555fa16c00f31fb50050b499a9979b8","unresolved":false,"context_lines":[{"line_number":894,"context_line":"        \"\"\"Test case to update a vpnservice in invalid state .\"\"\""},{"line_number":895,"context_line":"        name \u003d \u0027new_vpnservice1\u0027"},{"line_number":896,"context_line":"        keys \u003d [(\u0027name\u0027, name)]"},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"        with contextlib.nested("},{"line_number":899,"context_line":"            self.subnet(cidr\u003d\u002710.2.0.0/24\u0027),"},{"line_number":900,"context_line":"            self.router()) as (subnet, router):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhII%3D","line":897,"updated":"2013-09-03 21:24:13.000000000","message":"not related.","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"1c963f5e03e4a8d7266ddcd917896dc457def38e","unresolved":false,"context_lines":[{"line_number":894,"context_line":"        \"\"\"Test case to update a vpnservice in invalid state .\"\"\""},{"line_number":895,"context_line":"        name \u003d \u0027new_vpnservice1\u0027"},{"line_number":896,"context_line":"        keys \u003d [(\u0027name\u0027, name)]"},{"line_number":897,"context_line":""},{"line_number":898,"context_line":"        with contextlib.nested("},{"line_number":899,"context_line":"            self.subnet(cidr\u003d\u002710.2.0.0/24\u0027),"},{"line_number":900,"context_line":"            self.router()) as (subnet, router):"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhB8%3D","line":897,"in_reply_to":"AAAASn%2F%2FhII%3D","updated":"2013-09-03 21:40:03.000000000","message":"Done","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"51fe8a91298fe25d9a6e8c911ec3e54f08f99a99","unresolved":false,"context_lines":[{"line_number":873,"context_line":""},{"line_number":874,"context_line":"    def test_create_vpnservice_with_invalid_provider(self):"},{"line_number":875,"context_line":"        \"\"\"Test case to create a vpnservice with invalid provider.\"\"\""},{"line_number":876,"context_line":"        with self.subnet(cidr\u003d\u002710.2.0.0/24\u0027) as subnet:"},{"line_number":877,"context_line":"            with self.router() as router:"},{"line_number":878,"context_line":"                self._create_vpnservice("},{"line_number":879,"context_line":"                    self.fmt,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2F%2Bn0%3D","line":876,"updated":"2013-10-24 11:42:04.000000000","message":"Can we use a nested with here?","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"57aced4d41c28ab2545dc580fdc75aa3d50ae067","unresolved":false,"context_lines":[{"line_number":873,"context_line":""},{"line_number":874,"context_line":"    def test_create_vpnservice_with_invalid_provider(self):"},{"line_number":875,"context_line":"        \"\"\"Test case to create a vpnservice with invalid provider.\"\"\""},{"line_number":876,"context_line":"        with self.subnet(cidr\u003d\u002710.2.0.0/24\u0027) as subnet:"},{"line_number":877,"context_line":"            with self.router() as router:"},{"line_number":878,"context_line":"                self._create_vpnservice("},{"line_number":879,"context_line":"                    self.fmt,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BYFw%3D","line":876,"in_reply_to":"AAAATn%2F%2F%2Bn0%3D","updated":"2013-11-26 18:51:39.000000000","message":"Done","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"51fe8a91298fe25d9a6e8c911ec3e54f08f99a99","unresolved":false,"context_lines":[{"line_number":930,"context_line":"            constants.VPN]"},{"line_number":931,"context_line":"        admin_context \u003d context.get_admin_context()"},{"line_number":932,"context_line":"        fake_provider \u003d \u0027fake_provider\u0027"},{"line_number":933,"context_line":"        with self.subnet(cidr\u003d\u002710.2.0.0/24\u0027) as subnet:"},{"line_number":934,"context_line":"            with self.router() as router:"},{"line_number":935,"context_line":"                vpn_id \u003d self._create_orphan_vpnservice("},{"line_number":936,"context_line":"                    admin_context,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2F%2Bns%3D","line":933,"updated":"2013-10-24 11:42:04.000000000","message":"Nested with?","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"57aced4d41c28ab2545dc580fdc75aa3d50ae067","unresolved":false,"context_lines":[{"line_number":930,"context_line":"            constants.VPN]"},{"line_number":931,"context_line":"        admin_context \u003d context.get_admin_context()"},{"line_number":932,"context_line":"        fake_provider \u003d \u0027fake_provider\u0027"},{"line_number":933,"context_line":"        with self.subnet(cidr\u003d\u002710.2.0.0/24\u0027) as subnet:"},{"line_number":934,"context_line":"            with self.router() as router:"},{"line_number":935,"context_line":"                vpn_id \u003d self._create_orphan_vpnservice("},{"line_number":936,"context_line":"                    admin_context,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BYFs%3D","line":933,"in_reply_to":"AAAATn%2F%2F%2Bns%3D","updated":"2013-11-26 18:51:39.000000000","message":"Done","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":105,"name":"Kyle Mestery","email":"mestery@mestery.com","username":"mestery"},"change_message_id":"1689b0dad1f9f64a069b8882fbe96c8cd9e9e5a8","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        cfg.CONF.set_override(\u0027service_provider\u0027,"},{"line_number":78,"context_line":"                              [vpnaas_provider],"},{"line_number":79,"context_line":"                              \u0027service_providers\u0027)"},{"line_number":80,"context_line":"        #force service type manager to reload configuration:"},{"line_number":81,"context_line":"        sdb.ServiceTypeManager._instance \u003d None"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        service_plugins \u003d {\u0027vpnaas_plugin\u0027: vpnaas_plugin}"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2BuoI%3D","line":80,"updated":"2014-02-19 14:42:33.000000000","message":"Nit: Space after #","commit_id":"ea7a68df7a424e50fe8d4bd5452f0d47fc7c8849"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"af30e159a1782b91b1fa374a3137d8701c79a329","unresolved":false,"context_lines":[{"line_number":937,"context_line":"            resource_db.status \u003d constants.ACTIVE"},{"line_number":938,"context_line":""},{"line_number":939,"context_line":"    def _create_orphan_vpnservice("},{"line_number":940,"context_line":"        self, context, subnet_id, router_id, provider):"},{"line_number":941,"context_line":"        vpn_id \u003d uuidutils.generate_uuid()"},{"line_number":942,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":943,"context_line":"            vpnservice_db \u003d vpn_db.VPNService("}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAU3%2F%2FvV4%3D","line":940,"updated":"2014-02-25 01:32:36.000000000","message":"provider not used.","commit_id":"cacd750b332cb0aedd83dca80e589abd55c64c4a"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"1b80cc975e282d2da8e5d8485fef6c221ced6026","unresolved":false,"context_lines":[{"line_number":937,"context_line":"            resource_db.status \u003d constants.ACTIVE"},{"line_number":938,"context_line":""},{"line_number":939,"context_line":"    def _create_orphan_vpnservice("},{"line_number":940,"context_line":"        self, context, subnet_id, router_id, provider):"},{"line_number":941,"context_line":"        vpn_id \u003d uuidutils.generate_uuid()"},{"line_number":942,"context_line":"        with context.session.begin(subtransactions\u003dTrue):"},{"line_number":943,"context_line":"            vpnservice_db \u003d vpn_db.VPNService("}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAAU3%2F%2Fuu8%3D","line":940,"in_reply_to":"AAAAU3%2F%2FvV4%3D","updated":"2014-02-25 02:31:47.000000000","message":"Done","commit_id":"cacd750b332cb0aedd83dca80e589abd55c64c4a"}],"neutron/tests/unit/services/vpn/service_drivers/test_generic_driver.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"51fe8a91298fe25d9a6e8c911ec3e54f08f99a99","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron.tests.unit.services.vpn.service_drivers import test_ipsec"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TestGenericVPNRpcDriver(test_ipsec.TestIPsecDriver):"},{"line_number":26,"context_line":"    def setUp(self):"},{"line_number":27,"context_line":"        super(TestGenericVPNRpcDriver, self).setUp()"},{"line_number":28,"context_line":"        self.driver \u003d service_drivers.GenericVPNRpcDriver(self.service_plugin)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2F%2BlE%3D","line":25,"updated":"2013-10-24 11:42:04.000000000","message":"Test case for call without vpnservice ID provided?","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"57aced4d41c28ab2545dc580fdc75aa3d50ae067","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from neutron.tests.unit.services.vpn.service_drivers import test_ipsec"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TestGenericVPNRpcDriver(test_ipsec.TestIPsecDriver):"},{"line_number":26,"context_line":"    def setUp(self):"},{"line_number":27,"context_line":"        super(TestGenericVPNRpcDriver, self).setUp()"},{"line_number":28,"context_line":"        self.driver \u003d service_drivers.GenericVPNRpcDriver(self.service_plugin)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BYFM%3D","line":25,"in_reply_to":"AAAATn%2F%2F%2BlE%3D","updated":"2013-11-26 18:51:39.000000000","message":"IMO, such case should be avoided by plugin layer","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"51fe8a91298fe25d9a6e8c911ec3e54f08f99a99","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        super(TestGenericVPNRpcDriver, self).setUp()"},{"line_number":28,"context_line":"        self.driver \u003d service_drivers.GenericVPNRpcDriver(self.service_plugin)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def _test_update(self, func, args, method_name\u003d\u0027\u0027):"},{"line_number":31,"context_line":"        ctxt \u003d context.Context(\u0027\u0027, \u0027somebody\u0027)"},{"line_number":32,"context_line":"        with mock.patch.object(self.driver.agent_rpc, \u0027cast\u0027) as cast:"},{"line_number":33,"context_line":"            kwargs \u003d {}"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2F%2Bk0%3D","line":30,"updated":"2013-10-24 11:42:04.000000000","message":"I\u0027m missing something...what is the purpose of this function?","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"57aced4d41c28ab2545dc580fdc75aa3d50ae067","unresolved":false,"context_lines":[{"line_number":27,"context_line":"        super(TestGenericVPNRpcDriver, self).setUp()"},{"line_number":28,"context_line":"        self.driver \u003d service_drivers.GenericVPNRpcDriver(self.service_plugin)"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    def _test_update(self, func, args, method_name\u003d\u0027\u0027):"},{"line_number":31,"context_line":"        ctxt \u003d context.Context(\u0027\u0027, \u0027somebody\u0027)"},{"line_number":32,"context_line":"        with mock.patch.object(self.driver.agent_rpc, \u0027cast\u0027) as cast:"},{"line_number":33,"context_line":"            kwargs \u003d {}"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BYFU%3D","line":30,"in_reply_to":"AAAATn%2F%2F%2Bk0%3D","updated":"2013-11-26 18:51:39.000000000","message":"This one extends test_ipsec.TestIPSecDriver.\nand overrides _test_update","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"51fe8a91298fe25d9a6e8c911ec3e54f08f99a99","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                 \u0027method\u0027: method_name},"},{"line_number":45,"context_line":"                topic\u003d\u0027vpn_rpc_fake_provider\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_call_undefied_method(self):"},{"line_number":48,"context_line":"        ctxt \u003d context.Context(\u0027\u0027, \u0027somebody\u0027)"},{"line_number":49,"context_line":"        self.assertRaises(AttributeError, self.driver.undef_func, ctxt)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2F%2Bm4%3D","line":47,"updated":"2013-10-24 11:42:04.000000000","message":"undefied -\u003e undefined","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"57aced4d41c28ab2545dc580fdc75aa3d50ae067","unresolved":false,"context_lines":[{"line_number":44,"context_line":"                 \u0027method\u0027: method_name},"},{"line_number":45,"context_line":"                topic\u003d\u0027vpn_rpc_fake_provider\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_call_undefied_method(self):"},{"line_number":48,"context_line":"        ctxt \u003d context.Context(\u0027\u0027, \u0027somebody\u0027)"},{"line_number":49,"context_line":"        self.assertRaises(AttributeError, self.driver.undef_func, ctxt)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BYFk%3D","line":47,"in_reply_to":"AAAATn%2F%2F%2Bm4%3D","updated":"2013-11-26 18:51:39.000000000","message":"Done","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9dd782286b2e5fe25664542392d81620808d6210","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def test_call_undefied_method(self):"},{"line_number":48,"context_line":"        ctxt \u003d context.Context(\u0027\u0027, \u0027somebody\u0027)"},{"line_number":49,"context_line":"        self.assertRaises(AttributeError, self.driver.undef_func, ctxt)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2Bu28%3D","line":49,"updated":"2014-02-19 13:56:31.000000000","message":"We need to add more tests to test rpc_cast.","commit_id":"ea7a68df7a424e50fe8d4bd5452f0d47fc7c8849"}],"neutron/tests/unit/services/vpn/service_drivers/test_ipsec.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"51fe8a91298fe25d9a6e8c911ec3e54f08f99a99","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        }"},{"line_number":63,"context_line":"        self.driver \u003d ipsec_driver.IPsecVPNDriver(self.service_plugin)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _test_update(self, func, args, method_name\u003d\u0027\u0027):"},{"line_number":66,"context_line":"        ctxt \u003d context.Context(\u0027\u0027, \u0027somebody\u0027)"},{"line_number":67,"context_line":"        with mock.patch.object(self.driver.agent_rpc, \u0027cast\u0027) as cast:"},{"line_number":68,"context_line":"            func(ctxt, *args)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2F%2Bjc%3D","line":65,"updated":"2013-10-24 11:42:04.000000000","message":"Could use a more descriptive name.\n\n_test_rpc_call()?","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8aa6b969f653479c03e7ed1ec199c54988eb622f","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        }"},{"line_number":63,"context_line":"        self.driver \u003d ipsec_driver.IPsecVPNDriver(self.service_plugin)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _test_update(self, func, args, method_name\u003d\u0027\u0027):"},{"line_number":66,"context_line":"        ctxt \u003d context.Context(\u0027\u0027, \u0027somebody\u0027)"},{"line_number":67,"context_line":"        with mock.patch.object(self.driver.agent_rpc, \u0027cast\u0027) as cast:"},{"line_number":68,"context_line":"            func(ctxt, *args)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BX14%3D","line":65,"in_reply_to":"AAAATn%2F%2BYD4%3D","updated":"2013-11-26 19:29:50.000000000","message":"_test_remote_agent_update()?","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"57aced4d41c28ab2545dc580fdc75aa3d50ae067","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        }"},{"line_number":63,"context_line":"        self.driver \u003d ipsec_driver.IPsecVPNDriver(self.service_plugin)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _test_update(self, func, args, method_name\u003d\u0027\u0027):"},{"line_number":66,"context_line":"        ctxt \u003d context.Context(\u0027\u0027, \u0027somebody\u0027)"},{"line_number":67,"context_line":"        with mock.patch.object(self.driver.agent_rpc, \u0027cast\u0027) as cast:"},{"line_number":68,"context_line":"            func(ctxt, *args)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2BYD4%3D","line":65,"in_reply_to":"AAAATn%2F%2F%2Bjc%3D","updated":"2013-11-26 18:51:39.000000000","message":"I prefer _test_update \nbecause this method tests driver updates remote agent or not.\n\nIn future, we could have driver which don\u0027t use rpc (i.e REST call or something)","commit_id":"a51e7ca00fdb432648b3300d5729ccdb1358fcaf"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"9dd782286b2e5fe25664542392d81620808d6210","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        }"},{"line_number":63,"context_line":"        self.driver \u003d ipsec_driver.IPsecVPNDriver(self.service_plugin)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def _test_update(self, func, args, method_name\u003d\u0027\u0027):"},{"line_number":66,"context_line":"        ctxt \u003d context.Context(\u0027\u0027, \u0027somebody\u0027)"},{"line_number":67,"context_line":"        with mock.patch.object(self.driver.agent_rpc, \u0027cast\u0027) as cast:"},{"line_number":68,"context_line":"            func(ctxt, *args)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAUX%2F%2Bu4I%3D","line":65,"updated":"2014-02-19 13:56:31.000000000","message":"method_name is not used. Is it needed?","commit_id":"ea7a68df7a424e50fe8d4bd5452f0d47fc7c8849"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"659ff8341c682b02055cf56ac10968c3303a2d2b","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        l3_agent \u003d mock.Mock()"},{"line_number":45,"context_line":"        l3_agent.host \u003d FAKE_HOST"},{"line_number":46,"context_line":"        plugin \u003d mock.Mock()"},{"line_number":47,"context_line":"        plugin.get_l3_agents_hosting_routers.return_value \u003d [l3_agent]"},{"line_number":48,"context_line":"        plugin_p \u003d mock.patch(\u0027neutron.manager.NeutronManager.get_plugin\u0027)"},{"line_number":49,"context_line":"        get_plugin \u003d plugin_p.start()"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAU3%2F%2Fxo0%3D","line":46,"updated":"2014-02-24 20:57:26.000000000","message":"Is this mock and the self.service_plugin mock one and the same now?","commit_id":"a03fb2fc5624d8e62128fa7d4f994c7fcae91c69"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"eceb6ec7c79be7b9cc2d730527233ef6551f96a5","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        l3_agent \u003d mock.Mock()"},{"line_number":45,"context_line":"        l3_agent.host \u003d FAKE_HOST"},{"line_number":46,"context_line":"        plugin \u003d mock.Mock()"},{"line_number":47,"context_line":"        plugin.get_l3_agents_hosting_routers.return_value \u003d [l3_agent]"},{"line_number":48,"context_line":"        plugin_p \u003d mock.patch(\u0027neutron.manager.NeutronManager.get_plugin\u0027)"},{"line_number":49,"context_line":"        get_plugin \u003d plugin_p.start()"}],"source_content_type":"text/x-python","patch_set":25,"id":"AAAAU3%2F%2Fwyk%3D","line":46,"in_reply_to":"AAAAU3%2F%2Fxo0%3D","updated":"2014-02-24 22:19:51.000000000","message":"No this is core plugin","commit_id":"a03fb2fc5624d8e62128fa7d4f994c7fcae91c69"}],"neutron/tests/unit/services/vpn/test_vpnaas_driver_plugin.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"87dd41b8f74add236931431bd81d2ab746ca4e75","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    @contextlib.contextmanager"},{"line_number":68,"context_line":"    def vpnservice_set(self):"},{"line_number":69,"context_line":"        \"\"\"Test case to create a ipsec_site_connection.\"\"\""},{"line_number":70,"context_line":"        vpnservice_name \u003d \"vpn1\""},{"line_number":71,"context_line":"        ipsec_site_connection_name \u003d \"ipsec_site_connection\""},{"line_number":72,"context_line":"        ikename \u003d \"ikepolicy1\""}],"source_content_type":"text/x-python","patch_set":10,"id":"AAAASn%2F%2FeCA%3D","line":69,"updated":"2013-09-04 13:15:18.000000000","message":"a -\u003e an","commit_id":"87c39a6a09cb9b987eb9d7b1a3b056eb565a8ecf"}],"neutron/tests/unit/services/vpn/test_vpnaas_extension.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"7e9a76912555fa16c00f31fb50050b499a9979b8","unresolved":false,"context_lines":[{"line_number":332,"context_line":"                               \u0027subnet_id\u0027: _uuid(),"},{"line_number":333,"context_line":"                               \u0027router_id\u0027: _uuid(),"},{"line_number":334,"context_line":"                               \u0027admin_state_up\u0027: True,"},{"line_number":335,"context_line":"                               \u0027provider\u0027: mock.ANY,"},{"line_number":336,"context_line":"                               \u0027tenant_id\u0027: _uuid()}}"},{"line_number":337,"context_line":"        return_value \u003d copy.copy(data[\u0027vpnservice\u0027])"},{"line_number":338,"context_line":"        return_value.update({\u0027status\u0027: \"ACTIVE\", \u0027id\u0027: vpnservice_id})"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhLI%3D","line":335,"updated":"2013-09-03 21:24:13.000000000","message":"(nit) mock.ANY is usually used when comparing called parameters. It is better to use mock.Mock() or mock.sentinal.xxxx (if you need to check the value).","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"change_message_id":"1c963f5e03e4a8d7266ddcd917896dc457def38e","unresolved":false,"context_lines":[{"line_number":332,"context_line":"                               \u0027subnet_id\u0027: _uuid(),"},{"line_number":333,"context_line":"                               \u0027router_id\u0027: _uuid(),"},{"line_number":334,"context_line":"                               \u0027admin_state_up\u0027: True,"},{"line_number":335,"context_line":"                               \u0027provider\u0027: mock.ANY,"},{"line_number":336,"context_line":"                               \u0027tenant_id\u0027: _uuid()}}"},{"line_number":337,"context_line":"        return_value \u003d copy.copy(data[\u0027vpnservice\u0027])"},{"line_number":338,"context_line":"        return_value.update({\u0027status\u0027: \"ACTIVE\", \u0027id\u0027: vpnservice_id})"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAASn%2F%2FhBc%3D","line":335,"in_reply_to":"AAAASn%2F%2FhLI%3D","updated":"2013-09-03 21:40:03.000000000","message":"Done","commit_id":"2d825f760ec80448182c7f0baf131446ae2a4ae3"}]}
