)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"d3ef53be94fe0c84dd1ec7b7ce1adaa7f476d05b","unresolved":false,"context_lines":[{"line_number":13,"context_line":"This maintainis no changes to the command options or environment variables."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"The next steps will include reworking the other API client interfaces to"},{"line_number":16,"context_line":"fully utilize the single auth session."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Change-Id: I47ec63291e4c3cf36c8061299a4764f60b36ab89"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"fa98f980_19b3b6e9","line":16,"updated":"2014-09-05 06:28:13.000000000","message":"s/single/one true","commit_id":"686a3791439b809bd4000b4a4c6d78406006dbc5"}],"openstackclient/common/clientmanager.py":[{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"934f5ac2c9234d8c80d11ab91059feecfacf81bc","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            self._service_catalog \u003d self.identity.service_catalog"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        # Grab the existing auth\u0027ed session"},{"line_number":91,"context_line":"        self.api_session \u003d self.identity.session"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        return"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_37a7ddbd","line":91,"updated":"2014-07-25 03:37:26.000000000","message":"Can we not pull it out like that. \n\nWhat this means is that you\u0027ll end up with the dumb circular hack we do for backwards compatibility in ksc where the client is it\u0027s own session plugin. \n\nIt\u0027d be much better to construct the session with the actual auth plugins. \n\nI think the identity_client might have to be a special case and be constructed based on a provided session rather than dynamically by the descriptor.\n\nIf you construct the client with a session object it doesn\u0027t trigger authentication so it should be cheap.","commit_id":"65e8de9e402b455e428650b406bd6ff833d5ecfb"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"9e5a5095c64a59165733687f0e8af3b25efc4353","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            self._service_catalog \u003d self.identity.service_catalog"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        # Grab the existing auth\u0027ed session"},{"line_number":91,"context_line":"        self.api_session \u003d self.identity.session"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        return"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_5d2a60e7","line":91,"in_reply_to":"baada198_37a7ddbd","updated":"2014-08-04 21:26:14.000000000","message":"Agreed that this is sub-optimal.  I\u0027ve tried a couple of times to create the session first and pass it in but doing it without major changes to identity/client.py doesn\u0027t seem to be possible.\n\nPart of the problem is the version discovery happens too late as I need to know which auth plugin to create (v2 vs v3).\n\nI am ready to throw it all out again...this is too f\u0027ing complicated...\n\nThis is the order I think we should be doing things:\n\n* create no-auth session\n* version discovery/validation\n* authentication\n* add auth to session?\n* build client(s)","commit_id":"65e8de9e402b455e428650b406bd6ff833d5ecfb"},{"author":{"_account_id":8736,"name":"Terry Howe","email":"terrylhowe@gmail.com","username":"terrylhowe"},"change_message_id":"9416a3a2312355fc9dcf0788392926fa03f8d0f8","unresolved":false,"context_lines":[{"line_number":88,"context_line":"            self._service_catalog \u003d self.identity.service_catalog"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"        # Grab the existing auth\u0027ed session"},{"line_number":91,"context_line":"        self.api_session \u003d self.identity.session"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"        return"},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"baada198_03e2ad9b","line":91,"in_reply_to":"baada198_5d2a60e7","updated":"2014-08-08 14:34:14.000000000","message":"I don\u0027t completely understand the right way to build these objects either, what I did in the SDK is wrong:\n\nhttps://review.openstack.org/#/c/104948/7/openstack/auth/identity/authenticator.py","commit_id":"65e8de9e402b455e428650b406bd6ff833d5ecfb"},{"author":{"_account_id":8736,"name":"Terry Howe","email":"terrylhowe@gmail.com","username":"terrylhowe"},"change_message_id":"d4219be0f72372abf1fa94ccb8e37af8696b7aa9","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            }"},{"line_number":108,"context_line":"        else:"},{"line_number":109,"context_line":"            LOG.debug(\u0027Using password auth\u0027)"},{"line_number":110,"context_line":"            # Set up password auth plugin"},{"line_number":111,"context_line":"            self.auth_plugin_name \u003d ver_prefix + \u0027password\u0027"},{"line_number":112,"context_line":"            self.auth_params \u003d {"},{"line_number":113,"context_line":"                \u0027auth_url\u0027: auth_url,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1abeadc6_706e04cb","line":110,"updated":"2014-08-26 18:43:34.000000000","message":"you reference this change in the auth plugin review, but it sure seems like it would be easier to skip all this code and wait for the auth plugin rather than all this temp code.","commit_id":"5803665c5f2153ccf74fc52e159299e2a1e5afaf"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0b42cd1610371fdc2d8ebf4158873dc58307ecb2","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            }"},{"line_number":108,"context_line":"        else:"},{"line_number":109,"context_line":"            LOG.debug(\u0027Using password auth\u0027)"},{"line_number":110,"context_line":"            # Set up password auth plugin"},{"line_number":111,"context_line":"            self.auth_plugin_name \u003d ver_prefix + \u0027password\u0027"},{"line_number":112,"context_line":"            self.auth_params \u003d {"},{"line_number":113,"context_line":"                \u0027auth_url\u0027: auth_url,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_dbb30de7","line":110,"in_reply_to":"1abeadc6_706e04cb","updated":"2014-09-04 05:35:43.000000000","message":"So the keystoneclient plugins are sort of being used, but in a really weird way. I say sort of, because i\u0027m pretty sure what you\u0027re doing at lines 136 and 137 just load the actual plugin... \n\nI think it would be more intuitive to future contributors if you called out the auth plugin specifically:\n\nkind of like:\n\n  from keystoneclient.auth.identity import v3\n  from keystoneclient.auth.identity import v2\n\n  auth \u003d v3.Password(auth_url, username, password, project_id, domain, blah)\n\n\nor\n\n  auth \u003d v3.Token(auth_url and token)\n\nor \n\n  auth \u003d v2.Token(auth_url and token)\n\nor \n\n  auth \u003d v2.Password(auth_url, username, password, trust, project, user_id, blah)\n\nthen...\n\n  sess \u003d session.Session(auth\u003dauth, verify\u003dverify)","commit_id":"5803665c5f2153ccf74fc52e159299e2a1e5afaf"},{"author":{"_account_id":8736,"name":"Terry Howe","email":"terrylhowe@gmail.com","username":"terrylhowe"},"change_message_id":"ada358b664d17e21c7ee4f5773bdcf8a3f2b4dad","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            }"},{"line_number":108,"context_line":"        else:"},{"line_number":109,"context_line":"            LOG.debug(\u0027Using password auth\u0027)"},{"line_number":110,"context_line":"            # Set up password auth plugin"},{"line_number":111,"context_line":"            self.auth_plugin_name \u003d ver_prefix + \u0027password\u0027"},{"line_number":112,"context_line":"            self.auth_params \u003d {"},{"line_number":113,"context_line":"                \u0027auth_url\u0027: auth_url,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_a210d159","line":110,"in_reply_to":"fa98f980_5b8e3dd1","updated":"2014-09-04 10:44:53.000000000","message":"I don\u0027t like the ksc auth plugins much.  They leave it to the user to figure out what kind of plugin to build based on what you have (i.e Token or Password) and they also leave any reauth up to the user (i.e. if you start Token, you\u0027d have to build a Password to reauth).\n\nAlso, the mechanism for figuring out what options to pass the plugin is kind of at an odd level of detail for a plugin.","commit_id":"5803665c5f2153ccf74fc52e159299e2a1e5afaf"},{"author":{"_account_id":8736,"name":"Terry Howe","email":"terrylhowe@gmail.com","username":"terrylhowe"},"change_message_id":"628f494091c499f1e0d7b8abda0eca981452087d","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            }"},{"line_number":108,"context_line":"        else:"},{"line_number":109,"context_line":"            LOG.debug(\u0027Using password auth\u0027)"},{"line_number":110,"context_line":"            # Set up password auth plugin"},{"line_number":111,"context_line":"            self.auth_plugin_name \u003d ver_prefix + \u0027password\u0027"},{"line_number":112,"context_line":"            self.auth_params \u003d {"},{"line_number":113,"context_line":"                \u0027auth_url\u0027: auth_url,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_2b574b59","line":110,"in_reply_to":"fa98f980_a210d159","updated":"2014-09-04 20:58:21.000000000","message":"That came off stronger than I intended.  I woke up way to early this morning.  I\u0027ve been working on the plugins for the SDK and I just had some \u0027wouldn\u0027t it be great if\u0027 kind of thoughts.","commit_id":"5803665c5f2153ccf74fc52e159299e2a1e5afaf"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"0f19565c2a78ce591d67f01d5670d068920918d2","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            }"},{"line_number":108,"context_line":"        else:"},{"line_number":109,"context_line":"            LOG.debug(\u0027Using password auth\u0027)"},{"line_number":110,"context_line":"            # Set up password auth plugin"},{"line_number":111,"context_line":"            self.auth_plugin_name \u003d ver_prefix + \u0027password\u0027"},{"line_number":112,"context_line":"            self.auth_params \u003d {"},{"line_number":113,"context_line":"                \u0027auth_url\u0027: auth_url,"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_5b8e3dd1","line":110,"in_reply_to":"fa98f980_dbb30de7","updated":"2014-09-04 05:59:53.000000000","message":"It looked good when I wrote it? ;) \n\nThis is the crux of the problems with this review and I appreciate suggestions on how to get from here to full ksc session/auth a step at a time.  You\u0027re right, this should be simpler, at least for now.","commit_id":"5803665c5f2153ccf74fc52e159299e2a1e5afaf"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0b42cd1610371fdc2d8ebf4158873dc58307ecb2","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                    \u0027project_domain_name\u0027: project_domain_name,"},{"line_number":133,"context_line":"                })"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        # may not need to save auth_plugin?"},{"line_number":136,"context_line":"        self.auth_plugin \u003d base.get_plugin_class(self.auth_plugin_name)"},{"line_number":137,"context_line":"        self.auth \u003d self.auth_plugin.load_from_options(**self.auth_params)"},{"line_number":138,"context_line":"        self.session \u003d session.Session("}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_fb96114b","line":135,"updated":"2014-09-04 05:35:43.000000000","message":"i don\u0027t think you need to save the plugin, you can easily access it from session i believe","commit_id":"5803665c5f2153ccf74fc52e159299e2a1e5afaf"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"0f19565c2a78ce591d67f01d5670d068920918d2","unresolved":false,"context_lines":[{"line_number":132,"context_line":"                    \u0027project_domain_name\u0027: project_domain_name,"},{"line_number":133,"context_line":"                })"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"        # may not need to save auth_plugin?"},{"line_number":136,"context_line":"        self.auth_plugin \u003d base.get_plugin_class(self.auth_plugin_name)"},{"line_number":137,"context_line":"        self.auth \u003d self.auth_plugin.load_from_options(**self.auth_params)"},{"line_number":138,"context_line":"        self.session \u003d session.Session("}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_7b14e19f","line":135,"in_reply_to":"fa98f980_fb96114b","updated":"2014-09-04 05:59:53.000000000","message":"OK, I wasn\u0027t sure.","commit_id":"5803665c5f2153ccf74fc52e159299e2a1e5afaf"}],"openstackclient/identity/client.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"f8eabe7a0986bd05226fb86afbb9ef9d405b029b","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        API_VERSIONS)"},{"line_number":45,"context_line":"    LOG.debug(\u0027Instantiating identity client: %s\u0027, identity_client)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    # TODO(dtroyer): Something doesn\u0027t like the session.auth when using"},{"line_number":48,"context_line":"    #                token auth, chase that down."},{"line_number":49,"context_line":"    if instance._url:"},{"line_number":50,"context_line":"        LOG.debug(\u0027Using token auth\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_51526735","line":47,"updated":"2014-09-05 15:04:54.000000000","message":"was this related to the devstack failures we saw in the last patch? can you elaborate on this a bit more in the comments as to what happened, and what the workaround is.","commit_id":"686a3791439b809bd4000b4a4c6d78406006dbc5"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"32434b25cffdb61131e1437e16549a5e449bac5b","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        API_VERSIONS)"},{"line_number":45,"context_line":"    LOG.debug(\u0027Instantiating identity client: %s\u0027, identity_client)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    # TODO(dtroyer): Something doesn\u0027t like the session.auth when using"},{"line_number":48,"context_line":"    #                token auth, chase that down."},{"line_number":49,"context_line":"    if instance._url:"},{"line_number":50,"context_line":"        LOG.debug(\u0027Using token auth\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_ecdf0067","line":47,"in_reply_to":"fa98f980_51526735","updated":"2014-09-05 15:17:24.000000000","message":"The \u0027if\u0027 block below is the workaround.  I\u0027m going to rev this later anyway so will have a better description if not an actual fix then.","commit_id":"686a3791439b809bd4000b4a4c6d78406006dbc5"}],"openstackclient/identity/v2_0/token.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0b42cd1610371fdc2d8ebf4158873dc58307ecb2","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def take_action(self, parsed_args):"},{"line_number":35,"context_line":"        self.log.debug(\u0027take_action(%s)\u0027, parsed_args)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        token \u003d self.app.client_manager.auth_ref.service_catalog.get_token()"},{"line_number":38,"context_line":"        token[\u0027project_id\u0027] \u003d token.pop(\u0027tenant_id\u0027)"},{"line_number":39,"context_line":"        return zip(*sorted(six.iteritems(token)))"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_5b155de3","line":37,"updated":"2014-09-04 05:35:43.000000000","message":"nice","commit_id":"5803665c5f2153ccf74fc52e159299e2a1e5afaf"},{"author":{"_account_id":7191,"name":"Jamie Lennox","email":"jamielennox@gmail.com","username":"jamielennox"},"change_message_id":"8fe99fbe2612387770f16fae445d17ffc09ebda7","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def take_action(self, parsed_args):"},{"line_number":35,"context_line":"        self.log.debug(\u0027take_action(%s)\u0027, parsed_args)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        token \u003d self.app.client_manager.auth_ref.service_catalog.get_token()"},{"line_number":38,"context_line":"        token[\u0027project_id\u0027] \u003d token.pop(\u0027tenant_id\u0027)"},{"line_number":39,"context_line":"        return zip(*sorted(six.iteritems(token)))"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_99fde6b3","line":37,"updated":"2014-09-05 06:27:22.000000000","message":"can also call session.get_token()","commit_id":"686a3791439b809bd4000b4a4c6d78406006dbc5"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"44b1597136e3510ce9d102fdf3f9e7222b599ceb","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def take_action(self, parsed_args):"},{"line_number":35,"context_line":"        self.log.debug(\u0027take_action(%s)\u0027, parsed_args)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        token \u003d self.app.client_manager.auth_ref.service_catalog.get_token()"},{"line_number":38,"context_line":"        token[\u0027project_id\u0027] \u003d token.pop(\u0027tenant_id\u0027)"},{"line_number":39,"context_line":"        return zip(*sorted(six.iteritems(token)))"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_20d056c8","line":37,"in_reply_to":"fa98f980_6cd31060","updated":"2014-09-12 20:55:37.000000000","message":"except that session.get_token() returns a single string where auth_ref.service_catalog.get_token() returns a dict that also helpfully includes user_id and project_id.","commit_id":"686a3791439b809bd4000b4a4c6d78406006dbc5"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"32434b25cffdb61131e1437e16549a5e449bac5b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    def take_action(self, parsed_args):"},{"line_number":35,"context_line":"        self.log.debug(\u0027take_action(%s)\u0027, parsed_args)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"        token \u003d self.app.client_manager.auth_ref.service_catalog.get_token()"},{"line_number":38,"context_line":"        token[\u0027project_id\u0027] \u003d token.pop(\u0027tenant_id\u0027)"},{"line_number":39,"context_line":"        return zip(*sorted(six.iteritems(token)))"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"fa98f980_6cd31060","line":37,"in_reply_to":"fa98f980_99fde6b3","updated":"2014-09-05 15:17:24.000000000","message":"now see, that\u0027s just too easy...","commit_id":"686a3791439b809bd4000b4a4c6d78406006dbc5"}],"openstackclient/object/v1/lib/container.py":[{"author":{"_account_id":8736,"name":"Terry Howe","email":"terrylhowe@gmail.com","username":"terrylhowe"},"change_message_id":"d4219be0f72372abf1fa94ccb8e37af8696b7aa9","unresolved":false,"context_lines":[{"line_number":72,"context_line":"):"},{"line_number":73,"context_line":"    \"\"\"Get containers in an account"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    :param session: an authenticated keystoneclient.session.Session object"},{"line_number":76,"context_line":"    :param url: endpoint"},{"line_number":77,"context_line":"    :param marker: marker query"},{"line_number":78,"context_line":"    :param limit: limit query"}],"source_content_type":"text/x-python","patch_set":4,"id":"1abeadc6_900c803d","line":75,"updated":"2014-08-26 18:43:34.000000000","message":"Seems like it would be better to be less specific about what this session is.  It is a session, it provides some session services.  This is relying on the keystoneclient.","commit_id":"5803665c5f2153ccf74fc52e159299e2a1e5afaf"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0b42cd1610371fdc2d8ebf4158873dc58307ecb2","unresolved":false,"context_lines":[{"line_number":72,"context_line":"):"},{"line_number":73,"context_line":"    \"\"\"Get containers in an account"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    :param session: an authenticated keystoneclient.session.Session object"},{"line_number":76,"context_line":"    :param url: endpoint"},{"line_number":77,"context_line":"    :param marker: marker query"},{"line_number":78,"context_line":"    :param limit: limit query"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa98f980_3b18991d","line":75,"in_reply_to":"1abeadc6_900c803d","updated":"2014-09-04 05:35:43.000000000","message":"kinda sorta agree","commit_id":"5803665c5f2153ccf74fc52e159299e2a1e5afaf"}],"openstackclient/object/v1/lib/object.py":[{"author":{"_account_id":8736,"name":"Terry Howe","email":"terrylhowe@gmail.com","username":"terrylhowe"},"change_message_id":"d4219be0f72372abf1fa94ccb8e37af8696b7aa9","unresolved":false,"context_lines":[{"line_number":32,"context_line":"):"},{"line_number":33,"context_line":"    \"\"\"Create an object, upload it to a container"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    :param session: an authenticated keystoneclient.session.Session object"},{"line_number":36,"context_line":"    :param url: endpoint"},{"line_number":37,"context_line":"    :param container: name of container to store object"},{"line_number":38,"context_line":"    :param object: local path to object"}],"source_content_type":"text/x-python","patch_set":4,"id":"1abeadc6_f01cd46c","line":35,"updated":"2014-08-26 18:43:34.000000000","message":"Again, it is just a session object","commit_id":"5803665c5f2153ccf74fc52e159299e2a1e5afaf"}]}
