)]}'
{"heat/common/auth_password.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c393500603e171625bbd78fe2e71605eab6ac95e","unresolved":false,"context_lines":[{"line_number":52,"context_line":"            ctx \u003d context.RequestContext(username\u003dusername, password\u003dpassword,"},{"line_number":53,"context_line":"                                         tenant_id\u003dtenant, auth_url\u003dauth_url,"},{"line_number":54,"context_line":"                                         is_admin\u003dFalse)"},{"line_number":55,"context_line":"            session \u003d heat_keystoneclient.KeystoneClient(ctx).session"},{"line_number":56,"context_line":"            auth_ref \u003d ctx.auth_plugin.get_access(session)"},{"line_number":57,"context_line":"        except (keystone_exceptions.Unauthorized,"},{"line_number":58,"context_line":"                keystone_exceptions.Forbidden,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_0fc40c40","line":55,"updated":"2015-01-12 03:22:20.000000000","message":"we don\u0027t really even need to build the heat_keystoneclient here. The context is ignored after the client is created, we only care about the plugin so just build a v3.Password here and get the auth_ref from that.","commit_id":"c35732d9da8e2aaa70e7a0fe52141a8091d986a8"}],"heat/common/context.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c393500603e171625bbd78fe2e71605eab6ac95e","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"# FIXME(jamielennox): I copied this out of a review that is proposed against"},{"line_number":35,"context_line":"# keystoneclient which can be used when available."},{"line_number":36,"context_line":"class _AccessInfoPlugin(base.BaseIdentityPlugin):"},{"line_number":37,"context_line":"    \"\"\"A plugin that turns an existing AccessInfo object into a usable plugin."},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_8fdf1c0c","line":35,"updated":"2015-01-12 03:22:20.000000000","message":"link the review","commit_id":"c35732d9da8e2aaa70e7a0fe52141a8091d986a8"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c393500603e171625bbd78fe2e71605eab6ac95e","unresolved":false,"context_lines":[{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        return auth_uri.replace(\u0027v2.0\u0027, \u0027v3\u0027)"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def _create_auth_plugin(self):"},{"line_number":167,"context_line":"        if self.trust_id:"},{"line_number":168,"context_line":"            importutils.import_module(\u0027keystonemiddleware.auth_token\u0027)"},{"line_number":169,"context_line":"            username \u003d cfg.CONF.keystone_authtoken.admin_user"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_6f01106d","line":166,"updated":"2015-01-12 03:22:20.000000000","message":"i\u0027m not sure if i\u0027ve got this slightly wrong of if heat\u0027s auth is wonky. \n\nIf i get a user authentication with trust_id data in it why do i then reauthenticate as the heat user with that information? why don\u0027t i just use the user token directly?","commit_id":"c35732d9da8e2aaa70e7a0fe52141a8091d986a8"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"b7b6f50d01c46ec11f80fdc771d6430b971a1c89","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            # url_for wont work. Stub with the keystone endpoint so at"},{"line_number":189,"context_line":"            # least it might be right."},{"line_number":190,"context_line":"            return token_endpoint.Token(endpoint\u003dself._keystone_v3_endpoint,"},{"line_number":191,"context_line":"                                        token\u003dself.auth_token)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        if self.password:"},{"line_number":194,"context_line":"            return v3.Password(username\u003dself.username,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_9217ae53","line":191,"updated":"2015-01-15 14:51:13.000000000","message":"It\u0027s not really clear to me if if we can ever hit this?  AFAIK auth_token_info should be set for all API driven requests, because the auth_token middleware will have setup token_info after validating the token?","commit_id":"e857b4b678df526e13f79de67799b8f5e551c4b8"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"109d6b9bb3ead2e3c1d0efd391f14de2e0d2a2a9","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            # url_for wont work. Stub with the keystone endpoint so at"},{"line_number":189,"context_line":"            # least it might be right."},{"line_number":190,"context_line":"            return token_endpoint.Token(endpoint\u003dself._keystone_v3_endpoint,"},{"line_number":191,"context_line":"                                        token\u003dself.auth_token)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        if self.password:"},{"line_number":194,"context_line":"            return v3.Password(username\u003dself.username,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_bde8ebdf","line":191,"in_reply_to":"3a961159_9217ae53","updated":"2015-01-15 23:51:56.000000000","message":"I agree. From looking at the older code if you provide both the endpoint and the auth_token to the Client constructor then it won\u0027t go out and fetch auth, which means there won\u0027t be an auth_ref in the client and so none of the user_id or other fetching would work.\n\nI\u0027m pretty sure there are some testing bugs though as i\u0027ve had to stub this out.","commit_id":"e857b4b678df526e13f79de67799b8f5e551c4b8"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"6bc591a66ee2148ddaa6f279ceaf20ad2840ea59","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            # url_for wont work. Stub with the keystone endpoint so at"},{"line_number":189,"context_line":"            # least it might be right."},{"line_number":190,"context_line":"            return token_endpoint.Token(endpoint\u003dself._keystone_v3_endpoint,"},{"line_number":191,"context_line":"                                        token\u003dself.auth_token)"},{"line_number":192,"context_line":""},{"line_number":193,"context_line":"        if self.password:"},{"line_number":194,"context_line":"            return v3.Password(username\u003dself.username,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_c68b1c1c","line":191,"in_reply_to":"3a961159_bde8ebdf","updated":"2015-01-16 09:50:18.000000000","message":"It\u0027s probably historical - we used to always get a new token, but I made a change so we used token_info instead, which improved performance for some users.  I\u0027m guessing we ended up with some dead tests and this dead code path at that point.\n\nHere\u0027s the patch which does that, some related changes linked from the associated bug:\n\nhttps://review.openstack.org/#/c/99769/","commit_id":"e857b4b678df526e13f79de67799b8f5e551c4b8"}],"heat/common/heat_keystoneclient.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c393500603e171625bbd78fe2e71605eab6ac95e","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                                      \u0027specify \"stack_user_domain_id\" or \u0027"},{"line_number":110,"context_line":"                                      \u0027\"stack_user_domain_name\" without \u0027"},{"line_number":111,"context_line":"                                      \u0027\"stack_domain_admin\" and \u0027"},{"line_number":112,"context_line":"                                      \u0027\"stack_domain_admin_password\"\u0027))"},{"line_number":113,"context_line":"        else:"},{"line_number":114,"context_line":"            LOG.warn(_LW(\u0027stack_user_domain_id or stack_user_domain_name not \u0027"},{"line_number":115,"context_line":"                         \u0027set in heat.conf falling back to using default\u0027))"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_eff4208a","line":112,"updated":"2015-01-12 03:22:20.000000000","message":"unrelated.","commit_id":"c35732d9da8e2aaa70e7a0fe52141a8091d986a8"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c393500603e171625bbd78fe2e71605eab6ac95e","unresolved":false,"context_lines":[{"line_number":179,"context_line":"                # Sanity check that impersonation is effective"},{"line_number":180,"context_line":"                if self.context.trustor_user_id !\u003d auth_ref.user_id:"},{"line_number":181,"context_line":"                    LOG.error(_LE(\"Trust impersonation failed\"))"},{"line_number":182,"context_line":"                    raise exception.AuthorizationFailure()"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        return client"},{"line_number":185,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_0ff24c9b","line":182,"updated":"2015-01-12 03:22:20.000000000","message":"maybe all this checking should be moved to the _create_auth_plugin in context?","commit_id":"c35732d9da8e2aaa70e7a0fe52141a8091d986a8"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c393500603e171625bbd78fe2e71605eab6ac95e","unresolved":false,"context_lines":[{"line_number":278,"context_line":"        if(len(username) \u003e 64):"},{"line_number":279,"context_line":"            LOG.warn(_LW(\"Truncating the username %s to the last 64 \""},{"line_number":280,"context_line":"                         \"characters.\"), username)"},{"line_number":281,"context_line":"        #get the last 64 characters of the username"},{"line_number":282,"context_line":"        return username[-64:]"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"    def _get_domain_id_from_name(self, domain_name):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_2fef08b3","line":281,"updated":"2015-01-12 03:22:20.000000000","message":"unrelated","commit_id":"c35732d9da8e2aaa70e7a0fe52141a8091d986a8"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"109d6b9bb3ead2e3c1d0efd391f14de2e0d2a2a9","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        # where a specific endpoint will be specified, and user-data"},{"line_number":344,"context_line":"        # space is limited..)"},{"line_number":345,"context_line":"        # Note we do this directly via a post as there\u0027s currently"},{"line_number":346,"context_line":"        # no way to get a nocatalog token via keystoneclient"},{"line_number":347,"context_line":"        token_url \u003d \"%s/auth/tokens?nocatalog\" % self.v3_endpoint"},{"line_number":348,"context_line":"        headers \u003d {\u0027Accept\u0027: \u0027application/json\u0027}"},{"line_number":349,"context_line":"        if self._stack_domain_is_id:"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_68e7a312","line":346,"updated":"2015-01-15 23:51:56.000000000","message":"https://review.openstack.org/#/c/142991/","commit_id":"e857b4b678df526e13f79de67799b8f5e551c4b8"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"b7b6f50d01c46ec11f80fdc771d6430b971a1c89","unresolved":false,"context_lines":[{"line_number":357,"context_line":"                             \u0027password\u0027: password, \u0027id\u0027: user_id}},"},{"line_number":358,"context_line":"                             \u0027methods\u0027: [\u0027password\u0027]}}}"},{"line_number":359,"context_line":"        t \u003d self.session.post(token_url, headers\u003dheaders,"},{"line_number":360,"context_line":"                              json\u003dbody, authenticated\u003dFalse)"},{"line_number":361,"context_line":"        return t.headers[\u0027X-Subject-Token\u0027]"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def create_stack_domain_user(self, username, project_id, password\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_154ac826","line":360,"updated":"2015-01-15 14:51:13.000000000","message":"Hmm, I\u0027m not sure this is what we want here - this uses the current request context to get a token scoped to a different user (in a different domain), will that even work?\n\nThe idea here is that we\u0027re getting a token scoped to the user/project/password specified in the function arguments, in the \"stack domain user\" domain - this is used for situations where we want to pass a token into an (implicitly untrusted) instance, so using the request context here makes me a little uneasy..\n\nFor example, if the user creating the stack is \"steve\" in domain \"default\", and the user passed in here is the user \"WaitCondition\" in domain \"heat\", how does \"steve\" have permission to get a token scoped to a project/domain where he has no roles?","commit_id":"e857b4b678df526e13f79de67799b8f5e551c4b8"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"6bc591a66ee2148ddaa6f279ceaf20ad2840ea59","unresolved":false,"context_lines":[{"line_number":357,"context_line":"                             \u0027password\u0027: password, \u0027id\u0027: user_id}},"},{"line_number":358,"context_line":"                             \u0027methods\u0027: [\u0027password\u0027]}}}"},{"line_number":359,"context_line":"        t \u003d self.session.post(token_url, headers\u003dheaders,"},{"line_number":360,"context_line":"                              json\u003dbody, authenticated\u003dFalse)"},{"line_number":361,"context_line":"        return t.headers[\u0027X-Subject-Token\u0027]"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def create_stack_domain_user(self, username, project_id, password\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_c6079c7f","line":360,"in_reply_to":"3a961159_0809bfdc","updated":"2015-01-16 09:50:18.000000000","message":"Ah, I get it now - so the POST to get the token isn\u0027t actually using the credentials associated with self.session, meaning the previous auth plugin initialized with the user/password isn\u0027t actually needed.\n\nI guess at the time I was thinking I wanted something completely isolated from the request credentials, so I created the new session/plugin to ensure I was only using the credentials passed into the function.\n\nGiven your explanation this is probably fine, but I may write a quick functional test just to prove it works as expected :)","commit_id":"e857b4b678df526e13f79de67799b8f5e551c4b8"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"109d6b9bb3ead2e3c1d0efd391f14de2e0d2a2a9","unresolved":false,"context_lines":[{"line_number":357,"context_line":"                             \u0027password\u0027: password, \u0027id\u0027: user_id}},"},{"line_number":358,"context_line":"                             \u0027methods\u0027: [\u0027password\u0027]}}}"},{"line_number":359,"context_line":"        t \u003d self.session.post(token_url, headers\u003dheaders,"},{"line_number":360,"context_line":"                              json\u003dbody, authenticated\u003dFalse)"},{"line_number":361,"context_line":"        return t.headers[\u0027X-Subject-Token\u0027]"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"    def create_stack_domain_user(self, username, project_id, password\u003dNone):"}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_0809bfdc","line":360,"in_reply_to":"3a961159_154ac826","updated":"2015-01-15 23:51:56.000000000","message":"So i think i understand the concern, however i don\u0027t think what you are expecting is lining up with the code. \n\nThe auth plugin that is being created above is not being used at all. There are essentially two pieces of information that can be retrieved from an auth plugin, get_endpoint for getting the URL for a service from the catalog and get_token which adds an X-Auth-Token to requests that pass through it. \n\nThe code doesn\u0027t use the endpoint because we provide a full URL to the post, and there is explicitly an authenticated\u003dFalse which prevents X-Auth-Token from being added to the request. Thus, it does nothing (it only auths on demand so there is no auth request being sent to keystone). \n\nThe other change i\u0027ve made to this method is to use self.session rather than a new session. This means that it will use the [clients_keystone] TLS options rather than system defaults - i assumed that this was more correct.","commit_id":"e857b4b678df526e13f79de67799b8f5e551c4b8"}],"heat/engine/clients/os/cinder.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c393500603e171625bbd78fe2e71605eab6ac95e","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        for version, service_type in ((2, \u0027volumev2\u0027), (1, \u0027volume\u0027)):"},{"line_number":38,"context_line":"            if self.url_for(service_type\u003dservice_type,"},{"line_number":39,"context_line":"                            interface\u003dendpoint_type):"},{"line_number":40,"context_line":"                return version"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _create(self):"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_0f396c3f","line":40,"updated":"2015-01-12 03:22:20.000000000","message":"does it matter that we\u0027ve changed this behaviour? should i raise EndpointNotFound in url_for and leave this as it was?","commit_id":"c35732d9da8e2aaa70e7a0fe52141a8091d986a8"},{"author":{"_account_id":4328,"name":"Steven Hardy","email":"steven.hardy@suse.com","username":"shardy"},"change_message_id":"b7b6f50d01c46ec11f80fdc771d6430b971a1c89","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        for version, service_type in ((2, \u0027volumev2\u0027), (1, \u0027volume\u0027)):"},{"line_number":38,"context_line":"            if self.url_for(service_type\u003dservice_type,"},{"line_number":39,"context_line":"                            interface\u003dendpoint_type):"},{"line_number":40,"context_line":"                return version"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _create(self):"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_d5af609b","line":40,"updated":"2015-01-15 14:51:13.000000000","message":"Not a huge deal, but I guess this could be a separate change?","commit_id":"e857b4b678df526e13f79de67799b8f5e551c4b8"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"109d6b9bb3ead2e3c1d0efd391f14de2e0d2a2a9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        for version, service_type in ((2, \u0027volumev2\u0027), (1, \u0027volume\u0027)):"},{"line_number":38,"context_line":"            if self.url_for(service_type\u003dservice_type,"},{"line_number":39,"context_line":"                            interface\u003dendpoint_type):"},{"line_number":40,"context_line":"                return version"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def _create(self):"},{"line_number":43,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"3a961159_deae942e","line":40,"in_reply_to":"3a961159_d5af609b","updated":"2015-01-15 23:51:56.000000000","message":"largely - the change is because url_for no longer raises an EndpointNotFound exception, instead it returns None to indicate not found. \n\nI can keep this consistent if i raise the error in ClientPlugin.url_for but it appears that most places that use url_for don\u0027t actually check for EndpointNotFound anyway.","commit_id":"e857b4b678df526e13f79de67799b8f5e551c4b8"}],"heat/tests/fakes.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c393500603e171625bbd78fe2e71605eab6ac95e","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        self.user_id \u003d user_id"},{"line_number":106,"context_line":"        self.access \u003d access"},{"line_number":107,"context_line":"        self.secret \u003d secret"},{"line_number":108,"context_line":"        self.session \u003d session.Session()"},{"line_number":109,"context_line":"        self.credential_id \u003d credential_id"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        class FakeCred(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_af093886","line":108,"updated":"2015-01-12 03:22:20.000000000","message":"should be a mock?","commit_id":"c35732d9da8e2aaa70e7a0fe52141a8091d986a8"}],"heat/tests/test_clients.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c393500603e171625bbd78fe2e71605eab6ac95e","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        con.tenant_id \u003d \"b363706f891f48019483f8bd6503c54b\""},{"line_number":81,"context_line":"        con.auth_token \u003d None"},{"line_number":82,"context_line":"        # con.trust_id \u003d None"},{"line_number":83,"context_line":"        con.auth_plugin \u003d fakes.FakeAuth(auth_token\u003d\u0027anewtoken\u0027)"},{"line_number":84,"context_line":"        c \u003d clients.Clients(con)"},{"line_number":85,"context_line":"        con.clients \u003d c"},{"line_number":86,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_ef698027","line":83,"updated":"2015-01-12 03:22:20.000000000","message":"use stub_auth to be like original. \n\nremove commented line","commit_id":"c35732d9da8e2aaa70e7a0fe52141a8091d986a8"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c393500603e171625bbd78fe2e71605eab6ac95e","unresolved":false,"context_lines":[{"line_number":124,"context_line":"    #     self.assertIsNotNone(obj.client(\u0027heat\u0027))"},{"line_number":125,"context_line":"    #     self.assertEqual(\u0027token1\u0027, obj.auth_token)"},{"line_number":126,"context_line":"    #     fkc.auth_token \u003d \u0027token2\u0027"},{"line_number":127,"context_line":"    #     self.assertEqual(\u0027token2\u0027, obj.auth_token)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"class FooClientsPlugin(client_plugin.ClientPlugin):"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_af577859","line":127,"updated":"2015-01-12 03:22:20.000000000","message":"what should the behaviour of this test be? It doesn\u0027t make sense that i should allow setting the auth_token on keystoneclient to change this any more.\n\nmaybe just remove it and deal with it in reviews?","commit_id":"c35732d9da8e2aaa70e7a0fe52141a8091d986a8"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c393500603e171625bbd78fe2e71605eab6ac95e","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        plugin \u003d FooClientsPlugin(con)"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        # assert token is from keystone rather than context"},{"line_number":181,"context_line":"        # even though both are set"},{"line_number":182,"context_line":"        self.assertEqual(\u00275678\u0027, plugin.auth_token)"},{"line_number":183,"context_line":"        con.auth_plugin.get_token.assert_called()"},{"line_number":184,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_4f48d4b3","line":181,"updated":"2015-01-12 03:22:20.000000000","message":"update comment","commit_id":"c35732d9da8e2aaa70e7a0fe52141a8091d986a8"}],"heat/tests/test_heatclient.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c393500603e171625bbd78fe2e71605eab6ac95e","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        self.mock_ks_v3_client \u003d self.m.CreateMock(kc_v3.Client)"},{"line_number":47,"context_line":"        self.mock_ks_v3_client_domain_mngr \u003d self.m.CreateMock("},{"line_number":48,"context_line":"            kc_v3_domains.DomainManager)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        self.m.StubOutWithMock(kc_v3, \"Client\")"},{"line_number":51,"context_line":"        self.m.StubOutWithMock(ks_auth_v3, \u0027Password\u0027)"},{"line_number":52,"context_line":"        self.m.StubOutWithMock(ks_token_endpoint, \u0027Token\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_8fc9dc27","line":49,"updated":"2015-01-12 03:22:20.000000000","message":"revert newline","commit_id":"c35732d9da8e2aaa70e7a0fe52141a8091d986a8"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"a2bd95c43cd637e12b6c32773366591c513f61b5","unresolved":false,"context_lines":[{"line_number":48,"context_line":"            kc_v3_domains.DomainManager)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        self.m.StubOutWithMock(kc_v3, \"Client\")"},{"line_number":51,"context_line":"        self.m.StubOutWithMock(ks_auth_v3, \u0027Password\u0027)"},{"line_number":52,"context_line":"        self.m.StubOutWithMock(ks_token_endpoint, \u0027Token\u0027)"},{"line_number":53,"context_line":"        self.m.StubOutWithMock(context, \u0027_AccessInfoPlugin\u0027)"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_4a5c421a","line":51,"updated":"2015-01-12 03:46:47.000000000","message":"existing use kc_, use that instead of ks_","commit_id":"c35732d9da8e2aaa70e7a0fe52141a8091d986a8"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"c393500603e171625bbd78fe2e71605eab6ac95e","unresolved":false,"context_lines":[{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    def _stub_admin_client(self, auth_ok\u003dTrue):"},{"line_number":73,"context_line":"        # kc_v3.Client(session\u003dmox.IsA(ks_session.Session),"},{"line_number":74,"context_line":"        #              auth\u003dmox.IsA(ks_auth_v3.Password)).AndReturn(self.mock_admin_client)"},{"line_number":75,"context_line":"        kc_v3.Client("},{"line_number":76,"context_line":"            auth_url\u003d\u0027http://server.test:5000/v3\u0027,"},{"line_number":77,"context_line":"            cacert\u003dNone,"}],"source_content_type":"text/x-python","patch_set":1,"id":"3a961159_cfd3e4d3","line":74,"updated":"2015-01-12 03:22:20.000000000","message":"remove commented out code","commit_id":"c35732d9da8e2aaa70e7a0fe52141a8091d986a8"}]}
