)]}'
{"patrole_tempest_plugin/tests/api/identity/v2/rbac_base.py":[{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"6da81f7411601c30a74f06b753c9376161f7d83a","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from tempest.api.identity import base as base"},{"line_number":17,"context_line":"from tempest import config"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from tempest.lib.common.utils import data_utils"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a461143_5a6fd4c4","line":16,"range":{"start_line":16,"start_character":26,"end_line":16,"end_character":45},"updated":"2017-01-27 18:34:41.000000000","message":"Why did you import it as it\u0027s own name?","commit_id":"cdf3a90c6d843f9c49e410377b7800d147043acb"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"aecbb37fe5649a94feb60e2bc17a6032e3784c17","unresolved":false,"context_lines":[{"line_number":13,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from tempest.api.identity import base"},{"line_number":17,"context_line":"from tempest import config"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from tempest.lib.common.utils import data_utils"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"CONF \u003d config.CONF"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_f8014c6b","line":19,"range":{"start_line":16,"start_character":0,"end_line":19,"end_character":47},"updated":"2017-01-30 16:02:43.000000000","message":"Please put related imports together.","commit_id":"9630bab90ae4b044f6c80848298e902f8422c394"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"aecbb37fe5649a94feb60e2bc17a6032e3784c17","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        cls.auth_provider \u003d cls.os.auth_provider"},{"line_number":42,"context_line":"        cls.admin_client \u003d cls.os_adm.identity_client"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _create_service(self):"},{"line_number":45,"context_line":"        name \u003d data_utils.rand_name(\u0027service\u0027)"},{"line_number":46,"context_line":"        type \u003d data_utils.rand_name(\u0027type\u0027)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        service_id \u003d self.services_client.create_service("},{"line_number":49,"context_line":"            name\u003dname, type\u003dtype,"},{"line_number":50,"context_line":"            description\u003d\"description\")[\u0027OS-KSADM:service\u0027][\u0027id\u0027]"},{"line_number":51,"context_line":"        self.addCleanup(self.services_client.delete_service, service_id)"},{"line_number":52,"context_line":"        return service_id"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_1115ff47","line":52,"range":{"start_line":44,"start_character":4,"end_line":52,"end_character":25},"updated":"2017-01-30 16:02:43.000000000","message":"Is this going to be called in more tests?  If not it should be moved.  (I\u0027m honestly not sure, feel free to ignore this comment if this method will be re-used)","commit_id":"9630bab90ae4b044f6c80848298e902f8422c394"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"3ce0b5c9c41a7d168f617118a6c1a56c6f6782f3","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        cls.auth_provider \u003d cls.os.auth_provider"},{"line_number":42,"context_line":"        cls.admin_client \u003d cls.os_adm.identity_client"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def _create_service(self):"},{"line_number":45,"context_line":"        name \u003d data_utils.rand_name(\u0027service\u0027)"},{"line_number":46,"context_line":"        type \u003d data_utils.rand_name(\u0027type\u0027)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        service_id \u003d self.services_client.create_service("},{"line_number":49,"context_line":"            name\u003dname, type\u003dtype,"},{"line_number":50,"context_line":"            description\u003d\"description\")[\u0027OS-KSADM:service\u0027][\u0027id\u0027]"},{"line_number":51,"context_line":"        self.addCleanup(self.services_client.delete_service, service_id)"},{"line_number":52,"context_line":"        return service_id"}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_3232fa5f","line":52,"range":{"start_line":44,"start_character":4,"end_line":52,"end_character":25},"in_reply_to":"3a461143_1115ff47","updated":"2017-01-30 17:49:09.000000000","message":"haha third times the charm.. yup its used by more than 2 files","commit_id":"9630bab90ae4b044f6c80848298e902f8422c394"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"545f71c726bd1f177569f59ccf7d27fc69858cec","unresolved":false,"context_lines":[{"line_number":20,"context_line":"CONF \u003d config.CONF"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class BaseIdentityV2RbacTest(base.BaseIdentityV2AdminTest):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    credentials \u003d [\u0027primary\u0027, \u0027admin\u0027]"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_c17f22a9","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":59},"updated":"2017-01-30 18:56:46.000000000","message":"If this is going to be an admin base class, it should have admin in the name to indicate this.","commit_id":"f145281cd4aa7cdde331ae96013222924cf96183"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"a66d874bb95e91f05d06b07317c02716fc7a1a96","unresolved":false,"context_lines":[{"line_number":20,"context_line":"CONF \u003d config.CONF"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class BaseIdentityV2RbacTest(base.BaseIdentityV2AdminTest):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    credentials \u003d [\u0027primary\u0027, \u0027admin\u0027]"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_2ec97cac","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":59},"in_reply_to":"3a461143_4ce609b1","updated":"2017-01-31 23:43:01.000000000","message":"So I had an extended discussion with Doug and Cliff about RBAC today. From what I got out of it, my understanding is that the nonadmin tests in identity as of now are just redundant code that Cliff feels like is just fine to delete (same client is called and the test code is essentially the same) so ill go ahead and change the name for this to admin","commit_id":"f145281cd4aa7cdde331ae96013222924cf96183"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"6accfc650e2c7c4dfb599cef084af3448369b610","unresolved":false,"context_lines":[{"line_number":20,"context_line":"CONF \u003d config.CONF"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class BaseIdentityV2RbacTest(base.BaseIdentityV2AdminTest):"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    credentials \u003d [\u0027primary\u0027, \u0027admin\u0027]"},{"line_number":26,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_4ce609b1","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":59},"in_reply_to":"3a461143_c17f22a9","updated":"2017-01-30 21:47:18.000000000","message":"just to clarify: so theres only 1 non admin test for v2 (tenant list) https://developer.openstack.org/api-ref/identity/v2/?expanded\u003dlist-tenants-detail So make base classes for admin and nonadmin each?","commit_id":"f145281cd4aa7cdde331ae96013222924cf96183"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"fd7234edf4a9e5961a7fbbde244aca6de2813161","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        cls.auth_provider \u003d cls.os.auth_provider"},{"line_number":41,"context_line":"        cls.admin_client \u003d cls.os_adm.identity_client"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @classmethod"},{"line_number":44,"context_line":"    def _create_service(cls):"},{"line_number":45,"context_line":"        name \u003d data_utils.rand_name(\u0027service\u0027)"},{"line_number":46,"context_line":"        type \u003d data_utils.rand_name(\u0027type\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_a6714c78","line":43,"range":{"start_line":43,"start_character":4,"end_line":43,"end_character":16},"updated":"2017-01-30 18:13:12.000000000","message":"went about the second approach I talked about. left it in the base and made it a class method / moved the addCleanup to teardown to prevent resource leaks. I don\u0027t feel confident that this would be best practice though. feel free to let me know any alternative ways if there are any.","commit_id":"f145281cd4aa7cdde331ae96013222924cf96183"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"8447387a697e5c030c1ca05c16bfb48fb0b6827c","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        cls.auth_provider \u003d cls.os.auth_provider"},{"line_number":41,"context_line":"        cls.admin_client \u003d cls.os_adm.identity_client"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @classmethod"},{"line_number":44,"context_line":"    def _create_service(cls):"},{"line_number":45,"context_line":"        name \u003d data_utils.rand_name(\u0027service\u0027)"},{"line_number":46,"context_line":"        type \u003d data_utils.rand_name(\u0027type\u0027)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        service_id \u003d cls.services_client.create_service("},{"line_number":49,"context_line":"            name\u003dname, type\u003dtype,"},{"line_number":50,"context_line":"            description\u003d\"description\")[\u0027OS-KSADM:service\u0027][\u0027id\u0027]"},{"line_number":51,"context_line":"        return service_id"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_ca816f4f","line":51,"range":{"start_line":43,"start_character":4,"end_line":51,"end_character":25},"updated":"2017-02-02 19:52:35.000000000","message":"Methods like this should include an addCleanup call where possible.  Calling addCleanup immediately after the resource is created helps minimize the chance that it will be forgotten in later tests.","commit_id":"d6f3049bf018487e0a149fc2e8694b6bd150ae33"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"b81366bf9795c100afe1091dd7946e319aa121fc","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.service_id \u003d self.services_client.create_service("},{"line_number":48,"context_line":"            name\u003dname, type\u003dtype,"},{"line_number":49,"context_line":"            description\u003d\"description\")[\u0027OS-KSADM:service\u0027][\u0027id\u0027]"},{"line_number":50,"context_line":"        self.addCleanup(self.services_client.delete_service, self.service_id)"},{"line_number":51,"context_line":"        return self.service_id"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a461143_73d87280","line":50,"range":{"start_line":50,"start_character":8,"end_line":50,"end_character":77},"updated":"2017-02-02 21:11:54.000000000","message":"self.addCleanup(test_utils.call_and_ignore_notfound_exc, self.services_client.delete_service, self.service_id)\n\nBy adding test_utils.call_and_ignore_notfound_exc, you ensure that this works even during a test_delete method, to avoid a \"not found\" exception from being thrown, in case the deletion inside the test method was executed.","commit_id":"574fceebaf869beed8067eaa0a200d769531c5d5"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"585e13234d05af1dbcfa36cd5095cc9c884d0f66","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        cls.admin_client \u003d cls.os_adm.identity_client"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"},{"line_number":45,"context_line":"    def _create_service(cls):"},{"line_number":46,"context_line":"        name \u003d data_utils.rand_name(\u0027service\u0027)"},{"line_number":47,"context_line":"        type \u003d data_utils.rand_name(\u0027type\u0027)"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a430d35_ee325ba6","line":45,"updated":"2017-02-07 19:38:09.000000000","message":"Why was cleanup removed from this function?","commit_id":"eaed83a24d54f13b8f875910faafb32063926b8d"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"59becd3b8d51b9f1a7b93bc206f721c769671e2c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        cls.admin_client \u003d cls.os_adm.identity_client"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"},{"line_number":45,"context_line":"    def _create_service(cls):"},{"line_number":46,"context_line":"        name \u003d data_utils.rand_name(\u0027service\u0027)"},{"line_number":47,"context_line":"        type \u003d data_utils.rand_name(\u0027type\u0027)"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a430d35_b467c2b5","line":45,"in_reply_to":"1a430d35_9904bf18","updated":"2017-02-07 20:39:30.000000000","message":"i explained a little more on david\u0027s comment on test_endpoints_rbac if that makes sense","commit_id":"eaed83a24d54f13b8f875910faafb32063926b8d"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"5dd2b796e77b7ae161d64c98ed26aa5e537b5e08","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        cls.admin_client \u003d cls.os_adm.identity_client"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"},{"line_number":45,"context_line":"    def _create_service(cls):"},{"line_number":46,"context_line":"        name \u003d data_utils.rand_name(\u0027service\u0027)"},{"line_number":47,"context_line":"        type \u003d data_utils.rand_name(\u0027type\u0027)"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"1a430d35_9904bf18","line":45,"in_reply_to":"1a430d35_ee325ba6","updated":"2017-02-07 20:37:33.000000000","message":"its a classmethod called in resource_setup and is cleaned up in resource_cleanup.","commit_id":"eaed83a24d54f13b8f875910faafb32063926b8d"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"3ce5b316a34cc878360b4fb14a7023c724540831","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        cls.auth_provider \u003d cls.os.auth_provider"},{"line_number":41,"context_line":"        cls.admin_client \u003d cls.os_adm.identity_client"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @classmethod"},{"line_number":44,"context_line":"    def _create_service(cls):"},{"line_number":45,"context_line":"        name \u003d data_utils.rand_name(\u0027service\u0027)"},{"line_number":46,"context_line":"        type \u003d data_utils.rand_name(\u0027type\u0027)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        cls.service \u003d cls.services_client.create_service("},{"line_number":49,"context_line":"            name\u003dname, type\u003dtype,"},{"line_number":50,"context_line":"            description\u003d\"description\")"},{"line_number":51,"context_line":"        return cls.service"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a430d35_ebe5e8a3","line":51,"range":{"start_line":43,"start_character":4,"end_line":51,"end_character":26},"updated":"2017-02-07 22:11:37.000000000","message":"This should not be a class method.  This should have addCleanup.  You can see examples of what it should look like here: https://github.com/openstack/tempest/blob/master/tempest/api/identity/base.py","commit_id":"e7cee21e472906d2d1f06f49004027d0cb1884f1"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"dc28b7a2d1b7999a100df4dd0dd79d7a7c537a13","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        cls.auth_provider \u003d cls.os.auth_provider"},{"line_number":41,"context_line":"        cls.admin_client \u003d cls.os_adm.identity_client"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @classmethod"},{"line_number":44,"context_line":"    def _create_service(cls):"},{"line_number":45,"context_line":"        name \u003d data_utils.rand_name(\u0027service\u0027)"},{"line_number":46,"context_line":"        type \u003d data_utils.rand_name(\u0027type\u0027)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        cls.service \u003d cls.services_client.create_service("},{"line_number":49,"context_line":"            name\u003dname, type\u003dtype,"},{"line_number":50,"context_line":"            description\u003d\"description\")"},{"line_number":51,"context_line":"        return cls.service"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a430d35_4176ddd7","line":51,"range":{"start_line":43,"start_character":4,"end_line":51,"end_character":26},"in_reply_to":"1a430d35_1e435043","updated":"2017-02-07 23:36:47.000000000","message":"If you\u0027d like to do it that way (as a classmethod) that can also work.  Is this method going to be called by several other tests?  If you think it will, I\u0027d recommend creating a list of services that are then all cleaned up by the resource_cleanup method of this class.  I think the Neutron baseclass is a good example of this.  https://github.com/openstack/tempest/blob/master/tempest/api/network/base.py#L121.  Does that seem reasonable?","commit_id":"e7cee21e472906d2d1f06f49004027d0cb1884f1"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"b8f71f89c7d633a13832d7683b5a54fd124dceec","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        cls.auth_provider \u003d cls.os.auth_provider"},{"line_number":41,"context_line":"        cls.admin_client \u003d cls.os_adm.identity_client"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @classmethod"},{"line_number":44,"context_line":"    def _create_service(cls):"},{"line_number":45,"context_line":"        name \u003d data_utils.rand_name(\u0027service\u0027)"},{"line_number":46,"context_line":"        type \u003d data_utils.rand_name(\u0027type\u0027)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        cls.service \u003d cls.services_client.create_service("},{"line_number":49,"context_line":"            name\u003dname, type\u003dtype,"},{"line_number":50,"context_line":"            description\u003d\"description\")"},{"line_number":51,"context_line":"        return cls.service"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a430d35_0331fd59","line":51,"range":{"start_line":43,"start_character":4,"end_line":51,"end_character":26},"in_reply_to":"1a430d35_4176ddd7","updated":"2017-02-09 03:13:55.000000000","message":"As mentioned here: I2cbace6b0face2dda2b75b6c36e5252968145b17 I think that we should be able to reach a consensus on the best way to create services (as a test case or test class level resource).  I don\u0027t have a strong opinion one way or the other, I just don\u0027t see any reason not to come to the same conclusion on both api versions.","commit_id":"e7cee21e472906d2d1f06f49004027d0cb1884f1"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"a308586676a8a7496cb43310d70378c7f39527bc","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        cls.auth_provider \u003d cls.os.auth_provider"},{"line_number":41,"context_line":"        cls.admin_client \u003d cls.os_adm.identity_client"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @classmethod"},{"line_number":44,"context_line":"    def _create_service(cls):"},{"line_number":45,"context_line":"        name \u003d data_utils.rand_name(\u0027service\u0027)"},{"line_number":46,"context_line":"        type \u003d data_utils.rand_name(\u0027type\u0027)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        cls.service \u003d cls.services_client.create_service("},{"line_number":49,"context_line":"            name\u003dname, type\u003dtype,"},{"line_number":50,"context_line":"            description\u003d\"description\")"},{"line_number":51,"context_line":"        return cls.service"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a430d35_1e435043","line":51,"range":{"start_line":43,"start_character":4,"end_line":51,"end_character":26},"in_reply_to":"1a430d35_ebe5e8a3","updated":"2017-02-07 22:18:32.000000000","message":"So this takes the approach of the example below in the same file:\nhttps://github.com/openstack/tempest/blob/master/tempest/api/identity/base.py#L216\nThe only difference is it needs to be deleted at a class level instead of having it added tot Cleanup which is invoked after every testmethod. But this would mean reverting back to patchset 15.","commit_id":"e7cee21e472906d2d1f06f49004027d0cb1884f1"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f741c8ce5f30cb48ccd99f5ccf2d1ac3e4a15cbb","unresolved":false,"context_lines":[{"line_number":21,"context_line":"CONF \u003d config.CONF"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class BaseIdentityV2AdminRbacTest(base.BaseIdentityV2AdminTest):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    credentials \u003d [\u0027primary\u0027, \u0027admin\u0027]"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"fa31d9ce_d72bdc2e","line":24,"range":{"start_line":24,"start_character":0,"end_line":24,"end_character":64},"updated":"2017-02-10 18:38:19.000000000","message":"The v2 endpoint doesn\u0027t support REST for services or endpoints; in fact, the v2 endpoint is deprecated: https://developer.openstack.org/api-ref/identity/v2/index.html\n\nI would recommend changing the name of these classes to V3.","commit_id":"d28b84e81ec4a1c1cc6a3ed0d07dbd34946c6222"}],"patrole_tempest_plugin/tests/api/identity/v2/test_endpoints_rbac.py":[{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"eb4ff1a99d99a2ef317fc4880cf8b52621247740","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        RBAC test for Identity Admin 2.0 create_endpoint"},{"line_number":46,"context_line":"        \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        service_id \u003d self._create_service()"},{"line_number":49,"context_line":"        region \u003d data_utils.rand_name(\u0027region\u0027)"},{"line_number":50,"context_line":"        public_url \u003d data_utils.rand_url()"},{"line_number":51,"context_line":"        admin_url \u003d data_utils.rand_url()"},{"line_number":52,"context_line":"        internal_url \u003d data_utils.rand_url()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":55,"context_line":"        self.endpoints_client.create_endpoint("}],"source_content_type":"text/x-python","patch_set":3,"id":"3a461143_22d2da5c","line":52,"range":{"start_line":48,"start_character":1,"end_line":52,"end_character":44},"updated":"2017-01-27 22:18:04.000000000","message":"so for these.. I\u0027ve gotten a comment that I shouldn\u0027t leave them as variables in the test class itself, so I moved them inside each tests themselves to give them more isolation. I could make a new method for generating these but it probably is overkill","commit_id":"cb1f484aabe0771ca7bc39db9fc2a98829700a90"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"c7c6091d82c2d616cd3b4d31ee91e353ee699951","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        RBAC test for Identity Admin 2.0 create_endpoint"},{"line_number":46,"context_line":"        \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        service_id \u003d self._create_service()"},{"line_number":49,"context_line":"        region \u003d data_utils.rand_name(\u0027region\u0027)"},{"line_number":50,"context_line":"        public_url \u003d data_utils.rand_url()"},{"line_number":51,"context_line":"        admin_url \u003d data_utils.rand_url()"},{"line_number":52,"context_line":"        internal_url \u003d data_utils.rand_url()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":55,"context_line":"        self.endpoints_client.create_endpoint("}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_e006e31a","line":52,"range":{"start_line":48,"start_character":8,"end_line":52,"end_character":44},"updated":"2017-01-30 14:44:03.000000000","message":"If these are needed for each test, consider just creating them once in a resource_setup and reusing them","commit_id":"9630bab90ae4b044f6c80848298e902f8422c394"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"3ce0b5c9c41a7d168f617118a6c1a56c6f6782f3","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        RBAC test for Identity Admin 2.0 create_endpoint"},{"line_number":46,"context_line":"        \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        service_id \u003d self._create_service()"},{"line_number":49,"context_line":"        region \u003d data_utils.rand_name(\u0027region\u0027)"},{"line_number":50,"context_line":"        public_url \u003d data_utils.rand_url()"},{"line_number":51,"context_line":"        admin_url \u003d data_utils.rand_url()"},{"line_number":52,"context_line":"        internal_url \u003d data_utils.rand_url()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":55,"context_line":"        self.endpoints_client.create_endpoint("}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_7bb7fdf4","line":52,"range":{"start_line":48,"start_character":8,"end_line":52,"end_character":44},"in_reply_to":"3a461143_51af8729","updated":"2017-01-30 17:49:09.000000000","message":"so if I use resource_setup as a class method, then I would have to either break the _create_service method I have in the base class and bring it into the resource_setup itself or try to make the _create_service a class method is my understanding. But since I need to cleanup for the created service the latter would be a bad idea. _create_service method I created in rbac_base is used by more than one test file(that\u0027s why I left it there to refactor). Should I just bring it in the resource_setup and save myself the headache albeit some redundancy?","commit_id":"9630bab90ae4b044f6c80848298e902f8422c394"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"aecbb37fe5649a94feb60e2bc17a6032e3784c17","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        RBAC test for Identity Admin 2.0 create_endpoint"},{"line_number":46,"context_line":"        \"\"\""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        service_id \u003d self._create_service()"},{"line_number":49,"context_line":"        region \u003d data_utils.rand_name(\u0027region\u0027)"},{"line_number":50,"context_line":"        public_url \u003d data_utils.rand_url()"},{"line_number":51,"context_line":"        admin_url \u003d data_utils.rand_url()"},{"line_number":52,"context_line":"        internal_url \u003d data_utils.rand_url()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":55,"context_line":"        self.endpoints_client.create_endpoint("}],"source_content_type":"text/x-python","patch_set":5,"id":"3a461143_51af8729","line":52,"range":{"start_line":48,"start_character":8,"end_line":52,"end_character":44},"in_reply_to":"3a461143_e006e31a","updated":"2017-01-30 16:02:43.000000000","message":"Agreed, this should go into a resource creation method.","commit_id":"9630bab90ae4b044f6c80848298e902f8422c394"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"545f71c726bd1f177569f59ccf7d27fc69858cec","unresolved":false,"context_lines":[{"line_number":24,"context_line":"CONF \u003d config.CONF"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"class IdentityEndpointsV2AdminRbacTest(rbac_base.BaseIdentityV2RbacTest):"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    @classmethod"},{"line_number":30,"context_line":"    def setup_clients(cls):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_e1533e37","line":27,"range":{"start_line":27,"start_character":0,"end_line":27,"end_character":73},"updated":"2017-01-30 18:56:46.000000000","message":"Same comment as on the base class.  If they are admin tests, please name them as such.  Otherwise, don\u0027t include Admin at all.","commit_id":"f145281cd4aa7cdde331ae96013222924cf96183"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"545f71c726bd1f177569f59ccf7d27fc69858cec","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    @classmethod"},{"line_number":30,"context_line":"    def setup_clients(cls):"},{"line_number":31,"context_line":"        super(IdentityEndpointsV2AdminRbacTest, cls).setup_clients()"},{"line_number":32,"context_line":"        cls.endpoints_client \u003d cls.os.endpoints_client"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @classmethod"},{"line_number":35,"context_line":"    def resource_setup(cls):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_6c0ca53b","line":32,"range":{"start_line":32,"start_character":8,"end_line":32,"end_character":54},"updated":"2017-01-30 18:56:46.000000000","message":"If this is an admin test and it extends BaseIdentityV2AdminTest, then it should use the cls.os_adm.endpoints_client.  This client is already part of the BaseIdentityV2AdminTest as \"cls.endpoints_client\"","commit_id":"f145281cd4aa7cdde331ae96013222924cf96183"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"f47ed78d008cfd71d6df9f128fda669cf4d4575b","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    @classmethod"},{"line_number":30,"context_line":"    def setup_clients(cls):"},{"line_number":31,"context_line":"        super(IdentityEndpointsV2AdminRbacTest, cls).setup_clients()"},{"line_number":32,"context_line":"        cls.endpoints_client \u003d cls.os.endpoints_client"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @classmethod"},{"line_number":35,"context_line":"    def resource_setup(cls):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_0df5d855","line":32,"range":{"start_line":32,"start_character":8,"end_line":32,"end_character":54},"in_reply_to":"3a461143_0dc15854","updated":"2017-01-30 22:17:00.000000000","message":"Since that is the case, we can use the already existing client in the tempest identity base class here: https://github.com/openstack/tempest/blob/master/tempest/api/identity/base.py","commit_id":"f145281cd4aa7cdde331ae96013222924cf96183"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"951a293a0a032b4e1c6cf3312c6041c15124a7f8","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    @classmethod"},{"line_number":30,"context_line":"    def setup_clients(cls):"},{"line_number":31,"context_line":"        super(IdentityEndpointsV2AdminRbacTest, cls).setup_clients()"},{"line_number":32,"context_line":"        cls.endpoints_client \u003d cls.os.endpoints_client"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @classmethod"},{"line_number":35,"context_line":"    def resource_setup(cls):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_6843aa42","line":32,"range":{"start_line":32,"start_character":8,"end_line":32,"end_character":54},"in_reply_to":"3a461143_0df5d855","updated":"2017-01-30 22:25:12.000000000","message":"yeah so tests attempt to hit the admin actions with member if I leave it at os_adm.endpoints_client for some reason. Here https://github.com/openstack/patrole/blob/master/patrole_tempest_plugin/tests/api/volume/test_snapshots_actions_rbac.py for volume_extension:snapshot_admin_actions:reset_status which is an admin api is currently hit with os. Can you guys try to see if os_adm will also cause an overpermission error? :(","commit_id":"f145281cd4aa7cdde331ae96013222924cf96183"},{"author":{"_account_id":22636,"name":"Cliff Parsons","email":"cliffhparsons@aol.com","username":"cliffparsons"},"change_message_id":"2f59f681ac35bc7b0845a4c1adec08aae3dce476","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    @classmethod"},{"line_number":30,"context_line":"    def setup_clients(cls):"},{"line_number":31,"context_line":"        super(IdentityEndpointsV2AdminRbacTest, cls).setup_clients()"},{"line_number":32,"context_line":"        cls.endpoints_client \u003d cls.os.endpoints_client"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @classmethod"},{"line_number":35,"context_line":"    def resource_setup(cls):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_0dc15854","line":32,"range":{"start_line":32,"start_character":8,"end_line":32,"end_character":54},"in_reply_to":"3a461143_1267b34d","updated":"2017-01-30 22:06:53.000000000","message":"The APIs being tested here are admin APIs, as are the majority of the Keystone APIs.  So the cls.os_adm.endpoints_client should be used.  If you use cls.os.endpoints_client, it will probably fail.","commit_id":"f145281cd4aa7cdde331ae96013222924cf96183"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"a66d874bb95e91f05d06b07317c02716fc7a1a96","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    @classmethod"},{"line_number":30,"context_line":"    def setup_clients(cls):"},{"line_number":31,"context_line":"        super(IdentityEndpointsV2AdminRbacTest, cls).setup_clients()"},{"line_number":32,"context_line":"        cls.endpoints_client \u003d cls.os.endpoints_client"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @classmethod"},{"line_number":35,"context_line":"    def resource_setup(cls):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_ce1478ea","line":32,"range":{"start_line":32,"start_character":8,"end_line":32,"end_character":54},"in_reply_to":"3a461143_6843aa42","updated":"2017-01-31 23:43:01.000000000","message":"Ok so for this, after a discussion, long story short should stay os, not os_adm. admin creds are relevant for rbac role switching and primary should hit os","commit_id":"f145281cd4aa7cdde331ae96013222924cf96183"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"6accfc650e2c7c4dfb599cef084af3448369b610","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    @classmethod"},{"line_number":30,"context_line":"    def setup_clients(cls):"},{"line_number":31,"context_line":"        super(IdentityEndpointsV2AdminRbacTest, cls).setup_clients()"},{"line_number":32,"context_line":"        cls.endpoints_client \u003d cls.os.endpoints_client"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @classmethod"},{"line_number":35,"context_line":"    def resource_setup(cls):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_1267b34d","line":32,"range":{"start_line":32,"start_character":8,"end_line":32,"end_character":54},"in_reply_to":"3a461143_6c0ca53b","updated":"2017-01-30 21:47:18.000000000","message":"so after a quick discussion with Cliff (original author for mos-tempest tests) and Nicolas, this seems a little over my head. I\u0027m going to add Cliff as a reviewer and ask him a little more about this.","commit_id":"f145281cd4aa7cdde331ae96013222924cf96183"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"b6e81535048fd0523ecf9eb5f02883730d288157","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def tearDown(self):"},{"line_number":44,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dFalse)"},{"line_number":45,"context_line":"        self.addCleanup(self.services_client.delete_service, self.service_id)"},{"line_number":46,"context_line":"        super(IdentityEndpointsV2AdminRbacTest, self).tearDown()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @rbac_rule_validation.action(service\u003d\"keystone\","}],"source_content_type":"text/x-python","patch_set":6,"id":"3a461143_26655cb4","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":77},"updated":"2017-01-30 18:13:18.000000000","message":"This cleanup can stay in the superclass. It will still be called","commit_id":"f145281cd4aa7cdde331ae96013222924cf96183"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"8447387a697e5c030c1ca05c16bfb48fb0b6827c","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    def tearDown(self):"},{"line_number":44,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dFalse)"},{"line_number":45,"context_line":"        super(IdentityEndpointsV2AdminRbacTest, self).tearDown()"},{"line_number":46,"context_line":"        self.addCleanup(self.services_client.delete_service, self.service_id)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @rbac_rule_validation.action(service\u003d\"keystone\","},{"line_number":49,"context_line":"                                 rule\u003d\"identity:create_endpoint\")"}],"source_content_type":"text/x-python","patch_set":9,"id":"3a461143_aa5d0317","line":46,"range":{"start_line":46,"start_character":8,"end_line":46,"end_character":77},"updated":"2017-02-02 19:52:35.000000000","message":"This should be done immediately after the resource is created.  Move this to _create_service() in the rbac_base class.","commit_id":"d6f3049bf018487e0a149fc2e8694b6bd150ae33"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"add48c3b071800cc18e3f35a091045c76fe57509","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        self.service_id \u003d self._create_service()"},{"line_number":57,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":58,"context_line":"        self.endpoints_client.create_endpoint("},{"line_number":59,"context_line":"            service_id\u003dself.service_id,"},{"line_number":60,"context_line":"            region\u003dself.region,"},{"line_number":61,"context_line":"            publicurl\u003dself.public_url,"},{"line_number":62,"context_line":"            adminurl\u003dself.admin_url,"},{"line_number":63,"context_line":"            internalurl\u003dself.internal_url"},{"line_number":64,"context_line":"        )"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @rbac_rule_validation.action(service\u003d\"keystone\","},{"line_number":67,"context_line":"                                 rule\u003d\"identity:delete_endpoint\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a461143_d39a06c5","line":64,"range":{"start_line":58,"start_character":8,"end_line":64,"end_character":9},"updated":"2017-02-02 21:10:06.000000000","message":"Add a cleanup please","commit_id":"574fceebaf869beed8067eaa0a200d769531c5d5"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"b81366bf9795c100afe1091dd7946e319aa121fc","unresolved":false,"context_lines":[{"line_number":55,"context_line":""},{"line_number":56,"context_line":"        self.service_id \u003d self._create_service()"},{"line_number":57,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":58,"context_line":"        self.endpoints_client.create_endpoint("},{"line_number":59,"context_line":"            service_id\u003dself.service_id,"},{"line_number":60,"context_line":"            region\u003dself.region,"},{"line_number":61,"context_line":"            publicurl\u003dself.public_url,"},{"line_number":62,"context_line":"            adminurl\u003dself.admin_url,"},{"line_number":63,"context_line":"            internalurl\u003dself.internal_url"},{"line_number":64,"context_line":"        )"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @rbac_rule_validation.action(service\u003d\"keystone\","},{"line_number":67,"context_line":"                                 rule\u003d\"identity:delete_endpoint\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"3a461143_7335d2d9","line":64,"range":{"start_line":58,"start_character":8,"end_line":64,"end_character":9},"updated":"2017-02-02 21:11:54.000000000","message":"You need to provide a self.addCleanup(test_utils.call_and_ignore_notfound_exc, self.endpoints_client.delete_endpoint, endpoint[\u0027id\u0027]) following this.\n\nI would add a new function called _create_endpoint() in this class that does 3 things:\n1) Creates the endpoint\n2) Immediately calls addCleanup as described above\n3) Returns the endpoint","commit_id":"574fceebaf869beed8067eaa0a200d769531c5d5"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"b81366bf9795c100afe1091dd7946e319aa121fc","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        \"\"\""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        self.service_id \u003d self._create_service()"},{"line_number":77,"context_line":"        endpoint \u003d self.endpoints_client.create_endpoint("},{"line_number":78,"context_line":"            service_id\u003dself.service_id,"},{"line_number":79,"context_line":"            region\u003dself.region,"},{"line_number":80,"context_line":"            publicurl\u003dself.public_url,"},{"line_number":81,"context_line":"            adminurl\u003dself.admin_url,"},{"line_number":82,"context_line":"            internalurl\u003dself.internal_url"},{"line_number":83,"context_line":"        )"},{"line_number":84,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":85,"context_line":"        self.endpoints_client.delete_endpoint(endpoint[\u0027endpoint\u0027][\u0027id\u0027])"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a461143_f39d42bc","line":83,"range":{"start_line":77,"start_character":8,"end_line":83,"end_character":9},"updated":"2017-02-02 21:11:54.000000000","message":"See above.","commit_id":"574fceebaf869beed8067eaa0a200d769531c5d5"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"add48c3b071800cc18e3f35a091045c76fe57509","unresolved":false,"context_lines":[{"line_number":74,"context_line":"        \"\"\""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        self.service_id \u003d self._create_service()"},{"line_number":77,"context_line":"        endpoint \u003d self.endpoints_client.create_endpoint("},{"line_number":78,"context_line":"            service_id\u003dself.service_id,"},{"line_number":79,"context_line":"            region\u003dself.region,"},{"line_number":80,"context_line":"            publicurl\u003dself.public_url,"},{"line_number":81,"context_line":"            adminurl\u003dself.admin_url,"},{"line_number":82,"context_line":"            internalurl\u003dself.internal_url"},{"line_number":83,"context_line":"        )"},{"line_number":84,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":85,"context_line":"        self.endpoints_client.delete_endpoint(endpoint[\u0027endpoint\u0027][\u0027id\u0027])"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"3a461143_33a8aadb","line":83,"range":{"start_line":77,"start_character":8,"end_line":83,"end_character":9},"updated":"2017-02-02 21:10:06.000000000","message":"see above","commit_id":"574fceebaf869beed8067eaa0a200d769531c5d5"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"7a62c52b0ca2ade5193542458c7791df00bea256","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        self.service_id \u003d self._create_service()"},{"line_number":81,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":82,"context_line":"        endpoint \u003d self.endpoints_client.create_endpoint("},{"line_number":83,"context_line":"            service_id\u003dself.service_id,"},{"line_number":84,"context_line":"            region\u003dself.region,"},{"line_number":85,"context_line":"            publicurl\u003dself.public_url,"},{"line_number":86,"context_line":"            adminurl\u003dself.admin_url,"},{"line_number":87,"context_line":"            internalurl\u003dself.internal_url"},{"line_number":88,"context_line":"        )"},{"line_number":89,"context_line":"        self.endpoints_client.delete_endpoint(endpoint[\u0027endpoint\u0027][\u0027id\u0027])"},{"line_number":90,"context_line":"        self.addCleanup(test_utils.call_and_ignore_notfound_exc,"},{"line_number":91,"context_line":"                        self.endpoints_client.delete_endpoint,"}],"source_content_type":"text/x-python","patch_set":12,"id":"1a430d35_b8a3b99d","line":88,"range":{"start_line":81,"start_character":8,"end_line":88,"end_character":9},"updated":"2017-02-03 18:14:25.000000000","message":"Strictly speaking, the creation should be above the rbac_utils.switch_role, but since creation will pretty much always have a less strict policy enforcement than deletion, in practice this should be fine.","commit_id":"a6821691423134dda965606f4fbdeb3e4f7bf599"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"7213173708c70292c8486e0a01a4ea278309d4c4","unresolved":false,"context_lines":[{"line_number":54,"context_line":"        RBAC test for Identity Admin 2.0 create_endpoint"},{"line_number":55,"context_line":"        \"\"\""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dTrue)"},{"line_number":58,"context_line":"        self.service_id \u003d self._create_service()"},{"line_number":59,"context_line":"        endpoint \u003d self.endpoints_client.create_endpoint("},{"line_number":60,"context_line":"            service_id\u003dself.service_id,"},{"line_number":61,"context_line":"            region\u003dself.region,"}],"source_content_type":"text/x-python","patch_set":14,"id":"1a430d35_ddb94a30","line":58,"range":{"start_line":57,"start_character":8,"end_line":58,"end_character":48},"updated":"2017-02-03 23:23:43.000000000","message":"Flip these","commit_id":"b0597b9fe034a3d3ea4b7c22b1342b5f733bb7c4"},{"author":{"_account_id":23185,"name":"Samantha Blanco","email":"samantha.blanco@att.com","username":"sblanco"},"change_message_id":"528cb83d2781b49ea6ff61acc6d71d43a0bce894","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        RBAC test for Identity Admin 2.0 delete_endpoint"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        self.service_id \u003d self._create_service()"},{"line_number":81,"context_line":"        endpoint \u003d self.endpoints_client.create_endpoint("},{"line_number":82,"context_line":"            service_id\u003dself.service_id,"},{"line_number":83,"context_line":"            region\u003dself.region,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a430d35_107466cd","line":80,"range":{"start_line":80,"start_character":0,"end_line":80,"end_character":48},"updated":"2017-02-06 15:11:48.000000000","message":"Could we also move service creation to resource_setup, since it looks like you\u0027re making a new one for most of the tests?","commit_id":"f5e7b13a8195dac7a2505ad1e5c41bc774853011"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"57d5928a6a032e5b5633b88156fe8c6cd9bfa057","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        RBAC test for Identity Admin 2.0 delete_endpoint"},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"        self.service_id \u003d self._create_service()"},{"line_number":81,"context_line":"        endpoint \u003d self.endpoints_client.create_endpoint("},{"line_number":82,"context_line":"            service_id\u003dself.service_id,"},{"line_number":83,"context_line":"            region\u003dself.region,"}],"source_content_type":"text/x-python","patch_set":15,"id":"1a430d35_1310b058","line":80,"range":{"start_line":80,"start_character":0,"end_line":80,"end_character":48},"in_reply_to":"1a430d35_107466cd","updated":"2017-02-07 19:28:51.000000000","message":"Yeah I\u0027ll move it to resource_setup and also put in resource_cleanup. Good catch.","commit_id":"f5e7b13a8195dac7a2505ad1e5c41bc774853011"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"c4eef7e2b4a2aadeaef8f97ac15ad5b1328cefb0","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        cls.internal_url \u003d data_utils.rand_url()"},{"line_number":42,"context_line":"        cls.service \u003d cls._create_service()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"},{"line_number":45,"context_line":"    def resource_cleanup(cls):"},{"line_number":46,"context_line":"        if hasattr(cls, \u0027service\u0027):"},{"line_number":47,"context_line":"            cls.services_client.delete_service("},{"line_number":48,"context_line":"                cls.service[\u0027OS-KSADM:service\u0027][\u0027id\u0027])"},{"line_number":49,"context_line":"        super(IdentityEndpointsV2AdminRbacTest, cls).resource_cleanup()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def tearDown(self):"},{"line_number":52,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a430d35_aef77357","line":49,"range":{"start_line":44,"start_character":4,"end_line":49,"end_character":71},"updated":"2017-02-07 19:48:33.000000000","message":"Why do we need this?  I thought the _create_service was self-cleaning?","commit_id":"eaed83a24d54f13b8f875910faafb32063926b8d"},{"author":{"_account_id":23659,"name":"Jaewoo Park","email":"jaewoopark91@gmail.com","username":"aselius"},"change_message_id":"5dd2b796e77b7ae161d64c98ed26aa5e537b5e08","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        cls.internal_url \u003d data_utils.rand_url()"},{"line_number":42,"context_line":"        cls.service \u003d cls._create_service()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"},{"line_number":45,"context_line":"    def resource_cleanup(cls):"},{"line_number":46,"context_line":"        if hasattr(cls, \u0027service\u0027):"},{"line_number":47,"context_line":"            cls.services_client.delete_service("},{"line_number":48,"context_line":"                cls.service[\u0027OS-KSADM:service\u0027][\u0027id\u0027])"},{"line_number":49,"context_line":"        super(IdentityEndpointsV2AdminRbacTest, cls).resource_cleanup()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def tearDown(self):"},{"line_number":52,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":16,"id":"1a430d35_d49c4ec2","line":49,"range":{"start_line":44,"start_character":4,"end_line":49,"end_character":71},"in_reply_to":"1a430d35_aef77357","updated":"2017-02-07 20:37:33.000000000","message":"If I want to make service accessible in the class so that they aren\u0027t called in every other test method, then it should be cleaned up in a resource_cleanup was my understanding. Felipe mentioned the other day that resources created in resource_setup should be cleaned up in resource_cleanup and that sounded right to me. If I include the cleanup in addCleanUp, its called after a teardown, which would in effect be called after _create_endpoint that would delete the class resource. So this I believe should be the way to go about it?","commit_id":"eaed83a24d54f13b8f875910faafb32063926b8d"},{"author":{"_account_id":23184,"name":"DavidPurcell","email":"d.purcell222@gmail.com","username":"DavidPurcell"},"change_message_id":"3ce5b316a34cc878360b4fb14a7023c724540831","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        cls.internal_url \u003d data_utils.rand_url()"},{"line_number":42,"context_line":"        cls.service \u003d cls._create_service()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"},{"line_number":45,"context_line":"    def resource_cleanup(cls):"},{"line_number":46,"context_line":"        if hasattr(cls, \u0027service\u0027):"},{"line_number":47,"context_line":"            cls.services_client.delete_service("},{"line_number":48,"context_line":"                cls.service[\u0027OS-KSADM:service\u0027][\u0027id\u0027])"},{"line_number":49,"context_line":"        super(IdentityEndpointsV2AdminRbacTest, cls).resource_cleanup()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    def tearDown(self):"},{"line_number":52,"context_line":"        rbac_utils.switch_role(self, switchToRbacRole\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":17,"id":"1a430d35_abbda069","line":49,"range":{"start_line":44,"start_character":4,"end_line":49,"end_character":71},"updated":"2017-02-07 22:11:37.000000000","message":"Do this in an addCleanup that is part of create_service.","commit_id":"e7cee21e472906d2d1f06f49004027d0cb1884f1"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"f741c8ce5f30cb48ccd99f5ccf2d1ac3e4a15cbb","unresolved":false,"context_lines":[{"line_number":25,"context_line":"CONF \u003d config.CONF"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"class IdentityEndpointsV2AdminRbacTest(rbac_base.BaseIdentityV2AdminRbacTest):"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @classmethod"},{"line_number":31,"context_line":"    def setup_clients(cls):"}],"source_content_type":"text/x-python","patch_set":18,"id":"fa31d9ce_f7954040","line":28,"range":{"start_line":28,"start_character":6,"end_line":28,"end_character":78},"updated":"2017-02-10 18:38:19.000000000","message":"Again, either use the deprecated V2 API as guidance here: https://developer.openstack.org/api-ref/identity/v2/index.html or change these classes to V3.","commit_id":"d28b84e81ec4a1c1cc6a3ed0d07dbd34946c6222"}]}
