)]}'
{"keystoneclient/authtoken.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"75f07cadbbcffcc0f5d62978a03ae9bbfd596617","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @property"},{"line_number":33,"context_line":"    def username(self):"},{"line_number":34,"context_line":"        return self[\u0027user\u0027].get(\u0027username\u0027, None)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @property"},{"line_number":37,"context_line":"    def user_id(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F97g%3D","line":34,"updated":"2012-10-24 12:42:14.000000000","message":"I honestly can\u0027t remember which is in the v2 spec, but I\u0027m pretty sure we return both:\n\n    self[\u0027user\u0027].get(\u0027username\u0027, self[\u0027user\u0027].get(\u0027name\u0027))","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"dc4a7e802c9751e3bceba15dc243eba3d48c092d","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @property"},{"line_number":33,"context_line":"    def username(self):"},{"line_number":34,"context_line":"        return self[\u0027user\u0027].get(\u0027username\u0027, None)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @property"},{"line_number":37,"context_line":"    def user_id(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9aI%3D","line":34,"in_reply_to":"AAAALn%2F%2F97g%3D","updated":"2012-10-24 19:20:30.000000000","message":"you\u0027re correct - both are returned (I used actual token examples in test_tokenauth.py) - do you think \"name\" is more relevant here than \"username\", or should I check either/or and return the first I find?","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"f6a2888da415ee481c662dabaed4d21076d6a99b","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @property"},{"line_number":33,"context_line":"    def username(self):"},{"line_number":34,"context_line":"        return self[\u0027user\u0027].get(\u0027username\u0027, None)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @property"},{"line_number":37,"context_line":"    def user_id(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F8Ac%3D","line":34,"in_reply_to":"AAAALn%2F%2F9Lo%3D","updated":"2012-10-26 00:35:13.000000000","message":"done.","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3265e3c1d3b8c3e9da63628d0660b39a79183176","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @property"},{"line_number":33,"context_line":"    def username(self):"},{"line_number":34,"context_line":"        return self[\u0027user\u0027].get(\u0027username\u0027, None)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"    @property"},{"line_number":37,"context_line":"    def user_id(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9Lo%3D","line":34,"in_reply_to":"AAAALn%2F%2F9aI%3D","updated":"2012-10-24 22:06:48.000000000","message":"UserForAuthenticateResponse in the corresponding XSD [1] says it should be name, so it\u0027s actually username that\u0027s being included for backwards compatibility. Check for \u0027name\u0027 first, and then fall back on \u0027username\u0027.\n\n[1] https://github.com/openstack/identity-api/blob/master/openstack-identity-api/src/docbkx/common/xsd/token.xsd","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"75f07cadbbcffcc0f5d62978a03ae9bbfd596617","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        return None"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @property"},{"line_number":48,"context_line":"    def scoped(self):"},{"line_number":49,"context_line":"        return (\u0027serviceCatalog\u0027 in self"},{"line_number":50,"context_line":"                and self[\u0027serviceCatalog\u0027]"},{"line_number":51,"context_line":"                and \u0027tenant\u0027 in self[\u0027token\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F97Y%3D","line":48,"updated":"2012-10-24 12:42:14.000000000","message":"doc string?\n\n    Indicates whether the token includes authorization on a specific project.","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"dc4a7e802c9751e3bceba15dc243eba3d48c092d","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        return None"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    @property"},{"line_number":48,"context_line":"    def scoped(self):"},{"line_number":49,"context_line":"        return (\u0027serviceCatalog\u0027 in self"},{"line_number":50,"context_line":"                and self[\u0027serviceCatalog\u0027]"},{"line_number":51,"context_line":"                and \u0027tenant\u0027 in self[\u0027token\u0027])"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9aE%3D","line":48,"in_reply_to":"AAAALn%2F%2F97Y%3D","updated":"2012-10-24 19:20:30.000000000","message":"definitely! Will add. All these properties need docstrings.","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"75f07cadbbcffcc0f5d62978a03ae9bbfd596617","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            if identity_services:"},{"line_number":66,"context_line":"                first_service \u003d identity_services[0]"},{"line_number":67,"context_line":"                first_endpoints \u003d first_service[\u0027endpoints\u0027][0]"},{"line_number":68,"context_line":"                return first_endpoints[\u0027publicURL\u0027]"},{"line_number":69,"context_line":"        return None"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F97M%3D","line":68,"updated":"2012-10-24 12:42:14.000000000","message":"wondering if we can fall back on internalURL here? publicURL is required by the v2 spec, but that doesn\u0027t mean it\u0027s not an empty string","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"dc4a7e802c9751e3bceba15dc243eba3d48c092d","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            if identity_services:"},{"line_number":66,"context_line":"                first_service \u003d identity_services[0]"},{"line_number":67,"context_line":"                first_endpoints \u003d first_service[\u0027endpoints\u0027][0]"},{"line_number":68,"context_line":"                return first_endpoints[\u0027publicURL\u0027]"},{"line_number":69,"context_line":"        return None"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9Zg%3D","line":68,"in_reply_to":"AAAALn%2F%2F97M%3D","updated":"2012-10-24 19:20:30.000000000","message":"I\u0027m a little nervous about falling back to internalURL because as a convention, the internalURL may not be available to an external network - which (I think) is the primary need for auth_url.\n\nWould it make more sense to expose this as tuples (internal: uri), (public: uri), etc?","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3265e3c1d3b8c3e9da63628d0660b39a79183176","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            if identity_services:"},{"line_number":66,"context_line":"                first_service \u003d identity_services[0]"},{"line_number":67,"context_line":"                first_endpoints \u003d first_service[\u0027endpoints\u0027][0]"},{"line_number":68,"context_line":"                return first_endpoints[\u0027publicURL\u0027]"},{"line_number":69,"context_line":"        return None"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9Lc%3D","line":68,"in_reply_to":"AAAALn%2F%2F9Zg%3D","updated":"2012-10-24 22:06:48.000000000","message":"Well, any reachable endpoint is capable of performing auth... so, as an \"auth\" URL, perhaps it *should* be a list (tuples or otherwise)","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3265e3c1d3b8c3e9da63628d0660b39a79183176","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            identity_services \u003d [x for x in self[\u0027serviceCatalog\u0027]"},{"line_number":75,"context_line":"                                 if x[\u0027type\u0027] \u003d\u003d \u0027identity\u0027]"},{"line_number":76,"context_line":"            if identity_services:"},{"line_number":77,"context_line":"                first_service \u003d identity_services[0]"},{"line_number":78,"context_line":"                first_endpoints \u003d first_service[\u0027endpoints\u0027][0]"},{"line_number":79,"context_line":"                return first_endpoints[\u0027adminURL\u0027]"},{"line_number":80,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9LU%3D","line":77,"updated":"2012-10-24 22:06:48.000000000","message":"on a similar note, perhaps iterate through any included identity services? similar problem here as for auth_url","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"75f07cadbbcffcc0f5d62978a03ae9bbfd596617","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            if identity_services:"},{"line_number":77,"context_line":"                first_service \u003d identity_services[0]"},{"line_number":78,"context_line":"                first_endpoints \u003d first_service[\u0027endpoints\u0027][0]"},{"line_number":79,"context_line":"                return first_endpoints[\u0027adminURL\u0027]"},{"line_number":80,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F97E%3D","line":79,"updated":"2012-10-24 12:42:14.000000000","message":"raise some kind of useful exception if adminURL is missing? (user may not have admin privs, so adminURL\u0027s may be excluded from the catalog)","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"dc4a7e802c9751e3bceba15dc243eba3d48c092d","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            if identity_services:"},{"line_number":77,"context_line":"                first_service \u003d identity_services[0]"},{"line_number":78,"context_line":"                first_endpoints \u003d first_service[\u0027endpoints\u0027][0]"},{"line_number":79,"context_line":"                return first_endpoints[\u0027adminURL\u0027]"},{"line_number":80,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9Yo%3D","line":79,"in_reply_to":"AAAALn%2F%2F97E%3D","updated":"2012-10-24 19:20:30.000000000","message":"Makes sense - some variation of a NotFound() Exception with a message reporting that it\u0027s missing?\n\nRight now, I\u0027m returning None if it\u0027s not found (in the case of an unscoped token, for example). Would exceptions make more sense there?","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3265e3c1d3b8c3e9da63628d0660b39a79183176","unresolved":false,"context_lines":[{"line_number":76,"context_line":"            if identity_services:"},{"line_number":77,"context_line":"                first_service \u003d identity_services[0]"},{"line_number":78,"context_line":"                first_endpoints \u003d first_service[\u0027endpoints\u0027][0]"},{"line_number":79,"context_line":"                return first_endpoints[\u0027adminURL\u0027]"},{"line_number":80,"context_line":"        return None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9LY%3D","line":79,"in_reply_to":"AAAALn%2F%2F9Yo%3D","updated":"2012-10-24 22:06:48.000000000","message":"None makes total sense to me, then you can do:\n\n    if keystone.management_url:\n        # etc","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7d356e4404dbdd92ce6b0fdd793d6c9fb8b59113","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        :returns: str"},{"line_number":42,"context_line":"        \"\"\""},{"line_number":43,"context_line":"        name \u003d self[\u0027user\u0027].get(\u0027user\u0027, None)"},{"line_number":44,"context_line":"        if name:"},{"line_number":45,"context_line":"            return name"},{"line_number":46,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAALn%2F%2F74I%3D","line":43,"updated":"2012-10-26 03:37:30.000000000","message":"\u0027user\u0027 -\u003e \u0027name\u0027","commit_id":"7c09df3531a376ccf6209047571d784a3f4e92a7"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"cf6886ac5bd97d656911dc7f03689af2a9aedff0","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        :returns: str"},{"line_number":42,"context_line":"        \"\"\""},{"line_number":43,"context_line":"        name \u003d self[\u0027user\u0027].get(\u0027user\u0027, None)"},{"line_number":44,"context_line":"        if name:"},{"line_number":45,"context_line":"            return name"},{"line_number":46,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAALn%2F%2F6wc%3D","line":43,"in_reply_to":"AAAALn%2F%2F74I%3D","updated":"2012-10-27 21:02:51.000000000","message":"Doh! Thanks!","commit_id":"7c09df3531a376ccf6209047571d784a3f4e92a7"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"7d356e4404dbdd92ce6b0fdd793d6c9fb8b59113","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    def tenant_id(self):"},{"line_number":82,"context_line":"        \"\"\" Returns the tenant (project) id associated with the authentication"},{"line_number":83,"context_line":"        request, or None if the authentication request wasn\u0027t scoped to a"},{"line_number":84,"context_line":"        tenant (project)."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :returns: str"},{"line_number":87,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAALn%2F%2F74E%3D","line":84,"updated":"2012-10-26 03:37:30.000000000","message":"I\u0027m seeing a pattern (project) emerge","commit_id":"7c09df3531a376ccf6209047571d784a3f4e92a7"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"cf6886ac5bd97d656911dc7f03689af2a9aedff0","unresolved":false,"context_lines":[{"line_number":81,"context_line":"    def tenant_id(self):"},{"line_number":82,"context_line":"        \"\"\" Returns the tenant (project) id associated with the authentication"},{"line_number":83,"context_line":"        request, or None if the authentication request wasn\u0027t scoped to a"},{"line_number":84,"context_line":"        tenant (project)."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        :returns: str"},{"line_number":87,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAALn%2F%2F6wE%3D","line":84,"in_reply_to":"AAAALn%2F%2F74E%3D","updated":"2012-10-27 21:02:51.000000000","message":"yeah, getting pedantic, sorry - I just made synonym properties for tenant/project on the authtoken object to make our upcoming transition (hopefully) easier.","commit_id":"7c09df3531a376ccf6209047571d784a3f4e92a7"}],"keystoneclient/client.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"75f07cadbbcffcc0f5d62978a03ae9bbfd596617","unresolved":false,"context_lines":[{"line_number":46,"context_line":"                self.add_certificate(key\u003dkey, cert\u003dcert, domain\u003d\u0027\u0027)"},{"line_number":47,"context_line":"            else:"},{"line_number":48,"context_line":"                self.add_certificate(key\u003dcert, cert\u003dcert, domain\u003d\u0027\u0027)"},{"line_number":49,"context_line":"        self.version \u003d \u0027v2.0\u0027"},{"line_number":50,"context_line":"        self.auth_ref \u003d authtoken.AuthToken(**auth_ref) if auth_ref else None"},{"line_number":51,"context_line":"        if self.auth_ref:"},{"line_number":52,"context_line":"            self.username \u003d self.auth_ref.username"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F97A%3D","line":49,"updated":"2012-10-24 12:42:14.000000000","message":"(just a thought) should this be a class attribute?","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":2218,"name":"Adam Young","email":"adam@younglogic.com","username":"ayoung"},"change_message_id":"a2edd1c81ff61d15e991420aefde5b8770938d01","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        concatenating self.management_url and url and passing in method and"},{"line_number":170,"context_line":"        any associated kwargs. \"\"\""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        kwargs.setdefault(\u0027headers\u0027, {})"},{"line_number":173,"context_line":"        if self.auth_token:"},{"line_number":174,"context_line":"            kwargs[\u0027headers\u0027][\u0027X-Auth-Token\u0027] \u003d self.auth_token"},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAALn%2F%2F2hI%3D","line":172,"updated":"2012-11-01 13:42:36.000000000","message":"If we are using PKI tokens, we have the information on our end to check the expiry.  Should we do that?","commit_id":"34df26f188d7fe42184cb3675d240f0512e3010f"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"f7398ddd4bc097d18e33f2fc66dcfc6de2ffc9f0","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        concatenating self.management_url and url and passing in method and"},{"line_number":170,"context_line":"        any associated kwargs. \"\"\""},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        kwargs.setdefault(\u0027headers\u0027, {})"},{"line_number":173,"context_line":"        if self.auth_token:"},{"line_number":174,"context_line":"            kwargs[\u0027headers\u0027][\u0027X-Auth-Token\u0027] \u003d self.auth_token"},{"line_number":175,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAALn%2F%2F2S8%3D","line":172,"in_reply_to":"AAAALn%2F%2F2hI%3D","updated":"2012-11-01 16:03:31.000000000","message":"good idea - tagged that as a bug https://bugs.launchpad.net/python-keystoneclient/+bug/1074032","commit_id":"34df26f188d7fe42184cb3675d240f0512e3010f"}],"keystoneclient/shell.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"75f07cadbbcffcc0f5d62978a03ae9bbfd596617","unresolved":false,"context_lines":[{"line_number":279,"context_line":"            # but is missing something"},{"line_number":280,"context_line":"            if args.os_token and not ("},{"line_number":281,"context_line":"                    args.os_token and args.os_endpoint):"},{"line_number":282,"context_line":"                if not args.os_token:"},{"line_number":283,"context_line":"                    raise exc.CommandError("},{"line_number":284,"context_line":"                        \u0027Expecting a token provided via either --os-token or \u0027"},{"line_number":285,"context_line":"                        \u0027env[OS_SERVICE_TOKEN]\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F968%3D","line":282,"updated":"2012-10-24 12:42:14.000000000","message":"you just removed the possibility that this if block will ever be hit -- \"if args.os_token and not args.os_token...\"","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"dc4a7e802c9751e3bceba15dc243eba3d48c092d","unresolved":false,"context_lines":[{"line_number":279,"context_line":"            # but is missing something"},{"line_number":280,"context_line":"            if args.os_token and not ("},{"line_number":281,"context_line":"                    args.os_token and args.os_endpoint):"},{"line_number":282,"context_line":"                if not args.os_token:"},{"line_number":283,"context_line":"                    raise exc.CommandError("},{"line_number":284,"context_line":"                        \u0027Expecting a token provided via either --os-token or \u0027"},{"line_number":285,"context_line":"                        \u0027env[OS_SERVICE_TOKEN]\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9Yc%3D","line":282,"in_reply_to":"AAAALn%2F%2F968%3D","updated":"2012-10-24 19:20:30.000000000","message":"erp! good point - will revise","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"}],"keystoneclient/v2_0/client.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"75f07cadbbcffcc0f5d62978a03ae9bbfd596617","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        # FIXME(ja): we should be lazy about setting managment_url."},{"line_number":133,"context_line":"        # in fact we should rewrite the client to support the service"},{"line_number":134,"context_line":"        # catalog (api calls should be directable to any endpoints)"},{"line_number":135,"context_line":"        try:"},{"line_number":136,"context_line":"            self.management_url \u003d self.service_catalog.url_for("},{"line_number":137,"context_line":"                attr\u003d\u0027region\u0027, filter_value\u003dself.region_name,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F96g%3D","side":"PARENT","line":134,"updated":"2012-10-24 12:42:14.000000000","message":"yay!","commit_id":"56a4e4bd7da1353684d34e5a9817b88501e41d8c"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"75f07cadbbcffcc0f5d62978a03ae9bbfd596617","unresolved":false,"context_lines":[{"line_number":37,"context_line":"    :param string password: Password for authentication. (optional)"},{"line_number":38,"context_line":"    :param string token: Token for authentication. (optional)"},{"line_number":39,"context_line":"    :param string tenant_id: Tenant id. (optional)"},{"line_number":40,"context_line":"    :param string tenant_name: Tenant name. (optional)"},{"line_number":41,"context_line":"    :param string auth_url: Keystone service endpoint for authorization."},{"line_number":42,"context_line":"    :param string region_name: Name of a region to select when choosing an"},{"line_number":43,"context_line":"                               endpoint from the service catalog."}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F964%3D","line":40,"updated":"2012-10-24 12:42:14.000000000","message":"nice catch","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"75f07cadbbcffcc0f5d62978a03ae9bbfd596617","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                             to be unsigned - does not verify the certificate"},{"line_number":62,"context_line":"                             chain. default: False (optional)"},{"line_number":63,"context_line":"    :param boolean debug: Enables debug logging of all request and responses"},{"line_number":64,"context_line":"                          to keystone. default False (option)"},{"line_number":65,"context_line":"    :param dict auth_ref: To allow for consumers of the client to manage their"},{"line_number":66,"context_line":"                          own caching strategy, you may initialize a client"},{"line_number":67,"context_line":"                          with a previously captured auth_reference (token)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F960%3D","line":64,"updated":"2012-10-24 12:42:14.000000000","message":"WARNING: May include plaintext passwords.","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"dc4a7e802c9751e3bceba15dc243eba3d48c092d","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                             to be unsigned - does not verify the certificate"},{"line_number":62,"context_line":"                             chain. default: False (optional)"},{"line_number":63,"context_line":"    :param boolean debug: Enables debug logging of all request and responses"},{"line_number":64,"context_line":"                          to keystone. default False (option)"},{"line_number":65,"context_line":"    :param dict auth_ref: To allow for consumers of the client to manage their"},{"line_number":66,"context_line":"                          own caching strategy, you may initialize a client"},{"line_number":67,"context_line":"                          with a previously captured auth_reference (token)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9YY%3D","line":64,"in_reply_to":"AAAALn%2F%2F960%3D","updated":"2012-10-24 19:20:30.000000000","message":"good idea - will include in docstring","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"75f07cadbbcffcc0f5d62978a03ae9bbfd596617","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        \u003e\u003e\u003e # pickle or whatever you like here"},{"line_number":98,"context_line":"        \u003e\u003e\u003e new_client \u003d client.Client(auth_ref\u003dauth_ref)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    Alternately, you can provide the administrative token configured in"},{"line_number":101,"context_line":"    keystone and an endpoint to communicate with directly. In this case,"},{"line_number":102,"context_line":"    authentication() is not needed, and no service catalog will be loaded."},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F96w%3D","line":100,"updated":"2012-10-24 12:42:14.000000000","message":"alternatively?","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"dc4a7e802c9751e3bceba15dc243eba3d48c092d","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        \u003e\u003e\u003e # pickle or whatever you like here"},{"line_number":98,"context_line":"        \u003e\u003e\u003e new_client \u003d client.Client(auth_ref\u003dauth_ref)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    Alternately, you can provide the administrative token configured in"},{"line_number":101,"context_line":"    keystone and an endpoint to communicate with directly. In this case,"},{"line_number":102,"context_line":"    authentication() is not needed, and no service catalog will be loaded."},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9YQ%3D","line":100,"in_reply_to":"AAAALn%2F%2F96w%3D","updated":"2012-10-24 19:20:30.000000000","message":"will update","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"75f07cadbbcffcc0f5d62978a03ae9bbfd596617","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        \u003e\u003e\u003e new_client \u003d client.Client(auth_ref\u003dauth_ref)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    Alternately, you can provide the administrative token configured in"},{"line_number":101,"context_line":"    keystone and an endpoint to communicate with directly. In this case,"},{"line_number":102,"context_line":"    authentication() is not needed, and no service catalog will be loaded."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    Example::"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F96o%3D","line":101,"updated":"2012-10-24 12:42:14.000000000","message":"Add:\n\n    see (``admin_token`` in ``keystone.conf``)","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"dc4a7e802c9751e3bceba15dc243eba3d48c092d","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        \u003e\u003e\u003e new_client \u003d client.Client(auth_ref\u003dauth_ref)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    Alternately, you can provide the administrative token configured in"},{"line_number":101,"context_line":"    keystone and an endpoint to communicate with directly. In this case,"},{"line_number":102,"context_line":"    authentication() is not needed, and no service catalog will be loaded."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    Example::"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9YM%3D","line":101,"in_reply_to":"AAAALn%2F%2F96o%3D","updated":"2012-10-24 19:20:30.000000000","message":"will do","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"75f07cadbbcffcc0f5d62978a03ae9bbfd596617","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    Alternately, you can provide the administrative token configured in"},{"line_number":101,"context_line":"    keystone and an endpoint to communicate with directly. In this case,"},{"line_number":102,"context_line":"    authentication() is not needed, and no service catalog will be loaded."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    Example::"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F96k%3D","line":102,"updated":"2012-10-24 12:42:14.000000000","message":"``authenticate()`` or ``authentication()``?","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"dc4a7e802c9751e3bceba15dc243eba3d48c092d","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    Alternately, you can provide the administrative token configured in"},{"line_number":101,"context_line":"    keystone and an endpoint to communicate with directly. In this case,"},{"line_number":102,"context_line":"    authentication() is not needed, and no service catalog will be loaded."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    Example::"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9YI%3D","line":102,"in_reply_to":"AAAALn%2F%2F96k%3D","updated":"2012-10-24 19:20:30.000000000","message":"authenticate()  - will update","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"75f07cadbbcffcc0f5d62978a03ae9bbfd596617","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        headers \u003d {}"},{"line_number":199,"context_line":"        url \u003d auth_url + \"/tokens\""},{"line_number":200,"context_line":"        if token:"},{"line_number":201,"context_line":"            headers[\u0027X-Auth-Token\u0027] \u003d token"},{"line_number":202,"context_line":"            params \u003d {\"auth\": {\"token\": {\"id\": token}}}"},{"line_number":203,"context_line":"        elif username and password:"},{"line_number":204,"context_line":"            params \u003d {\"auth\": {\"passwordCredentials\": {\"username\": username,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F96c%3D","line":201,"updated":"2012-10-24 12:42:14.000000000","message":"maybe i need more coffee, but why set the x-auth-token?","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"dc4a7e802c9751e3bceba15dc243eba3d48c092d","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        headers \u003d {}"},{"line_number":199,"context_line":"        url \u003d auth_url + \"/tokens\""},{"line_number":200,"context_line":"        if token:"},{"line_number":201,"context_line":"            headers[\u0027X-Auth-Token\u0027] \u003d token"},{"line_number":202,"context_line":"            params \u003d {\"auth\": {\"token\": {\"id\": token}}}"},{"line_number":203,"context_line":"        elif username and password:"},{"line_number":204,"context_line":"            params \u003d {\"auth\": {\"passwordCredentials\": {\"username\": username,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9Xo%3D","line":201,"in_reply_to":"AAAALn%2F%2F96c%3D","updated":"2012-10-24 19:20:30.000000000","message":"I pulled this from what was happening under the covers when this was routing through the Manager/Resource/Create setup. This piece was replicated out of _cs_request in keystoneclient/client.py - the pathing for adding authenticated header into the HTTP request pipeline there","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"f6a2888da415ee481c662dabaed4d21076d6a99b","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        headers \u003d {}"},{"line_number":199,"context_line":"        url \u003d auth_url + \"/tokens\""},{"line_number":200,"context_line":"        if token:"},{"line_number":201,"context_line":"            headers[\u0027X-Auth-Token\u0027] \u003d token"},{"line_number":202,"context_line":"            params \u003d {\"auth\": {\"token\": {\"id\": token}}}"},{"line_number":203,"context_line":"        elif username and password:"},{"line_number":204,"context_line":"            params \u003d {\"auth\": {\"passwordCredentials\": {\"username\": username,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F7%2BI%3D","line":201,"in_reply_to":"AAAALn%2F%2F9LI%3D","updated":"2012-10-26 00:35:13.000000000","message":"I think (suspect?) it\u0027s needed for the use case where we\u0027re using one token to request a rescoped/different token. It was clearly included in the tests - so I tried to preserve that.","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"3265e3c1d3b8c3e9da63628d0660b39a79183176","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        headers \u003d {}"},{"line_number":199,"context_line":"        url \u003d auth_url + \"/tokens\""},{"line_number":200,"context_line":"        if token:"},{"line_number":201,"context_line":"            headers[\u0027X-Auth-Token\u0027] \u003d token"},{"line_number":202,"context_line":"            params \u003d {\"auth\": {\"token\": {\"id\": token}}}"},{"line_number":203,"context_line":"        elif username and password:"},{"line_number":204,"context_line":"            params \u003d {\"auth\": {\"passwordCredentials\": {\"username\": username,"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9LI%3D","line":201,"in_reply_to":"AAAALn%2F%2F9Xo%3D","updated":"2012-10-24 22:06:48.000000000","message":"i would exclude it then -- it\u0027s necessary for token validation (which this obviously is not), but i\u0027m worried the response from keystone will be misleading if the token is bad.","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":1816,"name":"Gabriel Hurley","email":"gabriel.hurley@nebula.com","username":"gabriel-hurley"},"change_message_id":"28ca8c9d66d7fe861cff0d7c6724f7e6411bab7c","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            self.auth_token \u003d self.auth_ref.auth_token"},{"line_number":184,"context_line":"            if self.auth_ref.scoped:"},{"line_number":185,"context_line":"                if self.management_url is None:"},{"line_number":186,"context_line":"                    self.management_url \u003d self.auth_ref.management_url[0]"},{"line_number":187,"context_line":"                self.tenant_name \u003d self.auth_ref.tenant_name"},{"line_number":188,"context_line":"                self.tenant_id \u003d self.auth_ref.tenant_id"},{"line_number":189,"context_line":"                self.user_id \u003d self.auth_ref.user_id"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAALn%2F%2F2F4%3D","line":186,"updated":"2012-11-01 19:02:19.000000000","message":"There\u0027s a subtle problem here:\n\n  1. instantiate the client using username, password and auth_url; authenticate is called implicitly.\n\n  2. authentication happens, returning an unscoped token.\n\n  3. code here checks for a scoped token and only sets the management URL if it finds one.\n\n  4. the instantiated client is then returned, seemingly ready to use.\n\n  5. Try to make any other call.\n\n  6. Watch it blow up with an \"unsupported operation for string and NoneType\" error because it\u0027s trying to append the API url fragment to self.management_url which isn\u0027t set.","commit_id":"34df26f188d7fe42184cb3675d240f0512e3010f"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"2dc5694f39a0832de86a60e2ee0ff89352d81756","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            self.auth_token \u003d self.auth_ref.auth_token"},{"line_number":184,"context_line":"            if self.auth_ref.scoped:"},{"line_number":185,"context_line":"                if self.management_url is None:"},{"line_number":186,"context_line":"                    self.management_url \u003d self.auth_ref.management_url[0]"},{"line_number":187,"context_line":"                self.tenant_name \u003d self.auth_ref.tenant_name"},{"line_number":188,"context_line":"                self.tenant_id \u003d self.auth_ref.tenant_id"},{"line_number":189,"context_line":"                self.user_id \u003d self.auth_ref.user_id"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAALn%2F%2F1%2FI%3D","line":186,"in_reply_to":"AAAALn%2F%2F2F4%3D","updated":"2012-11-01 20:42:03.000000000","message":"chatting with Gabriel - we need to be able to minimally \"list tenants\" through the managers so that we can request a tenant-scoped token for usage.\n\nAlso exception on no mgmt_url set is horrific and needs to be more sensible.","commit_id":"34df26f188d7fe42184cb3675d240f0512e3010f"}],"tests/test_authtoken.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"75f07cadbbcffcc0f5d62978a03ae9bbfd596617","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        self.assertFalse(auth_ref[\u0027serviceCatalog\u0027])"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.assertEquals(auth_ref.auth_token,"},{"line_number":89,"context_line":"                          \u00273e2813b7ba0b4006840c3825860b86ed\u0027)"},{"line_number":90,"context_line":"        self.assertEquals(auth_ref.username, \u0027exampleuser\u0027)"},{"line_number":91,"context_line":"        self.assertEquals(auth_ref.user_id, \u0027c4da488862bd435c9e6c0275a0d0e49a\u0027)"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F96U%3D","line":89,"updated":"2012-10-24 12:42:14.000000000","message":"side note: i\u0027m starting to use uuid\u0027s truncated to 6 characters for stuff like this -- since the string itself is opaque, 6 characters is random enough to be illustrative and results in cleaner code in  cases exactly like this :)","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"dc4a7e802c9751e3bceba15dc243eba3d48c092d","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        self.assertFalse(auth_ref[\u0027serviceCatalog\u0027])"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        self.assertEquals(auth_ref.auth_token,"},{"line_number":89,"context_line":"                          \u00273e2813b7ba0b4006840c3825860b86ed\u0027)"},{"line_number":90,"context_line":"        self.assertEquals(auth_ref.username, \u0027exampleuser\u0027)"},{"line_number":91,"context_line":"        self.assertEquals(auth_ref.user_id, \u0027c4da488862bd435c9e6c0275a0d0e49a\u0027)"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9XY%3D","line":89,"in_reply_to":"AAAALn%2F%2F96U%3D","updated":"2012-10-24 19:20:30.000000000","message":"heh - I took actual tokens, so I was trying to preserve the actual data for the testing as a use case.","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"}],"tests/v2_0/test_auth.py":[{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"75f07cadbbcffcc0f5d62978a03ae9bbfd596617","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            }),"},{"line_number":66,"context_line":"        })"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        # Implicit retry on API calls, so it gets called twice"},{"line_number":69,"context_line":"        httplib2.Http.request(self.TEST_URL + \"/tokens\","},{"line_number":70,"context_line":"                              \u0027POST\u0027,"},{"line_number":71,"context_line":"                              body\u003djson.dumps(self.TEST_REQUEST_BODY),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F96Q%3D","line":68,"updated":"2012-10-24 12:42:14.000000000","message":"remove the comment","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"},{"author":{"_account_id":6,"name":"Joe Heck","email":"heckj@mac.com","username":"heckj"},"change_message_id":"dc4a7e802c9751e3bceba15dc243eba3d48c092d","unresolved":false,"context_lines":[{"line_number":65,"context_line":"            }),"},{"line_number":66,"context_line":"        })"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        # Implicit retry on API calls, so it gets called twice"},{"line_number":69,"context_line":"        httplib2.Http.request(self.TEST_URL + \"/tokens\","},{"line_number":70,"context_line":"                              \u0027POST\u0027,"},{"line_number":71,"context_line":"                              body\u003djson.dumps(self.TEST_REQUEST_BODY),"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAALn%2F%2F9XU%3D","line":68,"in_reply_to":"AAAALn%2F%2F96Q%3D","updated":"2012-10-24 19:20:30.000000000","message":"duh! will do","commit_id":"8712c44c8f61cfbe11d66a334f34268b450351fc"}]}
