)]}'
{"keystoneclient/auth/identity/base.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ca4b95f4b2e0801f68af9f2dbdd2d83db70a1324","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"3ae8d1ca_6b3bcdeb","updated":"2014-05-27 05:27:44.000000000","message":"this should probably be in a separate change set","commit_id":"1aabc6d54ca4f72d096c895c129bd6764c4b4323"},{"author":{"_account_id":11333,"name":"David J Hu","email":"david.hu@hpe.com","username":"dhu"},"change_message_id":"bee35d58816e3792ab06d67b230f10ec65241112","unresolved":false,"context_lines":[{"line_number":228,"context_line":"        :param str url: The url to lookup."},{"line_number":229,"context_line":"        :param bool authenticated: Include a token in the discovery call."},{"line_number":230,"context_line":"                                   (optional) Defaults to None (use a token"},{"line_number":231,"context_line":"                                   if a plugin is installed)."},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        :raises: DiscoveryFailure if for some reason the lookup fails."},{"line_number":234,"context_line":"        :raises: HttpError An error from an invalid HTTP response."}],"source_content_type":"text/x-python","patch_set":13,"id":"7ac7a964_3ccba7a6","line":231,"updated":"2014-08-14 21:09:18.000000000","message":"Thanks for taking my comment into consideration.","commit_id":"c5dc65b54db42b9111053a184c7d9fe3b82ca71d"}],"keystoneclient/auth/identity/generic/base.py":[{"author":{"_account_id":11333,"name":"David J Hu","email":"david.hu@hpe.com","username":"dhu"},"change_message_id":"280b19fab548444299f815def155827ef1eeb216","unresolved":false,"context_lines":[{"line_number":27,"context_line":"def get_options():"},{"line_number":28,"context_line":"    return base.get_options() + ["},{"line_number":29,"context_line":"        cfg.StrOpt(\u0027domain-id\u0027, help\u003d\u0027Domain ID to scope to\u0027),"},{"line_number":30,"context_line":"        cfg.StrOpt(\u0027domain-name\u0027, help\u003d\u0027Domain name to scope to\u0027),"},{"line_number":31,"context_line":"        cfg.StrOpt(\u0027tenant-id\u0027, help\u003d\u0027Tenant ID to scope to\u0027),"},{"line_number":32,"context_line":"        cfg.StrOpt(\u0027tenant-name\u0027, help\u003d\u0027Tenant name to scope to\u0027),"},{"line_number":33,"context_line":"        cfg.StrOpt(\u0027project-id\u0027, help\u003d\u0027Project ID to scope to\u0027),"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_db982779","line":30,"updated":"2014-08-12 18:28:35.000000000","message":"I aware of the following domain related args, but not domain-id and domain-name.\n\n  --os-user-domain-id OS_USER_DOMAIN_ID\n  --os-user-domain-name OS_USER_DOMAIN_NAME\n  --os-project-domain-id OS_PROJECT_DOMAIN_ID\n  --os-project-domain-name OS_PROJECT_DOMAIN_NAME\n\nuser_domain_* is covered under password.py in the same patch set.  Both domain-id and domain-name should be removed.","commit_id":"0740b255cf4ec58a49ea1193dc04e6acc9c6825d"},{"author":{"_account_id":11333,"name":"David J Hu","email":"david.hu@hpe.com","username":"dhu"},"change_message_id":"280b19fab548444299f815def155827ef1eeb216","unresolved":false,"context_lines":[{"line_number":51,"context_line":"                 project_domain_id\u003dNone,"},{"line_number":52,"context_line":"                 project_domain_name\u003dNone,"},{"line_number":53,"context_line":"                 domain_id\u003dNone,"},{"line_number":54,"context_line":"                 domain_name\u003dNone,"},{"line_number":55,"context_line":"                 trust_id\u003dNone):"},{"line_number":56,"context_line":"        super(BaseGenericPlugin, self).__init__(auth_url\u003dauth_url)"},{"line_number":57,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_bb729349","line":54,"updated":"2014-08-12 18:28:35.000000000","message":"Same comment as above regarding domain_is and domain_name.","commit_id":"0740b255cf4ec58a49ea1193dc04e6acc9c6825d"},{"author":{"_account_id":11333,"name":"David J Hu","email":"david.hu@hpe.com","username":"dhu"},"change_message_id":"280b19fab548444299f815def155827ef1eeb216","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                \u0027project_domain_id\u0027: self._project_domain_id,"},{"line_number":90,"context_line":"                \u0027project_domain_name\u0027: self._project_domain_name,"},{"line_number":91,"context_line":"                \u0027domain_id\u0027: self._domain_id,"},{"line_number":92,"context_line":"                \u0027domain_name\u0027: self._domain_name}"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def _do_create_plugin(self, session):"},{"line_number":95,"context_line":"        plugin \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_981f95b9","line":92,"updated":"2014-08-12 18:28:35.000000000","message":"Same comment as above.","commit_id":"0740b255cf4ec58a49ea1193dc04e6acc9c6825d"},{"author":{"_account_id":11333,"name":"David J Hu","email":"david.hu@hpe.com","username":"dhu"},"change_message_id":"2235b19806b273ae64b9f3e67568c780c7b5d8e9","unresolved":false,"context_lines":[{"line_number":27,"context_line":"def get_options():"},{"line_number":28,"context_line":"    return base.get_options() + ["},{"line_number":29,"context_line":"        cfg.StrOpt(\u0027domain-id\u0027, help\u003d\u0027Domain ID to scope to\u0027),"},{"line_number":30,"context_line":"        cfg.StrOpt(\u0027domain-name\u0027, help\u003d\u0027Domain name to scope to\u0027),"},{"line_number":31,"context_line":"        cfg.StrOpt(\u0027tenant-id\u0027, help\u003d\u0027Tenant ID to scope to\u0027),"},{"line_number":32,"context_line":"        cfg.StrOpt(\u0027tenant-name\u0027, help\u003d\u0027Tenant name to scope to\u0027),"},{"line_number":33,"context_line":"        cfg.StrOpt(\u0027project-id\u0027, help\u003d\u0027Project ID to scope to\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_4d7c2872","line":30,"updated":"2014-08-13 16:58:43.000000000","message":"One of my comments from the previous patch was related to the usage of domain-id and domain-name.  Python clients which migrated to keystone v3 API do not parse --os-domain-id nor --os-domain-name.  Is it really needed in additional to project-domain-* and user-domain-*?","commit_id":"9cc9867faa45a484a0fdc00ee15c5945b033b902"},{"author":{"_account_id":11333,"name":"David J Hu","email":"david.hu@hpe.com","username":"dhu"},"change_message_id":"f0544f662c2b3bfa6f9fc6078f63bbda3aab5a5a","unresolved":false,"context_lines":[{"line_number":27,"context_line":"def get_options():"},{"line_number":28,"context_line":"    return base.get_options() + ["},{"line_number":29,"context_line":"        cfg.StrOpt(\u0027domain-id\u0027, help\u003d\u0027Domain ID to scope to\u0027),"},{"line_number":30,"context_line":"        cfg.StrOpt(\u0027domain-name\u0027, help\u003d\u0027Domain name to scope to\u0027),"},{"line_number":31,"context_line":"        cfg.StrOpt(\u0027tenant-id\u0027, help\u003d\u0027Tenant ID to scope to\u0027),"},{"line_number":32,"context_line":"        cfg.StrOpt(\u0027tenant-name\u0027, help\u003d\u0027Tenant name to scope to\u0027),"},{"line_number":33,"context_line":"        cfg.StrOpt(\u0027project-id\u0027, help\u003d\u0027Project ID to scope to\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"7ac7a964_fc74cf9d","line":30,"in_reply_to":"7ac7a964_f0b8a02c","updated":"2014-08-14 21:03:30.000000000","message":"Sounds like a good approach to me.  I like the idea of treating keystone a special case.  For clients that do not care, simply use the parent class.","commit_id":"9cc9867faa45a484a0fdc00ee15c5945b033b902"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"f4493709694f2825e2314454286a5156fa8fef15","unresolved":false,"context_lines":[{"line_number":27,"context_line":"def get_options():"},{"line_number":28,"context_line":"    return base.get_options() + ["},{"line_number":29,"context_line":"        cfg.StrOpt(\u0027domain-id\u0027, help\u003d\u0027Domain ID to scope to\u0027),"},{"line_number":30,"context_line":"        cfg.StrOpt(\u0027domain-name\u0027, help\u003d\u0027Domain name to scope to\u0027),"},{"line_number":31,"context_line":"        cfg.StrOpt(\u0027tenant-id\u0027, help\u003d\u0027Tenant ID to scope to\u0027),"},{"line_number":32,"context_line":"        cfg.StrOpt(\u0027tenant-name\u0027, help\u003d\u0027Tenant name to scope to\u0027),"},{"line_number":33,"context_line":"        cfg.StrOpt(\u0027project-id\u0027, help\u003d\u0027Project ID to scope to\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"7ac7a964_f0b8a02c","line":30,"in_reply_to":"baada198_4d7c2872","updated":"2014-08-14 00:06:28.000000000","message":"this is a scoping argument, an alternative to project-id or project-name not anything to do with user-domain-name. \n\nWhilst for most services a domain scoped token doesn\u0027t make sense we do need it in keystone - maybe we can subclass this with a special case for keystone.","commit_id":"9cc9867faa45a484a0fdc00ee15c5945b033b902"}],"keystoneclient/auth/identity/generic/password.py":[{"author":{"_account_id":11333,"name":"David J Hu","email":"david.hu@hpe.com","username":"dhu"},"change_message_id":"280b19fab548444299f815def155827ef1eeb216","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @classmethod"},{"line_number":67,"context_line":"    def get_options(cls):"},{"line_number":68,"context_line":"        return super(Password, cls).get_options()"},{"line_number":69,"context_line":"        options.extend(get_options())"},{"line_number":70,"context_line":"        return options"}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_dbd4a7ec","line":68,"updated":"2014-08-12 18:28:35.000000000","message":"Extra return here :)  Remove \"return\".","commit_id":"0740b255cf4ec58a49ea1193dc04e6acc9c6825d"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"39d8fa7b28a404ec6cbc4b37b7a8fedb7873094a","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    @classmethod"},{"line_number":80,"context_line":"    def get_options(cls):"},{"line_number":81,"context_line":"        options \u003d super(Password, cls).get_options()"},{"line_number":82,"context_line":"        options.extend(get_options())"},{"line_number":83,"context_line":"        return options"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa98f980_9e3ee9d8","line":82,"updated":"2014-09-03 16:30:56.000000000","message":"global function and class method have same name - somebody can mismatch them in the future","commit_id":"d070347988e1fbc9f84439f1b63cb4d52a9bfcda"}],"keystoneclient/auth/identity/generic/token.py":[{"author":{"_account_id":11333,"name":"David J Hu","email":"david.hu@hpe.com","username":"dhu"},"change_message_id":"b68cb49d713132efaeb7660cfbc66a0c58eb7a70","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def get_options():"},{"line_number":26,"context_line":"    return ["},{"line_number":27,"context_line":"        cfg.StrOpt(\u0027token\u0027, help\u003d\u0027Token to authenticate with\u0027),"},{"line_number":28,"context_line":"    ]"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"baada198_5e2fa5f5","line":27,"updated":"2014-08-12 18:55:01.000000000","message":"Add auth-token option for backward compatibility.  Python clients have an --os-auth-token argument that is used in conjunction with an endpoint or management url.","commit_id":"0740b255cf4ec58a49ea1193dc04e6acc9c6825d"},{"author":{"_account_id":11333,"name":"David J Hu","email":"david.hu@hpe.com","username":"dhu"},"change_message_id":"2235b19806b273ae64b9f3e67568c780c7b5d8e9","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def get_options():"},{"line_number":26,"context_line":"    return ["},{"line_number":27,"context_line":"        cfg.StrOpt(\u0027token\u0027, help\u003d\u0027Token to authenticate with\u0027),"},{"line_number":28,"context_line":"    ]"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"baada198_3bb1ed91","line":27,"updated":"2014-08-13 16:58:43.000000000","message":"To make this function leverageable (for example by the Nova client), keystone client needs to provide parsing for --os-auth-token.","commit_id":"9cc9867faa45a484a0fdc00ee15c5945b033b902"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"f4493709694f2825e2314454286a5156fa8fef15","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def get_options():"},{"line_number":26,"context_line":"    return ["},{"line_number":27,"context_line":"        cfg.StrOpt(\u0027token\u0027, help\u003d\u0027Token to authenticate with\u0027),"},{"line_number":28,"context_line":"    ]"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"7ac7a964_d092c49e","line":27,"in_reply_to":"baada198_3bb1ed91","updated":"2014-08-14 00:06:28.000000000","message":"what i want to define here is the \u0027right\u0027 way to do it. Then we can put compatability hacks as required for the other clients. \n\nI think in general here calling the argument \u0027token\u0027 is the right thing.","commit_id":"9cc9867faa45a484a0fdc00ee15c5945b033b902"},{"author":{"_account_id":11333,"name":"David J Hu","email":"david.hu@hpe.com","username":"dhu"},"change_message_id":"bee35d58816e3792ab06d67b230f10ec65241112","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"def get_options():"},{"line_number":26,"context_line":"    return ["},{"line_number":27,"context_line":"        cfg.StrOpt(\u0027token\u0027, help\u003d\u0027Token to authenticate with\u0027),"},{"line_number":28,"context_line":"    ]"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"7ac7a964_3cde4740","line":27,"updated":"2014-08-14 21:09:18.000000000","message":"Perhaps a plan to communicate to python clients who are currently using --os-auth-token that --os-token should be used instead once this code gets merged.  I can take the action item.","commit_id":"c5dc65b54db42b9111053a184c7d9fe3b82ca71d"},{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"39d8fa7b28a404ec6cbc4b37b7a8fedb7873094a","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            return v2.Token(url, self._token, **self._v2_params)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        elif _discover.version_match((3,), version):"},{"line_number":46,"context_line":"            return v3.Token(url, self._token, **self._v3_params)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def get_options(cls):"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa98f980_011b7873","line":46,"updated":"2014-09-03 16:30:56.000000000","message":"Please provide some stub with warning for other cases - it will be useful when V4, V5 and so on take their place in the project :)","commit_id":"d070347988e1fbc9f84439f1b63cb4d52a9bfcda"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"b0d7fe7d0842cdfaa9d553223998c23cf6327635","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            return v2.Token(url, self._token, **self._v2_params)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        elif _discover.version_match((3,), version):"},{"line_number":46,"context_line":"            return v3.Token(url, self._token, **self._v3_params)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @classmethod"},{"line_number":49,"context_line":"    def get_options(cls):"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa98f980_597a9e24","line":46,"in_reply_to":"fa98f980_011b7873","updated":"2014-09-05 06:26:17.000000000","message":"This is intentional. Base calls create_plugin with as many versions as are available until one of them replies with something. \n\nReturning None here is correct.","commit_id":"d070347988e1fbc9f84439f1b63cb4d52a9bfcda"}],"keystoneclient/auth/identity/password.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ca4b95f4b2e0801f68af9f2dbdd2d83db70a1324","unresolved":false,"context_lines":[{"line_number":37,"context_line":""},{"line_number":38,"context_line":"        for k in six.iterkeys(kwargs):"},{"line_number":39,"context_line":"            if k not in self._ALLOWED:"},{"line_number":40,"context_line":"                raise AttributeError(k)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        self._project_id \u003d kwargs.pop(\u0027project_id\u0027,"},{"line_number":43,"context_line":"                                      kwargs.pop(\u0027tenant_id\u0027, None))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_eb2efda4","line":40,"updated":"2014-05-27 05:27:44.000000000","message":"i think a message here would help","commit_id":"1aabc6d54ca4f72d096c895c129bd6764c4b4323"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"ca4b95f4b2e0801f68af9f2dbdd2d83db70a1324","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        self._project_id \u003d kwargs.pop(\u0027project_id\u0027,"},{"line_number":43,"context_line":"                                      kwargs.pop(\u0027tenant_id\u0027, None))"},{"line_number":44,"context_line":"        self._project_name \u003d kwargs.pop(\u0027project_name\u0027,"},{"line_number":45,"context_line":"                                        kwargs.pop(\u0027tenant_name\u0027, None))"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        self._kwargs \u003d kwargs"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ae8d1ca_2b18e583","line":44,"updated":"2014-05-27 05:27:44.000000000","message":"neat ++","commit_id":"1aabc6d54ca4f72d096c895c129bd6764c4b4323"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"390eca2cdd3b1141f6e651c67339f2c6bd0375d6","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    def _get_plugin(self, session):"},{"line_number":51,"context_line":"        disc \u003d self._get_discovery(session, self.auth_url)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        v3_url \u003d disc.url_for((3, 0))"},{"line_number":54,"context_line":"        if v3_url:"},{"line_number":55,"context_line":"            self._plugin \u003d v3.Password(auth_url\u003dv3_url,"},{"line_number":56,"context_line":"                                       project_id\u003dself._project_id,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7adec928_c1bbce70","line":53,"updated":"2014-05-08 04:49:07.000000000","message":"I think the logic should goes like this\n\nif auth_version:\n    # caller explicitly ask for a particular version, lets try to honor it\nelse:\n    user_domain_info \u003d (\u0027user_domain_id\u0027 in self._kwargs or\n                                       \u0027user_domain_name\u0027 in self._kwargs)\n    project_domain_info \u003d (\u0027project_domain_id\u0027 in self._kwargs or\n                                           \u0027project_domain_name\u0027 in self._kwargs)\n    # if domain info is present, lets assume caller meant to use V3\n    if (user_domain_info and project_domain_info):\n        # user v3 auth\n    else:\n        # user v2 auth","commit_id":"1aabc6d54ca4f72d096c895c129bd6764c4b4323"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d9a22db4a10214630e39dfbf1b0502fc4e015d16","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def _get_plugin(self, session):"},{"line_number":71,"context_line":"        disc \u003d self.get_discovery(session, self.auth_url, authenticated\u003dFalse)"},{"line_number":72,"context_line":"        v2_url \u003d disc.url_for((2, 0))"},{"line_number":73,"context_line":"        v3_url \u003d disc.url_for((3, 0))"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        if (self._domain_id or self._domain_name or"},{"line_number":76,"context_line":"                self._project_domain_id or self._project_domain_name or"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_204ffc6b","line":73,"updated":"2014-07-30 06:22:56.000000000","message":"I think this logic need to be a bit more forgiving. If provider does not support discovery (maybe they are running older version) for whatever reason, we can still attempt to figure it out from the given URL. Bail only if the given URL is unversioned. See\n\nhttps://github.com/openstack/python-cinderclient/blob/master/cinderclient/shell.py#L763","commit_id":"63b0f14bc036a3613ab0d0c83312190618e816b5"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"f6280997dad1f7aa04fdff69f26907f9f69f6bac","unresolved":false,"context_lines":[{"line_number":70,"context_line":"    def _get_plugin(self, session):"},{"line_number":71,"context_line":"        disc \u003d self.get_discovery(session, self.auth_url, authenticated\u003dFalse)"},{"line_number":72,"context_line":"        v2_url \u003d disc.url_for((2, 0))"},{"line_number":73,"context_line":"        v3_url \u003d disc.url_for((3, 0))"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        if (self._domain_id or self._domain_name or"},{"line_number":76,"context_line":"                self._project_domain_id or self._project_domain_name or"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_e85f860e","line":73,"in_reply_to":"baada198_204ffc6b","updated":"2014-07-31 00:57:21.000000000","message":"hmm, i\u0027ll give it a go. Seems like you\u0027re hiding larger problems","commit_id":"63b0f14bc036a3613ab0d0c83312190618e816b5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d9a22db4a10214630e39dfbf1b0502fc4e015d16","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            # that the user wants v2 auth - or it makes no difference."},{"line_number":88,"context_line":"            return self._get_v2_password(v2_url)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        elif v3_url:"},{"line_number":91,"context_line":"            # hmm, i don\u0027t have v3 specific information but v2 is not available"},{"line_number":92,"context_line":"            # so i should at least try against v3."},{"line_number":93,"context_line":"            # NOTE(jamielennox): i\u0027m not overly sure this behaviour is useful."}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_b5e18c9d","line":90,"updated":"2014-07-30 06:22:56.000000000","message":"can we switch the order to prefer V3 first as we are in the process of deprecating v2?","commit_id":"63b0f14bc036a3613ab0d0c83312190618e816b5"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"f6280997dad1f7aa04fdff69f26907f9f69f6bac","unresolved":false,"context_lines":[{"line_number":87,"context_line":"            # that the user wants v2 auth - or it makes no difference."},{"line_number":88,"context_line":"            return self._get_v2_password(v2_url)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        elif v3_url:"},{"line_number":91,"context_line":"            # hmm, i don\u0027t have v3 specific information but v2 is not available"},{"line_number":92,"context_line":"            # so i should at least try against v3."},{"line_number":93,"context_line":"            # NOTE(jamielennox): i\u0027m not overly sure this behaviour is useful."}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_92b39799","line":90,"in_reply_to":"baada198_b5e18c9d","updated":"2014-07-31 00:57:21.000000000","message":"I think this is the right way. If you are wanting a v3 token then you would probably have provided some sort of domain information and so been picked up by the first clause. \n\nWhat i\u0027m saying here is that if v2 is available and you haven\u0027t specified anything to do with domains then you probably attempt the v2 access first because v3 will probably fail.\n\nAlso if you haven\u0027t specified anything to do with domains then i don\u0027t think you lose anything by getting a v2 token over a v3.","commit_id":"63b0f14bc036a3613ab0d0c83312190618e816b5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"d9a22db4a10214630e39dfbf1b0502fc4e015d16","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        options.extend(["},{"line_number":110,"context_line":"            cfg.StrOpt(\u0027user-id\u0027, help\u003d\u0027User ID\u0027),"},{"line_number":111,"context_line":"            cfg.StrOpt(\u0027user-name\u0027, dest\u003d\u0027username\u0027, help\u003d\u0027Username\u0027,"},{"line_number":112,"context_line":"                       deprecated_name\u003d\u0027username\u0027),"},{"line_number":113,"context_line":"            cfg.StrOpt(\u0027user-domain-id\u0027, help\u003d\"User\u0027s domain id\"),"},{"line_number":114,"context_line":"            cfg.StrOpt(\u0027user-domain-name\u0027, help\u003d\"User\u0027s domain name\"),"},{"line_number":115,"context_line":"            cfg.StrOpt(\u0027password\u0027, help\u003d\"User\u0027s password\"),"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_35b3bc9b","line":112,"updated":"2014-07-30 06:22:56.000000000","message":"deprecating \u0027username\u0027?","commit_id":"63b0f14bc036a3613ab0d0c83312190618e816b5"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"f6280997dad1f7aa04fdff69f26907f9f69f6bac","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        options.extend(["},{"line_number":110,"context_line":"            cfg.StrOpt(\u0027user-id\u0027, help\u003d\u0027User ID\u0027),"},{"line_number":111,"context_line":"            cfg.StrOpt(\u0027user-name\u0027, dest\u003d\u0027username\u0027, help\u003d\u0027Username\u0027,"},{"line_number":112,"context_line":"                       deprecated_name\u003d\u0027username\u0027),"},{"line_number":113,"context_line":"            cfg.StrOpt(\u0027user-domain-id\u0027, help\u003d\"User\u0027s domain id\"),"},{"line_number":114,"context_line":"            cfg.StrOpt(\u0027user-domain-name\u0027, help\u003d\"User\u0027s domain name\"),"},{"line_number":115,"context_line":"            cfg.StrOpt(\u0027password\u0027, help\u003d\"User\u0027s password\"),"}],"source_content_type":"text/x-python","patch_set":4,"id":"baada198_32500b2c","line":112,"in_reply_to":"baada198_35b3bc9b","updated":"2014-07-31 00:57:21.000000000","message":"this is something i\u0027ve looked at recently. \u0027username\u0027 is the only one in this list that does obey the word-word syntax. it\u0027s still available but i was looking at user-name as the default.","commit_id":"63b0f14bc036a3613ab0d0c83312190618e816b5"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"73793d2672a187f561328f704626d693cebfcb2f","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        try:"},{"line_number":79,"context_line":"            disc \u003d self.get_discovery(session, self.auth_url,"},{"line_number":80,"context_line":"                                      authenticated\u003dFalse)"},{"line_number":81,"context_line":"        except (exceptions.DiscoveryFailure) as e:"},{"line_number":82,"context_line":"            v2_url \u003d None"},{"line_number":83,"context_line":"            v3_url \u003d None"},{"line_number":84,"context_line":"            error \u003d e"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_229c36bf","line":81,"updated":"2014-07-31 05:46:29.000000000","message":"we should catch the HTTP errors, not just DiscoveryFailure. Reason is not everyone running the latest Juno Master in their production environment. Therefore, discovery functionality may not be available on the server sides. In this case, it will likely result in 404 instead of DiscoveryFailure. Client is supposed to be backward compatible.","commit_id":"ebc6bdcaf37811b96f2873e0f3ed78806ea724aa"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"92ba23a36e32b6b42e761061e2c3d03c3eab8ecd","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        try:"},{"line_number":79,"context_line":"            disc \u003d self.get_discovery(session, self.auth_url,"},{"line_number":80,"context_line":"                                      authenticated\u003dFalse)"},{"line_number":81,"context_line":"        except (exceptions.DiscoveryFailure) as e:"},{"line_number":82,"context_line":"            v2_url \u003d None"},{"line_number":83,"context_line":"            v3_url \u003d None"},{"line_number":84,"context_line":"            error \u003d e"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_5a6d2aca","line":81,"in_reply_to":"baada198_229c36bf","updated":"2014-08-04 02:19:43.000000000","message":"have a look at get_discovery, it handles that already. I\u0027m not sure it\u0027s correct but it\u0027s there.","commit_id":"ebc6bdcaf37811b96f2873e0f3ed78806ea724aa"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"73793d2672a187f561328f704626d693cebfcb2f","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            # hmm, i don\u0027t have v3 specific information but v2 is not available"},{"line_number":120,"context_line":"            # so i should at least try against v3."},{"line_number":121,"context_line":"            # NOTE(jamielennox): i\u0027m not overly sure this behaviour is useful."},{"line_number":122,"context_line":"            return self._get_v3_password(v3_url)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # so there were no URLs that i could use for auth of any version."},{"line_number":125,"context_line":"        msg \u003d \u0027Could not determine a suitable URL for the password plugin\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_a2a76608","line":122,"updated":"2014-07-31 05:46:29.000000000","message":"else:\n    raise an exception here","commit_id":"ebc6bdcaf37811b96f2873e0f3ed78806ea724aa"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"92ba23a36e32b6b42e761061e2c3d03c3eab8ecd","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            # hmm, i don\u0027t have v3 specific information but v2 is not available"},{"line_number":120,"context_line":"            # so i should at least try against v3."},{"line_number":121,"context_line":"            # NOTE(jamielennox): i\u0027m not overly sure this behaviour is useful."},{"line_number":122,"context_line":"            return self._get_v3_password(v3_url)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        # so there were no URLs that i could use for auth of any version."},{"line_number":125,"context_line":"        msg \u003d \u0027Could not determine a suitable URL for the password plugin\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"baada198_9a6262d7","line":122,"in_reply_to":"baada198_a2a76608","updated":"2014-08-04 02:19:43.000000000","message":"that happens on fall through, just below here.","commit_id":"ebc6bdcaf37811b96f2873e0f3ed78806ea724aa"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"ce830f47f9f88245290e36bc7f4379486a0b2ede","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        try:"},{"line_number":79,"context_line":"            disc \u003d self.get_discovery(session, self.auth_url,"},{"line_number":80,"context_line":"                                      authenticated\u003dFalse)"},{"line_number":81,"context_line":"        except (exceptions.DiscoveryFailure) as e:"},{"line_number":82,"context_line":"            v2_url \u003d None"},{"line_number":83,"context_line":"            v3_url \u003d None"},{"line_number":84,"context_line":"            error \u003d e"}],"source_content_type":"text/x-python","patch_set":7,"id":"baada198_9b624b3b","line":81,"updated":"2014-08-04 17:03:12.000000000","message":"I don\u0027t think we are caching HTTP errors like not found (404). See\n\nhttps://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/_discover.py#L36\n\nWe only raise DiscoveryFailure if we can\u0027t parse the response body.","commit_id":"a13da69c75843c26accecc20b816df7b18832a32"},{"author":{"_account_id":11333,"name":"David J Hu","email":"david.hu@hpe.com","username":"dhu"},"change_message_id":"fd4c56958c7fd0cadbcc546355a033b245282202","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                     \u0027determine version from URL.\u0027)"},{"line_number":88,"context_line":"        else:"},{"line_number":89,"context_line":"            v2_url \u003d disc.url_for((2, 0))"},{"line_number":90,"context_line":"            v3_url \u003d disc.url_for((3, 0))"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        if not (v2_url or v3_url):"},{"line_number":93,"context_line":"            # Discovery gave us nothing. Let\u0027s see if we can figure it out"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_6ed57746","line":90,"updated":"2014-08-06 05:01:39.000000000","message":"Both \"v2_url \u003d disc.url_for((2, 0))\" and \"v3_url \u003d disc.url_for((3, 0))\" should be part of the \"try:\" due to possibility of exception in certain cases.\n\n\"if not (v2_url or v3_url):\" (below) should be done as part of the exception handling.","commit_id":"835e733b7407b9450118232a30273ff6fcae703a"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"6a4baa0283a5ffcbb60d7dd97b33a0eb9bc68058","unresolved":false,"context_lines":[{"line_number":87,"context_line":"                     \u0027determine version from URL.\u0027)"},{"line_number":88,"context_line":"        else:"},{"line_number":89,"context_line":"            v2_url \u003d disc.url_for((2, 0))"},{"line_number":90,"context_line":"            v3_url \u003d disc.url_for((3, 0))"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        if not (v2_url or v3_url):"},{"line_number":93,"context_line":"            # Discovery gave us nothing. Let\u0027s see if we can figure it out"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_a8e66ee5","line":90,"in_reply_to":"baada198_6ed57746","updated":"2014-08-07 12:10:18.000000000","message":"I don\u0027t think either of these can throw a discoveryfailure.","commit_id":"835e733b7407b9450118232a30273ff6fcae703a"},{"author":{"_account_id":11333,"name":"David J Hu","email":"david.hu@hpe.com","username":"dhu"},"change_message_id":"36dd3c1584d80ba0d521a9acfd925d0fbf0f0317","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            if path.startswith(\u0027/v3\u0027):"},{"line_number":99,"context_line":"                v3_url \u003d self.auth_url"},{"line_number":100,"context_line":"            elif path.startswith(\u0027/v2.0\u0027):"},{"line_number":101,"context_line":"                v2_url \u003d self.auth_url"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if (self._domain_id or self._domain_name or"},{"line_number":104,"context_line":"                self._project_domain_id or self._project_domain_name or"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_cefa0311","line":101,"updated":"2014-08-06 04:51:47.000000000","message":"Should raise an exception here when the path neither starts with \u0027/v3\u0027 nor \u0027v2.0\u0027.","commit_id":"835e733b7407b9450118232a30273ff6fcae703a"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"6a4baa0283a5ffcbb60d7dd97b33a0eb9bc68058","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            if path.startswith(\u0027/v3\u0027):"},{"line_number":99,"context_line":"                v3_url \u003d self.auth_url"},{"line_number":100,"context_line":"            elif path.startswith(\u0027/v2.0\u0027):"},{"line_number":101,"context_line":"                v2_url \u003d self.auth_url"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        if (self._domain_id or self._domain_name or"},{"line_number":104,"context_line":"                self._project_domain_id or self._project_domain_name or"}],"source_content_type":"text/x-python","patch_set":9,"id":"baada198_08d75aef","line":101,"in_reply_to":"baada198_cefa0311","updated":"2014-08-07 12:10:18.000000000","message":"it will fall through to an exception","commit_id":"835e733b7407b9450118232a30273ff6fcae703a"}],"keystoneclient/tests/auth/utils.py":[{"author":{"_account_id":13055,"name":"Alexander Makarov","email":"ajiekcahdp.makapob@gmail.com","username":"amakarov"},"change_message_id":"39d8fa7b28a404ec6cbc4b37b7a8fedb7873094a","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    TEST_URL \u003d \u0027http://keystone.host:5000/\u0027"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"    # OVERRIDE THESE IN SUB CLASSES"},{"line_number":96,"context_line":"    PLUGIN_CLASS \u003d None"},{"line_number":97,"context_line":"    V2_PLUGIN_CLASS \u003d None"},{"line_number":98,"context_line":"    V3_PLUGIN_CLASS \u003d None"}],"source_content_type":"text/x-python","patch_set":20,"id":"fa98f980_a1a8ecdb","line":95,"updated":"2014-09-03 16:30:56.000000000","message":"M.b. check these overrides somewhere in setUp()?","commit_id":"d070347988e1fbc9f84439f1b63cb4d52a9bfcda"}]}
