)]}'
{"tempest/api/compute/test_authorization.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"05edb92567392c6bece49a2e702df58345f42d43","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        # Change the base URL to impersonate another user"},{"line_number":177,"context_line":"        self.alt_client.auth_provider.set_alt_auth_data("},{"line_number":178,"context_line":"            request_part\u003d\u0027url\u0027,"},{"line_number":179,"context_line":"            auth_data\u003dself.client.auth_provider.auth_data"},{"line_number":180,"context_line":"        )"},{"line_number":181,"context_line":"        self.assertRaises(exceptions.BadRequest,"},{"line_number":182,"context_line":"                          self.alt_client.create_server, \u0027test\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9t7g%3D","line":179,"updated":"2014-02-04 18:37:26.000000000","message":"So this is doing the opposite case from before the patch right? Instead of changing the url of the request to be from self.client instead of self.alt_client you\u0027re changing the user and leaving the url the same. I think you should update the comment above to make that more clear.","commit_id":"e05624b327e13068599543094b75386cdcd1928b"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"eb22981f37ecee23a7d11e51f64dec35d2ffb40a","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        # Change the base URL to impersonate another user"},{"line_number":177,"context_line":"        self.alt_client.auth_provider.set_alt_auth_data("},{"line_number":178,"context_line":"            request_part\u003d\u0027url\u0027,"},{"line_number":179,"context_line":"            auth_data\u003dself.client.auth_provider.auth_data"},{"line_number":180,"context_line":"        )"},{"line_number":181,"context_line":"        self.assertRaises(exceptions.BadRequest,"},{"line_number":182,"context_line":"                          self.alt_client.create_server, \u0027test\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9qJQ%3D","line":179,"in_reply_to":"AAAAUH%2F9t7g%3D","updated":"2014-02-05 10:54:34.000000000","message":"The original tests makes the request using \"alt_client\" (and thus its token), but using \"client\"\u0027s URL, which contain a non-matching tenant id, which fits with the comment.\nThe modified test is doing the same thing. It takes the \"alt_client\" and it overrides the \"url\" part using the url from \"client\".","commit_id":"e05624b327e13068599543094b75386cdcd1928b"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"05edb92567392c6bece49a2e702df58345f42d43","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        # the current user"},{"line_number":189,"context_line":"        # POST keypair with other user tenant"},{"line_number":190,"context_line":"        k_name \u003d data_utils.rand_name(\u0027keypair-\u0027)"},{"line_number":191,"context_line":"        LOG.debug(\"Tenant: {ten}, Alt tenant: {alt}\".format("},{"line_number":192,"context_line":"            ten\u003dself.keypairs_client.tenant_name,"},{"line_number":193,"context_line":"            alt\u003dself.alt_keypairs_client.tenant_name"},{"line_number":194,"context_line":"        ))"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9t7E%3D","line":191,"updated":"2014-02-04 18:37:26.000000000","message":"I think you need a bit more info here if we\u0027re going to log this. Otherwise it\u0027ll just get lost in the noise, because there are a lot of tests that have a tenant and alt_tenant","commit_id":"e05624b327e13068599543094b75386cdcd1928b"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"eb22981f37ecee23a7d11e51f64dec35d2ffb40a","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        # the current user"},{"line_number":189,"context_line":"        # POST keypair with other user tenant"},{"line_number":190,"context_line":"        k_name \u003d data_utils.rand_name(\u0027keypair-\u0027)"},{"line_number":191,"context_line":"        LOG.debug(\"Tenant: {ten}, Alt tenant: {alt}\".format("},{"line_number":192,"context_line":"            ten\u003dself.keypairs_client.tenant_name,"},{"line_number":193,"context_line":"            alt\u003dself.alt_keypairs_client.tenant_name"},{"line_number":194,"context_line":"        ))"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9qI8%3D","line":191,"in_reply_to":"AAAAUH%2F9t7E%3D","updated":"2014-02-05 10:54:34.000000000","message":"Indeed, I\u0027ll remove this, it was a WIP debug statement.","commit_id":"e05624b327e13068599543094b75386cdcd1928b"}],"tempest/api/identity/admin/test_roles_negative.py":[{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"ef28072f5f59dfe853f6ba6c591a0e2b1199a47a","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":62,"context_line":"    def test_create_role_request_without_token(self):"},{"line_number":63,"context_line":"        # Request to create role without a valid token should fail"},{"line_number":64,"context_line":"        token \u003d self.client.auth_provider.auth_data[0]"},{"line_number":65,"context_line":"        self.client.delete_token(token)"},{"line_number":66,"context_line":"        role_name \u003d data_utils.rand_name(name\u003d\u0027role-\u0027)"},{"line_number":67,"context_line":"        self.assertRaises(exceptions.Unauthorized,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F91DU%3D","line":64,"updated":"2014-02-03 15:29:08.000000000","message":"This is the typical situation when an  unauthenticated auth provider should be used.","commit_id":"6fdfaac137cd27fc8fb176118a7283b36e1bdd8c"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"661b5944b346cfcecacada47383835377efebb47","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":62,"context_line":"    def test_create_role_request_without_token(self):"},{"line_number":63,"context_line":"        # Request to create role without a valid token should fail"},{"line_number":64,"context_line":"        token \u003d self.client.auth_provider.auth_data[0]"},{"line_number":65,"context_line":"        self.client.delete_token(token)"},{"line_number":66,"context_line":"        role_name \u003d data_utils.rand_name(name\u003d\u0027role-\u0027)"},{"line_number":67,"context_line":"        self.assertRaises(exceptions.Unauthorized,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F904Y%3D","line":64,"in_reply_to":"AAAAUH%2F91DU%3D","updated":"2014-02-03 15:47:52.000000000","message":"The test as it is written aims to verify that a request with a deleted token fails with 401. The name of the test is not in line with its content, but I\u0027d prefer to fix that in a separate patch.","commit_id":"6fdfaac137cd27fc8fb176118a7283b36e1bdd8c"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"eb22981f37ecee23a7d11e51f64dec35d2ffb40a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                          self.non_admin_client.list_roles)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":42,"context_line":"    def test_list_roles_request_without_token(self):"},{"line_number":43,"context_line":"        # Request to list roles without a valid token should fail"},{"line_number":44,"context_line":"        token \u003d self.client.auth_provider.auth_data[0]"},{"line_number":45,"context_line":"        self.client.delete_token(token)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9qFI%3D","line":42,"updated":"2014-02-05 10:54:34.000000000","message":"The name here is not really fitting, it shall be test_list_roles_request_with_deleted_token. To be fixed in a separate patch","commit_id":"e05624b327e13068599543094b75386cdcd1928b"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"05edb92567392c6bece49a2e702df58345f42d43","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":42,"context_line":"    def test_list_roles_request_without_token(self):"},{"line_number":43,"context_line":"        # Request to list roles without a valid token should fail"},{"line_number":44,"context_line":"        token \u003d self.client.auth_provider.auth_data[0]"},{"line_number":45,"context_line":"        self.client.delete_token(token)"},{"line_number":46,"context_line":"        self.assertRaises(exceptions.Unauthorized, self.client.list_roles)"},{"line_number":47,"context_line":"        del(self.client.auth_provider.auth_data)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9t4U%3D","line":44,"updated":"2014-02-04 18:37:26.000000000","message":"So using auth_data[0] here isn\u0027t exactly clear.\n\nI think if something needs to be pulled from auth_provider we should have a helper method to do it, and not expect people to know the inner workings of the new auth_provider classes.","commit_id":"e05624b327e13068599543094b75386cdcd1928b"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"eb22981f37ecee23a7d11e51f64dec35d2ffb40a","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":42,"context_line":"    def test_list_roles_request_without_token(self):"},{"line_number":43,"context_line":"        # Request to list roles without a valid token should fail"},{"line_number":44,"context_line":"        token \u003d self.client.auth_provider.auth_data[0]"},{"line_number":45,"context_line":"        self.client.delete_token(token)"},{"line_number":46,"context_line":"        self.assertRaises(exceptions.Unauthorized, self.client.list_roles)"},{"line_number":47,"context_line":"        del(self.client.auth_provider.auth_data)"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9qG0%3D","line":44,"in_reply_to":"AAAAUH%2F9t4U%3D","updated":"2014-02-05 10:54:34.000000000","message":"Fair enough. I tried avoiding any explicit reference to token or catalog in the other tests, just using \"auth_data\" which is a tuple containing both.\n\nHowever for keystone tests it\u0027s inevitable. \nI will implement an helper as you suggested.","commit_id":"e05624b327e13068599543094b75386cdcd1928b"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"05edb92567392c6bece49a2e702df58345f42d43","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        token \u003d self.client.auth_provider.auth_data[0]"},{"line_number":45,"context_line":"        self.client.delete_token(token)"},{"line_number":46,"context_line":"        self.assertRaises(exceptions.Unauthorized, self.client.list_roles)"},{"line_number":47,"context_line":"        del(self.client.auth_provider.auth_data)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":50,"context_line":"    def test_role_create_blank_name(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9t4o%3D","line":47,"updated":"2014-02-04 18:37:26.000000000","message":"A helper here like clear_token() or something will be useful too","commit_id":"e05624b327e13068599543094b75386cdcd1928b"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"eb22981f37ecee23a7d11e51f64dec35d2ffb40a","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        token \u003d self.client.auth_provider.auth_data[0]"},{"line_number":45,"context_line":"        self.client.delete_token(token)"},{"line_number":46,"context_line":"        self.assertRaises(exceptions.Unauthorized, self.client.list_roles)"},{"line_number":47,"context_line":"        del(self.client.auth_provider.auth_data)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":50,"context_line":"    def test_role_create_blank_name(self):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9qGU%3D","line":47,"in_reply_to":"AAAAUH%2F9t4o%3D","updated":"2014-02-05 10:54:34.000000000","message":"The del command triggers the property deleter method in auth.py.\n\nI can expose the same with a clear_auth() helper. \nIt basically deletes the auth cache and forces requesting new auth.","commit_id":"e05624b327e13068599543094b75386cdcd1928b"}],"tempest/api/identity/admin/test_users.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"05edb92567392c6bece49a2e702df58345f42d43","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        self.token_client.auth(self.data.test_user, self.data.test_password,"},{"line_number":116,"context_line":"                               self.data.test_tenant)"},{"line_number":117,"context_line":"        # Get the token of the current client"},{"line_number":118,"context_line":"        token, _ \u003d self.client.auth_provider.auth_data"},{"line_number":119,"context_line":"        # Delete the token from database"},{"line_number":120,"context_line":"        self.client.delete_token(token)"},{"line_number":121,"context_line":"        # Re-auth"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9t5Q%3D","line":118,"updated":"2014-02-04 18:37:26.000000000","message":"Why no [0] here like in the other token uses? This is why a helper will be useful actually","commit_id":"e05624b327e13068599543094b75386cdcd1928b"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"eb22981f37ecee23a7d11e51f64dec35d2ffb40a","unresolved":false,"context_lines":[{"line_number":115,"context_line":"        self.token_client.auth(self.data.test_user, self.data.test_password,"},{"line_number":116,"context_line":"                               self.data.test_tenant)"},{"line_number":117,"context_line":"        # Get the token of the current client"},{"line_number":118,"context_line":"        token, _ \u003d self.client.auth_provider.auth_data"},{"line_number":119,"context_line":"        # Delete the token from database"},{"line_number":120,"context_line":"        self.client.delete_token(token)"},{"line_number":121,"context_line":"        # Re-auth"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9p%2F0%3D","line":118,"in_reply_to":"AAAAUH%2F9t5Q%3D","updated":"2014-02-05 10:54:34.000000000","message":"Done","commit_id":"e05624b327e13068599543094b75386cdcd1928b"}],"tempest/api/identity/admin/test_users_negative.py":[{"author":{"_account_id":1192,"name":"David Kranz","email":"dkranz@redhat.com","username":"david-kranz"},"change_message_id":"53888dd6e5f96529c859129ddf9f10ff1061924c","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    @attr(type\u003d[\u0027negative\u0027, \u0027gate\u0027])"},{"line_number":208,"context_line":"    def test_get_users_request_without_token(self):"},{"line_number":209,"context_line":"        # Request to get list of users without a valid token should fail"},{"line_number":210,"context_line":"        token \u003d self.client.auth_provider.auth_data[0]"},{"line_number":211,"context_line":"        self.client.delete_token(token)"},{"line_number":212,"context_line":"        self.assertRaises(exceptions.Unauthorized, self.client.get_users)"},{"line_number":213,"context_line":"        self.client.auth_provider.clear_auth()"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F9ndY%3D","line":210,"updated":"2014-02-05 17:11:06.000000000","message":"get_token()","commit_id":"8bbdb1660f47ad9919ecb262801fceee3a1a5b0b"}],"tempest/api/object_storage/test_crossdomain.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"05edb92567392c6bece49a2e702df58345f42d43","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        client \u003d self.os_test_user.account_client"},{"line_number":53,"context_line":"        # Turning http://.../v1/foobar into http://.../"},{"line_number":54,"context_line":"        client.skip_path \u003d True"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def tearDown(self):"},{"line_number":57,"context_line":"        # clear the base_url for subsequent requests"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9t2s%3D","line":54,"updated":"2014-02-04 18:37:26.000000000","message":"While this one is simpler than the other auth_data use cases I think having a helper here like set_skip_path(True) or something would be useful. (Or just skip_path() and reset_path())","commit_id":"e05624b327e13068599543094b75386cdcd1928b"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"eb22981f37ecee23a7d11e51f64dec35d2ffb40a","unresolved":false,"context_lines":[{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        client \u003d self.os_test_user.account_client"},{"line_number":53,"context_line":"        # Turning http://.../v1/foobar into http://.../"},{"line_number":54,"context_line":"        client.skip_path \u003d True"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def tearDown(self):"},{"line_number":57,"context_line":"        # clear the base_url for subsequent requests"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9p1U%3D","line":54,"in_reply_to":"AAAAUH%2F9t2s%3D","updated":"2014-02-05 10:54:34.000000000","message":"ok, I\u0027ll expose this with two functions in rest_client, so that if anything changes in auth.py side we don\u0027t have to change tests again.","commit_id":"e05624b327e13068599543094b75386cdcd1928b"}],"tempest/api/object_storage/test_object_services.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"05edb92567392c6bece49a2e702df58345f42d43","unresolved":false,"context_lines":[{"line_number":398,"context_line":"        self.assertEqual(resp[\u0027x-container-read\u0027], \u0027.r:*,.rlistings\u0027)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"        # get auth token of alternative user"},{"line_number":401,"context_line":"        alt_os \u003d clients.AltManager()"},{"line_number":402,"context_line":"        alt_auth_data \u003d alt_os.get_auth_provider().auth_data"},{"line_number":403,"context_line":"        self.custom_object_client.auth_provider.set_alt_auth_data("},{"line_number":404,"context_line":"            request_part\u003d\u0027headers\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9t1s%3D","line":401,"updated":"2014-02-04 18:37:26.000000000","message":"This is not the same, this ignores tenant isolation. The identity_client_alt object is defined in the parent class differently if tenant_isolation is enabled:\n\nhttp://git.openstack.org/cgit/openstack/tempest/tree/tempest/api/object_storage/base.py#n55","commit_id":"e05624b327e13068599543094b75386cdcd1928b"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"eb22981f37ecee23a7d11e51f64dec35d2ffb40a","unresolved":false,"context_lines":[{"line_number":398,"context_line":"        self.assertEqual(resp[\u0027x-container-read\u0027], \u0027.r:*,.rlistings\u0027)"},{"line_number":399,"context_line":""},{"line_number":400,"context_line":"        # get auth token of alternative user"},{"line_number":401,"context_line":"        alt_os \u003d clients.AltManager()"},{"line_number":402,"context_line":"        alt_auth_data \u003d alt_os.get_auth_provider().auth_data"},{"line_number":403,"context_line":"        self.custom_object_client.auth_provider.set_alt_auth_data("},{"line_number":404,"context_line":"            request_part\u003d\u0027headers\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9ptM%3D","line":401,"in_reply_to":"AAAAUH%2F9t1s%3D","updated":"2014-02-05 10:54:34.000000000","message":"Good catch, thanks!","commit_id":"e05624b327e13068599543094b75386cdcd1928b"}],"tempest/auth.py":[{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"ef28072f5f59dfe853f6ba6c591a0e2b1199a47a","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    @property"},{"line_number":84,"context_line":"    def auth_data(self):"},{"line_number":85,"context_line":"        if self.cache is None or self.is_expired(self.cache):"},{"line_number":86,"context_line":"            self.cache \u003d self._get_auth()"},{"line_number":87,"context_line":"        return self.cache"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @auth_data.deleter"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F91G8%3D","line":86,"updated":"2014-02-03 15:29:08.000000000","message":"It should be renewed before expiration, but it is not important for now.","commit_id":"6fdfaac137cd27fc8fb176118a7283b36e1bdd8c"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"661b5944b346cfcecacada47383835377efebb47","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    @property"},{"line_number":84,"context_line":"    def auth_data(self):"},{"line_number":85,"context_line":"        if self.cache is None or self.is_expired(self.cache):"},{"line_number":86,"context_line":"            self.cache \u003d self._get_auth()"},{"line_number":87,"context_line":"        return self.cache"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"    @auth_data.deleter"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAUH%2F903Y%3D","line":86,"in_reply_to":"AAAAUH%2F91G8%3D","updated":"2014-02-03 15:47:52.000000000","message":"Good point, we should renew if the token is about to expire e.g. in a few minutes or so. I can do that in the next patch.","commit_id":"6fdfaac137cd27fc8fb176118a7283b36e1bdd8c"}],"tempest/clients.py":[{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"425e7449dc40f8487acfc4b16919f8e6b53fdc32","unresolved":false,"context_lines":[{"line_number":225,"context_line":"                                            endpoint_type\u003dendpoint_type,"},{"line_number":226,"context_line":"                                            interface\u003dinterface,"},{"line_number":227,"context_line":"                                            auth_version\u003dself.auth_version)"},{"line_number":228,"context_line":"            return base_url, token"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        if interface \u003d\u003d \u0027xml\u0027:"},{"line_number":231,"context_line":"            self.certificates_client \u003d CertificatesClientXML("}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Fl3E%3D","line":228,"updated":"2014-01-10 17:47:15.000000000","message":"NOTE: I wonder, wouldn\u0027t be better to use a dict instead of a tuple \u0027base_url, token\u0027  here ?","commit_id":"4d2249ec81c500a33dea796bc066bee0fadf1e1b"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"598861cc21381a93c95ed7d85fa9349f83a73ea8","unresolved":false,"context_lines":[{"line_number":225,"context_line":"                                            endpoint_type\u003dendpoint_type,"},{"line_number":226,"context_line":"                                            interface\u003dinterface,"},{"line_number":227,"context_line":"                                            auth_version\u003dself.auth_version)"},{"line_number":228,"context_line":"            return base_url, token"},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        if interface \u003d\u003d \u0027xml\u0027:"},{"line_number":231,"context_line":"            self.certificates_client \u003d CertificatesClientXML("}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAUH%2F%2Fly8%3D","line":228,"in_reply_to":"AAAAUH%2F%2Fl3E%3D","updated":"2014-01-10 17:58:11.000000000","message":"I\u0027m thinking to return the username, tenant_name and domain_name as well as the base_url / token, as some tests use this info. \nI\u0027ll put all of them into a dict, so that domain can be there or not based on the auth version.","commit_id":"4d2249ec81c500a33dea796bc066bee0fadf1e1b"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"05edb92567392c6bece49a2e702df58345f42d43","unresolved":false,"context_lines":[{"line_number":189,"context_line":"        self.interface \u003d interface"},{"line_number":190,"context_line":"        self.auth_version \u003d CONF.identity.auth_version"},{"line_number":191,"context_line":"        # FIXME(andreaf) Change Manager __init__ to accept a credentials dict"},{"line_number":192,"context_line":"        if username is None or password is None:"},{"line_number":193,"context_line":"            # Tenant None is a valid use case"},{"line_number":194,"context_line":"            self.credentials \u003d self.get_default_credentials()"},{"line_number":195,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9t1M%3D","line":192,"updated":"2014-02-04 18:37:26.000000000","message":"Shouldn\u0027t you also check tenant_name here?","commit_id":"e05624b327e13068599543094b75386cdcd1928b"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"eb22981f37ecee23a7d11e51f64dec35d2ffb40a","unresolved":false,"context_lines":[{"line_number":189,"context_line":"        self.interface \u003d interface"},{"line_number":190,"context_line":"        self.auth_version \u003d CONF.identity.auth_version"},{"line_number":191,"context_line":"        # FIXME(andreaf) Change Manager __init__ to accept a credentials dict"},{"line_number":192,"context_line":"        if username is None or password is None:"},{"line_number":193,"context_line":"            # Tenant None is a valid use case"},{"line_number":194,"context_line":"            self.credentials \u003d self.get_default_credentials()"},{"line_number":195,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9psI%3D","line":192,"in_reply_to":"AAAAUH%2F9t1M%3D","updated":"2014-02-05 10:54:34.000000000","message":"I didn\u0027t want to enforce that. In v3 you can have tokens scoped to the domain, rather than the tenant/project - that\u0027s why I didn\u0027t enforce it here.","commit_id":"e05624b327e13068599543094b75386cdcd1928b"}],"tempest/common/isolated_creds.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"05edb92567392c6bece49a2e702df58345f42d43","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.isolated_net_resources \u003d {}"},{"line_number":37,"context_line":"        self.ports \u003d []"},{"line_number":38,"context_line":"        self.name \u003d name"},{"line_number":39,"context_line":"        self.config \u003d CONF"},{"line_number":40,"context_line":"        self.tempest_client \u003d tempest_client"},{"line_number":41,"context_line":"        self.interface \u003d interface"},{"line_number":42,"context_line":"        self.password \u003d password"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9t08%3D","side":"PARENT","line":39,"updated":"2014-02-04 18:37:26.000000000","message":"This is an unrelated change.... (I don\u0027t think anyone will -1 such a large patch just for this though :) )","commit_id":"fc7ecc45c9143831dfc194ec980ae80b1da5bb26"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"eb22981f37ecee23a7d11e51f64dec35d2ffb40a","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        self.isolated_net_resources \u003d {}"},{"line_number":37,"context_line":"        self.ports \u003d []"},{"line_number":38,"context_line":"        self.name \u003d name"},{"line_number":39,"context_line":"        self.config \u003d CONF"},{"line_number":40,"context_line":"        self.tempest_client \u003d tempest_client"},{"line_number":41,"context_line":"        self.interface \u003d interface"},{"line_number":42,"context_line":"        self.password \u003d password"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9prI%3D","side":"PARENT","line":39,"in_reply_to":"AAAAUH%2F9t08%3D","updated":"2014-02-05 10:54:34.000000000","message":"Separate patch: https://review.openstack.org/71231","commit_id":"fc7ecc45c9143831dfc194ec980ae80b1da5bb26"}],"tempest/common/rest_client.py":[{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"c7d4083ee7a692660a6915c11c0b65b13275f189","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        self._base_url \u003d value"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    @property"},{"line_number":102,"context_line":"    def token(self):"},{"line_number":103,"context_line":"        if self._token is None:"},{"line_number":104,"context_line":"            self._set_auth()"},{"line_number":105,"context_line":"        return self._token"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2Fhbs%3D","line":102,"updated":"2014-01-12 21:13:19.000000000","message":"Token can be expired, I do not thing we will ever have more then 24h gate job, but for stress tests it might be a use case.","commit_id":"71ba09392b8f1e9a521610b21224aeab7ec6afe1"},{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"c7d4083ee7a692660a6915c11c0b65b13275f189","unresolved":false,"context_lines":[{"line_number":243,"context_line":"            headers \u003d {}"},{"line_number":244,"context_line":"        headers[\u0027X-Auth-Token\u0027] \u003d self.token"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"        resp, resp_body \u003d self._request(method, url,"},{"line_number":247,"context_line":"                                        headers\u003dheaders, body\u003dbody)"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"        while (resp.status \u003d\u003d 413 and"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAUH%2F%2Fhb4%3D","line":246,"updated":"2014-01-12 21:13:19.000000000","message":"In order to fully make abstract the authentication, \nwe would need  an external authenticer which gets the request data (method,url, headers,body) , and provides a new request (It may change headers, body, but not the method).\n\nIf we use just keystone authentication, it means only adding the X-Auth-Token header.\n\nA class with auth_request_method, or closure (auth_provider)  would be able to do it.\n\nSome cases we need a rest clients (object-store) which forgets to authenticate by will.","commit_id":"71ba09392b8f1e9a521610b21224aeab7ec6afe1"}],"tempest/config.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"05edb92567392c6bece49a2e702df58345f42d43","unresolved":false,"context_lines":[{"line_number":42,"context_line":"               default\u003dNone,"},{"line_number":43,"context_line":"               help\u003d\"Full URI of the OpenStack Identity API (Keystone), v2\"),"},{"line_number":44,"context_line":"    cfg.StrOpt(\u0027uri_v3\u0027,"},{"line_number":45,"context_line":"               help\u003d\"Full URI of the OpenStack Identity API (Keystone), v3\"),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027auth_version\u0027,"},{"line_number":47,"context_line":"               default\u003d\u0027v2\u0027,"},{"line_number":48,"context_line":"               help\u003d\"Identity API version to be used for authentication \""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9t0k%3D","line":45,"updated":"2014-02-04 18:37:26.000000000","message":"Another unrelated change...","commit_id":"e05624b327e13068599543094b75386cdcd1928b"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"eb22981f37ecee23a7d11e51f64dec35d2ffb40a","unresolved":false,"context_lines":[{"line_number":42,"context_line":"               default\u003dNone,"},{"line_number":43,"context_line":"               help\u003d\"Full URI of the OpenStack Identity API (Keystone), v2\"),"},{"line_number":44,"context_line":"    cfg.StrOpt(\u0027uri_v3\u0027,"},{"line_number":45,"context_line":"               help\u003d\"Full URI of the OpenStack Identity API (Keystone), v3\"),"},{"line_number":46,"context_line":"    cfg.StrOpt(\u0027auth_version\u0027,"},{"line_number":47,"context_line":"               default\u003d\u0027v2\u0027,"},{"line_number":48,"context_line":"               help\u003d\"Identity API version to be used for authentication \""}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9po0%3D","line":45,"in_reply_to":"AAAAUH%2F9t0k%3D","updated":"2014-02-05 10:54:34.000000000","message":"Done","commit_id":"e05624b327e13068599543094b75386cdcd1928b"},{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"d9e915bd9a94140892454e30f548852772b78d42","unresolved":false,"context_lines":[{"line_number":46,"context_line":"    cfg.StrOpt(\u0027auth_version\u0027,"},{"line_number":47,"context_line":"               default\u003d\u0027v2\u0027,"},{"line_number":48,"context_line":"               help\u003d\"Identity API version to be used for authentication \""},{"line_number":49,"context_line":"                    \"for API tests. Planned to extend to tenant isolation, \""},{"line_number":50,"context_line":"                    \"scenario tests and CLI tests.\"),"},{"line_number":51,"context_line":"    cfg.StrOpt(\u0027region\u0027,"},{"line_number":52,"context_line":"               default\u003d\u0027RegionOne\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F9mNA%3D","line":49,"updated":"2014-02-05 19:19:58.000000000","message":"This should work for tenant isolation already. (at least for the api tests) I don\u0027t think you need the commentary about feature support moving forward here. But, not enough to -1 on","commit_id":"8bbdb1660f47ad9919ecb262801fceee3a1a5b0b"}],"tempest/services/identity/v3/json/identity_client.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"05edb92567392c6bece49a2e702df58345f42d43","unresolved":false,"context_lines":[{"line_number":460,"context_line":"        # If the v3 url is not set, get it from the v2 one"},{"line_number":461,"context_line":"        if auth_url is None:"},{"line_number":462,"context_line":"            auth_url \u003d CONF.identity.uri.replace(urlparse.urlparse("},{"line_number":463,"context_line":"                CONF.identity.uri).path, \"/v3\")"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"        if \u0027auth/tokens\u0027 not in auth_url:"},{"line_number":466,"context_line":"            auth_url \u003d auth_url.rstrip(\u0027/\u0027) + \u0027/auth/tokens\u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9tzc%3D","line":463,"updated":"2014-02-04 18:37:26.000000000","message":"Is this always true? This is good enough for now, I\u0027ll rebase my configurable keystone api versions patch:\n\nhttps://review.openstack.org/#/c/70462/\n\non this and fix it there.","commit_id":"e05624b327e13068599543094b75386cdcd1928b"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"eb22981f37ecee23a7d11e51f64dec35d2ffb40a","unresolved":false,"context_lines":[{"line_number":460,"context_line":"        # If the v3 url is not set, get it from the v2 one"},{"line_number":461,"context_line":"        if auth_url is None:"},{"line_number":462,"context_line":"            auth_url \u003d CONF.identity.uri.replace(urlparse.urlparse("},{"line_number":463,"context_line":"                CONF.identity.uri).path, \"/v3\")"},{"line_number":464,"context_line":""},{"line_number":465,"context_line":"        if \u0027auth/tokens\u0027 not in auth_url:"},{"line_number":466,"context_line":"            auth_url \u003d auth_url.rstrip(\u0027/\u0027) + \u0027/auth/tokens\u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9pm4%3D","line":463,"in_reply_to":"AAAAUH%2F9tzc%3D","updated":"2014-02-05 10:54:34.000000000","message":"OK, thanks","commit_id":"e05624b327e13068599543094b75386cdcd1928b"}],"tempest/services/image/v1/json/image_client.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"05edb92567392c6bece49a2e702df58345f42d43","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    def __init__(self, auth_provider):"},{"line_number":37,"context_line":"        super(ImageClientJSON, self).__init__(auth_provider)"},{"line_number":38,"context_line":"        self.service \u003d CONF.images.catalog_type"},{"line_number":39,"context_line":"        self._http \u003d None"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def _image_meta_from_headers(self, headers):"},{"line_number":42,"context_line":"        meta \u003d {\u0027properties\u0027: {}}"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9txo%3D","line":39,"updated":"2014-02-04 18:37:26.000000000","message":"This whole block(the lazy load conversion) is arguably an unrelated change too, but it\u0027s inline with the other changes, so it\u0027s ok.","commit_id":"e05624b327e13068599543094b75386cdcd1928b"},{"author":{"_account_id":1921,"name":"Andrea Frittoli","email":"andrea.frittoli@gmail.com","username":"andrea-frittoli"},"change_message_id":"eb22981f37ecee23a7d11e51f64dec35d2ffb40a","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    def __init__(self, auth_provider):"},{"line_number":37,"context_line":"        super(ImageClientJSON, self).__init__(auth_provider)"},{"line_number":38,"context_line":"        self.service \u003d CONF.images.catalog_type"},{"line_number":39,"context_line":"        self._http \u003d None"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"    def _image_meta_from_headers(self, headers):"},{"line_number":42,"context_line":"        meta \u003d {\u0027properties\u0027: {}}"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAAUH%2F9png%3D","line":39,"in_reply_to":"AAAAUH%2F9txo%3D","updated":"2014-02-05 10:54:34.000000000","message":"ok, thanks. Requesting auth before time here was causing issues.","commit_id":"e05624b327e13068599543094b75386cdcd1928b"}],"tempest/services/object_storage/account_client.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"d9e915bd9a94140892454e30f548852772b78d42","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    @property"},{"line_number":34,"context_line":"    def token(self):"},{"line_number":35,"context_line":"        return self.auth_provider.auth_data[0]"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def create_account(self, data\u003dNone,"},{"line_number":38,"context_line":"                       params\u003dNone,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F9mLM%3D","line":35,"updated":"2014-02-05 19:19:58.000000000","message":"shouldn\u0027t this be the helper?","commit_id":"8bbdb1660f47ad9919ecb262801fceee3a1a5b0b"}],"tempest/services/object_storage/container_client.py":[{"author":{"_account_id":5196,"name":"Matthew Treinish","email":"mtreinish@kortar.org","username":"treinish"},"change_message_id":"d9e915bd9a94140892454e30f548852772b78d42","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    @property"},{"line_number":36,"context_line":"    def token(self):"},{"line_number":37,"context_line":"        return self.auth_provider.auth_data[0]"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"    def create_container("},{"line_number":40,"context_line":"            self, container_name,"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAUH%2F9mLI%3D","line":37,"updated":"2014-02-05 19:19:58.000000000","message":"helper...","commit_id":"8bbdb1660f47ad9919ecb262801fceee3a1a5b0b"}],"tox.ini":[{"author":{"_account_id":5803,"name":"Attila Fazekas","email":"afazekas@redhat.com","username":"afazekas"},"change_message_id":"60a4fa5ed6637e666120e2ec5b5199b571168e33","unresolved":false,"context_lines":[{"line_number":4,"context_line":"skipsdist \u003d True"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"[testenv]"},{"line_number":7,"context_line":"sitepackages \u003d False"},{"line_number":8,"context_line":"setenv \u003d VIRTUAL_ENV\u003d{envdir}"},{"line_number":9,"context_line":"         LANG\u003den_US.UTF-8"},{"line_number":10,"context_line":"         LANGUAGE\u003den_US:en"}],"source_content_type":"text/x-properties","patch_set":15,"id":"AAAAUH%2F%2BMC8%3D","line":7,"updated":"2014-01-29 09:32:55.000000000","message":"Why did you changed this ?","commit_id":"c7ce47e671119d6ede101bc247fd3c6d1cc13d6d"}]}
