)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1923,"name":"Mohammad Banikazemi","email":"mbanikazemi@gmail.com","username":"mb-s"},"change_message_id":"9495c0e4ee2ff5091a1ac3af3b5f391d28498014","unresolved":false,"context_lines":[{"line_number":12,"context_line":"3. Using keystoneclient to authenticate will also let"},{"line_number":13,"context_line":"   keystoneclient to log credentials. Hashing credentials"},{"line_number":14,"context_line":"   in keystoneclient log will be fixed in Bug: 1004114."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: Ib6151335cf0db7b4bd5546e81f56b6a20ef68bfd"},{"line_number":17,"context_line":"Closes-Bug: 1327019"},{"line_number":18,"context_line":"Co-authored-by: Xu Han Peng \u003cxuhanp@cn.ibm.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"baada198_4f05dcc0","line":15,"updated":"2014-07-10 12:23:39.000000000","message":"Please add DocImpact","commit_id":"a7bbb0a82dcb2e3e41b69b59adbc1b45e4add031"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"c5dd0c46c41250a8ca5a32af5ba3a4683df5ecfb","unresolved":false,"context_lines":[{"line_number":12,"context_line":"3. Using keystoneclient to authenticate will also let"},{"line_number":13,"context_line":"   keystoneclient to log credentials. Hashing credentials"},{"line_number":14,"context_line":"   in keystoneclient log will be fixed in Bug: 1004114."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Change-Id: Ib6151335cf0db7b4bd5546e81f56b6a20ef68bfd"},{"line_number":17,"context_line":"Closes-Bug: 1327019"},{"line_number":18,"context_line":"Co-authored-by: Xu Han Peng \u003cxuhanp@cn.ibm.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"baada198_e444f175","line":15,"in_reply_to":"baada198_4f05dcc0","updated":"2014-07-11 05:26:54.000000000","message":"Done","commit_id":"a7bbb0a82dcb2e3e41b69b59adbc1b45e4add031"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4056d9c91b3d458521c541c2a7bd3c146511bc48","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Make neutronclient authenticate using keystoneclient"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"1. Delete user_id in command arguments."},{"line_number":10,"context_line":"2. Using keystoneclient to authenticate instead of using"},{"line_number":11,"context_line":"   REST API request directly."},{"line_number":12,"context_line":"3. Using keystoneclient to authenticate will also let"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"1abeadc6_e6b87077","line":9,"updated":"2014-08-27 17:45:57.000000000","message":"Could you add the more specific reason we need to delete user_id? I guess keystoneclient no longer supports user_id. Keystone either?","commit_id":"6d79a53349d2eaae79e73ae73fa2b4bee3275e55"}],"neutronclient/client.py":[{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"84b65b45dfe607ff1855ad5c31e5a9fbc89c7ca7","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                               tenant_name\u003dkwargs.get(\u0027tenant_name\u0027),"},{"line_number":176,"context_line":"                               auth_url\u003dkwargs.get(\u0027auth_url\u0027),"},{"line_number":177,"context_line":"                               cacert\u003dkwargs.get(\u0027cacert\u0027),"},{"line_number":178,"context_line":"                               insecure\u003dkwargs.get(\u0027insecure\u0027))"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def _authenticate_keystone(self):"},{"line_number":181,"context_line":"        _ksclient \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_2d32d70f","line":178,"updated":"2014-07-22 06:51:58.000000000","message":"Rather than listing all the args explicitly, how about just passing them all through?\n\n  return ksclient.Client(**kwargs)","commit_id":"6d79a53349d2eaae79e73ae73fa2b4bee3275e55"},{"author":{"_account_id":8124,"name":"cbrandily","email":"zzelle@gmail.com","username":"cbrandily"},"change_message_id":"2987ccd081b3508de3999c1ab7e6dd5a1068b80d","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                               tenant_name\u003dkwargs.get(\u0027tenant_name\u0027),"},{"line_number":176,"context_line":"                               auth_url\u003dkwargs.get(\u0027auth_url\u0027),"},{"line_number":177,"context_line":"                               cacert\u003dkwargs.get(\u0027cacert\u0027),"},{"line_number":178,"context_line":"                               insecure\u003dkwargs.get(\u0027insecure\u0027))"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def _authenticate_keystone(self):"},{"line_number":181,"context_line":"        _ksclient \u003d None"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_647d1e1e","line":178,"in_reply_to":"baada198_2d32d70f","updated":"2014-07-25 08:18:17.000000000","message":"+1, it will also allow _get_ksclient users to provide if needed new attributes without changing _get_ksclient implementation.","commit_id":"6d79a53349d2eaae79e73ae73fa2b4bee3275e55"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"84b65b45dfe607ff1855ad5c31e5a9fbc89c7ca7","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                               insecure\u003dkwargs.get(\u0027insecure\u0027))"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"    def _authenticate_keystone(self):"},{"line_number":181,"context_line":"        _ksclient \u003d None"},{"line_number":182,"context_line":"        kwargs \u003d {"},{"line_number":183,"context_line":"            \u0027username\u0027: self.username,"},{"line_number":184,"context_line":"            \u0027password\u0027: self.password,"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_58d42746","line":181,"updated":"2014-07-22 06:51:58.000000000","message":"Don\u0027t use a leading underscore here - just pick some other name (\"client\" perhaps)","commit_id":"6d79a53349d2eaae79e73ae73fa2b4bee3275e55"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"84b65b45dfe607ff1855ad5c31e5a9fbc89c7ca7","unresolved":false,"context_lines":[{"line_number":191,"context_line":"            \u0027insecure\u0027: self.insecure,"},{"line_number":192,"context_line":"            \u0027region_name\u0027: self.region_name,"},{"line_number":193,"context_line":"        }"},{"line_number":194,"context_line":"        if not self.auth_token:"},{"line_number":195,"context_line":"            _ksclient \u003d self._get_ksclient(**kwargs)"},{"line_number":196,"context_line":"            self.auth_token \u003d _ksclient.auth_token"},{"line_number":197,"context_line":"            self.auth_tenant_id \u003d _ksclient.auth_tenant_id"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_d3cc9863","line":194,"updated":"2014-07-22 06:51:58.000000000","message":"I think getting the client (and re-authenticating, etc) is the only expensive part below(*) - so you may as well just combine these two cases:\n\n if not self.auth_token or not self.endpoint_url:\n   # client \u003d _get_ksclient(**kwargs)\n   # always refresh self.auth_token, self.endpoint_url, etc.\n\n(*) In particular, if I understand the API and keystone client code correctly, the service catalog is pulled down as part of authentication (ie: when creating the ksclient.Client() object).  So client.service_catalog.url_for() is almost free.","commit_id":"6d79a53349d2eaae79e73ae73fa2b4bee3275e55"},{"author":{"_account_id":11279,"name":"Angus Lees","email":"gus@inodes.org","username":"gus"},"change_message_id":"84b65b45dfe607ff1855ad5c31e5a9fbc89c7ca7","unresolved":false,"context_lines":[{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def _get_endpoint_url(self, client, **kwargs):"},{"line_number":205,"context_line":"        \"\"\"Get an endpoint using the provided keystone client.\"\"\""},{"line_number":206,"context_line":"        endpoint_kwargs \u003d {"},{"line_number":207,"context_line":"            \u0027service_type\u0027: kwargs.get(\u0027service_type\u0027) or \u0027image\u0027,"},{"line_number":208,"context_line":"            \u0027endpoint_type\u0027: kwargs.get(\u0027endpoint_type\u0027) or \u0027publicURL\u0027,"},{"line_number":209,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_a5dd1b72","line":206,"updated":"2014-07-22 06:51:58.000000000","message":"These should all be regular keyword arguments to your function:\n\n def _get_endpoint_url(self, client, service_type\u003d\u0027image\u0027, endpoint_type\u003d\u0027publicURL\u0027, region_name\u003dNone):\n\n attr \u003d None\n if region_name is not None:\n   attr \u003d \u0027region\u0027\n\n return client.service_catalog.url_for(\n    service_type\u003dservice_type, endpoint_type\u003dendpoint_type,\n    attr\u003dattr, filter_value\u003dregion_name)","commit_id":"6d79a53349d2eaae79e73ae73fa2b4bee3275e55"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4056d9c91b3d458521c541c2a7bd3c146511bc48","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def _get_endpoint_url(self, client, **kwargs):"},{"line_number":205,"context_line":"        \"\"\"Get an endpoint using the provided keystone client.\"\"\""},{"line_number":206,"context_line":"        endpoint_kwargs \u003d {"},{"line_number":207,"context_line":"            \u0027service_type\u0027: kwargs.get(\u0027service_type\u0027) or \u0027image\u0027,"},{"line_number":208,"context_line":"            \u0027endpoint_type\u0027: kwargs.get(\u0027endpoint_type\u0027) or \u0027publicURL\u0027,"},{"line_number":209,"context_line":"        }"},{"line_number":210,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"1abeadc6_c6ce142d","line":207,"updated":"2014-08-27 17:45:57.000000000","message":"Why does \"service_type\" default to \"image\"? \"network\"?\n\nIn addition, the usual code is:\n\n  kwargs.get(\u0027service_type\u0027, \u0027network\u0027)","commit_id":"6d79a53349d2eaae79e73ae73fa2b4bee3275e55"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"4056d9c91b3d458521c541c2a7bd3c146511bc48","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        \"\"\"Get an endpoint using the provided keystone client.\"\"\""},{"line_number":206,"context_line":"        endpoint_kwargs \u003d {"},{"line_number":207,"context_line":"            \u0027service_type\u0027: kwargs.get(\u0027service_type\u0027) or \u0027image\u0027,"},{"line_number":208,"context_line":"            \u0027endpoint_type\u0027: kwargs.get(\u0027endpoint_type\u0027) or \u0027publicURL\u0027,"},{"line_number":209,"context_line":"        }"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"        if kwargs.get(\u0027region_name\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1abeadc6_86efbc86","line":208,"updated":"2014-08-27 17:45:57.000000000","message":"Same as the above.","commit_id":"6d79a53349d2eaae79e73ae73fa2b4bee3275e55"}],"neutronclient/shell.py":[{"author":{"_account_id":1923,"name":"Mohammad Banikazemi","email":"mbanikazemi@gmail.com","username":"mb-s"},"change_message_id":"9495c0e4ee2ff5091a1ac3af3b5f391d28498014","unresolved":false,"context_lines":[{"line_number":593,"context_line":""},{"line_number":594,"context_line":"            else:"},{"line_number":595,"context_line":"                # Validate password flow auth"},{"line_number":596,"context_line":"                if not self.options.os_username:"},{"line_number":597,"context_line":"                    raise exc.CommandError("},{"line_number":598,"context_line":"                        _(\"You must provide a username via\""},{"line_number":599,"context_line":"                          \"  --os-username, env[OS_USERNAME]\"))"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_afcd98b9","line":596,"updated":"2014-07-10 12:23:39.000000000","message":"Why is it that using user id is not acceptable anymore?","commit_id":"a7bbb0a82dcb2e3e41b69b59adbc1b45e4add031"},{"author":{"_account_id":7183,"name":"Xu Han Peng","email":"xuhanp@linux.vnet.ibm.com","username":"xuhanp"},"change_message_id":"c5dd0c46c41250a8ca5a32af5ba3a4683df5ecfb","unresolved":false,"context_lines":[{"line_number":593,"context_line":""},{"line_number":594,"context_line":"            else:"},{"line_number":595,"context_line":"                # Validate password flow auth"},{"line_number":596,"context_line":"                if not self.options.os_username:"},{"line_number":597,"context_line":"                    raise exc.CommandError("},{"line_number":598,"context_line":"                        _(\"You must provide a username via\""},{"line_number":599,"context_line":"                          \"  --os-username, env[OS_USERNAME]\"))"}],"source_content_type":"text/x-python","patch_set":2,"id":"baada198_4472fde3","line":596,"in_reply_to":"baada198_afcd98b9","updated":"2014-07-11 05:26:54.000000000","message":"Mohammad, keystone client doesn\u0027t have user_id as the input parameter. \n\nhttps://github.com/openstack/python-keystoneclient/blob/master/keystoneclient/v2_0/client.py#L34","commit_id":"a7bbb0a82dcb2e3e41b69b59adbc1b45e4add031"}]}
