)]}'
{"keystoneclient/access.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"ca792833b8ebec5618324075df37862f463ca520","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        :returns: tuple of urls"},{"line_number":156,"context_line":"        \"\"\""},{"line_number":157,"context_line":"        raise NotImplementedError()"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"class AccessInfoV2(AccessInfo):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2F5zg%3D","line":157,"updated":"2013-04-12 05:23:57.000000000","message":"get_user_domain()\nget_project_domain()\n\nFor AccessInfoV2, perhaps those would be the default domain name and id? And they may come from env vars.","commit_id":"d458c39c88a3710797369a2990950b224bb6552d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"4c9124a5ac213af5f817ccc60f224a5f0b35b876","unresolved":false,"context_lines":[{"line_number":154,"context_line":""},{"line_number":155,"context_line":"        :returns: tuple of urls"},{"line_number":156,"context_line":"        \"\"\""},{"line_number":157,"context_line":"        raise NotImplementedError()"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"class AccessInfoV2(AccessInfo):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2F5kE%3D","line":157,"in_reply_to":"AAAAOn%2F%2F5zg%3D","updated":"2013-04-12 13:03:51.000000000","message":"Done, but I\u0027m not using them in this patch and they shouldn\u0027t come from the environment here under any circumstances","commit_id":"d458c39c88a3710797369a2990950b224bb6552d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3595003efd284dee27572a1cc22ed7e98a386a05","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    def factory(cls, resp\u003dNone, body\u003dNone, **kwargs):"},{"line_number":36,"context_line":"        \"\"\"Create AccessInfo object given a successful auth response \u0026 body.\"\"\""},{"line_number":37,"context_line":"        if body is not None:"},{"line_number":38,"context_line":"            if \u0027token\u0027 in body:"},{"line_number":39,"context_line":"                return AccessInfoV3(resp.headers[\u0027X-Subject-Token\u0027],"},{"line_number":40,"context_line":"                                    **body[\u0027token\u0027])"},{"line_number":41,"context_line":"            elif \u0027access\u0027 in body:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2F2jk%3D","line":38,"updated":"2013-04-17 18:21:21.000000000","message":"suggest move code to tell if body is V3 or V2 into AccessInfoV3/V2, e.g., AcessInfoV3.isValid(body) does return \u0027token\u0027 in body.","commit_id":"ca9808113cf3c337186d173a63834f6c49f078dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3595003efd284dee27572a1cc22ed7e98a386a05","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        :returns: tuple of urls"},{"line_number":156,"context_line":"        \"\"\""},{"line_number":157,"context_line":"        raise NotImplementedError()"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"class AccessInfoV2(AccessInfo):"},{"line_number":161,"context_line":"    \"\"\"An object for encapsulating a raw v2 auth token from keystone.\"\"\""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2F2j0%3D","line":158,"updated":"2013-04-17 18:21:21.000000000","message":"add user_domain_id property. It\u0027s in AccessInfoV2 and V3, see line 180.","commit_id":"ca9808113cf3c337186d173a63834f6c49f078dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"be9acc793096fe64cab2433c125c1751655456e4","unresolved":false,"context_lines":[{"line_number":132,"context_line":"    @property"},{"line_number":133,"context_line":"    def scoped(self):"},{"line_number":134,"context_line":"        \"\"\"Returns true if the authorization token was scoped to a tenant"},{"line_number":135,"context_line":"        (project), and contains a populated service catalog."},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        :returns: bool"},{"line_number":138,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPH%2F%2Fdfo%3D","line":135,"updated":"2013-06-03 14:14:51.000000000","message":"I don\u0027t think the comment quite matches the implementations.  For v3 scoped is true if the token is scoped to a domain, as well as project, for instance.  The v3 code also does not check for a catalog (but maybe that is implicit in v3?)","commit_id":"7b7fa700a27fbca9864c9bc6f4489d0636a0baee"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import datetime"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from keystoneclient import service_catalog"},{"line_number":21,"context_line":"from keystoneclient.openstack.common import timeutils"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0DA%3D","line":20,"updated":"2013-06-09 16:38:59.000000000","message":"I think keystoneclient.service_catalog comes after keystoneclient.openstack.","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        if body is not None or kwargs is not None:"},{"line_number":41,"context_line":"            # (lcheng) AccessInfo can also be created using a user-provided"},{"line_number":42,"context_line":"            # dictionary."},{"line_number":43,"context_line":"            data \u003d kwargs"},{"line_number":44,"context_line":"            if AccessInfoV3.is_valid(body, **kwargs):"},{"line_number":45,"context_line":"                token \u003d None"},{"line_number":46,"context_line":"                if resp:"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0C4%3D","line":43,"updated":"2013-06-09 16:38:59.000000000","message":"Remove this since it could lead to bugs due to aliasing. Or is this supposed to be a copy?","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    @property"},{"line_number":123,"context_line":"    def user_domain_id(self):"},{"line_number":124,"context_line":"        \"\"\"Returns the domain id associated with the authentication request."},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        :returns: str"},{"line_number":127,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0Cw%3D","line":124,"updated":"2013-06-09 16:38:59.000000000","message":"should say returns the domain id of the user?\n\n Returns the domain id of the user associated with the authentication token.","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        :returns: str"},{"line_number":127,"context_line":"        \"\"\""},{"line_number":128,"context_line":"        raise NotImplementedError()"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    @property"},{"line_number":131,"context_line":"    def domain_name(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0BI%3D","line":128,"updated":"2013-06-09 16:38:59.000000000","message":"we\u0027ve got user_domain_id, but what about project_domain_id?","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    @property"},{"line_number":131,"context_line":"    def domain_name(self):"},{"line_number":132,"context_line":"        \"\"\"Returns the domain name scoped with the authentication token."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        :returns: str"},{"line_number":135,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0Co%3D","line":132,"updated":"2013-06-09 16:38:59.000000000","message":"what\u0027s the difference between \"associated with\" and \"scoped with\"? Some of these comments use one and some use the other... is there a difference? If not, pick one or the other.","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"    @property"},{"line_number":139,"context_line":"    def domain_id(self):"},{"line_number":140,"context_line":"        \"\"\"Returns the domain name scoped with the authentication token."},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        :returns: str"},{"line_number":143,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0Cs%3D","line":140,"updated":"2013-06-09 16:38:59.000000000","message":"change \"domain name\" to \"domain id\"","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":159,"context_line":"    @property"},{"line_number":160,"context_line":"    def scoped(self):"},{"line_number":161,"context_line":"        \"\"\"Returns true if the authorization token was scoped to a tenant"},{"line_number":162,"context_line":"        (project) or domain (v3)."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        :returns: bool"},{"line_number":165,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0Ck%3D","line":162,"updated":"2013-06-09 16:38:59.000000000","message":"isn\u0027t there a big difference between a token scoped to a project and a token scoped to a domain?\n\nAlso, suggest remove (v3) since it\u0027ll probably be in v4 too.","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        \"\"\"Returns true if the authorization token was scoped to a tenant"},{"line_number":162,"context_line":"        (project) or domain (v3)."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        :returns: bool"},{"line_number":165,"context_line":"        \"\"\""},{"line_number":166,"context_line":"        raise NotImplementedError()"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0Cc%3D","line":164,"updated":"2013-06-09 16:38:59.000000000","message":"consistently use \"boolean\" or \"bool\", see line 80. I prefer \"Boolean\".","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    @property"},{"line_number":205,"context_line":"    def version(self):"},{"line_number":206,"context_line":"        \"\"\"Returns the version of the auth token from keystone."},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"        :returns: str"},{"line_number":209,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0CY%3D","line":206,"updated":"2013-06-09 16:38:59.000000000","message":"suggest use \"identity service\" rather than keystone.","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    @property"},{"line_number":250,"context_line":"    def user_domain_id(self):"},{"line_number":251,"context_line":"        return \u0027default\u0027"},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"    @property"},{"line_number":254,"context_line":"    def domain_name(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0CM%3D","line":251,"updated":"2013-06-09 16:38:59.000000000","message":"shouldn\u0027t this use the config setting for the default domain ID?","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":278,"context_line":"    @property"},{"line_number":279,"context_line":"    def project_domain_id(self):"},{"line_number":280,"context_line":"        if self.project_id:"},{"line_number":281,"context_line":"            return \u0027default\u0027"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    @property"},{"line_number":284,"context_line":"    def auth_url(self):"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0CE%3D","line":281,"updated":"2013-06-09 16:38:59.000000000","message":"shouldn\u0027t this use the config setting for the default domain ID?","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":""},{"line_number":300,"context_line":"class AccessInfoV3(AccessInfo):"},{"line_number":301,"context_line":"    \"\"\"An object for encapsulating a raw v3 auth token from keystone.\"\"\""},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def __init__(self, token, *args, **kwargs):"},{"line_number":304,"context_line":"        super(AccessInfo, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0CA%3D","line":301,"updated":"2013-06-09 16:38:59.000000000","message":"suggest use \"Identity service\" rather than keystone.","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"88ca47a4eb6c31a68fc2b20409c5c9a9b9e962cc","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    @property"},{"line_number":167,"context_line":"    def scoped(self):"},{"line_number":168,"context_line":"        \"\"\"Returns true if the authorization token was scoped to a tenant"},{"line_number":169,"context_line":"        (project) or domain."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        :returns: boolean"},{"line_number":172,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPX%2F%2FxMQ%3D","line":169,"updated":"2013-06-11 00:50:37.000000000","message":"This is something I still need to figure out -- is a token scoped to a domain useful outside of Keystone? (like a token scoped to a project is)","commit_id":"389afea0753014f7e00c7e43993cc2f3444aab8c"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"50e50ada3fe56b28ff85843d6cbe3f6e77c42b3c","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    @property"},{"line_number":167,"context_line":"    def scoped(self):"},{"line_number":168,"context_line":"        \"\"\"Returns true if the authorization token was scoped to a tenant"},{"line_number":169,"context_line":"        (project) or domain."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        :returns: boolean"},{"line_number":172,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPX%2F%2Fr9A%3D","line":169,"in_reply_to":"AAAAPX%2F%2FvRE%3D","updated":"2013-06-12 20:34:43.000000000","message":"I\u0027ve added:\n- \"domain_scoped\" checks for domain scoped and not require a catalog\n- \"project_scoped\" checks for project scoped and require a catalog\n\nand kept \"scoped\" and marked that it is deprecated in the docstring.","commit_id":"389afea0753014f7e00c7e43993cc2f3444aab8c"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"56c11ed87bd59e8f5ebec6495e31d02d0c08799b","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    @property"},{"line_number":167,"context_line":"    def scoped(self):"},{"line_number":168,"context_line":"        \"\"\"Returns true if the authorization token was scoped to a tenant"},{"line_number":169,"context_line":"        (project) or domain."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        :returns: boolean"},{"line_number":172,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPX%2F%2FvRE%3D","line":169,"in_reply_to":"AAAAPX%2F%2FvUc%3D","updated":"2013-06-11 17:02:46.000000000","message":"I only see one code reference of scoped() in keystoneclient code, and no reference from Horizon. \n\nAs for other projects, I am not sure if changing this from \"scoped\" to \"project_scoped\" would cause regression.","commit_id":"389afea0753014f7e00c7e43993cc2f3444aab8c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"1087e4479c0e6bad4898693c19426eb7d732ac22","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    @property"},{"line_number":167,"context_line":"    def scoped(self):"},{"line_number":168,"context_line":"        \"\"\"Returns true if the authorization token was scoped to a tenant"},{"line_number":169,"context_line":"        (project) or domain."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        :returns: boolean"},{"line_number":172,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPX%2F%2FvUc%3D","line":169,"in_reply_to":"AAAAPX%2F%2FvkE%3D","updated":"2013-06-11 16:36:55.000000000","message":"would you change this to \"project_scoped\" to match the format of \"domain_scoped\"....or would you leave it as is?","commit_id":"389afea0753014f7e00c7e43993cc2f3444aab8c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"b2cc39e9be595e6752a7e8ee93c57c1703b6dc28","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    @property"},{"line_number":167,"context_line":"    def scoped(self):"},{"line_number":168,"context_line":"        \"\"\"Returns true if the authorization token was scoped to a tenant"},{"line_number":169,"context_line":"        (project) or domain."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        :returns: boolean"},{"line_number":172,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPX%2F%2FvkE%3D","line":169,"in_reply_to":"AAAAPX%2F%2Fvrw%3D","updated":"2013-06-11 15:27:46.000000000","message":"I\u0027m wondering clients would find it useful or expected for \"access_info.scoped\" to return true if the token was scoped only to a domain and not to a project. The original docstring was \"Returns true if the authorization token was scoped to a tenant (project), and contains a populated service catalog.\" I don\u0027t think we want to change that behavior. So the docstring should be the same here, and scoped should also require that there\u0027s a service catalog.\n\nThen we should have a new property called domain_scoped that\u0027s true only if the token is scoped to a domain that clients would use to tell if it\u0027s scoped to a domain (without caring if it has a service catalog or not).","commit_id":"389afea0753014f7e00c7e43993cc2f3444aab8c"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"6e741d879fea8d970c3a9b7a028e331728029c39","unresolved":false,"context_lines":[{"line_number":166,"context_line":"    @property"},{"line_number":167,"context_line":"    def scoped(self):"},{"line_number":168,"context_line":"        \"\"\"Returns true if the authorization token was scoped to a tenant"},{"line_number":169,"context_line":"        (project) or domain."},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"        :returns: boolean"},{"line_number":172,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPX%2F%2Fvrw%3D","line":169,"in_reply_to":"AAAAPX%2F%2FxMQ%3D","updated":"2013-06-11 14:52:21.000000000","message":"Although today no other services support this, I can imagine some that might - e.g. glance wanting to have an image that is tied to a domain (and can be used by all projects within it), rather than just today\u0027s choices of global or projects based.","commit_id":"389afea0753014f7e00c7e43993cc2f3444aab8c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"2cbe111a351e36fff1fd6f1e44f2b55d29fc3f47","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        :returns: bool"},{"line_number":174,"context_line":"        \"\"\""},{"line_number":175,"context_line":"        raise self.project_scoped()"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @property"},{"line_number":178,"context_line":"    def project_scoped(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPX%2F%2FrlY%3D","line":175,"updated":"2013-06-12 21:34:38.000000000","message":"is this supposed to raise NotImplemented or return self.project_scoped() ? There must be a test missing if this didn\u0027t get caught.","commit_id":"2e576d28c897f0bf1a12300fca728c18f306ecb4"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"fe3fde346c91f8e5015f4a254f7a00796cd056d7","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        :returns: bool"},{"line_number":174,"context_line":"        \"\"\""},{"line_number":175,"context_line":"        raise self.project_scoped()"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @property"},{"line_number":178,"context_line":"    def project_scoped(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPX%2F%2Foxg%3D","line":175,"in_reply_to":"AAAAPX%2F%2FpEw%3D","updated":"2013-06-13 18:53:46.000000000","message":"Didn\u0027t notice it was using raise instead of return, fixed.","commit_id":"2e576d28c897f0bf1a12300fca728c18f306ecb4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"9b0bb77496addbe6aac0db2f28c6d54bdbc4571c","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        :returns: bool"},{"line_number":174,"context_line":"        \"\"\""},{"line_number":175,"context_line":"        raise self.project_scoped()"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @property"},{"line_number":178,"context_line":"    def project_scoped(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPX%2F%2FpEw%3D","line":175,"in_reply_to":"AAAAPX%2F%2FriY%3D","updated":"2013-06-13 17:15:26.000000000","message":"the old behavior was to always raise an exception? If that\u0027s the case then the docstring should be updated.","commit_id":"2e576d28c897f0bf1a12300fca728c18f306ecb4"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"4f9001905f6de4e6b2c30d91a016e736200878ef","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        :returns: bool"},{"line_number":174,"context_line":"        \"\"\""},{"line_number":175,"context_line":"        raise self.project_scoped()"},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"    @property"},{"line_number":178,"context_line":"    def project_scoped(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPX%2F%2FriY%3D","line":175,"in_reply_to":"AAAAPX%2F%2FrlY%3D","updated":"2013-06-12 21:49:13.000000000","message":"This is right, as we\u0027d like to keep the old behavior. project_scoped does the same thing.","commit_id":"2e576d28c897f0bf1a12300fca728c18f306ecb4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        \"\"\"Create AccessInfo object given a successful auth response \u0026 body"},{"line_number":38,"context_line":"           or a user-provided dict."},{"line_number":39,"context_line":"        \"\"\""},{"line_number":40,"context_line":"        if body is not None or kwargs is not None:"},{"line_number":41,"context_line":"            if AccessInfoV3.is_valid(body, **kwargs):"},{"line_number":42,"context_line":"                token \u003d None"},{"line_number":43,"context_line":"                if resp:"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F45M%3D","line":40,"updated":"2013-06-18 23:22:43.000000000","message":"I don\u0027t think that kwargs can be None, so the test is redundant, or maybe this is a bug and is trying to test for empty kwargs?\n\n \u003e\u003e\u003e def test1(**kwargs):\n ...     print kwargs\n ...\n \u003e\u003e\u003e test1()\n {}","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":137,"context_line":"           request."},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"           For v2, it always returns \u0027default\u0027 which maybe different from the"},{"line_number":140,"context_line":"           keystone configuration."},{"line_number":141,"context_line":"        :returns: str"},{"line_number":142,"context_line":"        \"\"\""},{"line_number":143,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F440%3D","line":140,"updated":"2013-06-18 23:22:43.000000000","message":"capitalize Keystone","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    @property"},{"line_number":146,"context_line":"    def domain_name(self):"},{"line_number":147,"context_line":"        \"\"\"Returns the domain name associated with the authentication token."},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"        :returns: str"},{"line_number":150,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F44U%3D","line":147,"updated":"2013-06-18 23:22:43.000000000","message":"should also mention that this can return None if there\u0027s no domain associated with the authentication token.","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":152,"context_line":""},{"line_number":153,"context_line":"    @property"},{"line_number":154,"context_line":"    def domain_id(self):"},{"line_number":155,"context_line":"        \"\"\"Returns the domain id associated with the authentication token."},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        :returns: str"},{"line_number":158,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F44Q%3D","line":155,"updated":"2013-06-18 23:22:43.000000000","message":"should also mention that this can return None if there\u0027s no domain associated with the authentication token.","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":336,"context_line":"    @property"},{"line_number":337,"context_line":"    def project_domain_id(self):"},{"line_number":338,"context_line":"        if self.project_id:"},{"line_number":339,"context_line":"            return \u0027default\u0027"},{"line_number":340,"context_line":""},{"line_number":341,"context_line":"    @property"},{"line_number":342,"context_line":"    def auth_url(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F438%3D","line":339,"updated":"2013-06-18 23:22:43.000000000","message":"I like the no \"else: return None\". tricky.","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":438,"context_line":"                and self[\u0027catalog\u0027]"},{"line_number":439,"context_line":"                and \u0027project\u0027 in self):"},{"line_number":440,"context_line":"            return True"},{"line_number":441,"context_line":"        return False"},{"line_number":442,"context_line":""},{"line_number":443,"context_line":"    @property"},{"line_number":444,"context_line":"    def domain_scoped(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F428%3D","line":441,"updated":"2013-06-18 23:22:43.000000000","message":"lines 437-441 could be \n\n return (\u0027catalog\u0027 in self  and self[\u0027catalog\u0027] and \u0027project\u0027 in self)\n\nand would be a little less confusing.","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":316,"context_line":""},{"line_number":317,"context_line":"    @property"},{"line_number":318,"context_line":"    def project_scoped(self):"},{"line_number":319,"context_line":"        if (\u0027serviceCatalog\u0027 in self"},{"line_number":320,"context_line":"                and self[\u0027serviceCatalog\u0027]"},{"line_number":321,"context_line":"                and \u0027tenant\u0027 in self[\u0027token\u0027]):"},{"line_number":322,"context_line":"            return True"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2dE%3D","line":319,"updated":"2013-06-19 21:07:12.000000000","message":"we should not be using catalog to determine scope.","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":434,"context_line":""},{"line_number":435,"context_line":"    @property"},{"line_number":436,"context_line":"    def project_scoped(self):"},{"line_number":437,"context_line":"        return (\u0027catalog\u0027 in self and self[\u0027catalog\u0027] and \u0027project\u0027 in self)"},{"line_number":438,"context_line":""},{"line_number":439,"context_line":"    @property"},{"line_number":440,"context_line":"    def domain_scoped(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2dM%3D","line":437,"updated":"2013-06-19 21:07:12.000000000","message":"we should not be using catalog to determine scope. There\u0027s really no such thing as unscoped token, token without explicit scope is implicitly scoped to identity service and therefore, may contain identity endpoints.","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"}],"keystoneclient/client.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5b6559d70c772421188e340d4f8a1334ead56e8a","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        self.user_id \u003d None"},{"line_number":77,"context_line":"        self.username \u003d None"},{"line_number":78,"context_line":"        self.user_domain_id \u003d \u0027default\u0027"},{"line_number":79,"context_line":"        self.user_domain_name \u003d None"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        self.project_id \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2B7S8%3D","line":78,"updated":"2013-02-14 05:35:26.000000000","message":"May want to make user_domain_id configurable because the default domain ID is configurable at Keystone.","commit_id":"26bfe06b1edee7482c98ed4d278ec46db6838d4f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"f81f350ee363718d505ac7c4bf9869c6c9331b45","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        self.user_id \u003d None"},{"line_number":77,"context_line":"        self.username \u003d None"},{"line_number":78,"context_line":"        self.user_domain_id \u003d \u0027default\u0027"},{"line_number":79,"context_line":"        self.user_domain_name \u003d None"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        self.project_id \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2B60Y%3D","line":78,"in_reply_to":"AAAAM3%2F%2B7Oc%3D","updated":"2013-02-14 14:59:06.000000000","message":"It is configurable -- you just pass in a different user_domain_id / project_domain_id and it overrides these defaults (e.g. could be configured in the environment as OS_USER_DOMAIN_ID). What I haven\u0027t done yet is upgrade AccessInfo to pull those values and override these as well.","commit_id":"26bfe06b1edee7482c98ed4d278ec46db6838d4f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8bbc9690444b1a83a0c27e8c9ef102767eda31e6","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        self.user_id \u003d None"},{"line_number":77,"context_line":"        self.username \u003d None"},{"line_number":78,"context_line":"        self.user_domain_id \u003d \u0027default\u0027"},{"line_number":79,"context_line":"        self.user_domain_name \u003d None"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        self.project_id \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2B7Oc%3D","line":78,"in_reply_to":"AAAAM3%2F%2B7S8%3D","updated":"2013-02-14 06:20:51.000000000","message":"+1 on that","commit_id":"26bfe06b1edee7482c98ed4d278ec46db6838d4f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5b6559d70c772421188e340d4f8a1334ead56e8a","unresolved":false,"context_lines":[{"line_number":80,"context_line":""},{"line_number":81,"context_line":"        self.project_id \u003d None"},{"line_number":82,"context_line":"        self.project_name \u003d None"},{"line_number":83,"context_line":"        self.project_domain_id \u003d \u0027default\u0027"},{"line_number":84,"context_line":"        self.project_domain_name \u003d None"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        self.auth_url \u003d None"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2B7S4%3D","line":83,"updated":"2013-02-14 05:35:26.000000000","message":"Same as above.","commit_id":"26bfe06b1edee7482c98ed4d278ec46db6838d4f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"ca792833b8ebec5618324075df37862f463ca520","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                 key\u003dNone, cert\u003dNone, insecure\u003dFalse, original_ip\u003dNone,"},{"line_number":59,"context_line":"                 debug\u003dFalse, auth_ref\u003dNone, use_keyring\u003dFalse,"},{"line_number":60,"context_line":"                 force_new_token\u003dFalse, stale_duration\u003dNone, tenant_id\u003dNone,"},{"line_number":61,"context_line":"                 tenant_name\u003dNone):"},{"line_number":62,"context_line":"        \"\"\"Construct a new http client"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        @param: timeout the request library timeout in seconds (default None)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2F5zc%3D","line":61,"updated":"2013-04-12 05:23:57.000000000","message":"param list is getting ridiculously long. May need to think about refactoring it soon. Maybe we can encapsulate some of them into AuthInfo?","commit_id":"d458c39c88a3710797369a2990950b224bb6552d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"4c9124a5ac213af5f817ccc60f224a5f0b35b876","unresolved":false,"context_lines":[{"line_number":58,"context_line":"                 key\u003dNone, cert\u003dNone, insecure\u003dFalse, original_ip\u003dNone,"},{"line_number":59,"context_line":"                 debug\u003dFalse, auth_ref\u003dNone, use_keyring\u003dFalse,"},{"line_number":60,"context_line":"                 force_new_token\u003dFalse, stale_duration\u003dNone, tenant_id\u003dNone,"},{"line_number":61,"context_line":"                 tenant_name\u003dNone):"},{"line_number":62,"context_line":"        \"\"\"Construct a new http client"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        @param: timeout the request library timeout in seconds (default None)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2F5jI%3D","line":61,"in_reply_to":"AAAAOn%2F%2F5zc%3D","updated":"2013-04-12 13:03:51.000000000","message":"I think the refactoring needs to happen into v2/v3 client classes - not sure i want to do that too much in this patch","commit_id":"d458c39c88a3710797369a2990950b224bb6552d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"ca792833b8ebec5618324075df37862f463ca520","unresolved":false,"context_lines":[{"line_number":348,"context_line":"                                            project_id\u003dNone, project_name\u003dNone,"},{"line_number":349,"context_line":"                                            project_domain_id\u003dNone,"},{"line_number":350,"context_line":"                                            project_domain_name\u003dNone,"},{"line_number":351,"context_line":"                                            token\u003dNone):"},{"line_number":352,"context_line":"        \"\"\" Authenticate against the Identity API and get a token."},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"        Not implemented here because auth protocols should be API"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2F5yM%3D","line":351,"updated":"2013-04-12 05:23:57.000000000","message":"You are changing the signature of a public method. That\u0027s going to break its existing subclasses.","commit_id":"d458c39c88a3710797369a2990950b224bb6552d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"4c9124a5ac213af5f817ccc60f224a5f0b35b876","unresolved":false,"context_lines":[{"line_number":348,"context_line":"                                            project_id\u003dNone, project_name\u003dNone,"},{"line_number":349,"context_line":"                                            project_domain_id\u003dNone,"},{"line_number":350,"context_line":"                                            project_domain_name\u003dNone,"},{"line_number":351,"context_line":"                                            token\u003dNone):"},{"line_number":352,"context_line":"        \"\"\" Authenticate against the Identity API and get a token."},{"line_number":353,"context_line":""},{"line_number":354,"context_line":"        Not implemented here because auth protocols should be API"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2F5jE%3D","line":351,"in_reply_to":"AAAAOn%2F%2F5yM%3D","updated":"2013-04-12 13:03:51.000000000","message":"existing subclasses outside of keystoneclient?","commit_id":"d458c39c88a3710797369a2990950b224bb6552d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"ca792833b8ebec5618324075df37862f463ca520","unresolved":false,"context_lines":[{"line_number":358,"context_line":"        reference already associated with the client. Invoking this call"},{"line_number":359,"context_line":"        *always* makes a call to the Keystone."},{"line_number":360,"context_line":""},{"line_number":361,"context_line":"        :returns: (``resp``, ``body``)"},{"line_number":362,"context_line":""},{"line_number":363,"context_line":"        \"\"\""},{"line_number":364,"context_line":"        raise NotImplementedError"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2F5yI%3D","line":361,"updated":"2013-04-12 05:23:57.000000000","message":"same as above","commit_id":"d458c39c88a3710797369a2990950b224bb6552d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3595003efd284dee27572a1cc22ed7e98a386a05","unresolved":false,"context_lines":[{"line_number":61,"context_line":"                 tenant_name\u003dNone):"},{"line_number":62,"context_line":"        \"\"\"Construct a new http client"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        @param: timeout the request library timeout in seconds (default None)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        \"\"\""},{"line_number":67,"context_line":"        # set default version based on arguments provided"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2F2jQ%3D","line":64,"updated":"2013-04-17 18:21:21.000000000","message":"looks like there\u0027s more than 1 parameter to this function.","commit_id":"ca9808113cf3c337186d173a63834f6c49f078dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3595003efd284dee27572a1cc22ed7e98a386a05","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        @param: timeout the request library timeout in seconds (default None)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"        \"\"\""},{"line_number":67,"context_line":"        # set default version based on arguments provided"},{"line_number":68,"context_line":"        if (project_id or project_name or user_domain_id or user_domain_name"},{"line_number":69,"context_line":"                or project_domain_id or project_domain_name):"},{"line_number":70,"context_line":"            self.version \u003d \u0027v3\u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2F2i0%3D","line":67,"updated":"2013-04-17 18:21:21.000000000","message":"suggest provide a way to force version, add a version\u003d parameter,\ncould also be done via the auth_ref parameter... maybe should set self.version from self.auth_ref at line 93.","commit_id":"ca9808113cf3c337186d173a63834f6c49f078dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3595003efd284dee27572a1cc22ed7e98a386a05","unresolved":false,"context_lines":[{"line_number":95,"context_line":"            self.auth_ref \u003d None"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        if self.auth_ref:"},{"line_number":98,"context_line":"            self.username \u003d self.auth_ref.username"},{"line_number":99,"context_line":"            self.project_id \u003d self.auth_ref.tenant_id"},{"line_number":100,"context_line":"            self.project_name \u003d self.auth_ref.tenant_name"},{"line_number":101,"context_line":"            self.auth_url \u003d self.auth_ref.auth_url[0]"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2F2iw%3D","line":98,"updated":"2013-04-17 18:21:21.000000000","message":"suggest move this code to after line 93, since don\u0027t need to check self.auth_ref again.","commit_id":"ca9808113cf3c337186d173a63834f6c49f078dc"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"7bec93deae56a3bdb035dff7697a598c3c5753eb","unresolved":false,"context_lines":[{"line_number":117,"context_line":"            self.user_id \u003d user_id"},{"line_number":118,"context_line":"        if username:"},{"line_number":119,"context_line":"            self.username \u003d username"},{"line_number":120,"context_line":"        if user_domain_id:"},{"line_number":121,"context_line":"            self.user_domain_id \u003d user_domain_id"},{"line_number":122,"context_line":"        if user_domain_name:"},{"line_number":123,"context_line":"            self.user_domain_name \u003d user_domain_name"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FnDM%3D","line":120,"updated":"2013-05-01 23:01:08.000000000","message":"There is no way to set the user_domain_id to empty.  If the user pass user_domain_name, both user_domain_id\u003d\u0027default\u0027 and user_domain_name gets passed in the authentication call.","commit_id":"ca9808113cf3c337186d173a63834f6c49f078dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3595003efd284dee27572a1cc22ed7e98a386a05","unresolved":false,"context_lines":[{"line_number":211,"context_line":"        then the resulting authenticated client will be scoped to that"},{"line_number":212,"context_line":"        tenant and contain a service catalog of available endpoints."},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"        With the v2.0 API, if a tenant name or ID is not provided, the"},{"line_number":215,"context_line":"        authentication token returned will be \u0027unscoped\u0027 and limited in"},{"line_number":216,"context_line":"        capabilities until a fully-scoped token is acquired."},{"line_number":217,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2F2ig%3D","line":214,"updated":"2013-04-17 18:21:21.000000000","message":"doc mentions what happens with the v2 API, but what about with the v3 API?","commit_id":"ca9808113cf3c337186d173a63834f6c49f078dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3595003efd284dee27572a1cc22ed7e98a386a05","unresolved":false,"context_lines":[{"line_number":242,"context_line":""},{"line_number":243,"context_line":"        user_domain_id \u003d user_domain_id or self.user_domain_id"},{"line_number":244,"context_line":"        user_domain_name \u003d user_domain_name or self.user_domain_name"},{"line_number":245,"context_line":"        project_id \u003d project_id or tenant_id or self.tenant_id"},{"line_number":246,"context_line":"        project_name \u003d project_name or tenant_name or self.tenant_name"},{"line_number":247,"context_line":"        project_domain_id \u003d project_domain_id or self.project_domain_id"},{"line_number":248,"context_line":"        project_domain_name \u003d project_domain_name or self.project_domain_name"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2F2is%3D","line":245,"updated":"2013-04-17 18:21:21.000000000","message":"should self.tenant_id be self.project_id? see line 110, etc.","commit_id":"ca9808113cf3c337186d173a63834f6c49f078dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3595003efd284dee27572a1cc22ed7e98a386a05","unresolved":false,"context_lines":[{"line_number":243,"context_line":"        user_domain_id \u003d user_domain_id or self.user_domain_id"},{"line_number":244,"context_line":"        user_domain_name \u003d user_domain_name or self.user_domain_name"},{"line_number":245,"context_line":"        project_id \u003d project_id or tenant_id or self.tenant_id"},{"line_number":246,"context_line":"        project_name \u003d project_name or tenant_name or self.tenant_name"},{"line_number":247,"context_line":"        project_domain_id \u003d project_domain_id or self.project_domain_id"},{"line_number":248,"context_line":"        project_domain_name \u003d project_domain_name or self.project_domain_name"},{"line_number":249,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2F2io%3D","line":246,"updated":"2013-04-17 18:21:21.000000000","message":"should self.tenant_name be self.project_name?","commit_id":"ca9808113cf3c337186d173a63834f6c49f078dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"be9acc793096fe64cab2433c125c1751655456e4","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        :param string project_domain_id: Project\u0027s domain ID. (optional)"},{"line_number":74,"context_line":"        :param string project_domain_name: Project\u0027s domain name. (optional)"},{"line_number":75,"context_line":"        :param string auth_url: Keystone service endpoint for authorization."},{"line_number":76,"context_line":"        :param string project_id: Project ID. (optional)"},{"line_number":77,"context_line":"        :param string project_name: Project name. (optional)"},{"line_number":78,"context_line":"        :param string project_domain_id: Project\u0027s domain ID. (optional)"},{"line_number":79,"context_line":"        :param string project_domain_name: Project\u0027s domain name. (optional)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPH%2F%2Fdfc%3D","line":76,"updated":"2013-06-03 14:14:51.000000000","message":"This and the next few lines appears to be a repetition of the project lines above?","commit_id":"7b7fa700a27fbca9864c9bc6f4489d0636a0baee"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"be9acc793096fe64cab2433c125c1751655456e4","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        \"\"\""},{"line_number":122,"context_line":"        # set default version based on arguments provided"},{"line_number":123,"context_line":"        if (project_id or project_name or user_domain_id or user_domain_name"},{"line_number":124,"context_line":"                or project_domain_id or project_domain_name):"},{"line_number":125,"context_line":"            self.version \u003d \u0027v3\u0027"},{"line_number":126,"context_line":"        else:"},{"line_number":127,"context_line":"            self.version \u003d \u0027v2.0\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPH%2F%2FdfY%3D","line":124,"updated":"2013-06-03 14:14:51.000000000","message":"Could you expand on the logic of why this would be the test for v3?  Anything with a domain in, I get, but why project_id?","commit_id":"7b7fa700a27fbca9864c9bc6f4489d0636a0baee"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"38f348094380e43bf58788286be1f1d44c2df0ab","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        \"\"\""},{"line_number":122,"context_line":"        # set default version based on arguments provided"},{"line_number":123,"context_line":"        if (project_id or project_name or user_domain_id or user_domain_name"},{"line_number":124,"context_line":"                or project_domain_id or project_domain_name):"},{"line_number":125,"context_line":"            self.version \u003d \u0027v3\u0027"},{"line_number":126,"context_line":"        else:"},{"line_number":127,"context_line":"            self.version \u003d \u0027v2.0\u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPX%2F%2F69w%3D","line":124,"in_reply_to":"AAAAPH%2F%2FdfY%3D","updated":"2013-06-05 23:14:09.000000000","message":"(I wrote this part) this should really be done in the v3 specific client class, rather than in the base client (which I don\u0027t think anyone ever initializes directly -- we at least don\u0027t document it that way).\n\nhenry- to answer your question, the logic was that v2 clients would specify tenant_id and v3 clients would specify project_id, etc. but again, i think that was a mistake on my part","commit_id":"7b7fa700a27fbca9864c9bc6f4489d0636a0baee"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                                    (optional)"},{"line_number":77,"context_line":"        :param string project_domain_id: Project\u0027s domain ID for project"},{"line_number":78,"context_line":"                                         scoping. (optional)"},{"line_number":79,"context_line":"        :param string project_domain_name: Project\u0027s domain name  for project"},{"line_number":80,"context_line":"                                           scoping. (optional)"},{"line_number":81,"context_line":"        :param string auth_url: Keystone service endpoint for authorization."},{"line_number":82,"context_line":"        :param string region_name: Name of a region to select when choosing an"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0B4%3D","line":79,"updated":"2013-06-09 16:38:59.000000000","message":"remove extra space. \"name  for\" -\u003e \"name for\"","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                                         scoping. (optional)"},{"line_number":79,"context_line":"        :param string project_domain_name: Project\u0027s domain name  for project"},{"line_number":80,"context_line":"                                           scoping. (optional)"},{"line_number":81,"context_line":"        :param string auth_url: Keystone service endpoint for authorization."},{"line_number":82,"context_line":"        :param string region_name: Name of a region to select when choosing an"},{"line_number":83,"context_line":"                                   endpoint from the service catalog."},{"line_number":84,"context_line":"        :param integer timeout: Allows customization of the timeout for client"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0B0%3D","line":81,"updated":"2013-06-09 16:38:59.000000000","message":"suggest change \"Keystone\" to \"Identity\"","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":83,"context_line":"                                   endpoint from the service catalog."},{"line_number":84,"context_line":"        :param integer timeout: Allows customization of the timeout for client"},{"line_number":85,"context_line":"                            http requests. (optional)"},{"line_number":86,"context_line":"        :param string endpoint: A user-supplied endpoint URL for the keystone"},{"line_number":87,"context_line":"                                service.  Lazy-authentication is possible for"},{"line_number":88,"context_line":"                                API service calls if endpoint is set at"},{"line_number":89,"context_line":"                                instantiation.(optional)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0Bw%3D","line":86,"updated":"2013-06-09 16:38:59.000000000","message":"change keystone to \"Identity\" (this applies elsewhere, too)","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        :param string endpoint: A user-supplied endpoint URL for the keystone"},{"line_number":87,"context_line":"                                service.  Lazy-authentication is possible for"},{"line_number":88,"context_line":"                                API service calls if endpoint is set at"},{"line_number":89,"context_line":"                                instantiation.(optional)"},{"line_number":90,"context_line":"        :param string token: Token for authentication. (optional)"},{"line_number":91,"context_line":"        :param string cacert: the ca-certs to verify the secure communications"},{"line_number":92,"context_line":"                          with keystone. (optional)"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0Bs%3D","line":89,"updated":"2013-06-09 16:38:59.000000000","message":"add space before (optional)","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        :param integer stale_duration: Gap in seconds to determine if token"},{"line_number":117,"context_line":"                                       from keyring is about to expire."},{"line_number":118,"context_line":"                                       default: 30 (optional)"},{"line_number":119,"context_line":"        :param string tenant_name: Tenant id. (optional)"},{"line_number":120,"context_line":"        :param string tenant_id: Tenant name. (optional)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0BU%3D","line":119,"updated":"2013-06-09 16:38:59.000000000","message":"doc should mention that this is deprecated.","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                                       from keyring is about to expire."},{"line_number":118,"context_line":"                                       default: 30 (optional)"},{"line_number":119,"context_line":"        :param string tenant_name: Tenant id. (optional)"},{"line_number":120,"context_line":"        :param string tenant_id: Tenant name. (optional)"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"        \"\"\""},{"line_number":123,"context_line":"        # set baseline defaults"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0BQ%3D","line":120,"updated":"2013-06-09 16:38:59.000000000","message":"doc should mention that this is deprecated.","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        if auth_ref:"},{"line_number":145,"context_line":"            self.auth_ref \u003d access.AccessInfo.factory(**auth_ref)"},{"line_number":146,"context_line":"            self.version \u003d self.auth_ref.version"},{"line_number":147,"context_line":"            self.username \u003d self.auth_ref.username"},{"line_number":148,"context_line":"            self.domain_id \u003d self.auth_ref.domain_id"},{"line_number":149,"context_line":"            self.domain_name \u003d self.auth_ref.domain_name"},{"line_number":150,"context_line":"            self.project_id \u003d self.auth_ref.tenant_id"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0BE%3D","line":147,"updated":"2013-06-09 16:38:59.000000000","message":"why not getting user_domain_id here and project_domain_id?","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":147,"context_line":"            self.username \u003d self.auth_ref.username"},{"line_number":148,"context_line":"            self.domain_id \u003d self.auth_ref.domain_id"},{"line_number":149,"context_line":"            self.domain_name \u003d self.auth_ref.domain_name"},{"line_number":150,"context_line":"            self.project_id \u003d self.auth_ref.tenant_id"},{"line_number":151,"context_line":"            self.project_name \u003d self.auth_ref.tenant_name"},{"line_number":152,"context_line":"            self.auth_url \u003d self.auth_ref.auth_url[0]"},{"line_number":153,"context_line":"            self.management_url \u003d self.auth_ref.management_url[0]"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0Bg%3D","line":150,"updated":"2013-06-09 16:38:59.000000000","message":"suggest change to project_id.","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":148,"context_line":"            self.domain_id \u003d self.auth_ref.domain_id"},{"line_number":149,"context_line":"            self.domain_name \u003d self.auth_ref.domain_name"},{"line_number":150,"context_line":"            self.project_id \u003d self.auth_ref.tenant_id"},{"line_number":151,"context_line":"            self.project_name \u003d self.auth_ref.tenant_name"},{"line_number":152,"context_line":"            self.auth_url \u003d self.auth_ref.auth_url[0]"},{"line_number":153,"context_line":"            self.management_url \u003d self.auth_ref.management_url[0]"},{"line_number":154,"context_line":"            self.auth_token \u003d self.auth_ref.auth_token"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0Bc%3D","line":151,"updated":"2013-06-09 16:38:59.000000000","message":"and project_name.","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        if tenant_id:"},{"line_number":163,"context_line":"            self.project_id \u003d tenant_id"},{"line_number":164,"context_line":"        if tenant_name:"},{"line_number":165,"context_line":"            self.project_name \u003d tenant_name"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        # user-related attributes"},{"line_number":168,"context_line":"        self.password \u003d password"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0BA%3D","line":165,"updated":"2013-06-09 16:38:59.000000000","message":"should we be setting these fields from the arguments if they were gotten from the auth_ref? (see line 151)","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        With the v3 API, if a project name or ID is not provided, and the"},{"line_number":288,"context_line":"        authenticating user has a defined default project, the authentication"},{"line_number":289,"context_line":"        token returned will be \u0027scoped\u0027 to the default project. Otherwise, the"},{"line_number":290,"context_line":"        authentication token returned will be \u0027unscoped\u0027 and limited in"},{"line_number":291,"context_line":"        capabilities until a fully-scoped token is acquired."},{"line_number":292,"context_line":""},{"line_number":293,"context_line":"        If successful, sets the self.auth_ref and self.auth_token with"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0A8%3D","line":290,"updated":"2013-06-09 16:38:59.000000000","message":"what about a domain-scoped token?","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"cff3e952875ecfb24e01f22cc5ea539a6fb0f6c5","unresolved":false,"context_lines":[{"line_number":347,"context_line":"        if auth_ref is None or self.force_new_token:"},{"line_number":348,"context_line":"            new_token_needed \u003d True"},{"line_number":349,"context_line":"            resp, body \u003d self.get_raw_token_from_identity_service("},{"line_number":350,"context_line":"                auth_url\u003dauth_url,"},{"line_number":351,"context_line":"                user_id\u003duser_id,"},{"line_number":352,"context_line":"                user_name\u003dusername,"},{"line_number":353,"context_line":"                password\u003dpassword,"}],"source_content_type":"text/x-python","patch_set":16,"id":"AAAAPX%2F%2F0A0%3D","line":350,"updated":"2013-06-09 16:38:59.000000000","message":"lots of copied args here. Suggest build a dict and pass that into this function and at line 334.","commit_id":"102cdd092b1903869486f04c211ac692add07e9a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"88ca47a4eb6c31a68fc2b20409c5c9a9b9e962cc","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        if tenant_id:"},{"line_number":171,"context_line":"            self.project_id \u003d tenant_id"},{"line_number":172,"context_line":"        if tenant_name:"},{"line_number":173,"context_line":"            self.project_name \u003d tenant_name"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        # user-related attributes"},{"line_number":176,"context_line":"        self.password \u003d password"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPX%2F%2FxMY%3D","line":173,"updated":"2013-06-11 00:50:37.000000000","message":"should we be setting these fields from the arguments if they were gotten from the auth_ref? (see line 151)","commit_id":"389afea0753014f7e00c7e43993cc2f3444aab8c"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"50e50ada3fe56b28ff85843d6cbe3f6e77c42b3c","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        if tenant_id:"},{"line_number":171,"context_line":"            self.project_id \u003d tenant_id"},{"line_number":172,"context_line":"        if tenant_name:"},{"line_number":173,"context_line":"            self.project_name \u003d tenant_name"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        # user-related attributes"},{"line_number":176,"context_line":"        self.password \u003d password"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPX%2F%2Fr74%3D","line":173,"in_reply_to":"AAAAPX%2F%2FvQo%3D","updated":"2013-06-12 20:34:43.000000000","message":"After discussion, we\u0027ll be keeping this behavior and describing the behavior in the docstring.\n\nAdded test for this as well.","commit_id":"389afea0753014f7e00c7e43993cc2f3444aab8c"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"56c11ed87bd59e8f5ebec6495e31d02d0c08799b","unresolved":false,"context_lines":[{"line_number":170,"context_line":"        if tenant_id:"},{"line_number":171,"context_line":"            self.project_id \u003d tenant_id"},{"line_number":172,"context_line":"        if tenant_name:"},{"line_number":173,"context_line":"            self.project_name \u003d tenant_name"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"        # user-related attributes"},{"line_number":176,"context_line":"        self.password \u003d password"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPX%2F%2FvQo%3D","line":173,"in_reply_to":"AAAAPX%2F%2FxMY%3D","updated":"2013-06-11 17:02:46.000000000","message":"This is the old behavior of keystone-client. Applying the auth_ref then it is overridden with value from the arguments.  I say we should keep the existing behavior.\n\nWhat are other folks thought about this?","commit_id":"389afea0753014f7e00c7e43993cc2f3444aab8c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                 key\u003dNone, cert\u003dNone, insecure\u003dFalse, original_ip\u003dNone,"},{"line_number":53,"context_line":"                 debug\u003dFalse, auth_ref\u003dNone, use_keyring\u003dFalse,"},{"line_number":54,"context_line":"                 force_new_token\u003dFalse, stale_duration\u003dNone, tenant_id\u003dNone,"},{"line_number":55,"context_line":"                 tenant_name\u003dNone):"},{"line_number":56,"context_line":"        \"\"\"Construct a new http client"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        :param string user_id: User ID for authentication. (optional)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F42w%3D","line":55,"updated":"2013-06-18 23:22:43.000000000","message":"do we have to change the order of the arguments? any client relying on the old order is going to be broken by this.","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                 key\u003dNone, cert\u003dNone, insecure\u003dFalse, original_ip\u003dNone,"},{"line_number":53,"context_line":"                 debug\u003dFalse, auth_ref\u003dNone, use_keyring\u003dFalse,"},{"line_number":54,"context_line":"                 force_new_token\u003dFalse, stale_duration\u003dNone, tenant_id\u003dNone,"},{"line_number":55,"context_line":"                 tenant_name\u003dNone):"},{"line_number":56,"context_line":"        \"\"\"Construct a new http client"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"        :param string user_id: User ID for authentication. (optional)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2cs%3D","line":55,"updated":"2013-06-19 21:07:12.000000000","message":"agree with bknudson, generally you don\u0027t want to alter the order of the arguments even though they are named arguments","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                                instantiation. (optional)"},{"line_number":83,"context_line":"        :param string token: Token for authentication. (optional)"},{"line_number":84,"context_line":"        :param string cacert: the ca-certs to verify the secure communications"},{"line_number":85,"context_line":"                          with the identity service. (optional)"},{"line_number":86,"context_line":"        :param string key: The key associated with the certificate for secure"},{"line_number":87,"context_line":"                       communication with the identity service. (optional)"},{"line_number":88,"context_line":"        :param string cert: If provided, used as a local certificate to"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2b4%3D","line":85,"updated":"2013-06-19 21:07:12.000000000","message":"cacert: path to the Privacy Enhanced Mail (PEM) file which containing the trusted authority X.509 certificates needed to established SSL connection with the identity service.","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        :param string cacert: the ca-certs to verify the secure communications"},{"line_number":85,"context_line":"                          with the identity service. (optional)"},{"line_number":86,"context_line":"        :param string key: The key associated with the certificate for secure"},{"line_number":87,"context_line":"                       communication with the identity service. (optional)"},{"line_number":88,"context_line":"        :param string cert: If provided, used as a local certificate to"},{"line_number":89,"context_line":"                            communicate with the identity service endpoint. If"},{"line_number":90,"context_line":"                            provided, requires the additional parameter key."}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2bs%3D","line":87,"updated":"2013-06-19 21:07:12.000000000","message":"key: path to the Privacy Enhanced Mail (PEM) file which containing the unencrypted client private key needed to established two-way SSL connection with the identity service.","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":88,"context_line":"        :param string cert: If provided, used as a local certificate to"},{"line_number":89,"context_line":"                            communicate with the identity service endpoint. If"},{"line_number":90,"context_line":"                            provided, requires the additional parameter key."},{"line_number":91,"context_line":"                            (optional)"},{"line_number":92,"context_line":"        :param boolean insecure: If using an SSL endpoint, allows for the"},{"line_number":93,"context_line":"                                 certicate to be unsigned - does not verify the"},{"line_number":94,"context_line":"                                 certificate chain. default: False (optional)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2bY%3D","line":91,"updated":"2013-06-19 21:07:12.000000000","message":"cert: path to the Privacy Enhanced Mail (PEM) file which containing the corresponding X.509 client certificate needed to established two-way SSL connection with the identity service.","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":91,"context_line":"                            (optional)"},{"line_number":92,"context_line":"        :param boolean insecure: If using an SSL endpoint, allows for the"},{"line_number":93,"context_line":"                                 certicate to be unsigned - does not verify the"},{"line_number":94,"context_line":"                                 certificate chain. default: False (optional)"},{"line_number":95,"context_line":"        :param string original_ip: The original IP of the requesting user"},{"line_number":96,"context_line":"                                   which will be sent to identity service in a"},{"line_number":97,"context_line":"                                   \u0027Forwarded\u0027 header. (optional)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2bE%3D","line":94,"updated":"2013-06-19 21:07:12.000000000","message":"insecure: does not perform X.509 certificate validation when establishing SSL connection with identity service","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":266,"context_line":""},{"line_number":267,"context_line":"    @property"},{"line_number":268,"context_line":"    def tenant_id(self):"},{"line_number":269,"context_line":"        \"\"\"Provide read-only backwards compatibility for tenant_id.\"\"\""},{"line_number":270,"context_line":"        return self.project_id"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2Zc%3D","line":269,"updated":"2013-06-19 21:07:12.000000000","message":"mark it as deprecated?","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    @property"},{"line_number":273,"context_line":"    def tenant_name(self):"},{"line_number":274,"context_line":"        \"\"\"Provide read-only backwards compatibility for tenant_name.\"\"\""},{"line_number":275,"context_line":"        return self.project_name"},{"line_number":276,"context_line":""},{"line_number":277,"context_line":"    def authenticate(self, username\u003dNone, password\u003dNone, user_id\u003dNone,"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2ZU%3D","line":274,"updated":"2013-06-19 21:07:12.000000000","message":"deprecated?","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":280,"context_line":"                     token\u003dNone, user_domain_id\u003dNone,"},{"line_number":281,"context_line":"                     user_domain_name\u003dNone, project_domain_id\u003dNone,"},{"line_number":282,"context_line":"                     project_domain_name\u003dNone, tenant_id\u003dNone,"},{"line_number":283,"context_line":"                     tenant_name\u003dNone):"},{"line_number":284,"context_line":"        \"\"\" Authenticate user."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"        Uses the data provided at instantiation to authenticate against"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2Y8%3D","line":283,"updated":"2013-06-19 21:07:12.000000000","message":"agree with bknudson, we should preserve the parameter ordering even though they are named parameters","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":281,"context_line":"                     user_domain_name\u003dNone, project_domain_id\u003dNone,"},{"line_number":282,"context_line":"                     project_domain_name\u003dNone, tenant_id\u003dNone,"},{"line_number":283,"context_line":"                     tenant_name\u003dNone):"},{"line_number":284,"context_line":"        \"\"\" Authenticate user."},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"        Uses the data provided at instantiation to authenticate against"},{"line_number":287,"context_line":"        the Identity server. This may use either a username and password"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2Yk%3D","line":284,"updated":"2013-06-19 21:07:12.000000000","message":"\"\"\"Authenticate user.\n\nno space in between","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":370,"context_line":"        return True"},{"line_number":371,"context_line":""},{"line_number":372,"context_line":"    def _build_keyring_key(self, **kwargs):"},{"line_number":373,"context_line":"        \"\"\" Create a unique key for keyring."},{"line_number":374,"context_line":""},{"line_number":375,"context_line":"        Used to store and retrieve auth_ref from keyring."},{"line_number":376,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2Yg%3D","line":373,"updated":"2013-06-19 21:07:12.000000000","message":"\"\"\"Create a ...","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":432,"context_line":"                                            project_id\u003dNone, project_name\u003dNone,"},{"line_number":433,"context_line":"                                            project_domain_id\u003dNone,"},{"line_number":434,"context_line":"                                            project_domain_name\u003dNone,"},{"line_number":435,"context_line":"                                            token\u003dNone):"},{"line_number":436,"context_line":"        \"\"\" Authenticate against the Identity API and get a token."},{"line_number":437,"context_line":""},{"line_number":438,"context_line":"        Not implemented here because auth protocols should be API"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2YE%3D","line":435,"updated":"2013-06-19 21:07:12.000000000","message":"What happen to password?","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"}],"keystoneclient/service_catalog.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0a66366dbc2837e929d2532c29ab7b57f34f20f1","unresolved":false,"context_lines":[{"line_number":174,"context_line":""},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"class ServiceCatalogV3(ServiceCatalog):"},{"line_number":177,"context_line":"    \"\"\"An object for encapsulating the service catalog using raw v2 auth token"},{"line_number":178,"context_line":"    from keystone.\"\"\""},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def __init__(self, token, resource_dict, region_name\u003dNone):"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPX%2F%2F5qY%3D","line":177,"updated":"2013-06-06 13:38:39.000000000","message":"I assume we mean v3 here?","commit_id":"efe620d1eac6c4396d443241f7a780b7b51b435a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0a66366dbc2837e929d2532c29ab7b57f34f20f1","unresolved":false,"context_lines":[{"line_number":194,"context_line":"                 \u0027expires\u0027: self.catalog[\u0027expires_at\u0027]}"},{"line_number":195,"context_line":"        try:"},{"line_number":196,"context_line":"            token[\u0027user_id\u0027] \u003d self.catalog[\u0027user\u0027][\u0027id\u0027]"},{"line_number":197,"context_line":"            token[\u0027tenant_id\u0027] \u003d self.catalog[\u0027project\u0027][\u0027id\u0027]"},{"line_number":198,"context_line":"        except Exception:"},{"line_number":199,"context_line":"            # just leave the tenant and user out if it doesn\u0027t exist"},{"line_number":200,"context_line":"            pass"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPX%2F%2F5pk%3D","line":197,"updated":"2013-06-06 13:38:39.000000000","message":"is there a need to load the domain_id as well if this is a domain scoped token?","commit_id":"efe620d1eac6c4396d443241f7a780b7b51b435a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"88ca47a4eb6c31a68fc2b20409c5c9a9b9e962cc","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \"\"\"Helper methods for dealing with a Keystone Service Catalog.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @classmethod"},{"line_number":27,"context_line":"    def factory(cls, token, resource_dict, region_name\u003dNone):"},{"line_number":28,"context_line":"        \"\"\"Create ServiceCatalog object given a auth token.\"\"\""},{"line_number":29,"context_line":"        if ServiceCatalogV3.is_valid(resource_dict):"},{"line_number":30,"context_line":"            return ServiceCatalogV3(token, resource_dict, region_name)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPX%2F%2FxME%3D","line":27,"updated":"2013-06-11 00:50:37.000000000","message":"should token also be optional like region_name since it\u0027s only used in V3?","commit_id":"389afea0753014f7e00c7e43993cc2f3444aab8c"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"56c11ed87bd59e8f5ebec6495e31d02d0c08799b","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \"\"\"Helper methods for dealing with a Keystone Service Catalog.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @classmethod"},{"line_number":27,"context_line":"    def factory(cls, token, resource_dict, region_name\u003dNone):"},{"line_number":28,"context_line":"        \"\"\"Create ServiceCatalog object given a auth token.\"\"\""},{"line_number":29,"context_line":"        if ServiceCatalogV3.is_valid(resource_dict):"},{"line_number":30,"context_line":"            return ServiceCatalogV3(token, resource_dict, region_name)"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPX%2F%2FvQY%3D","line":27,"in_reply_to":"AAAAPX%2F%2FxME%3D","updated":"2013-06-11 17:02:46.000000000","message":"Yeah, if I made it optional I need to switch the order of the token and resource_dict though..","commit_id":"389afea0753014f7e00c7e43993cc2f3444aab8c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"88ca47a4eb6c31a68fc2b20409c5c9a9b9e962cc","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        - `id`: Token\u0027s ID"},{"line_number":42,"context_line":"        - `expires`: Token\u0027s expiration"},{"line_number":43,"context_line":"        - `user_id`: Authenticated user\u0027s ID"},{"line_number":44,"context_line":"        - `tenant_id`: Authorized project\u0027s ID"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        \"\"\""},{"line_number":47,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPX%2F%2FxL8%3D","line":44,"updated":"2013-06-11 00:50:37.000000000","message":"add domain_id here since that\u0027s in there too.","commit_id":"389afea0753014f7e00c7e43993cc2f3444aab8c"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"56c11ed87bd59e8f5ebec6495e31d02d0c08799b","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        - `id`: Token\u0027s ID"},{"line_number":42,"context_line":"        - `expires`: Token\u0027s expiration"},{"line_number":43,"context_line":"        - `user_id`: Authenticated user\u0027s ID"},{"line_number":44,"context_line":"        - `tenant_id`: Authorized project\u0027s ID"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        \"\"\""},{"line_number":47,"context_line":"        raise NotImplementedError()"}],"source_content_type":"text/x-python","patch_set":17,"id":"AAAAPX%2F%2FvQQ%3D","line":44,"in_reply_to":"AAAAPX%2F%2FxL8%3D","updated":"2013-06-11 17:02:46.000000000","message":"Agree, I\u0027ll add it in the next patch","commit_id":"389afea0753014f7e00c7e43993cc2f3444aab8c"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        :param string service_type: Service type of the endpoint."},{"line_number":69,"context_line":"        :param string endpoint_type: Type of endpoint."},{"line_number":70,"context_line":"                                     Possible values: public, internal, admin"},{"line_number":71,"context_line":"                                         publicURL, internalURL, adminURL"},{"line_number":72,"context_line":"        :param string region_name: Region of the endpoint."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        :returns: tuple of urls"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F40o%3D","line":71,"updated":"2013-06-18 23:22:43.000000000","message":"should add a note that public and publicURL are equivalent (same for internal, admin).","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                                         publicURL, internalURL, adminURL"},{"line_number":72,"context_line":"        :param string region_name: Region of the endpoint."},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"        :returns: tuple of urls"},{"line_number":75,"context_line":"        \"\"\""},{"line_number":76,"context_line":"        raise NotImplementedError()"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F40Q%3D","line":74,"updated":"2013-06-18 23:22:43.000000000","message":"should also include \"or None\" since this function returns None rather than an empty tuple.","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        the first endpoint of the specified type."},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        Valid endpoint types: `public`, `internal`, `admin`,"},{"line_number":87,"context_line":"                              `publicURL`, `internalURL`, `adminURL`"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        See tests for a sample service catalog."},{"line_number":90,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F40g%3D","line":87,"updated":"2013-06-18 23:22:43.000000000","message":"should add a note that public and publicURL are equivalent (same for internal, admin).\n\nAlso, at line 70 don\u0027t use ` around strings, should be consistent.","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        Valid endpoint types: `public`, `internal`, `admin`,"},{"line_number":87,"context_line":"                              `publicURL`, `internalURL`, `adminURL`"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        See tests for a sample service catalog."},{"line_number":90,"context_line":"        \"\"\""},{"line_number":91,"context_line":"        raise NotImplementedError()"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F40c%3D","line":89,"updated":"2013-06-18 23:22:43.000000000","message":"why should I see the tests?","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"class ServiceCatalogV2(ServiceCatalog):"},{"line_number":95,"context_line":"    \"\"\"An object for encapsulating the service catalog using raw v2 auth token"},{"line_number":96,"context_line":"    from keystone.\"\"\""},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    def __init__(self, resource_dict, region_name\u003dNone):"},{"line_number":99,"context_line":"        self.catalog \u003d resource_dict"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F40I%3D","line":96,"updated":"2013-06-18 23:22:43.000000000","message":"capitalize Keystone","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    @classmethod"},{"line_number":103,"context_line":"    def is_valid(cls, resource_dict):"},{"line_number":104,"context_line":"        # The class is also used for reading token info of an unscoped token."},{"line_number":105,"context_line":"        # Unscoped token does not have \u0027serviceCatalog\u0027 in V2, checking this"},{"line_number":106,"context_line":"        # will not work. Use \u0027token\u0027 attribute instead."},{"line_number":107,"context_line":"        return \u0027token\u0027 in resource_dict"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F40A%3D","line":104,"updated":"2013-06-18 23:22:43.000000000","message":"Change \"The\" to \"This\"","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        return token"},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    def get_endpoints(self, service_type\u003dNone, endpoint_type\u003dNone):"},{"line_number":121,"context_line":"        if endpoint_type and endpoint_type.find(\u0027URL\u0027) \u003d\u003d -1:"},{"line_number":122,"context_line":"            endpoint_type \u003d endpoint_type + \u0027URL\u0027"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"        sc \u003d {}"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F4zk%3D","line":121,"updated":"2013-06-18 23:22:43.000000000","message":"suggest use \"\u0027URL\u0027 not in endpoint_type\"\n\n  \u003e\u003e\u003e \u0027URL\u0027 not in \u0027publicURL\u0027\n False\n \u003e\u003e\u003e \u0027URL\u0027 not in \u0027public\u0027\n True","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":140,"context_line":"        if not endpoints:"},{"line_number":141,"context_line":"            return"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":"        return tuple(endpoint[endpoint_type]"},{"line_number":144,"context_line":"                     for endpoint in endpoints"},{"line_number":145,"context_line":"                     if (endpoint_type in endpoint"},{"line_number":146,"context_line":"                         and (not self.region_name"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F4w4%3D","line":143,"updated":"2013-06-18 23:22:43.000000000","message":"do we need to \"endpoint_type \u003d endpoint_type + \u0027URL\u0027 if not \u0027URL\u0027 in endpoint_type\" before this?","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        if not catalog:"},{"line_number":156,"context_line":"            raise exceptions.EmptyCatalog(\u0027The service catalog is empty.\u0027)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":"        if endpoint_type.find(\u0027URL\u0027) \u003d\u003d -1:"},{"line_number":159,"context_line":"            endpoint_type \u003d endpoint_type + \u0027URL\u0027"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        for service in catalog:"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F40s%3D","line":158,"updated":"2013-06-18 23:22:43.000000000","message":"suggest use \"\u0027URL\u0027 not in endpoint_type\"","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    @classmethod"},{"line_number":187,"context_line":"    def is_valid(cls, resource_dict):"},{"line_number":188,"context_line":"        # The class is also used for reading token info of an unscoped token."},{"line_number":189,"context_line":"        # Unscoped token does not have \u0027catalog\u0027, checking this"},{"line_number":190,"context_line":"        # will not work. Use \u0027methods\u0027 attribute instead."},{"line_number":191,"context_line":"        return \u0027methods\u0027 in resource_dict"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F4y4%3D","line":188,"updated":"2013-06-18 23:22:43.000000000","message":"change \"The class\" to \"This class\"","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":186,"context_line":"    @classmethod"},{"line_number":187,"context_line":"    def is_valid(cls, resource_dict):"},{"line_number":188,"context_line":"        # The class is also used for reading token info of an unscoped token."},{"line_number":189,"context_line":"        # Unscoped token does not have \u0027catalog\u0027, checking this"},{"line_number":190,"context_line":"        # will not work. Use \u0027methods\u0027 attribute instead."},{"line_number":191,"context_line":"        return \u0027methods\u0027 in resource_dict"},{"line_number":192,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F4y0%3D","line":189,"updated":"2013-06-18 23:22:43.000000000","message":"why do I care if it\u0027s got catalog or not? This comment doesn\u0027t make sense to me.","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":202,"context_line":"            if project:"},{"line_number":203,"context_line":"                token[\u0027tenant_id\u0027] \u003d project[\u0027id\u0027]"},{"line_number":204,"context_line":"        except Exception:"},{"line_number":205,"context_line":"            # just leave the tenant and user out if it doesn\u0027t exist"},{"line_number":206,"context_line":"            pass"},{"line_number":207,"context_line":"        return token"},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F4xw%3D","line":205,"updated":"2013-06-18 23:22:43.000000000","message":"this comment should also mention domain, assuming that\u0027s how this function should work.\n\nAlso, change tenant to project.","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        return token"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":"    def get_endpoints(self, service_type\u003dNone, endpoint_type\u003dNone):"},{"line_number":210,"context_line":"        endpoint_type \u003d endpoint_type.rstrip(\u0027URL\u0027)"},{"line_number":211,"context_line":"        sc \u003d {}"},{"line_number":212,"context_line":"        for service in self.catalog.get(\u0027catalog\u0027, []):"},{"line_number":213,"context_line":"            if service_type and service_type !\u003d service[\u0027type\u0027]:"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F4xY%3D","line":210,"updated":"2013-06-18 23:22:43.000000000","message":"this will fail if endpoint_type is None (the default).\n\nThere must be a testcase missing.","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":220,"context_line":"        return sc"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"    def get_urls(self, attr\u003dNone, filter_value\u003dNone,"},{"line_number":223,"context_line":"                 service_type\u003d\u0027identity\u0027, endpoint_type\u003d\u0027publicURL\u0027):"},{"line_number":224,"context_line":"        sc_endpoints \u003d self.get_endpoints(service_type\u003dservice_type,"},{"line_number":225,"context_line":"                                          endpoint_type\u003dendpoint_type)"},{"line_number":226,"context_line":"        endpoints \u003d sc_endpoints.get(service_type)"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F4xk%3D","line":223,"updated":"2013-06-18 23:22:43.000000000","message":"should the default for endpoint_type be \u0027public\u0027 rather than \u0027publicURL\u0027?","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":"        urls \u003d list()"},{"line_number":231,"context_line":"        for endpoint in endpoints:"},{"line_number":232,"context_line":"            if (endpoint[\u0027interface\u0027] \u003d\u003d endpoint_type"},{"line_number":233,"context_line":"                    and (not self.region_name"},{"line_number":234,"context_line":"                         or endpoint.get(\u0027region\u0027) \u003d\u003d self.region_name)"},{"line_number":235,"context_line":"                    and (not filter_value"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F4xA%3D","line":232,"updated":"2013-06-18 23:22:43.000000000","message":"do we need to endpoint_type \u003d endpoint_type.rstrip(\u0027URL\u0027)  before this?","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":238,"context_line":"        return tuple(urls)"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"    def url_for(self, attr\u003dNone, filter_value\u003dNone,"},{"line_number":241,"context_line":"                service_type\u003d\u0027identity\u0027, endpoint_type\u003d\u0027publicURL\u0027):"},{"line_number":242,"context_line":"        catalog \u003d self.catalog.get(\u0027catalog\u0027, [])"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"        if not catalog:"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F4xg%3D","line":241,"updated":"2013-06-18 23:22:43.000000000","message":"should the default for endpoint_type be \u0027public\u0027 rather than \u0027publicURL\u0027?","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":255,"context_line":"            for endpoint in endpoints:"},{"line_number":256,"context_line":"                if endpoint.get(\u0027interface\u0027) !\u003d endpoint_type:"},{"line_number":257,"context_line":"                    continue"},{"line_number":258,"context_line":"                if self.region_name and \\"},{"line_number":259,"context_line":"                        endpoint.get(\u0027region\u0027) !\u003d self.region_name:"},{"line_number":260,"context_line":"                    continue"},{"line_number":261,"context_line":"                if not filter_value or endpoint.get(attr) \u003d\u003d filter_value:"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F4ww%3D","line":258,"updated":"2013-06-18 23:22:43.000000000","message":"use () to continue a line rather than \\, see pep8.","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":24,"context_line":"    \"\"\"Helper methods for dealing with a Keystone Service Catalog.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    @classmethod"},{"line_number":27,"context_line":"    def factory(cls, resource_dict, token\u003dNone, region_name\u003dNone):"},{"line_number":28,"context_line":"        \"\"\"Create ServiceCatalog object given a auth token.\"\"\""},{"line_number":29,"context_line":"        if ServiceCatalogV3.is_valid(resource_dict):"},{"line_number":30,"context_line":"            return ServiceCatalogV3(token, resource_dict, region_name)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2Xc%3D","line":27,"updated":"2013-06-19 21:07:12.000000000","message":"parameter ordering","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":27,"context_line":"    def factory(cls, resource_dict, token\u003dNone, region_name\u003dNone):"},{"line_number":28,"context_line":"        \"\"\"Create ServiceCatalog object given a auth token.\"\"\""},{"line_number":29,"context_line":"        if ServiceCatalogV3.is_valid(resource_dict):"},{"line_number":30,"context_line":"            return ServiceCatalogV3(token, resource_dict, region_name)"},{"line_number":31,"context_line":"        elif ServiceCatalogV2.is_valid(resource_dict):"},{"line_number":32,"context_line":"            return ServiceCatalogV2(resource_dict, region_name)"},{"line_number":33,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2Wk%3D","line":30,"updated":"2013-06-19 21:07:12.000000000","message":"token is in v2 catalog but not v3? I am confused.","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"}],"keystoneclient/v2_0/client.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"8bbc9690444b1a83a0c27e8c9ef102767eda31e6","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            if self.management_url is None and self.auth_ref.management_url:"},{"line_number":153,"context_line":"                self.management_url \u003d self.auth_ref.management_url[0]"},{"line_number":154,"context_line":"            self.project_name \u003d self.auth_ref.tenant_name"},{"line_number":155,"context_line":"            self.project_id \u003d self.auth_ref.tenant_id"},{"line_number":156,"context_line":"            self.user_id \u003d self.auth_ref.user_id"},{"line_number":157,"context_line":"        self._extract_service_catalog(self.auth_url, self.auth_ref)"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2B7OI%3D","line":155,"updated":"2013-02-14 06:20:51.000000000","message":"nice clean-up","commit_id":"26bfe06b1edee7482c98ed4d278ec46db6838d4f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"f81f350ee363718d505ac7c4bf9869c6c9331b45","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            if self.management_url is None and self.auth_ref.management_url:"},{"line_number":153,"context_line":"                self.management_url \u003d self.auth_ref.management_url[0]"},{"line_number":154,"context_line":"            self.project_name \u003d self.auth_ref.tenant_name"},{"line_number":155,"context_line":"            self.project_id \u003d self.auth_ref.tenant_id"},{"line_number":156,"context_line":"            self.user_id \u003d self.auth_ref.user_id"},{"line_number":157,"context_line":"        self._extract_service_catalog(self.auth_url, self.auth_ref)"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2B60g%3D","line":155,"in_reply_to":"AAAAM3%2F%2B7Eg%3D","updated":"2013-02-14 14:59:06.000000000","message":"1. I\u0027m upgrading the internal semantics of the client to use the term \"project\" while maintaining backwards compatibility. The library user can still use tenant_id and tenant_name if they prefer.\n\n2. I upgraded the method signature for get_raw_token_from_identity_service (below) to support more options than one API alone can understand.\n\n3. Finally, I had to opted to refactor AccessInfo a bit to support more than one API.","commit_id":"26bfe06b1edee7482c98ed4d278ec46db6838d4f"},{"author":{"_account_id":1955,"name":"Alan Pevec","email":"alan.pevec@redhat.com","username":"apevec"},"change_message_id":"f8aa54019d3669b9a2d10c5201bfd97c7db18d57","unresolved":false,"context_lines":[{"line_number":152,"context_line":"            if self.management_url is None and self.auth_ref.management_url:"},{"line_number":153,"context_line":"                self.management_url \u003d self.auth_ref.management_url[0]"},{"line_number":154,"context_line":"            self.project_name \u003d self.auth_ref.tenant_name"},{"line_number":155,"context_line":"            self.project_id \u003d self.auth_ref.tenant_id"},{"line_number":156,"context_line":"            self.user_id \u003d self.auth_ref.user_id"},{"line_number":157,"context_line":"        self._extract_service_catalog(self.auth_url, self.auth_ref)"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2B7Eg%3D","line":155,"in_reply_to":"AAAAM3%2F%2B7OI%3D","updated":"2013-02-14 10:35:22.000000000","message":"But is this right?\nIsn\u0027t tenant -\u003e project v3 only and v2_0/client should keep tenant terminology?","commit_id":"26bfe06b1edee7482c98ed4d278ec46db6838d4f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"ca792833b8ebec5618324075df37862f463ca520","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                                            **kwargs):"},{"line_number":162,"context_line":"        \"\"\" Authenticate against the v2 Identity API."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        :returns: ``raw token`` if authentication was successful."},{"line_number":165,"context_line":"        :raises: AuthorizationFailure if unable to authenticate or validate"},{"line_number":166,"context_line":"                 the existing authorization token"},{"line_number":167,"context_line":"        :raises: ValueError if insufficient parameters are used."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2F5yc%3D","line":164,"updated":"2013-04-12 05:23:57.000000000","message":":returns: (resp, body)","commit_id":"d458c39c88a3710797369a2990950b224bb6552d"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"4c9124a5ac213af5f817ccc60f224a5f0b35b876","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                                            **kwargs):"},{"line_number":162,"context_line":"        \"\"\" Authenticate against the v2 Identity API."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        :returns: ``raw token`` if authentication was successful."},{"line_number":165,"context_line":"        :raises: AuthorizationFailure if unable to authenticate or validate"},{"line_number":166,"context_line":"                 the existing authorization token"},{"line_number":167,"context_line":"        :raises: ValueError if insufficient parameters are used."}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2F5i8%3D","line":164,"in_reply_to":"AAAAOn%2F%2F5yc%3D","updated":"2013-04-12 13:03:51.000000000","message":"thanks!","commit_id":"d458c39c88a3710797369a2990950b224bb6552d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":149,"context_line":"                self.management_url \u003d self.auth_ref.management_url[0]"},{"line_number":150,"context_line":"            self.project_name \u003d self.auth_ref.tenant_name"},{"line_number":151,"context_line":"            self.project_id \u003d self.auth_ref.tenant_id"},{"line_number":152,"context_line":"        elif self.auth_ref.domain_scoped:"},{"line_number":153,"context_line":"            if not self.auth_ref.domain_id:"},{"line_number":154,"context_line":"                raise exceptions.AuthorizationFailure("},{"line_number":155,"context_line":"                    \"Token didn\u0027t provide domain_id\")"}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F4vo%3D","line":152,"updated":"2013-06-18 23:22:43.000000000","message":"how would a v2 client get a domain scoped token?","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    def get_raw_token_from_identity_service(self, auth_url, username\u003dNone,"},{"line_number":172,"context_line":"                                            password\u003dNone, project_name\u003dNone,"},{"line_number":173,"context_line":"                                            project_id\u003dNone, token\u003dNone,"},{"line_number":174,"context_line":"                                            **kwargs):"},{"line_number":175,"context_line":"        \"\"\" Authenticate against the v2 Identity API."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        :returns: (``resp``, ``body``) if authentication was successful."}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F4wE%3D","line":174,"updated":"2013-06-18 23:22:43.000000000","message":"this looks like it\u0027s going to break backwards compatibility. A client calling this with tenant_name and tenant_id is not going to work anymore.","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"4507079928e8c109555183a1ea0f3244c0f2cb17","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                                            **kwargs):"},{"line_number":175,"context_line":"        \"\"\" Authenticate against the v2 Identity API."},{"line_number":176,"context_line":""},{"line_number":177,"context_line":"        :returns: (``resp``, ``body``) if authentication was successful."},{"line_number":178,"context_line":"        :raises: AuthorizationFailure if unable to authenticate or validate"},{"line_number":179,"context_line":"                 the existing authorization token"},{"line_number":180,"context_line":"        :raises: ValueError if insufficient parameters are used."}],"source_content_type":"text/x-python","patch_set":21,"id":"AAAAPn%2F%2F4vg%3D","line":177,"updated":"2013-06-18 23:22:43.000000000","message":"also breaks backwards compatibility.","commit_id":"ebff8397bb859039a7310979a80b4150b807e76d"}],"keystoneclient/v2_0/shell.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":32,"context_line":"           \u0027instead of --os-endpoint or OS_SERVICE_ENDPOINT, for example.\u0027)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def wrapped(kc, args):"},{"line_number":35,"context_line":"        if not kc.service_catalog:"},{"line_number":36,"context_line":"            raise Exception(msg)"},{"line_number":37,"context_line":"        return f(kc, args)"},{"line_number":38,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2Uk%3D","line":35,"updated":"2013-06-19 21:07:12.000000000","message":"has_service_catalog() is still there right?","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"}],"keystoneclient/v3/client.py":[{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"4600633772e1b3849e3c8fe4fbc77dd26b38520f","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                 project_domain_name\u003dNone, token\u003dNone):"},{"line_number":139,"context_line":"        headers \u003d {}"},{"line_number":140,"context_line":"        url \u003d auth_url + \"/auth\""},{"line_number":141,"context_line":"        body \u003d {\u0027authentication\u0027: {}, \u0027scope\u0027: {}}"},{"line_number":142,"context_line":"        auth \u003d body[\u0027authentication\u0027]"},{"line_number":143,"context_line":"        scope \u003d body[\u0027scope\u0027]"},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2BkQ8%3D","line":141,"updated":"2013-02-27 05:46:21.000000000","message":"\u0027identity\u0027 now, and it is wrapped in \u0027auth\u0027","commit_id":"26bfe06b1edee7482c98ed4d278ec46db6838d4f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5b6559d70c772421188e340d4f8a1334ead56e8a","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            if user_name:"},{"line_number":157,"context_line":"                auth[\u0027password\u0027][\u0027user\u0027][\u0027name\u0027] \u003d user_name"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"            if user_domain_id or user_domain_name:"},{"line_number":160,"context_line":"                auth[\u0027password\u0027][\u0027user\u0027][\u0027domain\u0027] \u003d {}"},{"line_number":161,"context_line":"            if user_domain_id:"},{"line_number":162,"context_line":"                auth[\u0027password\u0027][\u0027user\u0027][\u0027domain\u0027][\u0027id\u0027] \u003d user_domain_id"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2B7S0%3D","line":159,"updated":"2013-02-14 05:35:26.000000000","message":"No point of setting \"domain\" if user_id is specified. On the other hand, we should error out if user_name is specified and domain information is missing. Or perhaps default to default domain ID?","commit_id":"26bfe06b1edee7482c98ed4d278ec46db6838d4f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"f81f350ee363718d505ac7c4bf9869c6c9331b45","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            if user_name:"},{"line_number":157,"context_line":"                auth[\u0027password\u0027][\u0027user\u0027][\u0027name\u0027] \u003d user_name"},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"            if user_domain_id or user_domain_name:"},{"line_number":160,"context_line":"                auth[\u0027password\u0027][\u0027user\u0027][\u0027domain\u0027] \u003d {}"},{"line_number":161,"context_line":"            if user_domain_id:"},{"line_number":162,"context_line":"                auth[\u0027password\u0027][\u0027user\u0027][\u0027domain\u0027][\u0027id\u0027] \u003d user_domain_id"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2B6zg%3D","line":159,"in_reply_to":"AAAAM3%2F%2B7S0%3D","updated":"2013-02-14 14:59:06.000000000","message":"So, we\u0027re guaranteed a user_domain_id and project_domain_id here -- both will at least be \u0027default\u0027. This allows the user to provide a user name and project name in the single domain case (requiring nothing more than what users provide today -- username, password, project name)","commit_id":"26bfe06b1edee7482c98ed4d278ec46db6838d4f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5b6559d70c772421188e340d4f8a1334ead56e8a","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            if project_name:"},{"line_number":172,"context_line":"                scope[\u0027project\u0027][\u0027name\u0027] \u003d project_name"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"            if project_domain_id or project_domain_name:"},{"line_number":175,"context_line":"                scope[\u0027project\u0027][\u0027domain\u0027] \u003d {}"},{"line_number":176,"context_line":"            if project_domain_id:"},{"line_number":177,"context_line":"                scope[\u0027project\u0027][\u0027domain\u0027][\u0027id\u0027] \u003d project_domain_id"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2B7Ss%3D","line":174,"updated":"2013-02-14 05:35:26.000000000","message":"Same as above.","commit_id":"26bfe06b1edee7482c98ed4d278ec46db6838d4f"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"5b6559d70c772421188e340d4f8a1334ead56e8a","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            if project_domain_id:"},{"line_number":177,"context_line":"                scope[\u0027project\u0027][\u0027domain\u0027][\u0027id\u0027] \u003d project_domain_id"},{"line_number":178,"context_line":"            if project_domain_name:"},{"line_number":179,"context_line":"                scope[\u0027project\u0027][\u0027domain\u0027][\u0027name\u0027] \u003d project_domain_name"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        if not (auth or token):"},{"line_number":182,"context_line":"            raise ValueError(\u0027Authentication method required (e.g. password)\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2B7So%3D","line":179,"updated":"2013-02-14 05:35:26.000000000","message":"I support domain-scoping will come later. btw, I haven\u0027t implemented domain-scoping at the server side yet.","commit_id":"26bfe06b1edee7482c98ed4d278ec46db6838d4f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"bf90029f0627fda073f2ee75cc4a4013abda7482","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            if project_domain_id:"},{"line_number":177,"context_line":"                scope[\u0027project\u0027][\u0027domain\u0027][\u0027id\u0027] \u003d project_domain_id"},{"line_number":178,"context_line":"            if project_domain_name:"},{"line_number":179,"context_line":"                scope[\u0027project\u0027][\u0027domain\u0027][\u0027name\u0027] \u003d project_domain_name"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        if not (auth or token):"},{"line_number":182,"context_line":"            raise ValueError(\u0027Authentication method required (e.g. password)\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2BmGU%3D","line":179,"in_reply_to":"AAAAM3%2F%2B6zU%3D","updated":"2013-02-26 11:50:34.000000000","message":"so we have domain scoping now...so let\u0027s add it if we can...","commit_id":"26bfe06b1edee7482c98ed4d278ec46db6838d4f"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"f81f350ee363718d505ac7c4bf9869c6c9331b45","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            if project_domain_id:"},{"line_number":177,"context_line":"                scope[\u0027project\u0027][\u0027domain\u0027][\u0027id\u0027] \u003d project_domain_id"},{"line_number":178,"context_line":"            if project_domain_name:"},{"line_number":179,"context_line":"                scope[\u0027project\u0027][\u0027domain\u0027][\u0027name\u0027] \u003d project_domain_name"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        if not (auth or token):"},{"line_number":182,"context_line":"            raise ValueError(\u0027Authentication method required (e.g. password)\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAM3%2F%2B6zU%3D","line":179,"in_reply_to":"AAAAM3%2F%2B7So%3D","updated":"2013-02-14 14:59:06.000000000","message":"yeah, i figure solve our existing use case first expanding the scope :)","commit_id":"26bfe06b1edee7482c98ed4d278ec46db6838d4f"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3595003efd284dee27572a1cc22ed7e98a386a05","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                                            token\u003dNone, **kwargs):"},{"line_number":109,"context_line":"        \"\"\" Authenticate against the v3 Identity API."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        :returns: ``raw token`` if authentication was successful."},{"line_number":112,"context_line":"        :raises: AuthorizationFailure if unable to authenticate or validate"},{"line_number":113,"context_line":"                 the existing authorization token"},{"line_number":114,"context_line":"        :raises: ValueError if insufficient parameters are used."}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2F2h4%3D","line":111,"updated":"2013-04-17 18:21:21.000000000","message":"actually returns resp, body from _do_auth.","commit_id":"ca9808113cf3c337186d173a63834f6c49f078dc"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"3595003efd284dee27572a1cc22ed7e98a386a05","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        :returns: ``raw token`` if authentication was successful."},{"line_number":112,"context_line":"        :raises: AuthorizationFailure if unable to authenticate or validate"},{"line_number":113,"context_line":"                 the existing authorization token"},{"line_number":114,"context_line":"        :raises: ValueError if insufficient parameters are used."},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        \"\"\""},{"line_number":117,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2F2h8%3D","line":114,"updated":"2013-04-17 18:21:21.000000000","message":"this function only raises AuthorizationFailure or Unauthorized, not ValueError.","commit_id":"ca9808113cf3c337186d173a63834f6c49f078dc"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"584c825a11ee6af32221a3d94f8d4f8c5d99ae17","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            if user_domain_id:"},{"line_number":164,"context_line":"                ident[\u0027password\u0027][\u0027user\u0027][\u0027domain\u0027][\u0027id\u0027] \u003d user_domain_id"},{"line_number":165,"context_line":"            if user_domain_name:"},{"line_number":166,"context_line":"                ident[\u0027password\u0027][\u0027user\u0027][\u0027domain\u0027][\u0027name\u0027] \u003d user_domain_name"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        if project_id or project_name:"},{"line_number":169,"context_line":"            scope[\u0027project\u0027] \u003d {}"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FbVA%3D","line":166,"updated":"2013-05-09 22:56:44.000000000","message":"If not password provided and token is passed, set the method to token authentication.","commit_id":"ca9808113cf3c337186d173a63834f6c49f078dc"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"7bec93deae56a3bdb035dff7697a598c3c5753eb","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            if project_domain_id:"},{"line_number":179,"context_line":"                scope[\u0027project\u0027][\u0027domain\u0027][\u0027id\u0027] \u003d project_domain_id"},{"line_number":180,"context_line":"            if project_domain_name:"},{"line_number":181,"context_line":"                scope[\u0027project\u0027][\u0027domain\u0027][\u0027name\u0027] \u003d project_domain_name"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        if not (ident or token):"},{"line_number":184,"context_line":"            raise ValueError(\u0027Authentication method required (e.g. password)\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FnC0%3D","line":181,"updated":"2013-05-01 23:01:08.000000000","message":"If there is no project_id or project_name, the scope is set to empty dict.   This throws JSON parsing error from Keystone.","commit_id":"ca9808113cf3c337186d173a63834f6c49f078dc"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"584c825a11ee6af32221a3d94f8d4f8c5d99ae17","unresolved":false,"context_lines":[{"line_number":178,"context_line":"            if project_domain_id:"},{"line_number":179,"context_line":"                scope[\u0027project\u0027][\u0027domain\u0027][\u0027id\u0027] \u003d project_domain_id"},{"line_number":180,"context_line":"            if project_domain_name:"},{"line_number":181,"context_line":"                scope[\u0027project\u0027][\u0027domain\u0027][\u0027name\u0027] \u003d project_domain_name"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        if not (ident or token):"},{"line_number":184,"context_line":"            raise ValueError(\u0027Authentication method required (e.g. password)\u0027)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FbVQ%3D","line":181,"in_reply_to":"AAAAOn%2F%2FnC0%3D","updated":"2013-05-09 22:56:44.000000000","message":"Need to add check if scope is empty, if it is delete it from the body","commit_id":"ca9808113cf3c337186d173a63834f6c49f078dc"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0a66366dbc2837e929d2532c29ab7b57f34f20f1","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                                            password\u003dNone,"},{"line_number":97,"context_line":"                                            project_id\u003dNone, project_name\u003dNone,"},{"line_number":98,"context_line":"                                            project_domain_id\u003dNone,"},{"line_number":99,"context_line":"                                            project_domain_name\u003dNone,"},{"line_number":100,"context_line":"                                            token\u003dNone, **kwargs):"},{"line_number":101,"context_line":"        \"\"\" Authenticate against the v3 Identity API."},{"line_number":102,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPX%2F%2F5ok%3D","line":99,"updated":"2013-06-06 13:38:39.000000000","message":"Shouldn\u0027t we support scoping to a domain here?","commit_id":"efe620d1eac6c4396d443241f7a780b7b51b435a"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0a66366dbc2837e929d2532c29ab7b57f34f20f1","unresolved":false,"context_lines":[{"line_number":176,"context_line":"                scope[\u0027project\u0027][\u0027domain\u0027][\u0027id\u0027] \u003d project_domain_id"},{"line_number":177,"context_line":"            if project_domain_name:"},{"line_number":178,"context_line":"                scope[\u0027project\u0027][\u0027domain\u0027][\u0027name\u0027] \u003d project_domain_name"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"        if not (ident or token):"},{"line_number":181,"context_line":"            raise ValueError(\u0027Authentication method required (e.g. password)\u0027)"},{"line_number":182,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAPX%2F%2F5og%3D","line":179,"updated":"2013-06-06 13:38:39.000000000","message":"should be a similar block for domain_id/domain_name here","commit_id":"efe620d1eac6c4396d443241f7a780b7b51b435a"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"9b0bb77496addbe6aac0db2f28c6d54bdbc4571c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                                    (optional)"},{"line_number":43,"context_line":"    :param string password: Password for authentication. (optional)"},{"line_number":44,"context_line":"    :param string token: Token for authentication. (optional)"},{"line_number":45,"context_line":"    :param string domain_id: Domain ID for domain scoping. (optional)"},{"line_number":46,"context_line":"    :param string domain_name: Domain name for domain scoping. (optional)"},{"line_number":47,"context_line":"    :param string project_id: Project ID for project scoping. (optional)"},{"line_number":48,"context_line":"    :param string project_name: Project name for project scoping. (optional)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPX%2F%2FpFg%3D","line":45,"updated":"2013-06-13 17:15:26.000000000","message":"I don\u0027t think you should remove tenant_name and tenant_id. Leave them there but mark them as deprecated in favor of project_name and project_id.","commit_id":"2e576d28c897f0bf1a12300fca728c18f306ecb4"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"fe3fde346c91f8e5015f4a254f7a00796cd056d7","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                                    (optional)"},{"line_number":43,"context_line":"    :param string password: Password for authentication. (optional)"},{"line_number":44,"context_line":"    :param string token: Token for authentication. (optional)"},{"line_number":45,"context_line":"    :param string domain_id: Domain ID for domain scoping. (optional)"},{"line_number":46,"context_line":"    :param string domain_name: Domain name for domain scoping. (optional)"},{"line_number":47,"context_line":"    :param string project_id: Project ID for project scoping. (optional)"},{"line_number":48,"context_line":"    :param string project_name: Project name for project scoping. (optional)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPX%2F%2FoxE%3D","line":45,"in_reply_to":"AAAAPX%2F%2FpFg%3D","updated":"2013-06-13 18:53:46.000000000","message":"Done","commit_id":"2e576d28c897f0bf1a12300fca728c18f306ecb4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"9b0bb77496addbe6aac0db2f28c6d54bdbc4571c","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    Example::"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        \u003e\u003e\u003e from keystoneclient.v3 import client"},{"line_number":66,"context_line":"        \u003e\u003e\u003e keystone \u003d client.Client(username\u003dUSER,"},{"line_number":67,"context_line":"        ...                          password\u003dPASS,"},{"line_number":68,"context_line":"        ...                          tenant_name\u003dTENANT_NAME,"},{"line_number":69,"context_line":"        ...                          auth_url\u003dKEYSTONE_URL)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPX%2F%2FpFM%3D","line":66,"updated":"2013-06-13 17:15:26.000000000","message":"This example seems bad because I\u0027d think that a username by itself will fail, because it needs a domain to disambiguate. The same applies to tenant_name/project_name.","commit_id":"2e576d28c897f0bf1a12300fca728c18f306ecb4"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"fe3fde346c91f8e5015f4a254f7a00796cd056d7","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    Example::"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"        \u003e\u003e\u003e from keystoneclient.v3 import client"},{"line_number":66,"context_line":"        \u003e\u003e\u003e keystone \u003d client.Client(username\u003dUSER,"},{"line_number":67,"context_line":"        ...                          password\u003dPASS,"},{"line_number":68,"context_line":"        ...                          tenant_name\u003dTENANT_NAME,"},{"line_number":69,"context_line":"        ...                          auth_url\u003dKEYSTONE_URL)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPX%2F%2Foww%3D","line":66,"in_reply_to":"AAAAPX%2F%2FpFM%3D","updated":"2013-06-13 18:53:46.000000000","message":"Done","commit_id":"2e576d28c897f0bf1a12300fca728c18f306ecb4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"9b0bb77496addbe6aac0db2f28c6d54bdbc4571c","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        \u003e\u003e\u003e from keystoneclient.v3 import client"},{"line_number":66,"context_line":"        \u003e\u003e\u003e keystone \u003d client.Client(username\u003dUSER,"},{"line_number":67,"context_line":"        ...                          password\u003dPASS,"},{"line_number":68,"context_line":"        ...                          tenant_name\u003dTENANT_NAME,"},{"line_number":69,"context_line":"        ...                          auth_url\u003dKEYSTONE_URL)"},{"line_number":70,"context_line":"        ..."},{"line_number":71,"context_line":"        \u003e\u003e\u003e keystone.tenants.list()"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPX%2F%2FpFI%3D","line":68,"updated":"2013-06-13 17:15:26.000000000","message":"This should be changed to project_name (and project_domain_name)","commit_id":"2e576d28c897f0bf1a12300fca728c18f306ecb4"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"fe3fde346c91f8e5015f4a254f7a00796cd056d7","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        \u003e\u003e\u003e from keystoneclient.v3 import client"},{"line_number":66,"context_line":"        \u003e\u003e\u003e keystone \u003d client.Client(username\u003dUSER,"},{"line_number":67,"context_line":"        ...                          password\u003dPASS,"},{"line_number":68,"context_line":"        ...                          tenant_name\u003dTENANT_NAME,"},{"line_number":69,"context_line":"        ...                          auth_url\u003dKEYSTONE_URL)"},{"line_number":70,"context_line":"        ..."},{"line_number":71,"context_line":"        \u003e\u003e\u003e keystone.tenants.list()"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPX%2F%2Fows%3D","line":68,"in_reply_to":"AAAAPX%2F%2FpFI%3D","updated":"2013-06-13 18:53:46.000000000","message":"Done","commit_id":"2e576d28c897f0bf1a12300fca728c18f306ecb4"},{"author":{"_account_id":6486,"name":"Brant Knudson","email":"blk@acm.org","username":"blk-u"},"change_message_id":"9b0bb77496addbe6aac0db2f28c6d54bdbc4571c","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        ...                          tenant_name\u003dTENANT_NAME,"},{"line_number":69,"context_line":"        ...                          auth_url\u003dKEYSTONE_URL)"},{"line_number":70,"context_line":"        ..."},{"line_number":71,"context_line":"        \u003e\u003e\u003e keystone.tenants.list()"},{"line_number":72,"context_line":"        ..."},{"line_number":73,"context_line":"        \u003e\u003e\u003e user \u003d keystone.users.get(USER_ID)"},{"line_number":74,"context_line":"        \u003e\u003e\u003e user.delete()"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPX%2F%2FpFU%3D","line":71,"updated":"2013-06-13 17:15:26.000000000","message":"The example shouldn\u0027t say to use tenants, so change to projects.","commit_id":"2e576d28c897f0bf1a12300fca728c18f306ecb4"},{"author":{"_account_id":1941,"name":"Lin Hua Cheng","email":"os.lcheng@gmail.com","username":"lin-hua-cheng"},"change_message_id":"fe3fde346c91f8e5015f4a254f7a00796cd056d7","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        ...                          tenant_name\u003dTENANT_NAME,"},{"line_number":69,"context_line":"        ...                          auth_url\u003dKEYSTONE_URL)"},{"line_number":70,"context_line":"        ..."},{"line_number":71,"context_line":"        \u003e\u003e\u003e keystone.tenants.list()"},{"line_number":72,"context_line":"        ..."},{"line_number":73,"context_line":"        \u003e\u003e\u003e user \u003d keystone.users.get(USER_ID)"},{"line_number":74,"context_line":"        \u003e\u003e\u003e user.delete()"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAAPX%2F%2FowI%3D","line":71,"in_reply_to":"AAAAPX%2F%2FpFU%3D","updated":"2013-06-13 18:53:46.000000000","message":"Done","commit_id":"2e576d28c897f0bf1a12300fca728c18f306ecb4"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"55b68575572198a9c22a461e44168877eedefab9","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        \"\"\" Initialize a new client for the Keystone v3 API. \"\"\""},{"line_number":88,"context_line":"        super(Client, self).__init__(**kwargs)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        self.version \u003d \u0027v3\u0027"},{"line_number":91,"context_line":"        self.credentials \u003d credentials.CredentialManager(self)"},{"line_number":92,"context_line":"        self.endpoints \u003d endpoints.EndpointManager(self)"},{"line_number":93,"context_line":"        self.domains \u003d domains.DomainManager(self)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAAPn%2F%2F2Uc%3D","line":90,"updated":"2013-06-19 21:07:12.000000000","message":"\u0027v3.0\u0027?","commit_id":"0a540ec34c3ac4ac958556d51e5307071a4db717"}],"tests/v2_0/test_service_catalog.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"bcdf65566b7a65cb88340715155af9fbb21fe5ad","unresolved":false,"context_lines":[{"line_number":7,"context_line":"class ServiceCatalogTest(utils.TestCase):"},{"line_number":8,"context_line":"    def setUp(self):"},{"line_number":9,"context_line":"        super(ServiceCatalogTest, self).setUp()"},{"line_number":10,"context_line":"        self.SERVICE_CATALOG \u003d {"},{"line_number":11,"context_line":"            \"access\": {"},{"line_number":12,"context_line":"                \"token\": {"},{"line_number":13,"context_line":"                    \"id\": \"ab48a9efdfedb23ty3494\","}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPX%2F%2F3CY%3D","line":10,"updated":"2013-06-07 09:55:07.000000000","message":"Might it be better if we added this to the client fixtures.  Also, it isn\u0027t really a service catalog, it is an auth response...","commit_id":"cd2b38af4f4fedc2991133e52705e3e0a35a01c7"}],"tests/v3/test_service_catalog.py":[{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"bcdf65566b7a65cb88340715155af9fbb21fe5ad","unresolved":false,"context_lines":[{"line_number":7,"context_line":"class ServiceCatalogTest(utils.TestCase):"},{"line_number":8,"context_line":"    def setUp(self):"},{"line_number":9,"context_line":"        super(ServiceCatalogTest, self).setUp()"},{"line_number":10,"context_line":"        self.SERVICE_CATALOG \u003d {"},{"line_number":11,"context_line":"            \"token\": {"},{"line_number":12,"context_line":"                \"methods\": ["},{"line_number":13,"context_line":"                    \"password\""}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAAPX%2F%2F3CU%3D","line":10,"updated":"2013-06-07 09:55:07.000000000","message":"(same comment as v2 version): Might it be better if we added this to the client fixtures.  Also, it isn\u0027t really a service catalog, it is an auth response...","commit_id":"cd2b38af4f4fedc2991133e52705e3e0a35a01c7"}]}
