)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0b521da5d8b6a5cf8ea542a888a1c992737d67d8","unresolved":false,"context_lines":[{"line_number":12,"context_line":"token to perform initial actions."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I113c6934b6b83ceff23a94101967a6df1126873f"},{"line_number":15,"context_line":"bp: bootstrap"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"7a740942_8842ef3c","line":15,"updated":"2015-12-11 20:53:17.000000000","message":"this BP doesn\u0027t exist also :)","commit_id":"529bcc4c6ba506329122d673c5fe59e0269c2b3c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1ac01e8787b73247595f54f0d84f4592b779aec9","unresolved":false,"context_lines":[{"line_number":12,"context_line":"token to perform initial actions."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I113c6934b6b83ceff23a94101967a6df1126873f"},{"line_number":15,"context_line":"bp: bootstrap"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"7a740942_bf9a7c60","line":15,"in_reply_to":"7a740942_8842ef3c","updated":"2015-12-12 01:19:57.000000000","message":"https://blueprints.launchpad.net/keystone/+spec/bootstrap","commit_id":"529bcc4c6ba506329122d673c5fe59e0269c2b3c"}],"keystone/cmd/cli.py":[{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"8463a4a446ff90006b8575c37ae37bc630f897ee","unresolved":false,"context_lines":[{"line_number":76,"context_line":"                                  \u0027keystone bootstrap process.\u0027))"},{"line_number":77,"context_line":"        parser.add_argument(\u0027--bootstrap-role-name\u0027, default\u003d\u0027admin\u0027,"},{"line_number":78,"context_line":"                            help\u003d(\u0027The initial role-name created during the \u0027"},{"line_number":79,"context_line":"                                  \u0027keystone bootstrap process.\u0027))"},{"line_number":80,"context_line":"        return parser"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def load_backends(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7a740942_b94a1cab","line":79,"updated":"2015-12-10 00:40:04.000000000","message":"We might need to also allow configuring domains here rather than assuming default domain is \"ok\".","commit_id":"b5bfe2d579b113cfe6b9aca285061d79d9025ab3"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"181e89db628e415ba6a779be02240004a8b87a36","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def __init__(self):"},{"line_number":61,"context_line":"        self.load_backends()"},{"line_number":62,"context_line":"        self.tenant_id \u003d uuid.uuid4().hex"},{"line_number":63,"context_line":"        self.role_id \u003d uuid.uuid4().hex"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_63cb9673","line":62,"updated":"2015-12-10 05:37:31.000000000","message":"tenant? *groans*\n\nname if project you luddite","commit_id":"0930020adafe87327fa82abfdd437c73bbc81b79"},{"author":{"_account_id":10046,"name":"Henrique Truta","email":"henrique@lsd.ufcg.edu.br","username":"henriquetruta"},"change_message_id":"d1b61139cf7f4feb6497b1eefc0bb1073ca7f02e","unresolved":false,"context_lines":[{"line_number":93,"context_line":"            self.resource_manager.create_domain("},{"line_number":94,"context_line":"                domain_id\u003ddefault_domain[\u0027id\u0027],"},{"line_number":95,"context_line":"                domain\u003ddefault_domain)"},{"line_number":96,"context_line":"        except exception.UnexpectedError:"},{"line_number":97,"context_line":"            # NOTE(morganfainberg): Domain already exists, continue on."},{"line_number":98,"context_line":"            pass"},{"line_number":99,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_2d11025e","line":96,"updated":"2015-12-10 02:53:55.000000000","message":"you could extract this to another method and put a return instead of an empty \"pass\" to make bandit happy. Another option is logging here that the domain already exists","commit_id":"0930020adafe87327fa82abfdd437c73bbc81b79"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"55b1d559aed1f1dc293b885ad1ab4af6844dc94e","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        parser.add_argument(\u0027--bootstrap-username\u0027, default\u003d\u0027admin\u0027,"},{"line_number":69,"context_line":"                            help\u003d(\u0027The username of the initial keystone \u0027"},{"line_number":70,"context_line":"                                  \u0027user during bootstrap process.\u0027))"},{"line_number":71,"context_line":"        parser.add_argument(\u0027--bootstrap-password\u0027, default\u003dNone,"},{"line_number":72,"context_line":"                            required\u003dTrue,"},{"line_number":73,"context_line":"                            help\u003d\u0027The bootstrap user password\u0027)"},{"line_number":74,"context_line":"        parser.add_argument(\u0027--bootstrap-project-name\u0027, default\u003d\u0027admin\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_494b1b2c","line":71,"updated":"2015-12-10 06:38:19.000000000","message":"I recommend not introducing command line that takes a password as an argument.  It shows up in history and in the output of ps.\n\nIt\u0027s much better to use a prompt like getpass","commit_id":"5bb10f75f422544b5192d65ad2b7ae68e956da6f"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"2dcb7be53135af29285633caafcec68aa8b9a16c","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        parser.add_argument(\u0027--bootstrap-username\u0027, default\u003d\u0027admin\u0027,"},{"line_number":69,"context_line":"                            help\u003d(\u0027The username of the initial keystone \u0027"},{"line_number":70,"context_line":"                                  \u0027user during bootstrap process.\u0027))"},{"line_number":71,"context_line":"        parser.add_argument(\u0027--bootstrap-password\u0027, default\u003dNone,"},{"line_number":72,"context_line":"                            required\u003dTrue,"},{"line_number":73,"context_line":"                            help\u003d\u0027The bootstrap user password\u0027)"},{"line_number":74,"context_line":"        parser.add_argument(\u0027--bootstrap-project-name\u0027, default\u003d\u0027admin\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_c0433112","line":71,"in_reply_to":"7a740942_142c4aaa","updated":"2015-12-10 18:52:44.000000000","message":"Don\u0027t use puppet myself, but as for Ansible this would be more useful as an Ansible module and not a command.  Command lines tools are generally not idempotent.\n\nAnother alternative is a argument that takes a password file.","commit_id":"5bb10f75f422544b5192d65ad2b7ae68e956da6f"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"b206543514750abb2a48552cd89aa302d4525739","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        parser.add_argument(\u0027--bootstrap-username\u0027, default\u003d\u0027admin\u0027,"},{"line_number":69,"context_line":"                            help\u003d(\u0027The username of the initial keystone \u0027"},{"line_number":70,"context_line":"                                  \u0027user during bootstrap process.\u0027))"},{"line_number":71,"context_line":"        parser.add_argument(\u0027--bootstrap-password\u0027, default\u003dNone,"},{"line_number":72,"context_line":"                            required\u003dTrue,"},{"line_number":73,"context_line":"                            help\u003d\u0027The bootstrap user password\u0027)"},{"line_number":74,"context_line":"        parser.add_argument(\u0027--bootstrap-project-name\u0027, default\u003d\u0027admin\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_cfd364d4","line":71,"in_reply_to":"7a740942_142c4aaa","updated":"2015-12-10 18:16:25.000000000","message":"Speaking for puppet, we would really prefer to be able to specify passwords as environment variables rather than command line options. The command shows up in the process table, in debug outputs, and sometimes in logs or reports, which in many environments is a security risk.","commit_id":"5bb10f75f422544b5192d65ad2b7ae68e956da6f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d8781ea5d5853ce8b8110c6da2b6088ac0e40fc2","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        parser.add_argument(\u0027--bootstrap-username\u0027, default\u003d\u0027admin\u0027,"},{"line_number":69,"context_line":"                            help\u003d(\u0027The username of the initial keystone \u0027"},{"line_number":70,"context_line":"                                  \u0027user during bootstrap process.\u0027))"},{"line_number":71,"context_line":"        parser.add_argument(\u0027--bootstrap-password\u0027, default\u003dNone,"},{"line_number":72,"context_line":"                            required\u003dTrue,"},{"line_number":73,"context_line":"                            help\u003d\u0027The bootstrap user password\u0027)"},{"line_number":74,"context_line":"        parser.add_argument(\u0027--bootstrap-project-name\u0027, default\u003d\u0027admin\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_142c4aaa","line":71,"in_reply_to":"7a740942_494b1b2c","updated":"2015-12-10 07:28:11.000000000","message":"This is a case where we might need both forms, as this is also meant to be managed via CMS tools (such as puppet). Ideally this user\u0027s password would be changed or the user would be deleted once keystone is setup.\n\nI\u0027ll need to mull over the best way to address both use-cases elegantly. Remember, this is really only ever to be used for initial setup of keystone not on an ongoing basis (in fact, if this is used outside of bootstrapping, I\u0027d be somewhat worried).","commit_id":"5bb10f75f422544b5192d65ad2b7ae68e956da6f"},{"author":{"_account_id":6488,"name":"Clint Byrum","email":"clint@fewbar.com","username":"clint-fewbar"},"change_message_id":"38802543dd69674d12b702980cf618a7d36fdda4","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        parser.add_argument(\u0027--bootstrap-username\u0027, default\u003d\u0027admin\u0027,"},{"line_number":69,"context_line":"                            help\u003d(\u0027The username of the initial keystone \u0027"},{"line_number":70,"context_line":"                                  \u0027user during bootstrap process.\u0027))"},{"line_number":71,"context_line":"        parser.add_argument(\u0027--bootstrap-password\u0027, default\u003dNone,"},{"line_number":72,"context_line":"                            required\u003dTrue,"},{"line_number":73,"context_line":"                            help\u003d\u0027The bootstrap user password\u0027)"},{"line_number":74,"context_line":"        parser.add_argument(\u0027--bootstrap-project-name\u0027, default\u003d\u0027admin\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_0015b999","line":71,"in_reply_to":"7a740942_c0433112","updated":"2015-12-10 19:04:32.000000000","message":"Eric that\u0027s a bit of a flawed argument. This command line tool _must_ be idempotent or it\u0027s not going to be useful to puppet users either.\n\nI think environment variables are a pretty common paradigm here, and all of the tools that need to run this automatically will be able to do that quite easily.","commit_id":"5bb10f75f422544b5192d65ad2b7ae68e956da6f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"223903513210546014bcf75657a653f61bd3d418","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        parser.add_argument(\u0027--bootstrap-username\u0027, default\u003d\u0027admin\u0027,"},{"line_number":69,"context_line":"                            help\u003d(\u0027The username of the initial keystone \u0027"},{"line_number":70,"context_line":"                                  \u0027user during bootstrap process.\u0027))"},{"line_number":71,"context_line":"        parser.add_argument(\u0027--bootstrap-password\u0027, default\u003dNone,"},{"line_number":72,"context_line":"                            required\u003dTrue,"},{"line_number":73,"context_line":"                            help\u003d\u0027The bootstrap user password\u0027)"},{"line_number":74,"context_line":"        parser.add_argument(\u0027--bootstrap-project-name\u0027, default\u003d\u0027admin\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_05614ba8","line":71,"in_reply_to":"7a740942_cfd364d4","updated":"2015-12-10 18:35:37.000000000","message":"Sounds good.","commit_id":"5bb10f75f422544b5192d65ad2b7ae68e956da6f"},{"author":{"_account_id":8482,"name":"Colleen Murphy","email":"colleen@gazlene.net","username":"krinkle"},"change_message_id":"b206543514750abb2a48552cd89aa302d4525739","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        except exception.UnexpectedError:"},{"line_number":98,"context_line":"            # NOTE(morganfainberg): Domain already exists, continue on."},{"line_number":99,"context_line":"            LOG.info(_LI(\u0027Domain %s already exists, skipping creation.\u0027),"},{"line_number":100,"context_line":"                     default_domain[\u0027id\u0027])"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        LOG.info(_LI(\u0027Creating project %s\u0027),"},{"line_number":103,"context_line":"                 CONF.command.bootstrap_project_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_ef1180b0","line":100,"updated":"2015-12-10 18:16:25.000000000","message":"I get this error when trying to run the bootstrap:\n\n Conflict: Conflict occurred attempting to store domain - Duplicate Entry\n\nThis is after following the developer docs. Examining the sqlite table shows the default domain is already created.","commit_id":"5bb10f75f422544b5192d65ad2b7ae68e956da6f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"223903513210546014bcf75657a653f61bd3d418","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        except exception.UnexpectedError:"},{"line_number":98,"context_line":"            # NOTE(morganfainberg): Domain already exists, continue on."},{"line_number":99,"context_line":"            LOG.info(_LI(\u0027Domain %s already exists, skipping creation.\u0027),"},{"line_number":100,"context_line":"                     default_domain[\u0027id\u0027])"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"        LOG.info(_LI(\u0027Creating project %s\u0027),"},{"line_number":103,"context_line":"                 CONF.command.bootstrap_project_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_a525d75c","line":100,"in_reply_to":"7a740942_ef1180b0","updated":"2015-12-10 18:35:37.000000000","message":"Hm. I\u0027ll need to see what is going on, this should just clear out via the except, but i might be grabbing the wrong exception.","commit_id":"5bb10f75f422544b5192d65ad2b7ae68e956da6f"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"55b1d559aed1f1dc293b885ad1ab4af6844dc94e","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            tenant\u003d{\u0027enabled\u0027: True,"},{"line_number":107,"context_line":"                    \u0027id\u0027: self.tenant_id,"},{"line_number":108,"context_line":"                    \u0027domain_id\u0027: default_domain[\u0027id\u0027],"},{"line_number":109,"context_line":"                    \u0027description\u0027: \u0027Bootstrap Project for Cloud Init\u0027,"},{"line_number":110,"context_line":"                    \u0027name\u0027: CONF.command.bootstrap_project_name},"},{"line_number":111,"context_line":"        )"},{"line_number":112,"context_line":"        LOG.info(_LI(\u0027Creating user %s\u0027), CONF.command.bootstrap_username)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_8957c3c9","line":109,"updated":"2015-12-10 06:38:19.000000000","message":"\"Cloud Init\" makes me think of cloud-init","commit_id":"5bb10f75f422544b5192d65ad2b7ae68e956da6f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d8781ea5d5853ce8b8110c6da2b6088ac0e40fc2","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            tenant\u003d{\u0027enabled\u0027: True,"},{"line_number":107,"context_line":"                    \u0027id\u0027: self.tenant_id,"},{"line_number":108,"context_line":"                    \u0027domain_id\u0027: default_domain[\u0027id\u0027],"},{"line_number":109,"context_line":"                    \u0027description\u0027: \u0027Bootstrap Project for Cloud Init\u0027,"},{"line_number":110,"context_line":"                    \u0027name\u0027: CONF.command.bootstrap_project_name},"},{"line_number":111,"context_line":"        )"},{"line_number":112,"context_line":"        LOG.info(_LI(\u0027Creating user %s\u0027), CONF.command.bootstrap_username)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_cf2aab7e","line":109,"in_reply_to":"7a740942_8957c3c9","updated":"2015-12-10 07:28:11.000000000","message":"Hah. I can see that. This actually should become a better string. Please let me know if you have any suggestions.","commit_id":"5bb10f75f422544b5192d65ad2b7ae68e956da6f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0e277b2cfab140faaefc6c4cd9f2504bf178a6da","unresolved":false,"context_lines":[{"line_number":106,"context_line":"            tenant\u003d{\u0027enabled\u0027: True,"},{"line_number":107,"context_line":"                    \u0027id\u0027: self.tenant_id,"},{"line_number":108,"context_line":"                    \u0027domain_id\u0027: default_domain[\u0027id\u0027],"},{"line_number":109,"context_line":"                    \u0027description\u0027: \u0027Bootstrap Project for Cloud Init\u0027,"},{"line_number":110,"context_line":"                    \u0027name\u0027: CONF.command.bootstrap_project_name},"},{"line_number":111,"context_line":"        )"},{"line_number":112,"context_line":"        LOG.info(_LI(\u0027Creating user %s\u0027), CONF.command.bootstrap_username)"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_ca085694","line":109,"in_reply_to":"7a740942_cf2aab7e","updated":"2015-12-10 09:07:57.000000000","message":"Maybe just \"Bootstrap project for initializing the cloud\"","commit_id":"5bb10f75f422544b5192d65ad2b7ae68e956da6f"},{"author":{"_account_id":11428,"name":"Ajaya Agrawal","email":"ajku.agr@gmail.com","username":"ajayaa"},"change_message_id":"f7ddcda5ffdac9101e643f9a081d37cc4a7fb903","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                    \u0027name\u0027: CONF.command.bootstrap_project_name},"},{"line_number":111,"context_line":"        )"},{"line_number":112,"context_line":"        LOG.info(_LI(\u0027Creating user %s\u0027), CONF.command.bootstrap_username)"},{"line_number":113,"context_line":"        user \u003d self.identity_manager.create_user("},{"line_number":114,"context_line":"            user_ref\u003d{\u0027name\u0027: CONF.command.bootstrap_username,"},{"line_number":115,"context_line":"                      \u0027enabled\u0027: True,"},{"line_number":116,"context_line":"                      \u0027domain_id\u0027: default_domain[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_c35fea73","line":113,"updated":"2015-12-10 05:48:42.000000000","message":"I think it would be nice to add the above tenant as default_project for this user. Thoughts?","commit_id":"5bb10f75f422544b5192d65ad2b7ae68e956da6f"},{"author":{"_account_id":5707,"name":"Henry Nash","email":"henryn@linux.vnet.ibm.com","username":"henry-nash"},"change_message_id":"0e277b2cfab140faaefc6c4cd9f2504bf178a6da","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                    \u0027name\u0027: CONF.command.bootstrap_project_name},"},{"line_number":111,"context_line":"        )"},{"line_number":112,"context_line":"        LOG.info(_LI(\u0027Creating user %s\u0027), CONF.command.bootstrap_username)"},{"line_number":113,"context_line":"        user \u003d self.identity_manager.create_user("},{"line_number":114,"context_line":"            user_ref\u003d{\u0027name\u0027: CONF.command.bootstrap_username,"},{"line_number":115,"context_line":"                      \u0027enabled\u0027: True,"},{"line_number":116,"context_line":"                      \u0027domain_id\u0027: default_domain[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_4ac78645","line":113,"in_reply_to":"7a740942_af4cff76","updated":"2015-12-10 09:07:57.000000000","message":"+1 on not using default project","commit_id":"5bb10f75f422544b5192d65ad2b7ae68e956da6f"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"d8781ea5d5853ce8b8110c6da2b6088ac0e40fc2","unresolved":false,"context_lines":[{"line_number":110,"context_line":"                    \u0027name\u0027: CONF.command.bootstrap_project_name},"},{"line_number":111,"context_line":"        )"},{"line_number":112,"context_line":"        LOG.info(_LI(\u0027Creating user %s\u0027), CONF.command.bootstrap_username)"},{"line_number":113,"context_line":"        user \u003d self.identity_manager.create_user("},{"line_number":114,"context_line":"            user_ref\u003d{\u0027name\u0027: CONF.command.bootstrap_username,"},{"line_number":115,"context_line":"                      \u0027enabled\u0027: True,"},{"line_number":116,"context_line":"                      \u0027domain_id\u0027: default_domain[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a740942_af4cff76","line":113,"in_reply_to":"7a740942_c35fea73","updated":"2015-12-10 07:28:11.000000000","message":"I am against that pattern in all cases. This is something I don\u0027t want to continue to encourage. \"default_project\" is a terrible thing to encode in the user data, and especially here, it is not needed.","commit_id":"5bb10f75f422544b5192d65ad2b7ae68e956da6f"},{"author":{"_account_id":12000,"name":"Ian Cordasco","email":"sigmavirus24@gmail.com","username":"sigmavirus24"},"change_message_id":"97861e4a0a76039503caa8ff9b1c4887d9c61b36","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        parser.add_argument(\u0027--bootstrap-username\u0027, default\u003d\u0027admin\u0027,"},{"line_number":74,"context_line":"                            help\u003d(\u0027The username of the initial keystone \u0027"},{"line_number":75,"context_line":"                                  \u0027user during bootstrap process.\u0027))"},{"line_number":76,"context_line":"        parser.add_argument(\u0027--bootstrap-password\u0027, default\u003dNone,"},{"line_number":77,"context_line":"                            help\u003d\u0027The bootstrap user password\u0027)"},{"line_number":78,"context_line":"        parser.add_argument(\u0027--bootstrap-project-name\u0027, default\u003d\u0027admin\u0027,"},{"line_number":79,"context_line":"                            help\u003d(\u0027The initial project created during the \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_b1ccf689","line":76,"updated":"2015-12-11 22:26:44.000000000","message":"You\u0027re accepting a password via the command-line? Won\u0027t this end up in bash history?","commit_id":"529bcc4c6ba506329122d673c5fe59e0269c2b3c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"1ac01e8787b73247595f54f0d84f4592b779aec9","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        parser.add_argument(\u0027--bootstrap-username\u0027, default\u003d\u0027admin\u0027,"},{"line_number":74,"context_line":"                            help\u003d(\u0027The username of the initial keystone \u0027"},{"line_number":75,"context_line":"                                  \u0027user during bootstrap process.\u0027))"},{"line_number":76,"context_line":"        parser.add_argument(\u0027--bootstrap-password\u0027, default\u003dNone,"},{"line_number":77,"context_line":"                            help\u003d\u0027The bootstrap user password\u0027)"},{"line_number":78,"context_line":"        parser.add_argument(\u0027--bootstrap-project-name\u0027, default\u003d\u0027admin\u0027,"},{"line_number":79,"context_line":"                            help\u003d(\u0027The initial project created during the \u0027"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_ffd80455","line":76,"in_reply_to":"7a740942_b1ccf689","updated":"2015-12-12 01:19:57.000000000","message":"Yes it can, but we are also accepting (further down) via env variables.","commit_id":"529bcc4c6ba506329122d673c5fe59e0269c2b3c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"745b80b804e74534a0a5ebac80c0f14ac987634e","unresolved":false,"context_lines":[{"line_number":101,"context_line":"            CONF.command.bootstrap_password)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def do_bootstrap(self):"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"        self._get_config()"},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_2853bb18","line":104,"updated":"2015-12-11 20:52:53.000000000","message":"a docstring here saying what this will do would be nice for folks who are looking at it for the first time","commit_id":"529bcc4c6ba506329122d673c5fe59e0269c2b3c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"745b80b804e74534a0a5ebac80c0f14ac987634e","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                domain_id\u003ddefault_domain[\u0027id\u0027],"},{"line_number":118,"context_line":"                domain\u003ddefault_domain)"},{"line_number":119,"context_line":"            LOG.info(_LI(\u0027Created domain %s\u0027), default_domain[\u0027id\u0027])"},{"line_number":120,"context_line":"        except exception.UnexpectedError:"},{"line_number":121,"context_line":"            # NOTE(morganfainberg): Domain already exists, continue on."},{"line_number":122,"context_line":"            LOG.info(_LI(\u0027Domain %s already exists, skipping creation.\u0027),"},{"line_number":123,"context_line":"                     default_domain[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_a50a7424","line":120,"updated":"2015-12-11 20:52:53.000000000","message":"i think crinkle mentioned that a conflict exception is raised, might want to check both","commit_id":"529bcc4c6ba506329122d673c5fe59e0269c2b3c"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"fb32c513a97a52563d4ec6f8dc5cd38fd1aaa664","unresolved":false,"context_lines":[{"line_number":117,"context_line":"                domain_id\u003ddefault_domain[\u0027id\u0027],"},{"line_number":118,"context_line":"                domain\u003ddefault_domain)"},{"line_number":119,"context_line":"            LOG.info(_LI(\u0027Created domain %s\u0027), default_domain[\u0027id\u0027])"},{"line_number":120,"context_line":"        except exception.UnexpectedError:"},{"line_number":121,"context_line":"            # NOTE(morganfainberg): Domain already exists, continue on."},{"line_number":122,"context_line":"            LOG.info(_LI(\u0027Domain %s already exists, skipping creation.\u0027),"},{"line_number":123,"context_line":"                     default_domain[\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_6b70dd40","line":120,"in_reply_to":"7a740942_a50a7424","updated":"2015-12-11 21:33:27.000000000","message":"Oh it should have been conflict not Unexpected","commit_id":"529bcc4c6ba506329122d673c5fe59e0269c2b3c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"745b80b804e74534a0a5ebac80c0f14ac987634e","unresolved":false,"context_lines":[{"line_number":122,"context_line":"            LOG.info(_LI(\u0027Domain %s already exists, skipping creation.\u0027),"},{"line_number":123,"context_line":"                     default_domain[\u0027id\u0027])"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"        LOG.info(_LI(\u0027Creating project %s\u0027),"},{"line_number":126,"context_line":"                 self.project_name)"},{"line_number":127,"context_line":"        self.resource_manager.create_project("},{"line_number":128,"context_line":"            tenant_id\u003dself.tenant_id,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_65000c03","line":125,"updated":"2015-12-11 20:52:53.000000000","message":"this and the next line should become one","commit_id":"529bcc4c6ba506329122d673c5fe59e0269c2b3c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"745b80b804e74534a0a5ebac80c0f14ac987634e","unresolved":false,"context_lines":[{"line_number":133,"context_line":"                                   \u0027cloud.\u0027,"},{"line_number":134,"context_line":"                    \u0027name\u0027: self.project_name},"},{"line_number":135,"context_line":"        )"},{"line_number":136,"context_line":"        LOG.info(_LI(\u0027Creating user %s\u0027), CONF.command.bootstrap_username)"},{"line_number":137,"context_line":"        user \u003d self.identity_manager.create_user("},{"line_number":138,"context_line":"            user_ref\u003d{\u0027name\u0027: self.username,"},{"line_number":139,"context_line":"                      \u0027enabled\u0027: True,"}],"source_content_type":"text/x-python","patch_set":6,"id":"7a740942_88142f44","line":136,"updated":"2015-12-11 20:52:53.000000000","message":"use self.username here","commit_id":"529bcc4c6ba506329122d673c5fe59e0269c2b3c"},{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"0b4559b87dd84ef752253307dc4528309abeb000","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        Create bootstrap user, project, and role so that CMS, humans, or"},{"line_number":112,"context_line":"        scripts can continue to perform initial setup (domains, projects,"},{"line_number":113,"context_line":"        services, endpoints, etc) of Keystone when standing up a new"},{"line_number":114,"context_line":"        deployment."},{"line_number":115,"context_line":"        \"\"\""},{"line_number":116,"context_line":"        self._get_config()"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_0e059c0f","line":114,"updated":"2015-12-12 07:52:51.000000000","message":"(thus avoiding the use of the admin_token :))","commit_id":"d68442a4ef3deb9cf5fb91887bfc6bf0d127ded6"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"776df023049a75defd5e525704fb55eb0e043965","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        Create bootstrap user, project, and role so that CMS, humans, or"},{"line_number":112,"context_line":"        scripts can continue to perform initial setup (domains, projects,"},{"line_number":113,"context_line":"        services, endpoints, etc) of Keystone when standing up a new"},{"line_number":114,"context_line":"        deployment."},{"line_number":115,"context_line":"        \"\"\""},{"line_number":116,"context_line":"        self._get_config()"},{"line_number":117,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7a740942_04f018fc","line":114,"in_reply_to":"7a740942_0e059c0f","updated":"2015-12-12 17:55:56.000000000","message":"I don\u0027t think this is is needed in the docstring.","commit_id":"d68442a4ef3deb9cf5fb91887bfc6bf0d127ded6"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"7aa55e904983451ad6e1bb3048b4465cdfb1f2bc","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            user_id\u003duser[\u0027id\u0027],"},{"line_number":161,"context_line":"            tenant_id\u003dself.tenant_id,"},{"line_number":162,"context_line":"            role_id\u003dself.role_id"},{"line_number":163,"context_line":"        )"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    @classmethod"},{"line_number":166,"context_line":"    def main(cls):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_a4a4a44a","line":163,"updated":"2015-12-12 18:58:31.000000000","message":"why do you assign the role to user and project and not to user and domain?","commit_id":"cc290a21f6ac2e59f81ea454c4b2c3d3f56e7a00"},{"author":{"_account_id":13478,"name":"Boris Bobrov","email":"b.bobrov@sap.com","username":"bbobrov"},"change_message_id":"206c85ac5c680bf0a200fce6125cd156cb5a4d8f","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            user_id\u003duser[\u0027id\u0027],"},{"line_number":161,"context_line":"            tenant_id\u003dself.tenant_id,"},{"line_number":162,"context_line":"            role_id\u003dself.role_id"},{"line_number":163,"context_line":"        )"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    @classmethod"},{"line_number":166,"context_line":"    def main(cls):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_bf6911c0","line":163,"in_reply_to":"7a740942_9f177544","updated":"2015-12-12 19:19:00.000000000","message":"I think there is. For example, in etc/policy.v3cloudsample.json there is a concept of \"admin domain\".","commit_id":"cc290a21f6ac2e59f81ea454c4b2c3d3f56e7a00"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"217a1bee262e619f5aeefa99fba5a4d95f1102b2","unresolved":false,"context_lines":[{"line_number":160,"context_line":"            user_id\u003duser[\u0027id\u0027],"},{"line_number":161,"context_line":"            tenant_id\u003dself.tenant_id,"},{"line_number":162,"context_line":"            role_id\u003dself.role_id"},{"line_number":163,"context_line":"        )"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    @classmethod"},{"line_number":166,"context_line":"    def main(cls):"}],"source_content_type":"text/x-python","patch_set":9,"id":"7a740942_9f177544","line":163,"in_reply_to":"7a740942_a4a4a44a","updated":"2015-12-12 19:08:13.000000000","message":"Because domain scope is at best moderately supported. There just isn\u0027t a good reason to use domain role assignment for bootstrapping.","commit_id":"cc290a21f6ac2e59f81ea454c4b2c3d3f56e7a00"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"8b6e9e85d906f06d0a9b02d053a73b93525966b1","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                                  \u0027keystone bootstrap process.\u0027))"},{"line_number":82,"context_line":"        parser.add_argument(\u0027--bootstrap-role-name\u0027, default\u003d\u0027admin\u0027,"},{"line_number":83,"context_line":"                            help\u003d(\u0027The initial role-name created during the \u0027"},{"line_number":84,"context_line":"                                  \u0027keystone bootstrap process.\u0027))"},{"line_number":85,"context_line":"        return parser"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def load_backends(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a7b0d38_63dbb81c","line":84,"range":{"start_line":84,"start_character":0,"end_line":84,"end_character":34},"updated":"2015-12-22 21:39:36.000000000","message":"--bootstrap-domain-name?","commit_id":"d446e152857d01a91159a6e27f5739a86375ea05"},{"author":{"_account_id":8119,"name":"Eric Brown","email":"eric_wade_brown@yahoo.com","username":"ericwb"},"change_message_id":"5eeed934ea7cd7eaa070fa1b3524dc82860444f4","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        self._get_config()"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        if self.password is None:"},{"line_number":119,"context_line":"            print(_(\u0027Either --bootstrap-password argument or \u0027"},{"line_number":120,"context_line":"                    \u0027OS_BOOTSTRAP_PASSWORD must be set.\u0027))"},{"line_number":121,"context_line":"            raise ValueError"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a740942_a5457e43","line":119,"updated":"2015-12-12 23:34:23.000000000","message":"Can we have the option here to interactively prompt for password with getpass?  Would be nice.","commit_id":"d446e152857d01a91159a6e27f5739a86375ea05"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"8b6e9e85d906f06d0a9b02d053a73b93525966b1","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        self._get_config()"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        if self.password is None:"},{"line_number":119,"context_line":"            print(_(\u0027Either --bootstrap-password argument or \u0027"},{"line_number":120,"context_line":"                    \u0027OS_BOOTSTRAP_PASSWORD must be set.\u0027))"},{"line_number":121,"context_line":"            raise ValueError"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"1a7b0d38_634978d0","line":119,"in_reply_to":"7a740942_771d0dbd","updated":"2015-12-22 21:39:36.000000000","message":"or read it from a file as this command is likely used by the automation scripts. We don\u0027t want password to show up on the command line logs.","commit_id":"d446e152857d01a91159a6e27f5739a86375ea05"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"eee46924c26b692f3342b6dbddd00b6b5b84f414","unresolved":false,"context_lines":[{"line_number":116,"context_line":"        self._get_config()"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        if self.password is None:"},{"line_number":119,"context_line":"            print(_(\u0027Either --bootstrap-password argument or \u0027"},{"line_number":120,"context_line":"                    \u0027OS_BOOTSTRAP_PASSWORD must be set.\u0027))"},{"line_number":121,"context_line":"            raise ValueError"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"7a740942_771d0dbd","line":119,"in_reply_to":"7a740942_a5457e43","updated":"2015-12-13 04:00:48.000000000","message":"Sure. I\u0027ll see what i can do about including it as a followup patch.","commit_id":"d446e152857d01a91159a6e27f5739a86375ea05"},{"author":{"_account_id":220,"name":"Haneef Ali","email":"haneef.ali@hp.com","username":"haneef"},"change_message_id":"6f7423ea203d6b8637b35b270ca3e570f2f1a706","unresolved":false,"context_lines":[{"line_number":156,"context_line":"            role\u003d{\u0027name\u0027: self.role_name,"},{"line_number":157,"context_line":"                  \u0027id\u0027: self.role_id},"},{"line_number":158,"context_line":"        )"},{"line_number":159,"context_line":"        self.assignment_manager.add_role_to_user_and_project("},{"line_number":160,"context_line":"            user_id\u003duser[\u0027id\u0027],"},{"line_number":161,"context_line":"            tenant_id\u003dself.tenant_id,"},{"line_number":162,"context_line":"            role_id\u003dself.role_id"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a7b0d38_46948a36","line":159,"updated":"2015-12-22 22:09:58.000000000","message":"Can you please add domain role assignment?  If we are using v3_cloud_admin_policy, then we need domain roles for bootstrap. (In that case project is not required)","commit_id":"d446e152857d01a91159a6e27f5739a86375ea05"}],"keystone/tests/unit/test_cli.py":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"181e89db628e415ba6a779be02240004a8b87a36","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        self.assertEqual(role_list[0], role[\u0027id\u0027])"},{"line_number":78,"context_line":"        # NOTE(morganfainberg): Pass an empty context, it isn\u0027t used by"},{"line_number":79,"context_line":"        # `authenticate` method."},{"line_number":80,"context_line":"        bootstrap.identity_manager.authenticate("},{"line_number":81,"context_line":"            {},"},{"line_number":82,"context_line":"            user[\u0027id\u0027],"},{"line_number":83,"context_line":"            CONF.command.bootstrap_password)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a740942_c387ea10","line":80,"updated":"2015-12-10 05:37:31.000000000","message":"may want to assert some of the output here","commit_id":"0930020adafe87327fa82abfdd437c73bbc81b79"},{"author":{"_account_id":2903,"name":"Morgan Fainberg","email":"morgan.fainberg@gmail.com","username":"mdrnstm"},"change_message_id":"4dc9a1d29f52ef94e255df6ac8e33da9ec4ce2db","unresolved":false,"context_lines":[{"line_number":81,"context_line":"        bootstrap.identity_manager.authenticate("},{"line_number":82,"context_line":"            {},"},{"line_number":83,"context_line":"            user[\u0027id\u0027],"},{"line_number":84,"context_line":"            CONF.command.bootstrap_password)"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"class CliBootStrapTestCaseWithEnvironment(CliBootStrapTestCase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a740942_690b102b","line":84,"updated":"2015-12-11 18:19:11.000000000","message":"This is failing for me locally. Need to figure out why.","commit_id":"4c9055d4ae0f63997d9bf94d3f4dbaac1f0d8d0c"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"8b6e9e85d906f06d0a9b02d053a73b93525966b1","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        bootstrap.do_bootstrap()"},{"line_number":66,"context_line":"        project \u003d bootstrap.resource_manager.get_project_by_name("},{"line_number":67,"context_line":"            bootstrap.project_name,"},{"line_number":68,"context_line":"            \u0027default\u0027)"},{"line_number":69,"context_line":"        user \u003d bootstrap.identity_manager.get_user_by_name("},{"line_number":70,"context_line":"            bootstrap.username,"},{"line_number":71,"context_line":"            \u0027default\u0027)"}],"source_content_type":"text/x-python","patch_set":11,"id":"1a7b0d38_8373444d","line":68,"range":{"start_line":68,"start_character":13,"end_line":68,"end_character":20},"updated":"2015-12-22 21:39:36.000000000","message":"CONF.identity.default_domain_id?","commit_id":"d446e152857d01a91159a6e27f5739a86375ea05"},{"author":{"_account_id":1916,"name":"Guang Yee","email":"gyee@suse.com","username":"guang-yee"},"change_message_id":"8b6e9e85d906f06d0a9b02d053a73b93525966b1","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            \u0027default\u0027)"},{"line_number":69,"context_line":"        user \u003d bootstrap.identity_manager.get_user_by_name("},{"line_number":70,"context_line":"            bootstrap.username,"},{"line_number":71,"context_line":"            \u0027default\u0027)"},{"line_number":72,"context_line":"        role \u003d bootstrap.role_manager.get_role(bootstrap.role_id)"},{"line_number":73,"context_line":"        role_list \u003d ("},{"line_number":74,"context_line":"            bootstrap.assignment_manager.get_roles_for_user_and_project("}],"source_content_type":"text/x-python","patch_set":11,"id":"1a7b0d38_238ff024","line":71,"range":{"start_line":71,"start_character":13,"end_line":71,"end_character":20},"updated":"2015-12-22 21:39:36.000000000","message":"same as above","commit_id":"d446e152857d01a91159a6e27f5739a86375ea05"}],"releasenotes/notes/add-bootstrap-cli-192500228cc6e574.yaml":[{"author":{"_account_id":6482,"name":"Steve Martinelli","email":"s.martinelli@gmail.com","username":"stevemar"},"change_message_id":"9f86e8b90fb5d2a502d0f82a62f0e3c9c296c014","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - keystone-manage now supports the bootstrap command"},{"line_number":4,"context_line":"    on the CLI so that a keystone install can be"},{"line_number":5,"context_line":"    initialized without the need of the admin_token"},{"line_number":6,"context_line":"    filter in the paste-ini."}],"source_content_type":"text/x-yaml","patch_set":11,"id":"7a740942_cdad50ea","line":3,"updated":"2015-12-13 07:28:16.000000000","message":"if you want to use backticks, in order for the releasenotes job to succeed, you need to add the \"\u003e\" character after the first dash \"-\".\n\nthat\u0027s the only way I could get it to work for me, something about yaml i guess","commit_id":"d446e152857d01a91159a6e27f5739a86375ea05"}]}
