)]}'
{".zuul.yaml":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e4caaafc05ce74efdcf961bdee27a69204d2ad63","unresolved":false,"context_lines":[{"line_number":19,"context_line":"      devstack_localrc:"},{"line_number":20,"context_line":"        TEMPEST_PLUGINS: \"\u0027{{ ansible_user_dir }}/src/git.openstack.org/openstack/patrole\u0027\""},{"line_number":21,"context_line":"      devstack_plugins:"},{"line_number":22,"context_line":"        neutron: git://git.openstack.org/openstack/neutron.git"},{"line_number":23,"context_line":"        patrole: git://git.openstack.org/openstack/patrole.git"},{"line_number":24,"context_line":"      devstack_services:"},{"line_number":25,"context_line":"        tempest: true"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"5f7c97a3_48227456","line":22,"updated":"2018-07-25 21:24:34.000000000","message":"My hunch is we will have to add the neutron-tempest-plugin repository here. We will also have to add an entry for it under TEMPEST_PLUGINS above. So this is what I believe we will need:\n\n    devstack_localrc:\n      TEMPEST_PLUGINS: \u0027\"/opt/stack/patrole\n                         /opt/stack/neutron-tempest-plugin\"\u0027\n    devstack_plugins:\n      patrole: git://git.openstack.org/openstack/patrole.git\n      neutron-tempest-plugin: git://git.openstack.org/openstack/neutron-tempest-plugin.git\n    devstack_services:\n      [...]\n      neutron-segments: true\n\nExample: https://github.com/openstack/neutron-tempest-plugin/blob/c2fd6d954cb2b7057463ce55dbb19d8aac4aa32f/.zuul.yaml#L202","commit_id":"4d4deaa7c1c204a8848fb1c0cbdae05449c6d51a"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"af72d274e5db7d6687af9f13227b0ad81fdc7120","unresolved":false,"context_lines":[{"line_number":19,"context_line":"      devstack_localrc:"},{"line_number":20,"context_line":"        TEMPEST_PLUGINS: \"\u0027{{ ansible_user_dir }}/src/git.openstack.org/openstack/patrole\u0027\""},{"line_number":21,"context_line":"      devstack_plugins:"},{"line_number":22,"context_line":"        neutron: git://git.openstack.org/openstack/neutron.git"},{"line_number":23,"context_line":"        patrole: git://git.openstack.org/openstack/patrole.git"},{"line_number":24,"context_line":"      devstack_services:"},{"line_number":25,"context_line":"        tempest: true"}],"source_content_type":"text/x-yaml","patch_set":11,"id":"5f7c97a3_631f535a","line":22,"in_reply_to":"5f7c97a3_48227456","updated":"2018-07-25 22:15:44.000000000","message":"Done","commit_id":"4d4deaa7c1c204a8848fb1c0cbdae05449c6d51a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"1d919a1d09b6576eedffe03d86006e5b72825b4f","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    description: Patrole base job for admin and member roles."},{"line_number":5,"context_line":"    required-projects:"},{"line_number":6,"context_line":"      - name: openstack/tempest"},{"line_number":7,"context_line":"      - name: openstack/patrole"},{"line_number":8,"context_line":"    timeout: 7800"},{"line_number":9,"context_line":"    roles:"},{"line_number":10,"context_line":"      - zuul: openstack-dev/devstack"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"5f7c97a3_be1b42c9","line":7,"updated":"2018-07-25 23:57:44.000000000","message":"Hmm, I think we\u0027re also missing neutron-tempest-plugin repo here:\n\n2018-07-25 22:17:34.314519 | controller | + functions-common:git_clone:532           :   echo \u0027The /opt/stack/neutron-tempest-plugin project was not found; if this is a gate job, add\u0027\n2018-07-25 22:17:34.314732 | controller | The /opt/stack/neutron-tempest-plugin project was not found; if this is a gate job, add\n2018-07-25 22:17:34.316333 | controller | + functions-common:git_clone:533           :   echo \u0027the project to the $PROJECTS variable in the job definition.\u0027","commit_id":"8b9d14da8c77b13915cb025cc35f8955497a2ec4"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"ff987133e6e05ec31afd246c6c8aabe7d3677704","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    description: Patrole base job for admin and member roles."},{"line_number":5,"context_line":"    required-projects:"},{"line_number":6,"context_line":"      - name: openstack/tempest"},{"line_number":7,"context_line":"      - name: openstack/patrole"},{"line_number":8,"context_line":"    timeout: 7800"},{"line_number":9,"context_line":"    roles:"},{"line_number":10,"context_line":"      - zuul: openstack-dev/devstack"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"5f7c97a3_1e7ef6bf","line":7,"in_reply_to":"5f7c97a3_be1b42c9","updated":"2018-07-26 00:12:37.000000000","message":"Done","commit_id":"8b9d14da8c77b13915cb025cc35f8955497a2ec4"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"1d919a1d09b6576eedffe03d86006e5b72825b4f","unresolved":false,"context_lines":[{"line_number":20,"context_line":"        TEMPEST_PLUGINS: \"\u0027{{ ansible_user_dir }}/src/git.openstack.org/openstack/patrole"},{"line_number":21,"context_line":"                           {{ ansible_user_dir }}/src/git.openstack.org/openstack/neutron-tempest-plugin\u0027\""},{"line_number":22,"context_line":"      devstack_plugins:"},{"line_number":23,"context_line":"        neutron: git://git.openstack.org/openstack/neutron.git"},{"line_number":24,"context_line":"        patrole: git://git.openstack.org/openstack/patrole.git"},{"line_number":25,"context_line":"        neutron-tempest-plugin: git://git.openstack.org/openstack/neutron-tempest-plugin.git"},{"line_number":26,"context_line":"      devstack_services:"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"5f7c97a3_3efad276","line":23,"range":{"start_line":23,"start_character":7,"end_line":23,"end_character":62},"updated":"2018-07-25 23:57:44.000000000","message":"This isn\u0027t a plugin. We wouldn\u0027t need to add neutron here as a dependency as it\u0027s already being enabled on L28 anyway.","commit_id":"8b9d14da8c77b13915cb025cc35f8955497a2ec4"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"ff987133e6e05ec31afd246c6c8aabe7d3677704","unresolved":false,"context_lines":[{"line_number":20,"context_line":"        TEMPEST_PLUGINS: \"\u0027{{ ansible_user_dir }}/src/git.openstack.org/openstack/patrole"},{"line_number":21,"context_line":"                           {{ ansible_user_dir }}/src/git.openstack.org/openstack/neutron-tempest-plugin\u0027\""},{"line_number":22,"context_line":"      devstack_plugins:"},{"line_number":23,"context_line":"        neutron: git://git.openstack.org/openstack/neutron.git"},{"line_number":24,"context_line":"        patrole: git://git.openstack.org/openstack/patrole.git"},{"line_number":25,"context_line":"        neutron-tempest-plugin: git://git.openstack.org/openstack/neutron-tempest-plugin.git"},{"line_number":26,"context_line":"      devstack_services:"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"5f7c97a3_3eb2d297","line":23,"range":{"start_line":23,"start_character":7,"end_line":23,"end_character":62},"in_reply_to":"5f7c97a3_3efad276","updated":"2018-07-26 00:12:37.000000000","message":"This line tells devstack to execute https://github.com/openstack/neutron/blob/master/devstack/plugin.sh\n\nWe need it to enable segments extension.","commit_id":"8b9d14da8c77b13915cb025cc35f8955497a2ec4"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"32ce0278017a779abcd4b9efd02369987acb0270","unresolved":false,"context_lines":[{"line_number":1,"context_line":"- job:"},{"line_number":2,"context_line":"    name: patrole-base"},{"line_number":3,"context_line":"    parent: devstack-tempest"},{"line_number":4,"context_line":"    description: Patrole base job for admin and member roles."},{"line_number":5,"context_line":"    required-projects:"},{"line_number":6,"context_line":"      - name: openstack/tempest"},{"line_number":7,"context_line":"      - name: openstack/patrole"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"5f7c97a3_87a716a9","line":4,"updated":"2018-07-26 04:38:26.000000000","message":"nit: Would be nice to expand on description.\n\ndescription: |\n   Patrole base job for admin and member roles. This job executes RBAC tests\n   for all the \"core\" services that Tempest covers, excluding Swift. This job also\n   runs RBAC tests for neutron-tempest-plugin APIs (if the plugin is installed).","commit_id":"73d40204c0799bc3846504495850fa5d696ea553"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"564734ff63d3de4ef647906ba03e1433262cd116","unresolved":false,"context_lines":[{"line_number":1,"context_line":"- job:"},{"line_number":2,"context_line":"    name: patrole-base"},{"line_number":3,"context_line":"    parent: devstack-tempest"},{"line_number":4,"context_line":"    description: Patrole base job for admin and member roles."},{"line_number":5,"context_line":"    required-projects:"},{"line_number":6,"context_line":"      - name: openstack/tempest"},{"line_number":7,"context_line":"      - name: openstack/patrole"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"5f7c97a3_6fa2c399","line":4,"in_reply_to":"5f7c97a3_87a716a9","updated":"2018-07-26 15:46:42.000000000","message":"Done","commit_id":"73d40204c0799bc3846504495850fa5d696ea553"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"32ce0278017a779abcd4b9efd02369987acb0270","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    vars:"},{"line_number":20,"context_line":"      devstack_localrc:"},{"line_number":21,"context_line":"        TEMPEST_PLUGINS: \"\u0027{{ ansible_user_dir }}/src/git.openstack.org/openstack/patrole"},{"line_number":22,"context_line":"                           /opt/stack/neutron-tempest-plugin\u0027\""},{"line_number":23,"context_line":"      devstack_plugins:"},{"line_number":24,"context_line":"        neutron: git://git.openstack.org/openstack/neutron.git"},{"line_number":25,"context_line":"        patrole: git://git.openstack.org/openstack/patrole.git"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"5f7c97a3_e7736a4e","line":22,"updated":"2018-07-26 04:38:26.000000000","message":"nit: We should probably use same syntax here for the patrole one too to keep it cleaner: /opt/stack/patrole","commit_id":"73d40204c0799bc3846504495850fa5d696ea553"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"564734ff63d3de4ef647906ba03e1433262cd116","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    vars:"},{"line_number":20,"context_line":"      devstack_localrc:"},{"line_number":21,"context_line":"        TEMPEST_PLUGINS: \"\u0027{{ ansible_user_dir }}/src/git.openstack.org/openstack/patrole"},{"line_number":22,"context_line":"                           /opt/stack/neutron-tempest-plugin\u0027\""},{"line_number":23,"context_line":"      devstack_plugins:"},{"line_number":24,"context_line":"        neutron: git://git.openstack.org/openstack/neutron.git"},{"line_number":25,"context_line":"        patrole: git://git.openstack.org/openstack/patrole.git"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"5f7c97a3_0fb30fee","line":22,"in_reply_to":"5f7c97a3_e7736a4e","updated":"2018-07-26 15:46:42.000000000","message":"Done","commit_id":"73d40204c0799bc3846504495850fa5d696ea553"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ab03e97731aae6a31f8afa61efd5de3b881d1cf3","unresolved":false,"context_lines":[{"line_number":34,"context_line":"      tempest_concurrency: 2"},{"line_number":35,"context_line":"      tempest_test_regex: (?!.*\\[.*\\bslow\\b.*\\])(^patrole_tempest_plugin\\.tests\\.api)"},{"line_number":36,"context_line":"      tox_envlist: all-plugin"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"- job:"},{"line_number":39,"context_line":"    name: patrole-base-multinode"},{"line_number":40,"context_line":"    parent: tempest-multinode-full"}],"source_content_type":"text/x-yaml","patch_set":20,"id":"5f7c97a3_11048d7c","line":37,"updated":"2018-07-26 22:59:11.000000000","message":"So I\u0027m guessing neutron-tempest-plugin doesn\u0027t uphold the same contract Tempest does w.r.t to working against n, n-1 and n-2 clouds:\n\n2018-07-26 21:45:07.582672 | controller | \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n2018-07-26 21:45:07.582706 | controller | Failures during discovery\n2018-07-26 21:45:07.582732 | controller | \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n2018-07-26 21:45:07.582753 | controller | --- import errors ---\n2018-07-26 21:45:07.582812 | controller | Failed to import test module: neutron_tempest_plugin.api.test_metering_extensions\n2018-07-26 21:45:07.582846 | controller | Traceback (most recent call last):\n2018-07-26 21:45:07.582910 | controller |   File \"/usr/local/lib/python2.7/dist-packages/unittest2/loader.py\", line 456, in _find_test_path\n2018-07-26 21:45:07.582947 | controller |     module \u003d self._get_module_from_name(name)\n2018-07-26 21:45:07.583013 | controller |   File \"/usr/local/lib/python2.7/dist-packages/unittest2/loader.py\", line 395, in _get_module_from_name\n2018-07-26 21:45:07.583038 | controller |     __import__(name)\n2018-07-26 21:45:07.583123 | controller |   File \"/opt/stack/neutron-tempest-plugin/neutron_tempest_plugin/api/test_metering_extensions.py\", line 15, in \u003cmodule\u003e\n2018-07-26 21:45:07.583177 | controller |     from neutron_lib.api.definitions import metering as metering_apidef\n2018-07-26 21:45:07.583209 | controller | ImportError: cannot import name metering\n\nError above tells me that executing latest neutron-tempest-plugin against a pike cloud breaks down, so as a consequence we can just run neutron-tempest-plugin tests for master. To do that wen can use the default patrole-base:\n\n- job:\n  name: patrole-base\n  [...]\n\nAdd a new job called patrole-plugin-base (which includes all of your above changes):\n\n- job\n  name: patrole-plugin-base\n  parent: patrole-base\n  description: |\n       Patrole plugin job for admin and member roles which\n       runs RBAC tests for neutron-tempest-plugin APIs (if the plugin is installed).\n  [...]\n\n- job:\n    name: patrole-plugin-member\n    parent: patrole-plugin-base\n    voting: false\n    vars:\n      devstack_localrc:\n        RBAC_TEST_ROLE: member\n      tempest_test_regex: (?\u003d.*PluginRbacTest$)(^patrole_tempest_plugin\\.tests\\.api)\n\n- job:\n    name: patrole-plugin-admin\n    parent: patrole-plugin-base\n    voting: false\n    vars:\n      devstack_localrc:\n        RBAC_TEST_ROLE: admin\n      tempest_test_regex: (?\u003d.*PluginRbacTest$)(^patrole_tempest_plugin\\.tests\\.api)\n\n[...]\n\n- project:\n    check:\n      jobs:\n        [...]\n        - patrole-plugin-member\n        - patrole-plugin-admin","commit_id":"7e09f75f50f28d1207b667da70dd113518e0a438"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"e7d8a18efed2246071489bce52ce86cca5452fd9","unresolved":false,"context_lines":[{"line_number":34,"context_line":"      tempest_concurrency: 2"},{"line_number":35,"context_line":"      tempest_test_regex: (?!.*\\[.*\\bslow\\b.*\\])(^patrole_tempest_plugin\\.tests\\.api)"},{"line_number":36,"context_line":"      tox_envlist: all-plugin"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"- job:"},{"line_number":39,"context_line":"    name: patrole-base-multinode"},{"line_number":40,"context_line":"    parent: tempest-multinode-full"}],"source_content_type":"text/x-yaml","patch_set":20,"id":"5f7c97a3_8cbba00e","line":37,"in_reply_to":"5f7c97a3_11048d7c","updated":"2018-07-27 00:06:09.000000000","message":"Done","commit_id":"7e09f75f50f28d1207b667da70dd113518e0a438"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"4939b47a339be0f97f45611f112ec3f9efc32902","unresolved":false,"context_lines":[{"line_number":34,"context_line":"      tempest_concurrency: 2"},{"line_number":35,"context_line":"      tempest_test_regex: (?!.*\\[.*\\bslow\\b.*\\])(^patrole_tempest_plugin\\.tests\\.api)"},{"line_number":36,"context_line":"      tox_envlist: all-plugin"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"- job:"},{"line_number":39,"context_line":"    name: patrole-base-multinode"},{"line_number":40,"context_line":"    parent: tempest-multinode-full"}],"source_content_type":"text/x-yaml","patch_set":20,"id":"5f7c97a3_b1cb591b","line":37,"in_reply_to":"5f7c97a3_11048d7c","updated":"2018-07-26 23:01:07.000000000","message":"This will also tell us what happens when the other jobs try to execute test_segments_rbac.py without the neutron-tempest-plugin existing or the deployment being correct: it should skip for those jobs.","commit_id":"7e09f75f50f28d1207b667da70dd113518e0a438"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"36bead312b442b97bbeb9933530062d2b091ff3a","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    vars:"},{"line_number":160,"context_line":"      devstack_localrc:"},{"line_number":161,"context_line":"        RBAC_TEST_ROLE: member"},{"line_number":162,"context_line":"      tempest_test_regex: (?\u003d.*PluginRbacTest)(^patrole_tempest_plugin\\.tests\\.api)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"- job:"},{"line_number":165,"context_line":"    name: patrole-plugin-admin"}],"source_content_type":"text/x-yaml","patch_set":24,"id":"5f7c97a3_88a2a7ab","line":162,"range":{"start_line":162,"start_character":31,"end_line":162,"end_character":45},"updated":"2018-07-27 06:58:43.000000000","message":"Sorry about bad regex before, this definitely works now","commit_id":"a7b746b83b190fe50fc9e974086fa897b629ca74"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"cf16f57c53934a984300a5de777e93ac0d78a885","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        - patrole-multinode-admin"},{"line_number":182,"context_line":"        - patrole-multinode-member"},{"line_number":183,"context_line":"        - openstack-tox-lower-constraints"},{"line_number":184,"context_line":"        - patrole-plugin-admin"},{"line_number":185,"context_line":"        - patrole-plugin-member"},{"line_number":186,"context_line":"    gate:"},{"line_number":187,"context_line":"      jobs:"},{"line_number":188,"context_line":"        - patrole-admin"}],"source_content_type":"text/x-yaml","patch_set":28,"id":"3f79a3b5_9b5edde7","line":185,"range":{"start_line":184,"start_character":0,"end_line":185,"end_character":31},"updated":"2018-08-17 08:20:55.000000000","message":"any reason we cannot mis those in our normal jobs ? I think we should run all tests together and that job will keep enabling the required plugins for new tests.","commit_id":"d067148212ef95b938af5edbec359fa49156ddee"}],"/COMMIT_MSG":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a64568a3ee6319092bb7ed813b50248eaed5093b","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Mykola Yakovliev \u003cVegasQ@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-07-26 10:45:40 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add tests to cover segments [0]"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Test lists, gets, creates, updates, and deletes segments."},{"line_number":10,"context_line":"Part of \"Increase Neutron RBAC Coverage\" initiative [1]"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"5f7c97a3_9e7e6fbe","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":31},"updated":"2018-07-26 18:02:04.000000000","message":"The [0] shouldn\u0027t be on the commit message header but no hard rule against it. Could do:\n\n  Add tests to cover neutron segments API\n\n  This patch set adds tests to cver the neutron segments API [0].\n\n  [...]","commit_id":"5de1fdb83157773e0eee12c5af18fba102b833f5"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"45040e7b8cf977c971a79783af0e357db9b3e466","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Mykola Yakovliev \u003cVegasQ@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-07-26 10:45:40 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add tests to cover segments [0]"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Test lists, gets, creates, updates, and deletes segments."},{"line_number":10,"context_line":"Part of \"Increase Neutron RBAC Coverage\" initiative [1]"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":15,"id":"5f7c97a3_29b603dd","line":7,"range":{"start_line":7,"start_character":0,"end_line":7,"end_character":31},"in_reply_to":"5f7c97a3_9e7e6fbe","updated":"2018-07-26 18:29:01.000000000","message":"Done","commit_id":"5de1fdb83157773e0eee12c5af18fba102b833f5"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"36bead312b442b97bbeb9933530062d2b091ff3a","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch set adds tests to cver the neutron segments API [0]."},{"line_number":10,"context_line":"Test lists, gets, creates, updates, and deletes segments."},{"line_number":11,"context_line":"Part of \"Increase Neutron RBAC Coverage\" initiative [1]"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[0] https://developer.openstack.org/api-ref/network/v2/index.html#segments"},{"line_number":14,"context_line":"[1] https://storyboard.openstack.org/#!/story/20026410"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"5f7c97a3_c89c1f72","line":12,"updated":"2018-07-27 06:58:43.000000000","message":"Can also include:\n\nStory: 2002641\nTask: 22306 \n\n(This will automatically close the story/task post-merge)","commit_id":"a7b746b83b190fe50fc9e974086fa897b629ca74"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"790faa099873b50980f06319e260885e449542c0","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This patch set adds tests to cver the neutron segments API [0]."},{"line_number":10,"context_line":"Test lists, gets, creates, updates, and deletes segments."},{"line_number":11,"context_line":"Part of \"Increase Neutron RBAC Coverage\" initiative [1]"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[0] https://developer.openstack.org/api-ref/network/v2/index.html#segments"},{"line_number":14,"context_line":"[1] https://storyboard.openstack.org/#!/story/20026410"},{"line_number":15,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"5f7c97a3_04299b87","line":12,"in_reply_to":"5f7c97a3_c89c1f72","updated":"2018-07-27 14:46:40.000000000","message":"Done","commit_id":"a7b746b83b190fe50fc9e974086fa897b629ca74"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"36bead312b442b97bbeb9933530062d2b091ff3a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"Part of \"Increase Neutron RBAC Coverage\" initiative [1]"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[0] https://developer.openstack.org/api-ref/network/v2/index.html#segments"},{"line_number":14,"context_line":"[1] https://storyboard.openstack.org/#!/story/20026410"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I8eef0dcd5355d6212ead2bcb109f23ca0b613109"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"5f7c97a3_68c86b74","line":14,"range":{"start_line":14,"start_character":46,"end_line":14,"end_character":54},"updated":"2018-07-27 06:58:43.000000000","message":"2002641","commit_id":"a7b746b83b190fe50fc9e974086fa897b629ca74"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"790faa099873b50980f06319e260885e449542c0","unresolved":false,"context_lines":[{"line_number":11,"context_line":"Part of \"Increase Neutron RBAC Coverage\" initiative [1]"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"[0] https://developer.openstack.org/api-ref/network/v2/index.html#segments"},{"line_number":14,"context_line":"[1] https://storyboard.openstack.org/#!/story/20026410"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: I8eef0dcd5355d6212ead2bcb109f23ca0b613109"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":24,"id":"5f7c97a3_a419c776","line":14,"range":{"start_line":14,"start_character":46,"end_line":14,"end_character":54},"in_reply_to":"5f7c97a3_68c86b74","updated":"2018-07-27 14:46:40.000000000","message":"Done","commit_id":"a7b746b83b190fe50fc9e974086fa897b629ca74"},{"author":{"_account_id":17896,"name":"Rick Bartra","email":"rickbartra@microsoft.com","username":"rb560u"},"change_message_id":"4488c17f975173f330e4a1ddce5b74ccb1d9ed28","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add tests to cover segments"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This patch set adds tests to cver the neutron segments API [0]."},{"line_number":10,"context_line":"Test lists, gets, creates, updates, and deletes segments."},{"line_number":11,"context_line":"Part of \"Increase Neutron RBAC Coverage\" initiative [1]"},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":28,"id":"5f7c97a3_3307d6ca","line":9,"range":{"start_line":9,"start_character":29,"end_line":9,"end_character":33},"updated":"2018-08-02 02:18:19.000000000","message":"nit: cover","commit_id":"d067148212ef95b938af5edbec359fa49156ddee"}],"lower-constraints.txt":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e4caaafc05ce74efdcf961bdee27a69204d2ad63","unresolved":false,"context_lines":[{"line_number":82,"context_line":"urllib3\u003d\u003d1.22"},{"line_number":83,"context_line":"voluptuous\u003d\u003d0.11.1"},{"line_number":84,"context_line":"wrapt\u003d\u003d1.10.11"},{"line_number":85,"context_line":"neutron-tempest-plugin\u003d\u003d0.1.0"}],"source_content_type":"text/plain","patch_set":11,"id":"5f7c97a3_08647ce5","line":85,"range":{"start_line":85,"start_character":0,"end_line":85,"end_character":29},"updated":"2018-07-25 21:24:34.000000000","message":"See reasoning here: https://review.openstack.org/#/c/584977/11/requirements.txt","commit_id":"4d4deaa7c1c204a8848fb1c0cbdae05449c6d51a"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"af72d274e5db7d6687af9f13227b0ad81fdc7120","unresolved":false,"context_lines":[{"line_number":82,"context_line":"urllib3\u003d\u003d1.22"},{"line_number":83,"context_line":"voluptuous\u003d\u003d0.11.1"},{"line_number":84,"context_line":"wrapt\u003d\u003d1.10.11"},{"line_number":85,"context_line":"neutron-tempest-plugin\u003d\u003d0.1.0"}],"source_content_type":"text/plain","patch_set":11,"id":"5f7c97a3_23315bef","line":85,"range":{"start_line":85,"start_character":0,"end_line":85,"end_character":29},"in_reply_to":"5f7c97a3_08647ce5","updated":"2018-07-25 22:15:44.000000000","message":"Done","commit_id":"4d4deaa7c1c204a8848fb1c0cbdae05449c6d51a"}],"patrole_tempest_plugin/tests/api/network/rbac_base.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e4caaafc05ce74efdcf961bdee27a69204d2ad63","unresolved":false,"context_lines":[{"line_number":26,"context_line":"class BaseNetworkRbacTest(rbac_utils.RbacUtilsMixin,"},{"line_number":27,"context_line":"                          network_base.BaseNetworkTest):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    @classmethod"},{"line_number":30,"context_line":"    def get_client_manager(cls, credential_type\u003dNone, roles\u003dNone,"},{"line_number":31,"context_line":"                           force_new\u003dNone):"},{"line_number":32,"context_line":"        manager \u003d super(BaseNetworkRbacTest, cls).get_client_manager("},{"line_number":33,"context_line":"            credential_type\u003dcredential_type,"},{"line_number":34,"context_line":"            roles\u003droles,"},{"line_number":35,"context_line":"            force_new\u003dforce_new"},{"line_number":36,"context_line":"        )"},{"line_number":37,"context_line":"        # Make neutron-tempest-plugin clients avaliable"},{"line_number":38,"context_line":"        cls.ntp_client \u003d clients.Manager(manager.credentials).network_client"},{"line_number":39,"context_line":"        return manager"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @classmethod"},{"line_number":42,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_a84a2857","line":39,"range":{"start_line":29,"start_character":0,"end_line":39,"end_character":22},"updated":"2018-07-25 21:24:34.000000000","message":"We will have to follow a different pattern here. Please see this as an example: https://github.com/openstack/congress-tempest-plugin/blob/master/congress_tempest_plugin/tests/scenario/manager_congress.py#L85","commit_id":"4d4deaa7c1c204a8848fb1c0cbdae05449c6d51a"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"af72d274e5db7d6687af9f13227b0ad81fdc7120","unresolved":false,"context_lines":[{"line_number":26,"context_line":"class BaseNetworkRbacTest(rbac_utils.RbacUtilsMixin,"},{"line_number":27,"context_line":"                          network_base.BaseNetworkTest):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    @classmethod"},{"line_number":30,"context_line":"    def get_client_manager(cls, credential_type\u003dNone, roles\u003dNone,"},{"line_number":31,"context_line":"                           force_new\u003dNone):"},{"line_number":32,"context_line":"        manager \u003d super(BaseNetworkRbacTest, cls).get_client_manager("},{"line_number":33,"context_line":"            credential_type\u003dcredential_type,"},{"line_number":34,"context_line":"            roles\u003droles,"},{"line_number":35,"context_line":"            force_new\u003dforce_new"},{"line_number":36,"context_line":"        )"},{"line_number":37,"context_line":"        # Make neutron-tempest-plugin clients avaliable"},{"line_number":38,"context_line":"        cls.ntp_client \u003d clients.Manager(manager.credentials).network_client"},{"line_number":39,"context_line":"        return manager"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @classmethod"},{"line_number":42,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_635433fe","line":39,"range":{"start_line":29,"start_character":0,"end_line":39,"end_character":22},"in_reply_to":"5f7c97a3_a84a2857","updated":"2018-07-25 22:15:44.000000000","message":"Do you want me to move it elsewhere, or this place is fine, just change it to do \"import\" dynamically?","commit_id":"4d4deaa7c1c204a8848fb1c0cbdae05449c6d51a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ee34988cfc409df755eb14d3bd6ab94e3c971dac","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            raise cls.skipException(msg)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @classmethod"},{"line_number":51,"context_line":"    def is_neutron_tempest_plugin_avaliable(self):"},{"line_number":52,"context_line":"        try:"},{"line_number":53,"context_line":"            import neutron_tempest_plugin  # noqa"},{"line_number":54,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":27,"id":"5f7c97a3_762a8078","line":51,"range":{"start_line":51,"start_character":44,"end_line":51,"end_character":48},"updated":"2018-07-27 20:50:17.000000000","message":"nit: should be \u0027cls\u0027\n\nThis is a trivial thing and we can target in a follow up, don\u0027t think it\u0027s worth a respin.","commit_id":"f765e01497caecff39c016031c78a7aa20c28efa"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"45f2b94cf43782cf4ade95e5e208dd2fadc25d4c","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            raise cls.skipException(msg)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @classmethod"},{"line_number":51,"context_line":"    def is_neutron_tempest_plugin_avaliable(self):"},{"line_number":52,"context_line":"        try:"},{"line_number":53,"context_line":"            import neutron_tempest_plugin  # noqa"},{"line_number":54,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":27,"id":"5f7c97a3_d9c86521","line":51,"range":{"start_line":51,"start_character":44,"end_line":51,"end_character":48},"in_reply_to":"5f7c97a3_762a8078","updated":"2018-07-27 23:01:44.000000000","message":"Done","commit_id":"f765e01497caecff39c016031c78a7aa20c28efa"}],"patrole_tempest_plugin/tests/api/network/test_segments_rbac.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"6e2af599baac3cd371082ba642328bf0d4737eb5","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        super(SegmentsRbacTest, cls).resource_setup()"},{"line_number":36,"context_line":"        cls.network \u003d cls.create_network()"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"    def create_segment(self, network):"},{"line_number":39,"context_line":"        # Select unused segmentation_id to prevent usage conflict"},{"line_number":40,"context_line":"        segmentation_id \u003d 1000"},{"line_number":41,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_e0187984","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":22},"updated":"2018-07-23 18:58:36.000000000","message":"This needs to be a classmethod if you are using addClassResourceSetup (which is scoped at class level) else you need to change L54 to be: self.addCleanup","commit_id":"42bb5353481b49c0acbd5688e00ff51836cfa64c"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"981ed8d3bfd40d17aaddc2897e9d055a8a5fc7ff","unresolved":false,"context_lines":[{"line_number":45,"context_line":"                break"},{"line_number":46,"context_line":"            segmentation_id +\u003d 1"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        seg \u003d self.segments_client.create_segment("},{"line_number":49,"context_line":"            network_id\u003dnetwork[\u0027id\u0027], network_type\u003d\"gre\","},{"line_number":50,"context_line":"            segmentation_id\u003dsegmentation_id)"},{"line_number":51,"context_line":"        # Segment is used as part of Subnet created by BaseNetworkTest,"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_7b509c0a","line":48,"range":{"start_line":48,"start_character":19,"end_line":48,"end_character":34},"updated":"2018-07-24 01:26:55.000000000","message":"This segments_client doesn\u0027t exist in Tempest.","commit_id":"42bb5353481b49c0acbd5688e00ff51836cfa64c"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ef5e5f096ffdf4ec940446af5c0744b9ba757b13","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-1a3a-83c8-6eec2af08128\u0027)"},{"line_number":92,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":93,"context_line":"                                 rules\u003d[\"update_segment\"],"},{"line_number":94,"context_line":"                                 expected_error_codes\u003d[404])"},{"line_number":95,"context_line":"    def test_update_segment(self):"},{"line_number":96,"context_line":"        \"\"\"Update segment."},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_b1ccf0be","line":94,"range":{"start_line":94,"start_character":55,"end_line":94,"end_character":58},"updated":"2018-07-25 02:28:09.000000000","message":"update_segment API likely enforces \"get_segment\" policy \u003d\u003e 404 after which it probably enforces \"update_segment\" \u003d\u003e 403, but not entirely sure, need to confirm this.","commit_id":"af534bd23f2062409cc7ef184d95d14c39347deb"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"d90ee9792b551ba189afd44e780ae5343e18f504","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-1a3a-83c8-6eec2af08128\u0027)"},{"line_number":92,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":93,"context_line":"                                 rules\u003d[\"update_segment\"],"},{"line_number":94,"context_line":"                                 expected_error_codes\u003d[404])"},{"line_number":95,"context_line":"    def test_update_segment(self):"},{"line_number":96,"context_line":"        \"\"\"Update segment."},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_daf2d3e4","line":94,"range":{"start_line":94,"start_character":55,"end_line":94,"end_character":58},"in_reply_to":"5f7c97a3_b1ccf0be","updated":"2018-07-25 16:06:40.000000000","message":"Done","commit_id":"af534bd23f2062409cc7ef184d95d14c39347deb"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ef5e5f096ffdf4ec940446af5c0744b9ba757b13","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    @utils.requires_ext(extension\u003d\u0027segment\u0027, service\u003d\u0027network\u0027)"},{"line_number":107,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-1a3a-83c8-6eec2af08129\u0027)"},{"line_number":108,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":109,"context_line":"                                 rules\u003d[\"update_segment\"],"},{"line_number":110,"context_line":"                                 expected_error_codes\u003d[404])"},{"line_number":111,"context_line":"    def test_delete_segment(self):"},{"line_number":112,"context_line":"        \"\"\"Delete segment."}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_91c9b4ac","line":109,"range":{"start_line":109,"start_character":41,"end_line":109,"end_character":55},"updated":"2018-07-25 02:28:09.000000000","message":"This is delete_segment.","commit_id":"af534bd23f2062409cc7ef184d95d14c39347deb"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"d90ee9792b551ba189afd44e780ae5343e18f504","unresolved":false,"context_lines":[{"line_number":106,"context_line":"    @utils.requires_ext(extension\u003d\u0027segment\u0027, service\u003d\u0027network\u0027)"},{"line_number":107,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-1a3a-83c8-6eec2af08129\u0027)"},{"line_number":108,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":109,"context_line":"                                 rules\u003d[\"update_segment\"],"},{"line_number":110,"context_line":"                                 expected_error_codes\u003d[404])"},{"line_number":111,"context_line":"    def test_delete_segment(self):"},{"line_number":112,"context_line":"        \"\"\"Delete segment."}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_9afc5bb7","line":109,"range":{"start_line":109,"start_character":41,"end_line":109,"end_character":55},"in_reply_to":"5f7c97a3_91c9b4ac","updated":"2018-07-25 16:06:40.000000000","message":"Done","commit_id":"af534bd23f2062409cc7ef184d95d14c39347deb"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ef5e5f096ffdf4ec940446af5c0744b9ba757b13","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-1a3a-83c8-6eec2af08129\u0027)"},{"line_number":108,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":109,"context_line":"                                 rules\u003d[\"update_segment\"],"},{"line_number":110,"context_line":"                                 expected_error_codes\u003d[404])"},{"line_number":111,"context_line":"    def test_delete_segment(self):"},{"line_number":112,"context_line":"        \"\"\"Delete segment."},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_51bb1c0f","line":110,"range":{"start_line":110,"start_character":55,"end_line":110,"end_character":58},"updated":"2018-07-25 02:28:09.000000000","message":"See above.","commit_id":"af534bd23f2062409cc7ef184d95d14c39347deb"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"d90ee9792b551ba189afd44e780ae5343e18f504","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-1a3a-83c8-6eec2af08129\u0027)"},{"line_number":108,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":109,"context_line":"                                 rules\u003d[\"update_segment\"],"},{"line_number":110,"context_line":"                                 expected_error_codes\u003d[404])"},{"line_number":111,"context_line":"    def test_delete_segment(self):"},{"line_number":112,"context_line":"        \"\"\"Delete segment."},{"line_number":113,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"5f7c97a3_baf7d7d1","line":110,"range":{"start_line":110,"start_character":55,"end_line":110,"end_character":58},"in_reply_to":"5f7c97a3_51bb1c0f","updated":"2018-07-25 16:06:40.000000000","message":"Done","commit_id":"af534bd23f2062409cc7ef184d95d14c39347deb"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e4caaafc05ce74efdcf961bdee27a69204d2ad63","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    @utils.requires_ext(extension\u003d\u0027segment\u0027, service\u003d\u0027network\u0027)"},{"line_number":64,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-1a3a-83c8-6eec2af08126\u0027)"},{"line_number":65,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":66,"context_line":"                                 rules\u003d[\"create_segment\"])"},{"line_number":67,"context_line":"    def test_create_segment(self):"},{"line_number":68,"context_line":"        \"\"\"Create segment."},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_4803540d","line":66,"updated":"2018-07-25 21:24:34.000000000","message":"This one is good to go.","commit_id":"4d4deaa7c1c204a8848fb1c0cbdae05449c6d51a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e4caaafc05ce74efdcf961bdee27a69204d2ad63","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    @utils.requires_ext(extension\u003d\u0027segment\u0027, service\u003d\u0027network\u0027)"},{"line_number":76,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-1a3a-83c8-6eec2af08127\u0027)"},{"line_number":77,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":78,"context_line":"                                 rules\u003d[\"get_segment\"])"},{"line_number":79,"context_line":"    def test_show_segment(self):"},{"line_number":80,"context_line":"        \"\"\"Show segment."},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_a8fc680b","line":78,"updated":"2018-07-25 21:24:34.000000000","message":"expected_error_codes\u003d[404]","commit_id":"4d4deaa7c1c204a8848fb1c0cbdae05449c6d51a"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"af72d274e5db7d6687af9f13227b0ad81fdc7120","unresolved":false,"context_lines":[{"line_number":75,"context_line":"    @utils.requires_ext(extension\u003d\u0027segment\u0027, service\u003d\u0027network\u0027)"},{"line_number":76,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-1a3a-83c8-6eec2af08127\u0027)"},{"line_number":77,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":78,"context_line":"                                 rules\u003d[\"get_segment\"])"},{"line_number":79,"context_line":"    def test_show_segment(self):"},{"line_number":80,"context_line":"        \"\"\"Show segment."},{"line_number":81,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_e3584326","line":78,"in_reply_to":"5f7c97a3_a8fc680b","updated":"2018-07-25 22:15:44.000000000","message":"I have to dig thru this `dynamic` client, but it\u0027s actually throw correct exceptions:\n\n    2018-07-25 17:13:02,394 24448 ERROR    [patrole_tempest_plugin.rbac_rule_validation] Expected and actual exceptions do not match. Expected: \u003cclass \u0027tempest.lib.exceptions.NotFound\u0027\u003e. Actual: \u003cclass \u0027tempest.lib.exceptions.Forbidden\u0027\u003e.","commit_id":"4d4deaa7c1c204a8848fb1c0cbdae05449c6d51a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e4caaafc05ce74efdcf961bdee27a69204d2ad63","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    @utils.requires_ext(extension\u003d\u0027segment\u0027, service\u003d\u0027network\u0027)"},{"line_number":90,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-1a3a-83c8-6eec2af08128\u0027)"},{"line_number":91,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":92,"context_line":"                                 rules\u003d[\"get_segment\","},{"line_number":93,"context_line":"                                        \"update_segment\"])"},{"line_number":94,"context_line":"    def test_update_segment(self):"},{"line_number":95,"context_line":"        \"\"\"Update segment."}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_edfcb20e","line":92,"updated":"2018-07-25 21:24:34.000000000","message":"We need to include expected_error_codes\u003d[404, 403] here.","commit_id":"4d4deaa7c1c204a8848fb1c0cbdae05449c6d51a"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"af72d274e5db7d6687af9f13227b0ad81fdc7120","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    @utils.requires_ext(extension\u003d\u0027segment\u0027, service\u003d\u0027network\u0027)"},{"line_number":90,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-1a3a-83c8-6eec2af08128\u0027)"},{"line_number":91,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":92,"context_line":"                                 rules\u003d[\"get_segment\","},{"line_number":93,"context_line":"                                        \"update_segment\"])"},{"line_number":94,"context_line":"    def test_update_segment(self):"},{"line_number":95,"context_line":"        \"\"\"Update segment."}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_a3980bcb","line":92,"in_reply_to":"5f7c97a3_edfcb20e","updated":"2018-07-25 22:15:44.000000000","message":"See above","commit_id":"4d4deaa7c1c204a8848fb1c0cbdae05449c6d51a"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e4caaafc05ce74efdcf961bdee27a69204d2ad63","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    @utils.requires_ext(extension\u003d\u0027segment\u0027, service\u003d\u0027network\u0027)"},{"line_number":106,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-1a3a-83c8-6eec2af08129\u0027)"},{"line_number":107,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":108,"context_line":"                                 rules\u003d[\"get_segment\","},{"line_number":109,"context_line":"                                        \"delete_segment\"])"},{"line_number":110,"context_line":"    def test_delete_segment(self):"},{"line_number":111,"context_line":"        \"\"\"Delete segment."}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_2d038a13","line":108,"updated":"2018-07-25 21:24:34.000000000","message":"We need to include expected_error_codes\u003d[404, 403] here.","commit_id":"4d4deaa7c1c204a8848fb1c0cbdae05449c6d51a"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"af72d274e5db7d6687af9f13227b0ad81fdc7120","unresolved":false,"context_lines":[{"line_number":105,"context_line":"    @utils.requires_ext(extension\u003d\u0027segment\u0027, service\u003d\u0027network\u0027)"},{"line_number":106,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-1a3a-83c8-6eec2af08129\u0027)"},{"line_number":107,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":108,"context_line":"                                 rules\u003d[\"get_segment\","},{"line_number":109,"context_line":"                                        \"delete_segment\"])"},{"line_number":110,"context_line":"    def test_delete_segment(self):"},{"line_number":111,"context_line":"        \"\"\"Delete segment."}],"source_content_type":"text/x-python","patch_set":11,"id":"5f7c97a3_439fb7b2","line":108,"in_reply_to":"5f7c97a3_2d038a13","updated":"2018-07-25 22:15:44.000000000","message":"See above","commit_id":"4d4deaa7c1c204a8848fb1c0cbdae05449c6d51a"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"a68eddcf892a5f6713db06915008dcb24f0f916d","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            msg \u003d \"segment extension not enabled.\""},{"line_number":31,"context_line":"            raise cls.skipException(msg)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        try:"},{"line_number":34,"context_line":"            import neutron_tempest_plugin"},{"line_number":35,"context_line":"        except ImportError:"},{"line_number":36,"context_line":"            msg \u003d (\"Segments client avaliable in neutron-tempest-plugin, \""},{"line_number":37,"context_line":"                   \"but its not installed.\")"},{"line_number":38,"context_line":"            raise cls.skipException(msg)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def resource_setup(cls):"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_b5f90e50","line":38,"range":{"start_line":33,"start_character":0,"end_line":38,"end_character":40},"updated":"2018-07-26 15:50:59.000000000","message":"I don\u0027t like this part. But cls.ntp_client not yet initialized on this step. Should we move it as a separate function, since it will be used in every test that uses neutron-tempest-plugin clients. Also, I think we will have some tests that use it mixed in the same test class with one that does not. So decorator may be a good idea.","commit_id":"5de1fdb83157773e0eee12c5af18fba102b833f5"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"45040e7b8cf977c971a79783af0e357db9b3e466","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            msg \u003d \"segment extension not enabled.\""},{"line_number":31,"context_line":"            raise cls.skipException(msg)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        try:"},{"line_number":34,"context_line":"            import neutron_tempest_plugin"},{"line_number":35,"context_line":"        except ImportError:"},{"line_number":36,"context_line":"            msg \u003d (\"Segments client avaliable in neutron-tempest-plugin, \""},{"line_number":37,"context_line":"                   \"but its not installed.\")"},{"line_number":38,"context_line":"            raise cls.skipException(msg)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def resource_setup(cls):"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_29ba83df","line":38,"range":{"start_line":33,"start_character":0,"end_line":38,"end_character":40},"in_reply_to":"5f7c97a3_43eb20dc","updated":"2018-07-26 18:29:01.000000000","message":"\u003e BaseNetworkPluginRbacTest\nLove it. Done.\n\n\u003e such that it is in one place only\nWe have tests like https://review.openstack.org/#/c/582388/ where we have same time tests that are using tempest and tests that will be using neutron-tempest-plugin.\n\nWhat my concern here, is if we move logic to single skip_cheks, we will need to split subnet tests into 2 different test classes (or removing super from skip_check, and adding decorators same time). Just want to ensure that it is what you intended.","commit_id":"5de1fdb83157773e0eee12c5af18fba102b833f5"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"d77e414930419243f251268d86a7ac3f4b9a4c82","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            msg \u003d \"segment extension not enabled.\""},{"line_number":31,"context_line":"            raise cls.skipException(msg)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        try:"},{"line_number":34,"context_line":"            import neutron_tempest_plugin"},{"line_number":35,"context_line":"        except ImportError:"},{"line_number":36,"context_line":"            msg \u003d (\"Segments client avaliable in neutron-tempest-plugin, \""},{"line_number":37,"context_line":"                   \"but its not installed.\")"},{"line_number":38,"context_line":"            raise cls.skipException(msg)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def resource_setup(cls):"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_43eb20dc","line":38,"range":{"start_line":33,"start_character":0,"end_line":38,"end_character":40},"in_reply_to":"5f7c97a3_9883e7aa","updated":"2018-07-26 17:04:39.000000000","message":"Good point. Another way is to just subclass BaseNetworkRbacTest with something like BaseNetworkPluginRbacTest then move this to the skip_checks there, such that it is in one place only, and then inherit SegmentsRbacTest from BaseNetworkPluginRbacTest.\n\nBut certainly a function like above would potentially be useful as a helper.","commit_id":"5de1fdb83157773e0eee12c5af18fba102b833f5"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"a56c7e5aafad17688e254795039a33bc3e942f29","unresolved":false,"context_lines":[{"line_number":30,"context_line":"            msg \u003d \"segment extension not enabled.\""},{"line_number":31,"context_line":"            raise cls.skipException(msg)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"        try:"},{"line_number":34,"context_line":"            import neutron_tempest_plugin"},{"line_number":35,"context_line":"        except ImportError:"},{"line_number":36,"context_line":"            msg \u003d (\"Segments client avaliable in neutron-tempest-plugin, \""},{"line_number":37,"context_line":"                   \"but its not installed.\")"},{"line_number":38,"context_line":"            raise cls.skipException(msg)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def resource_setup(cls):"}],"source_content_type":"text/x-python","patch_set":15,"id":"5f7c97a3_9883e7aa","line":38,"range":{"start_line":33,"start_character":0,"end_line":38,"end_character":40},"in_reply_to":"5f7c97a3_b5f90e50","updated":"2018-07-26 16:33:51.000000000","message":"What if we expand BaseNetworkRbacTest with:\n\n```\n    @classmethod\n    def is_neutron_tempest_plugin_avaliable(self):\n        # Some neutron clients avaliable only in:\n        # neutron_tempest_plugin.api.clients\n        try:\n            import neutron_tempest_plugin\n            return True\n        except ImportError:\n            return False\n\n    @staticmethod\n    def neutron_tempest_plugin_required(fn):\n        @functools.wraps(fn)\n        def wrapper(*args, **kwargs):\n            if BaseNetworkRbacTest.is_neutron_tempest_plugin_avaliable():\n                fn(*args, **kwargs)\n            else:\n                msg \u003d (\"neutron-tempest-plugin not installed.\")\n                BaseNetworkRbacTest.skipException(msg)\n        return wrapper\n```\n\nSo here we can just call:\n\n\u003e cls.is_neutron_tempest_plugin_avaliable()\n\nand decorate tests with\n\n\u003e BaseNetworkRbacTest. neutron_tempest_plugin_required \n\nwhen needed?","commit_id":"5de1fdb83157773e0eee12c5af18fba102b833f5"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ab03e97731aae6a31f8afa61efd5de3b881d1cf3","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from patrole_tempest_plugin.tests.api.network import rbac_base as base"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class SegmentsRbacTest(base.BaseNetworkPluginRbacTest):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @classmethod"},{"line_number":27,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_311c29c1","line":24,"range":{"start_line":24,"start_character":14,"end_line":24,"end_character":22},"updated":"2018-07-26 22:59:11.000000000","message":"PluginRbacTest","commit_id":"7e09f75f50f28d1207b667da70dd113518e0a438"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"e7d8a18efed2246071489bce52ce86cca5452fd9","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from patrole_tempest_plugin.tests.api.network import rbac_base as base"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class SegmentsRbacTest(base.BaseNetworkPluginRbacTest):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @classmethod"},{"line_number":27,"context_line":"    def skip_checks(cls):"}],"source_content_type":"text/x-python","patch_set":20,"id":"5f7c97a3_cc6d18cc","line":24,"range":{"start_line":24,"start_character":14,"end_line":24,"end_character":22},"in_reply_to":"5f7c97a3_311c29c1","updated":"2018-07-27 00:06:09.000000000","message":"Done","commit_id":"7e09f75f50f28d1207b667da70dd113518e0a438"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"36bead312b442b97bbeb9933530062d2b091ff3a","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        return seg"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    @utils.requires_ext(extension\u003d\u0027segment\u0027, service\u003d\u0027network\u0027)"},{"line_number":64,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-1a3a-83c8-6eec2af08126\u0027)"},{"line_number":65,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":66,"context_line":"                                 rules\u003d[\"create_segment\"])"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_e8d31b36","line":63,"range":{"start_line":63,"start_character":4,"end_line":63,"end_character":63},"updated":"2018-07-27 06:58:43.000000000","message":"nit: these decorators are redundant with L29 because requires_ext is really just a wrapper around is_extension_enabled, ditto below","commit_id":"a7b746b83b190fe50fc9e974086fa897b629ca74"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"790faa099873b50980f06319e260885e449542c0","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"        return seg"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    @utils.requires_ext(extension\u003d\u0027segment\u0027, service\u003d\u0027network\u0027)"},{"line_number":64,"context_line":"    @decorators.idempotent_id(\u0027c02618e7-bb20-1a3a-83c8-6eec2af08126\u0027)"},{"line_number":65,"context_line":"    @rbac_rule_validation.action(service\u003d\"neutron\","},{"line_number":66,"context_line":"                                 rules\u003d[\"create_segment\"])"}],"source_content_type":"text/x-python","patch_set":24,"id":"5f7c97a3_b1326b0d","line":63,"range":{"start_line":63,"start_character":4,"end_line":63,"end_character":63},"in_reply_to":"5f7c97a3_e8d31b36","updated":"2018-07-27 14:46:40.000000000","message":"Done","commit_id":"a7b746b83b190fe50fc9e974086fa897b629ca74"}],"releasenotes/notes/add-neutron-tempest-plugin-clients-c031e232021b390c.yaml":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"a64568a3ee6319092bb7ed813b50248eaed5093b","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    In order to strive toward complete test coverage for the services it "},{"line_number":5,"context_line":"    tests, Patrole now offers RBAC coverage for the APIs included in "},{"line_number":6,"context_line":"    neutron-tempest-plugin. If this plugin is not installed or enabled, then "},{"line_number":7,"context_line":"    Patrole will skip those tests."}],"source_content_type":"text/x-yaml","patch_set":15,"id":"5f7c97a3_3ef87b48","line":5,"updated":"2018-07-26 18:02:04.000000000","message":"These whitespaces should be cleaned up","commit_id":"5de1fdb83157773e0eee12c5af18fba102b833f5"}],"requirements.txt":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"e4caaafc05ce74efdcf961bdee27a69204d2ad63","unresolved":false,"context_lines":[{"line_number":7,"context_line":"oslo.policy\u003e\u003d1.30.0 # Apache-2.0"},{"line_number":8,"context_line":"tempest\u003e\u003d17.1.0 # Apache-2.0"},{"line_number":9,"context_line":"stevedore\u003e\u003d1.20.0 # Apache-2.0"},{"line_number":10,"context_line":"neutron-tempest-plugin\u003e\u003d0.1.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":11,"id":"5f7c97a3_486a74b5","line":10,"updated":"2018-07-25 21:24:34.000000000","message":"Also note that https://github.com/openstack/congress-tempest-plugin doesn\u0027t add a hard dependency on mistral-tempest-plugin which it uses. It simply uses a try/catch in essence to check whether the plugin is available before trying to initialize the client manager for it.\n\nSo we should remove this here.","commit_id":"4d4deaa7c1c204a8848fb1c0cbdae05449c6d51a"},{"author":{"_account_id":16274,"name":"Mykola Yakovliev","email":"VegasQ@gmail.com","username":"vegasq"},"change_message_id":"af72d274e5db7d6687af9f13227b0ad81fdc7120","unresolved":false,"context_lines":[{"line_number":7,"context_line":"oslo.policy\u003e\u003d1.30.0 # Apache-2.0"},{"line_number":8,"context_line":"tempest\u003e\u003d17.1.0 # Apache-2.0"},{"line_number":9,"context_line":"stevedore\u003e\u003d1.20.0 # Apache-2.0"},{"line_number":10,"context_line":"neutron-tempest-plugin\u003e\u003d0.1.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":11,"id":"5f7c97a3_23a4fb04","line":10,"in_reply_to":"5f7c97a3_486a74b5","updated":"2018-07-25 22:15:44.000000000","message":"Done","commit_id":"4d4deaa7c1c204a8848fb1c0cbdae05449c6d51a"}]}
