)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"567a5e2f4f8f7a3065f96859d836d5293e18ef95","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The test verifies that it is possible to establish a vpn"},{"line_number":10,"context_line":"connection between two sites. And then it performs basic"},{"line_number":11,"context_line":"connectivity test, it it pings IP address of a site2 from an IP"},{"line_number":12,"context_line":"address of a site1"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I5ff943d4cb4de06c79c2f2d0fee178ad992f36d1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ba7be1f8_ca68118a","line":11,"updated":"2015-02-27 22:05:53.000000000","message":"connectivity test. It pings IP address of site2 from an IP address of site1.","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"567a5e2f4f8f7a3065f96859d836d5293e18ef95","unresolved":false,"context_lines":[{"line_number":10,"context_line":"connection between two sites. And then it performs basic"},{"line_number":11,"context_line":"connectivity test, it it pings IP address of a site2 from an IP"},{"line_number":12,"context_line":"address of a site1"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I5ff943d4cb4de06c79c2f2d0fee178ad992f36d1"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ba7be1f8_6a1f250a","line":13,"updated":"2015-02-27 22:05:53.000000000","message":"Create/include launchpad bug for this?","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b80fdcdae3ecb8e25ea77cfe17a7613b46b2bba3","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The test verifies that it is possible to establish a vpn"},{"line_number":10,"context_line":"connection between two sites. And then it performs basic"},{"line_number":11,"context_line":"connectivity test, it it pings IP address of a site2 from an IP"},{"line_number":12,"context_line":"address of a site1"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Also the patch updates gate_hook.sh and post_test_hook.sh:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9a80dd14_0a09122c","line":11,"updated":"2015-03-18 15:29:36.000000000","message":"See my two comments from PS1.","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"15e6821bd62085fa5414d43a6a451f5a5ba11737","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The test verifies that it is possible to establish a vpn"},{"line_number":10,"context_line":"connection between two sites. And then it performs basic"},{"line_number":11,"context_line":"connectivity test, it it pings IP address of a site2 from an IP"},{"line_number":12,"context_line":"address of a site1"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Also the patch updates gate_hook.sh and post_test_hook.sh:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"9a80dd14_3337fcb1","line":11,"in_reply_to":"9a80dd14_0a09122c","updated":"2015-03-19 14:11:25.000000000","message":"Sorry, I forget to change it.","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"821daeb830210f7737e1fe279e56366e36a1ea06","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The test verifies that it is possible to establish a vpn"},{"line_number":10,"context_line":"connection between two sites. And then it performs basic"},{"line_number":11,"context_line":"connectivity test, it it pings IP address of a site2 from an IP"},{"line_number":12,"context_line":"address of a site1"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Also the patch updates gate_hook.sh and post_test_hook.sh:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9a80dd14_30d0c552","line":11,"updated":"2015-03-19 16:22:27.000000000","message":"Still don\u0027t have comments addressed in PS1","commit_id":"24270aef5ee88149d0bbddd0e71fb4e9fa82d270"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"974762310a67e0bf4845a9f66b87733c0b037697","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"The test verifies that it is possible to establish a vpn"},{"line_number":10,"context_line":"connection between two sites. And then it performs basic"},{"line_number":11,"context_line":"connectivity test, it it pings IP address of a site2 from an IP"},{"line_number":12,"context_line":"address of a site1"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Also the patch updates gate_hook.sh and post_test_hook.sh:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"9a80dd14_8b2cbb94","line":11,"in_reply_to":"9a80dd14_30d0c552","updated":"2015-03-20 13:21:57.000000000","message":"Sorry. Changed.","commit_id":"24270aef5ee88149d0bbddd0e71fb4e9fa82d270"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8d60b675baf90e273f0f4bed16b3a476e9fec4fa","unresolved":false,"context_lines":[{"line_number":11,"context_line":"connectivity test. It pings IP address of site2 from an"},{"line_number":12,"context_line":"IP address of site1."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Also the patch updates gate_hook.sh and post_test_hook.sh:"},{"line_number":15,"context_line":"* enable tempest service."},{"line_number":16,"context_line":"* source openstack credentials (demo user)"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"9aa53dc9_f978492d","line":14,"updated":"2015-04-08 20:18:50.000000000","message":"Out of date... don\u0027t see these in change set.\n\nFYI, This change depends on conversion of functional jobs to no longer stack (1441783).","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"97a1a0d149d6fb8ad58c0a01780800b8aba7c0ed","unresolved":false,"context_lines":[{"line_number":11,"context_line":"connectivity test. It pings IP address of site2 from an"},{"line_number":12,"context_line":"IP address of site1."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Also the patch updates gate_hook.sh and post_test_hook.sh:"},{"line_number":15,"context_line":"* enable tempest service."},{"line_number":16,"context_line":"* source openstack credentials (demo user)"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":14,"id":"9aa53dc9_befa9541","line":14,"in_reply_to":"9aa53dc9_f978492d","updated":"2015-04-09 07:29:01.000000000","message":"Yes the message is outdated","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"}],"neutron_vpnaas/tests/contrib/gate_hook.sh":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b80fdcdae3ecb8e25ea77cfe17a7613b46b2bba3","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    export KEEP_LOCALRC\u003d1"},{"line_number":12,"context_line":"fi"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"export ENABLED_SERVICES\u003dtempest"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"$BASE/new/devstack-gate/devstack-vm-gate.sh"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-sh","patch_set":3,"id":"9a80dd14_cd78f4fa","line":14,"updated":"2015-03-18 15:29:36.000000000","message":"You can double check the log output, but I\u0027m almost positive this service is enabled in devstack by default.","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"15e6821bd62085fa5414d43a6a451f5a5ba11737","unresolved":false,"context_lines":[{"line_number":11,"context_line":"    export KEEP_LOCALRC\u003d1"},{"line_number":12,"context_line":"fi"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"export ENABLED_SERVICES\u003dtempest"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"$BASE/new/devstack-gate/devstack-vm-gate.sh"},{"line_number":17,"context_line":""}],"source_content_type":"text/x-sh","patch_set":3,"id":"9a80dd14_fd11e15d","line":14,"in_reply_to":"9a80dd14_cd78f4fa","updated":"2015-03-19 14:11:25.000000000","message":"It is not enabled. See localrc generated for any build of \"check-neutron-vpnaas-dsvm-functional\". For example: http://logs.openstack.org/21/165421/1/check/check-neutron-vpnaas-dsvm-functional/fe2fd4a/logs/localrc.txt.gz","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"cf6eb9f14b9ed3b70b0389d589fb02f4a690bebb","unresolved":false,"context_lines":[{"line_number":13,"context_line":""},{"line_number":14,"context_line":"export ENABLED_SERVICES\u003dtempest"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"$BASE/new/devstack-gate/devstack-vm-gate.sh"}],"source_content_type":"text/x-sh","patch_set":12,"id":"1a6ced46_1536a003","line":16,"updated":"2015-03-24 18:43:23.000000000","message":"The code (removed) came from what was in Neutron at the time functional tests were set up. I\u0027d suggest finding out whether or not they are needed for the VPNaaS repo\u0027s functional tests.","commit_id":"f591501220b4379190d8c4bac02945a4115f6952"}],"neutron_vpnaas/tests/contrib/post_test_hook.sh":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b80fdcdae3ecb8e25ea77cfe17a7613b46b2bba3","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# Get demo credentials"},{"line_number":38,"context_line":"cd $BASE/new/devstack"},{"line_number":39,"context_line":"source openrc demo demo"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"# Run tests"},{"line_number":42,"context_line":"echo \"Running neutron dsvm-functional test suite\""}],"source_content_type":"text/x-sh","patch_set":3,"id":"9a80dd14_a8f00eca","line":39,"updated":"2015-03-18 15:29:36.000000000","message":"Nova and keystone clients use admin/admin. Should you use the same?","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"15e6821bd62085fa5414d43a6a451f5a5ba11737","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# Get demo credentials"},{"line_number":38,"context_line":"cd $BASE/new/devstack"},{"line_number":39,"context_line":"source openrc demo demo"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"# Run tests"},{"line_number":42,"context_line":"echo \"Running neutron dsvm-functional test suite\""}],"source_content_type":"text/x-sh","patch_set":3,"id":"9a80dd14_00200e9a","line":39,"in_reply_to":"9a80dd14_a8f00eca","updated":"2015-03-19 14:11:25.000000000","message":"Ok I will change it to admin/admin","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"821daeb830210f7737e1fe279e56366e36a1ea06","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# Get demo credentials"},{"line_number":38,"context_line":"cd $BASE/new/devstack"},{"line_number":39,"context_line":"source openrc demo demo"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"# Run tests"},{"line_number":42,"context_line":"echo \"Running neutron dsvm-functional test suite\""}],"source_content_type":"text/x-sh","patch_set":5,"id":"9a80dd14_90f411f2","line":39,"updated":"2015-03-19 16:22:27.000000000","message":"Still don\u0027t have change mentioned in PS3.","commit_id":"24270aef5ee88149d0bbddd0e71fb4e9fa82d270"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"974762310a67e0bf4845a9f66b87733c0b037697","unresolved":false,"context_lines":[{"line_number":36,"context_line":""},{"line_number":37,"context_line":"# Get demo credentials"},{"line_number":38,"context_line":"cd $BASE/new/devstack"},{"line_number":39,"context_line":"source openrc demo demo"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"# Run tests"},{"line_number":42,"context_line":"echo \"Running neutron dsvm-functional test suite\""}],"source_content_type":"text/x-sh","patch_set":5,"id":"9a80dd14_0b21ab9d","line":39,"in_reply_to":"9a80dd14_90f411f2","updated":"2015-03-20 13:21:57.000000000","message":"Removed this line. All config values are taken from a tempest.conf","commit_id":"24270aef5ee88149d0bbddd0e71fb4e9fa82d270"}],"neutron_vpnaas/tests/functional/common/test_scenario.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"821daeb830210f7737e1fe279e56366e36a1ea06","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# NOTE: The purpose of this module is to provide nop tests to verify that"},{"line_number":14,"context_line":"# the functional gate is working."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# TODO(pcm): In the future, this will be replaced with a real scenario test."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import os"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_d02129b5","line":16,"updated":"2015-03-19 16:22:27.000000000","message":"Remove","commit_id":"24270aef5ee88149d0bbddd0e71fb4e9fa82d270"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"974762310a67e0bf4845a9f66b87733c0b037697","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# NOTE: The purpose of this module is to provide nop tests to verify that"},{"line_number":14,"context_line":"# the functional gate is working."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# TODO(pcm): In the future, this will be replaced with a real scenario test."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import os"},{"line_number":19,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_000d0a8f","line":16,"in_reply_to":"9a80dd14_d02129b5","updated":"2015-03-20 13:21:57.000000000","message":"Removed","commit_id":"24270aef5ee88149d0bbddd0e71fb4e9fa82d270"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"821daeb830210f7737e1fe279e56366e36a1ea06","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    _ip_version \u003d 4"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @classmethod"},{"line_number":37,"context_line":"    def setUpClass(cls):"},{"line_number":38,"context_line":"        super(TestIPSecScenario, cls).setUpClass()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        cls.os_username \u003d os.environ.get(\u0027OS_USERNAME\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_10bd81b1","line":37,"updated":"2015-03-19 16:22:27.000000000","message":"Repeating my comments from PS3, as they aren\u0027t all addressed and since file was moved, they\u0027re not showing up on a compare...\n\nDocumentation for BaseTestCase seems to indicate that one should not override setUpClass(), but instead override the skip_checks(), setup_credentials(), setup_clients(), and resource_setup() class methods.\n\nI\u0027d suggest following that recommendation and move items to the respective methods.","commit_id":"24270aef5ee88149d0bbddd0e71fb4e9fa82d270"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"974762310a67e0bf4845a9f66b87733c0b037697","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    _ip_version \u003d 4"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @classmethod"},{"line_number":37,"context_line":"    def setUpClass(cls):"},{"line_number":38,"context_line":"        super(TestIPSecScenario, cls).setUpClass()"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"        cls.os_username \u003d os.environ.get(\u0027OS_USERNAME\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_806f3a27","line":37,"in_reply_to":"9a80dd14_10bd81b1","updated":"2015-03-20 13:21:57.000000000","message":"Done","commit_id":"24270aef5ee88149d0bbddd0e71fb4e9fa82d270"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"821daeb830210f7737e1fe279e56366e36a1ea06","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        cls.build_timeout \u003d int(os.environ.get(\u0027BUILD_TIMEOUT\u0027, 300))"},{"line_number":45,"context_line":"        cls.build_interval \u003d int(os.environ.get(\u0027BUILD_INTERVAL\u0027, 1))"},{"line_number":46,"context_line":"        cls.public_network_name \u003d os.environ.get(\u0027PUBLIC_NETWORK_NAME\u0027, \u0027public\u0027)"},{"line_number":47,"context_line":"        cls.mask_cidr \u003d int(os.environ.get(\u0027TENANT_NETWORK_MASK_BITS\u0027, 28))"},{"line_number":48,"context_line":"        cls.cidr \u003d netaddr.IPNetwork("},{"line_number":49,"context_line":"            os.environ.get(\u0027TENANT_NETWORK_CIDR\u0027, \u002710.100.0.0/16\u0027))"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_d0f4c988","line":47,"updated":"2015-03-19 16:22:27.000000000","message":"IIRC you said this was the private net. Isn\u0027t the default /24 in devstack?","commit_id":"24270aef5ee88149d0bbddd0e71fb4e9fa82d270"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"974762310a67e0bf4845a9f66b87733c0b037697","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        cls.build_timeout \u003d int(os.environ.get(\u0027BUILD_TIMEOUT\u0027, 300))"},{"line_number":45,"context_line":"        cls.build_interval \u003d int(os.environ.get(\u0027BUILD_INTERVAL\u0027, 1))"},{"line_number":46,"context_line":"        cls.public_network_name \u003d os.environ.get(\u0027PUBLIC_NETWORK_NAME\u0027, \u0027public\u0027)"},{"line_number":47,"context_line":"        cls.mask_cidr \u003d int(os.environ.get(\u0027TENANT_NETWORK_MASK_BITS\u0027, 28))"},{"line_number":48,"context_line":"        cls.cidr \u003d netaddr.IPNetwork("},{"line_number":49,"context_line":"            os.environ.get(\u0027TENANT_NETWORK_CIDR\u0027, \u002710.100.0.0/16\u0027))"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_c064d24a","line":47,"in_reply_to":"9a80dd14_d0f4c988","updated":"2015-03-20 13:21:57.000000000","message":"All config values are taken from tempest.conf. I will debug how it works in check pipeline.\n\nAs I remember tempest cuts TENANT_NETWORK_CIDR into subnetworks with TENANT_NETWORK_MASK_BITS cidr","commit_id":"24270aef5ee88149d0bbddd0e71fb4e9fa82d270"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"821daeb830210f7737e1fe279e56366e36a1ea06","unresolved":false,"context_lines":[{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def site_setup(self, site_name):"},{"line_number":79,"context_line":"        \"\"\"Creates network, subnet, router, port"},{"line_number":80,"context_line":"        \"\"\""},{"line_number":81,"context_line":"        result \u003d self.network_client.create_network("},{"line_number":82,"context_line":"            name\u003ddata_utils.rand_name(\u0027{0}-net\u0027.format(site_name)))"},{"line_number":83,"context_line":"        network \u003d net_resources.DeletableNetwork(client\u003dself.network_client,"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_900df191","line":80,"updated":"2015-03-19 16:22:27.000000000","message":"Nit: PEP257 - put quotes on previous line, and end docstring with a period.","commit_id":"24270aef5ee88149d0bbddd0e71fb4e9fa82d270"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"821daeb830210f7737e1fe279e56366e36a1ea06","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    def site_setup(self, site_name):"},{"line_number":79,"context_line":"        \"\"\"Creates network, subnet, router, port"},{"line_number":80,"context_line":"        \"\"\""},{"line_number":81,"context_line":"        result \u003d self.network_client.create_network("},{"line_number":82,"context_line":"            name\u003ddata_utils.rand_name(\u0027{0}-net\u0027.format(site_name)))"},{"line_number":83,"context_line":"        network \u003d net_resources.DeletableNetwork(client\u003dself.network_client,"},{"line_number":84,"context_line":"                                                 **result[\u0027network\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_50653943","line":81,"updated":"2015-03-19 16:22:27.000000000","message":"If you\u0027re not checking the results (which I think it\u0027s a good idea to do so that the assumptions made of test set up are working), then the return value doesn\u0027t need to be captured. Here and on other calls.","commit_id":"24270aef5ee88149d0bbddd0e71fb4e9fa82d270"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"974762310a67e0bf4845a9f66b87733c0b037697","unresolved":false,"context_lines":[{"line_number":78,"context_line":"    def site_setup(self, site_name):"},{"line_number":79,"context_line":"        \"\"\"Creates network, subnet, router, port"},{"line_number":80,"context_line":"        \"\"\""},{"line_number":81,"context_line":"        result \u003d self.network_client.create_network("},{"line_number":82,"context_line":"            name\u003ddata_utils.rand_name(\u0027{0}-net\u0027.format(site_name)))"},{"line_number":83,"context_line":"        network \u003d net_resources.DeletableNetwork(client\u003dself.network_client,"},{"line_number":84,"context_line":"                                                 **result[\u0027network\u0027])"}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_2b14af42","line":81,"in_reply_to":"9a80dd14_50653943","updated":"2015-03-20 13:21:57.000000000","message":"NeutronClient asserts status of each resonse. For example: https://github.com/openstack/neutron/blob/master/neutron/tests/tempest/services/network/json/network_client.py#L141\n\nThe \"expected_success\" method here: https://github.com/openstack/tempest-lib/blob/master/tempest_lib/common/rest_client.py#L203\nIt should raises an exception if a status is not valid.","commit_id":"24270aef5ee88149d0bbddd0e71fb4e9fa82d270"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"821daeb830210f7737e1fe279e56366e36a1ea06","unresolved":false,"context_lines":[{"line_number":201,"context_line":"            return False"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    def check_sites_connectivity(self, source_site, dest_site):"},{"line_number":204,"context_line":"        \"\"\"Test connectivity from source_site to dest_site. It tries to ping"},{"line_number":205,"context_line":"           instance of destination site from an instance of source site"},{"line_number":206,"context_line":"        \"\"\""},{"line_number":207,"context_line":"        self.assertTrue("}],"source_content_type":"text/x-python","patch_set":5,"id":"9a80dd14_70407d5f","line":204,"updated":"2015-03-19 16:22:27.000000000","message":"Nit: PEP257 - multiline docstrings should have single summary sentence \non first line with period. Blank line, and then rest of docstring.\n\nHere and some other docstrings.","commit_id":"24270aef5ee88149d0bbddd0e71fb4e9fa82d270"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"1fa37eda0460b7a7710551b62af2d49fb629370e","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from neutron.agent.linux import utils"},{"line_number":19,"context_line":"from neutron.tests.tempest import config"},{"line_number":20,"context_line":"from neutron.tests.tempest import test"},{"line_number":21,"context_line":"from neutron.tests.tempest.api.network import base"},{"line_number":22,"context_line":"from neutron.tests.tempest.services.network import resources as net_resources"},{"line_number":23,"context_line":"from tempest_lib import exceptions as exc"},{"line_number":24,"context_line":"from tempest_lib.common.utils import data_utils"}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_7beaeb0f","line":21,"updated":"2015-03-20 16:55:58.000000000","message":"This should be before L19.","commit_id":"efaf8d2722e28ea9c24c23e0b8c4adc10b0d16b2"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"1fa37eda0460b7a7710551b62af2d49fb629370e","unresolved":false,"context_lines":[{"line_number":19,"context_line":"from neutron.tests.tempest import config"},{"line_number":20,"context_line":"from neutron.tests.tempest import test"},{"line_number":21,"context_line":"from neutron.tests.tempest.api.network import base"},{"line_number":22,"context_line":"from neutron.tests.tempest.services.network import resources as net_resources"},{"line_number":23,"context_line":"from tempest_lib import exceptions as exc"},{"line_number":24,"context_line":"from tempest_lib.common.utils import data_utils"},{"line_number":25,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_1bd9ef82","line":22,"updated":"2015-03-20 16:55:58.000000000","message":"This should be before L20.","commit_id":"efaf8d2722e28ea9c24c23e0b8c4adc10b0d16b2"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"1fa37eda0460b7a7710551b62af2d49fb629370e","unresolved":false,"context_lines":[{"line_number":181,"context_line":"                self.build_timeout, self.build_interval),"},{"line_number":182,"context_line":"            \"There is no connectivity between sites\")"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"    def test_ipsec_site_connections(self):"},{"line_number":185,"context_line":"        site1 \u003d self.site_setup(\u0027site1\u0027)"},{"line_number":186,"context_line":"        site2 \u003d self.site_setup(\u0027site2\u0027)"},{"line_number":187,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"9a80dd14_1b6e4f96","line":184,"updated":"2015-03-20 16:55:58.000000000","message":"Did you mean to totally remove the docstring for the test?","commit_id":"efaf8d2722e28ea9c24c23e0b8c4adc10b0d16b2"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"cf6eb9f14b9ed3b70b0389d589fb02f4a690bebb","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import netaddr"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from neutron.agent.linux import utils"},{"line_number":19,"context_line":"from neutron.tests.tempest.api.network import base"},{"line_number":20,"context_line":"from neutron.tests.tempest import config"},{"line_number":21,"context_line":"from neutron.tests.tempest.services.network import resources as net_resources"},{"line_number":22,"context_line":"from neutron.tests.tempest import test"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_f889f926","line":19,"updated":"2015-03-24 18:43:23.000000000","message":"I talked to Maru, and he said that the tempest stuff is going away and that we shouldn\u0027t base our tests on it. He suggests setting up our test fixture w/o using tempest. He is willing to provide some guidance here if you need it, so reach out to him (marun on IRC).","commit_id":"f591501220b4379190d8c4bac02945a4115f6952"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"a1451f5443bd7aaca8bf7ef4ea937063184a1f1b","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import netaddr"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from neutron.agent.linux import utils"},{"line_number":19,"context_line":"from neutron.tests.tempest.api.network import base"},{"line_number":20,"context_line":"from neutron.tests.tempest import config"},{"line_number":21,"context_line":"from neutron.tests.tempest.services.network import resources as net_resources"},{"line_number":22,"context_line":"from neutron.tests.tempest import test"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a6ced46_ffa8cd8e","line":19,"in_reply_to":"1a6ced46_f889f926","updated":"2015-03-25 19:03:50.000000000","message":"Thanks. I will.","commit_id":"f591501220b4379190d8c4bac02945a4115f6952"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"bbcb4c85ffb1b8a5070448381464211ed5fe137e","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        config.set_override(\u0027ovs_integration_bridge\u0027, self.br_int.br_name)"},{"line_number":213,"context_line":"        config.set_override(\u0027external_network_bridge\u0027, self.br_ex.br_name)"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        if self.vpn_device_driver:"},{"line_number":216,"context_line":"            config.set_override(\u0027vpn_device_driver\u0027, self.vpn_device_driver,"},{"line_number":217,"context_line":"                                \u0027vpnagent\u0027)"},{"line_number":218,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"3ab451fb_75d126cd","line":215,"updated":"2015-04-17 17:22:15.000000000","message":"With the new functional tests jobs (review 168115), if I get them working, the driver should be available in config. Should be able to use that vs environment variable, right?","commit_id":"96c86ad1afb10308eb70872c229874c95e9e60a7"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"5e413793e2e839b3c73b1883405cff66ab79399a","unresolved":false,"context_lines":[{"line_number":212,"context_line":"        config.set_override(\u0027ovs_integration_bridge\u0027, self.br_int.br_name)"},{"line_number":213,"context_line":"        config.set_override(\u0027external_network_bridge\u0027, self.br_ex.br_name)"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        if self.vpn_device_driver:"},{"line_number":216,"context_line":"            config.set_override(\u0027vpn_device_driver\u0027, self.vpn_device_driver,"},{"line_number":217,"context_line":"                                \u0027vpnagent\u0027)"},{"line_number":218,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"dac4157f_d5beb8fe","line":215,"in_reply_to":"3ab451fb_75d126cd","updated":"2015-04-20 14:21:38.000000000","message":"But then we need to have environment variable (or something else) to store config path","commit_id":"96c86ad1afb10308eb70872c229874c95e9e60a7"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"54b4a9810ca7d0333504731264f1239a6f1618e0","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        super(RouterFixture, self).setUp()"},{"line_number":154,"context_line":"        self.l3_agent._process_added_router(self.router_info)"},{"line_number":155,"context_line":"        self.router \u003d self.l3_agent.router_info[self.router_id]"},{"line_number":156,"context_line":"        self.addCleanup(self._delete_router)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def _generate_info(self, public_ip, private_cidr):"},{"line_number":159,"context_line":"        info \u003d copy.deepcopy(FAKE_ROUTER)"}],"source_content_type":"text/x-python","patch_set":20,"id":"dac4157f_0ff775d4","line":156,"updated":"2015-04-20 16:16:05.000000000","message":"Maybe I wasn\u0027t clear in PS17, and missed this in PS19. I was suggesting that this should be self.addCleanup(self.l3_agent._router_removed), which I\u0027m pretty sure is the inverse of _process_added_router() and would undo everything that was done. In _delete_router, it does that, on L180, but also does steps on L176-178, which is a subset of what is done by _router_removed(), or am I missing something?","commit_id":"31ff75c1b2983045b0dff9284e172fd7c26d96ed"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"778d7879a780eb672d05f7be3a9f9477aa5436c7","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        super(RouterFixture, self).setUp()"},{"line_number":154,"context_line":"        self.l3_agent._process_added_router(self.router_info)"},{"line_number":155,"context_line":"        self.router \u003d self.l3_agent.router_info[self.router_id]"},{"line_number":156,"context_line":"        self.addCleanup(self._delete_router)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def _generate_info(self, public_ip, private_cidr):"},{"line_number":159,"context_line":"        info \u003d copy.deepcopy(FAKE_ROUTER)"}],"source_content_type":"text/x-python","patch_set":20,"id":"dac4157f_99c04e2c","line":156,"in_reply_to":"dac4157f_0ff775d4","updated":"2015-04-21 13:19:19.000000000","message":"_router_removed method does not do steps on  L176-178. Actually, it tries to do these steps but it ends up with nothing. Because: Lets go trough code step by step...\n(repository state: https://github.com/openstack/neutron-vpnaas/tree/b04dd7f0869c660ae9facf695a3a749df98028b0)\n\ndef _router_removed(self, router_id):\n        ri \u003d self.router_info.get(router_id)\n...\n        registry.notify(resources.ROUTER, events.BEFORE_DELETE, self, router\u003dri)\n        ri.delete(self) # !!! Deletes router namespace\n        del self.router_info[router_id]\n        registry.notify(resources.ROUTER, events.AFTER_DELETE, self, router\u003dri)\n\nThere is a method \"router_removed_actions\" in \"neutron_vpnaas/services/vpn/vpn_service.py\" which is subscribed on \"resources.ROUTER, events.AFTER_DELETE\" . \n\n\u003d\u003e\nhttps://github.com/openstack/neutron-vpnaas/blob/master/neutron_vpnaas/services/vpn/vpn_service.py#L74  \u003d\u003e\nhttps://github.com/openstack/neutron-vpnaas/blob/master/neutron_vpnaas/services/vpn/device_drivers/ipsec.py#L714 \u003d\u003e\nhttps://github.com/openstack/neutron-vpnaas/blob/master/neutron_vpnaas/services/vpn/device_drivers/ipsec.py#L702 \u003d\u003e\nhttps://github.com/openstack/neutron-vpnaas/blob/master/neutron_vpnaas/services/vpn/device_drivers/ipsec.py#L264 \u003d\u003e\nhttps://github.com/openstack/neutron-vpnaas/blob/master/neutron_vpnaas/services/vpn/device_drivers/ipsec.py#L220 \u003d\u003e\nhttps://github.com/openstack/neutron-vpnaas/blob/master/neutron_vpnaas/services/vpn/device_drivers/ipsec.py#L354\n\nThe last line #354 calls: \nCommand: [\u0027sudo\u0027, \u0027-n\u0027, \u0027ip\u0027, \u0027netns\u0027, \u0027exec\u0027, \u0027qrouter-34aaaeb0-c26e-465c-9367-5a8080ff6351\u0027, \u0027ipsec\u0027, \u0027whack\u0027, \u0027--ctlbase\u0027, \u0027/tmp/tmpUIFbTz/tmpSJ5A24/ipsec/34aaaeb0-c26e-465c-9367-5a8080ff6351/var/run/pluto\u0027, \u0027--status\u0027]\n\nBut the router namespace has already been removed and the command fails with message in Stderr:\n\"Cannot open network namespace \"qrouter-34aaaeb0-c26e-465c-9367-5a8080ff6351\": No such file or directory\"\n\nAs a result \"process.active\" property is False and line listed below is not executed:\nhttps://github.com/openstack/neutron-vpnaas/blob/master/neutron_vpnaas/services/vpn/device_drivers/ipsec.py#L265\n\nI would suggest to subscribe \"router_removed_actions\" method on \"events.BEFORE_DELETE\". Does it make sense?","commit_id":"31ff75c1b2983045b0dff9284e172fd7c26d96ed"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"6da478a94c335bd1d92c05f89e9430ae9dab86d7","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        super(RouterFixture, self).setUp()"},{"line_number":154,"context_line":"        self.l3_agent._process_added_router(self.router_info)"},{"line_number":155,"context_line":"        self.router \u003d self.l3_agent.router_info[self.router_id]"},{"line_number":156,"context_line":"        self.addCleanup(self._delete_router)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def _generate_info(self, public_ip, private_cidr):"},{"line_number":159,"context_line":"        info \u003d copy.deepcopy(FAKE_ROUTER)"}],"source_content_type":"text/x-python","patch_set":20,"id":"dac4157f_ae273811","line":156,"in_reply_to":"dac4157f_99c04e2c","updated":"2015-04-21 17:12:10.000000000","message":"There are two steps needed. First, before the router is deleted, we must remove the VPN connection. In a production system, you cannot remove a router, if there is a service on it.\n\nOne way to do that is via calling driver.sync() without the service, so that it is deleted, or call the lower level device._delete_vpn_processes(). \n\nSecond, the router can then be deleted, for example, via l3_agent._router_rmoved().\n\nNow, what you have in L174-180 effectively does the same thing, however the _delete_router() name is confusing, as this is more than deleting the router, and it is not using the methods of the driver to remove the service, but is instead directly accessing the innards of the driver.\n\nI\u0027d suggest two methods for cleanup, one to delete the connection/service and one to delete the router.","commit_id":"31ff75c1b2983045b0dff9284e172fd7c26d96ed"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"6ada2375bb18112b1040137484f3d27b65fffce7","unresolved":false,"context_lines":[{"line_number":153,"context_line":"        super(RouterFixture, self).setUp()"},{"line_number":154,"context_line":"        self.l3_agent._process_added_router(self.router_info)"},{"line_number":155,"context_line":"        self.router \u003d self.l3_agent.router_info[self.router_id]"},{"line_number":156,"context_line":"        self.addCleanup(self._delete_router)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    def _generate_info(self, public_ip, private_cidr):"},{"line_number":159,"context_line":"        info \u003d copy.deepcopy(FAKE_ROUTER)"}],"source_content_type":"text/x-python","patch_set":20,"id":"dac4157f_6a644c48","line":156,"in_reply_to":"dac4157f_ae273811","updated":"2015-04-22 11:25:54.000000000","message":"It makes sense. I will add \"cleaning up vpn services\" to test method itself.","commit_id":"31ff75c1b2983045b0dff9284e172fd7c26d96ed"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"3d33a6e0045151e70ce3e7a906363ea5ad5dc6f2","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        info[\u0027gw_port\u0027][\u0027fixed_ips\u0027][0][\u0027ip_address\u0027] \u003d str(public_ip)"},{"line_number":171,"context_line":"        info[\u0027gw_port\u0027][\u0027mac_address\u0027] \u003d common_utils.get_random_mac(MAC_BASE)"},{"line_number":172,"context_line":"        return info"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def _delete_router(self):"},{"line_number":175,"context_line":"        # Destroy vpn processes"},{"line_number":176,"context_line":"        device \u003d self.l3_agent.device_drivers[0]"}],"source_content_type":"text/x-python","patch_set":21,"id":"dac4157f_ceb94c7b","line":173,"updated":"2015-04-21 17:20:17.000000000","message":"See PS 20, this should be broken up into two, as it does two different things. It also should use the driver methods and not directly access the structures in the driver.","commit_id":"96b7906ebe729dde87ed8667e38f78a81a6c3895"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"6a01e217ab32498355de56df8b82e09c92945c92","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        info[\u0027gw_port\u0027][\u0027fixed_ips\u0027][0][\u0027ip_address\u0027] \u003d str(public_ip)"},{"line_number":171,"context_line":"        info[\u0027gw_port\u0027][\u0027mac_address\u0027] \u003d common_utils.get_random_mac(MAC_BASE)"},{"line_number":172,"context_line":"        return info"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def _delete_router(self):"},{"line_number":175,"context_line":"        # Destroy vpn processes"},{"line_number":176,"context_line":"        device \u003d self.l3_agent.device_drivers[0]"}],"source_content_type":"text/x-python","patch_set":21,"id":"dac4157f_0a56f05b","line":173,"in_reply_to":"dac4157f_ceb94c7b","updated":"2015-04-22 13:50:21.000000000","message":"Done","commit_id":"96b7906ebe729dde87ed8667e38f78a81a6c3895"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"3d33a6e0045151e70ce3e7a906363ea5ad5dc6f2","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        config.set_override(\u0027ovs_integration_bridge\u0027, self.br_int.br_name)"},{"line_number":214,"context_line":"        config.set_override(\u0027external_network_bridge\u0027, self.br_ex.br_name)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        config([\u0027--config-file\u0027, self.vpn_agent_ini])"},{"line_number":217,"context_line":"        self.vpn_agent \u003d vpn_agent.VPNAgent(\u0027agent1\u0027, config)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        # Assign ip address to br-ex port because it is a gateway"}],"source_content_type":"text/x-python","patch_set":21,"id":"dac4157f_711ea564","line":216,"updated":"2015-04-21 17:20:17.000000000","message":"I haven\u0027t tried this, but if it works, then, it would be one way to handle the device driver. My concern here, is how to reuse this test for other  (vendor) implementations. Any suggestions on how to handle that?","commit_id":"96b7906ebe729dde87ed8667e38f78a81a6c3895"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"6a01e217ab32498355de56df8b82e09c92945c92","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        config.set_override(\u0027ovs_integration_bridge\u0027, self.br_int.br_name)"},{"line_number":214,"context_line":"        config.set_override(\u0027external_network_bridge\u0027, self.br_ex.br_name)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        config([\u0027--config-file\u0027, self.vpn_agent_ini])"},{"line_number":217,"context_line":"        self.vpn_agent \u003d vpn_agent.VPNAgent(\u0027agent1\u0027, config)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        # Assign ip address to br-ex port because it is a gateway"}],"source_content_type":"text/x-python","patch_set":21,"id":"dac4157f_cc948f44","line":216,"in_reply_to":"dac4157f_711ea564","updated":"2015-04-22 13:50:21.000000000","message":"If you are asking how to run the test in a single job multiple times? And in each run it should use different parameters.\n\nWe may try to use https://pypi.python.org/pypi/testscenarios/ There was some activity around testscenarios. For example there is a \"base class\" https://github.com/openstack/tempest/blob/0a95854a8d78a7a84031824c75c4531874504cf3/tempest/scenario/utils.py#L75","commit_id":"96b7906ebe729dde87ed8667e38f78a81a6c3895"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"0e3ab6ec060742de2799170b6809d1774160c2bc","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        config.set_override(\u0027ovs_integration_bridge\u0027, self.br_int.br_name)"},{"line_number":214,"context_line":"        config.set_override(\u0027external_network_bridge\u0027, self.br_ex.br_name)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        config([\u0027--config-file\u0027, self.vpn_agent_ini])"},{"line_number":217,"context_line":"        self.vpn_agent \u003d vpn_agent.VPNAgent(\u0027agent1\u0027, config)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        # Assign ip address to br-ex port because it is a gateway"}],"source_content_type":"text/x-python","patch_set":21,"id":"dac4157f_d56acf80","line":216,"in_reply_to":"dac4157f_cc948f44","updated":"2015-04-23 13:10:54.000000000","message":"no, not asking about running multiple times in one job. I\u0027m wondering about different jobs running this test scenario, especially vendor based jobs (e.g. having a vendor CI running this test).  Do you think the vpn_agent.ini is the best way to allow this test module to be reused by CI jobs?","commit_id":"96b7906ebe729dde87ed8667e38f78a81a6c3895"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"2fe2b4ae829e0b4f2aa2d91eae8aefb1115c118a","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        config.set_override(\u0027ovs_integration_bridge\u0027, self.br_int.br_name)"},{"line_number":214,"context_line":"        config.set_override(\u0027external_network_bridge\u0027, self.br_ex.br_name)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        config([\u0027--config-file\u0027, self.vpn_agent_ini])"},{"line_number":217,"context_line":"        self.vpn_agent \u003d vpn_agent.VPNAgent(\u0027agent1\u0027, config)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"        # Assign ip address to br-ex port because it is a gateway"}],"source_content_type":"text/x-python","patch_set":21,"id":"7ad32947_429c3f69","line":216,"in_reply_to":"dac4157f_d56acf80","updated":"2015-04-27 19:05:08.000000000","message":"In my opinion such kind of tests run on an integration level and it slightly affects a system level (openswan/strongswan is a part of a system). vpn_agent.ini might not be the best way but it is a known way (protocol) to pass knowledge about \"system configuration\"/environment to a any script (test in our case). We tried to use environment variables instead of vpn_agent.ini but it is really wrong idea.","commit_id":"96b7906ebe729dde87ed8667e38f78a81a6c3895"},{"author":{"_account_id":14926,"name":"Jeff Feng","email":"jianhua@us.ibm.com","username":"jhfeng"},"change_message_id":"536b1724373691a11388fbb7a983d9889d0611e8","unresolved":false,"context_lines":[{"line_number":37,"context_line":"_uuid \u003d uuidutils.generate_uuid"},{"line_number":38,"context_line":"FAKE_IKE_POLICY \u003d {"},{"line_number":39,"context_line":"    \u0027auth_algorithm\u0027: \u0027sha1\u0027,"},{"line_number":40,"context_line":"    \"ike_version\": \"v1\","},{"line_number":41,"context_line":"    \u0027encryption_algorithm\u0027: \u0027aes-128\u0027,"},{"line_number":42,"context_line":"    \u0027pfs\u0027: \u0027group5\u0027,"},{"line_number":43,"context_line":"    \u0027phase1_negotiation_mode\u0027: \u0027main\u0027,"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa32b979_ea521068","line":40,"updated":"2015-06-26 16:44:03.000000000","message":"is there plan to add another case for IKE v2 ?","commit_id":"153e5a09cef07c2fc1d1fc3f84bdfb289f37c6a4"},{"author":{"_account_id":14926,"name":"Jeff Feng","email":"jianhua@us.ibm.com","username":"jhfeng"},"change_message_id":"ac463c5efc368b2d3101cb459eb857be1472cb5b","unresolved":false,"context_lines":[{"line_number":37,"context_line":"_uuid \u003d uuidutils.generate_uuid"},{"line_number":38,"context_line":"FAKE_IKE_POLICY \u003d {"},{"line_number":39,"context_line":"    \u0027auth_algorithm\u0027: \u0027sha1\u0027,"},{"line_number":40,"context_line":"    \"ike_version\": \"v1\","},{"line_number":41,"context_line":"    \u0027encryption_algorithm\u0027: \u0027aes-128\u0027,"},{"line_number":42,"context_line":"    \u0027pfs\u0027: \u0027group5\u0027,"},{"line_number":43,"context_line":"    \u0027phase1_negotiation_mode\u0027: \u0027main\u0027,"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa32b979_c1c35989","line":40,"in_reply_to":"fa32b979_81248260","updated":"2015-06-27 14:54:32.000000000","message":"Paul,  agreed that we only need test openstack level\u0027s settings. \nBut I think IKEv2 is better choice for this basic test case, because it\u0027s the current standard and more actively maintained. We want to make sure configuration of openstack vpnaas correctly maps to latest config file of *swan.","commit_id":"153e5a09cef07c2fc1d1fc3f84bdfb289f37c6a4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"d324ebac3a5f0ca6578b21936589620e10063dc1","unresolved":false,"context_lines":[{"line_number":37,"context_line":"_uuid \u003d uuidutils.generate_uuid"},{"line_number":38,"context_line":"FAKE_IKE_POLICY \u003d {"},{"line_number":39,"context_line":"    \u0027auth_algorithm\u0027: \u0027sha1\u0027,"},{"line_number":40,"context_line":"    \"ike_version\": \"v1\","},{"line_number":41,"context_line":"    \u0027encryption_algorithm\u0027: \u0027aes-128\u0027,"},{"line_number":42,"context_line":"    \u0027pfs\u0027: \u0027group5\u0027,"},{"line_number":43,"context_line":"    \u0027phase1_negotiation_mode\u0027: \u0027main\u0027,"}],"source_content_type":"text/x-python","patch_set":28,"id":"fa32b979_81248260","line":40,"in_reply_to":"fa32b979_ea521068","updated":"2015-06-26 20:08:03.000000000","message":"There could be - want to write one? :)\n\nSeriously, though, the intent of this test is to make sure that all the pieces work together and that we actually DO get a working VPN connection (versus UTs that just check that some config files are set up and some methods are called).\n\nThere are several variations that we probably want to test (once this base scenario test works). For example:\n\n    - Checking with IPv6 addresses\n    - Checking connection when doing admin down/up on service and ipsec conn\n    - Trying with multiple peer subnets (and later, once commit supported, multiple local subnets)\n\nTo me, I\u0027m not so concerned about testing the different settings for the connection (like encryption, IKE version, PFS, etc), as I suspect the *Swan packages have been tested well, outside of openstack. I\u0027m more concerned about the above items, which are testing how OpenStack and *Swan interop.","commit_id":"153e5a09cef07c2fc1d1fc3f84bdfb289f37c6a4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b8a408f53110d084e1fc958bc64e27b999580eea","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        #   a pools.Pool. If you do know what you\u0027re doing and want to disable"},{"line_number":287,"context_line":"        #   this error, call eventlet.debug.hub_prevent_multiple_readers(False)"},{"line_number":288,"context_line":"        # Can reproduce the exception in the test only"},{"line_number":289,"context_line":"        ip_lib.send_ip_addr_adv_notif \u003d mock.Mock()"},{"line_number":290,"context_line":"        # There are no vpn services yet. get_vpn_services_on_host returns"},{"line_number":291,"context_line":"        # empty list"},{"line_number":292,"context_line":"        device.agent_rpc.get_vpn_services_on_host \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":28,"id":"fa32b979_85f1fd6c","line":289,"updated":"2015-06-26 14:25:59.000000000","message":"Why does mocking this method resolve the issue? I\u0027d like to make sure we clearly understand the root cause of the problem and why this fixes it.","commit_id":"153e5a09cef07c2fc1d1fc3f84bdfb289f37c6a4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"7e0f0a59672567f7077edb2560a98333e2fbb82f","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        #   a pools.Pool. If you do know what you\u0027re doing and want to disable"},{"line_number":287,"context_line":"        #   this error, call eventlet.debug.hub_prevent_multiple_readers(False)"},{"line_number":288,"context_line":"        # Can reproduce the exception in the test only"},{"line_number":289,"context_line":"        ip_lib.send_ip_addr_adv_notif \u003d mock.Mock()"},{"line_number":290,"context_line":"        # There are no vpn services yet. get_vpn_services_on_host returns"},{"line_number":291,"context_line":"        # empty list"},{"line_number":292,"context_line":"        device.agent_rpc.get_vpn_services_on_host \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":28,"id":"ba3cc151_f625c808","line":289,"in_reply_to":"ba3cc151_037ac924","updated":"2015-07-01 11:44:05.000000000","message":"I see the issue in my development environment. The scenario is to set VENV to dsvm-functional, run the configure_for_vpn_func_testing.sh and then run the test.\n\nWhat I see in testing is that the find occurs first, as part of get_devices() and then gratuitous arp is done.","commit_id":"153e5a09cef07c2fc1d1fc3f84bdfb289f37c6a4"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"197a3d8f05089bfb80c4cb1db980d874eefc96c7","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        #   a pools.Pool. If you do know what you\u0027re doing and want to disable"},{"line_number":287,"context_line":"        #   this error, call eventlet.debug.hub_prevent_multiple_readers(False)"},{"line_number":288,"context_line":"        # Can reproduce the exception in the test only"},{"line_number":289,"context_line":"        ip_lib.send_ip_addr_adv_notif \u003d mock.Mock()"},{"line_number":290,"context_line":"        # There are no vpn services yet. get_vpn_services_on_host returns"},{"line_number":291,"context_line":"        # empty list"},{"line_number":292,"context_line":"        device.agent_rpc.get_vpn_services_on_host \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":28,"id":"ba3cc151_1af9914d","line":289,"in_reply_to":"ba3cc151_037ac924","updated":"2015-06-30 20:36:23.000000000","message":"The \"arping\" (agent_rpc.get_vpn_services_on_host wraps arping)  is mocked in neutron functional tests https://github.com/openstack/neutron/blob/master/neutron/tests/functional/agent/test_l3_agent.py#L71 \nI have created a pacthset https://review.openstack.org/#/c/196608/ wich stops mocking arping. Will see if neutron team wants to stop mocking it.","commit_id":"153e5a09cef07c2fc1d1fc3f84bdfb289f37c6a4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"7e0f0a59672567f7077edb2560a98333e2fbb82f","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        #   a pools.Pool. If you do know what you\u0027re doing and want to disable"},{"line_number":287,"context_line":"        #   this error, call eventlet.debug.hub_prevent_multiple_readers(False)"},{"line_number":288,"context_line":"        # Can reproduce the exception in the test only"},{"line_number":289,"context_line":"        ip_lib.send_ip_addr_adv_notif \u003d mock.Mock()"},{"line_number":290,"context_line":"        # There are no vpn services yet. get_vpn_services_on_host returns"},{"line_number":291,"context_line":"        # empty list"},{"line_number":292,"context_line":"        device.agent_rpc.get_vpn_services_on_host \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":28,"id":"ba3cc151_f68868c7","line":289,"in_reply_to":"ba3cc151_1af9914d","updated":"2015-07-01 11:44:05.000000000","message":"I can see why it is mocked out, as the tests are checking methods at a higher level than the _arping() call.\n\nI guess the question I have is...are we masking some potential race condition by mocking this method out in functional tests? If it doesn\u0027t matter, then we should mock it here too. If it is of concern, we should see if there really is an issue with multiple simultaneous calls.\n\nWould like to hear from other cores on this.","commit_id":"153e5a09cef07c2fc1d1fc3f84bdfb289f37c6a4"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"e10cf2bfe3678ff0b78b2f69823f99859ca4eefd","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        #   a pools.Pool. If you do know what you\u0027re doing and want to disable"},{"line_number":287,"context_line":"        #   this error, call eventlet.debug.hub_prevent_multiple_readers(False)"},{"line_number":288,"context_line":"        # Can reproduce the exception in the test only"},{"line_number":289,"context_line":"        ip_lib.send_ip_addr_adv_notif \u003d mock.Mock()"},{"line_number":290,"context_line":"        # There are no vpn services yet. get_vpn_services_on_host returns"},{"line_number":291,"context_line":"        # empty list"},{"line_number":292,"context_line":"        device.agent_rpc.get_vpn_services_on_host \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":28,"id":"ba3cc151_cfd32dd4","line":289,"in_reply_to":"ba3cc151_f625c808","updated":"2015-07-01 21:12:45.000000000","message":"Yes, \"find\" occurs fist but \"eventlet.spawn_n(arping)\" method called before \"find\". It is ok because eventlet spawns new thread if the current one performs IO operation (wait for result). If we add eventlet.sleep(0) right after \"eventlet.spawn_n(arping)\" the arping will be first.\n\nIf arping is not called using eventlet.spawn_n but as a ordinary method everything works fine.\n\nAnd, finally, arping returns non zero status. What is the purpose of calling arping here?","commit_id":"153e5a09cef07c2fc1d1fc3f84bdfb289f37c6a4"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"340175e203f877cefe5b63e5c9eb6fd6a13c9663","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        #   a pools.Pool. If you do know what you\u0027re doing and want to disable"},{"line_number":287,"context_line":"        #   this error, call eventlet.debug.hub_prevent_multiple_readers(False)"},{"line_number":288,"context_line":"        # Can reproduce the exception in the test only"},{"line_number":289,"context_line":"        ip_lib.send_ip_addr_adv_notif \u003d mock.Mock()"},{"line_number":290,"context_line":"        # There are no vpn services yet. get_vpn_services_on_host returns"},{"line_number":291,"context_line":"        # empty list"},{"line_number":292,"context_line":"        device.agent_rpc.get_vpn_services_on_host \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":28,"id":"ba3cc151_037ac924","line":289,"in_reply_to":"fa32b979_014dd2c3","updated":"2015-06-29 19:39:36.000000000","message":"Yes it is a workaround. I can not reproduce the issue in devstack environment. I think cause of the issue somewhere in test environment. \n\nYes the neutron code asks rootwrap service twice. \nfirst time it calls send_ip_addr_adv_notif here: https://github.com/openstack/neutron/blob/master/neutron/agent/l3/router_info.py#L296 . Wich in turn calls \"arping\" method using \"eventlet.spawn_n\". arping takes several seconds. \nI bit later it calls https://github.com/openstack/neutron/blob/master/neutron/agent/l3/router_info.py#L402\n(... find /sys/class/net -maxdepth 1 -type l -printf %f ). Exception occurs here.","commit_id":"153e5a09cef07c2fc1d1fc3f84bdfb289f37c6a4"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"d324ebac3a5f0ca6578b21936589620e10063dc1","unresolved":false,"context_lines":[{"line_number":286,"context_line":"        #   a pools.Pool. If you do know what you\u0027re doing and want to disable"},{"line_number":287,"context_line":"        #   this error, call eventlet.debug.hub_prevent_multiple_readers(False)"},{"line_number":288,"context_line":"        # Can reproduce the exception in the test only"},{"line_number":289,"context_line":"        ip_lib.send_ip_addr_adv_notif \u003d mock.Mock()"},{"line_number":290,"context_line":"        # There are no vpn services yet. get_vpn_services_on_host returns"},{"line_number":291,"context_line":"        # empty list"},{"line_number":292,"context_line":"        device.agent_rpc.get_vpn_services_on_host \u003d mock.Mock("}],"source_content_type":"text/x-python","patch_set":28,"id":"fa32b979_014dd2c3","line":289,"in_reply_to":"fa32b979_85f1fd6c","updated":"2015-06-26 20:08:03.000000000","message":"This is not the right solution. It is solving the problem by mocking it out so it doesn\u0027t occur.  The issue appears to be that there are two rootwrap commands running at once, using the same socket (instead of unique sockets). Need to figure out why, and try to resolve the problem, rather than mask it,","commit_id":"153e5a09cef07c2fc1d1fc3f84bdfb289f37c6a4"}],"neutron_vpnaas/tests/functional/openswan/test_scenario.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8d60b675baf90e273f0f4bed16b3a476e9fec4fa","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_f908492f","line":1,"updated":"2015-04-08 20:18:50.000000000","message":"Is there a reason why this test would NOT be applicable to both OpenSwan and StrongSwan (and hence live in common area)? We want to test with both.","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"97a1a0d149d6fb8ad58c0a01780800b8aba7c0ed","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":2,"context_line":"#    not use this file except in compliance with the License. You may obtain"},{"line_number":3,"context_line":"#    a copy of the License at"},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_e9406936","line":1,"in_reply_to":"9aa53dc9_f908492f","updated":"2015-04-09 07:29:01.000000000","message":"I have placed the test into functional/openswan to avoid running it in strongswan job because the test does not work with strongswan. \nThe test creates an instance of a particular device driver. What device driver it should instantiate if it is in \"common\" folder? My guess that there should be a way to inject device driver name during a job execution (openswan, strongswan), I have created a class variable at line #87 and maybe we may change it in a openswan/strong job. For example the value maybe be taken from environment variable. What is your opinion?","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8d60b675baf90e273f0f4bed16b3a476e9fec4fa","unresolved":false,"context_lines":[{"line_number":15,"context_line":"import mock"},{"line_number":16,"context_line":"import netaddr"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from neutron.agent import l3_agent as l3_agent_main"},{"line_number":19,"context_line":"from neutron.agent.common import config as agent_config"},{"line_number":20,"context_line":"from neutron.agent.common import ovs_lib"},{"line_number":21,"context_line":"from neutron.agent.linux import ip_lib"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_3a169f55","line":18,"updated":"2015-04-08 20:18:50.000000000","message":"Move to L21, agent.l3_agent \u003e agent.common","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8d60b675baf90e273f0f4bed16b3a476e9fec4fa","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from neutron_vpnaas.services.vpn import agent as vpn_agent"},{"line_number":30,"context_line":"from neutron_vpnaas.services.vpn.agent import vpn_agent_opts"},{"line_number":31,"context_line":"from neutron_vpnaas.services.vpn.device_drivers import ipsec"},{"line_number":32,"context_line":"from oslo.config import cfg"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"_uuid \u003d uuidutils.generate_uuid"},{"line_number":35,"context_line":"FAKE_IKE_POLICY \u003d {"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_ba2bcf93","line":32,"updated":"2015-04-08 20:18:50.000000000","message":"This should be oslo_config package.","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8d60b675baf90e273f0f4bed16b3a476e9fec4fa","unresolved":false,"context_lines":[{"line_number":84,"context_line":""},{"line_number":85,"context_line":"class TestIPSecScenario(test_l3_agent.L3AgentTestFramework):"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    vpn_device_driver \u003d \\"},{"line_number":88,"context_line":"        \u0027neutron_vpnaas.services.vpn.device_drivers.ipsec.OpenSwanDriver\u0027"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_f43610e6","line":87,"updated":"2015-04-08 20:18:50.000000000","message":"Use parens vs backslash to extend line. See all cases.","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8d60b675baf90e273f0f4bed16b3a476e9fec4fa","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                            \u0027vpnagent\u0027)"},{"line_number":107,"context_line":"        self.vpn_agent \u003d vpn_agent.VPNAgent(\u0027agent1\u0027, config)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        self.build_timeout \u003d 60"},{"line_number":110,"context_line":"        self.build_interval \u003d 1"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def prepare_vpn_service_info(self, router_id, router_public_ip,"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_94646422","line":109,"updated":"2015-04-08 20:18:50.000000000","message":"These two used?","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"97a1a0d149d6fb8ad58c0a01780800b8aba7c0ed","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                            \u0027vpnagent\u0027)"},{"line_number":107,"context_line":"        self.vpn_agent \u003d vpn_agent.VPNAgent(\u0027agent1\u0027, config)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        self.build_timeout \u003d 60"},{"line_number":110,"context_line":"        self.build_interval \u003d 1"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def prepare_vpn_service_info(self, router_id, router_public_ip,"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_2971b1a8","line":109,"in_reply_to":"9aa53dc9_94646422","updated":"2015-04-09 07:29:01.000000000","message":"No they are not used. Should be removed","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8d60b675baf90e273f0f4bed16b3a476e9fec4fa","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            utils.get_random_mac(mac_base)"},{"line_number":150,"context_line":"        return router_info"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def site_setup(self, router_public_ip, private_net_cidr):"},{"line_number":153,"context_line":"        router_info \u003d self.prepare_router_info("},{"line_number":154,"context_line":"            router_public_ip, private_net_cidr)"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_dac5733c","line":152,"updated":"2015-04-08 20:18:50.000000000","message":"Can we leverage off of the  Neutron Fixture/Fake classes for any of the setup?","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"97a1a0d149d6fb8ad58c0a01780800b8aba7c0ed","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            utils.get_random_mac(mac_base)"},{"line_number":150,"context_line":"        return router_info"},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"    def site_setup(self, router_public_ip, private_net_cidr):"},{"line_number":153,"context_line":"        router_info \u003d self.prepare_router_info("},{"line_number":154,"context_line":"            router_public_ip, private_net_cidr)"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_096b8db8","line":152,"in_reply_to":"9aa53dc9_dac5733c","updated":"2015-04-09 07:29:01.000000000","message":"I will look into it.","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8d60b675baf90e273f0f4bed16b3a476e9fec4fa","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        net_helpers.set_namespace_gateway("},{"line_number":164,"context_line":"            port, router_ip_cidr.partition(\u0027/\u0027)[0])"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"        vpn_service \u003d self.prepare_vpn_service_info("},{"line_number":167,"context_line":"            router.router_id, router_public_ip, private_net_cidr,"},{"line_number":168,"context_line":"            router_info[\u0027_interfaces\u0027][0][\u0027subnets\u0027][0][\u0027id\u0027])"},{"line_number":169,"context_line":"        return {\"router\": router, \"port\": port,"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_0e43a043","line":166,"updated":"2015-04-08 20:18:50.000000000","message":"This method is doing two things...setting up a router and defining vpn_service info. Should break into separate methods.","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8d60b675baf90e273f0f4bed16b3a476e9fec4fa","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            cmd \u003d [\u0027ip\u0027, \u0027netns\u0027, \u0027exec\u0027,"},{"line_number":180,"context_line":"                   namespace,"},{"line_number":181,"context_line":"                   \u0027ping\u0027, \u0027-c\u0027, \u00274\u0027, \u0027-q\u0027, ip]"},{"line_number":182,"context_line":"            linux_utils.execute(cmd, run_as_root\u003dTrue)"},{"line_number":183,"context_line":"            return True"},{"line_number":184,"context_line":"        except RuntimeError:"},{"line_number":185,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_ce9498e3","line":182,"updated":"2015-04-08 20:18:50.000000000","message":"Does this have a timeout? What\u0027s the timeout duration?","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"97a1a0d149d6fb8ad58c0a01780800b8aba7c0ed","unresolved":false,"context_lines":[{"line_number":179,"context_line":"            cmd \u003d [\u0027ip\u0027, \u0027netns\u0027, \u0027exec\u0027,"},{"line_number":180,"context_line":"                   namespace,"},{"line_number":181,"context_line":"                   \u0027ping\u0027, \u0027-c\u0027, \u00274\u0027, \u0027-q\u0027, ip]"},{"line_number":182,"context_line":"            linux_utils.execute(cmd, run_as_root\u003dTrue)"},{"line_number":183,"context_line":"            return True"},{"line_number":184,"context_line":"        except RuntimeError:"},{"line_number":185,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_a91b81c9","line":182,"in_reply_to":"9aa53dc9_ce9498e3","updated":"2015-04-09 07:29:01.000000000","message":"It is a ping cli command. \"-c\" specifies that it should stop after sending 4 packets. Default interval between packets is one second. It means the \"timeout\" is 4 seconds","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8d60b675baf90e273f0f4bed16b3a476e9fec4fa","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        except RuntimeError:"},{"line_number":185,"context_line":"            return False"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def test_ipsec_site_connections(self):"},{"line_number":188,"context_line":"        public_net \u003d netaddr.IPNetwork(\u002719.4.4.0/24\u0027)"},{"line_number":189,"context_line":"        ext_port \u003d ip_lib.IPDevice(self.agent.conf.external_network_bridge)"},{"line_number":190,"context_line":"        ext_port.addr.add(str(public_net[1]))"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_4e83e804","line":187,"updated":"2015-04-08 20:18:50.000000000","message":"In general, there\u0027s lots of setup... should consider breaking into more methods.","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8d60b675baf90e273f0f4bed16b3a476e9fec4fa","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        site2[\u0027vpn_service\u0027][\u0027ipsec_site_connections\u0027] \u003d [site_conn2]"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        device \u003d self.vpn_agent.devices[0]"},{"line_number":204,"context_line":"        device.routers \u003d self.agent.router_info"},{"line_number":205,"context_line":"        device.report_status \u003d mock.Mock()"},{"line_number":206,"context_line":"        device.agent_rpc.get_vpn_services_on_host \u003d \\"},{"line_number":207,"context_line":"            mock.Mock(return_value\u003d[site1[\u0027vpn_service\u0027],"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_ce6db899","line":204,"updated":"2015-04-08 20:18:50.000000000","message":"Rather than directly manipulating the router, I think we could just create a device driver and access its create_router() method. I don\u0027t think we need to create an agent at all (L107).","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"97a1a0d149d6fb8ad58c0a01780800b8aba7c0ed","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        site2[\u0027vpn_service\u0027][\u0027ipsec_site_connections\u0027] \u003d [site_conn2]"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"        device \u003d self.vpn_agent.devices[0]"},{"line_number":204,"context_line":"        device.routers \u003d self.agent.router_info"},{"line_number":205,"context_line":"        device.report_status \u003d mock.Mock()"},{"line_number":206,"context_line":"        device.agent_rpc.get_vpn_services_on_host \u003d \\"},{"line_number":207,"context_line":"            mock.Mock(return_value\u003d[site1[\u0027vpn_service\u0027],"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_49e635b1","line":204,"in_reply_to":"9aa53dc9_ce6db899","updated":"2015-04-09 07:29:01.000000000","message":"It makes sense.","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8d60b675baf90e273f0f4bed16b3a476e9fec4fa","unresolved":false,"context_lines":[{"line_number":210,"context_line":"                    [{\u0027id\u0027: site1[\u0027router\u0027].router_id},"},{"line_number":211,"context_line":"                     {\u0027id\u0027: site2[\u0027router\u0027].router_id}])"},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"        for process_id in device.processes.keys():"},{"line_number":214,"context_line":"            self.addCleanup(device.destroy_process, process_id)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        self.assertTrue(self._ping(site1[\u0027port\u0027].namespace, site2[\u0027port_ip\u0027]))"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_cec9387a","line":213,"updated":"2015-04-08 20:18:50.000000000","message":"Can do addCleanup() for destroy_router() in device driver.","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"8d60b675baf90e273f0f4bed16b3a476e9fec4fa","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        for process_id in device.processes.keys():"},{"line_number":214,"context_line":"            self.addCleanup(device.destroy_process, process_id)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        self.assertTrue(self._ping(site1[\u0027port\u0027].namespace, site2[\u0027port_ip\u0027]))"},{"line_number":217,"context_line":"        self.assertTrue(self._ping(site2[\u0027port\u0027].namespace, site1[\u0027port_ip\u0027]))"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_0e8ba0c4","line":216,"updated":"2015-04-08 20:18:50.000000000","message":"The test should verify that ping fails, before connection is created, and then checks that it succeeds after.\n\n\nAre the siteN[\u0027port_ip\u0027] the private or public interface. It is really hard to tell by tracing back through the creation logic. Couldn\u0027t we use \u002735.4.1.4\u0027 directly? A it stand\u0027s I can\u0027t tell.","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"97a1a0d149d6fb8ad58c0a01780800b8aba7c0ed","unresolved":false,"context_lines":[{"line_number":213,"context_line":"        for process_id in device.processes.keys():"},{"line_number":214,"context_line":"            self.addCleanup(device.destroy_process, process_id)"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"        self.assertTrue(self._ping(site1[\u0027port\u0027].namespace, site2[\u0027port_ip\u0027]))"},{"line_number":217,"context_line":"        self.assertTrue(self._ping(site2[\u0027port\u0027].namespace, site1[\u0027port_ip\u0027]))"}],"source_content_type":"text/x-python","patch_set":14,"id":"9aa53dc9_499d1509","line":216,"in_reply_to":"9aa53dc9_0e8ba0c4","updated":"2015-04-09 07:29:01.000000000","message":"I will add additional assert","commit_id":"e5e78b5fe8b4971298ce6983a3788c6b6f4cf282"},{"author":{"_account_id":10237,"name":"Numan Siddique","email":"nusiddiq@redhat.com","username":"numansiddique"},"change_message_id":"6f0a8f1f40e3e980ca0e9786418ddd8fe2f76e2e","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        router \u003d copy.deepcopy(FAKE_ROUTER)"},{"line_number":229,"context_line":"        router[\u0027id\u0027] \u003d _uuid()"},{"line_number":230,"context_line":"        router[\u0027_interfaces\u0027][0][\u0027id\u0027] \u003d _uuid()"},{"line_number":231,"context_line":"        router[\u0027_interfaces\u0027][0][\u0027mac_address\u0027] \u003d \\"},{"line_number":232,"context_line":"           common_utils.get_random_mac(MAC_BASE)"},{"line_number":233,"context_line":"        router[\u0027_interfaces\u0027][0][\u0027fixed_ips\u0027][0][\u0027ip_address\u0027] \u003d \\"},{"line_number":234,"context_line":"            str(private_cidr[1])"}],"source_content_type":"text/x-python","patch_set":16,"id":"7aaa499b_fa0850db","line":231,"updated":"2015-04-14 15:26:24.000000000","message":"Please use \u0027(\u0027 instead of \u0027\\\u0027.\nSame for line 233 and other places","commit_id":"c25798a49fb20a15420d28e39857ce965a771218"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"7feb39d0f02bca65fff2596efd9ada84e07dd4d3","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        router \u003d copy.deepcopy(FAKE_ROUTER)"},{"line_number":229,"context_line":"        router[\u0027id\u0027] \u003d _uuid()"},{"line_number":230,"context_line":"        router[\u0027_interfaces\u0027][0][\u0027id\u0027] \u003d _uuid()"},{"line_number":231,"context_line":"        router[\u0027_interfaces\u0027][0][\u0027mac_address\u0027] \u003d \\"},{"line_number":232,"context_line":"           common_utils.get_random_mac(MAC_BASE)"},{"line_number":233,"context_line":"        router[\u0027_interfaces\u0027][0][\u0027fixed_ips\u0027][0][\u0027ip_address\u0027] \u003d \\"},{"line_number":234,"context_line":"            str(private_cidr[1])"}],"source_content_type":"text/x-python","patch_set":16,"id":"7aaa499b_5afbc1c1","line":231,"in_reply_to":"7aaa499b_fa0850db","updated":"2015-04-14 16:20:01.000000000","message":"Yes. I need to fix it","commit_id":"c25798a49fb20a15420d28e39857ce965a771218"},{"author":{"_account_id":10237,"name":"Numan Siddique","email":"nusiddiq@redhat.com","username":"numansiddique"},"change_message_id":"6f0a8f1f40e3e980ca0e9786418ddd8fe2f76e2e","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            cmd \u003d [\u0027ip\u0027, \u0027netns\u0027, \u0027exec\u0027,"},{"line_number":277,"context_line":"                   namespace,"},{"line_number":278,"context_line":"                   \u0027ping\u0027, \u0027-c\u0027, \u00274\u0027, \u0027-q\u0027, ip]"},{"line_number":279,"context_line":"            linux_utils.execute(cmd, run_as_root\u003dTrue)"},{"line_number":280,"context_line":"            return True"},{"line_number":281,"context_line":"        except RuntimeError:"},{"line_number":282,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":16,"id":"7aaa499b_5ae624b5","line":279,"updated":"2015-04-14 15:26:24.000000000","message":"I think you can use ip_lib.IPWrapper to execute commands within the namespace.\nPlease ignore this if this has been discussed in the previous patches.","commit_id":"c25798a49fb20a15420d28e39857ce965a771218"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"7feb39d0f02bca65fff2596efd9ada84e07dd4d3","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            cmd \u003d [\u0027ip\u0027, \u0027netns\u0027, \u0027exec\u0027,"},{"line_number":277,"context_line":"                   namespace,"},{"line_number":278,"context_line":"                   \u0027ping\u0027, \u0027-c\u0027, \u00274\u0027, \u0027-q\u0027, ip]"},{"line_number":279,"context_line":"            linux_utils.execute(cmd, run_as_root\u003dTrue)"},{"line_number":280,"context_line":"            return True"},{"line_number":281,"context_line":"        except RuntimeError:"},{"line_number":282,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":16,"id":"7aaa499b_1aa1b9a3","line":279,"in_reply_to":"7aaa499b_5ae624b5","updated":"2015-04-14 16:20:01.000000000","message":"Unfortunately IPWrapper executes \"ip\" commands only. But there is a useful method \"add_namespace_to_cmd\" in ip_lib module. Thanks","commit_id":"c25798a49fb20a15420d28e39857ce965a771218"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"672b31115dc817457c9646df9dbb116039f1e053","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import copy"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import fixtures"},{"line_number":16,"context_line":"import mock"},{"line_number":17,"context_line":"import netaddr"},{"line_number":18,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":17,"id":"7aaa499b_919a2e6d","line":15,"updated":"2015-04-15 13:34:56.000000000","message":"Nit: So all the imports from L15-34 are third party packages, w.r.t. the neutron-vpnaas repo and should all be together, in alphabetical order. Only copy (L12) seems to be the system import and separate.","commit_id":"1f67ff71b2923888529a9ea65f2e3098f04e4881"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"672b31115dc817457c9646df9dbb116039f1e053","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        super(RouterFixture, self).setUp()"},{"line_number":153,"context_line":"        self.l3_agent._process_added_router(self.router_info)"},{"line_number":154,"context_line":"        self.router \u003d self.l3_agent.router_info[self.router_id]"},{"line_number":155,"context_line":"        self.addCleanup(self._delete_router)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def _delete_router(self):"},{"line_number":158,"context_line":"        # Destroy vpn processes"}],"source_content_type":"text/x-python","patch_set":17,"id":"7aaa499b_543ed48c","line":155,"updated":"2015-04-15 13:34:56.000000000","message":"I would think we would want to addCleanup for self.l3_agent._router_removed with router ID to do the mirror of _process_added_router(), which sends notifications to the device driver.\n\nThe _delete_router() below is duplicating production code. Instead, we should strive to exercise the actual production code.","commit_id":"1f67ff71b2923888529a9ea65f2e3098f04e4881"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"077bf7deb1db9620b8bc778c6c33dbd3f0033630","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        super(RouterFixture, self).setUp()"},{"line_number":153,"context_line":"        self.l3_agent._process_added_router(self.router_info)"},{"line_number":154,"context_line":"        self.router \u003d self.l3_agent.router_info[self.router_id]"},{"line_number":155,"context_line":"        self.addCleanup(self._delete_router)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def _delete_router(self):"},{"line_number":158,"context_line":"        # Destroy vpn processes"}],"source_content_type":"text/x-python","patch_set":17,"id":"5aa745d1_8417eca2","line":155,"in_reply_to":"7aaa499b_543ed48c","updated":"2015-04-20 14:21:49.000000000","message":"If I leave only _router_removed method (remove destroying processes) the vpn processes will not be destroyed. \n\nWe can test destroying vpn services in test method. Add two lines:\n\ndevice.agent_rpc.get_vpn_services_on_host \u003d mock.Mock(return_value\u003d[])\ndevice.sync(mock.Mock(),\n                    [{\u0027id\u0027: site1[\u0027router\u0027].router_id},\n                     {\u0027id\u0027: site2[\u0027router\u0027].router_id}])\n\nAnd then try to ping sites as usual.","commit_id":"1f67ff71b2923888529a9ea65f2e3098f04e4881"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"672b31115dc817457c9646df9dbb116039f1e053","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"class TestIPSecScenario(base.BaseSudoTestCase):"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    vpn_device_driver \u003d ([\u0027neutron_vpnaas.services.vpn.\u0027"},{"line_number":169,"context_line":"                         \u0027device_drivers.ipsec.OpenSwanDriver\u0027])"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7aaa499b_d4a2e498","line":168,"updated":"2015-04-15 13:34:56.000000000","message":"I guess there are two approaches that could be taken. One, is to place all the test code in a common (parent) directory, and then in the openswan and strongswan directory, have a subclass that specifies the driver to use.\n\nThe other would be to ensure that the functional job (gate_hook.sh) loads the appropriate driver for the test (as on Ubuntu, they both cannot be used at once), and have the test code in the common directory.\n\nNote: we are in the process of changing functional jobs to just setup devstack and not run it 168115.","commit_id":"1f67ff71b2923888529a9ea65f2e3098f04e4881"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"395fd90cba8331bf63a22bc2ea8aa669163ff841","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"class TestIPSecScenario(base.BaseSudoTestCase):"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    vpn_device_driver \u003d ([\u0027neutron_vpnaas.services.vpn.\u0027"},{"line_number":169,"context_line":"                         \u0027device_drivers.ipsec.OpenSwanDriver\u0027])"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7aaa499b_28440719","line":168,"in_reply_to":"7aaa499b_d4a2e498","updated":"2015-04-15 14:27:03.000000000","message":"I guess no matter which way we choose, we\u0027ll need to override, for vendors to specify their driver for this test.","commit_id":"1f67ff71b2923888529a9ea65f2e3098f04e4881"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"672b31115dc817457c9646df9dbb116039f1e053","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        vpn_service[\u0027ipsec_site_connections\u0027] \u003d [ipsec_conn]"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def router_setup(self, public_ip, private_cidr):"},{"line_number":228,"context_line":"        router \u003d copy.deepcopy(FAKE_ROUTER)"},{"line_number":229,"context_line":"        router[\u0027id\u0027] \u003d _uuid()"},{"line_number":230,"context_line":"        router[\u0027_interfaces\u0027][0][\u0027id\u0027] \u003d _uuid()"},{"line_number":231,"context_line":"        (router[\u0027_interfaces\u0027][0]"}],"source_content_type":"text/x-python","patch_set":17,"id":"7aaa499b_d771c677","line":228,"updated":"2015-04-15 13:34:56.000000000","message":"Wondering if this should be part of router fixture. Also, as a nit, the FAKE_ROUTER sets a bunch of fields that are then overridden here. Could eliminate the fields from FAKE_ROUTER, or maybe just create the dict as part of the RouterFixture constructor?","commit_id":"1f67ff71b2923888529a9ea65f2e3098f04e4881"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"077bf7deb1db9620b8bc778c6c33dbd3f0033630","unresolved":false,"context_lines":[{"line_number":225,"context_line":"        vpn_service[\u0027ipsec_site_connections\u0027] \u003d [ipsec_conn]"},{"line_number":226,"context_line":""},{"line_number":227,"context_line":"    def router_setup(self, public_ip, private_cidr):"},{"line_number":228,"context_line":"        router \u003d copy.deepcopy(FAKE_ROUTER)"},{"line_number":229,"context_line":"        router[\u0027id\u0027] \u003d _uuid()"},{"line_number":230,"context_line":"        router[\u0027_interfaces\u0027][0][\u0027id\u0027] \u003d _uuid()"},{"line_number":231,"context_line":"        (router[\u0027_interfaces\u0027][0]"}],"source_content_type":"text/x-python","patch_set":17,"id":"5aa745d1_356964bf","line":228,"in_reply_to":"7aaa499b_d771c677","updated":"2015-04-20 14:21:49.000000000","message":"Yes it is better to move it to a router fixture.\n\nI do not like to the idea to eliminate the fields from FAKE_ROUTER. Because the FAKE_ROUTER variable works like a template. It can be altered and at same time it may be used as is.","commit_id":"1f67ff71b2923888529a9ea65f2e3098f04e4881"},{"author":{"_account_id":10237,"name":"Numan Siddique","email":"nusiddiq@redhat.com","username":"numansiddique"},"change_message_id":"a2a17b843e550c72e330b12f0e272688a98cd336","unresolved":false,"context_lines":[{"line_number":276,"context_line":"            cmd \u003d [\u0027ping\u0027, \u0027-c\u0027, \u00274\u0027, \u0027-q\u0027, ip]"},{"line_number":277,"context_line":"            cmd \u003d ip_lib.add_namespace_to_cmd(cmd, namespace)"},{"line_number":278,"context_line":"            linux_utils.execute(cmd, run_as_root\u003dTrue)"},{"line_number":279,"context_line":"            return True"},{"line_number":280,"context_line":"        except RuntimeError:"},{"line_number":281,"context_line":"            return False"},{"line_number":282,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7aaa499b_60fa4a77","line":279,"updated":"2015-04-14 17:11:22.000000000","message":"suggestion: may be you can remove this \u0027return True\u0027 and put it at the end of the function.\nYou can consider this if you happen to upload another patch.","commit_id":"1f67ff71b2923888529a9ea65f2e3098f04e4881"}],"neutron_vpnaas/tests/functional/test_scenario.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"567a5e2f4f8f7a3065f96859d836d5293e18ef95","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import os"},{"line_number":14,"context_line":"import netaddr"},{"line_number":15,"context_line":"from neutron.agent.linux import utils"},{"line_number":16,"context_line":"from neutron.tests.functional import base as functional_base"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_8757e725","line":13,"updated":"2015-02-27 22:05:53.000000000","message":"This is a system import, so should be separated from the others by a blank line.","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"567a5e2f4f8f7a3065f96859d836d5293e18ef95","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import os"},{"line_number":14,"context_line":"import netaddr"},{"line_number":15,"context_line":"from neutron.agent.linux import utils"},{"line_number":16,"context_line":"from neutron.tests.functional import base as functional_base"},{"line_number":17,"context_line":"from tempest import auth"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_073bf7eb","line":14,"updated":"2015-02-27 22:05:53.000000000","message":"This is a third party import, and should be in the second group of imports (blank line after).","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"66b5198ebf287ee8ca9a8e3ff3557fd8cca0489f","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"import os"},{"line_number":14,"context_line":"import netaddr"},{"line_number":15,"context_line":"from neutron.agent.linux import utils"},{"line_number":16,"context_line":"from neutron.tests.functional import base as functional_base"},{"line_number":17,"context_line":"from tempest import auth"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_227389b2","line":14,"in_reply_to":"ba7be1f8_073bf7eb","updated":"2015-02-27 22:10:20.000000000","message":"Actually, netaddr and os are in the same group. So this should be before os, and a blank line after the pair.","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"66b5198ebf287ee8ca9a8e3ff3557fd8cca0489f","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron.tests.functional import base as functional_base"},{"line_number":17,"context_line":"from tempest import auth"},{"line_number":18,"context_line":"from tempest import exceptions as exc"},{"line_number":19,"context_line":"from tempest import test"},{"line_number":20,"context_line":"from tempest.services.network import resources as net_resources"},{"line_number":21,"context_line":"from tempest.services.network.json.network_client import NetworkClientJSON"},{"line_number":22,"context_line":"from tempest_lib.common.utils import data_utils"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_222549ab","line":19,"updated":"2015-02-27 22:10:20.000000000","message":"This one needs to move down too.","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"567a5e2f4f8f7a3065f96859d836d5293e18ef95","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from tempest import exceptions as exc"},{"line_number":19,"context_line":"from tempest import test"},{"line_number":20,"context_line":"from tempest.services.network import resources as net_resources"},{"line_number":21,"context_line":"from tempest.services.network.json.network_client import NetworkClientJSON"},{"line_number":22,"context_line":"from tempest_lib.common.utils import data_utils"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_e71c237a","line":21,"updated":"2015-02-27 22:05:53.000000000","message":"This should be above L20, alpha order json \u003c resources","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"567a5e2f4f8f7a3065f96859d836d5293e18ef95","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TestNetworkVpnaas(functional_base.BaseSudoTestCase):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    ip_version \u003d 4"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    os_username \u003d os.environ.get(\u0027OS_USERNAME\u0027)"},{"line_number":30,"context_line":"    os_password \u003d os.environ.get(\u0027OS_PASSWORD\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_a78f8bcb","line":27,"updated":"2015-02-27 22:05:53.000000000","message":"Why are all of these class variables? I see that this one, is referenced as self.ip_version.  Could all these be put in setUp()?","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"e6507f89edce1dde9f5b9cd8d9ae8abda34b02ef","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TestNetworkVpnaas(functional_base.BaseSudoTestCase):"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    ip_version \u003d 4"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    os_username \u003d os.environ.get(\u0027OS_USERNAME\u0027)"},{"line_number":30,"context_line":"    os_password \u003d os.environ.get(\u0027OS_PASSWORD\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_e08eb131","line":27,"in_reply_to":"ba7be1f8_a78f8bcb","updated":"2015-03-18 10:08:43.000000000","message":"ip_version could not be in SetUp. The next step may be creating tests for ipv6 vpnaas (do not know if it makes sense but anyway). In order to do it we need to override value of ip_version in a child class. For ex:\n\nclass TestNetworkIpV6Vpnaas(TestNetworkVpnaas):\n    ip_version \u003d 6\n\nSee for more examples: https://github.com/openstack/tempest/blob/master/tempest/api/network/test_networks.py\n\nIt is like \"Injection of control\"","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"567a5e2f4f8f7a3065f96859d836d5293e18ef95","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    ip_version \u003d 4"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    os_username \u003d os.environ.get(\u0027OS_USERNAME\u0027)"},{"line_number":30,"context_line":"    os_password \u003d os.environ.get(\u0027OS_PASSWORD\u0027)"},{"line_number":31,"context_line":"    os_tenant_name \u003d os.environ.get(\u0027OS_TENANT_NAME\u0027)"},{"line_number":32,"context_line":"    os_auth_url \u003d os.environ.get(\u0027OS_AUTH_URL\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_6a3e452b","line":29,"updated":"2015-02-27 22:05:53.000000000","message":"I would imagine that some of these are provided by the job. Do you know if any are not, and need to be added?","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"bc21c4edb79df1620225ccc7d0a23e0a0f4ef47a","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    ip_version \u003d 4"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    os_username \u003d os.environ.get(\u0027OS_USERNAME\u0027)"},{"line_number":30,"context_line":"    os_password \u003d os.environ.get(\u0027OS_PASSWORD\u0027)"},{"line_number":31,"context_line":"    os_tenant_name \u003d os.environ.get(\u0027OS_TENANT_NAME\u0027)"},{"line_number":32,"context_line":"    os_auth_url \u003d os.environ.get(\u0027OS_AUTH_URL\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_137140e0","line":29,"in_reply_to":"ba7be1f8_0daf6395","updated":"2015-03-17 12:40:25.000000000","message":"In the post_test_hook.sh in the repo, you can source openrc and that will set the env variables for L29-32. There, you can also set the BUILD* variables. May want to have more descriptive names for these too.","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"8ec3899de9671b5fddaf063dba4b6d7278c1df6e","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":"    ip_version \u003d 4"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    os_username \u003d os.environ.get(\u0027OS_USERNAME\u0027)"},{"line_number":30,"context_line":"    os_password \u003d os.environ.get(\u0027OS_PASSWORD\u0027)"},{"line_number":31,"context_line":"    os_tenant_name \u003d os.environ.get(\u0027OS_TENANT_NAME\u0027)"},{"line_number":32,"context_line":"    os_auth_url \u003d os.environ.get(\u0027OS_AUTH_URL\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_0daf6395","line":29,"in_reply_to":"ba7be1f8_6a3e452b","updated":"2015-03-02 16:17:40.000000000","message":"it seems to me the job do not provide any environment variables.","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"567a5e2f4f8f7a3065f96859d836d5293e18ef95","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    os_password \u003d os.environ.get(\u0027OS_PASSWORD\u0027)"},{"line_number":31,"context_line":"    os_tenant_name \u003d os.environ.get(\u0027OS_TENANT_NAME\u0027)"},{"line_number":32,"context_line":"    os_auth_url \u003d os.environ.get(\u0027OS_AUTH_URL\u0027)"},{"line_number":33,"context_line":"    build_timeout \u003d int(os.environ.get(\u0027BUILD_TIMEOUT\u0027))"},{"line_number":34,"context_line":"    build_interval \u003d int(os.environ.get(\u0027BUILD_INTERVAL\u0027))"},{"line_number":35,"context_line":"    public_network_id \u003d os.environ.get(\u0027PUBLIC_NETWORK_ID\u0027)"},{"line_number":36,"context_line":"    mask_cidr \u003d int(os.environ.get(\u0027TENANT_NETWORK_MASK_BITS\u0027, 28))"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_aac3dd36","line":33,"updated":"2015-02-27 22:05:53.000000000","message":"Are the two build values needed? Should defaults be provided?","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"e6507f89edce1dde9f5b9cd8d9ae8abda34b02ef","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    os_password \u003d os.environ.get(\u0027OS_PASSWORD\u0027)"},{"line_number":31,"context_line":"    os_tenant_name \u003d os.environ.get(\u0027OS_TENANT_NAME\u0027)"},{"line_number":32,"context_line":"    os_auth_url \u003d os.environ.get(\u0027OS_AUTH_URL\u0027)"},{"line_number":33,"context_line":"    build_timeout \u003d int(os.environ.get(\u0027BUILD_TIMEOUT\u0027))"},{"line_number":34,"context_line":"    build_interval \u003d int(os.environ.get(\u0027BUILD_INTERVAL\u0027))"},{"line_number":35,"context_line":"    public_network_id \u003d os.environ.get(\u0027PUBLIC_NETWORK_ID\u0027)"},{"line_number":36,"context_line":"    mask_cidr \u003d int(os.environ.get(\u0027TENANT_NETWORK_MASK_BITS\u0027, 28))"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_c07a8d24","line":33,"in_reply_to":"ba7be1f8_aac3dd36","updated":"2015-03-18 10:08:43.000000000","message":"I will add defaults.","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"bc21c4edb79df1620225ccc7d0a23e0a0f4ef47a","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    os_auth_url \u003d os.environ.get(\u0027OS_AUTH_URL\u0027)"},{"line_number":33,"context_line":"    build_timeout \u003d int(os.environ.get(\u0027BUILD_TIMEOUT\u0027))"},{"line_number":34,"context_line":"    build_interval \u003d int(os.environ.get(\u0027BUILD_INTERVAL\u0027))"},{"line_number":35,"context_line":"    public_network_id \u003d os.environ.get(\u0027PUBLIC_NETWORK_ID\u0027)"},{"line_number":36,"context_line":"    mask_cidr \u003d int(os.environ.get(\u0027TENANT_NETWORK_MASK_BITS\u0027, 28))"},{"line_number":37,"context_line":"    cidr \u003d netaddr.IPNetwork("},{"line_number":38,"context_line":"        os.environ.get(\u0027TENANT_NETWORK_CIDR\u0027, \u002710.100.0.0/16\u0027))"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_5307381d","line":35,"updated":"2015-03-17 12:40:25.000000000","message":"Don\u0027t see any env variable for this (uuid of public net?). I would think script could query the ID via neutron calls for the network \u0027public\u0027.","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"e6507f89edce1dde9f5b9cd8d9ae8abda34b02ef","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    os_auth_url \u003d os.environ.get(\u0027OS_AUTH_URL\u0027)"},{"line_number":33,"context_line":"    build_timeout \u003d int(os.environ.get(\u0027BUILD_TIMEOUT\u0027))"},{"line_number":34,"context_line":"    build_interval \u003d int(os.environ.get(\u0027BUILD_INTERVAL\u0027))"},{"line_number":35,"context_line":"    public_network_id \u003d os.environ.get(\u0027PUBLIC_NETWORK_ID\u0027)"},{"line_number":36,"context_line":"    mask_cidr \u003d int(os.environ.get(\u0027TENANT_NETWORK_MASK_BITS\u0027, 28))"},{"line_number":37,"context_line":"    cidr \u003d netaddr.IPNetwork("},{"line_number":38,"context_line":"        os.environ.get(\u0027TENANT_NETWORK_CIDR\u0027, \u002710.100.0.0/16\u0027))"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_20a7e9a8","line":35,"in_reply_to":"ba7be1f8_5307381d","updated":"2015-03-18 10:08:43.000000000","message":"Yes it makes sense. \nI will change PUBLIC_NETWORK_ID to PUBLIC_NETWORK_NAME and I will set default value to \u0027public\u0027","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"bc21c4edb79df1620225ccc7d0a23e0a0f4ef47a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    build_timeout \u003d int(os.environ.get(\u0027BUILD_TIMEOUT\u0027))"},{"line_number":34,"context_line":"    build_interval \u003d int(os.environ.get(\u0027BUILD_INTERVAL\u0027))"},{"line_number":35,"context_line":"    public_network_id \u003d os.environ.get(\u0027PUBLIC_NETWORK_ID\u0027)"},{"line_number":36,"context_line":"    mask_cidr \u003d int(os.environ.get(\u0027TENANT_NETWORK_MASK_BITS\u0027, 28))"},{"line_number":37,"context_line":"    cidr \u003d netaddr.IPNetwork("},{"line_number":38,"context_line":"        os.environ.get(\u0027TENANT_NETWORK_CIDR\u0027, \u002710.100.0.0/16\u0027))"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_4563efdc","line":36,"updated":"2015-03-17 12:40:25.000000000","message":"I don\u0027t see this, but DevStack does set FLOATING_RANGE (for the public network), which has the CIDR for the public network).","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"e6507f89edce1dde9f5b9cd8d9ae8abda34b02ef","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    build_timeout \u003d int(os.environ.get(\u0027BUILD_TIMEOUT\u0027))"},{"line_number":34,"context_line":"    build_interval \u003d int(os.environ.get(\u0027BUILD_INTERVAL\u0027))"},{"line_number":35,"context_line":"    public_network_id \u003d os.environ.get(\u0027PUBLIC_NETWORK_ID\u0027)"},{"line_number":36,"context_line":"    mask_cidr \u003d int(os.environ.get(\u0027TENANT_NETWORK_MASK_BITS\u0027, 28))"},{"line_number":37,"context_line":"    cidr \u003d netaddr.IPNetwork("},{"line_number":38,"context_line":"        os.environ.get(\u0027TENANT_NETWORK_CIDR\u0027, \u002710.100.0.0/16\u0027))"},{"line_number":39,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_1ee1622a","line":36,"in_reply_to":"ba7be1f8_4563efdc","updated":"2015-03-18 10:08:43.000000000","message":"This is \"The mask bits for tenant ipv4 subnets (integer value)\". It is related to private networks.","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"567a5e2f4f8f7a3065f96859d836d5293e18ef95","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        os.environ.get(\u0027TENANT_NETWORK_CIDR\u0027, \u002710.100.0.0/16\u0027))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def setUpClass(cls):"},{"line_number":42,"context_line":"        super(TestNetworkVpnaas, cls).setUpClass()"},{"line_number":43,"context_line":"        cls.credentials \u003d auth.KeystoneV2Credentials("},{"line_number":44,"context_line":"            username\u003dcls.os_username,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_e7f2636e","line":41,"updated":"2015-02-27 22:05:53.000000000","message":"Who uses this?","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"e6507f89edce1dde9f5b9cd8d9ae8abda34b02ef","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        os.environ.get(\u0027TENANT_NETWORK_CIDR\u0027, \u002710.100.0.0/16\u0027))"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def setUpClass(cls):"},{"line_number":42,"context_line":"        super(TestNetworkVpnaas, cls).setUpClass()"},{"line_number":43,"context_line":"        cls.credentials \u003d auth.KeystoneV2Credentials("},{"line_number":44,"context_line":"            username\u003dcls.os_username,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_be705674","line":41,"in_reply_to":"ba7be1f8_e7f2636e","updated":"2015-03-18 10:08:43.000000000","message":"Sorry I do not understand question. What is it about?","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"567a5e2f4f8f7a3065f96859d836d5293e18ef95","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            \u0027network\u0027,"},{"line_number":56,"context_line":"            \u0027RegionOne\u0027,"},{"line_number":57,"context_line":"            endpoint_type\u003d\u0027publicURL\u0027,"},{"line_number":58,"context_line":"            build_interval\u003d1,"},{"line_number":59,"context_line":"            build_timeout\u003d300)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def site_setup(self, site_name):"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_ca73b113","line":58,"updated":"2015-02-27 22:05:53.000000000","message":"Not using the environment variables captured?","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"e6507f89edce1dde9f5b9cd8d9ae8abda34b02ef","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            \u0027network\u0027,"},{"line_number":56,"context_line":"            \u0027RegionOne\u0027,"},{"line_number":57,"context_line":"            endpoint_type\u003d\u0027publicURL\u0027,"},{"line_number":58,"context_line":"            build_interval\u003d1,"},{"line_number":59,"context_line":"            build_timeout\u003d300)"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"    def site_setup(self, site_name):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_be1e960b","line":58,"in_reply_to":"ba7be1f8_ca73b113","updated":"2015-03-18 10:08:43.000000000","message":"Thanks","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"567a5e2f4f8f7a3065f96859d836d5293e18ef95","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    def site_setup(self, site_name):"},{"line_number":62,"context_line":"        \"\"\"Creates network, subnet, router"},{"line_number":63,"context_line":"        \"\"\""},{"line_number":64,"context_line":"        result \u003d self.network_client.create_network("},{"line_number":65,"context_line":"            name\u003ddata_utils.rand_name(\u0027{0}-net\u0027.format(site_name)))"},{"line_number":66,"context_line":"        network \u003d net_resources.DeletableNetwork(client\u003dself.network_client,"},{"line_number":67,"context_line":"                                                 **result[\u0027network\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_0af30974","line":64,"updated":"2015-02-27 22:05:53.000000000","message":"Do we need to check the result? Here and other setups?","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"e6507f89edce1dde9f5b9cd8d9ae8abda34b02ef","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    def site_setup(self, site_name):"},{"line_number":62,"context_line":"        \"\"\"Creates network, subnet, router"},{"line_number":63,"context_line":"        \"\"\""},{"line_number":64,"context_line":"        result \u003d self.network_client.create_network("},{"line_number":65,"context_line":"            name\u003ddata_utils.rand_name(\u0027{0}-net\u0027.format(site_name)))"},{"line_number":66,"context_line":"        network \u003d net_resources.DeletableNetwork(client\u003dself.network_client,"},{"line_number":67,"context_line":"                                                 **result[\u0027network\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_9ead529e","line":64,"in_reply_to":"ba7be1f8_0af30974","updated":"2015-03-18 10:08:43.000000000","message":"I do not thinks we need to check. \n\"Create network\" feature is tested in another test.","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"567a5e2f4f8f7a3065f96859d836d5293e18ef95","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    def _ping_site(self, source_site, dest_site):"},{"line_number":154,"context_line":"        \"\"\"Pings ip address of dest_site from source_site."},{"line_number":155,"context_line":"           In order to ping it uses following cli command:"},{"line_number":156,"context_line":"                ip netns exec \u003crouter\u003e ping -c 4 -q -I"},{"line_number":157,"context_line":"                \u003csource_IP\u003e \u003cdestination_IP\u003e"},{"line_number":158,"context_line":"            Where:"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_6a7645da","line":155,"updated":"2015-02-27 22:05:53.000000000","message":"Add blank line between summary and rest of docstring.","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"567a5e2f4f8f7a3065f96859d836d5293e18ef95","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                ip netns exec \u003crouter\u003e ping -c 4 -q -I"},{"line_number":157,"context_line":"                \u003csource_IP\u003e \u003cdestination_IP\u003e"},{"line_number":158,"context_line":"            Where:"},{"line_number":159,"context_line":"                \u003crouter\u003e - router network namespace name"},{"line_number":160,"context_line":"                \u003csource_IP\u003e - ip address assigned to an interface of a"},{"line_number":161,"context_line":"                    router on the source site"},{"line_number":162,"context_line":"                \u003cdestination_router_IP_address\u003e - ip address assigned to"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba7be1f8_ea179552","line":159,"updated":"2015-02-27 22:05:53.000000000","message":"We discussed off-line, where you mentioned that some router\u0027s may not have a namespace. Just a thought, could we create a port on the subnet, with an IP and use that for the ping?","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"e6507f89edce1dde9f5b9cd8d9ae8abda34b02ef","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                ip netns exec \u003crouter\u003e ping -c 4 -q -I"},{"line_number":157,"context_line":"                \u003csource_IP\u003e \u003cdestination_IP\u003e"},{"line_number":158,"context_line":"            Where:"},{"line_number":159,"context_line":"                \u003crouter\u003e - router network namespace name"},{"line_number":160,"context_line":"                \u003csource_IP\u003e - ip address assigned to an interface of a"},{"line_number":161,"context_line":"                    router on the source site"},{"line_number":162,"context_line":"                \u003cdestination_router_IP_address\u003e - ip address assigned to"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a80dd14_1ebec2ae","line":159,"in_reply_to":"ba7be1f8_ea179552","updated":"2015-03-18 10:08:43.000000000","message":"Yes the idea \"create port\" works. Creating port forces neutron to create a dhcp network namespace. Then we may use dhcp namespace same way as router namespace. Thanks","commit_id":"671144d34f3c3297828e7c54022e2a9b2bec5f1b"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b80fdcdae3ecb8e25ea77cfe17a7613b46b2bba3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"9a80dd14_08b91acb","updated":"2015-03-18 15:29:36.000000000","message":"This file needs to be in tests/functional/common so that it will be run as part of both the openswan and strongswan jobs.","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"15e6821bd62085fa5414d43a6a451f5a5ba11737","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"9a80dd14_f3e2c42e","in_reply_to":"9a80dd14_08b91acb","updated":"2015-03-19 14:11:25.000000000","message":"I will move it to neutron_vpnaas/tests/functional/common/test_scenario.py","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b80fdcdae3ecb8e25ea77cfe17a7613b46b2bba3","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    _ip_version \u003d 4"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    os_username \u003d os.environ.get(\u0027OS_USERNAME\u0027)"},{"line_number":32,"context_line":"    os_password \u003d os.environ.get(\u0027OS_PASSWORD\u0027)"},{"line_number":33,"context_line":"    os_tenant_name \u003d os.environ.get(\u0027OS_TENANT_NAME\u0027)"},{"line_number":34,"context_line":"    os_auth_url \u003d os.environ.get(\u0027OS_AUTH_URL\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_a3acb18d","line":31,"updated":"2015-03-18 15:29:36.000000000","message":"I understand that you want to override ip version, but all these other variables? Can\u0027t they be set in setUp (or in this case the special class methods defined in BaseTestCase, which can be overridden)?","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"15e6821bd62085fa5414d43a6a451f5a5ba11737","unresolved":false,"context_lines":[{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    _ip_version \u003d 4"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    os_username \u003d os.environ.get(\u0027OS_USERNAME\u0027)"},{"line_number":32,"context_line":"    os_password \u003d os.environ.get(\u0027OS_PASSWORD\u0027)"},{"line_number":33,"context_line":"    os_tenant_name \u003d os.environ.get(\u0027OS_TENANT_NAME\u0027)"},{"line_number":34,"context_line":"    os_auth_url \u003d os.environ.get(\u0027OS_AUTH_URL\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_207192a8","line":31,"in_reply_to":"9a80dd14_a3acb18d","updated":"2015-03-19 14:11:25.000000000","message":"Oh I see. I will move them to setUp","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b80fdcdae3ecb8e25ea77cfe17a7613b46b2bba3","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    build_timeout \u003d int(os.environ.get(\u0027BUILD_TIMEOUT\u0027, 300))"},{"line_number":36,"context_line":"    build_interval \u003d int(os.environ.get(\u0027BUILD_INTERVAL\u0027, 1))"},{"line_number":37,"context_line":"    public_network_name \u003d os.environ.get(\u0027PUBLIC_NETWORK_NAME\u0027, \u0027public\u0027)"},{"line_number":38,"context_line":"    mask_cidr \u003d int(os.environ.get(\u0027TENANT_NETWORK_MASK_BITS\u0027, 28))"},{"line_number":39,"context_line":"    cidr \u003d netaddr.IPNetwork("},{"line_number":40,"context_line":"        os.environ.get(\u0027TENANT_NETWORK_CIDR\u0027, \u002710.100.0.0/16\u0027))"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_63255909","line":38,"updated":"2015-03-18 15:29:36.000000000","message":"For devstack, is the default mask 28? I thought the private net was /24","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"15e6821bd62085fa5414d43a6a451f5a5ba11737","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    build_timeout \u003d int(os.environ.get(\u0027BUILD_TIMEOUT\u0027, 300))"},{"line_number":36,"context_line":"    build_interval \u003d int(os.environ.get(\u0027BUILD_INTERVAL\u0027, 1))"},{"line_number":37,"context_line":"    public_network_name \u003d os.environ.get(\u0027PUBLIC_NETWORK_NAME\u0027, \u0027public\u0027)"},{"line_number":38,"context_line":"    mask_cidr \u003d int(os.environ.get(\u0027TENANT_NETWORK_MASK_BITS\u0027, 28))"},{"line_number":39,"context_line":"    cidr \u003d netaddr.IPNetwork("},{"line_number":40,"context_line":"        os.environ.get(\u0027TENANT_NETWORK_CIDR\u0027, \u002710.100.0.0/16\u0027))"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_2044321a","line":38,"in_reply_to":"9a80dd14_63255909","updated":"2015-03-19 14:11:25.000000000","message":"Yes default mask is 28. See: https://github.com/openstack/tempest/blob/master/tempest/config.py#L423","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b80fdcdae3ecb8e25ea77cfe17a7613b46b2bba3","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        os.environ.get(\u0027TENANT_NETWORK_CIDR\u0027, \u002710.100.0.0/16\u0027))"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @classmethod"},{"line_number":43,"context_line":"    def setUpClass(cls):"},{"line_number":44,"context_line":"        super(TestNetworkVpnaas, cls).setUpClass()"},{"line_number":45,"context_line":"        cls.credentials \u003d auth.KeystoneV2Credentials("},{"line_number":46,"context_line":"            username\u003dcls.os_username,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_9e8f0075","line":43,"updated":"2015-03-18 15:29:36.000000000","message":"This class is defined in the BaseTestCase and has a note to not be overriden. It calls class methods, that a subclass can override for skip_checks(), setup_credentials(), setup_clients(), and resource_setup().\n\nIt seems like this class should instead override those class methods and do the needed setups there.\n\nSee neutron/tests/tempest/test.py.","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"15e6821bd62085fa5414d43a6a451f5a5ba11737","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        os.environ.get(\u0027TENANT_NETWORK_CIDR\u0027, \u002710.100.0.0/16\u0027))"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    @classmethod"},{"line_number":43,"context_line":"    def setUpClass(cls):"},{"line_number":44,"context_line":"        super(TestNetworkVpnaas, cls).setUpClass()"},{"line_number":45,"context_line":"        cls.credentials \u003d auth.KeystoneV2Credentials("},{"line_number":46,"context_line":"            username\u003dcls.os_username,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_17a105f8","line":43,"in_reply_to":"9a80dd14_9e8f0075","updated":"2015-03-19 14:11:25.000000000","message":"Does any job run tests located in neutron/tests/tempest folder?\n\nThe test class does not inherit BaseTestCase. It is a child of neutron.tests.functional.base.BaseSudoTestCase\n\nI do not know which one is a best Parent for the test class.","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b80fdcdae3ecb8e25ea77cfe17a7613b46b2bba3","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    @property"},{"line_number":64,"context_line":"    def public_network_id(self):"},{"line_number":65,"context_line":"        if not hasattr(self, \u0027_public_network_id\u0027):"},{"line_number":66,"context_line":"            for network in self.network_client.list_networks()[\u0027networks\u0027]:"},{"line_number":67,"context_line":"                if network[\u0027name\u0027] \u003d\u003d self.public_network_name:"},{"line_number":68,"context_line":"                    self._public_network_id \u003d network[\u0027id\u0027]"},{"line_number":69,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_fe2e3c41","line":66,"updated":"2015-03-18 15:29:36.000000000","message":"Rather than listing all and searching for the public net, can a get API be called for the public net, to get it\u0027s ID?","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"15e6821bd62085fa5414d43a6a451f5a5ba11737","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    @property"},{"line_number":64,"context_line":"    def public_network_id(self):"},{"line_number":65,"context_line":"        if not hasattr(self, \u0027_public_network_id\u0027):"},{"line_number":66,"context_line":"            for network in self.network_client.list_networks()[\u0027networks\u0027]:"},{"line_number":67,"context_line":"                if network[\u0027name\u0027] \u003d\u003d self.public_network_name:"},{"line_number":68,"context_line":"                    self._public_network_id \u003d network[\u0027id\u0027]"},{"line_number":69,"context_line":"                    break"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_976a5518","line":66,"in_reply_to":"9a80dd14_fe2e3c41","updated":"2015-03-19 14:11:25.000000000","message":"Yes we can get network by name. We need to create a method similar to this one: https://github.com/openstack/tempest/blob/master/tempest/services/network/json/network_client.py#L411-L416\n\nNetworkClient class is located in tempest and we can not add the method there. Also I do think the may place in right here in \"test_scenario.py\". What is the best place for such method in your opinion?","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"b80fdcdae3ecb8e25ea77cfe17a7613b46b2bba3","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    def site_setup(self, site_name):"},{"line_number":73,"context_line":"        \"\"\"Creates network, subnet, router, port"},{"line_number":74,"context_line":"        \"\"\""},{"line_number":75,"context_line":"        result \u003d self.network_client.create_network("},{"line_number":76,"context_line":"            name\u003ddata_utils.rand_name(\u0027{0}-net\u0027.format(site_name)))"},{"line_number":77,"context_line":"        network \u003d net_resources.DeletableNetwork(client\u003dself.network_client,"},{"line_number":78,"context_line":"                                                 **result[\u0027network\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_3eb7f4f6","line":75,"updated":"2015-03-18 15:29:36.000000000","message":"If not checking the return value, then you don\u0027t need to save it... here and other places. Maybe I\u0027m anal, but I always like to make sure my assumptions (like test setup) occurred.","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"15e6821bd62085fa5414d43a6a451f5a5ba11737","unresolved":false,"context_lines":[{"line_number":72,"context_line":"    def site_setup(self, site_name):"},{"line_number":73,"context_line":"        \"\"\"Creates network, subnet, router, port"},{"line_number":74,"context_line":"        \"\"\""},{"line_number":75,"context_line":"        result \u003d self.network_client.create_network("},{"line_number":76,"context_line":"            name\u003ddata_utils.rand_name(\u0027{0}-net\u0027.format(site_name)))"},{"line_number":77,"context_line":"        network \u003d net_resources.DeletableNetwork(client\u003dself.network_client,"},{"line_number":78,"context_line":"                                                 **result[\u0027network\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a80dd14_37b3699b","line":75,"in_reply_to":"9a80dd14_3eb7f4f6","updated":"2015-03-19 14:11:25.000000000","message":"Ok. So what exactly would you like to check here? Status code of a response, all values of created resource?","commit_id":"6f829105f368003748da9eee5c63c7dcb71726df"}],"tox.ini":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"54b4a9810ca7d0333504731264f1239a6f1618e0","unresolved":false,"context_lines":[{"line_number":44,"context_line":"         OS_SUDO_TESTING\u003d1"},{"line_number":45,"context_line":"         OS_ROOTWRAP_CMD\u003dsudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf"},{"line_number":46,"context_line":"         OS_FAIL_ON_MISSING_DEPS\u003d1"},{"line_number":47,"context_line":"         VPN_DEVICE_DRIVER\u003dneutron_vpnaas.services.vpn.device_drivers.strongswan_ipsec.StrongSwanDriver"},{"line_number":48,"context_line":"sitepackages\u003dTrue"},{"line_number":49,"context_line":"commands \u003d"},{"line_number":50,"context_line":"  python setup.py testr --slowest --testr-args\u003d\u0027{posargs}\u0027"}],"source_content_type":"text/x-properties","patch_set":20,"id":"dac4157f_afa1a9ab","line":47,"updated":"2015-04-20 16:16:05.000000000","message":"I don\u0027t think this is really the place to specify the device driver.  I think the setup for the test class should set the driver. This way, other drivers can set  the needed driver (openswan, strongswan, cisco, vyatta, etc).","commit_id":"31ff75c1b2983045b0dff9284e172fd7c26d96ed"},{"author":{"_account_id":8767,"name":"Nikolay Fedotov","email":"nfedotov@cisco.com","username":"nfedotov"},"change_message_id":"044adf8726a29846e4916d35c4a18579bc10cbf3","unresolved":false,"context_lines":[{"line_number":44,"context_line":"         OS_SUDO_TESTING\u003d1"},{"line_number":45,"context_line":"         OS_ROOTWRAP_CMD\u003dsudo /usr/local/bin/neutron-rootwrap /etc/neutron/rootwrap.conf"},{"line_number":46,"context_line":"         OS_FAIL_ON_MISSING_DEPS\u003d1"},{"line_number":47,"context_line":"         VPN_DEVICE_DRIVER\u003dneutron_vpnaas.services.vpn.device_drivers.strongswan_ipsec.StrongSwanDriver"},{"line_number":48,"context_line":"sitepackages\u003dTrue"},{"line_number":49,"context_line":"commands \u003d"},{"line_number":50,"context_line":"  python setup.py testr --slowest --testr-args\u003d\u0027{posargs}\u0027"}],"source_content_type":"text/x-properties","patch_set":20,"id":"dac4157f_ef4c1844","line":47,"in_reply_to":"dac4157f_afa1a9ab","updated":"2015-04-21 13:54:46.000000000","message":"Done","commit_id":"31ff75c1b2983045b0dff9284e172fd7c26d96ed"}]}
