)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":20312,"name":"Jacek Tomasiak","email":"jacek.tomasiak@gmail.com","username":"skazi"},"change_message_id":"475ff5febfba04681e65b7df3230faf34d76f40e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"9f436f4f_c2a9f923","line":31,"updated":"2017-08-17 09:49:58.000000000","message":"Please add Closes-Bug: #1707860","commit_id":"5aad7b7f03e9941378ec52c21078a4a2e31aed35"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"105182d6fd33c14451faa73cc241161ca4904418","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"7f287b81_688f3ccd","line":31,"in_reply_to":"9f436f4f_a38dd2d4","updated":"2017-09-07 22:05:22.000000000","message":"Done","commit_id":"5aad7b7f03e9941378ec52c21078a4a2e31aed35"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b70862360cf0304931d7a430dc08df5ee77690e5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":13,"id":"9f436f4f_a38dd2d4","line":31,"in_reply_to":"9f436f4f_c2a9f923","updated":"2017-08-17 15:00:27.000000000","message":"Bonus.  Will do.","commit_id":"5aad7b7f03e9941378ec52c21078a4a2e31aed35"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"95fa7c5f22b6d58195e7dd6c2ee6b1e246118065","unresolved":false,"context_lines":[{"line_number":17,"context_line":"service_type."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"The ultimate goal is to replace the various disparate mechanisms used by"},{"line_number":20,"context_line":"different services to do endpoint URL and version discovery.  In Pike,"},{"line_number":21,"context_line":"the original mechanisms will still take precedence, but (other than"},{"line_number":22,"context_line":"[glance]api_servers - see the spec) will be deprecated.  In Queens, the"},{"line_number":23,"context_line":"deprecated options will be removed."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"This change incorporates the above utility into endpoint discovery for"},{"line_number":26,"context_line":"glance and ironic.  Future change sets will do the same for other"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"7f515b1d_888a9a18","line":23,"range":{"start_line":20,"start_character":63,"end_line":23,"end_character":35},"updated":"2017-09-26 07:01:38.000000000","message":"this need update...","commit_id":"40ecb2949c024d34026fe0fac0c6f95a6f3e1ecc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8e4e4dfed5a7ce95a3fc6478cbe1e0df00f02ebe","unresolved":false,"context_lines":[{"line_number":17,"context_line":"service_type."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"The ultimate goal is to replace the various disparate mechanisms used by"},{"line_number":20,"context_line":"different services to do endpoint URL and version discovery.  In Pike,"},{"line_number":21,"context_line":"the original mechanisms will still take precedence, but (other than"},{"line_number":22,"context_line":"[glance]api_servers - see the spec) will be deprecated.  In Queens, the"},{"line_number":23,"context_line":"deprecated options will be removed."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"This change incorporates the above utility into endpoint discovery for"},{"line_number":26,"context_line":"glance and ironic.  Future change sets will do the same for other"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"7f515b1d_9c6536e4","line":23,"range":{"start_line":20,"start_character":63,"end_line":23,"end_character":35},"in_reply_to":"7f515b1d_888a9a18","updated":"2017-09-26 12:59:39.000000000","message":"Thanks, done.","commit_id":"40ecb2949c024d34026fe0fac0c6f95a6f3e1ecc"}],"nova/conf/glance.py":[{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"df2405fc4af11df8b515290e2107b3f8c937cd43","unresolved":false,"context_lines":[{"line_number":38,"context_line":"  (i.e. \"http://10.0.1.0:9292\" or \"https://my.glance.server/image\")."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"NOTE: The preferred mechanism for endpoint discovery is via keystoneauth1"},{"line_number":41,"context_line":"loading options. Only use api_servers if you need multiple endpoints."},{"line_number":42,"context_line":"\"\"\"),"},{"line_number":43,"context_line":"    cfg.IntOpt(\u0027num_retries\u0027,"},{"line_number":44,"context_line":"        default\u003d0,"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_052326aa","line":41,"updated":"2017-08-01 22:35:55.000000000","message":"Nit: if you respin, maybe add \"and can\u0027t use a load-balancer for some reason\"","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e1aad25f53be3f0de253d4b82b4d2f27388268d3","unresolved":false,"context_lines":[{"line_number":38,"context_line":"  (i.e. \"http://10.0.1.0:9292\" or \"https://my.glance.server/image\")."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"NOTE: The preferred mechanism for endpoint discovery is via keystoneauth1"},{"line_number":41,"context_line":"loading options. Only use api_servers if you need multiple endpoints."},{"line_number":42,"context_line":"\"\"\"),"},{"line_number":43,"context_line":"    cfg.IntOpt(\u0027num_retries\u0027,"},{"line_number":44,"context_line":"        default\u003d0,"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_fb377ffe","line":41,"in_reply_to":"df3967d1_052326aa","updated":"2017-08-03 22:44:50.000000000","message":"Done","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"df2405fc4af11df8b515290e2107b3f8c937cd43","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    ks_loading.register_session_conf_options(conf, glance_group.name,"},{"line_number":153,"context_line":"                                             deprecated)"},{"line_number":154,"context_line":"    ks_loading.register_auth_conf_options(conf, glance_group.name)"},{"line_number":155,"context_line":"    conf.register_opts(confutils.get_ksa_adapter_opts(), group\u003dglance_group)"},{"line_number":156,"context_line":"    # TODO(efried): Remove once bug 1707273 is fixed"},{"line_number":157,"context_line":"    conf.register_opt(cfg.Opt(\u0027interface\u0027, type\u003dlambda x: None),"},{"line_number":158,"context_line":"                      group\u003dglance_group)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_c5419e3b","line":155,"updated":"2017-08-01 22:35:55.000000000","message":"I kinda feel like you could make a register_adapter_options function in utils.py that has these three lines and takes a conf and glance_group as arguments - that way you don\u0027t have to copy/pasta - and once ks_loading.register_adapter_conf_options works, it\u0027s an easy one-line swap and deletion of the function.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e1aad25f53be3f0de253d4b82b4d2f27388268d3","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    ks_loading.register_session_conf_options(conf, glance_group.name,"},{"line_number":153,"context_line":"                                             deprecated)"},{"line_number":154,"context_line":"    ks_loading.register_auth_conf_options(conf, glance_group.name)"},{"line_number":155,"context_line":"    conf.register_opts(confutils.get_ksa_adapter_opts(), group\u003dglance_group)"},{"line_number":156,"context_line":"    # TODO(efried): Remove once bug 1707273 is fixed"},{"line_number":157,"context_line":"    conf.register_opt(cfg.Opt(\u0027interface\u0027, type\u003dlambda x: None),"},{"line_number":158,"context_line":"                      group\u003dglance_group)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_757e091a","line":155,"in_reply_to":"df3967d1_3c92ae9f","updated":"2017-08-03 22:44:50.000000000","message":"Right, so the only reason I didn\u0027t do that was because of the differences in auth options.\n\nBut daah, that only affects list_opts.  So yeah, will do.\n\nThen again, I have to account for the deprecated session opts, which is gross.\n\nBut done.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"eec727da371bec0e656e75e915c1427edce41c21","unresolved":false,"context_lines":[{"line_number":152,"context_line":"    ks_loading.register_session_conf_options(conf, glance_group.name,"},{"line_number":153,"context_line":"                                             deprecated)"},{"line_number":154,"context_line":"    ks_loading.register_auth_conf_options(conf, glance_group.name)"},{"line_number":155,"context_line":"    conf.register_opts(confutils.get_ksa_adapter_opts(), group\u003dglance_group)"},{"line_number":156,"context_line":"    # TODO(efried): Remove once bug 1707273 is fixed"},{"line_number":157,"context_line":"    conf.register_opt(cfg.Opt(\u0027interface\u0027, type\u003dlambda x: None),"},{"line_number":158,"context_line":"                      group\u003dglance_group)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_3c92ae9f","line":155,"in_reply_to":"df3967d1_c5419e3b","updated":"2017-08-02 14:40:14.000000000","message":"(like in nova/conf/utils.py)","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"df2405fc4af11df8b515290e2107b3f8c937cd43","unresolved":false,"context_lines":[{"line_number":155,"context_line":"    conf.register_opts(confutils.get_ksa_adapter_opts(), group\u003dglance_group)"},{"line_number":156,"context_line":"    # TODO(efried): Remove once bug 1707273 is fixed"},{"line_number":157,"context_line":"    conf.register_opt(cfg.Opt(\u0027interface\u0027, type\u003dlambda x: None),"},{"line_number":158,"context_line":"                      group\u003dglance_group)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"def list_opts():"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_05a68611","line":158,"updated":"2017-08-01 22:35:55.000000000","message":"Can we do a similar thing with service_type to allow setting the default value for service_type for glance to \u0027image\u0027 (and similar for the other services?) There should be no need for a nova deployer to EVER set glance_service_type\u003dimage in a config file. They should really never set it to anything else either - but the default case should be that service_type defaults to \u0027image\u0027","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e1aad25f53be3f0de253d4b82b4d2f27388268d3","unresolved":false,"context_lines":[{"line_number":155,"context_line":"    conf.register_opts(confutils.get_ksa_adapter_opts(), group\u003dglance_group)"},{"line_number":156,"context_line":"    # TODO(efried): Remove once bug 1707273 is fixed"},{"line_number":157,"context_line":"    conf.register_opt(cfg.Opt(\u0027interface\u0027, type\u003dlambda x: None),"},{"line_number":158,"context_line":"                      group\u003dglance_group)"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"def list_opts():"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_d566d529","line":158,"in_reply_to":"df3967d1_05a68611","updated":"2017-08-03 22:44:50.000000000","message":"Yeah, I like that idea.  Will do.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05a0b60ff5d9748b1d293e797c43559e22b2bf51","unresolved":false,"context_lines":[{"line_number":39,"context_line":"* A list of any fully qualified url of the form \"scheme://hostname:port[/path]\""},{"line_number":40,"context_line":"  (i.e. \"http://10.0.1.0:9292\" or \"https://my.glance.server/image\")."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"NOTE: The preferred mechanism for endpoint discovery is via keystoneauth1"},{"line_number":43,"context_line":"loading options. Only use api_servers if you need multiple endpoints and can\u0027t"},{"line_number":44,"context_line":"use a load balancer for some reason."},{"line_number":45,"context_line":"\"\"\"),"},{"line_number":46,"context_line":"    cfg.IntOpt(\u0027num_retries\u0027,"},{"line_number":47,"context_line":"        default\u003d0,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_0f92264c","line":44,"range":{"start_line":42,"start_character":0,"end_line":44,"end_character":36},"updated":"2017-10-06 15:04:54.000000000","message":"nit: this should probably go above the \"Possible values\" section, which I think generally comes last in the help text.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"be8bc9e35f5e404a26cd9c9f4b42446c8b8f03d9","unresolved":false,"context_lines":[{"line_number":39,"context_line":"* A list of any fully qualified url of the form \"scheme://hostname:port[/path]\""},{"line_number":40,"context_line":"  (i.e. \"http://10.0.1.0:9292\" or \"https://my.glance.server/image\")."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"NOTE: The preferred mechanism for endpoint discovery is via keystoneauth1"},{"line_number":43,"context_line":"loading options. Only use api_servers if you need multiple endpoints and can\u0027t"},{"line_number":44,"context_line":"use a load balancer for some reason."},{"line_number":45,"context_line":"\"\"\"),"},{"line_number":46,"context_line":"    cfg.IntOpt(\u0027num_retries\u0027,"},{"line_number":47,"context_line":"        default\u003d0,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_dfb24e94","line":44,"range":{"start_line":42,"start_character":0,"end_line":44,"end_character":36},"in_reply_to":"7f515b1d_0f92264c","updated":"2017-10-09 13:24:33.000000000","message":"Done","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05a0b60ff5d9748b1d293e797c43559e22b2bf51","unresolved":false,"context_lines":[{"line_number":137,"context_line":"         help\u003d\u0027Enable or disable debug logging with glanceclient.\u0027)"},{"line_number":138,"context_line":"]"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"deprecated_opts \u003d {"},{"line_number":141,"context_line":"    \u0027insecure\u0027: [cfg.DeprecatedOpt(\u0027api_insecure\u0027, group\u003dglance_group.name)],"},{"line_number":142,"context_line":"    \u0027cafile\u0027: [cfg.DeprecatedOpt(\u0027ca_file\u0027, group\u003d\"ssl\")],"},{"line_number":143,"context_line":"    \u0027certfile\u0027: [cfg.DeprecatedOpt(\u0027cert_file\u0027, group\u003d\"ssl\")],"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_0f17c6a5","line":140,"range":{"start_line":140,"start_character":0,"end_line":140,"end_character":15},"updated":"2017-10-06 15:04:54.000000000","message":"nit: should we call this deprecated_auth_opts? Because enable_certificate_validation is also deprecated but not in this list, because it means something else.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"be8bc9e35f5e404a26cd9c9f4b42446c8b8f03d9","unresolved":false,"context_lines":[{"line_number":137,"context_line":"         help\u003d\u0027Enable or disable debug logging with glanceclient.\u0027)"},{"line_number":138,"context_line":"]"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"deprecated_opts \u003d {"},{"line_number":141,"context_line":"    \u0027insecure\u0027: [cfg.DeprecatedOpt(\u0027api_insecure\u0027, group\u003dglance_group.name)],"},{"line_number":142,"context_line":"    \u0027cafile\u0027: [cfg.DeprecatedOpt(\u0027ca_file\u0027, group\u003d\"ssl\")],"},{"line_number":143,"context_line":"    \u0027certfile\u0027: [cfg.DeprecatedOpt(\u0027cert_file\u0027, group\u003d\"ssl\")],"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_ff6e2afe","line":140,"range":{"start_line":140,"start_character":0,"end_line":140,"end_character":15},"in_reply_to":"7f515b1d_0f17c6a5","updated":"2017-10-09 13:24:33.000000000","message":"Done (deprecated_ksa_opts seemed more appropriate).","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05a0b60ff5d9748b1d293e797c43559e22b2bf51","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    return {glance_group: ("},{"line_number":158,"context_line":"        glance_opts +"},{"line_number":159,"context_line":"        ks_loading.get_session_conf_options() +"},{"line_number":160,"context_line":"        ks_loading.get_auth_plugin_conf_options(\u0027password\u0027) +"},{"line_number":161,"context_line":"        ks_loading.get_auth_plugin_conf_options(\u0027v2password\u0027) +"},{"line_number":162,"context_line":"        ks_loading.get_auth_plugin_conf_options(\u0027v3password\u0027) +"},{"line_number":163,"context_line":"        confutils.get_ksa_adapter_opts(DEFAULT_SERVICE_TYPE,"},{"line_number":164,"context_line":"                                       deprecated_opts\u003ddeprecated_opts))"},{"line_number":165,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_4fdffed5","line":162,"range":{"start_line":160,"start_character":8,"end_line":162,"end_character":63},"updated":"2017-10-06 15:04:54.000000000","message":"This is new, yes? Meaning this enables keystone v3 support for using the [glance] config within nova? Admittedly something we should have had by now.\n\nAlso, with ironic we only do:\n\nks_loading.get_auth_common_conf_options() +\nks_loading.get_auth_plugin_conf_options(\u0027v3password\u0027)\n\nSo why are these different?","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9e95735af9a500d5fc3ffe7a355aeaf0f6a1d696","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    return {glance_group: ("},{"line_number":158,"context_line":"        glance_opts +"},{"line_number":159,"context_line":"        ks_loading.get_session_conf_options() +"},{"line_number":160,"context_line":"        ks_loading.get_auth_plugin_conf_options(\u0027password\u0027) +"},{"line_number":161,"context_line":"        ks_loading.get_auth_plugin_conf_options(\u0027v2password\u0027) +"},{"line_number":162,"context_line":"        ks_loading.get_auth_plugin_conf_options(\u0027v3password\u0027) +"},{"line_number":163,"context_line":"        confutils.get_ksa_adapter_opts(DEFAULT_SERVICE_TYPE,"},{"line_number":164,"context_line":"                                       deprecated_opts\u003ddeprecated_opts))"},{"line_number":165,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_a1be49ab","line":162,"range":{"start_line":160,"start_character":8,"end_line":162,"end_character":63},"in_reply_to":"7f515b1d_3a05f011","updated":"2017-10-09 18:08:30.000000000","message":"\u003e In general with this series I was trying to change as little as possible. The ironic conf already had auth stuff, so I left it alone. In this case I pulled in all three auths to provide maximum flexibility (emulating... one of the other confs, can\u0027t remember which). But again, it\u0027s getting ripped out in the next patch.\n\nOK...if it wasn\u0027t required then I\u0027m not sure why add it at all, then you wouldn\u0027t be changing anything, unless it is required for the new stuff you\u0027re doing. It\u0027s just not really clear to me. I guess you need *something* that has auth options from ksa.\n\nIronic is doing:\n\nks_loading.get_auth_common_conf_options() +\n        ks_loading.get_auth_plugin_conf_options(\u0027v3password\u0027) +\n\nDoes the get_auth_common_conf_options give us password and v2password? It\u0027s not clear from:\n\nhttp://git.openstack.org/cgit/openstack/keystoneauth/tree/keystoneauth1/loading/conf.py#n30\n\nAnyway, weird and inconsistent but OK.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"be8bc9e35f5e404a26cd9c9f4b42446c8b8f03d9","unresolved":false,"context_lines":[{"line_number":157,"context_line":"    return {glance_group: ("},{"line_number":158,"context_line":"        glance_opts +"},{"line_number":159,"context_line":"        ks_loading.get_session_conf_options() +"},{"line_number":160,"context_line":"        ks_loading.get_auth_plugin_conf_options(\u0027password\u0027) +"},{"line_number":161,"context_line":"        ks_loading.get_auth_plugin_conf_options(\u0027v2password\u0027) +"},{"line_number":162,"context_line":"        ks_loading.get_auth_plugin_conf_options(\u0027v3password\u0027) +"},{"line_number":163,"context_line":"        confutils.get_ksa_adapter_opts(DEFAULT_SERVICE_TYPE,"},{"line_number":164,"context_line":"                                       deprecated_opts\u003ddeprecated_opts))"},{"line_number":165,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_3a05f011","line":162,"range":{"start_line":160,"start_character":8,"end_line":162,"end_character":63},"in_reply_to":"7f515b1d_4fdffed5","updated":"2017-10-09 13:24:33.000000000","message":"\u003e This is new, yes? Meaning this enables keystone v3 support for\n \u003e using the [glance] config within nova? Admittedly something we\n \u003e should have had by now.\n\nActually, we rip it out in https://review.openstack.org/#/c/490057/21/nova/conf/glance.py where we switch over to using the user context like we oughtta.\n\n \u003e Also, with ironic we only do:\n \u003e \n \u003e ks_loading.get_auth_common_conf_options() +\n \u003e ks_loading.get_auth_plugin_conf_options(\u0027v3password\u0027)\n \u003e \n \u003e So why are these different?\n\nIn general with this series I was trying to change as little as possible.  The ironic conf already had auth stuff, so I left it alone.  In this case I pulled in all three auths to provide maximum flexibility (emulating... one of the other confs, can\u0027t remember which).  But again, it\u0027s getting ripped out in the next patch.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"}],"nova/conf/ironic.py":[{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"df2405fc4af11df8b515290e2107b3f8c937cd43","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                       group\u003dironic_group.name)"},{"line_number":90,"context_line":"    # TODO(efried): Remove once bug 1707273 is fixed"},{"line_number":91,"context_line":"    conf.register_opt(cfg.Opt(\u0027interface\u0027, type\u003dlambda x: None),"},{"line_number":92,"context_line":"                      group\u003dironic_group.name)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"def list_opts():"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_25886a6f","line":92,"updated":"2017-08-01 22:35:55.000000000","message":"Default service_type to \u0027baremetal\u0027","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e1aad25f53be3f0de253d4b82b4d2f27388268d3","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                       group\u003dironic_group.name)"},{"line_number":90,"context_line":"    # TODO(efried): Remove once bug 1707273 is fixed"},{"line_number":91,"context_line":"    conf.register_opt(cfg.Opt(\u0027interface\u0027, type\u003dlambda x: None),"},{"line_number":92,"context_line":"                      group\u003dironic_group.name)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"def list_opts():"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_9b619308","line":92,"in_reply_to":"df3967d1_25886a6f","updated":"2017-08-03 22:44:50.000000000","message":"Done","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"55eeafa7d2efe6d125f6d04a958306a44b36f4b6","unresolved":false,"context_lines":[{"line_number":81,"context_line":"             \u0027changed. Set to 0 to disable timeout.\u0027),"},{"line_number":82,"context_line":"]"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"deprecated_opts \u003d {"},{"line_number":85,"context_line":"    \u0027endpoint_override\u0027: [cfg.DeprecatedOpt(\u0027api_endpoint\u0027,"},{"line_number":86,"context_line":"                                            group\u003dironic_group.name)]}"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def register_opts(conf):"}],"source_content_type":"text/x-python","patch_set":10,"id":"9f436f4f_724c20c7","line":86,"range":{"start_line":84,"start_character":0,"end_line":86,"end_character":70},"updated":"2017-08-09 15:45:04.000000000","message":"Does this deprecation need a reno?","commit_id":"ad303c206b3a192b77bd4d4a6680ce5d1bb73a57"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05a0b60ff5d9748b1d293e797c43559e22b2bf51","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    return {ironic_group: ("},{"line_number":98,"context_line":"        ironic_options +"},{"line_number":99,"context_line":"        ks_loading.get_session_conf_options() +"},{"line_number":100,"context_line":"        ks_loading.get_auth_common_conf_options() +"},{"line_number":101,"context_line":"        ks_loading.get_auth_plugin_conf_options(\u0027v3password\u0027) +"},{"line_number":102,"context_line":"        confutils.get_ksa_adapter_opts(DEFAULT_SERVICE_TYPE,"},{"line_number":103,"context_line":"                                       deprecated_opts\u003ddeprecated_opts))"},{"line_number":104,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_4d2b86ea","line":101,"range":{"start_line":100,"start_character":8,"end_line":101,"end_character":63},"updated":"2017-10-06 15:04:54.000000000","message":"For glance we\u0027re doing:\n\nks_loading.get_auth_plugin_conf_options(\u0027password\u0027) +\n        ks_loading.get_auth_plugin_conf_options(\u0027v2password\u0027) +\n        ks_loading.get_auth_plugin_conf_options(\u0027v3password\u0027)\n\nWhy are these different?","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"be8bc9e35f5e404a26cd9c9f4b42446c8b8f03d9","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    return {ironic_group: ("},{"line_number":98,"context_line":"        ironic_options +"},{"line_number":99,"context_line":"        ks_loading.get_session_conf_options() +"},{"line_number":100,"context_line":"        ks_loading.get_auth_common_conf_options() +"},{"line_number":101,"context_line":"        ks_loading.get_auth_plugin_conf_options(\u0027v3password\u0027) +"},{"line_number":102,"context_line":"        confutils.get_ksa_adapter_opts(DEFAULT_SERVICE_TYPE,"},{"line_number":103,"context_line":"                                       deprecated_opts\u003ddeprecated_opts))"},{"line_number":104,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_5a29cc87","line":101,"range":{"start_line":100,"start_character":8,"end_line":101,"end_character":63},"in_reply_to":"7f515b1d_4d2b86ea","updated":"2017-10-09 13:24:33.000000000","message":"Here I had the opportunity to maintain \"compatibility\" since there was already an auth clause.  Also see comments at https://review.openstack.org/#/c/488137/22/nova/conf/glance.py@162","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"}],"nova/conf/utils.py":[{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"eec727da371bec0e656e75e915c1427edce41c21","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def get_ksa_adapter_opts():"},{"line_number":24,"context_line":"    opts \u003d ksa_loading.get_adapter_conf_options(include_deprecated\u003dFalse)"},{"line_number":25,"context_line":"    cfg.set_defaults(opts, valid_interfaces\u003d[\u0027internal\u0027, \u0027admin\u0027, \u0027public\u0027])"},{"line_number":26,"context_line":"    return opts"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_fc28a686","line":25,"updated":"2017-08-02 14:40:14.000000000","message":"Let\u0027s remove admin - it\u0027s discouraged to use admin interface by the keystone team.\n\nThis is also where I should have made the comment about \"can we set a default for service_type\". So add an argument to get_ksa_adapter_opts for service_type so you can set the default here.\n\nAlso - probably want to add a parameter here for min_version/max_version so that you can pass 1.0, 2.latest for glance and 2.0, 3.latest for cinder.\n\nActually - maybe forget that- we need to REMOVE min_version/max_version from the adapater opts - they aren\u0027t reasonable things for the admin to set - nova is the one that knows what versions nova supports.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e1aad25f53be3f0de253d4b82b4d2f27388268d3","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"def get_ksa_adapter_opts():"},{"line_number":24,"context_line":"    opts \u003d ksa_loading.get_adapter_conf_options(include_deprecated\u003dFalse)"},{"line_number":25,"context_line":"    cfg.set_defaults(opts, valid_interfaces\u003d[\u0027internal\u0027, \u0027admin\u0027, \u0027public\u0027])"},{"line_number":26,"context_line":"    return opts"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_ca9bc263","line":25,"in_reply_to":"df3967d1_fc28a686","updated":"2017-08-03 22:44:50.000000000","message":"Remove admin - check.\nSet default service type - check.\nRemove version stuff from adapter opts - you mean remove them here, not from ksa, right?  Assuming that\u0027s the case, will do.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6ef841b4d82feccf378cb67036934840fdc4adc0","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                    keystoneauth1.loading.session.Session.register_conf_options"},{"line_number":35,"context_line":"    :return: List of cfg.Opts."},{"line_number":36,"context_line":"    \"\"\""},{"line_number":37,"context_line":"    # TODO(efried): pass deprecated_opts in here when bug #1708673 is resolved."},{"line_number":38,"context_line":"    opts \u003d ks_loading.get_adapter_conf_options(include_deprecated\u003dFalse)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    # TODO(efried): Remove when bug #1708673 is resolved."}],"source_content_type":"text/x-python","patch_set":13,"id":"7f287b81_8d7c1621","line":37,"range":{"start_line":37,"start_character":59,"end_line":37,"end_character":66},"updated":"2017-09-03 01:55:56.000000000","message":"This is in ksa 3.2.0, which is working its way through g-r now: https://review.openstack.org/#/c/500011/","commit_id":"5aad7b7f03e9941378ec52c21078a4a2e31aed35"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"105182d6fd33c14451faa73cc241161ca4904418","unresolved":false,"context_lines":[{"line_number":34,"context_line":"                    keystoneauth1.loading.session.Session.register_conf_options"},{"line_number":35,"context_line":"    :return: List of cfg.Opts."},{"line_number":36,"context_line":"    \"\"\""},{"line_number":37,"context_line":"    # TODO(efried): pass deprecated_opts in here when bug #1708673 is resolved."},{"line_number":38,"context_line":"    opts \u003d ks_loading.get_adapter_conf_options(include_deprecated\u003dFalse)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    # TODO(efried): Remove when bug #1708673 is resolved."}],"source_content_type":"text/x-python","patch_set":13,"id":"7f287b81_8874a8d0","line":37,"range":{"start_line":37,"start_character":59,"end_line":37,"end_character":66},"in_reply_to":"7f287b81_8d7c1621","updated":"2017-09-07 22:05:22.000000000","message":"Done","commit_id":"5aad7b7f03e9941378ec52c21078a4a2e31aed35"},{"author":{"_account_id":20312,"name":"Jacek Tomasiak","email":"jacek.tomasiak@gmail.com","username":"skazi"},"change_message_id":"475ff5febfba04681e65b7df3230faf34d76f40e","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # Override defaults that make sense for nova"},{"line_number":61,"context_line":"    cfg.set_defaults(opts,"},{"line_number":62,"context_line":"                     valid_interfaces\u003d[\u0027internal\u0027, \u0027public\u0027],"},{"line_number":63,"context_line":"                     service_type\u003ddefault_service_type)"},{"line_number":64,"context_line":"    return opts"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9f436f4f_e2851dae","line":62,"updated":"2017-08-17 09:49:58.000000000","message":"It would be good to make this configurable. Currently ironic uses public interface by default and while internal is probably better in most cases, hardcoding this might break some setups.","commit_id":"5aad7b7f03e9941378ec52c21078a4a2e31aed35"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"b70862360cf0304931d7a430dc08df5ee77690e5","unresolved":false,"context_lines":[{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    # Override defaults that make sense for nova"},{"line_number":61,"context_line":"    cfg.set_defaults(opts,"},{"line_number":62,"context_line":"                     valid_interfaces\u003d[\u0027internal\u0027, \u0027public\u0027],"},{"line_number":63,"context_line":"                     service_type\u003ddefault_service_type)"},{"line_number":64,"context_line":"    return opts"},{"line_number":65,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"9f436f4f_23a2024d","line":62,"in_reply_to":"9f436f4f_e2851dae","updated":"2017-08-17 15:00:27.000000000","message":"It is configurable, e.g.\n\n [ironic]\n valid_interfaces \u003d admin\n\nThis is just overriding the default from ksa.","commit_id":"5aad7b7f03e9941378ec52c21078a4a2e31aed35"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6ef841b4d82feccf378cb67036934840fdc4adc0","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    ks_loading.register_auth_conf_options(conf, group)"},{"line_number":91,"context_line":"    conf.register_opts(get_ksa_adapter_opts("},{"line_number":92,"context_line":"        default_service_type, deprecated_opts\u003ddeprecated_opts), group\u003dgroup)"},{"line_number":93,"context_line":"    # TODO(efried): Remove once bug 1707273 is fixed"},{"line_number":94,"context_line":"    conf.register_opt(_dummy_opt(\u0027interface\u0027), group\u003dgroup)"},{"line_number":95,"context_line":"    # Have to register dummies for the version-related opts we removed"},{"line_number":96,"context_line":"    for name in _ADAPTER_VERSION_OPTS:"}],"source_content_type":"text/x-python","patch_set":13,"id":"7f287b81_6d79ea2d","line":93,"range":{"start_line":93,"start_character":36,"end_line":93,"end_character":43},"updated":"2017-09-03 01:55:56.000000000","message":"ditto","commit_id":"5aad7b7f03e9941378ec52c21078a4a2e31aed35"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"105182d6fd33c14451faa73cc241161ca4904418","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    ks_loading.register_auth_conf_options(conf, group)"},{"line_number":91,"context_line":"    conf.register_opts(get_ksa_adapter_opts("},{"line_number":92,"context_line":"        default_service_type, deprecated_opts\u003ddeprecated_opts), group\u003dgroup)"},{"line_number":93,"context_line":"    # TODO(efried): Remove once bug 1707273 is fixed"},{"line_number":94,"context_line":"    conf.register_opt(_dummy_opt(\u0027interface\u0027), group\u003dgroup)"},{"line_number":95,"context_line":"    # Have to register dummies for the version-related opts we removed"},{"line_number":96,"context_line":"    for name in _ADAPTER_VERSION_OPTS:"}],"source_content_type":"text/x-python","patch_set":13,"id":"7f287b81_885dc848","line":93,"range":{"start_line":93,"start_character":36,"end_line":93,"end_character":43},"in_reply_to":"7f287b81_6d79ea2d","updated":"2017-09-07 22:05:22.000000000","message":"Done","commit_id":"5aad7b7f03e9941378ec52c21078a4a2e31aed35"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"386cb5f9613f9511cf348b3fee879bafeeec76b4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2017 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":16,"id":"7f287b81_b88af260","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":22},"updated":"2017-09-07 22:12:25.000000000","message":"x","commit_id":"e9d58d970e83640ff8e279262d2c42e06186f5d3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c3be2190fb46c03494da9a802634c22464c0ba1f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2017 OpenStack Foundation"},{"line_number":2,"context_line":"# All Rights Reserved."},{"line_number":3,"context_line":"#"},{"line_number":4,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":5,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f2577a7_cdd740ee","line":2,"range":{"start_line":2,"start_character":0,"end_line":2,"end_character":22},"in_reply_to":"7f287b81_b88af260","updated":"2017-09-15 22:08:39.000000000","message":"Done","commit_id":"e9d58d970e83640ff8e279262d2c42e06186f5d3"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"95fa7c5f22b6d58195e7dd6c2ee6b1e246118065","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        conf.register_opt(_dummy_opt(name), group\u003dgroup)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"# NOTE(efried): Required for docs build."},{"line_number":84,"context_line":"def list_opts():"},{"line_number":85,"context_line":"    return {}"}],"source_content_type":"text/x-python","patch_set":21,"id":"7f515b1d_48b262e8","line":85,"range":{"start_line":83,"start_character":0,"end_line":85,"end_character":13},"updated":"2017-09-26 07:01:38.000000000","message":"this is because you put this file into nova/conf/ folder\nthis is a util function why can\u0027t put to other place?","commit_id":"40ecb2949c024d34026fe0fac0c6f95a6f3e1ecc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8e4e4dfed5a7ce95a3fc6478cbe1e0df00f02ebe","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        conf.register_opt(_dummy_opt(name), group\u003dgroup)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"# NOTE(efried): Required for docs build."},{"line_number":84,"context_line":"def list_opts():"},{"line_number":85,"context_line":"    return {}"}],"source_content_type":"text/x-python","patch_set":21,"id":"7f515b1d_fc70aaa7","line":85,"range":{"start_line":83,"start_character":0,"end_line":85,"end_character":13},"in_reply_to":"7f515b1d_48b262e8","updated":"2017-09-26 12:59:39.000000000","message":"Because the methods are registering conf options, and being used exclusively by modules in the same package.  Do you have a suggestion for somewhere else to put it?","commit_id":"40ecb2949c024d34026fe0fac0c6f95a6f3e1ecc"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"fcd7fb22d5c795fb7344a1cbbd08687d1136c4c7","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        conf.register_opt(_dummy_opt(name), group\u003dgroup)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"# NOTE(efried): Required for docs build."},{"line_number":84,"context_line":"def list_opts():"},{"line_number":85,"context_line":"    return {}"}],"source_content_type":"text/x-python","patch_set":21,"id":"7f515b1d_4b2104b0","line":85,"range":{"start_line":83,"start_character":0,"end_line":85,"end_character":13},"in_reply_to":"7f515b1d_a50b1822","updated":"2017-09-27 16:53:16.000000000","message":"I think respinning the opts accumulation code in this patch is beyond scope. That something that can be done independently.","commit_id":"40ecb2949c024d34026fe0fac0c6f95a6f3e1ecc"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"665aba02c8506d7e3758b974a45bc714e51ffe2c","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        conf.register_opt(_dummy_opt(name), group\u003dgroup)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"# NOTE(efried): Required for docs build."},{"line_number":84,"context_line":"def list_opts():"},{"line_number":85,"context_line":"    return {}"}],"source_content_type":"text/x-python","patch_set":21,"id":"7f515b1d_a50b1822","line":85,"range":{"start_line":83,"start_character":0,"end_line":85,"end_character":13},"in_reply_to":"7f515b1d_fc70aaa7","updated":"2017-09-27 05:52:54.000000000","message":"I believe it\u0027s because \nhttps://github.com/openstack/nova/blob/master/nova/conf/opts.py#L53\nso you have to provide list_opts function\n\nmaybe put into utils function outside this folder?\nor at least you need to provide some comments for why we have to put this file in this folder and add the list_opts function here to avoid confusion later","commit_id":"40ecb2949c024d34026fe0fac0c6f95a6f3e1ecc"}],"nova/exception.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05a0b60ff5d9748b1d293e797c43559e22b2bf51","unresolved":false,"context_lines":[{"line_number":970,"context_line":""},{"line_number":971,"context_line":"class ConfGroupForServiceTypeNotFound(ServiceNotFound):"},{"line_number":972,"context_line":"    msg_fmt \u003d _(\"No conf group name could be found for service type \""},{"line_number":973,"context_line":"                \"%(stype)s.  Please report this bug.\")"},{"line_number":974,"context_line":""},{"line_number":975,"context_line":""},{"line_number":976,"context_line":"class ServiceBinaryExists(NovaException):"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_ed10f2aa","line":973,"range":{"start_line":973,"start_character":29,"end_line":973,"end_character":51},"updated":"2017-10-06 15:04:54.000000000","message":"at http://bugs.launchpad.net/nova/ ?\n\nWhat would we do if someone reported this? Does it mean someone is using a service type that isn\u0027t in the service types authority and then we have to get it added there, or at least discuss it?\n\nShould we include a link in this error message to the valid known list of service types in said authority?\n\nThis could be new and weird for people so I\u0027d like to make sure we can make this as helpful as possible if someone hits this.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2adac05a419aba4114e5ffc58094eef5a157263c","unresolved":false,"context_lines":[{"line_number":970,"context_line":""},{"line_number":971,"context_line":"class ConfGroupForServiceTypeNotFound(ServiceNotFound):"},{"line_number":972,"context_line":"    msg_fmt \u003d _(\"No conf group name could be found for service type \""},{"line_number":973,"context_line":"                \"%(stype)s.  Please report this bug.\")"},{"line_number":974,"context_line":""},{"line_number":975,"context_line":""},{"line_number":976,"context_line":"class ServiceBinaryExists(NovaException):"}],"source_content_type":"text/x-python","patch_set":22,"id":"5f4e5783_456a6b80","line":973,"range":{"start_line":973,"start_character":29,"end_line":973,"end_character":51},"in_reply_to":"7f515b1d_410af578","updated":"2017-10-11 15:08:50.000000000","message":"Done: https://review.openstack.org/511261","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9e95735af9a500d5fc3ffe7a355aeaf0f6a1d696","unresolved":false,"context_lines":[{"line_number":970,"context_line":""},{"line_number":971,"context_line":"class ConfGroupForServiceTypeNotFound(ServiceNotFound):"},{"line_number":972,"context_line":"    msg_fmt \u003d _(\"No conf group name could be found for service type \""},{"line_number":973,"context_line":"                \"%(stype)s.  Please report this bug.\")"},{"line_number":974,"context_line":""},{"line_number":975,"context_line":""},{"line_number":976,"context_line":"class ServiceBinaryExists(NovaException):"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_410af578","line":973,"range":{"start_line":973,"start_character":29,"end_line":973,"end_character":51},"in_reply_to":"7f515b1d_55063dd0","updated":"2017-10-09 18:08:30.000000000","message":"If it can\u0027t happen, then I\u0027d say just remove the \"Please report this bug.\" part for now.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"be8bc9e35f5e404a26cd9c9f4b42446c8b8f03d9","unresolved":false,"context_lines":[{"line_number":970,"context_line":""},{"line_number":971,"context_line":"class ConfGroupForServiceTypeNotFound(ServiceNotFound):"},{"line_number":972,"context_line":"    msg_fmt \u003d _(\"No conf group name could be found for service type \""},{"line_number":973,"context_line":"                \"%(stype)s.  Please report this bug.\")"},{"line_number":974,"context_line":""},{"line_number":975,"context_line":""},{"line_number":976,"context_line":"class ServiceBinaryExists(NovaException):"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_55063dd0","line":973,"range":{"start_line":973,"start_character":29,"end_line":973,"end_character":51},"in_reply_to":"7f515b1d_ed10f2aa","updated":"2017-10-09 13:24:33.000000000","message":"In the current and projected usage for this blueprint, it\u0027s really not possible, because we\u0027re hardcoding the service types being passed to get_ksa_adapter (never taking them in from the outside), and even the earliest versions of the STA data have all those service types registered with the appropriate project names.\n\nSo it\u0027s really just if get_ksa_adapter gets used for some purpose in the future where the above isn\u0027t the case.  If that future usage is getting the service type from the user, we\u0027re subject to misspellings etc.  If it\u0027s relying on a newly-minted service type, it could be that the local copy of the STA data in os-service-types needs a refresh.  (Hopefully we don\u0027t merge that patch before STA itself is updated.)\n\nIn the spirit of not trying to anticipate the future, I could just leave that error check out of get_ksa_adapter.  Future-bug would get a cryptic exception (about None not being a valid conf group, perhaps).","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"}],"nova/image/glance.py":[{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"bb9cda8f0bf0d2b8d29d3bfd1a172e0101a7e58a","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                    \"including scheme (http / https)\", api_server)"},{"line_number":125,"context_line":"            api_servers.append(api_server)"},{"line_number":126,"context_line":"    else:"},{"line_number":127,"context_line":"        api_servers.append(utils.get_endpoint_data(\u0027glance\u0027).url)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    random.shuffle(api_servers)"},{"line_number":130,"context_line":"    return itertools.cycle(api_servers)"}],"source_content_type":"text/x-python","patch_set":1,"id":"ff346bd7_7dc90eaa","line":127,"updated":"2017-07-27 20:32:16.000000000","message":"from a dev perspective it would honestly be nice if I could pass \u0027image\u0027 instead of \u0027glance\u0027. But I understand this is where we statnd.","commit_id":"ed9cb65cfa72289ab9d5b291ba887c6c6d869105"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c55f57d26d82d5a4bdffc95a51f1e2a7761a0027","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                    \"including scheme (http / https)\", api_server)"},{"line_number":125,"context_line":"            api_servers.append(api_server)"},{"line_number":126,"context_line":"    else:"},{"line_number":127,"context_line":"        api_servers.append(utils.get_endpoint_data(\u0027glance\u0027).url)"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    random.shuffle(api_servers)"},{"line_number":130,"context_line":"    return itertools.cycle(api_servers)"}],"source_content_type":"text/x-python","patch_set":1,"id":"df3967d1_10b83074","line":127,"in_reply_to":"ff346bd7_7dc90eaa","updated":"2017-07-31 20:35:54.000000000","message":"morgan had a similar comment, and suggested we could do the lookup the other way in nova.utils.get_endpoint_data.  Working that out in PS5.","commit_id":"ed9cb65cfa72289ab9d5b291ba887c6c6d869105"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"df2405fc4af11df8b515290e2107b3f8c937cd43","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    else:"},{"line_number":127,"context_line":"        # TODO(efried): This should use .url instead of .catalog_url.  See"},{"line_number":128,"context_line":"        # bugs 1707993 and 1707995"},{"line_number":129,"context_line":"        api_servers.append(utils.get_endpoint_data(\u0027image\u0027).catalog_url)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    random.shuffle(api_servers)"},{"line_number":132,"context_line":"    return itertools.cycle(api_servers)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_8592769d","line":129,"updated":"2017-08-01 22:35:55.000000000","message":"++","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ff57512157bb8e0fa9cbca93adac783fd283ea96","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    else:"},{"line_number":127,"context_line":"        # TODO(efried): This should use .url instead of .catalog_url.  See"},{"line_number":128,"context_line":"        # bugs 1707993 and 1707995"},{"line_number":129,"context_line":"        api_servers.append(utils.get_endpoint_data(\u0027image\u0027).catalog_url)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    random.shuffle(api_servers)"},{"line_number":132,"context_line":"    return itertools.cycle(api_servers)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_7c3cb6c7","line":129,"range":{"start_line":129,"start_character":27,"end_line":129,"end_character":58},"updated":"2017-08-02 14:14:34.000000000","message":"Add a TODO here to get a reasonable auth/session from somewhere so the operator doesn\u0027t *have* to provide creds in the conf to use anything other than endpoint_override.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e1aad25f53be3f0de253d4b82b4d2f27388268d3","unresolved":false,"context_lines":[{"line_number":126,"context_line":"    else:"},{"line_number":127,"context_line":"        # TODO(efried): This should use .url instead of .catalog_url.  See"},{"line_number":128,"context_line":"        # bugs 1707993 and 1707995"},{"line_number":129,"context_line":"        api_servers.append(utils.get_endpoint_data(\u0027image\u0027).catalog_url)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    random.shuffle(api_servers)"},{"line_number":132,"context_line":"    return itertools.cycle(api_servers)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_2bd8eb1b","line":129,"range":{"start_line":129,"start_character":27,"end_line":129,"end_character":58},"in_reply_to":"df3967d1_7c3cb6c7","updated":"2017-08-03 22:44:50.000000000","message":"Done","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"386cb5f9613f9511cf348b3fee879bafeeec76b4","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    \"\"\"Shuffle a list of service endpoints and return an iterator that will"},{"line_number":111,"context_line":"    cycle through the list, looping around to the beginning if necessary."},{"line_number":112,"context_line":"    \"\"\""},{"line_number":113,"context_line":"    # NOTE(efried): utils.get_endpoint_data() is the preferred mechanism for"},{"line_number":114,"context_line":"    # endpoint discovery.  Only use `api_servers` if you really need to shuffle"},{"line_number":115,"context_line":"    # multiple endpoints."},{"line_number":116,"context_line":"    api_servers \u003d []"}],"source_content_type":"text/x-python","patch_set":16,"id":"7f287b81_d8e25e30","line":113,"range":{"start_line":113,"start_character":26,"end_line":113,"end_character":43},"updated":"2017-09-07 22:12:25.000000000","message":"get_ksa_adapter().get_endpoint()","commit_id":"e9d58d970e83640ff8e279262d2c42e06186f5d3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"c3be2190fb46c03494da9a802634c22464c0ba1f","unresolved":false,"context_lines":[{"line_number":110,"context_line":"    \"\"\"Shuffle a list of service endpoints and return an iterator that will"},{"line_number":111,"context_line":"    cycle through the list, looping around to the beginning if necessary."},{"line_number":112,"context_line":"    \"\"\""},{"line_number":113,"context_line":"    # NOTE(efried): utils.get_endpoint_data() is the preferred mechanism for"},{"line_number":114,"context_line":"    # endpoint discovery.  Only use `api_servers` if you really need to shuffle"},{"line_number":115,"context_line":"    # multiple endpoints."},{"line_number":116,"context_line":"    api_servers \u003d []"}],"source_content_type":"text/x-python","patch_set":16,"id":"5f2577a7_0dfb0879","line":113,"range":{"start_line":113,"start_character":26,"end_line":113,"end_character":43},"in_reply_to":"7f287b81_d8e25e30","updated":"2017-09-15 22:08:39.000000000","message":"Done","commit_id":"e9d58d970e83640ff8e279262d2c42e06186f5d3"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"6def1ee686055e50b455373c99ce5c677a3d8299","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    api_servers \u003d []"},{"line_number":117,"context_line":"    if CONF.glance.api_servers:"},{"line_number":118,"context_line":"        for api_server in CONF.glance.api_servers:"},{"line_number":119,"context_line":"            if \u0027//\u0027 not in api_server:"},{"line_number":120,"context_line":"                api_server \u003d \u0027http://\u0027 + api_server"},{"line_number":121,"context_line":"                # NOTE(sdague): remove in O."},{"line_number":122,"context_line":"                LOG.warning(\"No protocol specified in for api_server \u0027%s\u0027, \""},{"line_number":123,"context_line":"                            \"please update [glance] api_servers with fully \""},{"line_number":124,"context_line":"                            \"qualified url including scheme (http / https)\","},{"line_number":125,"context_line":"                            api_server)"},{"line_number":126,"context_line":"            api_servers.append(api_server)"},{"line_number":127,"context_line":"    else:"},{"line_number":128,"context_line":"        # TODO(efried): Plumb in a reasonable auth from callers\u0027 contexts"}],"source_content_type":"text/x-python","patch_set":17,"id":"ff5d4b2f_8abb00e4","line":125,"range":{"start_line":119,"start_character":0,"end_line":125,"end_character":39},"updated":"2017-09-19 12:07:10.000000000","message":"we can probably remove this now as having sufficient warning","commit_id":"e414ca2d1700e50c6802f61be84534dd78cf8f00"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"044705cbeea8d8bf49ebb8520ad84bde845abd3e","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    api_servers \u003d []"},{"line_number":117,"context_line":"    if CONF.glance.api_servers:"},{"line_number":118,"context_line":"        for api_server in CONF.glance.api_servers:"},{"line_number":119,"context_line":"            if \u0027//\u0027 not in api_server:"},{"line_number":120,"context_line":"                api_server \u003d \u0027http://\u0027 + api_server"},{"line_number":121,"context_line":"                # NOTE(sdague): remove in O."},{"line_number":122,"context_line":"                LOG.warning(\"No protocol specified in for api_server \u0027%s\u0027, \""},{"line_number":123,"context_line":"                            \"please update [glance] api_servers with fully \""},{"line_number":124,"context_line":"                            \"qualified url including scheme (http / https)\","},{"line_number":125,"context_line":"                            api_server)"},{"line_number":126,"context_line":"            api_servers.append(api_server)"},{"line_number":127,"context_line":"    else:"},{"line_number":128,"context_line":"        # TODO(efried): Plumb in a reasonable auth from callers\u0027 contexts"}],"source_content_type":"text/x-python","patch_set":17,"id":"ff5d4b2f_01548ec9","line":125,"range":{"start_line":119,"start_character":0,"end_line":125,"end_character":39},"in_reply_to":"ff5d4b2f_8abb00e4","updated":"2017-09-19 15:57:47.000000000","message":"Okay, will submit a separate patch.","commit_id":"e414ca2d1700e50c6802f61be84534dd78cf8f00"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"95fa7c5f22b6d58195e7dd6c2ee6b1e246118065","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        for api_server in CONF.glance.api_servers:"},{"line_number":119,"context_line":"            if \u0027//\u0027 not in api_server:"},{"line_number":120,"context_line":"                api_server \u003d \u0027http://\u0027 + api_server"},{"line_number":121,"context_line":"                # NOTE(sdague): remove in O."},{"line_number":122,"context_line":"                LOG.warning(\"No protocol specified in for api_server \u0027%s\u0027, \""},{"line_number":123,"context_line":"                            \"please update [glance] api_servers with fully \""},{"line_number":124,"context_line":"                            \"qualified url including scheme (http / https)\","}],"source_content_type":"text/x-python","patch_set":21,"id":"7f515b1d_08e7ca14","line":121,"range":{"start_line":121,"start_character":16,"end_line":121,"end_character":44},"updated":"2017-09-26 07:01:38.000000000","message":"just curious, should this can be removed as well?\nany case we can follow up this patch","commit_id":"40ecb2949c024d34026fe0fac0c6f95a6f3e1ecc"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"8c19856a29c718b037c992756e9e94d62bfb0e27","unresolved":false,"context_lines":[{"line_number":118,"context_line":"        for api_server in CONF.glance.api_servers:"},{"line_number":119,"context_line":"            if \u0027//\u0027 not in api_server:"},{"line_number":120,"context_line":"                api_server \u003d \u0027http://\u0027 + api_server"},{"line_number":121,"context_line":"                # NOTE(sdague): remove in O."},{"line_number":122,"context_line":"                LOG.warning(\"No protocol specified in for api_server \u0027%s\u0027, \""},{"line_number":123,"context_line":"                            \"please update [glance] api_servers with fully \""},{"line_number":124,"context_line":"                            \"qualified url including scheme (http / https)\","}],"source_content_type":"text/x-python","patch_set":21,"id":"7f515b1d_88797afd","line":121,"range":{"start_line":121,"start_character":16,"end_line":121,"end_character":44},"in_reply_to":"7f515b1d_08e7ca14","updated":"2017-09-26 07:06:32.000000000","message":"ok, saw here\nhttps://review.openstack.org/#/c/505317/5/nova/image/glance.py","commit_id":"40ecb2949c024d34026fe0fac0c6f95a6f3e1ecc"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"95fa7c5f22b6d58195e7dd6c2ee6b1e246118065","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        api_servers.append(ksa_adap.endpoint_override or"},{"line_number":133,"context_line":"                           ksa_adap.get_endpoint_data().catalog_url)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    random.shuffle(api_servers)"},{"line_number":136,"context_line":"    return itertools.cycle(api_servers)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7f515b1d_88ddfa15","line":135,"range":{"start_line":135,"start_character":4,"end_line":135,"end_character":31},"updated":"2017-09-26 07:01:38.000000000","message":"should this move to line 126 as if api_servers is not defined, we will use endpoint by given order?","commit_id":"40ecb2949c024d34026fe0fac0c6f95a6f3e1ecc"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"8e4e4dfed5a7ce95a3fc6478cbe1e0df00f02ebe","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        api_servers.append(ksa_adap.endpoint_override or"},{"line_number":133,"context_line":"                           ksa_adap.get_endpoint_data().catalog_url)"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"    random.shuffle(api_servers)"},{"line_number":136,"context_line":"    return itertools.cycle(api_servers)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"7f515b1d_7c927aa0","line":135,"range":{"start_line":135,"start_character":4,"end_line":135,"end_character":31},"in_reply_to":"7f515b1d_88ddfa15","updated":"2017-09-26 12:59:39.000000000","message":"Yeah, could move it up, but it\u0027s because the `else` clause will only ever return a single endpoint, in which case this line is a no-op.","commit_id":"40ecb2949c024d34026fe0fac0c6f95a6f3e1ecc"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05a0b60ff5d9748b1d293e797c43559e22b2bf51","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            if \u0027//\u0027 not in api_server:"},{"line_number":120,"context_line":"                api_server \u003d \u0027http://\u0027 + api_server"},{"line_number":121,"context_line":"                # NOTE(sdague): remove in O."},{"line_number":122,"context_line":"                LOG.warning(\"No protocol specified in for api_server \u0027%s\u0027, \""},{"line_number":123,"context_line":"                            \"please update [glance] api_servers with fully \""},{"line_number":124,"context_line":"                            \"qualified url including scheme (http / https)\","},{"line_number":125,"context_line":"                            api_server)"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_2d65ea45","line":122,"range":{"start_line":122,"start_character":51,"end_line":122,"end_character":53},"updated":"2017-10-06 15:04:54.000000000","message":"in URL?\n\nI know this is unrelated, but just noticed it.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"be8bc9e35f5e404a26cd9c9f4b42446c8b8f03d9","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            if \u0027//\u0027 not in api_server:"},{"line_number":120,"context_line":"                api_server \u003d \u0027http://\u0027 + api_server"},{"line_number":121,"context_line":"                # NOTE(sdague): remove in O."},{"line_number":122,"context_line":"                LOG.warning(\"No protocol specified in for api_server \u0027%s\u0027, \""},{"line_number":123,"context_line":"                            \"please update [glance] api_servers with fully \""},{"line_number":124,"context_line":"                            \"qualified url including scheme (http / https)\","},{"line_number":125,"context_line":"                            api_server)"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_15a8c589","line":122,"range":{"start_line":122,"start_character":51,"end_line":122,"end_character":53},"in_reply_to":"7f515b1d_2d65ea45","updated":"2017-10-09 13:24:33.000000000","message":"Probably \u0027for\u0027 should be removed.\n\nBut this whole chunk goes away later in the series (though unrelated to the blueprint): https://review.openstack.org/#/c/505317/6/nova/image/glance.py","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05a0b60ff5d9748b1d293e797c43559e22b2bf51","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        random.shuffle(api_servers)"},{"line_number":128,"context_line":"    else:"},{"line_number":129,"context_line":"        # TODO(efried): Plumb in a reasonable auth from callers\u0027 contexts"},{"line_number":130,"context_line":"        ksa_adap \u003d utils.get_ksa_adapter(\u0027image\u0027, min_version\u003d\u00272.0\u0027,"},{"line_number":131,"context_line":"                                         max_version\u003d\u00272.latest\u0027)"},{"line_number":132,"context_line":"        # TODO(efried): Use ksa_adap.get_endpoint() when bug #1707995 is fixed."},{"line_number":133,"context_line":"        api_servers.append(ksa_adap.endpoint_override or"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_ad50ba5f","line":130,"range":{"start_line":130,"start_character":41,"end_line":130,"end_character":48},"updated":"2017-10-06 15:04:54.000000000","message":"nova.conf.glance.DEFAULT_SERVICE_TYPE?","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"be8bc9e35f5e404a26cd9c9f4b42446c8b8f03d9","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        random.shuffle(api_servers)"},{"line_number":128,"context_line":"    else:"},{"line_number":129,"context_line":"        # TODO(efried): Plumb in a reasonable auth from callers\u0027 contexts"},{"line_number":130,"context_line":"        ksa_adap \u003d utils.get_ksa_adapter(\u0027image\u0027, min_version\u003d\u00272.0\u0027,"},{"line_number":131,"context_line":"                                         max_version\u003d\u00272.latest\u0027)"},{"line_number":132,"context_line":"        # TODO(efried): Use ksa_adap.get_endpoint() when bug #1707995 is fixed."},{"line_number":133,"context_line":"        api_servers.append(ksa_adap.endpoint_override or"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_55de3d11","line":130,"range":{"start_line":130,"start_character":41,"end_line":130,"end_character":48},"in_reply_to":"7f515b1d_ad50ba5f","updated":"2017-10-09 13:24:33.000000000","message":"Done","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05a0b60ff5d9748b1d293e797c43559e22b2bf51","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    else:"},{"line_number":129,"context_line":"        # TODO(efried): Plumb in a reasonable auth from callers\u0027 contexts"},{"line_number":130,"context_line":"        ksa_adap \u003d utils.get_ksa_adapter(\u0027image\u0027, min_version\u003d\u00272.0\u0027,"},{"line_number":131,"context_line":"                                         max_version\u003d\u00272.latest\u0027)"},{"line_number":132,"context_line":"        # TODO(efried): Use ksa_adap.get_endpoint() when bug #1707995 is fixed."},{"line_number":133,"context_line":"        api_servers.append(ksa_adap.endpoint_override or"},{"line_number":134,"context_line":"                           ksa_adap.get_endpoint_data().catalog_url)"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_2df3aa75","line":131,"range":{"start_line":131,"start_character":54,"end_line":131,"end_character":62},"updated":"2017-10-06 15:04:54.000000000","message":"Looking at:\n\nhttps://developer.openstack.org/api-ref/image/versions/index.html#list-api-versions\n\nDoes KSA have some special sauce to transform \"2.latest\" into whatever the max_version is available from the server, like 2.6 right now? Or does Glance actually recognize requests with \"2.latest\"?","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"be8bc9e35f5e404a26cd9c9f4b42446c8b8f03d9","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    else:"},{"line_number":129,"context_line":"        # TODO(efried): Plumb in a reasonable auth from callers\u0027 contexts"},{"line_number":130,"context_line":"        ksa_adap \u003d utils.get_ksa_adapter(\u0027image\u0027, min_version\u003d\u00272.0\u0027,"},{"line_number":131,"context_line":"                                         max_version\u003d\u00272.latest\u0027)"},{"line_number":132,"context_line":"        # TODO(efried): Use ksa_adap.get_endpoint() when bug #1707995 is fixed."},{"line_number":133,"context_line":"        api_servers.append(ksa_adap.endpoint_override or"},{"line_number":134,"context_line":"                           ksa_adap.get_endpoint_data().catalog_url)"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_1559e58c","line":131,"range":{"start_line":131,"start_character":54,"end_line":131,"end_character":62},"in_reply_to":"7f515b1d_2df3aa75","updated":"2017-10-09 13:24:33.000000000","message":"Both are true, though the latter doesn\u0027t apply here.  This call is getting a ksa Adapter that\u0027ll ensure it can talk to an endpoint \u003e2.0 but \u003c3.  The get_endpoint_data() call below would fail if such an endpoint wasn\u0027t available.  By the time we\u0027ve translated to an \"api_servers\" entry, it\u0027ll be a real versioned URL that supports v2.x.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"}],"nova/tests/unit/image/test_glance.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05a0b60ff5d9748b1d293e797c43559e22b2bf51","unresolved":false,"context_lines":[{"line_number":1594,"context_line":"    def test_get_api_servers_get_ksa_adapter(self, mock_epd):"},{"line_number":1595,"context_line":"        \"\"\"Test get_api_servers via nova.utils.get_ksa_adapter().\"\"\""},{"line_number":1596,"context_line":"        self.flags(api_servers\u003dNone, group\u003d\u0027glance\u0027)"},{"line_number":1597,"context_line":"        api_servers \u003d glance.get_api_servers()"},{"line_number":1598,"context_line":"        self.assertEqual(mock_epd.return_value.catalog_url, next(api_servers))"},{"line_number":1599,"context_line":"        # Still get itertools.cycle behavior"},{"line_number":1600,"context_line":"        self.assertEqual(mock_epd.return_value.catalog_url, next(api_servers))"},{"line_number":1601,"context_line":"        mock_epd.assert_called_once_with()"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_cd7656d9","line":1598,"range":{"start_line":1597,"start_character":8,"end_line":1598,"end_character":78},"updated":"2017-10-06 15:04:54.000000000","message":"I don\u0027t really understand how this is working - is this just working on a Mock object returned from get_endpoint_data?","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"be8bc9e35f5e404a26cd9c9f4b42446c8b8f03d9","unresolved":false,"context_lines":[{"line_number":1594,"context_line":"    def test_get_api_servers_get_ksa_adapter(self, mock_epd):"},{"line_number":1595,"context_line":"        \"\"\"Test get_api_servers via nova.utils.get_ksa_adapter().\"\"\""},{"line_number":1596,"context_line":"        self.flags(api_servers\u003dNone, group\u003d\u0027glance\u0027)"},{"line_number":1597,"context_line":"        api_servers \u003d glance.get_api_servers()"},{"line_number":1598,"context_line":"        self.assertEqual(mock_epd.return_value.catalog_url, next(api_servers))"},{"line_number":1599,"context_line":"        # Still get itertools.cycle behavior"},{"line_number":1600,"context_line":"        self.assertEqual(mock_epd.return_value.catalog_url, next(api_servers))"},{"line_number":1601,"context_line":"        mock_epd.assert_called_once_with()"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_906043d1","line":1598,"range":{"start_line":1597,"start_character":8,"end_line":1598,"end_character":78},"in_reply_to":"7f515b1d_cd7656d9","updated":"2017-10-09 13:24:33.000000000","message":"Yes.  I\u0027m just verifying that we\u0027re calling get_endpoint_data, using the catalog_url attribute of the result, and putting that into api_servers.  I could have said\n\n mock_epd.return_value.catalog_url \u003d \u0027url\u0027\n ...\n self.assertEqual(\u0027url\u0027, next(api_servers))\n\n...but it wasn\u0027t necessary.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"}],"nova/utils.py":[{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"eec727da371bec0e656e75e915c1427edce41c21","unresolved":false,"context_lines":[{"line_number":1425,"context_line":""},{"line_number":1426,"context_line":""},{"line_number":1427,"context_line":"def _conf_group_for_service_type(service_type):"},{"line_number":1428,"context_line":"    \"\"\"For a given service type (possibly alias), return the conf group name."},{"line_number":1429,"context_line":""},{"line_number":1430,"context_line":"    This generally relies on the conf group for a given service type being the"},{"line_number":1431,"context_line":"    same as its project name in service-types-authority. Any special cases must"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_dca4c2bb","line":1428,"updated":"2017-08-02 14:40:14.000000000","message":"Maybe let\u0027s add a note that at some point in the future we want conf group names to match service-types, at which point this function can go away. But for now it exists because we want CODE in nova that\u0027s working with get_endpoint_data to use service-types.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4a78e3c20e9ed7cb60c2ed8d0cbfa7f307cc2154","unresolved":false,"context_lines":[{"line_number":1425,"context_line":""},{"line_number":1426,"context_line":""},{"line_number":1427,"context_line":"def _conf_group_for_service_type(service_type):"},{"line_number":1428,"context_line":"    \"\"\"For a given service type (possibly alias), return the conf group name."},{"line_number":1429,"context_line":""},{"line_number":1430,"context_line":"    This generally relies on the conf group for a given service type being the"},{"line_number":1431,"context_line":"    same as its project name in service-types-authority. Any special cases must"}],"source_content_type":"text/x-python","patch_set":5,"id":"9f436f4f_d44cf377","line":1428,"in_reply_to":"df3967d1_4af8f247","updated":"2017-08-08 21:38:12.000000000","message":"[Later] Okay, I\u0027m seeing how this is gonna make sense for e.g. placement.  Though I\u0027m still not sure how that plan is going to get adopted overall.  But see an upcoming change set for how I\u0027m going to handle that.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e1aad25f53be3f0de253d4b82b4d2f27388268d3","unresolved":false,"context_lines":[{"line_number":1425,"context_line":""},{"line_number":1426,"context_line":""},{"line_number":1427,"context_line":"def _conf_group_for_service_type(service_type):"},{"line_number":1428,"context_line":"    \"\"\"For a given service type (possibly alias), return the conf group name."},{"line_number":1429,"context_line":""},{"line_number":1430,"context_line":"    This generally relies on the conf group for a given service type being the"},{"line_number":1431,"context_line":"    same as its project name in service-types-authority. Any special cases must"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_4af8f247","line":1428,"in_reply_to":"df3967d1_dca4c2bb","updated":"2017-08-03 22:44:50.000000000","message":"Um.  We want conf group names to match service types?  Not sure that\u0027s right, or maybe I don\u0027t understand the comment.  Let\u0027s talk.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"eec727da371bec0e656e75e915c1427edce41c21","unresolved":false,"context_lines":[{"line_number":1437,"context_line":"    :raise: ConfGroupForServiceTypeNotFound If no conf group name could be"},{"line_number":1438,"context_line":"            found for the specified service_type.  This should be considered a"},{"line_number":1439,"context_line":"            bug: any conf group that doesn\u0027t map to the service_type\u0027s project"},{"line_number":1440,"context_line":"            name in service-types-authority must be hardcoded in this method."},{"line_number":1441,"context_line":"    \"\"\""},{"line_number":1442,"context_line":"    global _SERVICE_TYPES"},{"line_number":1443,"context_line":"    with lockutils.lock(\"_SERVICE_TYPES\"):"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_bcdd7e43","line":1440,"updated":"2017-08-02 14:40:14.000000000","message":"See note below- let\u0027s not suggest hardcoding anything.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e1aad25f53be3f0de253d4b82b4d2f27388268d3","unresolved":false,"context_lines":[{"line_number":1437,"context_line":"    :raise: ConfGroupForServiceTypeNotFound If no conf group name could be"},{"line_number":1438,"context_line":"            found for the specified service_type.  This should be considered a"},{"line_number":1439,"context_line":"            bug: any conf group that doesn\u0027t map to the service_type\u0027s project"},{"line_number":1440,"context_line":"            name in service-types-authority must be hardcoded in this method."},{"line_number":1441,"context_line":"    \"\"\""},{"line_number":1442,"context_line":"    global _SERVICE_TYPES"},{"line_number":1443,"context_line":"    with lockutils.lock(\"_SERVICE_TYPES\"):"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_2a97eeee","line":1440,"in_reply_to":"df3967d1_bcdd7e43","updated":"2017-08-03 22:44:50.000000000","message":"Done","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"eec727da371bec0e656e75e915c1427edce41c21","unresolved":false,"context_lines":[{"line_number":1445,"context_line":"            # NOTE(efried): Use local data.  Attempting to refresh"},{"line_number":1446,"context_line":"            # service-types.json is almost always going to cause more problems"},{"line_number":1447,"context_line":"            # than it will prevent/solve.  If we start getting bugs here, add"},{"line_number":1448,"context_line":"            # a ksa Session parameter and pass it in."},{"line_number":1449,"context_line":"            _SERVICE_TYPES \u003d service_types.ServiceTypes()"},{"line_number":1450,"context_line":"    confgrp \u003d _SERVICE_TYPES.get_project_name(service_type)"},{"line_number":1451,"context_line":"    if not confgrp:"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_7cf956c6","line":1448,"updated":"2017-08-02 14:40:14.000000000","message":"++","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"eec727da371bec0e656e75e915c1427edce41c21","unresolved":false,"context_lines":[{"line_number":1448,"context_line":"            # a ksa Session parameter and pass it in."},{"line_number":1449,"context_line":"            _SERVICE_TYPES \u003d service_types.ServiceTypes()"},{"line_number":1450,"context_line":"    confgrp \u003d _SERVICE_TYPES.get_project_name(service_type)"},{"line_number":1451,"context_line":"    if not confgrp:"},{"line_number":1452,"context_line":"        # Here\u0027s where special cases should be hardcoded."},{"line_number":1453,"context_line":"        raise exception.ConfGroupForServiceTypeNotFound(stype\u003dservice_type)"},{"line_number":1454,"context_line":"    return confgrp"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_fcd30637","line":1451,"updated":"2017-08-02 14:40:14.000000000","message":"Actually - let\u0027s not grow special cases. There are currently no non-matching conf groups. The eventual goal will be to move to the conf-groups matching the service-type anyway. So confgrp being None is actually an internal code error for nova - there should be zero circumstances where it\u0027s legitimate for this to fail.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e1aad25f53be3f0de253d4b82b4d2f27388268d3","unresolved":false,"context_lines":[{"line_number":1448,"context_line":"            # a ksa Session parameter and pass it in."},{"line_number":1449,"context_line":"            _SERVICE_TYPES \u003d service_types.ServiceTypes()"},{"line_number":1450,"context_line":"    confgrp \u003d _SERVICE_TYPES.get_project_name(service_type)"},{"line_number":1451,"context_line":"    if not confgrp:"},{"line_number":1452,"context_line":"        # Here\u0027s where special cases should be hardcoded."},{"line_number":1453,"context_line":"        raise exception.ConfGroupForServiceTypeNotFound(stype\u003dservice_type)"},{"line_number":1454,"context_line":"    return confgrp"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_0a530a41","line":1451,"in_reply_to":"df3967d1_fcd30637","updated":"2017-08-03 22:44:50.000000000","message":"Sooo I\u0027m okay changing the comments here to indicate that this is a dev error, but I don\u0027t think we should take the exception away entirely.  If there\u0027s no mapping, get_project_name returns None.  If I return None from this method, the exception will happen down the line in load_*_from_conf_options, and will be fairly obscure and tough to debug.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"eec727da371bec0e656e75e915c1427edce41c21","unresolved":false,"context_lines":[{"line_number":1491,"context_line":"    \"\"\""},{"line_number":1492,"context_line":"    confgrp \u003d None"},{"line_number":1493,"context_line":""},{"line_number":1494,"context_line":"    if ks_auth is None:"},{"line_number":1495,"context_line":"        try:"},{"line_number":1496,"context_line":"            if confgrp is None:"},{"line_number":1497,"context_line":"                confgrp \u003d _conf_group_for_service_type(service_type)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_9c03da73","line":1494,"updated":"2017-08-02 14:40:14.000000000","message":"You don\u0027t need to do this if ks_session is not None and ks_session.auth is not None. Look at the ironic workflow- it passes in a session with an auth attached - you don\u0027t need to create an auth in that case.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e1aad25f53be3f0de253d4b82b4d2f27388268d3","unresolved":false,"context_lines":[{"line_number":1491,"context_line":"    \"\"\""},{"line_number":1492,"context_line":"    confgrp \u003d None"},{"line_number":1493,"context_line":""},{"line_number":1494,"context_line":"    if ks_auth is None:"},{"line_number":1495,"context_line":"        try:"},{"line_number":1496,"context_line":"            if confgrp is None:"},{"line_number":1497,"context_line":"                confgrp \u003d _conf_group_for_service_type(service_type)"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_0d2fa48e","line":1494,"in_reply_to":"df3967d1_9c03da73","updated":"2017-08-03 22:44:50.000000000","message":"Okay; I was thinking the session.auth might have expired.  Was also trying to avoid a zillion conditions here.  Because...\n\nDon\u0027t I also have to check for ks_adapter.auth and ks_adapter.session.auth (and all their intervening objects)?\n\nI\u0027ll work that up and see what you think.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"eec727da371bec0e656e75e915c1427edce41c21","unresolved":false,"context_lines":[{"line_number":1517,"context_line":""},{"line_number":1518,"context_line":"    # NOTE(efried): The operator can set the service_type in the conf, and that"},{"line_number":1519,"context_line":"    # might be a different value than what\u0027s passed into this method (usually"},{"line_number":1520,"context_line":"    # hardcoded by the consuming code). Give precedence to the conf."},{"line_number":1521,"context_line":"    ks_adapter.service_type \u003d ks_adapter.service_type or service_type"},{"line_number":1522,"context_line":""},{"line_number":1523,"context_line":"    # This may raise exceptions from ksa."}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_1c9a4a6d","line":1520,"updated":"2017-08-02 14:40:14.000000000","message":"++","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"eec727da371bec0e656e75e915c1427edce41c21","unresolved":false,"context_lines":[{"line_number":1520,"context_line":"    # hardcoded by the consuming code). Give precedence to the conf."},{"line_number":1521,"context_line":"    ks_adapter.service_type \u003d ks_adapter.service_type or service_type"},{"line_number":1522,"context_line":""},{"line_number":1523,"context_line":"    # This may raise exceptions from ksa."},{"line_number":1524,"context_line":"    data \u003d ks_adapter.get_endpoint_data(auth\u003dks_auth)"},{"line_number":1525,"context_line":""},{"line_number":1526,"context_line":"    # TODO(efried): Reduce this when EndpointData has __str__"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_1c736a4f","line":1523,"updated":"2017-08-02 14:40:14.000000000","message":"Should we wrap these and turn them in to nova exceptions? (not sure what the right thing nova-wise is)","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e1aad25f53be3f0de253d4b82b4d2f27388268d3","unresolved":false,"context_lines":[{"line_number":1520,"context_line":"    # hardcoded by the consuming code). Give precedence to the conf."},{"line_number":1521,"context_line":"    ks_adapter.service_type \u003d ks_adapter.service_type or service_type"},{"line_number":1522,"context_line":""},{"line_number":1523,"context_line":"    # This may raise exceptions from ksa."},{"line_number":1524,"context_line":"    data \u003d ks_adapter.get_endpoint_data(auth\u003dks_auth)"},{"line_number":1525,"context_line":""},{"line_number":1526,"context_line":"    # TODO(efried): Reduce this when EndpointData has __str__"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_cdb87ce6","line":1523,"in_reply_to":"df3967d1_1c736a4f","updated":"2017-08-03 22:44:50.000000000","message":"At a glance, I don\u0027t see any exceptions that look like wrapped keystone(auth) exceptions.  Could be wrong though.  Other reviewers care to comment?","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"eec727da371bec0e656e75e915c1427edce41c21","unresolved":false,"context_lines":[{"line_number":1522,"context_line":""},{"line_number":1523,"context_line":"    # This may raise exceptions from ksa."},{"line_number":1524,"context_line":"    data \u003d ks_adapter.get_endpoint_data(auth\u003dks_auth)"},{"line_number":1525,"context_line":""},{"line_number":1526,"context_line":"    # TODO(efried): Reduce this when EndpointData has __str__"},{"line_number":1527,"context_line":"    # (Ib8985f0fa48a613ab8fca7faffbdf60c19c7cd22)"},{"line_number":1528,"context_line":"    if LOG.isEnabledFor(logging.DEBUG):"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_5c51f261","line":1525,"updated":"2017-08-02 14:40:14.000000000","message":"Don\u0027t kill me - but the  more I read this the more I think it should be split into two functions, one that calls the other. One function should get get_adapter - and it should return an adapater from conf optionally creating a session and auth as you have done here.\n\nThen get_endpoint_data should cal get_adapter if adapter is None. BUT - in other places in nova where we\u0027re making an adapater and using it (such as in talking to the placement service which just uses REST calls) - it can use get_adapter and we can have a consistent flow.\n\nFinally - that will let you remove the line on 1521 - because either you are trusting the adapter that was passed in- or you just created one from conf in which case it will have the conf service-type set.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e1aad25f53be3f0de253d4b82b4d2f27388268d3","unresolved":false,"context_lines":[{"line_number":1522,"context_line":""},{"line_number":1523,"context_line":"    # This may raise exceptions from ksa."},{"line_number":1524,"context_line":"    data \u003d ks_adapter.get_endpoint_data(auth\u003dks_auth)"},{"line_number":1525,"context_line":""},{"line_number":1526,"context_line":"    # TODO(efried): Reduce this when EndpointData has __str__"},{"line_number":1527,"context_line":"    # (Ib8985f0fa48a613ab8fca7faffbdf60c19c7cd22)"},{"line_number":1528,"context_line":"    if LOG.isEnabledFor(logging.DEBUG):"}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_50a2c1fd","line":1525,"in_reply_to":"df3967d1_5c51f261","updated":"2017-08-03 22:44:50.000000000","message":"Okay, it took me a while to grok this.\n\nBut I think what it amounts to is: nova.util will have a get_ksa_adapter method... and that\u0027s it.  Because any get_endpoint_data method would be a direct passthrough to ks_adapter.get_endpoint_data, so what\u0027s the point?\n\nAnd even better, that means both glance and ironic can call ks_adapter.get_endpoint() (rather than get_endpoint_data().catalog_url) - which seamlessly takes care of supporting the conf just having endpoint_override (at that point I don\u0027t need an auth or (real) session from anywhere).\n\nI\u0027ll put that up and see what you think.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"a3492bfee6fbd5aa2ae0f28b6a3f01d2c978ce0a","unresolved":false,"context_lines":[{"line_number":1306,"context_line":"            # service-types.json is almost always going to cause more problems"},{"line_number":1307,"context_line":"            # than it will prevent/solve.  If we start getting bugs here, add"},{"line_number":1308,"context_line":"            # a ksa Session parameter and pass it in."},{"line_number":1309,"context_line":"            _SERVICE_TYPES \u003d service_types.ServiceTypes()"},{"line_number":1310,"context_line":"    confgrp \u003d _SERVICE_TYPES.get_project_name(service_type)"},{"line_number":1311,"context_line":"    if not confgrp:"},{"line_number":1312,"context_line":"        raise exception.ConfGroupForServiceTypeNotFound(stype\u003dservice_type)"}],"source_content_type":"text/x-python","patch_set":17,"id":"ff5d4b2f_ea903c51","line":1309,"updated":"2017-09-19 12:10:08.000000000","message":"why does this have to lock? Is service types not already in code and parsing files? If so, that seems suboptimal.","commit_id":"e414ca2d1700e50c6802f61be84534dd78cf8f00"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"2c24763be00f9d37d25339a71119bcf5b5f14c7e","unresolved":false,"context_lines":[{"line_number":1306,"context_line":"            # service-types.json is almost always going to cause more problems"},{"line_number":1307,"context_line":"            # than it will prevent/solve.  If we start getting bugs here, add"},{"line_number":1308,"context_line":"            # a ksa Session parameter and pass it in."},{"line_number":1309,"context_line":"            _SERVICE_TYPES \u003d service_types.ServiceTypes()"},{"line_number":1310,"context_line":"    confgrp \u003d _SERVICE_TYPES.get_project_name(service_type)"},{"line_number":1311,"context_line":"    if not confgrp:"},{"line_number":1312,"context_line":"        raise exception.ConfGroupForServiceTypeNotFound(stype\u003dservice_type)"}],"source_content_type":"text/x-python","patch_set":17,"id":"9f5c4f37_b1506934","line":1309,"in_reply_to":"ff5d4b2f_81407e09","updated":"2017-09-21 16:37:02.000000000","message":"Going with init at top of file, per http://eavesdrop.openstack.org/irclogs/%23openstack-nova/%23openstack-nova.2017-09-21.log.html#t2017-09-21T16:23:08","commit_id":"e414ca2d1700e50c6802f61be84534dd78cf8f00"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"044705cbeea8d8bf49ebb8520ad84bde845abd3e","unresolved":false,"context_lines":[{"line_number":1306,"context_line":"            # service-types.json is almost always going to cause more problems"},{"line_number":1307,"context_line":"            # than it will prevent/solve.  If we start getting bugs here, add"},{"line_number":1308,"context_line":"            # a ksa Session parameter and pass it in."},{"line_number":1309,"context_line":"            _SERVICE_TYPES \u003d service_types.ServiceTypes()"},{"line_number":1310,"context_line":"    confgrp \u003d _SERVICE_TYPES.get_project_name(service_type)"},{"line_number":1311,"context_line":"    if not confgrp:"},{"line_number":1312,"context_line":"        raise exception.ConfGroupForServiceTypeNotFound(stype\u003dservice_type)"}],"source_content_type":"text/x-python","patch_set":17,"id":"ff5d4b2f_81407e09","line":1309,"in_reply_to":"ff5d4b2f_ea903c51","updated":"2017-09-19 15:57:47.000000000","message":"I could remove the lock.  The worst thing that would happen (if multiple threads reach L1304 simultaneously) is that we instantiate ServiceTypes multiple times and then throw all but one of them away.  As long as we\u0027re not going to network that\u0027s cheap and pretty harmless.  In that case I would add a comment to warn future me against that issue if we wind up needing to do the network path.\n\nOr I could initialize _SERVICE_TYPES at the top of the file; but then it gets done at import time.  Which is fine unless the consumer of nova.utils never calls get_ksa_adapter.\n\nOr I could add an extra \"if _SERVICE_TYPES is None\" above the lock line, which would avoid the extraneous locking after initial setup, but looks kinda icky.\n\nSo, including leaving the existing code, that\u0027s four options.  I\u0027ll go with whichever one you prefer.","commit_id":"e414ca2d1700e50c6802f61be84534dd78cf8f00"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05a0b60ff5d9748b1d293e797c43559e22b2bf51","unresolved":false,"context_lines":[{"line_number":1295,"context_line":"                        min_version."},{"line_number":1296,"context_line":"    :return: A keystoneauth1 Adapter object for the specified service_type."},{"line_number":1297,"context_line":"    :raise: ConfGroupForServiceTypeNotFound If no conf group name could be"},{"line_number":1298,"context_line":"            found for the specified service_type.  This should be considered a"},{"line_number":1299,"context_line":"            bug."},{"line_number":1300,"context_line":"    \"\"\""},{"line_number":1301,"context_line":"    # Get the conf group corresponding to the service type."},{"line_number":1302,"context_line":"    confgrp \u003d _SERVICE_TYPES.get_project_name(service_type)"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_0857bc04","line":1299,"range":{"start_line":1298,"start_character":51,"end_line":1299,"end_character":16},"updated":"2017-10-06 15:04:54.000000000","message":"Bug in nova? Bug in the deployment config? Bug in service-type-authority? I\u0027m unclear on what happens next if this breaks obviously.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"be8bc9e35f5e404a26cd9c9f4b42446c8b8f03d9","unresolved":false,"context_lines":[{"line_number":1295,"context_line":"                        min_version."},{"line_number":1296,"context_line":"    :return: A keystoneauth1 Adapter object for the specified service_type."},{"line_number":1297,"context_line":"    :raise: ConfGroupForServiceTypeNotFound If no conf group name could be"},{"line_number":1298,"context_line":"            found for the specified service_type.  This should be considered a"},{"line_number":1299,"context_line":"            bug."},{"line_number":1300,"context_line":"    \"\"\""},{"line_number":1301,"context_line":"    # Get the conf group corresponding to the service type."},{"line_number":1302,"context_line":"    confgrp \u003d _SERVICE_TYPES.get_project_name(service_type)"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_55d4fd1f","line":1299,"range":{"start_line":1298,"start_character":51,"end_line":1299,"end_character":16},"in_reply_to":"7f515b1d_0857bc04","updated":"2017-10-09 13:24:33.000000000","message":"See commentary at https://review.openstack.org/#/c/488137/22/nova/exception.py@973\n\nI\u0027ll take your lead on this.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05a0b60ff5d9748b1d293e797c43559e22b2bf51","unresolved":false,"context_lines":[{"line_number":1308,"context_line":"    # result is being used for get_endpoint() and the conf only contains"},{"line_number":1309,"context_line":"    # endpoint_override."},{"line_number":1310,"context_line":"    if not ksa_auth:"},{"line_number":1311,"context_line":"        if ksa_session and ksa_session.auth:"},{"line_number":1312,"context_line":"            ksa_auth \u003d ksa_session.auth"},{"line_number":1313,"context_line":"        else:"},{"line_number":1314,"context_line":"            ksa_auth \u003d ks_loading.load_auth_from_conf_options(CONF, confgrp)"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_0870dca4","line":1311,"range":{"start_line":1311,"start_character":27,"end_line":1311,"end_character":43},"updated":"2017-10-06 15:04:54.000000000","message":"God I sure hope ksa never decides to rename their internal attributes.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"be8bc9e35f5e404a26cd9c9f4b42446c8b8f03d9","unresolved":false,"context_lines":[{"line_number":1308,"context_line":"    # result is being used for get_endpoint() and the conf only contains"},{"line_number":1309,"context_line":"    # endpoint_override."},{"line_number":1310,"context_line":"    if not ksa_auth:"},{"line_number":1311,"context_line":"        if ksa_session and ksa_session.auth:"},{"line_number":1312,"context_line":"            ksa_auth \u003d ksa_session.auth"},{"line_number":1313,"context_line":"        else:"},{"line_number":1314,"context_line":"            ksa_auth \u003d ks_loading.load_auth_from_conf_options(CONF, confgrp)"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_daa37c9d","line":1311,"range":{"start_line":1311,"start_character":27,"end_line":1311,"end_character":43},"in_reply_to":"7f515b1d_0870dca4","updated":"2017-10-09 13:24:33.000000000","message":"The ones with public names, they won\u0027t.  For a lib like ksa, that\u0027s considered API.  And the keystone folks are super duper anal about maintaining backward compatibility at ALL costs.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"}],"nova/virt/ironic/client_wrapper.py":[{"author":{"_account_id":2,"name":"Monty Taylor","email":"mordred@inaugust.com","username":"mordred"},"change_message_id":"eec727da371bec0e656e75e915c1427edce41c21","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            # NOTE(efried): `api_endpoint` still overrides service catalog and"},{"line_number":97,"context_line":"            # `endpoint_override` conf options. This will be removed in a"},{"line_number":98,"context_line":"            # future release."},{"line_number":99,"context_line":"            ironic_url \u003d CONF.ironic.api_endpoint"},{"line_number":100,"context_line":"        else:"},{"line_number":101,"context_line":"            try:"},{"line_number":102,"context_line":"                # TODO(efried): This should use .url instead of .catalog_url."}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_fcdd4614","line":99,"updated":"2017-08-02 14:40:14.000000000","message":"I wonder if we can jimmy something so that CONF.ironic.api_endpoint becomes a deprecated alias for CONF.ironic.endpoint_override when we register the conf options? That way you can remove this special case and just use endpoint_override in the code.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4a78e3c20e9ed7cb60c2ed8d0cbfa7f307cc2154","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            # NOTE(efried): `api_endpoint` still overrides service catalog and"},{"line_number":97,"context_line":"            # `endpoint_override` conf options. This will be removed in a"},{"line_number":98,"context_line":"            # future release."},{"line_number":99,"context_line":"            ironic_url \u003d CONF.ironic.api_endpoint"},{"line_number":100,"context_line":"        else:"},{"line_number":101,"context_line":"            try:"},{"line_number":102,"context_line":"                # TODO(efried): This should use .url instead of .catalog_url."}],"source_content_type":"text/x-python","patch_set":5,"id":"9f436f4f_54aec3e7","line":99,"in_reply_to":"df3967d1_cbe39fd8","updated":"2017-08-08 21:38:12.000000000","message":"Figured this out; Done.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e1aad25f53be3f0de253d4b82b4d2f27388268d3","unresolved":false,"context_lines":[{"line_number":96,"context_line":"            # NOTE(efried): `api_endpoint` still overrides service catalog and"},{"line_number":97,"context_line":"            # `endpoint_override` conf options. This will be removed in a"},{"line_number":98,"context_line":"            # future release."},{"line_number":99,"context_line":"            ironic_url \u003d CONF.ironic.api_endpoint"},{"line_number":100,"context_line":"        else:"},{"line_number":101,"context_line":"            try:"},{"line_number":102,"context_line":"                # TODO(efried): This should use .url instead of .catalog_url."}],"source_content_type":"text/x-python","patch_set":5,"id":"df3967d1_cbe39fd8","line":99,"in_reply_to":"df3967d1_fcdd4614","updated":"2017-08-03 22:44:50.000000000","message":"Mm, I\u0027ll have to noodle with this (and probably bug dhellman about it).  Will try to do it in a subsequent patch set.","commit_id":"2b3d443a075e3e55bf105289d5541013c7943b3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05a0b60ff5d9748b1d293e797c43559e22b2bf51","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        else:"},{"line_number":102,"context_line":"            try:"},{"line_number":103,"context_line":"                ksa_adap \u003d utils.get_ksa_adapter("},{"line_number":104,"context_line":"                    \u0027baremetal\u0027, ksa_auth\u003dauth_plugin, ksa_session\u003dsess,"},{"line_number":105,"context_line":"                    min_version\u003dIRONIC_API_VERSION,"},{"line_number":106,"context_line":"                    max_version\u003d(IRONIC_API_VERSION[0], ks_disc.LATEST))"},{"line_number":107,"context_line":"                ironic_url \u003d ksa_adap.get_endpoint()"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_c8976490","line":104,"range":{"start_line":104,"start_character":20,"end_line":104,"end_character":31},"updated":"2017-10-06 15:04:54.000000000","message":"nova.conf.ironic.DEFAULT_SERVICE_TYPE ?","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"be8bc9e35f5e404a26cd9c9f4b42446c8b8f03d9","unresolved":false,"context_lines":[{"line_number":101,"context_line":"        else:"},{"line_number":102,"context_line":"            try:"},{"line_number":103,"context_line":"                ksa_adap \u003d utils.get_ksa_adapter("},{"line_number":104,"context_line":"                    \u0027baremetal\u0027, ksa_auth\u003dauth_plugin, ksa_session\u003dsess,"},{"line_number":105,"context_line":"                    min_version\u003dIRONIC_API_VERSION,"},{"line_number":106,"context_line":"                    max_version\u003d(IRONIC_API_VERSION[0], ks_disc.LATEST))"},{"line_number":107,"context_line":"                ironic_url \u003d ksa_adap.get_endpoint()"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_90b5e334","line":104,"range":{"start_line":104,"start_character":20,"end_line":104,"end_character":31},"in_reply_to":"7f515b1d_c8976490","updated":"2017-10-09 13:24:33.000000000","message":"Done","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05a0b60ff5d9748b1d293e797c43559e22b2bf51","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                ksa_adap \u003d utils.get_ksa_adapter("},{"line_number":104,"context_line":"                    \u0027baremetal\u0027, ksa_auth\u003dauth_plugin, ksa_session\u003dsess,"},{"line_number":105,"context_line":"                    min_version\u003dIRONIC_API_VERSION,"},{"line_number":106,"context_line":"                    max_version\u003d(IRONIC_API_VERSION[0], ks_disc.LATEST))"},{"line_number":107,"context_line":"                ironic_url \u003d ksa_adap.get_endpoint()"},{"line_number":108,"context_line":"            except exception.ServiceNotFound:"},{"line_number":109,"context_line":"                # NOTE(efried): No reason to believe service catalog lookup"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_08f33c0c","line":106,"range":{"start_line":106,"start_character":20,"end_line":106,"end_character":71},"updated":"2017-10-06 15:04:54.000000000","message":"similar question as in the glance module, I assume ksa is treating a minor version of \u0027latest\u0027 as special regardless of whether or not the actual endpoint service supports something with a \u0027latest\u0027 minor version?","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"be8bc9e35f5e404a26cd9c9f4b42446c8b8f03d9","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                ksa_adap \u003d utils.get_ksa_adapter("},{"line_number":104,"context_line":"                    \u0027baremetal\u0027, ksa_auth\u003dauth_plugin, ksa_session\u003dsess,"},{"line_number":105,"context_line":"                    min_version\u003dIRONIC_API_VERSION,"},{"line_number":106,"context_line":"                    max_version\u003d(IRONIC_API_VERSION[0], ks_disc.LATEST))"},{"line_number":107,"context_line":"                ironic_url \u003d ksa_adap.get_endpoint()"},{"line_number":108,"context_line":"            except exception.ServiceNotFound:"},{"line_number":109,"context_line":"                # NOTE(efried): No reason to believe service catalog lookup"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_958f15cc","line":106,"range":{"start_line":106,"start_character":20,"end_line":106,"end_character":71},"in_reply_to":"7f515b1d_08f33c0c","updated":"2017-10-09 13:24:33.000000000","message":"Correct.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05a0b60ff5d9748b1d293e797c43559e22b2bf51","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                    \u0027baremetal\u0027, ksa_auth\u003dauth_plugin, ksa_session\u003dsess,"},{"line_number":105,"context_line":"                    min_version\u003dIRONIC_API_VERSION,"},{"line_number":106,"context_line":"                    max_version\u003d(IRONIC_API_VERSION[0], ks_disc.LATEST))"},{"line_number":107,"context_line":"                ironic_url \u003d ksa_adap.get_endpoint()"},{"line_number":108,"context_line":"            except exception.ServiceNotFound:"},{"line_number":109,"context_line":"                # NOTE(efried): No reason to believe service catalog lookup"},{"line_number":110,"context_line":"                # won\u0027t also fail in ironic client init, but this way will"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_48d2545e","line":107,"range":{"start_line":107,"start_character":16,"end_line":107,"end_character":52},"updated":"2017-10-06 15:04:54.000000000","message":"In the glance code you did:\n\nksa_adap.get_endpoint_data().catalog_url\n\nSo what\u0027s the difference? Is get_endpoint() just a helper for get_endpoint_data().catalog_url? If so, let\u0027s do the same in the glance code so we\u0027re not reliant on what ksa is naming it\u0027s internal attributes.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"be8bc9e35f5e404a26cd9c9f4b42446c8b8f03d9","unresolved":false,"context_lines":[{"line_number":104,"context_line":"                    \u0027baremetal\u0027, ksa_auth\u003dauth_plugin, ksa_session\u003dsess,"},{"line_number":105,"context_line":"                    min_version\u003dIRONIC_API_VERSION,"},{"line_number":106,"context_line":"                    max_version\u003d(IRONIC_API_VERSION[0], ks_disc.LATEST))"},{"line_number":107,"context_line":"                ironic_url \u003d ksa_adap.get_endpoint()"},{"line_number":108,"context_line":"            except exception.ServiceNotFound:"},{"line_number":109,"context_line":"                # NOTE(efried): No reason to believe service catalog lookup"},{"line_number":110,"context_line":"                # won\u0027t also fail in ironic client init, but this way will"}],"source_content_type":"text/x-python","patch_set":22,"id":"7f515b1d_b52211b8","line":107,"range":{"start_line":107,"start_character":16,"end_line":107,"end_character":52},"in_reply_to":"7f515b1d_48d2545e","updated":"2017-10-09 13:24:33.000000000","message":"Agree (except for the \"internal attributes\" part - that\u0027s API and won\u0027t change), but per the TODO at https://review.openstack.org/#/c/488137/22/nova/image/glance.py@132 we would need a resolution to https://bugs.launchpad.net/python-glanceclient/+bug/1707995 first.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"}],"releasenotes/notes/glance-via-ksa-5646eb3d5db51c54.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"05a0b60ff5d9748b1d293e797c43559e22b2bf51","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    Adapter setup in the ``[glance]`` conf section.  This includes using"},{"line_number":7,"context_line":"    ``endpoint_override`` in favor of ``api_servers``.  The"},{"line_number":8,"context_line":"    ``[glance]api_servers`` conf option is still supported, but should only be"},{"line_number":9,"context_line":"    used if you need multiple endpoints and can\u0027t use a load balancer for"},{"line_number":10,"context_line":"    some reason."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7f515b1d_486014a6","line":9,"range":{"start_line":9,"start_character":44,"end_line":9,"end_character":49},"updated":"2017-10-06 15:04:54.000000000","message":"nit: cannot - I try to avoid contractions in docs for non-native English speakers.","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"be8bc9e35f5e404a26cd9c9f4b42446c8b8f03d9","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    Adapter setup in the ``[glance]`` conf section.  This includes using"},{"line_number":7,"context_line":"    ``endpoint_override`` in favor of ``api_servers``.  The"},{"line_number":8,"context_line":"    ``[glance]api_servers`` conf option is still supported, but should only be"},{"line_number":9,"context_line":"    used if you need multiple endpoints and can\u0027t use a load balancer for"},{"line_number":10,"context_line":"    some reason."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"7f515b1d_5029ab87","line":9,"range":{"start_line":9,"start_character":44,"end_line":9,"end_character":49},"in_reply_to":"7f515b1d_486014a6","updated":"2017-10-09 13:24:33.000000000","message":"Done","commit_id":"ac5d6d983397d07d5cfafadbf60260cc0506be40"}],"requirements.txt":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"6ef841b4d82feccf378cb67036934840fdc4adc0","unresolved":false,"context_lines":[{"line_number":62,"context_line":"tooz\u003e\u003d1.47.0 # Apache-2.0"},{"line_number":63,"context_line":"cursive\u003e\u003d0.1.2 # Apache-2.0"},{"line_number":64,"context_line":"pypowervm\u003e\u003d1.1.6 # Apache-2.0"},{"line_number":65,"context_line":"os-service-types\u003e\u003d1.0.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":13,"id":"7f287b81_cd821e01","line":65,"range":{"start_line":65,"start_character":20,"end_line":65,"end_character":21},"updated":"2017-09-03 01:55:56.000000000","message":"This is 1.1.0 now","commit_id":"5aad7b7f03e9941378ec52c21078a4a2e31aed35"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"105182d6fd33c14451faa73cc241161ca4904418","unresolved":false,"context_lines":[{"line_number":62,"context_line":"tooz\u003e\u003d1.47.0 # Apache-2.0"},{"line_number":63,"context_line":"cursive\u003e\u003d0.1.2 # Apache-2.0"},{"line_number":64,"context_line":"pypowervm\u003e\u003d1.1.6 # Apache-2.0"},{"line_number":65,"context_line":"os-service-types\u003e\u003d1.0.0 # Apache-2.0"}],"source_content_type":"text/plain","patch_set":13,"id":"7f287b81_b8b1d246","line":65,"range":{"start_line":65,"start_character":20,"end_line":65,"end_character":21},"in_reply_to":"7f287b81_cd821e01","updated":"2017-09-07 22:05:22.000000000","message":"Done","commit_id":"5aad7b7f03e9941378ec52c21078a4a2e31aed35"}]}
