)]}'
{"doc/source/cli/command-objects/application-credentials.rst":[{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"b33be1baeb246756e786deee695729667dc9aba3","unresolved":false,"context_lines":[{"line_number":57,"context_line":".. code:: bash"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    openstack application credential delete"},{"line_number":60,"context_line":"        \u003capplication_credential\u003e [\u003capplication_credential\u003e ...]"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":".. describe:: \u003capplication_credential\u003e"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"5f93b717_f41b7070","line":60,"updated":"2018-01-25 03:15:37.000000000","message":"Dashes in user-visible places like this, always dashes not underscores.","commit_id":"8e0474205233914c2cba882e7d787405a8a77d6a"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"47e84944b307e0cf9f1bbe60b8aa0229d8acb223","unresolved":false,"context_lines":[{"line_number":21,"context_line":"        [--role \u003crole\u003e]"},{"line_number":22,"context_line":"        [--expiration \u003cexpiration\u003e]"},{"line_number":23,"context_line":"        [--description \u003cdescription\u003e]"},{"line_number":24,"context_line":"        [--unrestricted]"},{"line_number":25,"context_line":"        \u003cname\u003e"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":".. option:: --secret \u003csecret\u003e"}],"source_content_type":"text/x-rst","patch_set":6,"id":"5f93b717_424182a8","line":24,"updated":"2018-02-01 15:29:26.000000000","message":"[--restricted|--unrestricted]\n\ngrab this if you need to re-push the review for other reasons","commit_id":"375964f270e125b8887e0ca4ee1cbe15d5eddf04"}],"openstackclient/identity/v3/application_credential.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6aa9a0a108797e8e5cbd89ad41453cb62235696b","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        parser.add_argument("},{"line_number":50,"context_line":"            \u0027--secret\u0027,"},{"line_number":51,"context_line":"            metavar\u003d\u0027\u003csecret\u003e\u0027,"},{"line_number":52,"context_line":"            help\u003d_(\u0027Secret to use for authentication (if not provided, one\u0027"},{"line_number":53,"context_line":"                   \u0027 will be generated)\u0027),"},{"line_number":54,"context_line":"        )"},{"line_number":55,"context_line":"        parser.add_argument("}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_bfd4ccbe","line":52,"updated":"2018-01-22 03:27:27.000000000","message":"nice UX","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6aa9a0a108797e8e5cbd89ad41453cb62235696b","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        parser.add_argument("},{"line_number":64,"context_line":"            \u0027--expiration\u0027,"},{"line_number":65,"context_line":"            metavar\u003d\u0027\u003cexpiration\u003e\u0027,"},{"line_number":66,"context_line":"            help\u003d_(\u0027Sets an expiration date for the application credential\u0027"},{"line_number":67,"context_line":"                   \u0027 (format of YYYY-mm-ddTHH:MM:SS)\u0027),"},{"line_number":68,"context_line":"        )"},{"line_number":69,"context_line":"        parser.add_argument("}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_3fe0bc96","line":66,"updated":"2018-01-22 03:27:27.000000000","message":"is there no reasonable default provided by the API or the server? this isn\u0027t the easiest thing for a user to input. Is there an option to make it not expire?","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0c39c804b79eef31a37b6f330342378582cca4f4","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        parser.add_argument("},{"line_number":64,"context_line":"            \u0027--expiration\u0027,"},{"line_number":65,"context_line":"            metavar\u003d\u0027\u003cexpiration\u003e\u0027,"},{"line_number":66,"context_line":"            help\u003d_(\u0027Sets an expiration date for the application credential\u0027"},{"line_number":67,"context_line":"                   \u0027 (format of YYYY-mm-ddTHH:MM:SS)\u0027),"},{"line_number":68,"context_line":"        )"},{"line_number":69,"context_line":"        parser.add_argument("}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_e6cab99f","line":66,"in_reply_to":"7f96bb07_3326b0b9","updated":"2018-01-22 16:14:54.000000000","message":"you are right, its required\u003dFalse is the default here. Maybe just tweak the help message a bit to make it more clear","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"742bb0ace037c1a6568930c2fe0c6f45ff1e8494","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        parser.add_argument("},{"line_number":64,"context_line":"            \u0027--expiration\u0027,"},{"line_number":65,"context_line":"            metavar\u003d\u0027\u003cexpiration\u003e\u0027,"},{"line_number":66,"context_line":"            help\u003d_(\u0027Sets an expiration date for the application credential\u0027"},{"line_number":67,"context_line":"                   \u0027 (format of YYYY-mm-ddTHH:MM:SS)\u0027),"},{"line_number":68,"context_line":"        )"},{"line_number":69,"context_line":"        parser.add_argument("}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_3326b0b9","line":66,"in_reply_to":"7f96bb07_3fe0bc96","updated":"2018-01-22 09:08:13.000000000","message":"If none is provided then no expiration is set. I think required\u003dFalse is the default? I could fix up the help message to make it more clear that it is not required.","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ecfb2ae834d28ec2b08183f3b66d4352d3f22b41","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        parser.add_argument("},{"line_number":64,"context_line":"            \u0027--expiration\u0027,"},{"line_number":65,"context_line":"            metavar\u003d\u0027\u003cexpiration\u003e\u0027,"},{"line_number":66,"context_line":"            help\u003d_(\u0027Sets an expiration date for the application credential\u0027"},{"line_number":67,"context_line":"                   \u0027 (format of YYYY-mm-ddTHH:MM:SS)\u0027),"},{"line_number":68,"context_line":"        )"},{"line_number":69,"context_line":"        parser.add_argument("}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_e6db994c","line":66,"in_reply_to":"7f96bb07_e6cab99f","updated":"2018-01-22 16:17:40.000000000","message":"++","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6aa9a0a108797e8e5cbd89ad41453cb62235696b","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            metavar\u003d\u0027\u003cdescription\u003e\u0027,"},{"line_number":72,"context_line":"            help\u003d_(\u0027Application credential description\u0027),"},{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":"        common.add_project_domain_option_to_parser(parser)"},{"line_number":75,"context_line":"        common.add_user_domain_option_to_parser(parser)"},{"line_number":76,"context_line":"        return parser"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_3f4bdcb0","line":74,"updated":"2018-01-22 03:27:27.000000000","message":"why add the project domain option? i don\u0027t see project specified here","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"742bb0ace037c1a6568930c2fe0c6f45ff1e8494","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            metavar\u003d\u0027\u003cdescription\u003e\u0027,"},{"line_number":72,"context_line":"            help\u003d_(\u0027Application credential description\u0027),"},{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":"        common.add_project_domain_option_to_parser(parser)"},{"line_number":75,"context_line":"        common.add_user_domain_option_to_parser(parser)"},{"line_number":76,"context_line":"        return parser"},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_9349c461","line":74,"in_reply_to":"7f96bb07_3f4bdcb0","updated":"2018-01-22 09:08:13.000000000","message":"I think this was a copypaste error","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6aa9a0a108797e8e5cbd89ad41453cb62235696b","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            help\u003d_(\u0027Application credential description\u0027),"},{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":"        common.add_project_domain_option_to_parser(parser)"},{"line_number":75,"context_line":"        common.add_user_domain_option_to_parser(parser)"},{"line_number":76,"context_line":"        return parser"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_7f516462","line":75,"updated":"2018-01-22 03:27:27.000000000","message":"are role domains a thing? i forget... do we need to add that option to namespace the roles?","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ae31abffce8116b104720fefa4899ada21fab494","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            help\u003d_(\u0027Application credential description\u0027),"},{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":"        common.add_project_domain_option_to_parser(parser)"},{"line_number":75,"context_line":"        common.add_user_domain_option_to_parser(parser)"},{"line_number":76,"context_line":"        return parser"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f93b717_ad5ef2e3","line":75,"in_reply_to":"5f93b717_6be69feb","updated":"2018-01-25 09:11:49.000000000","message":"In that case should it not have action\u003d\u0027append\u0027? Or should both forms be supported, e.g. `--role member --role admin` and `--role member,admin`? Or is it fine as-is with action\u003d\u0027append\u0027 for now while domains don\u0027t matter?","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"acde0ea9bf5c438ddd99ac1ee22ee059b9c603ae","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            help\u003d_(\u0027Application credential description\u0027),"},{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":"        common.add_project_domain_option_to_parser(parser)"},{"line_number":75,"context_line":"        common.add_user_domain_option_to_parser(parser)"},{"line_number":76,"context_line":"        return parser"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f93b717_c4aa3484","line":75,"in_reply_to":"5f93b717_ad5ef2e3","updated":"2018-01-25 12:50:54.000000000","message":"We can add the keys later and be backward-compatible.  If you think it is highly likely that the domain will come in time adding the parseraction now would be ok, but I think we need to support the bare value as is today to stay similar to other --role options.","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"b33be1baeb246756e786deee695729667dc9aba3","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            help\u003d_(\u0027Application credential description\u0027),"},{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":"        common.add_project_domain_option_to_parser(parser)"},{"line_number":75,"context_line":"        common.add_user_domain_option_to_parser(parser)"},{"line_number":76,"context_line":"        return parser"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f93b717_6be69feb","line":75,"in_reply_to":"5f93b717_d59197f3","updated":"2018-01-25 03:15:37.000000000","message":"the precedent we have, including a parseraction in osc-lib, is to allow comma-separated k\u003dv pairs with an option when they go together like this.  As I understand it, this could be:\n\n  --role member\u003dDefault,admin\u003dldap\n\nand not be surprising to users. It keeps related things together without having to rely on option parsing order.","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0c39c804b79eef31a37b6f330342378582cca4f4","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            help\u003d_(\u0027Application credential description\u0027),"},{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":"        common.add_project_domain_option_to_parser(parser)"},{"line_number":75,"context_line":"        common.add_user_domain_option_to_parser(parser)"},{"line_number":76,"context_line":"        return parser"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_e63f1985","line":75,"in_reply_to":"7f96bb07_105effe5","updated":"2018-01-22 16:14:54.000000000","message":"I like the latter","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"d0563fef7df1a55e23c4b4beaa057d5a4e790fbb","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            help\u003d_(\u0027Application credential description\u0027),"},{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":"        common.add_project_domain_option_to_parser(parser)"},{"line_number":75,"context_line":"        common.add_user_domain_option_to_parser(parser)"},{"line_number":76,"context_line":"        return parser"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_d105eb7b","line":75,"in_reply_to":"7f96bb07_262d0146","updated":"2018-01-23 01:15:43.000000000","message":"[Sorry, I just saw this, I\u0027m 2 patchsets behind]\n\nHaving two options that need to have values in the same order is really bad UX.  Some of the network commands have complex option formatt, often to set multiple attributes at once (ugly) but that would be preferable than having to coordinate separate options.\n\nI know these are not key-value pairs, but thinking in those terms would fit the flow of OSC better.  The Windows form of \u003cdomain\u003e\\\u003caccount\u003e is closer to what I am thinking, of course no backslashes, etc, but fot both values together on the command line and multiple option instances no longer feel icky.","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"742bb0ace037c1a6568930c2fe0c6f45ff1e8494","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            help\u003d_(\u0027Application credential description\u0027),"},{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":"        common.add_project_domain_option_to_parser(parser)"},{"line_number":75,"context_line":"        common.add_user_domain_option_to_parser(parser)"},{"line_number":76,"context_line":"        return parser"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_b346404f","line":75,"in_reply_to":"7f96bb07_7f516462","updated":"2018-01-22 09:08:13.000000000","message":"ummm yes probably","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"08bdbc942810057f8a15867b19c5a064d628595d","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            help\u003d_(\u0027Application credential description\u0027),"},{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":"        common.add_project_domain_option_to_parser(parser)"},{"line_number":75,"context_line":"        common.add_user_domain_option_to_parser(parser)"},{"line_number":76,"context_line":"        return parser"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f93b717_d59197f3","line":75,"in_reply_to":"7f96bb07_9f167ea7","updated":"2018-01-24 23:05:37.000000000","message":"Actually - it doesn\u0027t matter, the application credentials API doesn\u0027t allow role domains right now https://review.openstack.org/#/c/524423/41/keystone/application_credential/schema.py@18\n\nNeither does the trusts API http://git.openstack.org/cgit/openstack/keystone/tree/keystone/trust/schema.py#n16\n\nThat\u0027s probably something we should fix in keystone but it\u0027s been that way in trusts for a while so I don\u0027t think it\u0027s critical.\n\nI think right now it makes sense for this to be just --role with action\u003d\u0027append\u0027 that accepts an ID or name. When keystone can accept domains in this API (and the trusts API) then maybe this could look like\n\n --role Member\u003dDefault --role admin\u003dldap\n\nor \n\n --role Member:Default --role admin:ldap\n\nor accept JSON objects.","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"262b62c49a5a9afe43c9e1c34628190e797c3f1c","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            help\u003d_(\u0027Application credential description\u0027),"},{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":"        common.add_project_domain_option_to_parser(parser)"},{"line_number":75,"context_line":"        common.add_user_domain_option_to_parser(parser)"},{"line_number":76,"context_line":"        return parser"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_105effe5","line":75,"in_reply_to":"7f96bb07_b346404f","updated":"2018-01-22 15:17:24.000000000","message":"This is supposed to be able to allow multiple roles to be specified, which is how it\u0027s done with trusts http://git.openstack.org/cgit/openstack/python-openstackclient/tree/openstackclient/identity/v3/trust.py#n53. Do you have advice on how to handle the role domains if more than one role is given? I feel like `--role role1 --role-domain domain1 --role role2 --role-domain domain2` is not really going to work.\n\nCould maybe change --role to only allow a comma-separated list of roles and --role-domain has to have a list of domains in the same order?","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"95d328e46fd8834e4291f07cd9a9908e8602e115","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            help\u003d_(\u0027Application credential description\u0027),"},{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":"        common.add_project_domain_option_to_parser(parser)"},{"line_number":75,"context_line":"        common.add_user_domain_option_to_parser(parser)"},{"line_number":76,"context_line":"        return parser"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_9f167ea7","line":75,"in_reply_to":"7f96bb07_d105eb7b","updated":"2018-01-23 11:39:59.000000000","message":"Looking at the port command it looks like --binding-profile can accept \u0027key\u003dvalue\u0027 pairs or JSON, is that a good model to follow? http://git.openstack.org/cgit/openstack/python-openstackclient/tree/openstackclient/network/v2/port.py","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ecfb2ae834d28ec2b08183f3b66d4352d3f22b41","unresolved":false,"context_lines":[{"line_number":72,"context_line":"            help\u003d_(\u0027Application credential description\u0027),"},{"line_number":73,"context_line":"        )"},{"line_number":74,"context_line":"        common.add_project_domain_option_to_parser(parser)"},{"line_number":75,"context_line":"        common.add_user_domain_option_to_parser(parser)"},{"line_number":76,"context_line":"        return parser"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def take_action(self, parsed_args):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_262d0146","line":75,"in_reply_to":"7f96bb07_e63f1985","updated":"2018-01-22 16:17:40.000000000","message":"Okay ty","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6aa9a0a108797e8e5cbd89ad41453cb62235696b","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            user_id \u003d None"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        role_ids \u003d []"},{"line_number":89,"context_line":"        for role in parsed_args.role:"},{"line_number":90,"context_line":"            try:"},{"line_number":91,"context_line":"                role_id \u003d utils.find_resource("},{"line_number":92,"context_line":"                    identity_client.roles,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_bfedac8c","line":89,"updated":"2018-01-22 03:27:27.000000000","message":"check if parsed_args.roles is empty and bomb out if it is (earlier)? or is that a thing the server allows?","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"fd3bd85b76efc8c05371f4fff05ad9f51f696030","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            user_id \u003d None"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        role_ids \u003d []"},{"line_number":89,"context_line":"        for role in parsed_args.role:"},{"line_number":90,"context_line":"            try:"},{"line_number":91,"context_line":"                role_id \u003d utils.find_resource("},{"line_number":92,"context_line":"                    identity_client.roles,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_a6cef180","line":89,"in_reply_to":"7f96bb07_6601c9af","updated":"2018-01-22 16:18:50.000000000","message":"ah good, thanks!","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"ecfb2ae834d28ec2b08183f3b66d4352d3f22b41","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            user_id \u003d None"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        role_ids \u003d []"},{"line_number":89,"context_line":"        for role in parsed_args.role:"},{"line_number":90,"context_line":"            try:"},{"line_number":91,"context_line":"                role_id \u003d utils.find_resource("},{"line_number":92,"context_line":"                    identity_client.roles,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_6601c9af","line":89,"in_reply_to":"7f96bb07_865095d6","updated":"2018-01-22 16:17:40.000000000","message":"Yes, that\u0027s allowed. If it\u0027s empty then the server will use the roles in the token.","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"742bb0ace037c1a6568930c2fe0c6f45ff1e8494","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            user_id \u003d None"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        role_ids \u003d []"},{"line_number":89,"context_line":"        for role in parsed_args.role:"},{"line_number":90,"context_line":"            try:"},{"line_number":91,"context_line":"                role_id \u003d utils.find_resource("},{"line_number":92,"context_line":"                    identity_client.roles,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_d3ad0ceb","line":89,"in_reply_to":"7f96bb07_bfedac8c","updated":"2018-01-22 09:08:13.000000000","message":"It\u0027s allowed to be empty. Since the default is [] then if nothing was set the loop won\u0027t be entered.","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0c39c804b79eef31a37b6f330342378582cca4f4","unresolved":false,"context_lines":[{"line_number":86,"context_line":"            user_id \u003d None"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        role_ids \u003d []"},{"line_number":89,"context_line":"        for role in parsed_args.role:"},{"line_number":90,"context_line":"            try:"},{"line_number":91,"context_line":"                role_id \u003d utils.find_resource("},{"line_number":92,"context_line":"                    identity_client.roles,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7f96bb07_865095d6","line":89,"in_reply_to":"7f96bb07_d3ad0ceb","updated":"2018-01-22 16:14:54.000000000","message":"then won\u0027t role_ids be empty? and is that an appropriate call to the server?","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"b33be1baeb246756e786deee695729667dc9aba3","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            help\u003d_(\u0027Application credential description\u0027),"},{"line_number":68,"context_line":"        )"},{"line_number":69,"context_line":"        parser.add_argument("},{"line_number":70,"context_line":"            \u0027--unrestricted\u0027,"},{"line_number":71,"context_line":"            action\u003d\"store_true\","},{"line_number":72,"context_line":"            help\u003d_(\u0027Enable application credential to create and delete other\u0027"},{"line_number":73,"context_line":"                   \u0027 application credentials and trusts (this is potentially\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_eb206ffa","line":70,"range":{"start_line":70,"start_character":15,"end_line":70,"end_character":27},"updated":"2018-01-25 03:15:37.000000000","message":"It isn\u0027t critical, but we often include an option for the default anyway, for completeness and allowing scripts to document the values used.  If you do include it, we follow the pattern that things like --enable|--disable do and use two variables even when it isn\u0027t required because copy-n-paste is a thing and sometimes it is not obvious when that pattern is required by an API.","commit_id":"8e0474205233914c2cba882e7d787405a8a77d6a"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"b33be1baeb246756e786deee695729667dc9aba3","unresolved":false,"context_lines":[{"line_number":121,"context_line":"        parser \u003d super(DeleteApplicationCredential, self).get_parser(prog_name)"},{"line_number":122,"context_line":"        parser.add_argument("},{"line_number":123,"context_line":"            \u0027application_credential\u0027,"},{"line_number":124,"context_line":"            metavar\u003d\u0027\u003capplication_credential\u003e\u0027,"},{"line_number":125,"context_line":"            nargs\u003d\"+\","},{"line_number":126,"context_line":"            help\u003d_(\u0027Application credentials(s) to delete\u0027),"},{"line_number":127,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_6b5bff86","line":124,"range":{"start_line":124,"start_character":22,"end_line":124,"end_character":44},"updated":"2018-01-25 03:15:37.000000000","message":"use a dash in these","commit_id":"8e0474205233914c2cba882e7d787405a8a77d6a"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"b33be1baeb246756e786deee695729667dc9aba3","unresolved":false,"context_lines":[{"line_number":123,"context_line":"            \u0027application_credential\u0027,"},{"line_number":124,"context_line":"            metavar\u003d\u0027\u003capplication_credential\u003e\u0027,"},{"line_number":125,"context_line":"            nargs\u003d\"+\","},{"line_number":126,"context_line":"            help\u003d_(\u0027Application credentials(s) to delete\u0027),"},{"line_number":127,"context_line":"        )"},{"line_number":128,"context_line":"        return parser"},{"line_number":129,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_2b03b744","line":126,"updated":"2018-01-25 03:15:37.000000000","message":"Do app creds have an ID in addition to the name?  if so (name or ID) should be here too","commit_id":"8e0474205233914c2cba882e7d787405a8a77d6a"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"b33be1baeb246756e786deee695729667dc9aba3","unresolved":false,"context_lines":[{"line_number":157,"context_line":"        parser.add_argument("},{"line_number":158,"context_line":"            \u0027--user\u0027,"},{"line_number":159,"context_line":"            metavar\u003d\u0027\u003cuser\u003e\u0027,"},{"line_number":160,"context_line":"            help\u003d_(\u0027User (name or ID) whose application credentials to list\u0027),"},{"line_number":161,"context_line":"        )"},{"line_number":162,"context_line":"        common.add_user_domain_option_to_parser(parser)"},{"line_number":163,"context_line":"        return parser"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_abc6e715","line":160,"range":{"start_line":160,"start_character":25,"end_line":160,"end_character":37},"updated":"2018-01-25 03:15:37.000000000","message":"the \"name or ID)\" string is usually at the end of the help text","commit_id":"8e0474205233914c2cba882e7d787405a8a77d6a"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"b33be1baeb246756e786deee695729667dc9aba3","unresolved":false,"context_lines":[{"line_number":188,"context_line":"        parser \u003d super(ShowApplicationCredential, self).get_parser(prog_name)"},{"line_number":189,"context_line":"        parser.add_argument("},{"line_number":190,"context_line":"            \u0027application_credential\u0027,"},{"line_number":191,"context_line":"            metavar\u003d\u0027\u003capplication_credential\u003e\u0027,"},{"line_number":192,"context_line":"            help\u003d_(\u0027Application credential to display\u0027),"},{"line_number":193,"context_line":"        )"},{"line_number":194,"context_line":"        return parser"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_cbcb331c","line":191,"range":{"start_line":191,"start_character":22,"end_line":191,"end_character":44},"updated":"2018-01-25 03:15:37.000000000","message":"dash","commit_id":"8e0474205233914c2cba882e7d787405a8a77d6a"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"b33be1baeb246756e786deee695729667dc9aba3","unresolved":false,"context_lines":[{"line_number":189,"context_line":"        parser.add_argument("},{"line_number":190,"context_line":"            \u0027application_credential\u0027,"},{"line_number":191,"context_line":"            metavar\u003d\u0027\u003capplication_credential\u003e\u0027,"},{"line_number":192,"context_line":"            help\u003d_(\u0027Application credential to display\u0027),"},{"line_number":193,"context_line":"        )"},{"line_number":194,"context_line":"        return parser"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_0be11b9b","line":192,"updated":"2018-01-25 03:15:37.000000000","message":"Do app creds have an ID in addition to the name?  if so (name or ID) should be here too","commit_id":"8e0474205233914c2cba882e7d787405a8a77d6a"}],"openstackclient/tests/functional/identity/v3/test_application_credential.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6aa9a0a108797e8e5cbd89ad41453cb62235696b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"7f96bb07_bf5fec70","updated":"2018-01-22 03:27:27.000000000","message":"glad to see this enabled by default","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"}],"releasenotes/notes/bp-application-credential-a7031a043efc4a25.yaml":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"6aa9a0a108797e8e5cbd89ad41453cb62235696b","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds support for creating, reading, and deleting application credentials."},{"line_number":5,"context_line":"    With application credentials, a user can grant their applications limited"},{"line_number":6,"context_line":"    access to their cloud resources. Once created, users can authenticate with"},{"line_number":7,"context_line":"    an application credential by using the ``v3applicationcredential`` auth"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"7f96bb07_df60b838","line":4,"updated":"2018-01-22 03:27:27.000000000","message":"One suggestion, put the new object name in the first sentence:\n\n\"Adds support for creating, reading, and deleting application credentials via the `application credential` command.\"","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"742bb0ace037c1a6568930c2fe0c6f45ff1e8494","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Adds support for creating, reading, and deleting application credentials."},{"line_number":5,"context_line":"    With application credentials, a user can grant their applications limited"},{"line_number":6,"context_line":"    access to their cloud resources. Once created, users can authenticate with"},{"line_number":7,"context_line":"    an application credential by using the ``v3applicationcredential`` auth"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"7f96bb07_7388b870","line":4,"in_reply_to":"7f96bb07_df60b838","updated":"2018-01-22 09:08:13.000000000","message":"will do","commit_id":"62abdd517889552a6d0013e8cd2fd4ee5d4d0f68"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"b33be1baeb246756e786deee695729667dc9aba3","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    [`blueprint application-credentials \u003chttps://blueprints.launchpad.net/keystone/+spec/application-credentials\u003e`_]"},{"line_number":5,"context_line":"    Adds support for creating, reading, and deleting application credentials"},{"line_number":6,"context_line":"    via the `appication credential` command. With application credentials, a"},{"line_number":7,"context_line":"    user can grant their applications limited access to their cloud resources."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5f93b717_315faa42","line":4,"updated":"2018-01-25 03:15:37.000000000","message":"The link reference should be at the end of the note","commit_id":"8e0474205233914c2cba882e7d787405a8a77d6a"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"b33be1baeb246756e786deee695729667dc9aba3","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    [`blueprint application-credentials \u003chttps://blueprints.launchpad.net/keystone/+spec/application-credentials\u003e`_]"},{"line_number":5,"context_line":"    Adds support for creating, reading, and deleting application credentials"},{"line_number":6,"context_line":"    via the `appication credential` command. With application credentials, a"},{"line_number":7,"context_line":"    user can grant their applications limited access to their cloud resources."},{"line_number":8,"context_line":"    Once created, users can authenticate with an application credential by"},{"line_number":9,"context_line":"    using the ``v3applicationcredential`` auth type."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5f93b717_b14bba85","line":6,"range":{"start_line":6,"start_character":13,"end_line":6,"end_character":34},"updated":"2018-01-25 03:15:37.000000000","message":"This should be in double backquotes","commit_id":"8e0474205233914c2cba882e7d787405a8a77d6a"},{"author":{"_account_id":970,"name":"Dean Troyer","email":"dtroyer@gmail.com","username":"dtroyer"},"change_message_id":"b33be1baeb246756e786deee695729667dc9aba3","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    via the `appication credential` command. With application credentials, a"},{"line_number":7,"context_line":"    user can grant their applications limited access to their cloud resources."},{"line_number":8,"context_line":"    Once created, users can authenticate with an application credential by"},{"line_number":9,"context_line":"    using the ``v3applicationcredential`` auth type."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"5f93b717_f12dc2a8","line":9,"updated":"2018-01-25 03:15:37.000000000","message":"I like this explanation of what an \"application credential\" is, please add it to the rst doc too, at the top.  I\u0027ve always wanted to have more explanation in those, since you\u0027ve written a nice one I don\u0027t want to lose it.","commit_id":"8e0474205233914c2cba882e7d787405a8a77d6a"}]}
