)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"844b6dd5118557b7aae86dbcd224d941269e5426","unresolved":false,"context_lines":[{"line_number":22,"context_line":"scheduling. Following patches will add in support for actually doing"},{"line_number":23,"context_line":"the claim from the scheduler against one or more resources providers by"},{"line_number":24,"context_line":"examining the allocation_requests part of the HTTP response and picking"},{"line_number":25,"context_line":"one that contains the host the scheduler picked during it\u0027s _schedule()"},{"line_number":26,"context_line":"loop."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: I1c0bd2987dcbc38f23b71db2bc8e3267f85168c8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"5f201791_ce5c1080","line":25,"range":{"start_line":25,"start_character":55,"end_line":25,"end_character":59},"updated":"2017-06-23 21:00:04.000000000","message":"its","commit_id":"4e9b2f626e67873052bd38047e97298f80e987aa"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f27e74b98e9c0a773753eb6294adfcbac58b7583","unresolved":false,"context_lines":[{"line_number":22,"context_line":"scheduling. Following patches will add in support for actually doing"},{"line_number":23,"context_line":"the claim from the scheduler against one or more resources providers by"},{"line_number":24,"context_line":"examining the allocation_requests part of the HTTP response and picking"},{"line_number":25,"context_line":"one that contains the host the scheduler picked during it\u0027s _schedule()"},{"line_number":26,"context_line":"loop."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Change-Id: I1c0bd2987dcbc38f23b71db2bc8e3267f85168c8"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"5f201791_51c6654a","line":25,"range":{"start_line":25,"start_character":55,"end_line":25,"end_character":59},"in_reply_to":"5f201791_ce5c1080","updated":"2017-06-23 21:39:20.000000000","message":"Done","commit_id":"4e9b2f626e67873052bd38047e97298f80e987aa"}],"doc/source/placement.rst":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8c7f6f6c2120e51f1d4730721b04ec3111b37564","unresolved":false,"context_lines":[{"line_number":199,"context_line":"  during scheduling. The allocation candidates information was introduced in"},{"line_number":200,"context_line":"  the Placement API 1.10 microversion, so you should upgrade the placement"},{"line_number":201,"context_line":"  service **before** the Nova scheduler service so that the scheduler can take"},{"line_number":202,"context_line":"  advantage of the allocation candidate information."},{"line_number":203,"context_line":""},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"REST API"}],"source_content_type":"text/x-rst","patch_set":18,"id":"3f1d235d_4e5877f9","line":202,"updated":"2017-07-07 15:06:14.000000000","message":"I think this should always be the rule, although not bad to call it out specifically here of course.","commit_id":"0efd4fe8309ab5f5f2fb1901d8127febf82f6351"}],"nova/scheduler/caching_scheduler.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8e25d37efe15bc6164d0b03fac123c84493529f5","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class CachingScheduler(filter_scheduler.FilterScheduler):"},{"line_number":23,"context_line":"    \"\"\"Scheduler to test aggressive caching of the host list."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    Please note, this is a very opinionated scheduler. Be sure to"},{"line_number":26,"context_line":"    review the caveats listed here before selecting this scheduler."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    The aim of this scheduler is to reduce server build times when"},{"line_number":29,"context_line":"    you have large bursts of server builds, by reducing the time it"},{"line_number":30,"context_line":"    takes, from the users point of view, to service each schedule"},{"line_number":31,"context_line":"    request."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    There are two main parts to scheduling a users request:"},{"line_number":34,"context_line":"    * getting the current state of the system"},{"line_number":35,"context_line":"    * using filters and weights to pick the best host"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    This scheduler tries its best to cache in memory the current"},{"line_number":38,"context_line":"    state of the system, so we don\u0027t need to make the expensive"},{"line_number":39,"context_line":"    call to get the current state of the system while processing"},{"line_number":40,"context_line":"    a user\u0027s request, we can do that query in a periodic task"},{"line_number":41,"context_line":"    before the user even issues their request."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    To reduce races, cached info of the chosen host is updated using"},{"line_number":44,"context_line":"    the existing host state call: consume_from_instance"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    Please note, the way this works, each scheduler worker has its own"},{"line_number":47,"context_line":"    copy of the cache. So if you run multiple schedulers, you will get"},{"line_number":48,"context_line":"    more retries, because the data stored on any additional scheduler will"},{"line_number":49,"context_line":"    be more out of date, than if it was fetched from the database."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    In a similar way, if you have a high number of server deletes, the"},{"line_number":52,"context_line":"    extra capacity from those deletes will not show up until the cache is"},{"line_number":53,"context_line":"    refreshed."},{"line_number":54,"context_line":"    \"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":57,"context_line":"        super(CachingScheduler, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_ecaec496","line":54,"range":{"start_line":23,"start_character":4,"end_line":54,"end_character":7},"updated":"2017-07-03 18:47:28.000000000","message":"So moving the allocation candidates request to the host manager is going to indirectly make the caching scheduler use placement, and then throw away/ignore the results.\n\nSince we haven\u0027t deprecated the caching scheduler yet, that is probably going to be a problem since it will impact performance.\n\nWe should probably put a flag in the scheduler driver which says if it uses placement or not so we can bypass that for now and then the host manager would check that flag - or something like that.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"17e69780341b986b5c56e340f6898a6e2f643c2e","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class CachingScheduler(filter_scheduler.FilterScheduler):"},{"line_number":23,"context_line":"    \"\"\"Scheduler to test aggressive caching of the host list."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    Please note, this is a very opinionated scheduler. Be sure to"},{"line_number":26,"context_line":"    review the caveats listed here before selecting this scheduler."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    The aim of this scheduler is to reduce server build times when"},{"line_number":29,"context_line":"    you have large bursts of server builds, by reducing the time it"},{"line_number":30,"context_line":"    takes, from the users point of view, to service each schedule"},{"line_number":31,"context_line":"    request."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    There are two main parts to scheduling a users request:"},{"line_number":34,"context_line":"    * getting the current state of the system"},{"line_number":35,"context_line":"    * using filters and weights to pick the best host"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    This scheduler tries its best to cache in memory the current"},{"line_number":38,"context_line":"    state of the system, so we don\u0027t need to make the expensive"},{"line_number":39,"context_line":"    call to get the current state of the system while processing"},{"line_number":40,"context_line":"    a user\u0027s request, we can do that query in a periodic task"},{"line_number":41,"context_line":"    before the user even issues their request."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    To reduce races, cached info of the chosen host is updated using"},{"line_number":44,"context_line":"    the existing host state call: consume_from_instance"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    Please note, the way this works, each scheduler worker has its own"},{"line_number":47,"context_line":"    copy of the cache. So if you run multiple schedulers, you will get"},{"line_number":48,"context_line":"    more retries, because the data stored on any additional scheduler will"},{"line_number":49,"context_line":"    be more out of date, than if it was fetched from the database."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    In a similar way, if you have a high number of server deletes, the"},{"line_number":52,"context_line":"    extra capacity from those deletes will not show up until the cache is"},{"line_number":53,"context_line":"    refreshed."},{"line_number":54,"context_line":"    \"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":57,"context_line":"        super(CachingScheduler, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_6427f6cb","line":54,"range":{"start_line":23,"start_character":4,"end_line":54,"end_character":7},"in_reply_to":"3f1d235d_386c8f9a","updated":"2017-07-06 19:03:59.000000000","message":"I\u0027m not talking about a CONF option, I\u0027m talking about an attribute on the driver object. Like nova.compute.virt.Driver.capabilities.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"bfbb7ff336e7c72106e85cab1e02ae5d3725aece","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class CachingScheduler(filter_scheduler.FilterScheduler):"},{"line_number":23,"context_line":"    \"\"\"Scheduler to test aggressive caching of the host list."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    Please note, this is a very opinionated scheduler. Be sure to"},{"line_number":26,"context_line":"    review the caveats listed here before selecting this scheduler."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    The aim of this scheduler is to reduce server build times when"},{"line_number":29,"context_line":"    you have large bursts of server builds, by reducing the time it"},{"line_number":30,"context_line":"    takes, from the users point of view, to service each schedule"},{"line_number":31,"context_line":"    request."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    There are two main parts to scheduling a users request:"},{"line_number":34,"context_line":"    * getting the current state of the system"},{"line_number":35,"context_line":"    * using filters and weights to pick the best host"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    This scheduler tries its best to cache in memory the current"},{"line_number":38,"context_line":"    state of the system, so we don\u0027t need to make the expensive"},{"line_number":39,"context_line":"    call to get the current state of the system while processing"},{"line_number":40,"context_line":"    a user\u0027s request, we can do that query in a periodic task"},{"line_number":41,"context_line":"    before the user even issues their request."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    To reduce races, cached info of the chosen host is updated using"},{"line_number":44,"context_line":"    the existing host state call: consume_from_instance"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    Please note, the way this works, each scheduler worker has its own"},{"line_number":47,"context_line":"    copy of the cache. So if you run multiple schedulers, you will get"},{"line_number":48,"context_line":"    more retries, because the data stored on any additional scheduler will"},{"line_number":49,"context_line":"    be more out of date, than if it was fetched from the database."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    In a similar way, if you have a high number of server deletes, the"},{"line_number":52,"context_line":"    extra capacity from those deletes will not show up until the cache is"},{"line_number":53,"context_line":"    refreshed."},{"line_number":54,"context_line":"    \"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":57,"context_line":"        super(CachingScheduler, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_6b116252","line":54,"range":{"start_line":23,"start_character":4,"end_line":54,"end_character":7},"in_reply_to":"3f1d235d_ecaec496","updated":"2017-07-04 13:44:27.000000000","message":"Agreed with Matt here.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5678415830dcb26d29fe009d56ca59ce2426e671","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class CachingScheduler(filter_scheduler.FilterScheduler):"},{"line_number":23,"context_line":"    \"\"\"Scheduler to test aggressive caching of the host list."},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    Please note, this is a very opinionated scheduler. Be sure to"},{"line_number":26,"context_line":"    review the caveats listed here before selecting this scheduler."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    The aim of this scheduler is to reduce server build times when"},{"line_number":29,"context_line":"    you have large bursts of server builds, by reducing the time it"},{"line_number":30,"context_line":"    takes, from the users point of view, to service each schedule"},{"line_number":31,"context_line":"    request."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    There are two main parts to scheduling a users request:"},{"line_number":34,"context_line":"    * getting the current state of the system"},{"line_number":35,"context_line":"    * using filters and weights to pick the best host"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    This scheduler tries its best to cache in memory the current"},{"line_number":38,"context_line":"    state of the system, so we don\u0027t need to make the expensive"},{"line_number":39,"context_line":"    call to get the current state of the system while processing"},{"line_number":40,"context_line":"    a user\u0027s request, we can do that query in a periodic task"},{"line_number":41,"context_line":"    before the user even issues their request."},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    To reduce races, cached info of the chosen host is updated using"},{"line_number":44,"context_line":"    the existing host state call: consume_from_instance"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    Please note, the way this works, each scheduler worker has its own"},{"line_number":47,"context_line":"    copy of the cache. So if you run multiple schedulers, you will get"},{"line_number":48,"context_line":"    more retries, because the data stored on any additional scheduler will"},{"line_number":49,"context_line":"    be more out of date, than if it was fetched from the database."},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    In a similar way, if you have a high number of server deletes, the"},{"line_number":52,"context_line":"    extra capacity from those deletes will not show up until the cache is"},{"line_number":53,"context_line":"    refreshed."},{"line_number":54,"context_line":"    \"\"\""},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def __init__(self, *args, **kwargs):"},{"line_number":57,"context_line":"        super(CachingScheduler, self).__init__(*args, **kwargs)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_386c8f9a","line":54,"range":{"start_line":23,"start_character":4,"end_line":54,"end_character":7},"in_reply_to":"3f1d235d_ecaec496","updated":"2017-07-06 13:04:25.000000000","message":"Note that I am not moving the allocation candidates request to the host manager. I\u0027m putting it in the *scheduler* manager class.\n\nInstead of adding yet-another CONF option, why not just disable the allocation candidate request when we see the scheduler driver is the caching scheduler?","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"87ceb01e07bb59cb712bfe851b48a52edfdc4315","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        # fetch the list of hosts."},{"line_number":68,"context_line":"        self.all_host_states \u003d self._get_up_hosts(elevated)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _get_all_host_states(self, context, spec_obj, provider_uuids):"},{"line_number":71,"context_line":"        \"\"\"Called from the filter scheduler, in a template pattern.\"\"\""},{"line_number":72,"context_line":"        if self.all_host_states is None:"},{"line_number":73,"context_line":"            # NOTE(johngarbutt) We only get here when we a scheduler request"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_c607e7c9","line":70,"range":{"start_line":70,"start_character":54,"end_line":70,"end_character":68},"updated":"2017-07-07 00:35:23.000000000","message":"This should be renamed to provider_summaries now.","commit_id":"5ad02b571c791001c4f91d447bd607b1ada69a33"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cd93b25df778975f37feac5cdb7dd0f2e6f7c374","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        # fetch the list of hosts."},{"line_number":68,"context_line":"        self.all_host_states \u003d self._get_up_hosts(elevated)"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _get_all_host_states(self, context, spec_obj, provider_uuids):"},{"line_number":71,"context_line":"        \"\"\"Called from the filter scheduler, in a template pattern.\"\"\""},{"line_number":72,"context_line":"        if self.all_host_states is None:"},{"line_number":73,"context_line":"            # NOTE(johngarbutt) We only get here when we a scheduler request"}],"source_content_type":"text/x-python","patch_set":17,"id":"3f1d235d_06c83f71","line":70,"range":{"start_line":70,"start_character":54,"end_line":70,"end_character":68},"in_reply_to":"3f1d235d_c607e7c9","updated":"2017-07-07 00:41:26.000000000","message":"Done","commit_id":"5ad02b571c791001c4f91d447bd607b1ada69a33"}],"nova/scheduler/client/report.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"844b6dd5118557b7aae86dbcd224d941269e5426","unresolved":false,"context_lines":[{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    @safe_connect"},{"line_number":260,"context_line":"    def get_allocation_candidates(self, resources):"},{"line_number":261,"context_line":"        \"\"\"Returns a tuple of (allocation_requests, provider_summaries)."},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        The allocation requests are a collection of potential JSON objects that"},{"line_number":264,"context_line":"        can be passed to the PUT /allocations/{consumer_uuid} Placement REST"},{"line_number":265,"context_line":"        API to claim resources against one or more resource providers that meet"},{"line_number":266,"context_line":"        the requested resource constraints."},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        The provider summaries is a dict, keyed by resource provider UUID, of"},{"line_number":269,"context_line":"        inventory and capacity information for any resource provider involved"},{"line_number":270,"context_line":"        in the allocation requests."},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        :param resources: A dict, keyed by resource class name, of requested"},{"line_number":273,"context_line":"                          amounts of those resources"},{"line_number":274,"context_line":"        \"\"\""},{"line_number":275,"context_line":"        resource_query \u003d \",\".join("},{"line_number":276,"context_line":"            sorted(\"%s:%s\" % (rc, amount)"},{"line_number":277,"context_line":"            for (rc, amount) in resources.items())"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f201791_2e4b84b0","line":274,"range":{"start_line":261,"start_character":0,"end_line":274,"end_character":11},"updated":"2017-06-23 21:00:04.000000000","message":"Wouldn\u0027t mind if this mentioned that it returns (None, None) if something goes wrong (as opposed to raising an exception, which would also be reasonable behavior).","commit_id":"4e9b2f626e67873052bd38047e97298f80e987aa"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f27e74b98e9c0a773753eb6294adfcbac58b7583","unresolved":false,"context_lines":[{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    @safe_connect"},{"line_number":260,"context_line":"    def get_allocation_candidates(self, resources):"},{"line_number":261,"context_line":"        \"\"\"Returns a tuple of (allocation_requests, provider_summaries)."},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"        The allocation requests are a collection of potential JSON objects that"},{"line_number":264,"context_line":"        can be passed to the PUT /allocations/{consumer_uuid} Placement REST"},{"line_number":265,"context_line":"        API to claim resources against one or more resource providers that meet"},{"line_number":266,"context_line":"        the requested resource constraints."},{"line_number":267,"context_line":""},{"line_number":268,"context_line":"        The provider summaries is a dict, keyed by resource provider UUID, of"},{"line_number":269,"context_line":"        inventory and capacity information for any resource provider involved"},{"line_number":270,"context_line":"        in the allocation requests."},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"        :param resources: A dict, keyed by resource class name, of requested"},{"line_number":273,"context_line":"                          amounts of those resources"},{"line_number":274,"context_line":"        \"\"\""},{"line_number":275,"context_line":"        resource_query \u003d \",\".join("},{"line_number":276,"context_line":"            sorted(\"%s:%s\" % (rc, amount)"},{"line_number":277,"context_line":"            for (rc, amount) in resources.items())"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f201791_31c1a92f","line":274,"range":{"start_line":261,"start_character":0,"end_line":274,"end_character":11},"in_reply_to":"5f201791_2e4b84b0","updated":"2017-06-23 21:39:20.000000000","message":"Done","commit_id":"4e9b2f626e67873052bd38047e97298f80e987aa"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"844b6dd5118557b7aae86dbcd224d941269e5426","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        if resp.status_code \u003d\u003d 200:"},{"line_number":288,"context_line":"            data \u003d resp.json()"},{"line_number":289,"context_line":"            return data[\u0027allocation_requests\u0027], data[\u0027provider_summaries\u0027]"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            msg \u003d _LE(\"Failed to retrieve allocation candidates \""},{"line_number":292,"context_line":"                      \"from placement API for filters %(resources)s. \""},{"line_number":293,"context_line":"                      \"Got %(status_code)d: %(err_text)s.\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f201791_6ed61cc6","line":290,"range":{"start_line":290,"start_character":8,"end_line":290,"end_character":12},"updated":"2017-06-23 21:00:04.000000000","message":"Redundant (but explicit)","commit_id":"4e9b2f626e67873052bd38047e97298f80e987aa"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f27e74b98e9c0a773753eb6294adfcbac58b7583","unresolved":false,"context_lines":[{"line_number":287,"context_line":"        if resp.status_code \u003d\u003d 200:"},{"line_number":288,"context_line":"            data \u003d resp.json()"},{"line_number":289,"context_line":"            return data[\u0027allocation_requests\u0027], data[\u0027provider_summaries\u0027]"},{"line_number":290,"context_line":"        else:"},{"line_number":291,"context_line":"            msg \u003d _LE(\"Failed to retrieve allocation candidates \""},{"line_number":292,"context_line":"                      \"from placement API for filters %(resources)s. \""},{"line_number":293,"context_line":"                      \"Got %(status_code)d: %(err_text)s.\")"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f201791_11dead10","line":290,"range":{"start_line":290,"start_character":8,"end_line":290,"end_character":12},"in_reply_to":"5f201791_6ed61cc6","updated":"2017-06-23 21:39:20.000000000","message":"Done","commit_id":"4e9b2f626e67873052bd38047e97298f80e987aa"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"af35d6d52ea6d35721ded6d89c427a5ef4e834e5","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            data \u003d resp.json()"},{"line_number":289,"context_line":"            return data[\u0027allocation_requests\u0027], data[\u0027provider_summaries\u0027]"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        msg \u003d _LE(\"Failed to retrieve allocation candidates \""},{"line_number":292,"context_line":"                  \"from placement API for filters %(resources)s. \""},{"line_number":293,"context_line":"                  \"Got %(status_code)d: %(err_text)s.\")"},{"line_number":294,"context_line":"        args \u003d {"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f201791_44a50fa1","line":291,"range":{"start_line":291,"start_character":14,"end_line":291,"end_character":18},"updated":"2017-06-28 12:36:03.000000000","message":"Remove log translation while we\u0027re here.","commit_id":"169f84552948a70bd9c56f7f1ef469ac86846b0d"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"d5ba3387bf4f3e6001ea2233e305b40960f315b1","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        }"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        url \u003d \"/allocation_candidates?%s\" % parse.urlencode(qs_params)"},{"line_number":286,"context_line":"        resp \u003d self.get(url, version\u003d\u00271.10\u0027)"},{"line_number":287,"context_line":"        if resp.status_code \u003d\u003d 200:"},{"line_number":288,"context_line":"            data \u003d resp.json()"},{"line_number":289,"context_line":"            return data[\u0027allocation_requests\u0027], data[\u0027provider_summaries\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f1d235d_7841640b","line":286,"range":{"start_line":286,"start_character":37,"end_line":286,"end_character":43},"updated":"2017-07-03 07:13:17.000000000","message":"Should we add a release note to notify the deployer to upgrade the placement service first?","commit_id":"938776e55198d11538276aef1335a73df4ac9361"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"19a83cac581f67b81161336811fbd27d3c7a9745","unresolved":false,"context_lines":[{"line_number":283,"context_line":"        }"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        url \u003d \"/allocation_candidates?%s\" % parse.urlencode(qs_params)"},{"line_number":286,"context_line":"        resp \u003d self.get(url, version\u003d\u00271.10\u0027)"},{"line_number":287,"context_line":"        if resp.status_code \u003d\u003d 200:"},{"line_number":288,"context_line":"            data \u003d resp.json()"},{"line_number":289,"context_line":"            return data[\u0027allocation_requests\u0027], data[\u0027provider_summaries\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f1d235d_d584b2b3","line":286,"range":{"start_line":286,"start_character":37,"end_line":286,"end_character":43},"in_reply_to":"3f1d235d_7841640b","updated":"2017-07-03 14:20:06.000000000","message":"Technically things won\u0027t break, they will just spew errors into the scheduler logs :) But, yes, I suppose a release note is appropriate.\n\nAdded one.","commit_id":"938776e55198d11538276aef1335a73df4ac9361"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ee5ad029ef6422de2ab48fe4ed82229bdac19249","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            data \u003d resp.json()"},{"line_number":289,"context_line":"            return data[\u0027allocation_requests\u0027], data[\u0027provider_summaries\u0027]"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        msg \u003d _LE(\"Failed to retrieve allocation candidates \""},{"line_number":292,"context_line":"                  \"from placement API for filters %(resources)s. \""},{"line_number":293,"context_line":"                  \"Got %(status_code)d: %(err_text)s.\")"},{"line_number":294,"context_line":"        args \u003d {"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_d4746dd1","line":291,"range":{"start_line":291,"start_character":14,"end_line":291,"end_character":17},"updated":"2017-07-05 15:48:41.000000000","message":"Remove log translation","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d4dfbb8e5ae04e87323439fbbf34838391434d1a","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            data \u003d resp.json()"},{"line_number":289,"context_line":"            return data[\u0027allocation_requests\u0027], data[\u0027provider_summaries\u0027]"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        msg \u003d _LE(\"Failed to retrieve allocation candidates \""},{"line_number":292,"context_line":"                  \"from placement API for filters %(resources)s. \""},{"line_number":293,"context_line":"                  \"Got %(status_code)d: %(err_text)s.\")"},{"line_number":294,"context_line":"        args \u003d {"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_38aa4f18","line":291,"range":{"start_line":291,"start_character":14,"end_line":291,"end_character":17},"in_reply_to":"3f1d235d_d4746dd1","updated":"2017-07-06 14:44:46.000000000","message":"Done","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"77241ff75d541767adb193eb1657780efd7ecc89","unresolved":false,"context_lines":[{"line_number":288,"context_line":"            data \u003d resp.json()"},{"line_number":289,"context_line":"            return data[\u0027allocation_requests\u0027], data[\u0027provider_summaries\u0027]"},{"line_number":290,"context_line":""},{"line_number":291,"context_line":"        msg \u003d _LE(\"Failed to retrieve allocation candidates \""},{"line_number":292,"context_line":"                  \"from placement API for filters %(resources)s. \""},{"line_number":293,"context_line":"                  \"Got %(status_code)d: %(err_text)s.\")"},{"line_number":294,"context_line":"        args \u003d {"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_7d5e9d76","line":291,"range":{"start_line":291,"start_character":14,"end_line":291,"end_character":17},"in_reply_to":"3f1d235d_d4746dd1","updated":"2017-07-05 16:28:28.000000000","message":"Meh, FWIW I wouldn\u0027t hold up a series for this - we need to do a mass cleanup of all logging translation markers in this module anyway, as noted in https://review.openstack.org/#/c/460147/ so we could just leave that for a later cleanup.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e3a73f506cb45b83cfe77b7df5ec9be5003f577a","unresolved":false,"context_lines":[{"line_number":709,"context_line":"                return"},{"line_number":710,"context_line":""},{"line_number":711,"context_line":"        msg \u003d _LE(\"[%(placement_req_id)s] Failed to delete inventory for \""},{"line_number":712,"context_line":"                  \"resource provider %(rp_uuid)s. Got error response: \""},{"line_number":713,"context_line":"                  \"%(err)s.\")"},{"line_number":714,"context_line":"        msg_args[\u0027err\u0027] \u003d r.text"},{"line_number":715,"context_line":"        LOG.error(msg, msg_args)"},{"line_number":716,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_1492b74c","line":713,"range":{"start_line":712,"start_character":70,"end_line":713,"end_character":27},"updated":"2017-07-06 15:39:38.000000000","message":"You HAD to add the period, huh?  See, if you hadn\u0027t, I wouldn\u0027t get to complain about removing log translation here.\n\nBut more to the point, there was probably no period before on purpose - `r.text` probably has one already.","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1adcdd8103cdb2e4bca6f5fe94ab94eba9e36781","unresolved":false,"context_lines":[{"line_number":709,"context_line":"                return"},{"line_number":710,"context_line":""},{"line_number":711,"context_line":"        msg \u003d _LE(\"[%(placement_req_id)s] Failed to delete inventory for \""},{"line_number":712,"context_line":"                  \"resource provider %(rp_uuid)s. Got error response: \""},{"line_number":713,"context_line":"                  \"%(err)s.\")"},{"line_number":714,"context_line":"        msg_args[\u0027err\u0027] \u003d r.text"},{"line_number":715,"context_line":"        LOG.error(msg, msg_args)"},{"line_number":716,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_f4517b37","line":713,"range":{"start_line":712,"start_character":70,"end_line":713,"end_character":27},"in_reply_to":"3f1d235d_1492b74c","updated":"2017-07-06 15:42:17.000000000","message":"Quoi? I didn\u0027t change the above...","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"98406245b80ef6321a8fce542122256a9ac1296f","unresolved":false,"context_lines":[{"line_number":709,"context_line":"                return"},{"line_number":710,"context_line":""},{"line_number":711,"context_line":"        msg \u003d _LE(\"[%(placement_req_id)s] Failed to delete inventory for \""},{"line_number":712,"context_line":"                  \"resource provider %(rp_uuid)s. Got error response: \""},{"line_number":713,"context_line":"                  \"%(err)s.\")"},{"line_number":714,"context_line":"        msg_args[\u0027err\u0027] \u003d r.text"},{"line_number":715,"context_line":"        LOG.error(msg, msg_args)"},{"line_number":716,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_6f86b8bb","line":713,"range":{"start_line":712,"start_character":70,"end_line":713,"end_character":27},"in_reply_to":"3f1d235d_f4517b37","updated":"2017-07-06 16:08:29.000000000","message":"Weird.  The 15..16 delta makes it look like you did [1].  Maybe you changed \u0026 reverted, or maybe an artifact of rebases.\n\n[1] https://review.openstack.org/#/c/476631/15..16/nova/scheduler/client/report.py@713","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"8c7f6f6c2120e51f1d4730721b04ec3111b37564","unresolved":false,"context_lines":[{"line_number":284,"context_line":"                          amounts of those resources"},{"line_number":285,"context_line":"        \"\"\""},{"line_number":286,"context_line":"        resource_query \u003d \",\".join("},{"line_number":287,"context_line":"            sorted(\"%s:%s\" % (rc, amount)"},{"line_number":288,"context_line":"            for (rc, amount) in resources.items()))"},{"line_number":289,"context_line":"        qs_params \u003d {"},{"line_number":290,"context_line":"            \u0027resources\u0027: resource_query,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_ce192723","line":287,"range":{"start_line":287,"start_character":24,"end_line":287,"end_character":25},"updated":"2017-07-07 15:06:14.000000000","message":"This should be a %i, IMHO. Even though the object model should enforce this, I think it\u0027d be good to be specific here. We\u0027d not want to end up with something ugly here.","commit_id":"0efd4fe8309ab5f5f2fb1901d8127febf82f6351"}],"nova/scheduler/driver.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"844b6dd5118557b7aae86dbcd224d941269e5426","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \"\"\"Must override select_destinations method."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        :return: A list of dicts with \u0027uuid\u0027, \u0027host\u0027, \u0027nodename\u0027 and \u0027limits\u0027"},{"line_number":63,"context_line":"                 as keys that satisfies the request_spec and filter_properties."},{"line_number":64,"context_line":"        \"\"\""},{"line_number":65,"context_line":"        return []"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f201791_2ea70452","line":63,"range":{"start_line":63,"start_character":44,"end_line":63,"end_character":78},"updated":"2017-06-23 21:00:04.000000000","message":"Is this still accurate? (Looks like it might have diverged a while ago.)","commit_id":"4e9b2f626e67873052bd38047e97298f80e987aa"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f27e74b98e9c0a773753eb6294adfcbac58b7583","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        \"\"\"Must override select_destinations method."},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        :return: A list of dicts with \u0027uuid\u0027, \u0027host\u0027, \u0027nodename\u0027 and \u0027limits\u0027"},{"line_number":63,"context_line":"                 as keys that satisfies the request_spec and filter_properties."},{"line_number":64,"context_line":"        \"\"\""},{"line_number":65,"context_line":"        return []"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f201791_112c6d00","line":63,"range":{"start_line":63,"start_character":44,"end_line":63,"end_character":78},"in_reply_to":"5f201791_2ea70452","updated":"2017-06-23 21:39:20.000000000","message":"will clean it up.","commit_id":"4e9b2f626e67873052bd38047e97298f80e987aa"}],"nova/scheduler/filter_scheduler.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb82e14b138c0ffa2505390537e3b4bfdf03f95a","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            dict(request_spec\u003dspec_obj.to_legacy_request_spec_dict()))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        num_instances \u003d spec_obj.num_instances"},{"line_number":53,"context_line":"        provider_uuids \u003d list(provider_summaries.keys())"},{"line_number":54,"context_line":"        selected_hosts \u003d self._schedule(context, spec_obj, instance_uuids,"},{"line_number":55,"context_line":"            provider_uuids)"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_c5c3a188","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":56},"updated":"2017-07-05 13:44:43.000000000","message":"To Sylvain\u0027s point, this will be empty (but not None, which is a key difference), if we didn\u0027t get allocation candidates here:\n\nhttps://review.openstack.org/#/c/476631/15/nova/scheduler/manager.py@124","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d4dfbb8e5ae04e87323439fbbf34838391434d1a","unresolved":false,"context_lines":[{"line_number":50,"context_line":"            dict(request_spec\u003dspec_obj.to_legacy_request_spec_dict()))"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        num_instances \u003d spec_obj.num_instances"},{"line_number":53,"context_line":"        provider_uuids \u003d list(provider_summaries.keys())"},{"line_number":54,"context_line":"        selected_hosts \u003d self._schedule(context, spec_obj, instance_uuids,"},{"line_number":55,"context_line":"            provider_uuids)"},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_93cdc4b8","line":53,"range":{"start_line":53,"start_character":8,"end_line":53,"end_character":56},"in_reply_to":"3f1d235d_c5c3a188","updated":"2017-07-06 14:44:46.000000000","message":"Done","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"bfbb7ff336e7c72106e85cab1e02ae5d3725aece","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                spec_obj.instance_group.obj_reset_changes([\u0027hosts\u0027])"},{"line_number":131,"context_line":"        return selected_hosts"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def _get_all_host_states(self, context, spec_obj, provider_uuids):"},{"line_number":134,"context_line":"        \"\"\"Template method, so a subclass can implement caching.\"\"\""},{"line_number":135,"context_line":"        return self.host_manager.get_host_states_by_uuids(context,"},{"line_number":136,"context_line":"                                                          provider_uuids,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_99165755","line":133,"updated":"2017-07-04 13:44:27.000000000","message":"We can pass an empty dict here by https://review.openstack.org/#/c/476631/15/nova/scheduler/manager.py@124. \nIn that case, we need to do like we did previously and directly return an empty list (instead of trying to get all the host states) so the scheduler would return a correctly NoValidHosts exception.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cb82e14b138c0ffa2505390537e3b4bfdf03f95a","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                spec_obj.instance_group.obj_reset_changes([\u0027hosts\u0027])"},{"line_number":131,"context_line":"        return selected_hosts"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def _get_all_host_states(self, context, spec_obj, provider_uuids):"},{"line_number":134,"context_line":"        \"\"\"Template method, so a subclass can implement caching.\"\"\""},{"line_number":135,"context_line":"        return self.host_manager.get_host_states_by_uuids(context,"},{"line_number":136,"context_line":"                                                          provider_uuids,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_a5e30534","line":133,"in_reply_to":"3f1d235d_99165755","updated":"2017-07-05 13:44:43.000000000","message":"I think we will return an empty list, because we\u0027ll be passing that to https://review.openstack.org/#/c/476631/15/nova/scheduler/host_manager.py@615 which will return an empty list of compute nodes.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d4dfbb8e5ae04e87323439fbbf34838391434d1a","unresolved":false,"context_lines":[{"line_number":130,"context_line":"                spec_obj.instance_group.obj_reset_changes([\u0027hosts\u0027])"},{"line_number":131,"context_line":"        return selected_hosts"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"    def _get_all_host_states(self, context, spec_obj, provider_uuids):"},{"line_number":134,"context_line":"        \"\"\"Template method, so a subclass can implement caching.\"\"\""},{"line_number":135,"context_line":"        return self.host_manager.get_host_states_by_uuids(context,"},{"line_number":136,"context_line":"                                                          provider_uuids,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_53c3ac89","line":133,"in_reply_to":"3f1d235d_a5e30534","updated":"2017-07-06 14:44:46.000000000","message":"Done","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c85c3ffb48830f75d3e775eb87ab6bb82d75d1b1","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            dict(request_spec\u003dspec_obj.to_legacy_request_spec_dict()))"},{"line_number":80,"context_line":"        return [host.obj for host in selected_hosts]"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _schedule(self, context, spec_obj, instance_uuids, provider_uuids):"},{"line_number":83,"context_line":"        \"\"\"Returns a list of hosts that meet the required specs,"},{"line_number":84,"context_line":"        ordered by their fitness."},{"line_number":85,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_3f710777","line":82,"range":{"start_line":82,"start_character":59,"end_line":82,"end_character":73},"updated":"2017-07-06 19:18:14.000000000","message":"This should be renamed to \"provider_summaries\" now.","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"80781e02e31ca273f73cccc06b49f399f25c507a","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            dict(request_spec\u003dspec_obj.to_legacy_request_spec_dict()))"},{"line_number":80,"context_line":"        return [host.obj for host in selected_hosts]"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    def _schedule(self, context, spec_obj, instance_uuids, provider_uuids):"},{"line_number":83,"context_line":"        \"\"\"Returns a list of hosts that meet the required specs,"},{"line_number":84,"context_line":"        ordered by their fitness."},{"line_number":85,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_0b75eaf9","line":82,"range":{"start_line":82,"start_character":59,"end_line":82,"end_character":73},"in_reply_to":"3f1d235d_3f710777","updated":"2017-07-07 00:15:35.000000000","message":"Done","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c85c3ffb48830f75d3e775eb87ab6bb82d75d1b1","unresolved":false,"context_lines":[{"line_number":131,"context_line":""},{"line_number":132,"context_line":"    def _get_all_host_states(self, context, spec_obj, provider_summaries):"},{"line_number":133,"context_line":"        \"\"\"Template method, so a subclass can implement caching.\"\"\""},{"line_number":134,"context_line":"        # NOTE(jaypipes): None is treated differently from an empty dict. We"},{"line_number":135,"context_line":"        # pass None when we want to grab all compute nodes (for instance, when"},{"line_number":136,"context_line":"        # using the caching scheduler. We pass an empty dict when the Placement"},{"line_number":137,"context_line":"        # API found no providers that match the requested constraints."}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_5f9a83b8","line":134,"updated":"2017-07-06 19:18:14.000000000","message":"Thanks for adding the note. The None vs empty difference and tight coupling such that we have to care about that difference sucks. I was half way thinking we should just change the code to fallback to query all compute nodes if the list of compute uuids is None or empty, I\u0027m not sure why it\u0027s explicitly checking for None for that decision. But it\u0027s probably best to not worry about that in this change.","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e3a73f506cb45b83cfe77b7df5ec9be5003f577a","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        # API found no providers that match the requested constraints."},{"line_number":138,"context_line":"        compute_uuids \u003d None"},{"line_number":139,"context_line":"        if provider_summaries is not None:"},{"line_number":140,"context_line":"            compute_uuids \u003d list(provider_summaries.keys())"},{"line_number":141,"context_line":"        return self.host_manager.get_host_states_by_uuids(context,"},{"line_number":142,"context_line":"                                                          compute_uuids,"},{"line_number":143,"context_line":"                                                          spec_obj)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_34a6d3ac","line":140,"range":{"start_line":140,"start_character":51,"end_line":140,"end_character":58},"updated":"2017-07-06 15:39:38.000000000","message":".keys() is redundant - list(dict) returns a list of the dict\u0027s keys.","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"80781e02e31ca273f73cccc06b49f399f25c507a","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        # API found no providers that match the requested constraints."},{"line_number":138,"context_line":"        compute_uuids \u003d None"},{"line_number":139,"context_line":"        if provider_summaries is not None:"},{"line_number":140,"context_line":"            compute_uuids \u003d list(provider_summaries.keys())"},{"line_number":141,"context_line":"        return self.host_manager.get_host_states_by_uuids(context,"},{"line_number":142,"context_line":"                                                          compute_uuids,"},{"line_number":143,"context_line":"                                                          spec_obj)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_0b4e0ac0","line":140,"range":{"start_line":140,"start_character":51,"end_line":140,"end_character":58},"in_reply_to":"3f1d235d_34a6d3ac","updated":"2017-07-07 00:15:35.000000000","message":"Done","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1adcdd8103cdb2e4bca6f5fe94ab94eba9e36781","unresolved":false,"context_lines":[{"line_number":137,"context_line":"        # API found no providers that match the requested constraints."},{"line_number":138,"context_line":"        compute_uuids \u003d None"},{"line_number":139,"context_line":"        if provider_summaries is not None:"},{"line_number":140,"context_line":"            compute_uuids \u003d list(provider_summaries.keys())"},{"line_number":141,"context_line":"        return self.host_manager.get_host_states_by_uuids(context,"},{"line_number":142,"context_line":"                                                          compute_uuids,"},{"line_number":143,"context_line":"                                                          spec_obj)"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_745d6b45","line":140,"range":{"start_line":140,"start_character":51,"end_line":140,"end_character":58},"in_reply_to":"3f1d235d_34a6d3ac","updated":"2017-07-06 15:42:17.000000000","message":"Oh, I didn\u0027t know that. TIL... thanks :)","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"520dff2624b1a58d9830688737f85bff32b67a47","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        # API found no providers that match the requested constraints."},{"line_number":139,"context_line":"        compute_uuids \u003d None"},{"line_number":140,"context_line":"        if provider_summaries is not None:"},{"line_number":141,"context_line":"            compute_uuids \u003d list(provider_summaries.keys())"},{"line_number":142,"context_line":"        return self.host_manager.get_host_states_by_uuids(context,"},{"line_number":143,"context_line":"                                                          compute_uuids,"},{"line_number":144,"context_line":"                                                          spec_obj)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_da1fa56e","line":141,"range":{"start_line":141,"start_character":51,"end_line":141,"end_character":58},"updated":"2017-07-07 13:23:55.000000000","message":"Not done","commit_id":"0efd4fe8309ab5f5f2fb1901d8127febf82f6351"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"75cb3f0242b60e841e4011504983cab584b97b7f","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        # API found no providers that match the requested constraints."},{"line_number":139,"context_line":"        compute_uuids \u003d None"},{"line_number":140,"context_line":"        if provider_summaries is not None:"},{"line_number":141,"context_line":"            compute_uuids \u003d list(provider_summaries.keys())"},{"line_number":142,"context_line":"        return self.host_manager.get_host_states_by_uuids(context,"},{"line_number":143,"context_line":"                                                          compute_uuids,"},{"line_number":144,"context_line":"                                                          spec_obj)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_c8b6bf3f","line":141,"range":{"start_line":141,"start_character":51,"end_line":141,"end_character":58},"in_reply_to":"3f1d235d_3d445374","updated":"2017-07-07 13:55:25.000000000","message":"I\u0027ll let you two battle this out in fake Sumo costumes.","commit_id":"0efd4fe8309ab5f5f2fb1901d8127febf82f6351"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"0e4264f86cf1f754f221d9b016e461c6ee46646c","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        # API found no providers that match the requested constraints."},{"line_number":139,"context_line":"        compute_uuids \u003d None"},{"line_number":140,"context_line":"        if provider_summaries is not None:"},{"line_number":141,"context_line":"            compute_uuids \u003d list(provider_summaries.keys())"},{"line_number":142,"context_line":"        return self.host_manager.get_host_states_by_uuids(context,"},{"line_number":143,"context_line":"                                                          compute_uuids,"},{"line_number":144,"context_line":"                                                          spec_obj)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_eed7434f","line":141,"range":{"start_line":141,"start_character":51,"end_line":141,"end_character":58},"in_reply_to":"3f1d235d_8818c784","updated":"2017-07-07 14:58:36.000000000","message":"By my comment, I wasn\u0027t trying to bully Jay into making the change.  Just calling him out for saying it was Done when it wasn\u0027t :)\n\nlist(dict) is more efficient than list(dict.keys()) (by about 17.5% in my quick and dirty test on a 10-key dict - same results py2/py3).\n\nBut we\u0027re talking sub-microsecond - irrelevant.\n\n\"More readable\" is a fine answer.\n\nAnd I only possess *real* sumo costumes.","commit_id":"0efd4fe8309ab5f5f2fb1901d8127febf82f6351"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eed6eec38b56697ee97fd3d93b872861dcb3d019","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        # API found no providers that match the requested constraints."},{"line_number":139,"context_line":"        compute_uuids \u003d None"},{"line_number":140,"context_line":"        if provider_summaries is not None:"},{"line_number":141,"context_line":"            compute_uuids \u003d list(provider_summaries.keys())"},{"line_number":142,"context_line":"        return self.host_manager.get_host_states_by_uuids(context,"},{"line_number":143,"context_line":"                                                          compute_uuids,"},{"line_number":144,"context_line":"                                                          spec_obj)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_8818c784","line":141,"range":{"start_line":141,"start_character":51,"end_line":141,"end_character":58},"in_reply_to":"3f1d235d_c8b6bf3f","updated":"2017-07-07 14:21:23.000000000","message":"We have bigger fish to fry, so let\u0027s not hold this change up on this. I don\u0027t care either way, but using .keys() is more explicitly readable IMO and I generally like that rather than python magic.","commit_id":"0efd4fe8309ab5f5f2fb1901d8127febf82f6351"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a23559f44b3fa1c26ed8b004e9f35164b14bb6a1","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        # API found no providers that match the requested constraints."},{"line_number":139,"context_line":"        compute_uuids \u003d None"},{"line_number":140,"context_line":"        if provider_summaries is not None:"},{"line_number":141,"context_line":"            compute_uuids \u003d list(provider_summaries.keys())"},{"line_number":142,"context_line":"        return self.host_manager.get_host_states_by_uuids(context,"},{"line_number":143,"context_line":"                                                          compute_uuids,"},{"line_number":144,"context_line":"                                                          spec_obj)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_3d445374","line":141,"range":{"start_line":141,"start_character":51,"end_line":141,"end_character":58},"in_reply_to":"3f1d235d_da1fa56e","updated":"2017-07-07 13:50:23.000000000","message":"dict.keys() returns a dict_keys() which is not a list(). Yes, list(dict) does return a list of the keys, but it\u0027s less readable than what is here, IMHO and thus I prefer what he\u0027s got here personally.","commit_id":"0efd4fe8309ab5f5f2fb1901d8127febf82f6351"}],"nova/scheduler/host_manager.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"844b6dd5118557b7aae86dbcd224d941269e5426","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        self.uuid \u003d uuid"},{"line_number":111,"context_line":"        self.host \u003d host"},{"line_number":112,"context_line":"        self.nodename \u003d node"},{"line_number":113,"context_line":"        self.uuid \u003d uuid"},{"line_number":114,"context_line":"        self._lock_name \u003d (host, node)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        # Mutable available resources."}],"source_content_type":"text/x-python","patch_set":5,"id":"5f201791_2ef9444c","line":113,"range":{"start_line":113,"start_character":0,"end_line":113,"end_character":24},"updated":"2017-06-23 21:00:04.000000000","message":"Strike (L110)","commit_id":"4e9b2f626e67873052bd38047e97298f80e987aa"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f27e74b98e9c0a773753eb6294adfcbac58b7583","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        self.uuid \u003d uuid"},{"line_number":111,"context_line":"        self.host \u003d host"},{"line_number":112,"context_line":"        self.nodename \u003d node"},{"line_number":113,"context_line":"        self.uuid \u003d uuid"},{"line_number":114,"context_line":"        self._lock_name \u003d (host, node)"},{"line_number":115,"context_line":""},{"line_number":116,"context_line":"        # Mutable available resources."}],"source_content_type":"text/x-python","patch_set":5,"id":"5f201791_d199556e","line":113,"range":{"start_line":113,"start_character":0,"end_line":113,"end_character":24},"in_reply_to":"5f201791_2ef9444c","updated":"2017-06-23 21:39:20.000000000","message":"Done","commit_id":"4e9b2f626e67873052bd38047e97298f80e987aa"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"bfbb7ff336e7c72106e85cab1e02ae5d3725aece","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        self.host \u003d host"},{"line_number":111,"context_line":"        self.nodename \u003d node"},{"line_number":112,"context_line":"        self.uuid \u003d None"},{"line_number":113,"context_line":"        self._lock_name \u003d (host, node)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # Mutable available resources."},{"line_number":116,"context_line":"        # These will change as resources are virtually \"consumed\"."}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_79293be4","line":113,"range":{"start_line":113,"start_character":26,"end_line":113,"end_character":38},"updated":"2017-07-04 13:44:27.000000000","message":"FWIW, we could use the UUID for the lock instead of that tuple, but that could be a follow-up of course.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5678415830dcb26d29fe009d56ca59ce2426e671","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        self.host \u003d host"},{"line_number":111,"context_line":"        self.nodename \u003d node"},{"line_number":112,"context_line":"        self.uuid \u003d None"},{"line_number":113,"context_line":"        self._lock_name \u003d (host, node)"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"        # Mutable available resources."},{"line_number":116,"context_line":"        # These will change as resources are virtually \"consumed\"."}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_f88cd736","line":113,"range":{"start_line":113,"start_character":26,"end_line":113,"end_character":38},"in_reply_to":"3f1d235d_79293be4","updated":"2017-07-06 13:04:25.000000000","message":"I tried that. Introduced a shit-ton of code changes.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"}],"nova/scheduler/manager.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"844b6dd5118557b7aae86dbcd224d941269e5426","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                                                           filter_properties)"},{"line_number":102,"context_line":"        resources \u003d utils.resources_from_request_spec(spec_obj)"},{"line_number":103,"context_line":"        alloc_reqs, p_sums \u003d self.placement_client.get_allocation_candidates("},{"line_number":104,"context_line":"            resources,"},{"line_number":105,"context_line":"        )"},{"line_number":106,"context_line":"        # NOTE(sbauza): In case the Placement service is not running yet or"},{"line_number":107,"context_line":"        # when returning an exception, we wouldn\u0027t get any resource providers."}],"source_content_type":"text/x-python","patch_set":5,"id":"5f201791_8e8978cb","line":104,"range":{"start_line":104,"start_character":21,"end_line":104,"end_character":22},"updated":"2017-06-23 21:00:04.000000000","message":"strike","commit_id":"4e9b2f626e67873052bd38047e97298f80e987aa"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f27e74b98e9c0a773753eb6294adfcbac58b7583","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                                                           filter_properties)"},{"line_number":102,"context_line":"        resources \u003d utils.resources_from_request_spec(spec_obj)"},{"line_number":103,"context_line":"        alloc_reqs, p_sums \u003d self.placement_client.get_allocation_candidates("},{"line_number":104,"context_line":"            resources,"},{"line_number":105,"context_line":"        )"},{"line_number":106,"context_line":"        # NOTE(sbauza): In case the Placement service is not running yet or"},{"line_number":107,"context_line":"        # when returning an exception, we wouldn\u0027t get any resource providers."}],"source_content_type":"text/x-python","patch_set":5,"id":"5f201791_f117b1a2","line":104,"range":{"start_line":104,"start_character":21,"end_line":104,"end_character":22},"in_reply_to":"5f201791_8e8978cb","updated":"2017-06-23 21:39:20.000000000","message":"note that I do this for functions that I know I\u0027ll be adding additional parameters to in the future. In this case, we will soon be adding a traits parameter and I will only change a single line of code in the diff instead of changing two when adding a comma and a newline and the new parameter.","commit_id":"4e9b2f626e67873052bd38047e97298f80e987aa"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"844b6dd5118557b7aae86dbcd224d941269e5426","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        )"},{"line_number":106,"context_line":"        # NOTE(sbauza): In case the Placement service is not running yet or"},{"line_number":107,"context_line":"        # when returning an exception, we wouldn\u0027t get any resource providers."},{"line_number":108,"context_line":"        # If so, just log a message and raise NoValidHosts"},{"line_number":109,"context_line":"        if not alloc_reqs:"},{"line_number":110,"context_line":"            LOG.debug(\"Got no allocation candidates from the Placement API. \""},{"line_number":111,"context_line":"                      \"This may be a temporary occurrence as compute nodes \""}],"source_content_type":"text/x-python","patch_set":5,"id":"5f201791_0e320811","line":108,"range":{"start_line":108,"start_character":40,"end_line":108,"end_character":58},"updated":"2017-06-23 21:00:04.000000000","message":"Sorry, where does this happen?\n\n[Later] Oh, from self.driver.select_destinations()?  Would be cool if this comment said:\n\n If so, just log a message and let the scheduler driver raise NoValidHosts.","commit_id":"4e9b2f626e67873052bd38047e97298f80e987aa"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f27e74b98e9c0a773753eb6294adfcbac58b7583","unresolved":false,"context_lines":[{"line_number":105,"context_line":"        )"},{"line_number":106,"context_line":"        # NOTE(sbauza): In case the Placement service is not running yet or"},{"line_number":107,"context_line":"        # when returning an exception, we wouldn\u0027t get any resource providers."},{"line_number":108,"context_line":"        # If so, just log a message and raise NoValidHosts"},{"line_number":109,"context_line":"        if not alloc_reqs:"},{"line_number":110,"context_line":"            LOG.debug(\"Got no allocation candidates from the Placement API. \""},{"line_number":111,"context_line":"                      \"This may be a temporary occurrence as compute nodes \""}],"source_content_type":"text/x-python","patch_set":5,"id":"5f201791_b11139af","line":108,"range":{"start_line":108,"start_character":40,"end_line":108,"end_character":58},"in_reply_to":"5f201791_0e320811","updated":"2017-06-23 21:39:20.000000000","message":"nah, you\u0027re right. this was leftover from when this *did* raise NoValidHosts and then I ran into half the functional tests failing because of the message on lines 114-119 :)\n\nI will remove.","commit_id":"4e9b2f626e67873052bd38047e97298f80e987aa"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"af35d6d52ea6d35721ded6d89c427a5ef4e834e5","unresolved":false,"context_lines":[{"line_number":118,"context_line":"            # NOTE(jaypipes): Setting p_sums to an empty dict triggers the"},{"line_number":119,"context_line":"            # scheduler to load all compute nodes to do scheduling \"the old"},{"line_number":120,"context_line":"            # way\". Really, we should raise NoValidHosts here, but all"},{"line_number":121,"context_line":"            # functional tests will fall over if we do that without changing"},{"line_number":122,"context_line":"            # the PlacementFixture to load compute node inventory into the"},{"line_number":123,"context_line":"            # placement database before starting functional tests."},{"line_number":124,"context_line":"            p_sums \u003d {}"},{"line_number":125,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5f201791_bf018e07","line":122,"range":{"start_line":121,"start_character":68,"end_line":122,"end_character":34},"updated":"2017-06-28 12:36:03.000000000","message":"Is this a TODO?","commit_id":"169f84552948a70bd9c56f7f1ef469ac86846b0d"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8e25d37efe15bc6164d0b03fac123c84493529f5","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            spec_obj \u003d objects.RequestSpec.from_primitives(ctxt,"},{"line_number":108,"context_line":"                                                           request_spec,"},{"line_number":109,"context_line":"                                                           filter_properties)"},{"line_number":110,"context_line":"        resources \u003d utils.resources_from_request_spec(spec_obj)"},{"line_number":111,"context_line":"        res \u003d self.placement_client.get_allocation_candidates(resources)"},{"line_number":112,"context_line":"        alloc_reqs, p_sums \u003d res"},{"line_number":113,"context_line":"        if not alloc_reqs:"},{"line_number":114,"context_line":"            LOG.debug(\"Got no allocation candidates from the Placement API. \""},{"line_number":115,"context_line":"                      \"This may be a temporary occurrence as compute nodes \""},{"line_number":116,"context_line":"                      \"start up and begin reporting inventory to the \""}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_ec9c845e","line":113,"range":{"start_line":110,"start_character":0,"end_line":113,"end_character":26},"updated":"2017-07-03 18:47:28.000000000","message":"This is where we need to check if the driver is going to use the allocation candidates results and if not, we should bypass and just set p_sums to {} (caching scheduler is the one I\u0027m thinking of).","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5678415830dcb26d29fe009d56ca59ce2426e671","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            spec_obj \u003d objects.RequestSpec.from_primitives(ctxt,"},{"line_number":108,"context_line":"                                                           request_spec,"},{"line_number":109,"context_line":"                                                           filter_properties)"},{"line_number":110,"context_line":"        resources \u003d utils.resources_from_request_spec(spec_obj)"},{"line_number":111,"context_line":"        res \u003d self.placement_client.get_allocation_candidates(resources)"},{"line_number":112,"context_line":"        alloc_reqs, p_sums \u003d res"},{"line_number":113,"context_line":"        if not alloc_reqs:"},{"line_number":114,"context_line":"            LOG.debug(\"Got no allocation candidates from the Placement API. \""},{"line_number":115,"context_line":"                      \"This may be a temporary occurrence as compute nodes \""},{"line_number":116,"context_line":"                      \"start up and begin reporting inventory to the \""}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_98de033c","line":113,"range":{"start_line":110,"start_character":0,"end_line":113,"end_character":26},"in_reply_to":"3f1d235d_3974e3fd","updated":"2017-07-06 13:04:25.000000000","message":"ack.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"d4dfbb8e5ae04e87323439fbbf34838391434d1a","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            spec_obj \u003d objects.RequestSpec.from_primitives(ctxt,"},{"line_number":108,"context_line":"                                                           request_spec,"},{"line_number":109,"context_line":"                                                           filter_properties)"},{"line_number":110,"context_line":"        resources \u003d utils.resources_from_request_spec(spec_obj)"},{"line_number":111,"context_line":"        res \u003d self.placement_client.get_allocation_candidates(resources)"},{"line_number":112,"context_line":"        alloc_reqs, p_sums \u003d res"},{"line_number":113,"context_line":"        if not alloc_reqs:"},{"line_number":114,"context_line":"            LOG.debug(\"Got no allocation candidates from the Placement API. \""},{"line_number":115,"context_line":"                      \"This may be a temporary occurrence as compute nodes \""},{"line_number":116,"context_line":"                      \"start up and begin reporting inventory to the \""}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_13b9b413","line":113,"range":{"start_line":110,"start_character":0,"end_line":113,"end_character":26},"in_reply_to":"3f1d235d_98de033c","updated":"2017-07-06 14:44:46.000000000","message":"Done","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"bfbb7ff336e7c72106e85cab1e02ae5d3725aece","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            spec_obj \u003d objects.RequestSpec.from_primitives(ctxt,"},{"line_number":108,"context_line":"                                                           request_spec,"},{"line_number":109,"context_line":"                                                           filter_properties)"},{"line_number":110,"context_line":"        resources \u003d utils.resources_from_request_spec(spec_obj)"},{"line_number":111,"context_line":"        res \u003d self.placement_client.get_allocation_candidates(resources)"},{"line_number":112,"context_line":"        alloc_reqs, p_sums \u003d res"},{"line_number":113,"context_line":"        if not alloc_reqs:"},{"line_number":114,"context_line":"            LOG.debug(\"Got no allocation candidates from the Placement API. \""},{"line_number":115,"context_line":"                      \"This may be a temporary occurrence as compute nodes \""},{"line_number":116,"context_line":"                      \"start up and begin reporting inventory to the \""}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_3974e3fd","line":113,"range":{"start_line":110,"start_character":0,"end_line":113,"end_character":26},"in_reply_to":"3f1d235d_ec9c845e","updated":"2017-07-04 13:44:27.000000000","message":"not only the CachingScheduler, but also the ChanceScheduler...","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7fd635f58177561f0d57db5450b659b7ac38970d","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                      \"This may be a temporary occurrence as compute nodes \""},{"line_number":116,"context_line":"                      \"start up and begin reporting inventory to the \""},{"line_number":117,"context_line":"                      \"Placement service.\")"},{"line_number":118,"context_line":"            # NOTE(jaypipes): Setting p_sums to an empty dict triggers the"},{"line_number":119,"context_line":"            # scheduler to load all compute nodes to do scheduling \"the old"},{"line_number":120,"context_line":"            # way\". Really, we should raise NoValidHosts here, but all"},{"line_number":121,"context_line":"            # functional tests will fall over if we do that without changing"},{"line_number":122,"context_line":"            # the PlacementFixture to load compute node inventory into the"},{"line_number":123,"context_line":"            # placement database before starting functional tests."}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_e5f9fdc7","line":120,"range":{"start_line":118,"start_character":30,"end_line":120,"end_character":19},"updated":"2017-07-05 13:46:59.000000000","message":"\u003e Setting p_sums to an empty dict triggers the scheduler to load all compute nodes to do scheduling \"the old way\".\n\nIt won\u0027t really, because compute_uuids here will be an empty list:\n\nhttps://review.openstack.org/#/c/476631/15/nova/scheduler/host_manager.py@615\n\nWhich is not handled the same way that a None value is handled.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5678415830dcb26d29fe009d56ca59ce2426e671","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                      \"This may be a temporary occurrence as compute nodes \""},{"line_number":116,"context_line":"                      \"start up and begin reporting inventory to the \""},{"line_number":117,"context_line":"                      \"Placement service.\")"},{"line_number":118,"context_line":"            # NOTE(jaypipes): Setting p_sums to an empty dict triggers the"},{"line_number":119,"context_line":"            # scheduler to load all compute nodes to do scheduling \"the old"},{"line_number":120,"context_line":"            # way\". Really, we should raise NoValidHosts here, but all"},{"line_number":121,"context_line":"            # functional tests will fall over if we do that without changing"},{"line_number":122,"context_line":"            # the PlacementFixture to load compute node inventory into the"},{"line_number":123,"context_line":"            # placement database before starting functional tests."}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_18c31359","line":120,"range":{"start_line":118,"start_character":30,"end_line":120,"end_character":19},"in_reply_to":"3f1d235d_e5f9fdc7","updated":"2017-07-06 13:04:25.000000000","message":"OK, so I will pass None here, not {}.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8e25d37efe15bc6164d0b03fac123c84493529f5","unresolved":false,"context_lines":[{"line_number":115,"context_line":"                      \"This may be a temporary occurrence as compute nodes \""},{"line_number":116,"context_line":"                      \"start up and begin reporting inventory to the \""},{"line_number":117,"context_line":"                      \"Placement service.\")"},{"line_number":118,"context_line":"            # NOTE(jaypipes): Setting p_sums to an empty dict triggers the"},{"line_number":119,"context_line":"            # scheduler to load all compute nodes to do scheduling \"the old"},{"line_number":120,"context_line":"            # way\". Really, we should raise NoValidHosts here, but all"},{"line_number":121,"context_line":"            # functional tests will fall over if we do that without changing"},{"line_number":122,"context_line":"            # the PlacementFixture to load compute node inventory into the"},{"line_number":123,"context_line":"            # placement database before starting functional tests."},{"line_number":124,"context_line":"            p_sums \u003d {}"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        dests \u003d self.driver.select_destinations(ctxt, spec_obj, instance_uuids,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_8cad108a","line":123,"range":{"start_line":118,"start_character":12,"end_line":123,"end_character":66},"updated":"2017-07-03 18:47:28.000000000","message":"Also we haven\u0027t deprecated the caching scheduler and people are using it in production, so we couldn\u0027t just make that change out right either.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8e25d37efe15bc6164d0b03fac123c84493529f5","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            # functional tests will fall over if we do that without changing"},{"line_number":122,"context_line":"            # the PlacementFixture to load compute node inventory into the"},{"line_number":123,"context_line":"            # placement database before starting functional tests."},{"line_number":124,"context_line":"            p_sums \u003d {}"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        dests \u003d self.driver.select_destinations(ctxt, spec_obj, instance_uuids,"},{"line_number":127,"context_line":"            p_sums)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_2c0a7c89","line":124,"updated":"2017-07-03 18:47:28.000000000","message":"We don\u0027t have a unit test for this case.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"bfbb7ff336e7c72106e85cab1e02ae5d3725aece","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            # functional tests will fall over if we do that without changing"},{"line_number":122,"context_line":"            # the PlacementFixture to load compute node inventory into the"},{"line_number":123,"context_line":"            # placement database before starting functional tests."},{"line_number":124,"context_line":"            p_sums \u003d {}"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        dests \u003d self.driver.select_destinations(ctxt, spec_obj, instance_uuids,"},{"line_number":127,"context_line":"            p_sums)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_8b427e3d","line":124,"in_reply_to":"3f1d235d_2c0a7c89","updated":"2017-07-04 13:44:27.000000000","message":"+1, we need to verify that the scheduler would return a NoValidHosts exception exactly like the original behaviour.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bf6e5065f853a66010435a1434577a63e82982e1","unresolved":false,"context_lines":[{"line_number":121,"context_line":"            # functional tests will fall over if we do that without changing"},{"line_number":122,"context_line":"            # the PlacementFixture to load compute node inventory into the"},{"line_number":123,"context_line":"            # placement database before starting functional tests."},{"line_number":124,"context_line":"            p_sums \u003d {}"},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"        dests \u003d self.driver.select_destinations(ctxt, spec_obj, instance_uuids,"},{"line_number":127,"context_line":"            p_sums)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_7939e6d4","line":124,"in_reply_to":"3f1d235d_8b427e3d","updated":"2017-07-06 15:00:13.000000000","message":"Done","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c85c3ffb48830f75d3e775eb87ab6bb82d75d1b1","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    def __init__(self, scheduler_driver\u003dNone, *args, **kwargs):"},{"line_number":62,"context_line":"        client \u003d scheduler_client.SchedulerClient()"},{"line_number":63,"context_line":"        self.placement_client \u003d client.reportclient"},{"line_number":64,"context_line":"        self.scheduler_Driver \u003d scheduler_driver"},{"line_number":65,"context_line":"        if not scheduler_driver:"},{"line_number":66,"context_line":"            self.scheduler_driver \u003d CONF.scheduler.driver"},{"line_number":67,"context_line":"        self.driver \u003d driver.DriverManager("}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_3fda2777","line":64,"range":{"start_line":64,"start_character":13,"end_line":64,"end_character":29},"updated":"2017-07-06 19:18:14.000000000","message":"This doesn\u0027t appear to be used, and even if it did, it\u0027s a weird camel-case variable name.","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"80781e02e31ca273f73cccc06b49f399f25c507a","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    def __init__(self, scheduler_driver\u003dNone, *args, **kwargs):"},{"line_number":62,"context_line":"        client \u003d scheduler_client.SchedulerClient()"},{"line_number":63,"context_line":"        self.placement_client \u003d client.reportclient"},{"line_number":64,"context_line":"        self.scheduler_Driver \u003d scheduler_driver"},{"line_number":65,"context_line":"        if not scheduler_driver:"},{"line_number":66,"context_line":"            self.scheduler_driver \u003d CONF.scheduler.driver"},{"line_number":67,"context_line":"        self.driver \u003d driver.DriverManager("}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_2b6ae618","line":64,"range":{"start_line":64,"start_character":13,"end_line":64,"end_character":29},"in_reply_to":"3f1d235d_3fda2777","updated":"2017-07-07 00:15:35.000000000","message":"err, that\u0027s a mistake... will fix.","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"062f873e6cb4aa4a01d0ad946ba4677fff3ed63e","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                                                           request_spec,"},{"line_number":110,"context_line":"                                                           filter_properties)"},{"line_number":111,"context_line":"        resources \u003d utils.resources_from_request_spec(spec_obj)"},{"line_number":112,"context_line":"        alloc_reqs, p_sums \u003d None, None"},{"line_number":113,"context_line":"        # NOTE(jaypipes): Disregard the caching and chance schedulers, because"},{"line_number":114,"context_line":"        # they don\u0027t interact with the placement API."},{"line_number":115,"context_line":"        if self.scheduler_driver in (\u0027filter_scheduler\u0027, \u0027fake_scheduler\u0027):"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_733c5ee0","line":112,"updated":"2017-07-06 17:46:00.000000000","message":"what\u0027s a p and what do we do when we sum some of them?\n\nrp_summaries perhaps?","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"062f873e6cb4aa4a01d0ad946ba4677fff3ed63e","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        alloc_reqs, p_sums \u003d None, None"},{"line_number":113,"context_line":"        # NOTE(jaypipes): Disregard the caching and chance schedulers, because"},{"line_number":114,"context_line":"        # they don\u0027t interact with the placement API."},{"line_number":115,"context_line":"        if self.scheduler_driver in (\u0027filter_scheduler\u0027, \u0027fake_scheduler\u0027):"},{"line_number":116,"context_line":"            res \u003d self.placement_client.get_allocation_candidates(resources)"},{"line_number":117,"context_line":"            alloc_reqs, p_sums \u003d res"},{"line_number":118,"context_line":"            if not alloc_reqs:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_b652e411","line":115,"updated":"2017-07-06 17:46:00.000000000","message":"This is fragile if we decide to add a new scheduler some other time, but a) tests will explode if that comes, b) we don\u0027t want that day to come\n\nBut it still feels like a bit of OO smell, but not enough to really do anything about. I guess moving this stuff here has its value.","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"80781e02e31ca273f73cccc06b49f399f25c507a","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        alloc_reqs, p_sums \u003d None, None"},{"line_number":113,"context_line":"        # NOTE(jaypipes): Disregard the caching and chance schedulers, because"},{"line_number":114,"context_line":"        # they don\u0027t interact with the placement API."},{"line_number":115,"context_line":"        if self.scheduler_driver in (\u0027filter_scheduler\u0027, \u0027fake_scheduler\u0027):"},{"line_number":116,"context_line":"            res \u003d self.placement_client.get_allocation_candidates(resources)"},{"line_number":117,"context_line":"            alloc_reqs, p_sums \u003d res"},{"line_number":118,"context_line":"            if not alloc_reqs:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_6bd21ed3","line":115,"in_reply_to":"3f1d235d_3fc3478b","updated":"2017-07-07 00:15:35.000000000","message":"Done","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c85c3ffb48830f75d3e775eb87ab6bb82d75d1b1","unresolved":false,"context_lines":[{"line_number":112,"context_line":"        alloc_reqs, p_sums \u003d None, None"},{"line_number":113,"context_line":"        # NOTE(jaypipes): Disregard the caching and chance schedulers, because"},{"line_number":114,"context_line":"        # they don\u0027t interact with the placement API."},{"line_number":115,"context_line":"        if self.scheduler_driver in (\u0027filter_scheduler\u0027, \u0027fake_scheduler\u0027):"},{"line_number":116,"context_line":"            res \u003d self.placement_client.get_allocation_candidates(resources)"},{"line_number":117,"context_line":"            alloc_reqs, p_sums \u003d res"},{"line_number":118,"context_line":"            if not alloc_reqs:"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_3fc3478b","line":115,"in_reply_to":"3f1d235d_b652e411","updated":"2017-07-06 19:18:14.000000000","message":"I don\u0027t like this either. See my comments in earlier patch sets. I think there was confusion about what I was asking for. I was not asking for a config option for this. I was saying the scheduler driver implementation should have an attribute (I used the term \u0027flag\u0027 which maybe caused the confusion) which is checked here to see if it uses placement or not. The filter scheduler would return True for that attribute, caching and chance would return False. It could be an ABC method too, doesn\u0027t matter too much to me. But I don\u0027t really like checking driver types in the scheduler manager code, that is like checking libvirt/hyperv/xenapi in the compute manager which would be nasty.","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"062f873e6cb4aa4a01d0ad946ba4677fff3ed63e","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        # they don\u0027t interact with the placement API."},{"line_number":115,"context_line":"        if self.scheduler_driver in (\u0027filter_scheduler\u0027, \u0027fake_scheduler\u0027):"},{"line_number":116,"context_line":"            res \u003d self.placement_client.get_allocation_candidates(resources)"},{"line_number":117,"context_line":"            alloc_reqs, p_sums \u003d res"},{"line_number":118,"context_line":"            if not alloc_reqs:"},{"line_number":119,"context_line":"                LOG.debug(\"Got no allocation candidates from the Placement \""},{"line_number":120,"context_line":"                          \"API. This may be a temporary occurrence as compute \""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_3667f4eb","line":117,"updated":"2017-07-06 17:46:00.000000000","message":"you can make these two one line, yeah? because it\u0027s always a tuple (even if None, None) and I don\u0027t see you reusing res.","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"80781e02e31ca273f73cccc06b49f399f25c507a","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        # they don\u0027t interact with the placement API."},{"line_number":115,"context_line":"        if self.scheduler_driver in (\u0027filter_scheduler\u0027, \u0027fake_scheduler\u0027):"},{"line_number":116,"context_line":"            res \u003d self.placement_client.get_allocation_candidates(resources)"},{"line_number":117,"context_line":"            alloc_reqs, p_sums \u003d res"},{"line_number":118,"context_line":"            if not alloc_reqs:"},{"line_number":119,"context_line":"                LOG.debug(\"Got no allocation candidates from the Placement \""},{"line_number":120,"context_line":"                          \"API. This may be a temporary occurrence as compute \""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_abf5d658","line":117,"in_reply_to":"3f1d235d_3667f4eb","updated":"2017-07-07 00:15:35.000000000","message":"won\u0027t fit on a single line. that\u0027s why I did it this way. since nobody likes it when I put parens on lines by themselves...","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e3a73f506cb45b83cfe77b7df5ec9be5003f577a","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                          \"API. This may be a temporary occurrence as compute \""},{"line_number":121,"context_line":"                          \"nodes start up and begin reporting inventory to \""},{"line_number":122,"context_line":"                          \"the Placement service.\")"},{"line_number":123,"context_line":"                # NOTE(jaypipes): Setting p_sums to ai None triggers the"},{"line_number":124,"context_line":"                # scheduler to load all compute nodes to do scheduling \"the old"},{"line_number":125,"context_line":"                # way\". Really, we should raise NoValidHosts here, but all"},{"line_number":126,"context_line":"                # functional tests will fall over if we do that without"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_946fe729","line":123,"range":{"start_line":123,"start_character":52,"end_line":123,"end_character":55},"updated":"2017-07-06 15:39:38.000000000","message":"strike","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1adcdd8103cdb2e4bca6f5fe94ab94eba9e36781","unresolved":false,"context_lines":[{"line_number":120,"context_line":"                          \"API. This may be a temporary occurrence as compute \""},{"line_number":121,"context_line":"                          \"nodes start up and begin reporting inventory to \""},{"line_number":122,"context_line":"                          \"the Placement service.\")"},{"line_number":123,"context_line":"                # NOTE(jaypipes): Setting p_sums to ai None triggers the"},{"line_number":124,"context_line":"                # scheduler to load all compute nodes to do scheduling \"the old"},{"line_number":125,"context_line":"                # way\". Really, we should raise NoValidHosts here, but all"},{"line_number":126,"context_line":"                # functional tests will fall over if we do that without"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_3453733b","line":123,"range":{"start_line":123,"start_character":52,"end_line":123,"end_character":55},"in_reply_to":"3f1d235d_946fe729","updated":"2017-07-06 15:42:17.000000000","message":"lol, vim. thanks :)","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e3a73f506cb45b83cfe77b7df5ec9be5003f577a","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                # scheduler to load all compute nodes to do scheduling \"the old"},{"line_number":125,"context_line":"                # way\". Really, we should raise NoValidHosts here, but all"},{"line_number":126,"context_line":"                # functional tests will fall over if we do that without"},{"line_number":127,"context_line":"                # changing the PlacementFixture to load compute node inventory"},{"line_number":128,"context_line":"                # into the placement database before starting functional tests."},{"line_number":129,"context_line":"                p_sums \u003d None"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        dests \u003d self.driver.select_destinations(ctxt, spec_obj, instance_uuids,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_d4e8bf7c","line":128,"range":{"start_line":127,"start_character":18,"end_line":128,"end_character":78},"updated":"2017-07-06 15:39:38.000000000","message":"This smells like a TODO","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"80781e02e31ca273f73cccc06b49f399f25c507a","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                # scheduler to load all compute nodes to do scheduling \"the old"},{"line_number":125,"context_line":"                # way\". Really, we should raise NoValidHosts here, but all"},{"line_number":126,"context_line":"                # functional tests will fall over if we do that without"},{"line_number":127,"context_line":"                # changing the PlacementFixture to load compute node inventory"},{"line_number":128,"context_line":"                # into the placement database before starting functional tests."},{"line_number":129,"context_line":"                p_sums \u003d None"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        dests \u003d self.driver.select_destinations(ctxt, spec_obj, instance_uuids,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_cb65b21f","line":128,"range":{"start_line":127,"start_character":18,"end_line":128,"end_character":78},"in_reply_to":"3f1d235d_7f42df10","updated":"2017-07-07 00:15:35.000000000","message":"Done","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"1adcdd8103cdb2e4bca6f5fe94ab94eba9e36781","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                # scheduler to load all compute nodes to do scheduling \"the old"},{"line_number":125,"context_line":"                # way\". Really, we should raise NoValidHosts here, but all"},{"line_number":126,"context_line":"                # functional tests will fall over if we do that without"},{"line_number":127,"context_line":"                # changing the PlacementFixture to load compute node inventory"},{"line_number":128,"context_line":"                # into the placement database before starting functional tests."},{"line_number":129,"context_line":"                p_sums \u003d None"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        dests \u003d self.driver.select_destinations(ctxt, spec_obj, instance_uuids,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_f4361b03","line":128,"range":{"start_line":127,"start_character":18,"end_line":128,"end_character":78},"in_reply_to":"3f1d235d_d4e8bf7c","updated":"2017-07-06 15:42:17.000000000","message":"sure, yeah.","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c85c3ffb48830f75d3e775eb87ab6bb82d75d1b1","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                # scheduler to load all compute nodes to do scheduling \"the old"},{"line_number":125,"context_line":"                # way\". Really, we should raise NoValidHosts here, but all"},{"line_number":126,"context_line":"                # functional tests will fall over if we do that without"},{"line_number":127,"context_line":"                # changing the PlacementFixture to load compute node inventory"},{"line_number":128,"context_line":"                # into the placement database before starting functional tests."},{"line_number":129,"context_line":"                p_sums \u003d None"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        dests \u003d self.driver.select_destinations(ctxt, spec_obj, instance_uuids,"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_7f42df10","line":128,"range":{"start_line":127,"start_character":18,"end_line":128,"end_character":78},"in_reply_to":"3f1d235d_f4361b03","updated":"2017-07-06 19:18:14.000000000","message":"Alternatively, we figure out if we can just treat None and empty as the same thing and trigger a ComputeNodeList.get_all(). But definitely a TODO either way.","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"062f873e6cb4aa4a01d0ad946ba4677fff3ed63e","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                p_sums \u003d None"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        dests \u003d self.driver.select_destinations(ctxt, spec_obj, instance_uuids,"},{"line_number":132,"context_line":"            p_sums)"},{"line_number":133,"context_line":"        dest_dicts \u003d [_host_state_obj_to_dict(d) for d in dests]"},{"line_number":134,"context_line":"        return jsonutils.to_primitive(dest_dicts)"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_d6eb2010","line":132,"updated":"2017-07-06 17:46:00.000000000","message":"using alloc_reqs comes in later patches, yes? for now we throw them away.","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c85c3ffb48830f75d3e775eb87ab6bb82d75d1b1","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                p_sums \u003d None"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        dests \u003d self.driver.select_destinations(ctxt, spec_obj, instance_uuids,"},{"line_number":132,"context_line":"            p_sums)"},{"line_number":133,"context_line":"        dest_dicts \u003d [_host_state_obj_to_dict(d) for d in dests]"},{"line_number":134,"context_line":"        return jsonutils.to_primitive(dest_dicts)"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"3f1d235d_1f53ebe3","line":132,"in_reply_to":"3f1d235d_d6eb2010","updated":"2017-07-06 19:18:14.000000000","message":"Yes, we\u0027ll use them later when we \u0027claim\u0027.","commit_id":"acce51fcfdfd96fada4e8f72633b533cdb77c9ce"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62d47c410abd07e37b5699760e839e828b0fac89","unresolved":false,"context_lines":[{"line_number":107,"context_line":"            spec_obj \u003d objects.RequestSpec.from_primitives(ctxt,"},{"line_number":108,"context_line":"                                                           request_spec,"},{"line_number":109,"context_line":"                                                           filter_properties)"},{"line_number":110,"context_line":"        resources \u003d utils.resources_from_request_spec(spec_obj)"},{"line_number":111,"context_line":"        alloc_reqs, p_sums \u003d None, None"},{"line_number":112,"context_line":"        if self.driver.USES_ALLOCATION_CANDIDATES:"},{"line_number":113,"context_line":"            res \u003d self.placement_client.get_allocation_candidates(resources)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_684fab92","line":110,"range":{"start_line":110,"start_character":8,"end_line":110,"end_character":17},"updated":"2017-07-07 14:19:36.000000000","message":"we could move this into the block below","commit_id":"0efd4fe8309ab5f5f2fb1901d8127febf82f6351"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"62d47c410abd07e37b5699760e839e828b0fac89","unresolved":false,"context_lines":[{"line_number":108,"context_line":"                                                           request_spec,"},{"line_number":109,"context_line":"                                                           filter_properties)"},{"line_number":110,"context_line":"        resources \u003d utils.resources_from_request_spec(spec_obj)"},{"line_number":111,"context_line":"        alloc_reqs, p_sums \u003d None, None"},{"line_number":112,"context_line":"        if self.driver.USES_ALLOCATION_CANDIDATES:"},{"line_number":113,"context_line":"            res \u003d self.placement_client.get_allocation_candidates(resources)"},{"line_number":114,"context_line":"            alloc_reqs, p_sums \u003d res"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_c87ebfae","line":111,"range":{"start_line":111,"start_character":8,"end_line":111,"end_character":18},"updated":"2017-07-07 14:19:36.000000000","message":"we could move this into the block below","commit_id":"0efd4fe8309ab5f5f2fb1901d8127febf82f6351"},{"author":{"_account_id":1063,"name":"Ed Leafe","email":"ed@leafe.com","username":"ed-leafe"},"change_message_id":"96bddc9971e80a8373eec6026a7ede839bfc07d1","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        alloc_reqs, p_sums \u003d None, None"},{"line_number":112,"context_line":"        if self.driver.USES_ALLOCATION_CANDIDATES:"},{"line_number":113,"context_line":"            res \u003d self.placement_client.get_allocation_candidates(resources)"},{"line_number":114,"context_line":"            alloc_reqs, p_sums \u003d res"},{"line_number":115,"context_line":"            if not alloc_reqs:"},{"line_number":116,"context_line":"                LOG.debug(\"Got no allocation candidates from the Placement \""},{"line_number":117,"context_line":"                          \"API. This may be a temporary occurrence as compute \""}],"source_content_type":"text/x-python","patch_set":18,"id":"3f1d235d_43129064","line":114,"range":{"start_line":114,"start_character":24,"end_line":114,"end_character":30},"updated":"2017-07-07 14:53:54.000000000","message":"nit: you know what this is, and I know what this is, but someone looking at this code for the first time would probably think that this represents the sums of things that begin with the letter \u0027p\u0027. A longer, more descriptive name such as \"provider_summaries\" or even \"prov_summaries\" would be much better. This would help here and in all the other places where \u0027p_sums\u0027 is used.","commit_id":"0efd4fe8309ab5f5f2fb1901d8127febf82f6351"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9d99b3bf3c13d284dac8900477cf5a612b113c3e","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        resources \u003d utils.resources_from_request_spec(spec_obj)"},{"line_number":111,"context_line":"        alloc_reqs, p_sums \u003d None, None"},{"line_number":112,"context_line":"        if self.driver.USES_ALLOCATION_CANDIDATES:"},{"line_number":113,"context_line":"            res \u003d self.placement_client.get_allocation_candidates(resources)"},{"line_number":114,"context_line":"            alloc_reqs, p_sums \u003d res"},{"line_number":115,"context_line":"            if not alloc_reqs:"},{"line_number":116,"context_line":"                LOG.debug(\"Got no allocation candidates from the Placement \""}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_46d974f2","line":113,"updated":"2017-07-07 21:00:03.000000000","message":"I just thought of this, but should we even be doing any of this until we can actually do the claims in the scheduler too? And I thought we couldn\u0027t do the claims in the scheduler until all of the computes were upgraded to the point where the computes check to see if the allocation was already done for them, and if so, they don\u0027t do an actual claim (it becomes a noop claim I guess). I guess we still need the shared storage / misc shared aggregate stuff that allocation candidates gives us which the old 1.4 filtered RPs doesn\u0027t, so that\u0027s still needed.","commit_id":"48268c73e3f43fa763d071422816942942987f4a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"d19449d08d28cc2407cc48052da0ebe72f58fab6","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        resources \u003d utils.resources_from_request_spec(spec_obj)"},{"line_number":111,"context_line":"        alloc_reqs, p_sums \u003d None, None"},{"line_number":112,"context_line":"        if self.driver.USES_ALLOCATION_CANDIDATES:"},{"line_number":113,"context_line":"            res \u003d self.placement_client.get_allocation_candidates(resources)"},{"line_number":114,"context_line":"            alloc_reqs, p_sums \u003d res"},{"line_number":115,"context_line":"            if not alloc_reqs:"},{"line_number":116,"context_line":"                LOG.debug(\"Got no allocation candidates from the Placement \""}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_9350c8d6","line":113,"in_reply_to":"3f1d235d_46d974f2","updated":"2017-07-10 13:52:52.000000000","message":"Computes do already handle the case where the allocation is present here:\n\nhttps://github.com/openstack/nova/blob/master/nova/scheduler/client/report.py#L863\n\nSo I think we\u0027re good on doing the claim in the scheduler on that basis. Aside from that, this quoted change is basically the same as the old side of the this change, AFAICT, in that it\u0027s just using the same data from placement but in a different format.","commit_id":"48268c73e3f43fa763d071422816942942987f4a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4ca6e85321d7a0c5a7d6e1bd0f70502175757c2b","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        resources \u003d utils.resources_from_request_spec(spec_obj)"},{"line_number":111,"context_line":"        alloc_reqs, p_sums \u003d None, None"},{"line_number":112,"context_line":"        if self.driver.USES_ALLOCATION_CANDIDATES:"},{"line_number":113,"context_line":"            res \u003d self.placement_client.get_allocation_candidates(resources)"},{"line_number":114,"context_line":"            alloc_reqs, p_sums \u003d res"},{"line_number":115,"context_line":"            if not alloc_reqs:"},{"line_number":116,"context_line":"                LOG.debug(\"Got no allocation candidates from the Placement \""}],"source_content_type":"text/x-python","patch_set":19,"id":"3f1d235d_b99e0552","line":113,"in_reply_to":"3f1d235d_9350c8d6","updated":"2017-07-10 14:52:53.000000000","message":"Yeah this replaces filtering by resource provider with the new allocation candidates API, that\u0027s why I was OK with approving it. I brought up my concerns about claims in the patch after this, which actually creates the allocations in the scheduler.","commit_id":"48268c73e3f43fa763d071422816942942987f4a"}],"nova/tests/unit/scheduler/test_scheduler.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"af35d6d52ea6d35721ded6d89c427a5ef4e834e5","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        fake_spec.instance_uuid \u003d uuids.instance"},{"line_number":99,"context_line":"        mock_get_ac.return_value \u003d ("},{"line_number":100,"context_line":"            mock.sentinel.alloc_reqs, mock.sentinel.p_sums"},{"line_number":101,"context_line":"        )"},{"line_number":102,"context_line":"        with mock.patch.object(self.manager.driver, \u0027select_destinations\u0027"},{"line_number":103,"context_line":"                ) as select_destinations:"},{"line_number":104,"context_line":"            self.manager.select_destinations(None, spec_obj\u003dfake_spec,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f201791_ff1a666c","line":101,"range":{"start_line":101,"start_character":0,"end_line":101,"end_character":9},"updated":"2017-06-28 12:36:03.000000000","message":"trailing paren","commit_id":"169f84552948a70bd9c56f7f1ef469ac86846b0d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"af35d6d52ea6d35721ded6d89c427a5ef4e834e5","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        fake_spec \u003d objects.RequestSpec()"},{"line_number":115,"context_line":"        mock_get_ac.return_value \u003d ("},{"line_number":116,"context_line":"            mock.sentinel.alloc_reqs, mock.sentinel.p_sums"},{"line_number":117,"context_line":"        )"},{"line_number":118,"context_line":"        with mock.patch.object(self.manager.driver, \u0027select_destinations\u0027"},{"line_number":119,"context_line":"                ) as select_destinations:"},{"line_number":120,"context_line":"            self.manager.select_destinations(None, spec_obj\u003dfake_spec)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f201791_df156a3e","line":117,"range":{"start_line":117,"start_character":0,"end_line":117,"end_character":9},"updated":"2017-06-28 12:36:03.000000000","message":"ditto","commit_id":"169f84552948a70bd9c56f7f1ef469ac86846b0d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"af35d6d52ea6d35721ded6d89c427a5ef4e834e5","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        from_primitives.return_value \u003d fake_spec"},{"line_number":135,"context_line":"        mock_get_ac.return_value \u003d ("},{"line_number":136,"context_line":"            mock.sentinel.alloc_reqs, mock.sentinel.p_sums"},{"line_number":137,"context_line":"        )"},{"line_number":138,"context_line":"        with mock.patch.object(self.manager.driver, \u0027select_destinations\u0027"},{"line_number":139,"context_line":"                ) as select_destinations:"},{"line_number":140,"context_line":"            self.manager.select_destinations(None, request_spec\u003d\u0027fake_spec\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f201791_9f2db296","line":137,"range":{"start_line":137,"start_character":0,"end_line":137,"end_character":9},"updated":"2017-06-28 12:36:03.000000000","message":"ditto","commit_id":"169f84552948a70bd9c56f7f1ef469ac86846b0d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ee5ad029ef6422de2ab48fe4ed82229bdac19249","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        fake_spec.instance_uuid \u003d uuids.instance"},{"line_number":99,"context_line":"        mock_get_ac.return_value \u003d ("},{"line_number":100,"context_line":"            mock.sentinel.alloc_reqs, mock.sentinel.p_sums"},{"line_number":101,"context_line":"        )"},{"line_number":102,"context_line":"        with mock.patch.object(self.manager.driver, \u0027select_destinations\u0027"},{"line_number":103,"context_line":"                ) as select_destinations:"},{"line_number":104,"context_line":"            self.manager.select_destinations(None, spec_obj\u003dfake_spec,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_b42b3193","line":101,"range":{"start_line":101,"start_character":8,"end_line":101,"end_character":9},"updated":"2017-07-05 15:48:41.000000000","message":"Trailing paren","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"921b1b047e0cf60b74dce64148a089ead15334b2","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        fake_spec.instance_uuid \u003d uuids.instance"},{"line_number":99,"context_line":"        mock_get_ac.return_value \u003d ("},{"line_number":100,"context_line":"            mock.sentinel.alloc_reqs, mock.sentinel.p_sums"},{"line_number":101,"context_line":"        )"},{"line_number":102,"context_line":"        with mock.patch.object(self.manager.driver, \u0027select_destinations\u0027"},{"line_number":103,"context_line":"                ) as select_destinations:"},{"line_number":104,"context_line":"            self.manager.select_destinations(None, spec_obj\u003dfake_spec,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_5d8ac1be","line":101,"range":{"start_line":101,"start_character":8,"end_line":101,"end_character":9},"in_reply_to":"3f1d235d_1df1e995","updated":"2017-07-05 16:29:48.000000000","message":"I would. We had a whole thing about this in IRC last week.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5678415830dcb26d29fe009d56ca59ce2426e671","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        fake_spec.instance_uuid \u003d uuids.instance"},{"line_number":99,"context_line":"        mock_get_ac.return_value \u003d ("},{"line_number":100,"context_line":"            mock.sentinel.alloc_reqs, mock.sentinel.p_sums"},{"line_number":101,"context_line":"        )"},{"line_number":102,"context_line":"        with mock.patch.object(self.manager.driver, \u0027select_destinations\u0027"},{"line_number":103,"context_line":"                ) as select_destinations:"},{"line_number":104,"context_line":"            self.manager.select_destinations(None, spec_obj\u003dfake_spec,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_b881bfc5","line":101,"range":{"start_line":101,"start_character":8,"end_line":101,"end_character":9},"in_reply_to":"3f1d235d_5d8ac1be","updated":"2017-07-06 13:04:25.000000000","message":"Done","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7b75a85ba14dd7deeff01d20cf49fe99040f52bc","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        fake_spec.instance_uuid \u003d uuids.instance"},{"line_number":99,"context_line":"        mock_get_ac.return_value \u003d ("},{"line_number":100,"context_line":"            mock.sentinel.alloc_reqs, mock.sentinel.p_sums"},{"line_number":101,"context_line":"        )"},{"line_number":102,"context_line":"        with mock.patch.object(self.manager.driver, \u0027select_destinations\u0027"},{"line_number":103,"context_line":"                ) as select_destinations:"},{"line_number":104,"context_line":"            self.manager.select_destinations(None, spec_obj\u003dfake_spec,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_a0388ced","line":101,"range":{"start_line":101,"start_character":8,"end_line":101,"end_character":9},"in_reply_to":"3f1d235d_5d8ac1be","updated":"2017-07-05 16:59:45.000000000","message":"Oh boy, well I missed that. Seems pretty nit picky, like people are OK with doing something like:\n\nmylist \u003d [\n   a,\n   b\n]\n\nAnd:\n\nmydict \u003d {\n   \u0027a\u0027: 1,\n   \u0027b\u0027: 2\n}\n\nso I don\u0027t see a huge issue with doing it for tuples.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"d343eb6954815f3f8f575b6016f55036944ec5f2","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        fake_spec.instance_uuid \u003d uuids.instance"},{"line_number":99,"context_line":"        mock_get_ac.return_value \u003d ("},{"line_number":100,"context_line":"            mock.sentinel.alloc_reqs, mock.sentinel.p_sums"},{"line_number":101,"context_line":"        )"},{"line_number":102,"context_line":"        with mock.patch.object(self.manager.driver, \u0027select_destinations\u0027"},{"line_number":103,"context_line":"                ) as select_destinations:"},{"line_number":104,"context_line":"            self.manager.select_destinations(None, spec_obj\u003dfake_spec,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_1df1e995","line":101,"range":{"start_line":101,"start_character":8,"end_line":101,"end_character":9},"in_reply_to":"3f1d235d_b42b3193","updated":"2017-07-05 16:26:19.000000000","message":"I definitely wouldn\u0027t -1 for this.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ee5ad029ef6422de2ab48fe4ed82229bdac19249","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        fake_spec \u003d objects.RequestSpec()"},{"line_number":115,"context_line":"        mock_get_ac.return_value \u003d ("},{"line_number":116,"context_line":"            mock.sentinel.alloc_reqs, mock.sentinel.p_sums"},{"line_number":117,"context_line":"        )"},{"line_number":118,"context_line":"        with mock.patch.object(self.manager.driver, \u0027select_destinations\u0027"},{"line_number":119,"context_line":"                ) as select_destinations:"},{"line_number":120,"context_line":"            self.manager.select_destinations(None, spec_obj\u003dfake_spec)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_741b5980","line":117,"range":{"start_line":117,"start_character":8,"end_line":117,"end_character":9},"updated":"2017-07-05 15:48:41.000000000","message":"ditto","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5678415830dcb26d29fe009d56ca59ce2426e671","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        fake_spec \u003d objects.RequestSpec()"},{"line_number":115,"context_line":"        mock_get_ac.return_value \u003d ("},{"line_number":116,"context_line":"            mock.sentinel.alloc_reqs, mock.sentinel.p_sums"},{"line_number":117,"context_line":"        )"},{"line_number":118,"context_line":"        with mock.patch.object(self.manager.driver, \u0027select_destinations\u0027"},{"line_number":119,"context_line":"                ) as select_destinations:"},{"line_number":120,"context_line":"            self.manager.select_destinations(None, spec_obj\u003dfake_spec)"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_9884c3d4","line":117,"range":{"start_line":117,"start_character":8,"end_line":117,"end_character":9},"in_reply_to":"3f1d235d_741b5980","updated":"2017-07-06 13:04:25.000000000","message":"Done","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"ee5ad029ef6422de2ab48fe4ed82229bdac19249","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        from_primitives.return_value \u003d fake_spec"},{"line_number":135,"context_line":"        mock_get_ac.return_value \u003d ("},{"line_number":136,"context_line":"            mock.sentinel.alloc_reqs, mock.sentinel.p_sums"},{"line_number":137,"context_line":"        )"},{"line_number":138,"context_line":"        with mock.patch.object(self.manager.driver, \u0027select_destinations\u0027"},{"line_number":139,"context_line":"                ) as select_destinations:"},{"line_number":140,"context_line":"            self.manager.select_destinations(None, request_spec\u003d\u0027fake_spec\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_54205dac","line":137,"range":{"start_line":137,"start_character":8,"end_line":137,"end_character":9},"updated":"2017-07-05 15:48:41.000000000","message":"ditto","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5678415830dcb26d29fe009d56ca59ce2426e671","unresolved":false,"context_lines":[{"line_number":134,"context_line":"        from_primitives.return_value \u003d fake_spec"},{"line_number":135,"context_line":"        mock_get_ac.return_value \u003d ("},{"line_number":136,"context_line":"            mock.sentinel.alloc_reqs, mock.sentinel.p_sums"},{"line_number":137,"context_line":"        )"},{"line_number":138,"context_line":"        with mock.patch.object(self.manager.driver, \u0027select_destinations\u0027"},{"line_number":139,"context_line":"                ) as select_destinations:"},{"line_number":140,"context_line":"            self.manager.select_destinations(None, request_spec\u003d\u0027fake_spec\u0027,"}],"source_content_type":"text/x-python","patch_set":15,"id":"3f1d235d_586aab19","line":137,"range":{"start_line":137,"start_character":8,"end_line":137,"end_character":9},"in_reply_to":"3f1d235d_54205dac","updated":"2017-07-06 13:04:25.000000000","message":"Done","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"}],"releasenotes/notes/scheduler-placement-allocation-candidates-a6221e1819ea1c2d.yaml":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c69efdbfeffbb4166c01ebdf624bb6432d561ba5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The scheduler now requests allocation candidates from the Placement"},{"line_number":5,"context_line":"    service during scheduling. The allocation candidates information"},{"line_number":6,"context_line":"    was introduced in the Placement API 1.10 microversion, so you should"},{"line_number":7,"context_line":"    upgrade the placement service before the Nova scheduler service so that"}],"source_content_type":"text/x-yaml","patch_set":15,"id":"3f1d235d_5dc5685a","line":4,"updated":"2017-07-03 15:31:17.000000000","message":"You could do it here, or we could do it in a follow up patch, but we also have some upgrade notes in the docs for placement:\n\nhttp://git.openstack.org/cgit/openstack/nova/tree/doc/source/placement.rst#n192\n\nSo that should be updated to note that you need to upgrade placement before the scheduler. We could also look at bumping the minimum required version of placement in nova-status.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8e25d37efe15bc6164d0b03fac123c84493529f5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The scheduler now requests allocation candidates from the Placement"},{"line_number":5,"context_line":"    service during scheduling. The allocation candidates information"},{"line_number":6,"context_line":"    was introduced in the Placement API 1.10 microversion, so you should"},{"line_number":7,"context_line":"    upgrade the placement service before the Nova scheduler service so that"}],"source_content_type":"text/x-yaml","patch_set":15,"id":"3f1d235d_0c36a053","line":4,"in_reply_to":"3f1d235d_5dc5685a","updated":"2017-07-03 18:47:28.000000000","message":"\u003e We could also look at bumping the minimum required version of placement in nova-status.\n\nTo be clear, I\u0027d handle nova-status in a separate change.","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"5678415830dcb26d29fe009d56ca59ce2426e671","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The scheduler now requests allocation candidates from the Placement"},{"line_number":5,"context_line":"    service during scheduling. The allocation candidates information"},{"line_number":6,"context_line":"    was introduced in the Placement API 1.10 microversion, so you should"},{"line_number":7,"context_line":"    upgrade the placement service before the Nova scheduler service so that"}],"source_content_type":"text/x-yaml","patch_set":15,"id":"3f1d235d_d8cc7b36","line":4,"in_reply_to":"3f1d235d_5dc5685a","updated":"2017-07-06 13:04:25.000000000","message":"Done","commit_id":"581ad83990eb75e6305e6e452f933c3d54a35389"}]}
