)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"1a27ff584bb673dd657362e461a51b57d83d4344","unresolved":false,"context_lines":[{"line_number":17,"context_line":"API, code exists to automatically create the resource provider record"},{"line_number":18,"context_line":"via the placement REST API. These resource provider objects will be used"},{"line_number":19,"context_line":"in followup patches that add creation of inventory and allocation"},{"line_number":20,"context_line":"records to the scheduler report client."},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Included in this patch is a new [placement] nova.conf configuration"},{"line_number":23,"context_line":"section with a single os_region_name configuration option that allows"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"1ac06dbe_24cb0c55","line":20,"updated":"2016-08-29 12:39:15.000000000","message":"Thanks for adding that. Otherwise, it was very confusing.","commit_id":"b10bff83a7d422d8cd9ead171540692c4bb24e74"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"0b0fe67f7deaa938d4f17287854826f08b5c55f2","unresolved":false,"context_lines":[{"line_number":14,"context_line":"resource provider UUID and constructed from the results of placement"},{"line_number":15,"context_line":"REST API calls to get information about a resource provider. If a"},{"line_number":16,"context_line":"resource provider matching a UUID was not found in the placement REST"},{"line_number":17,"context_line":"API, the report client automatically creates the resource provider record"},{"line_number":18,"context_line":"via the placement REST API. These resource provider objects will be used"},{"line_number":19,"context_line":"in followup patches that add creation of inventory and allocation"},{"line_number":20,"context_line":"records to the scheduler report client."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"fa7ab95a_bc6fde29","line":17,"range":{"start_line":17,"start_character":72,"end_line":17,"end_character":73},"updated":"2016-08-29 12:45:27.000000000","message":"So close! But it needs a wrap.","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d7b4ba5d3f259737fca2d6a95feb3640624da818","unresolved":false,"context_lines":[{"line_number":28,"context_line":"the determination of the placement endpoint URL after similar code that"},{"line_number":29,"context_line":"determines the volume endpoint URL in /nova/volume/cinder.py."},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"This redoes the placement API using keystone session, and stubs out"},{"line_number":32,"context_line":"where we can do more reasonable handling of errors. This works if we"},{"line_number":33,"context_line":"fill out the right credentials in the placement section of the config"},{"line_number":34,"context_line":"file."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"Co-Authored-By: Sean Dague \u003csean@dague.net\u003e"},{"line_number":37,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"fa7ab95a_08e46439","line":34,"range":{"start_line":31,"start_character":0,"end_line":34,"end_character":5},"updated":"2016-08-31 13:45:33.000000000","message":"This is probably an artifact of Sean\u0027s separate change that cleaned this original change up, but was later squashed in. It reads a bit weird if you don\u0027t know the history of these changes, but I wouldn\u0027t -1 over it.","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"}],"nova/conf/placement.py":[{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"e2f3b09e5d22bc29402c86aef76110ec93ac6851","unresolved":false,"context_lines":[{"line_number":29,"context_line":"* Any string representing region name"},{"line_number":30,"context_line":"\"\"\"),"},{"line_number":31,"context_line":"]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def register_opts(conf):"},{"line_number":35,"context_line":"    conf.register_group(placement_group)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_397677a4","line":32,"updated":"2016-08-22 18:22:15.000000000","message":"Shouldn\u0027t we follow the effort for centralizing config options? Or just meh?","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"448b17f81dadb605b5b10d9b4ad7503b6d8af1fe","unresolved":false,"context_lines":[{"line_number":29,"context_line":"* Any string representing region name"},{"line_number":30,"context_line":"\"\"\"),"},{"line_number":31,"context_line":"]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def register_opts(conf):"},{"line_number":35,"context_line":"    conf.register_group(placement_group)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_3c3945a5","line":32,"in_reply_to":"1ac06dbe_397677a4","updated":"2016-08-22 18:40:19.000000000","message":"That\u0027s what this file is, Roman.","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":13692,"name":"Roman Dobosz","email":"gryf73@gmail.com","username":"gryf"},"change_message_id":"68a74cc2196489981dd530f1721ed6ae39450f0e","unresolved":false,"context_lines":[{"line_number":29,"context_line":"* Any string representing region name"},{"line_number":30,"context_line":"\"\"\"),"},{"line_number":31,"context_line":"]"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def register_opts(conf):"},{"line_number":35,"context_line":"    conf.register_group(placement_group)"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_5c86c1db","line":32,"in_reply_to":"1ac06dbe_3c3945a5","updated":"2016-08-22 18:48:49.000000000","message":"Oh. Right. My mistake.","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"58e1725564f430087712a1f31cf440d00b20a151","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    help\u003d\"Configuration options for connecting to the placement API service\")"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"placement_opts \u003d ["},{"line_number":22,"context_line":"    cfg.StrOpt(\u0027os_region_name\u0027,"},{"line_number":23,"context_line":"               help\u003d\"\"\""},{"line_number":24,"context_line":"Region name of this node. This is used when picking the URL in the service"},{"line_number":25,"context_line":"catalog."}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_927121ab","line":22,"range":{"start_line":22,"start_character":16,"end_line":22,"end_character":19},"updated":"2016-08-29 16:12:19.000000000","message":"nit: why the \u0027os_\u0027 prefix?","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a445b5f9b0001868505101247dd8ed7719df5f88","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    help\u003d\"Configuration options for connecting to the placement API service\")"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"placement_opts \u003d ["},{"line_number":22,"context_line":"    cfg.StrOpt(\u0027os_region_name\u0027,"},{"line_number":23,"context_line":"               help\u003d\"\"\""},{"line_number":24,"context_line":"Region name of this node. This is used when picking the URL in the service"},{"line_number":25,"context_line":"catalog."}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_1d543651","line":22,"range":{"start_line":22,"start_character":16,"end_line":22,"end_character":19},"in_reply_to":"fa7ab95a_927121ab","updated":"2016-08-29 16:20:48.000000000","message":"To be consistent with the Cinder endpoint discovery mechanism and configuration option, as noted in the commit message.","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"58e1725564f430087712a1f31cf440d00b20a151","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def list_opts():"},{"line_number":42,"context_line":"    return {"},{"line_number":43,"context_line":"        placement_group.name: placement_opts"},{"line_number":44,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_925a0129","line":43,"range":{"start_line":43,"start_character":23,"end_line":43,"end_character":28},"updated":"2016-08-29 16:12:19.000000000","message":"You can just pass in the object so drop \u0027.name\u0027","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"a30b2548cd7d512b182bdda502387d810d8c4b91","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    conf.register_group(placement_group)"},{"line_number":36,"context_line":"    conf.register_opts(placement_opts, group\u003dplacement_group)"},{"line_number":37,"context_line":"    ks_loading.register_auth_conf_options(conf,"},{"line_number":38,"context_line":"                                             placement_group.name)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def list_opts():"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa7ab95a_65b8e311","line":38,"range":{"start_line":38,"start_character":42,"end_line":38,"end_character":45},"updated":"2016-08-30 21:59:21.000000000","message":"nit: alignment off","commit_id":"c3688f74b7333bfd2f11a2cf17489d468fba3f31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"17a1331470d9c5925fbf68bfedb16c512a8a7f9b","unresolved":false,"context_lines":[{"line_number":34,"context_line":"def register_opts(conf):"},{"line_number":35,"context_line":"    conf.register_group(placement_group)"},{"line_number":36,"context_line":"    conf.register_opts(placement_opts, group\u003dplacement_group)"},{"line_number":37,"context_line":"    ks_loading.register_auth_conf_options(conf,"},{"line_number":38,"context_line":"                                             placement_group.name)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_fba9cc7c","line":37,"updated":"2016-08-31 14:16:23.000000000","message":"This is also missing registering the session options like we do for ironic:\n\nhttps://github.com/openstack/nova/blob/master/nova/conf/ironic.py#L98\n\nAnd neutron:\n\nhttps://github.com/openstack/nova/blob/master/nova/conf/neutron.py#L138\n\nLooks like that\u0027s to get options like api_max_retries and api_retry_interval.","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"07389e40abe4f90f149a54b55de399aea0a11267","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    conf.register_group(placement_group)"},{"line_number":36,"context_line":"    conf.register_opts(placement_opts, group\u003dplacement_group)"},{"line_number":37,"context_line":"    ks_loading.register_auth_conf_options(conf,"},{"line_number":38,"context_line":"                                             placement_group.name)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def list_opts():"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_6525195b","line":38,"updated":"2016-08-31 13:32:50.000000000","message":"not that it matters but something strange happened here)","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d7b4ba5d3f259737fca2d6a95feb3640624da818","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    conf.register_group(placement_group)"},{"line_number":36,"context_line":"    conf.register_opts(placement_opts, group\u003dplacement_group)"},{"line_number":37,"context_line":"    ks_loading.register_auth_conf_options(conf,"},{"line_number":38,"context_line":"                                             placement_group.name)"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def list_opts():"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_c847dc1b","line":38,"in_reply_to":"fa7ab95a_6525195b","updated":"2016-08-31 13:45:33.000000000","message":"It was the change from calling register_session_conf_options to calling register_auth_conf_options. That messed up the alignment. We can clean that up later separately. This is going to have to be updated anyway to get the ksa options into the [placement] group in the config sample.\n\nFTR, we get the ksa options in the sample config for neutron this way:\n\nhttps://github.com/openstack/nova/blob/master/nova/conf/neutron.py#L116\n\nAnd ironic this way:\n\nhttps://github.com/openstack/nova/blob/master/nova/conf/ironic.py#L101\n\nThe ironic way seems cleaner actually.","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"}],"nova/scheduler/client/report.py":[{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"2655cb3a7b419fab8c3daaac6a7df3704408298a","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    \"\"\"Client class for updating the scheduler.\"\"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def __init__(self):"},{"line_number":34,"context_line":"        # A marker for unrecoverable errors with the placement API"},{"line_number":35,"context_line":"        self._placement_api_error \u003d None"},{"line_number":36,"context_line":"        # A dict, keyed by the resource provider UUID, of ResourceProvider"},{"line_number":37,"context_line":"        # objects that will have their inventories and allocations tracked by"},{"line_number":38,"context_line":"        # the placement API for the compute host"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_d3b28505","line":35,"range":{"start_line":34,"start_character":8,"end_line":35,"end_character":40},"updated":"2016-08-23 07:35:40.000000000","message":"I\u0027m not sure why the unrecoverable flag is needed. Is it a temporary workaround before we can actually run the placement service?\n\nIf not, a misconfigured placement service may cause all the compute nodes fall into unrecoverable errors. And deployer must restart all the compute nodes to fix the problem. I don\u0027t think there is any unrecoverable errors in compute nodes.\n\nIf yes, I can understand the need to suppress error logs before a workable placement service is implemented. But a TODO comment is still needed to show that it is a temporary solution.","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"26e8ac0033e059d69fabc8c99615b733c1137597","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    \"\"\"Client class for updating the scheduler.\"\"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def __init__(self):"},{"line_number":34,"context_line":"        # A marker for unrecoverable errors with the placement API"},{"line_number":35,"context_line":"        self._placement_api_error \u003d None"},{"line_number":36,"context_line":"        # A dict, keyed by the resource provider UUID, of ResourceProvider"},{"line_number":37,"context_line":"        # objects that will have their inventories and allocations tracked by"},{"line_number":38,"context_line":"        # the placement API for the compute host"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_f51e6d6e","line":35,"range":{"start_line":34,"start_character":8,"end_line":35,"end_character":40},"in_reply_to":"1ac06dbe_d3b28505","updated":"2016-08-24 23:05:40.000000000","message":"@Yingxin: The _placement_api_error marker is used here to ensure that the SchedulerReportClient object that is constructed in the resource tracker won\u0027t take the nova-compute service down if there are issues connecting to the placement service. I plan to add some logic to retry failed connections and have the error handling be more robust, however I wanted to minimize the amount of code in this particular patch since it\u0027s already 500+ lines of code :)","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"0a793fee25a3e123c1332dbb1f92129a8865e02d","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    \"\"\"Client class for updating the scheduler.\"\"\""},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def __init__(self):"},{"line_number":34,"context_line":"        # A marker for unrecoverable errors with the placement API"},{"line_number":35,"context_line":"        self._placement_api_error \u003d None"},{"line_number":36,"context_line":"        # A dict, keyed by the resource provider UUID, of ResourceProvider"},{"line_number":37,"context_line":"        # objects that will have their inventories and allocations tracked by"},{"line_number":38,"context_line":"        # the placement API for the compute host"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_1f964d94","line":35,"range":{"start_line":34,"start_character":8,"end_line":35,"end_character":40},"in_reply_to":"1ac06dbe_f51e6d6e","updated":"2016-08-25 02:04:13.000000000","message":"Adding the retry logic makes sense to me. I\u0027m a little bit ignorant because I can\u0027t see the whole picture in this patch, thanks for explanation.","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"2655cb3a7b419fab8c3daaac6a7df3704408298a","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                    os_region_name\u003dCONF.placement.os_region_name,"},{"line_number":57,"context_line":"            )"},{"line_number":58,"context_line":"        except Exception as err:"},{"line_number":59,"context_line":"            self._placement_api_error \u003d err"},{"line_number":60,"context_line":"            msg \u003d _LE(\"Error attempting to determine placement URL: %s\")"},{"line_number":61,"context_line":"            LOG.error(msg, err)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_18c71a97","line":59,"range":{"start_line":59,"start_character":12,"end_line":59,"end_character":43},"updated":"2016-08-23 07:35:40.000000000","message":"The error that the placement service endpoint isn\u0027t registered in keystone is treated unrecoverable?\n\nI think this error is recoverable by adding the correct endpoint later.","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ff6fbf66efb6ebe7a32734050170bce283628473","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                    os_region_name\u003dCONF.placement.os_region_name,"},{"line_number":57,"context_line":"            )"},{"line_number":58,"context_line":"        except Exception as err:"},{"line_number":59,"context_line":"            self._placement_api_error \u003d err"},{"line_number":60,"context_line":"            msg \u003d _LE(\"Error attempting to determine placement URL: %s\")"},{"line_number":61,"context_line":"            LOG.error(msg, err)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_e4c00f2d","line":59,"range":{"start_line":59,"start_character":12,"end_line":59,"end_character":43},"in_reply_to":"1ac06dbe_18c71a97","updated":"2016-08-24 23:17:42.000000000","message":"@Yingxin: that\u0027s the definition of an unrecoverable error. An error that will occur if you retry the exact same request without changes to configuration is an unrecoverable error.","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"0a793fee25a3e123c1332dbb1f92129a8865e02d","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                    os_region_name\u003dCONF.placement.os_region_name,"},{"line_number":57,"context_line":"            )"},{"line_number":58,"context_line":"        except Exception as err:"},{"line_number":59,"context_line":"            self._placement_api_error \u003d err"},{"line_number":60,"context_line":"            msg \u003d _LE(\"Error attempting to determine placement URL: %s\")"},{"line_number":61,"context_line":"            LOG.error(msg, err)"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_3f55091d","line":59,"range":{"start_line":59,"start_character":12,"end_line":59,"end_character":43},"in_reply_to":"1ac06dbe_e4c00f2d","updated":"2016-08-25 02:04:13.000000000","message":"Agree with the definition.","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1ff1a2b7c9e960a03ce1815c16999f886e0fc2cb","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            )"},{"line_number":82,"context_line":"        elif resp.status_code \u003d\u003d 404:"},{"line_number":83,"context_line":"            return None"},{"line_number":84,"context_line":"        else:"},{"line_number":85,"context_line":"            self._placement_api_error \u003d resp.text"},{"line_number":86,"context_line":"            msg \u003d _LE(\"Failed to retrieve resource provider record from \""},{"line_number":87,"context_line":"                      \"placement API for UUID %(uuid)s. \""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_f975fff9","line":84,"updated":"2016-08-22 18:49:53.000000000","message":"If the accept header of the request is application/json then the error response will be formatted as described at http://specs.openstack.org/openstack/api-wg/guidelines/errors.html\n\n(webob actively resists forcing the error response to always be json because at least in this case it is behaving with a somewhat reasonable default in the absence of an accept header)","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ff6fbf66efb6ebe7a32734050170bce283628473","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            )"},{"line_number":82,"context_line":"        elif resp.status_code \u003d\u003d 404:"},{"line_number":83,"context_line":"            return None"},{"line_number":84,"context_line":"        else:"},{"line_number":85,"context_line":"            self._placement_api_error \u003d resp.text"},{"line_number":86,"context_line":"            msg \u003d _LE(\"Failed to retrieve resource provider record from \""},{"line_number":87,"context_line":"                      \"placement API for UUID %(uuid)s. \""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_24086791","line":84,"in_reply_to":"1ac06dbe_f975fff9","updated":"2016-08-24 23:17:42.000000000","message":"As mentioned in IRC, I don\u0027t really care about this. I\u0027m simply passing in the body text in the logged error message. I don\u0027t think it\u0027s something to really spend a whole lot of effort nit-picking over.","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1ff1a2b7c9e960a03ce1815c16999f886e0fc2cb","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            }"},{"line_number":128,"context_line":"            LOG.info(msg, args)"},{"line_number":129,"context_line":"            return self._get_resource_provider(uuid)"},{"line_number":130,"context_line":"        else:"},{"line_number":131,"context_line":"            self._placement_api_error \u003d resp.text"},{"line_number":132,"context_line":"            msg \u003d _LE(\"Failed to create resource provider record in \""},{"line_number":133,"context_line":"                      \"placement API for UUID %(uuid)s. \""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_dcd631f0","line":130,"updated":"2016-08-22 18:49:53.000000000","message":"Would it be long term more flexible to differentiate between \u003e\u003d500 and \u003c500 here?\n\nAnd, in any case, suppose there was a 502 here because there is a flakey proxy or load balancer or whatever kind of gateway between us and the placement api? Wouldn\u0027t it be better to retry soon?","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ff6fbf66efb6ebe7a32734050170bce283628473","unresolved":false,"context_lines":[{"line_number":127,"context_line":"            }"},{"line_number":128,"context_line":"            LOG.info(msg, args)"},{"line_number":129,"context_line":"            return self._get_resource_provider(uuid)"},{"line_number":130,"context_line":"        else:"},{"line_number":131,"context_line":"            self._placement_api_error \u003d resp.text"},{"line_number":132,"context_line":"            msg \u003d _LE(\"Failed to create resource provider record in \""},{"line_number":133,"context_line":"                      \"placement API for UUID %(uuid)s. \""}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_64d53fb8","line":130,"in_reply_to":"1ac06dbe_dcd631f0","updated":"2016-08-24 23:17:42.000000000","message":"Yes, it would be better to retry. But Chris, if I tried to make this absolutely perfectly robust and unbreakable in a single patch, it would be 10K lines of code changed and nothing would ever get reviewed. The compromise here is to get solid error logging and ensure that failures in attempting to work with the placement service don\u0027t take down the resource tracker and thus the compute worker. Errors are logged, allowing the admin to correct things and issue a restart of the nova-compute daemon once any configuration is corrected.\n\nThe reason I did it this way was because Sylvain, Sahid, and many others complained when I tried to do all configuration checks and fail fast in the resource tracker constructor and they both said that it was \"by design\" that the resource tracker would continue to operate (though totally broken) but would not take down the compute manager.","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1ff1a2b7c9e960a03ce1815c16999f886e0fc2cb","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        Nothing is returned from the method, however the caller can be assured"},{"line_number":149,"context_line":"        after running this method that a resource provider object will exist in"},{"line_number":150,"context_line":"        the self._resource_providers dict for the UUID in question."},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        :param uuid: UUID identifier for the resource provider to ensure exists"},{"line_number":153,"context_line":"        :param name: Optional name for the resource provider if the record"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_99a20b98","line":150,"updated":"2016-08-22 18:49:53.000000000","message":"Unless _placement_api_error is not None?","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ff6fbf66efb6ebe7a32734050170bce283628473","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"        Nothing is returned from the method, however the caller can be assured"},{"line_number":149,"context_line":"        after running this method that a resource provider object will exist in"},{"line_number":150,"context_line":"        the self._resource_providers dict for the UUID in question."},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"        :param uuid: UUID identifier for the resource provider to ensure exists"},{"line_number":153,"context_line":"        :param name: Optional name for the resource provider if the record"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_84e79bab","line":150,"in_reply_to":"1ac06dbe_99a20b98","updated":"2016-08-24 23:17:42.000000000","message":"Yes sure I can add a note.","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"0a793fee25a3e123c1332dbb1f92129a8865e02d","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        rp \u003d self._get_resource_provider(uuid)"},{"line_number":164,"context_line":"        if rp is None:"},{"line_number":165,"context_line":"            name \u003d name or uuid"},{"line_number":166,"context_line":"            rp \u003d self._create_resource_provider(uuid, name)"},{"line_number":167,"context_line":"        self._resource_providers[uuid] \u003d rp"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def update_resource_stats(self, compute_node):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_823026a0","line":166,"range":{"start_line":166,"start_character":12,"end_line":166,"end_character":14},"updated":"2016-08-25 02:04:13.000000000","message":"It is possible that the \"rp\" here is still \"None\". It may be caused by a buggy implementation in the requests or in placement service, because a created rp cannot be fetched properly.\n\nSo here misses an unrecoverable error, correct?","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"5e6be8d9674e8022d968a4a4efb256321b353788","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def __init__(self):"},{"line_number":34,"context_line":"        # A marker for unrecoverable errors with the placement API. When a"},{"line_number":35,"context_line":"        # failure occurs attempting to communicate with the placement service"},{"line_number":36,"context_line":"        # and a retry of the same request without changes to configuration"},{"line_number":37,"context_line":"        # would lead to similar failure, we mark the placement API in error"},{"line_number":38,"context_line":"        # using this marker variable. It\u0027s crude, yes, but we do log the errors"},{"line_number":39,"context_line":"        # that occur allowing admins to fix any configuration issues and"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ac06dbe_c344c9b8","line":36,"updated":"2016-08-25 10:55:57.000000000","message":"The reason for my comments and queries on the earlier patch is not because I think we need to implement retries in this session, but because unless I\u0027m misreading it, the code as you have it below will block subsequent requests from the report client even when something as transitory as the placement API being temporarily separated from its database (because of network farts). Since we\u0027re acknowledging that there will be a more robust set up later, wouldn\u0027t it be better at this stage to:\n\n* log the failure\n* _not_ block subsequent usages of the client, just let them continue to fail\n\nThat way when the network heals, we\u0027re back in business.\n\nYour way is \"fail hard\", my way is \"fail softly\".\n\nOr am I missing something.","commit_id":"b10bff83a7d422d8cd9ead171540692c4bb24e74"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6121852471a72ff551858a091b3c1f00987c15ef","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def __init__(self):"},{"line_number":34,"context_line":"        # A marker for unrecoverable errors with the placement API. When a"},{"line_number":35,"context_line":"        # failure occurs attempting to communicate with the placement service"},{"line_number":36,"context_line":"        # and a retry of the same request without changes to configuration"},{"line_number":37,"context_line":"        # would lead to similar failure, we mark the placement API in error"},{"line_number":38,"context_line":"        # using this marker variable. It\u0027s crude, yes, but we do log the errors"},{"line_number":39,"context_line":"        # that occur allowing admins to fix any configuration issues and"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_01eea4b3","line":36,"in_reply_to":"1ac06dbe_c344c9b8","updated":"2016-08-29 11:41:52.000000000","message":"@cdent: I can change it to be fail softly and just continue logging the errors, sure.","commit_id":"b10bff83a7d422d8cd9ead171540692c4bb24e74"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"1a27ff584bb673dd657362e461a51b57d83d4344","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def __init__(self):"},{"line_number":34,"context_line":"        # A marker for unrecoverable errors with the placement API. When a"},{"line_number":35,"context_line":"        # failure occurs attempting to communicate with the placement service"},{"line_number":36,"context_line":"        # and a retry of the same request without changes to configuration"},{"line_number":37,"context_line":"        # would lead to similar failure, we mark the placement API in error"},{"line_number":38,"context_line":"        # using this marker variable. It\u0027s crude, yes, but we do log the errors"},{"line_number":39,"context_line":"        # that occur allowing admins to fix any configuration issues and"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ac06dbe_f8afd4e0","line":36,"in_reply_to":"1ac06dbe_c344c9b8","updated":"2016-08-29 12:39:15.000000000","message":"Or maybe make it a datetime, after which we start trying again? Not sure what an appropriate waiting period would be, but I don\u0027t think that the bad config situation will ever happen more than once, if at all. The transient outage scenario seems much more likely.","commit_id":"b10bff83a7d422d8cd9ead171540692c4bb24e74"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"7e2f1e89602acd7a4e2fc16dc742ab7a78c50255","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        # would lead to similar failure, we mark the placement API in error"},{"line_number":38,"context_line":"        # using this marker variable. It\u0027s crude, yes, but we do log the errors"},{"line_number":39,"context_line":"        # that occur allowing admins to fix any configuration issues and"},{"line_number":40,"context_line":"        # restart the nova-compute service to correct communications with the"},{"line_number":41,"context_line":"        # placement API."},{"line_number":42,"context_line":"        # TODO(jaypipes): This code eventually should be calls via a placement"},{"line_number":43,"context_line":"        # service python client. Those client calls should allow retries of"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ac06dbe_ed910b54","line":40,"range":{"start_line":40,"start_character":10,"end_line":40,"end_character":42},"updated":"2016-08-25 02:41:49.000000000","message":"Does it mean if the retry in the TODO below is implemented, we don\u0027t need to restart all the nova-compute services to fix configuration issues that is not in compute nodes, for example in keystone entrypoint?","commit_id":"b10bff83a7d422d8cd9ead171540692c4bb24e74"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6121852471a72ff551858a091b3c1f00987c15ef","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        # would lead to similar failure, we mark the placement API in error"},{"line_number":38,"context_line":"        # using this marker variable. It\u0027s crude, yes, but we do log the errors"},{"line_number":39,"context_line":"        # that occur allowing admins to fix any configuration issues and"},{"line_number":40,"context_line":"        # restart the nova-compute service to correct communications with the"},{"line_number":41,"context_line":"        # placement API."},{"line_number":42,"context_line":"        # TODO(jaypipes): This code eventually should be calls via a placement"},{"line_number":43,"context_line":"        # service python client. Those client calls should allow retries of"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_4180acc0","line":40,"range":{"start_line":40,"start_character":10,"end_line":40,"end_character":42},"in_reply_to":"1ac06dbe_ed910b54","updated":"2016-08-29 11:41:52.000000000","message":"No, I do not mean that. The configuration changes would still require a restart of the nova-compute daemon. What I mean is that transient communication failures for *correctly-configured* services would not require a restart.","commit_id":"b10bff83a7d422d8cd9ead171540692c4bb24e74"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"7e2f1e89602acd7a4e2fc16dc742ab7a78c50255","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        rp \u003d self._get_resource_provider(uuid)"},{"line_number":181,"context_line":"        if rp is None:"},{"line_number":182,"context_line":"            name \u003d name or uuid"},{"line_number":183,"context_line":"            rp \u003d self._create_resource_provider(uuid, name)"},{"line_number":184,"context_line":"        self._resource_providers[uuid] \u003d rp"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def update_resource_stats(self, compute_node):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ac06dbe_2277b2d5","line":183,"range":{"start_line":183,"start_character":12,"end_line":183,"end_character":14},"updated":"2016-08-25 02:41:49.000000000","message":"Sorry, I didn\u0027t notice this new patchset. I duplicate my comment here:\n\nIt is possible that the \"rp\" here is still \"None\". It may be caused by a buggy implementation in the requests or in placement service, because a created rp cannot be fetched properly.\n\nSo here misses an unrecoverable error, correct?","commit_id":"b10bff83a7d422d8cd9ead171540692c4bb24e74"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"1a27ff584bb673dd657362e461a51b57d83d4344","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        rp \u003d self._get_resource_provider(uuid)"},{"line_number":181,"context_line":"        if rp is None:"},{"line_number":182,"context_line":"            name \u003d name or uuid"},{"line_number":183,"context_line":"            rp \u003d self._create_resource_provider(uuid, name)"},{"line_number":184,"context_line":"        self._resource_providers[uuid] \u003d rp"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def update_resource_stats(self, compute_node):"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ac06dbe_f872347b","line":183,"range":{"start_line":183,"start_character":12,"end_line":183,"end_character":14},"in_reply_to":"1ac06dbe_2277b2d5","updated":"2016-08-29 12:39:15.000000000","message":"Good catch.","commit_id":"b10bff83a7d422d8cd9ead171540692c4bb24e74"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6121852471a72ff551858a091b3c1f00987c15ef","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        rp \u003d self._get_resource_provider(uuid)"},{"line_number":181,"context_line":"        if rp is None:"},{"line_number":182,"context_line":"            name \u003d name or uuid"},{"line_number":183,"context_line":"            rp \u003d self._create_resource_provider(uuid, name)"},{"line_number":184,"context_line":"        self._resource_providers[uuid] \u003d rp"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"    def update_resource_stats(self, compute_node):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa7ab95a_41ceec2e","line":183,"range":{"start_line":183,"start_character":12,"end_line":183,"end_character":14},"in_reply_to":"1ac06dbe_2277b2d5","updated":"2016-08-29 11:41:52.000000000","message":"Kind of, yes, though there is no bad side-effect as yet from this patch because the _ensure_resource_provider() always starts with a short-circuit catch on the _placement_api_error marker.\n\nIn any case, I\u0027ll change the code to be fail-soft as Chris suggests and fix this up...","commit_id":"b10bff83a7d422d8cd9ead171540692c4bb24e74"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"58e1725564f430087712a1f31cf440d00b20a151","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        \"\"\"Query Keystone and return the base URL for the placement API"},{"line_number":43,"context_line":"        service."},{"line_number":44,"context_line":"        \"\"\""},{"line_number":45,"context_line":"        ks_sess \u003d keystone.load_session_from_conf_options(CONF, \u0027placement\u0027)"},{"line_number":46,"context_line":"        elevated \u003d context.get_admin_context()"},{"line_number":47,"context_line":"        auth \u003d elevated.get_auth_plugin()"},{"line_number":48,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_72f1fd00","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":15},"updated":"2016-08-29 16:12:19.000000000","message":"nit: could you just call this \u0027session\u0027 or \u0027ks_session\u0027 - \u0027sess\u0027 is a funky abbreviation :)","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"58e1725564f430087712a1f31cf440d00b20a151","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                    interface\u003d\u0027publicURL\u0027,"},{"line_number":54,"context_line":"                    os_region_name\u003dCONF.placement.os_region_name,"},{"line_number":55,"context_line":"            )"},{"line_number":56,"context_line":"        except Exception as err:"},{"line_number":57,"context_line":"            msg \u003d _LE(\"Error attempting to determine placement URL: %s\")"},{"line_number":58,"context_line":"            LOG.error(msg, err)"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_b2c62598","line":56,"range":{"start_line":56,"start_character":15,"end_line":56,"end_character":24},"updated":"2016-08-29 16:12:19.000000000","message":"Can we be more specific than this?","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a445b5f9b0001868505101247dd8ed7719df5f88","unresolved":false,"context_lines":[{"line_number":53,"context_line":"                    interface\u003d\u0027publicURL\u0027,"},{"line_number":54,"context_line":"                    os_region_name\u003dCONF.placement.os_region_name,"},{"line_number":55,"context_line":"            )"},{"line_number":56,"context_line":"        except Exception as err:"},{"line_number":57,"context_line":"            msg \u003d _LE(\"Error attempting to determine placement URL: %s\")"},{"line_number":58,"context_line":"            LOG.error(msg, err)"},{"line_number":59,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_bde6eaad","line":56,"range":{"start_line":56,"start_character":15,"end_line":56,"end_character":24},"in_reply_to":"fa7ab95a_b2c62598","updated":"2016-08-29 16:20:48.000000000","message":"No, we really can\u0027t. It\u0027s a catch-all to prevent the report client from blowing up and taking down the nova-compute worker.","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"58e1725564f430087712a1f31cf440d00b20a151","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        \"\"\"Queries the placement API for a resource provider record with the"},{"line_number":62,"context_line":"        supplied UUID."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        Returns an `objects.ResourceProvider` object if found or None if no"},{"line_number":65,"context_line":"        such resource provider could be found."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        :param uuid: UUID identifier for the resource provider to look up"},{"line_number":68,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_72801df8","line":65,"range":{"start_line":64,"start_character":8,"end_line":65,"end_character":46},"updated":"2016-08-29 16:12:19.000000000","message":"nit: Encode this as \u0027:return:\u0027 if you\u0027re using Sphinx annotations below?","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a445b5f9b0001868505101247dd8ed7719df5f88","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        \"\"\"Queries the placement API for a resource provider record with the"},{"line_number":62,"context_line":"        supplied UUID."},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        Returns an `objects.ResourceProvider` object if found or None if no"},{"line_number":65,"context_line":"        such resource provider could be found."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        :param uuid: UUID identifier for the resource provider to look up"},{"line_number":68,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_5df87e49","line":65,"range":{"start_line":64,"start_character":8,"end_line":65,"end_character":46},"in_reply_to":"fa7ab95a_72801df8","updated":"2016-08-29 16:20:48.000000000","message":"ok, will do.","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"58e1725564f430087712a1f31cf440d00b20a151","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        :param uuid: UUID identifier for the resource provider to look up"},{"line_number":68,"context_line":"        \"\"\""},{"line_number":69,"context_line":"        url \u003d \"{0}/resource_providers/{1}\".format(self._placement_url, uuid)"},{"line_number":70,"context_line":"        sess \u003d self._placement_session"},{"line_number":71,"context_line":"        resp \u003d sess.get(url)"},{"line_number":72,"context_line":"        if resp.status_code \u003d\u003d 200:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_72b2dd07","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":76},"updated":"2016-08-29 16:12:19.000000000","message":"Would there be any merit in spinning this out into a \u0027_get_url\u0027 function? This is hardcoded string duplicated at least once now with more possible in the future(?) ?","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a445b5f9b0001868505101247dd8ed7719df5f88","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        :param uuid: UUID identifier for the resource provider to look up"},{"line_number":68,"context_line":"        \"\"\""},{"line_number":69,"context_line":"        url \u003d \"{0}/resource_providers/{1}\".format(self._placement_url, uuid)"},{"line_number":70,"context_line":"        sess \u003d self._placement_session"},{"line_number":71,"context_line":"        resp \u003d sess.get(url)"},{"line_number":72,"context_line":"        if resp.status_code \u003d\u003d 200:"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_dd700edf","line":69,"range":{"start_line":69,"start_character":8,"end_line":69,"end_character":76},"in_reply_to":"fa7ab95a_72b2dd07","updated":"2016-08-29 16:20:48.000000000","message":"Not really, IMHO. Eventually, all of this will be in the placement client library anyway.","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"58e1725564f430087712a1f31cf440d00b20a151","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        :param uuid: UUID identifier for the resource provider to look up"},{"line_number":68,"context_line":"        \"\"\""},{"line_number":69,"context_line":"        url \u003d \"{0}/resource_providers/{1}\".format(self._placement_url, uuid)"},{"line_number":70,"context_line":"        sess \u003d self._placement_session"},{"line_number":71,"context_line":"        resp \u003d sess.get(url)"},{"line_number":72,"context_line":"        if resp.status_code \u003d\u003d 200:"},{"line_number":73,"context_line":"            data \u003d resp.json()"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_523eb98c","line":70,"range":{"start_line":70,"start_character":8,"end_line":70,"end_character":12},"updated":"2016-08-29 16:12:19.000000000","message":"ditto: session?","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a445b5f9b0001868505101247dd8ed7719df5f88","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        :param uuid: UUID identifier for the resource provider to look up"},{"line_number":68,"context_line":"        \"\"\""},{"line_number":69,"context_line":"        url \u003d \"{0}/resource_providers/{1}\".format(self._placement_url, uuid)"},{"line_number":70,"context_line":"        sess \u003d self._placement_session"},{"line_number":71,"context_line":"        resp \u003d sess.get(url)"},{"line_number":72,"context_line":"        if resp.status_code \u003d\u003d 200:"},{"line_number":73,"context_line":"            data \u003d resp.json()"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_bd426a66","line":70,"range":{"start_line":70,"start_character":8,"end_line":70,"end_character":12},"in_reply_to":"fa7ab95a_523eb98c","updated":"2016-08-29 16:20:48.000000000","message":"meh :)","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"0b0fe67f7deaa938d4f17287854826f08b5c55f2","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        :param compute_node: updated nova.objects.ComputeNode to report"},{"line_number":172,"context_line":"        \"\"\""},{"line_number":173,"context_line":"        compute_node.save()"},{"line_number":174,"context_line":"        _rp \u003d self._ensure_resource_provider(compute_node.uuid,"},{"line_number":175,"context_line":"                                             compute_node.hypervisor_hostname)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_1c544a1f","line":174,"range":{"start_line":174,"start_character":8,"end_line":174,"end_character":14},"updated":"2016-08-29 12:45:27.000000000","message":"What\u0027s the purpose of storing the return value if it\u0027s not used? Is this another one of those \"it will be used in a later patch\"?","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"58e1725564f430087712a1f31cf440d00b20a151","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        :param compute_node: updated nova.objects.ComputeNode to report"},{"line_number":172,"context_line":"        \"\"\""},{"line_number":173,"context_line":"        compute_node.save()"},{"line_number":174,"context_line":"        _rp \u003d self._ensure_resource_provider(compute_node.uuid,"},{"line_number":175,"context_line":"                                             compute_node.hypervisor_hostname)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_b2b1c549","line":174,"range":{"start_line":174,"start_character":8,"end_line":174,"end_character":14},"in_reply_to":"fa7ab95a_1c544a1f","updated":"2016-08-29 16:12:19.000000000","message":"+1","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a445b5f9b0001868505101247dd8ed7719df5f88","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        :param compute_node: updated nova.objects.ComputeNode to report"},{"line_number":172,"context_line":"        \"\"\""},{"line_number":173,"context_line":"        compute_node.save()"},{"line_number":174,"context_line":"        _rp \u003d self._ensure_resource_provider(compute_node.uuid,"},{"line_number":175,"context_line":"                                             compute_node.hypervisor_hostname)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa7ab95a_7d338214","line":174,"range":{"start_line":174,"start_character":8,"end_line":174,"end_character":14},"in_reply_to":"fa7ab95a_b2b1c549","updated":"2016-08-29 16:20:48.000000000","message":"Sorry, was leftover debugging cruft. Removed.","commit_id":"e91cfe5ded5c0439a07b5e25e06c8f20c4ffda33"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"39623873cbc92cd9094c8fc929b024adc6d5d9e3","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                    os_region_name\u003dCONF.placement.os_region_name,"},{"line_number":55,"context_line":"            )"},{"line_number":56,"context_line":"        except Exception as err:"},{"line_number":57,"context_line":"            msg \u003d _LE(\"Error attempting to determine placement URL: %s\")"},{"line_number":58,"context_line":"            LOG.error(msg, err)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _get_resource_provider(self, uuid):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa7ab95a_a0a23dfb","line":57,"updated":"2016-08-29 16:22:52.000000000","message":"I think you need this first:\n\nhttps://review.openstack.org/#/c/342362/","commit_id":"06ebdf903b14222d04b07c98188fe779d667e4c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d1b7e0308e5fbbdd4fb48c50f16810774fd28f61","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                    os_region_name\u003dCONF.placement.os_region_name,"},{"line_number":55,"context_line":"            )"},{"line_number":56,"context_line":"        except Exception as err:"},{"line_number":57,"context_line":"            msg \u003d _LE(\"Error attempting to determine placement URL: %s\")"},{"line_number":58,"context_line":"            LOG.error(msg, err)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _get_resource_provider(self, uuid):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa7ab95a_f1417664","line":57,"in_reply_to":"fa7ab95a_a0a23dfb","updated":"2016-08-29 17:51:56.000000000","message":"Going back to what we talked about in IRC today, I think we want the following to happen in Newton:\n\n1. keep retrying the service catalog on each RT loop even if we failed once - the admin could update the SC and we don\u0027t want to require restarting nova-compute to reset a global flag that could be fixed external to this service.\n\n2. set a global flag in the nova-compute service so that we only log an SC connection failure warning once, and then reset the flag on a successful connection.\n\n--\n\nThere was a comment in IRC about the retry requiring a lot of additional work, and I\u0027m not sure why or where that happens.\n\nMaybe the problem is because the check for the endpoint is in the init of this object, so basically, like in patch set 1, the object itself has to be marked dirty so the RT using it doesn\u0027t call update_resource_stats on it. But couldn\u0027t we hide that within the object itself, by just trying to get the placement URL in update_resource_stats if we don\u0027t have it yet, and return if we can\u0027t get it set.","commit_id":"06ebdf903b14222d04b07c98188fe779d667e4c2"},{"author":{"_account_id":15648,"name":"Yingxin","email":"yingxin.cheng@intel.com","username":"Yingxin"},"change_message_id":"d5541939911f988acfde6d9219c506f15b5a1730","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                    os_region_name\u003dCONF.placement.os_region_name,"},{"line_number":55,"context_line":"            )"},{"line_number":56,"context_line":"        except Exception as err:"},{"line_number":57,"context_line":"            msg \u003d _LE(\"Error attempting to determine placement URL: %s\")"},{"line_number":58,"context_line":"            LOG.error(msg, err)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _get_resource_provider(self, uuid):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa7ab95a_e34ef36d","line":57,"in_reply_to":"fa7ab95a_c4c02353","updated":"2016-08-30 02:46:15.000000000","message":"Agree, instead of initiating the object directly in __init__, we can have a lazy style initiation for ReportClient object:\n\n1. Use a marker to indicate whether this client is correctly initiated.\n\n2. Prevent connecting to placement service and thus suppress the error logs if the client is marked error.\n\n3. Create a periodical retry thread to check the error marker and re-initiate the client.\n\nBy the way, is it \"a lot of additional work\"?","commit_id":"06ebdf903b14222d04b07c98188fe779d667e4c2"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"6b72b5b1b0d58d9acfb8d003926390d1704030d5","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                    os_region_name\u003dCONF.placement.os_region_name,"},{"line_number":55,"context_line":"            )"},{"line_number":56,"context_line":"        except Exception as err:"},{"line_number":57,"context_line":"            msg \u003d _LE(\"Error attempting to determine placement URL: %s\")"},{"line_number":58,"context_line":"            LOG.error(msg, err)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _get_resource_provider(self, uuid):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa7ab95a_96cd0e60","line":57,"in_reply_to":"fa7ab95a_e34ef36d","updated":"2016-08-31 08:32:04.000000000","message":"Honestly, this is what is infuriating. Yingxin, what you describe above is *exactly* how I had things in the original revision of this patch (except for the \"separate periodical retry thread\") and you and Chris said it wasn\u0027t robust enough.\n\nThe original patch revision was just enough code to work without a bunch of retry logic and had log messages that clearly indicated to an admin what would be necessary to fix connectivity issues.","commit_id":"06ebdf903b14222d04b07c98188fe779d667e4c2"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"aa65e02669681de45ddb019e795e5e01cf152a13","unresolved":false,"context_lines":[{"line_number":54,"context_line":"                    os_region_name\u003dCONF.placement.os_region_name,"},{"line_number":55,"context_line":"            )"},{"line_number":56,"context_line":"        except Exception as err:"},{"line_number":57,"context_line":"            msg \u003d _LE(\"Error attempting to determine placement URL: %s\")"},{"line_number":58,"context_line":"            LOG.error(msg, err)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def _get_resource_provider(self, uuid):"}],"source_content_type":"text/x-python","patch_set":5,"id":"fa7ab95a_c4c02353","line":57,"in_reply_to":"fa7ab95a_f1417664","updated":"2016-08-29 21:13:24.000000000","message":"I agree, we could try caching that URL but in case we don\u0027t have it yet provided, then every update should try to get it.","commit_id":"06ebdf903b14222d04b07c98188fe779d667e4c2"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"17c9730b0da80fdb1c95a8d7e305e47319d744ab","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        \"\"\""},{"line_number":69,"context_line":"        url \u003d \"{0}/resource_providers/{1}\".format(self._placement_url, uuid)"},{"line_number":70,"context_line":"        sess \u003d self._placement_session"},{"line_number":71,"context_line":"        resp \u003d sess.get(url)"},{"line_number":72,"context_line":"        if resp.status_code \u003d\u003d 200:"},{"line_number":73,"context_line":"            data \u003d resp.json()"},{"line_number":74,"context_line":"            return objects.ResourceProvider("}],"source_content_type":"text/x-python","patch_set":5,"id":"fa7ab95a_0ed06c1e","line":71,"updated":"2016-08-29 20:33:51.000000000","message":"how does this actually work without the keystone session?","commit_id":"06ebdf903b14222d04b07c98188fe779d667e4c2"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"254efa2313309dcb986bfde32a7ccaa6c864c447","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            LOG.warning(msg)"},{"line_number":51,"context_line":"            self._disabled \u003d True"},{"line_number":52,"context_line":"        except ks_exc.ConnectFailure:"},{"line_number":53,"context_line":"            msg \u003d _LW(\u0027placement api not responding\u0027)"},{"line_number":54,"context_line":"    return wrapper"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"fa7ab95a_b74bfa5e","line":53,"range":{"start_line":53,"start_character":12,"end_line":53,"end_character":53},"updated":"2016-08-31 06:38:23.000000000","message":"Emm...maybe you forget to send this msg out.","commit_id":"c3688f74b7333bfd2f11a2cf17489d468fba3f31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ec7b41386c1967d6204c14a0e33b344781898a7d","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        self._resource_providers \u003d {}"},{"line_number":68,"context_line":"        auth_plugin \u003d keystone.load_auth_from_conf_options("},{"line_number":69,"context_line":"            CONF, \u0027placement\u0027)"},{"line_number":70,"context_line":"        self._client \u003d session.Session(auth\u003dauth_plugin)"},{"line_number":71,"context_line":"        # TODO(sdague): use this to disable fully when we don\u0027t find"},{"line_number":72,"context_line":"        # the endpoint."},{"line_number":73,"context_line":"        #"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa7ab95a_0462a4ad","line":70,"updated":"2016-08-31 09:02:32.000000000","message":"Note that my original patch was modeled (almost verbatim) from the existing code in the Cinder volume driver:\n\nhttps://github.com/openstack/nova/blob/master/nova/volume/cinder.py#L71-L83\n\nThis was, as noted in the commit message, on purpose.","commit_id":"c3688f74b7333bfd2f11a2cf17489d468fba3f31"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ec7b41386c1967d6204c14a0e33b344781898a7d","unresolved":false,"context_lines":[{"line_number":71,"context_line":"        # TODO(sdague): use this to disable fully when we don\u0027t find"},{"line_number":72,"context_line":"        # the endpoint."},{"line_number":73,"context_line":"        #"},{"line_number":74,"context_line":"        self._disabled \u003d False"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    # REST helpers that also handle some of our error and recovery"},{"line_number":77,"context_line":"    def get(self, url):"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa7ab95a_24a40807","line":74,"updated":"2016-08-31 09:02:32.000000000","message":"This is *exactly* what I had originally. It was called _placement_api_error, though:\n\nhttps://review.openstack.org/#/c/358797/1/nova/scheduler/client/report.py","commit_id":"c3688f74b7333bfd2f11a2cf17489d468fba3f31"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"a30b2548cd7d512b182bdda502387d810d8c4b91","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        :param uuid: UUID identifier for the resource provider to look up"},{"line_number":100,"context_line":"        \"\"\""},{"line_number":101,"context_line":"        resp \u003d self.get(\"/resource_providers/%s\" % uuid)"},{"line_number":102,"context_line":"        if resp.status_code \u003d\u003d 200:"},{"line_number":103,"context_line":"            data \u003d resp.json()"},{"line_number":104,"context_line":"            return objects.ResourceProvider("}],"source_content_type":"text/x-python","patch_set":10,"id":"fa7ab95a_65c2a354","line":101,"range":{"start_line":101,"start_character":24,"end_line":101,"end_character":26},"updated":"2016-08-30 21:59:21.000000000","message":"Is the service endpoint provided by ks auth?","commit_id":"c3688f74b7333bfd2f11a2cf17489d468fba3f31"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9954bb2419ae4c42b230c8c614a4d08c9eb2fe24","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            LOG.info(msg, args)"},{"line_number":158,"context_line":"            return self._get_resource_provider(uuid)"},{"line_number":159,"context_line":"        else:"},{"line_number":160,"context_line":"            msg \u003d _LE(\"Failed to create resource provider record in \""},{"line_number":161,"context_line":"                      \"placement API for UUID %(uuid)s. \""},{"line_number":162,"context_line":"                      \"Got %(status_code)d: %(err_text)s.\")"},{"line_number":163,"context_line":"            args \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa7ab95a_1172f6ad","line":160,"updated":"2016-08-31 01:43:45.000000000","message":"We seem to hit this early in the placement-api job run and I\u0027m not sure why:\n\nhttp://logs.openstack.org/97/358797/10/experimental/gate-tempest-dsvm-neutron-placement-full-ubuntu-xenial-nv/2313314/logs/screen-n-cpu.txt.gz?level\u003dTRACE#_2016-08-30_22_28_52_495\n\nAnd uuid a3c16024-adc9-44d5-8849-cf8ee9588345 doesn\u0027t show up again after that.","commit_id":"c3688f74b7333bfd2f11a2cf17489d468fba3f31"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"03c66491cc0ef085568bce3f8c60c62a578ee5fe","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            LOG.info(msg, args)"},{"line_number":158,"context_line":"            return self._get_resource_provider(uuid)"},{"line_number":159,"context_line":"        else:"},{"line_number":160,"context_line":"            msg \u003d _LE(\"Failed to create resource provider record in \""},{"line_number":161,"context_line":"                      \"placement API for UUID %(uuid)s. \""},{"line_number":162,"context_line":"                      \"Got %(status_code)d: %(err_text)s.\")"},{"line_number":163,"context_line":"            args \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa7ab95a_656c4a37","line":160,"in_reply_to":"fa7ab95a_1172f6ad","updated":"2016-08-31 09:46:26.000000000","message":"Maybe this due to we start nova before the placement api. Then we will retry this case just like line 53 skip the error. But I\u0027m not sure why the address is \"\u003caddress\u003eApache/2.4.18 (Ubuntu) Server at 127.0.0.1 Port 80\u003c/address\u003e\"","commit_id":"c3688f74b7333bfd2f11a2cf17489d468fba3f31"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"79df17dd15442dc272af89b531c2e7201ebd377d","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            LOG.info(msg, args)"},{"line_number":158,"context_line":"            return self._get_resource_provider(uuid)"},{"line_number":159,"context_line":"        else:"},{"line_number":160,"context_line":"            msg \u003d _LE(\"Failed to create resource provider record in \""},{"line_number":161,"context_line":"                      \"placement API for UUID %(uuid)s. \""},{"line_number":162,"context_line":"                      \"Got %(status_code)d: %(err_text)s.\")"},{"line_number":163,"context_line":"            args \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa7ab95a_1afe7c05","line":160,"in_reply_to":"fa7ab95a_1711f5af","updated":"2016-08-31 10:01:18.000000000","message":"Ok, that\u0027s due to Keystone return a MissingAuthPlugin exception...","commit_id":"c3688f74b7333bfd2f11a2cf17489d468fba3f31"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3006dbdbd9dc9822a653d56179d4f8cd67009490","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            LOG.info(msg, args)"},{"line_number":158,"context_line":"            return self._get_resource_provider(uuid)"},{"line_number":159,"context_line":"        else:"},{"line_number":160,"context_line":"            msg \u003d _LE(\"Failed to create resource provider record in \""},{"line_number":161,"context_line":"                      \"placement API for UUID %(uuid)s. \""},{"line_number":162,"context_line":"                      \"Got %(status_code)d: %(err_text)s.\")"},{"line_number":163,"context_line":"            args \u003d {"}],"source_content_type":"text/x-python","patch_set":10,"id":"fa7ab95a_1711f5af","line":160,"in_reply_to":"fa7ab95a_656c4a37","updated":"2016-08-31 09:57:07.000000000","message":"Given the tests are complaining we don\u0027t call .post(), I think we then have resp equal to None, which goes there. I\u0027m investigating on my local machine.","commit_id":"c3688f74b7333bfd2f11a2cf17489d468fba3f31"},{"author":{"_account_id":2750,"name":"Sean Dague","email":"sean@dague.net","username":"sdague"},"change_message_id":"4a5f925d345280f699bdf556283fc86cee53f399","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        except ks_exc.ConnectFailure:"},{"line_number":51,"context_line":"            msg \u003d _LW(\u0027Placement API service is not responding.\u0027)"},{"line_number":52,"context_line":"            LOG.warning(msg)"},{"line_number":53,"context_line":"            self._disabled \u003d True"},{"line_number":54,"context_line":"    return wrapper"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"fa7ab95a_413ad3e8","line":53,"updated":"2016-08-31 11:12:47.000000000","message":"We shouldn\u0027t disable here, this is what happens if you drop connectivity to the placement api for 1 second. There is no real indication that this would be a permanent issue, unlike the ones above.","commit_id":"20bbb00e6d1030088fc6b4dd2c24a2ac0aef003f"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"17a1331470d9c5925fbf68bfedb16c512a8a7f9b","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def wrapper(self, *a, **k):"},{"line_number":34,"context_line":"        try:"},{"line_number":35,"context_line":"            # We\u0027ve failed in a non recoverable way, fully give up."},{"line_number":36,"context_line":"            if self._disabled:"},{"line_number":37,"context_line":"                return"},{"line_number":38,"context_line":"            return f(self, *a, **k)"},{"line_number":39,"context_line":"        except ks_exc.EndpointNotFound:"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_39033c78","line":36,"updated":"2016-08-31 14:16:23.000000000","message":"Do we have a unit test for this?","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f7505ca199a503a241b7d4af9de09c594e82a7be","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def wrapper(self, *a, **k):"},{"line_number":34,"context_line":"        try:"},{"line_number":35,"context_line":"            # We\u0027ve failed in a non recoverable way, fully give up."},{"line_number":36,"context_line":"            if self._disabled:"},{"line_number":37,"context_line":"                return"},{"line_number":38,"context_line":"            return f(self, *a, **k)"},{"line_number":39,"context_line":"        except ks_exc.EndpointNotFound:"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_b924acc6","line":36,"in_reply_to":"fa7ab95a_39033c78","updated":"2016-08-31 14:19:50.000000000","message":"Sounds like no, but that can be added later.","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4fb89fce8680305e4b2471f5ca0520e5bfbb57a1","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    def wrapper(self, *a, **k):"},{"line_number":34,"context_line":"        try:"},{"line_number":35,"context_line":"            # We\u0027ve failed in a non recoverable way, fully give up."},{"line_number":36,"context_line":"            if self._disabled:"},{"line_number":37,"context_line":"                return"},{"line_number":38,"context_line":"            return f(self, *a, **k)"},{"line_number":39,"context_line":"        except ks_exc.EndpointNotFound:"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_d4c0557f","line":36,"in_reply_to":"fa7ab95a_b924acc6","updated":"2016-08-31 14:22:39.000000000","message":"Verified when we don\u0027t have the auth options configured and don\u0027t have the placement endpoint in the service catalog we fail and disable, and don\u0027t keep checking:\n\nhttp://logs.openstack.org/97/358797/13/check/gate-tempest-dsvm-neutron-full-ubuntu-xenial/3ce2677/logs/screen-n-cpu.txt.gz?level\u003dWARNING#_2016-08-31_11_37_54_356","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"17a1331470d9c5925fbf68bfedb16c512a8a7f9b","unresolved":false,"context_lines":[{"line_number":36,"context_line":"            if self._disabled:"},{"line_number":37,"context_line":"                return"},{"line_number":38,"context_line":"            return f(self, *a, **k)"},{"line_number":39,"context_line":"        except ks_exc.EndpointNotFound:"},{"line_number":40,"context_line":"            msg \u003d _LW(\"The placement API endpoint not found. Optional use of \""},{"line_number":41,"context_line":"                      \"placement API for reporting is now disabled.\")"},{"line_number":42,"context_line":"            LOG.warning(msg)"},{"line_number":43,"context_line":"            self._disabled \u003d True"},{"line_number":44,"context_line":"        except ks_exc.MissingAuthPlugin:"},{"line_number":45,"context_line":"            msg \u003d _LW(\"No authentication information found for placement API. \""},{"line_number":46,"context_line":"                      \"Optional use of placement API for reporting is now \""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_9b2440c7","line":43,"range":{"start_line":39,"start_character":8,"end_line":43,"end_character":33},"updated":"2016-08-31 14:16:23.000000000","message":"To be clear, if we hit this it means there is no placement entry in the service catalog, right? And if we set the _disabled\u003dTrue flag, we\u0027re not going to try and reconnect again at all without restarting the nova-compute service? I thought at one point we talked about allowing this to continue retrying every 60 seconds (since that\u0027s the default interval for the update_available_resource task), because the admin could then update the service catalog globally and all of the nova-computes would automatically pick it up without having to be restarted.\n\nWe should at least have this as info in the release note. We could also update that warning message to remind that you have to restart nova-compute on this host to make it try and connect again once the entry is in the service catalog.","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"17a1331470d9c5925fbf68bfedb16c512a8a7f9b","unresolved":false,"context_lines":[{"line_number":42,"context_line":"            LOG.warning(msg)"},{"line_number":43,"context_line":"            self._disabled \u003d True"},{"line_number":44,"context_line":"        except ks_exc.MissingAuthPlugin:"},{"line_number":45,"context_line":"            msg \u003d _LW(\"No authentication information found for placement API. \""},{"line_number":46,"context_line":"                      \"Optional use of placement API for reporting is now \""},{"line_number":47,"context_line":"                      \"disabled.\")"},{"line_number":48,"context_line":"            LOG.warning(msg)"},{"line_number":49,"context_line":"            self._disabled \u003d True"},{"line_number":50,"context_line":"        except ks_exc.ConnectFailure:"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_3ed7a224","line":47,"range":{"start_line":45,"start_character":12,"end_line":47,"end_character":34},"updated":"2016-08-31 14:16:23.000000000","message":"At least in this case as an operator I know that I\u0027m missing auth stuff in the [placement] section of nova.conf and will need to add that in and restart nova-compute to pick it up (unless those options will be reloaded on a SIGHUP now).","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"17a1331470d9c5925fbf68bfedb16c512a8a7f9b","unresolved":false,"context_lines":[{"line_number":135,"context_line":"        if resp.status_code \u003d\u003d 201:"},{"line_number":136,"context_line":"            msg \u003d _LI(\"Created resource provider record via placement API \""},{"line_number":137,"context_line":"                      \"for resource provider with UUID {0} and name {1}.\")"},{"line_number":138,"context_line":"            msg \u003d msg.format(uuid, name)"},{"line_number":139,"context_line":"            LOG.info(msg)"},{"line_number":140,"context_line":"            return objects.ResourceProvider("},{"line_number":141,"context_line":"                    uuid\u003duuid,"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_fe2b7a92","line":138,"updated":"2016-08-31 14:16:23.000000000","message":"We shouldn\u0027t actually do this, uuid and name should be args passed to the LOG.info method. But then you can\u0027t use {0} and {1} in the message.","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"17a1331470d9c5925fbf68bfedb16c512a8a7f9b","unresolved":false,"context_lines":[{"line_number":144,"context_line":"            )"},{"line_number":145,"context_line":"        elif resp.status_code \u003d\u003d 409:"},{"line_number":146,"context_line":"            # Another thread concurrently created a resource provider with the"},{"line_number":147,"context_line":"            # same UUID. Log a warning and then just return the resource"},{"line_number":148,"context_line":"            # provider object from _get_resource_provider()"},{"line_number":149,"context_line":"            msg \u003d _LI(\"Another thread already created a resource provider \""},{"line_number":150,"context_line":"                      \"with the UUID {0}. Grabbing that record from \""}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_592ac07f","line":147,"range":{"start_line":147,"start_character":31,"end_line":147,"end_character":38},"updated":"2016-08-31 14:16:23.000000000","message":"we aren\u0027t logging a warning, we\u0027re logging info","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"17a1331470d9c5925fbf68bfedb16c512a8a7f9b","unresolved":false,"context_lines":[{"line_number":149,"context_line":"            msg \u003d _LI(\"Another thread already created a resource provider \""},{"line_number":150,"context_line":"                      \"with the UUID {0}. Grabbing that record from \""},{"line_number":151,"context_line":"                      \"the placement API.\")"},{"line_number":152,"context_line":"            msg \u003d msg.format(uuid)"},{"line_number":153,"context_line":"            LOG.info(msg)"},{"line_number":154,"context_line":"            return self._get_resource_provider(uuid)"},{"line_number":155,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_7956a407","line":152,"updated":"2016-08-31 14:16:23.000000000","message":"same as above, this should happen when the message is logged.","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"17a1331470d9c5925fbf68bfedb16c512a8a7f9b","unresolved":false,"context_lines":[{"line_number":154,"context_line":"            return self._get_resource_provider(uuid)"},{"line_number":155,"context_line":"        else:"},{"line_number":156,"context_line":"            msg \u003d _LE(\"Failed to create resource provider record in \""},{"line_number":157,"context_line":"                      \"placement API for UUID %(uuid)s. \""},{"line_number":158,"context_line":"                      \"Got %(status_code)d: %(err_text)s.\")"},{"line_number":159,"context_line":"            args \u003d {"},{"line_number":160,"context_line":"                \u0027uuid\u0027: uuid,"}],"source_content_type":"text/x-python","patch_set":13,"id":"fa7ab95a_39817c4e","line":157,"updated":"2016-08-31 14:16:23.000000000","message":"nit: having the name in here would also be helpful since it\u0027s the actual hypervisor hostname.","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"}],"nova/tests/unit/scheduler/client/test_report.py":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1ff1a2b7c9e960a03ce1815c16999f886e0fc2cb","unresolved":false,"context_lines":[{"line_number":253,"context_line":"            requests_mock):"},{"line_number":254,"context_line":"        # Ensure _get_resource_provider() sets the error flag when trying to"},{"line_number":255,"context_line":"        # communicate with the placement API and not getting an error we can"},{"line_number":256,"context_line":"        # deal with"},{"line_number":257,"context_line":"        sess_mock \u003d mock.Mock()"},{"line_number":258,"context_line":"        sess_mock.get_endpoint.return_value \u003d _PLACEMENT_URL"},{"line_number":259,"context_line":"        load_sess_mock.return_value \u003d sess_mock"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_5cb7e1f4","line":256,"updated":"2016-08-22 18:49:53.000000000","message":"How long lived is the report client supposed to be? Under what circumstances can the error flag be cleared. It looks we need a new report client for that too happen, and I\u0027m not sure that looks like a new ResourceTracker which means a new compute manager?\n\n(That\u0027s only based on a too tired examination, though, so I could be completely wrong)","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ff6fbf66efb6ebe7a32734050170bce283628473","unresolved":false,"context_lines":[{"line_number":253,"context_line":"            requests_mock):"},{"line_number":254,"context_line":"        # Ensure _get_resource_provider() sets the error flag when trying to"},{"line_number":255,"context_line":"        # communicate with the placement API and not getting an error we can"},{"line_number":256,"context_line":"        # deal with"},{"line_number":257,"context_line":"        sess_mock \u003d mock.Mock()"},{"line_number":258,"context_line":"        sess_mock.get_endpoint.return_value \u003d _PLACEMENT_URL"},{"line_number":259,"context_line":"        load_sess_mock.return_value \u003d sess_mock"}],"source_content_type":"text/x-python","patch_set":1,"id":"1ac06dbe_e42bef92","line":256,"in_reply_to":"1ac06dbe_5cb7e1f4","updated":"2016-08-24 23:17:42.000000000","message":"The report client is as long lived as the resource tracker object, which is as long-lived as the compute manager, which is as long lived as the compute daemon. So, pretty much long lived.\n\nThe error flag is a brutish way of dealing with this, true, but the alternative is to have the resource tracker crash and burn whenever something goes haywire in the placement service -- or make this patch 10K lines of code doing retries everywhere. I can add the retries in future patches, but frankly, trying to get *something* merged is going to be a giant pain to begin with.","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"}],"releasenotes/notes/placement-config-section-59891ba38e0749e7.yaml":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"1ff1a2b7c9e960a03ce1815c16999f886e0fc2cb","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    configuration options affecting how Nova interacts with the new placement"},{"line_number":9,"context_line":"    API service. The only configuration option currently available is"},{"line_number":10,"context_line":"    `os_region_name` which provides support for Nova to query the appropriate"},{"line_number":11,"context_line":"    OpenStack region\u0027s service catalog for the placement service."}],"source_content_type":"text/x-yaml","patch_set":1,"id":"1ac06dbe_5c38813d","line":11,"updated":"2016-08-22 18:49:53.000000000","message":"Does nova-compute not already know it\u0027s own region? Under what circumstances would someone want a placement api in a different region? Is that kind of flexibility warranted.","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"ff6fbf66efb6ebe7a32734050170bce283628473","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    configuration options affecting how Nova interacts with the new placement"},{"line_number":9,"context_line":"    API service. The only configuration option currently available is"},{"line_number":10,"context_line":"    `os_region_name` which provides support for Nova to query the appropriate"},{"line_number":11,"context_line":"    OpenStack region\u0027s service catalog for the placement service."}],"source_content_type":"text/x-yaml","patch_set":1,"id":"1ac06dbe_ff61b6d4","line":11,"in_reply_to":"1ac06dbe_5c38813d","updated":"2016-08-24 23:17:42.000000000","message":"The placement config section, the way that the placement service endpoint is determined, and the os_region_name option all come directly from how we create long-lived connections to Cinder. The [cinder] section has an os_region_name config option to tell the nova workers which Cinder region to specify when creating a keystone client session. This is intended to be consistent with that.","commit_id":"83da6075845f7ec34ab6dd3496031ec6f202625e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"37cb6cd6fee502a8f6ce64c2640b45f888ea8010","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - The nova-compute worker now communicates with the new placement API"},{"line_number":4,"context_line":"    service. Nova determines the placement API service by querying the"},{"line_number":5,"context_line":"    OpenStack service catalog for the service with a service type of"},{"line_number":6,"context_line":"    \u0027placement\u0027."},{"line_number":7,"context_line":"  - A new [placement] section is added to the nova.conf configuration file for"},{"line_number":8,"context_line":"    configuration options affecting how Nova interacts with the new placement"},{"line_number":9,"context_line":"    API service. The only configuration option currently available is"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"fa7ab95a_aa3e9e89","line":6,"range":{"start_line":4,"start_character":13,"end_line":6,"end_character":16},"updated":"2016-08-29 16:00:37.000000000","message":"I wonder if we need to make this more pronounced in the upgrade section since to get this to work you have to have the service catalog entry.\n\nAlternatively we could allow a hard-coded backdoor option, I think we do that with connecting to cinder too.","commit_id":"06ebdf903b14222d04b07c98188fe779d667e4c2"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"aa65e02669681de45ddb019e795e5e01cf152a13","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - The nova-compute worker now communicates with the new placement API"},{"line_number":4,"context_line":"    service. Nova determines the placement API service by querying the"},{"line_number":5,"context_line":"    OpenStack service catalog for the service with a service type of"},{"line_number":6,"context_line":"    \u0027placement\u0027."},{"line_number":7,"context_line":"  - A new [placement] section is added to the nova.conf configuration file for"},{"line_number":8,"context_line":"    configuration options affecting how Nova interacts with the new placement"},{"line_number":9,"context_line":"    API service. The only configuration option currently available is"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"fa7ab95a_e4a8c78e","line":6,"range":{"start_line":4,"start_character":13,"end_line":6,"end_character":16},"in_reply_to":"fa7ab95a_74ab9475","updated":"2016-08-29 21:13:24.000000000","message":"Just to clarify, I think we should be accepting operators to upgrade to Newton without requiring to add a new service entry in Keystone, but then warn something in the logs so they could fix that before upgrading to Ocata.","commit_id":"06ebdf903b14222d04b07c98188fe779d667e4c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"98f8164a6c1aad52865533b0228f4af881f83392","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - The nova-compute worker now communicates with the new placement API"},{"line_number":4,"context_line":"    service. Nova determines the placement API service by querying the"},{"line_number":5,"context_line":"    OpenStack service catalog for the service with a service type of"},{"line_number":6,"context_line":"    \u0027placement\u0027."},{"line_number":7,"context_line":"  - A new [placement] section is added to the nova.conf configuration file for"},{"line_number":8,"context_line":"    configuration options affecting how Nova interacts with the new placement"},{"line_number":9,"context_line":"    API service. The only configuration option currently available is"}],"source_content_type":"text/x-yaml","patch_set":5,"id":"fa7ab95a_74ab9475","line":6,"range":{"start_line":4,"start_character":13,"end_line":6,"end_character":16},"in_reply_to":"fa7ab95a_aa3e9e89","updated":"2016-08-29 18:03:19.000000000","message":"Ignore the endpoint override backdoor suggestion, I hadn\u0027t read the commit message yet, and agree we want to use the service catalog or bust.","commit_id":"06ebdf903b14222d04b07c98188fe779d667e4c2"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ffa276dc2c8340e534dac7db3c31c2df5e6e5df4","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - The nova-compute worker now communicates with the new placement API"},{"line_number":4,"context_line":"    service. Nova determines the placement API service by querying the"},{"line_number":5,"context_line":"    OpenStack service catalog for the service with a service type of"},{"line_number":6,"context_line":"    \u0027placement\u0027."},{"line_number":7,"context_line":"  - A new [placement] section is added to the nova.conf configuration file for"},{"line_number":8,"context_line":"    configuration options affecting how Nova interacts with the new placement"},{"line_number":9,"context_line":"    API service. The only configuration option currently available is"}],"source_content_type":"text/x-yaml","patch_set":13,"id":"fa7ab95a_79e784ac","line":6,"range":{"start_line":4,"start_character":13,"end_line":6,"end_character":16},"updated":"2016-08-31 14:17:39.000000000","message":"We should probably also mention something in here about how we only try to connect once and if the endpoint doesn\u0027t exist in the catalog we give up and you have to restart nova-compute to attempt a connection again (after you add the endpoint to the catalog).","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"07389e40abe4f90f149a54b55de399aea0a11267","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    configuration options affecting how Nova interacts with the new placement"},{"line_number":9,"context_line":"    API service. The only configuration option currently available is"},{"line_number":10,"context_line":"    `os_region_name` which provides support for Nova to query the appropriate"},{"line_number":11,"context_line":"    OpenStack region\u0027s service catalog for the placement service."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"fa7ab95a_25dcf117","line":11,"updated":"2016-08-31 13:32:50.000000000","message":"This no longer true, right? We\u0027ve got the keystone stuff in there as well now.","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"58b21eb1b1fb34f84ae706b2a664c0a8e492dbde","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    configuration options affecting how Nova interacts with the new placement"},{"line_number":9,"context_line":"    API service. The only configuration option currently available is"},{"line_number":10,"context_line":"    `os_region_name` which provides support for Nova to query the appropriate"},{"line_number":11,"context_line":"    OpenStack region\u0027s service catalog for the placement service."}],"source_content_type":"text/x-yaml","patch_set":13,"id":"fa7ab95a_48510c0e","line":11,"in_reply_to":"fa7ab95a_25dcf117","updated":"2016-08-31 13:39:00.000000000","message":"Looks like we\u0027re not correctly generating the auth entries in the [placement] section of the config sample:\n\nhttp://docs-draft.openstack.org/97/358797/13/check/gate-nova-docs-ubuntu-xenial/6284a96//doc/build/html/sample_config.html\n\nIf that needs things like username, password, etc in it, then we need to fix it, but it could happen in a follow up bug fix.","commit_id":"5fb6f8f511ffef19f9b509219617397d55a50ee5"}]}
