)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"754ce75fec45104b9c3f15b6cfd0d1b5edfa2d8b","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"The compute service set_host_enabled method is updated to"},{"line_number":31,"context_line":"lookup the compute node(s) for the service and if the service"},{"line_number":32,"context_line":"is disabled, adds a trait to the corresponding trait to the"},{"line_number":33,"context_line":"compute node resource provider to indicate it\u0027s disabled. If"},{"line_number":34,"context_line":"the service is no longer disabled (or forced down) then the"},{"line_number":35,"context_line":"trait is removed."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ffb9cba7_b3e89116","line":32,"range":{"start_line":32,"start_character":47,"end_line":32,"end_character":59},"updated":"2019-04-22 18:30:37.000000000","message":"nix","commit_id":"051260b0ddc1488ed946d395f48becc4651002f4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8dcef00be28eccc78a4115ab7b1bc83fd3cf391f","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"The compute service set_host_enabled method is updated to"},{"line_number":31,"context_line":"lookup the compute node(s) for the service and if the service"},{"line_number":32,"context_line":"is disabled, adds a trait to the corresponding trait to the"},{"line_number":33,"context_line":"compute node resource provider to indicate it\u0027s disabled. If"},{"line_number":34,"context_line":"the service is no longer disabled (or forced down) then the"},{"line_number":35,"context_line":"trait is removed."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ffb9cba7_d916034a","line":32,"range":{"start_line":32,"start_character":47,"end_line":32,"end_character":59},"in_reply_to":"ffb9cba7_b3e89116","updated":"2019-05-08 18:38:34.000000000","message":"Done","commit_id":"051260b0ddc1488ed946d395f48becc4651002f4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"754ce75fec45104b9c3f15b6cfd0d1b5edfa2d8b","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"The libvirt driver is the only driver that has its own"},{"line_number":41,"context_line":"automatic compute service disable code when the connection"},{"line_number":42,"context_line":"to the libvirt service is lost (or reconnected). This method"},{"line_number":43,"context_line":"is updated to hook back into the same code that the compute"},{"line_number":44,"context_line":"service uses via a new method on the ComputeVirtAPI."},{"line_number":45,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ffb9cba7_d3ed0526","line":42,"range":{"start_line":42,"start_character":7,"end_line":42,"end_character":22},"updated":"2019-04-22 18:30:37.000000000","message":"hypervisor","commit_id":"051260b0ddc1488ed946d395f48becc4651002f4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8dcef00be28eccc78a4115ab7b1bc83fd3cf391f","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"The libvirt driver is the only driver that has its own"},{"line_number":41,"context_line":"automatic compute service disable code when the connection"},{"line_number":42,"context_line":"to the libvirt service is lost (or reconnected). This method"},{"line_number":43,"context_line":"is updated to hook back into the same code that the compute"},{"line_number":44,"context_line":"service uses via a new method on the ComputeVirtAPI."},{"line_number":45,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ffb9cba7_992e4b90","line":42,"range":{"start_line":42,"start_character":7,"end_line":42,"end_character":22},"in_reply_to":"ffb9cba7_d3ed0526","updated":"2019-05-08 18:38:34.000000000","message":"Done","commit_id":"051260b0ddc1488ed946d395f48becc4651002f4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e6ea8e33031334e556dff7c9ce03d171e6127c74","unresolved":false,"context_lines":[{"line_number":58,"context_line":"- figure out what to do about handling upgrade issues (old computes"},{"line_number":59,"context_line":"  and such)"},{"line_number":60,"context_line":"- split out the changes into a series of smaller patches"},{"line_number":61,"context_line":"- register a blueprint and spec to document the design and alternatives"},{"line_number":62,"context_line":"- release note and docs for the new request filter"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"Change-Id: If32bca070185937ef83f689b7163d965a89ec10a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ffb9cba7_b84b9085","line":61,"range":{"start_line":61,"start_character":59,"end_line":61,"end_character":71},"updated":"2019-04-22 18:20:20.000000000","message":"The main alternative is setting all of the inventory reserved values on the provider equal to the total for each class, like what the ironic driver does when a node is undergoing maintenance, but that seems kind of messy to me since we could have nested inventory on a given compute node tree (ironic node\u0027s today just have a single inventory resource class), and wouldn\u0027t be something you can opt in and out of via configuration like the ComputeFilter is.","commit_id":"051260b0ddc1488ed946d395f48becc4651002f4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"1752e424b54bbbbec0e146a5447201da29d2effe","unresolved":false,"context_lines":[{"line_number":58,"context_line":"- figure out what to do about handling upgrade issues (old computes"},{"line_number":59,"context_line":"  and such)"},{"line_number":60,"context_line":"- split out the changes into a series of smaller patches"},{"line_number":61,"context_line":"- register a blueprint and spec to document the design and alternatives"},{"line_number":62,"context_line":"- release note and docs for the new request filter"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"Change-Id: If32bca070185937ef83f689b7163d965a89ec10a"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ffb9cba7_b39ad1c2","line":61,"range":{"start_line":61,"start_character":59,"end_line":61,"end_character":71},"in_reply_to":"ffb9cba7_b84b9085","updated":"2019-04-22 18:28:13.000000000","message":"Another alternative is putting disabled compute resource providers into a resource provider aggregate and then the filter forbids providers in that aggregate:\n\nhttps://docs.openstack.org/placement/latest/placement-api-microversion-history.html#support-forbidden-aggregates","commit_id":"051260b0ddc1488ed946d395f48becc4651002f4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8dcef00be28eccc78a4115ab7b1bc83fd3cf391f","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This plumbs code into the compute service, API and"},{"line_number":10,"context_line":"scheduler to essentially write a placement request filter"},{"line_number":11,"context_line":"replacement for the ComputeFilter so that disabled computes"},{"line_number":12,"context_line":"can be filtered out of GET /allocation_candidates responses"},{"line_number":13,"context_line":"before the scheduler filters process the results."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"dfbec78f_4b9fde02","line":11,"range":{"start_line":11,"start_character":0,"end_line":11,"end_character":33},"updated":"2019-05-08 18:38:34.000000000","message":"Note that the ComputeFilter also takes the service group \"is up\" state into account in addition to the disabled flag on the compute node. My change here doesn\u0027t handle computes which are enabled but \"down\" per the service group API. Will have to think about that in the spec.","commit_id":"6c1c1c5a8c0ef169daddfdba1c18c2bed4b1cd25"}],"nova/api/openstack/compute/services.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0e0bb7f3a0e4a9a1038174b3dd03a98ae46f2db2","unresolved":false,"context_lines":[{"line_number":407,"context_line":"        # modify the disabled trait on the compute node resource provider(s)."},{"line_number":408,"context_line":"        self.host_api.update_compute_node_status_in_placement(context, service)"},{"line_number":409,"context_line":"        # Now save our updates to the service record in the database."},{"line_number":410,"context_line":"        service.save()"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"        # Return the full service record details."},{"line_number":413,"context_line":"        additional_fields \u003d [\u0027forced_down\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_d5afade0","line":410,"updated":"2019-06-25 20:41:05.000000000","message":"We should do this first so we\u0027re sure we always get the DB in order and then do the sync to placement stuff on the compute (maybe this could call HostAPI.service_update or some variant where we pass the object so we don\u0027t need to have multiple copies of who calls update_compute_node_status_in_placement).","commit_id":"5800435cc3690f3764b6489db841fc58682be361"}],"nova/compute/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"26ad9272f99d213a7911db3c60bcca05840cbaa4","unresolved":false,"context_lines":[{"line_number":5107,"context_line":"        # passing in an optional compute RPC API client?"},{"line_number":5108,"context_line":"        changes \u003d service.obj_what_changed()"},{"line_number":5109,"context_line":"        update_placement \u003d any(field in changes"},{"line_number":5110,"context_line":"                               for field in (\u0027disabled\u0027, \u0027forced_down\u0027))"},{"line_number":5111,"context_line":"        if update_placement:"},{"line_number":5112,"context_line":"            # Treat forced_down\u003dTrue as disabled since that\u0027s what the"},{"line_number":5113,"context_line":"            # service group API does with it."}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_468b2c67","line":5110,"range":{"start_line":5110,"start_character":58,"end_line":5110,"end_character":69},"updated":"2019-06-24 21:04:01.000000000","message":"Remove all the forced down stuff, we\u0027re not going to deal with that in this blueprint and instead let the ComputeFilter continue to handle that, see the note in the spec:\n\nhttps://specs.openstack.org/openstack/nova-specs/specs/train/approved/pre-filter-disabled-computes.html#scheduler-changes","commit_id":"f658668c5dff7031f519a6c92866e556503e0274"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"26ad9272f99d213a7911db3c60bcca05840cbaa4","unresolved":false,"context_lines":[{"line_number":5111,"context_line":"        if update_placement:"},{"line_number":5112,"context_line":"            # Treat forced_down\u003dTrue as disabled since that\u0027s what the"},{"line_number":5113,"context_line":"            # service group API does with it."},{"line_number":5114,"context_line":"            enabled \u003d not (service.disabled or service.forced_down)"},{"line_number":5115,"context_line":"            # Avoid leaking errors out of the API."},{"line_number":5116,"context_line":"            try:"},{"line_number":5117,"context_line":"                # TODO(mriedem): What if we\u0027re doing a rolling upgrade and the"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_06ef741e","line":5114,"range":{"start_line":5114,"start_character":47,"end_line":5114,"end_character":66},"updated":"2019-06-24 21:04:01.000000000","message":"remove","commit_id":"f658668c5dff7031f519a6c92866e556503e0274"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"26ad9272f99d213a7911db3c60bcca05840cbaa4","unresolved":false,"context_lines":[{"line_number":5114,"context_line":"            enabled \u003d not (service.disabled or service.forced_down)"},{"line_number":5115,"context_line":"            # Avoid leaking errors out of the API."},{"line_number":5116,"context_line":"            try:"},{"line_number":5117,"context_line":"                # TODO(mriedem): What if we\u0027re doing a rolling upgrade and the"},{"line_number":5118,"context_line":"                # compute RPC API version is pinned or the compute is old and"},{"line_number":5119,"context_line":"                # doesn\u0027t have the new behavior? Should we temporarily do the"},{"line_number":5120,"context_line":"                # resource provider traits work here? Or just say it\u0027s a known"},{"line_number":5121,"context_line":"                # issue and not entirely fixed until you\u0027re fully upgraded (we"},{"line_number":5122,"context_line":"                # could at least log something by doing a version check on the"},{"line_number":5123,"context_line":"                # service object)."},{"line_number":5124,"context_line":"                self.rpcapi.set_host_enabled(context, service.host, enabled)"},{"line_number":5125,"context_line":"            except NotImplementedError:"},{"line_number":5126,"context_line":"                # Older non-xenapi computes will raise NotImplementedError for"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_46b9ec12","line":5123,"range":{"start_line":5117,"start_character":16,"end_line":5123,"end_character":34},"updated":"2019-06-24 21:04:01.000000000","message":"Check (1) the service version for upgrades and (2) if the service is up and if neither work then log something and just update the service.disabled and let update_provider_tree handle synchronizing the trait on restart of the compute service (or the periodic update_available_resource periodic task).","commit_id":"f658668c5dff7031f519a6c92866e556503e0274"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"26ad9272f99d213a7911db3c60bcca05840cbaa4","unresolved":false,"context_lines":[{"line_number":5122,"context_line":"                # could at least log something by doing a version check on the"},{"line_number":5123,"context_line":"                # service object)."},{"line_number":5124,"context_line":"                self.rpcapi.set_host_enabled(context, service.host, enabled)"},{"line_number":5125,"context_line":"            except NotImplementedError:"},{"line_number":5126,"context_line":"                # Older non-xenapi computes will raise NotImplementedError for"},{"line_number":5127,"context_line":"                # driver.set_host_enabled. It should be safe to remove this"},{"line_number":5128,"context_line":"                # after Train."}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_c6295c37","line":5125,"updated":"2019-06-24 21:04:01.000000000","message":"We\u0027d avoid this with a service version check.","commit_id":"f658668c5dff7031f519a6c92866e556503e0274"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"26ad9272f99d213a7911db3c60bcca05840cbaa4","unresolved":false,"context_lines":[{"line_number":5131,"context_line":"                # TODO(mriedem): What if we lost a race with the service going"},{"line_number":5132,"context_line":"                # down and we could not make the RPC call? Seems we should try"},{"line_number":5133,"context_line":"                # to set/unset the disabled trait here."},{"line_number":5134,"context_line":"                # TODO(mriedem): Maybe we should let this be a 500 so that the"},{"line_number":5135,"context_line":"                # nova and placement view of the status is not out of sync."},{"line_number":5136,"context_line":"                LOG.exception(\u0027An error occurred while updating host enabled \u0027"},{"line_number":5137,"context_line":"                              \u0027status to \"%s\" for compute host: %s\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_861fe406","line":5134,"updated":"2019-06-24 21:04:01.000000000","message":"We should just log the error and let update_provider_tree in the compute sync the trait later.","commit_id":"f658668c5dff7031f519a6c92866e556503e0274"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0e0bb7f3a0e4a9a1038174b3dd03a98ae46f2db2","unresolved":false,"context_lines":[{"line_number":5149,"context_line":"        # We wait to persist the change until after we\u0027ve made the change in"},{"line_number":5150,"context_line":"        # compute to avoid the nova and placement view of the status getting"},{"line_number":5151,"context_line":"        # out of sync."},{"line_number":5152,"context_line":"        service.save()"},{"line_number":5153,"context_line":"        return service"},{"line_number":5154,"context_line":""},{"line_number":5155,"context_line":"    @target_host_cell"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_b5b23948","line":5152,"updated":"2019-06-25 20:41:05.000000000","message":"We should save this before trying to sync the status in placement in case something goes wrong there (or we can\u0027t sync the status b/c the compute service is old or down).","commit_id":"5800435cc3690f3764b6489db841fc58682be361"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"a71b0163f18f6ab248fe59f7cc135ced79f56384","unresolved":false,"context_lines":[{"line_number":5125,"context_line":"        enabled \u003d not service.disabled"},{"line_number":5126,"context_line":"        # Avoid leaking errors out of the API."},{"line_number":5127,"context_line":"        try:"},{"line_number":5128,"context_line":"            LOG.debug(\u0027Calling the compute service on host %s to sync the \u0027"},{"line_number":5129,"context_line":"                      \u0027COMPUTE_STATUS_DISABLED trait.\u0027, service.host)"},{"line_number":5130,"context_line":"            self.rpcapi.set_host_enabled(context, service.host, enabled)"},{"line_number":5131,"context_line":"        except Exception:"},{"line_number":5132,"context_line":"            LOG.exception(\u0027An error occurred while updating host enabled \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_9e7a3122","line":5129,"range":{"start_line":5128,"start_character":0,"end_line":5129,"end_character":69},"updated":"2019-07-05 16:21:39.000000000","message":"nit: This should be done outside the try-except. Keep the scope in there to a minimum","commit_id":"3f0605c28987f46cf4a05af0140e2e5de7d5ad0a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"182e646f1d3291ac86c59be1099bdd7d5f60d68b","unresolved":false,"context_lines":[{"line_number":5129,"context_line":"                      \u0027COMPUTE_STATUS_DISABLED trait.\u0027, service.host)"},{"line_number":5130,"context_line":"            self.rpcapi.set_host_enabled(context, service.host, enabled)"},{"line_number":5131,"context_line":"        except Exception:"},{"line_number":5132,"context_line":"            LOG.exception(\u0027An error occurred while updating host enabled \u0027"},{"line_number":5133,"context_line":"                          \u0027status to \"%s\" for compute host: %s\u0027,"},{"line_number":5134,"context_line":"                          \u0027enabled\u0027 if enabled else \u0027disabled\u0027,"},{"line_number":5135,"context_line":"                          service.host)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fb8cfa7_dca8bf21","line":5132,"updated":"2019-07-03 12:56:23.000000000","message":"I think this message needs to specify that it failed to update the placement side of the information. As in the current form this can be misunderstood like the whole update of the service status failed.","commit_id":"3f0605c28987f46cf4a05af0140e2e5de7d5ad0a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a191794187c387afcde3139990453184c051cc0a","unresolved":false,"context_lines":[{"line_number":5129,"context_line":"                      \u0027COMPUTE_STATUS_DISABLED trait.\u0027, service.host)"},{"line_number":5130,"context_line":"            self.rpcapi.set_host_enabled(context, service.host, enabled)"},{"line_number":5131,"context_line":"        except Exception:"},{"line_number":5132,"context_line":"            LOG.exception(\u0027An error occurred while updating host enabled \u0027"},{"line_number":5133,"context_line":"                          \u0027status to \"%s\" for compute host: %s\u0027,"},{"line_number":5134,"context_line":"                          \u0027enabled\u0027 if enabled else \u0027disabled\u0027,"},{"line_number":5135,"context_line":"                          service.host)"}],"source_content_type":"text/x-python","patch_set":8,"id":"7faddb67_cf5ed544","line":5132,"in_reply_to":"9fb8cfa7_cef00195","updated":"2019-07-03 19:58:49.000000000","message":"Done: https://review.opendev.org/#/c/668986/","commit_id":"3f0605c28987f46cf4a05af0140e2e5de7d5ad0a"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"28e63e4bdb86ec83accbed89bef08f7534429647","unresolved":false,"context_lines":[{"line_number":5129,"context_line":"                      \u0027COMPUTE_STATUS_DISABLED trait.\u0027, service.host)"},{"line_number":5130,"context_line":"            self.rpcapi.set_host_enabled(context, service.host, enabled)"},{"line_number":5131,"context_line":"        except Exception:"},{"line_number":5132,"context_line":"            LOG.exception(\u0027An error occurred while updating host enabled \u0027"},{"line_number":5133,"context_line":"                          \u0027status to \"%s\" for compute host: %s\u0027,"},{"line_number":5134,"context_line":"                          \u0027enabled\u0027 if enabled else \u0027disabled\u0027,"},{"line_number":5135,"context_line":"                          service.host)"}],"source_content_type":"text/x-python","patch_set":8,"id":"9fb8cfa7_cef00195","line":5132,"in_reply_to":"9fb8cfa7_dca8bf21","updated":"2019-07-03 15:21:28.000000000","message":"Yeah good point, I can update this.","commit_id":"3f0605c28987f46cf4a05af0140e2e5de7d5ad0a"}],"nova/compute/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e2db138bc6cb96f44bfafc6e86bb51af5a7b8a59","unresolved":false,"context_lines":[{"line_number":512,"context_line":"                     \u0027provider %s in placement.\u0027, trait_name, rp_uuid)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        if new_traits is not None:"},{"line_number":515,"context_line":"            # TODO(mriedem): Using set_traits_for_provider is a bit"},{"line_number":516,"context_line":"            # heavy if we already got the provider traits and"},{"line_number":517,"context_line":"            # generation above since set_traits_for_provider uses the"},{"line_number":518,"context_line":"            # cached ProviderTree. Either call PUT /resource"},{"line_number":519,"context_line":"            # providers/{uuid}/traits directly or use the cached"},{"line_number":520,"context_line":"            # ProviderTree rather than the get_provider_traits method"},{"line_number":521,"context_line":"            # (why doesn\u0027t that method update the cached ProviderTree"},{"line_number":522,"context_line":"            # if the generation has changed out of band?). Maybe"},{"line_number":523,"context_line":"            # set_traits_for_provider can be stripped down to avoid the"},{"line_number":524,"context_line":"            # ProviderTree route (and safe_connect decorator)."},{"line_number":525,"context_line":"            self.placementclient.set_provider_traits("},{"line_number":526,"context_line":"                context, rp_uuid, new_traits, trait_info.generation)"},{"line_number":527,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_f31b6970","line":524,"range":{"start_line":515,"start_character":12,"end_line":524,"end_character":62},"updated":"2019-04-22 18:26:48.000000000","message":"This can go away.","commit_id":"051260b0ddc1488ed946d395f48becc4651002f4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8dcef00be28eccc78a4115ab7b1bc83fd3cf391f","unresolved":false,"context_lines":[{"line_number":512,"context_line":"                     \u0027provider %s in placement.\u0027, trait_name, rp_uuid)"},{"line_number":513,"context_line":""},{"line_number":514,"context_line":"        if new_traits is not None:"},{"line_number":515,"context_line":"            # TODO(mriedem): Using set_traits_for_provider is a bit"},{"line_number":516,"context_line":"            # heavy if we already got the provider traits and"},{"line_number":517,"context_line":"            # generation above since set_traits_for_provider uses the"},{"line_number":518,"context_line":"            # cached ProviderTree. Either call PUT /resource"},{"line_number":519,"context_line":"            # providers/{uuid}/traits directly or use the cached"},{"line_number":520,"context_line":"            # ProviderTree rather than the get_provider_traits method"},{"line_number":521,"context_line":"            # (why doesn\u0027t that method update the cached ProviderTree"},{"line_number":522,"context_line":"            # if the generation has changed out of band?). Maybe"},{"line_number":523,"context_line":"            # set_traits_for_provider can be stripped down to avoid the"},{"line_number":524,"context_line":"            # ProviderTree route (and safe_connect decorator)."},{"line_number":525,"context_line":"            self.placementclient.set_provider_traits("},{"line_number":526,"context_line":"                context, rp_uuid, new_traits, trait_info.generation)"},{"line_number":527,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_f6dbd4e9","line":524,"range":{"start_line":515,"start_character":12,"end_line":524,"end_character":62},"in_reply_to":"ffb9cba7_f31b6970","updated":"2019-05-08 18:38:34.000000000","message":"Done","commit_id":"051260b0ddc1488ed946d395f48becc4651002f4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e2db138bc6cb96f44bfafc6e86bb51af5a7b8a59","unresolved":false,"context_lines":[{"line_number":4922,"context_line":"            except (exception.ResourceProviderTraitRetrievalFailed,"},{"line_number":4923,"context_line":"                    exception.ResourceProviderUpdateConflict,"},{"line_number":4924,"context_line":"                    exception.ResourceProviderUpdateFailed,"},{"line_number":4925,"context_line":"                    exception.TraitCreationFailed) as e:"},{"line_number":4926,"context_line":"                LOG.warning(e.format_message())"},{"line_number":4927,"context_line":"            except Exception:"},{"line_number":4928,"context_line":"                LOG.exception(\u0027Error updating resource provider traits for %s \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_d32c259b","line":4925,"range":{"start_line":4925,"start_character":30,"end_line":4925,"end_character":49},"updated":"2019-04-22 18:26:48.000000000","message":"Should also have TraitRetrievalFailed in this list.","commit_id":"051260b0ddc1488ed946d395f48becc4651002f4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8dcef00be28eccc78a4115ab7b1bc83fd3cf391f","unresolved":false,"context_lines":[{"line_number":4922,"context_line":"            except (exception.ResourceProviderTraitRetrievalFailed,"},{"line_number":4923,"context_line":"                    exception.ResourceProviderUpdateConflict,"},{"line_number":4924,"context_line":"                    exception.ResourceProviderUpdateFailed,"},{"line_number":4925,"context_line":"                    exception.TraitCreationFailed) as e:"},{"line_number":4926,"context_line":"                LOG.warning(e.format_message())"},{"line_number":4927,"context_line":"            except Exception:"},{"line_number":4928,"context_line":"                LOG.exception(\u0027Error updating resource provider traits for %s \u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_16d9c8f1","line":4925,"range":{"start_line":4925,"start_character":30,"end_line":4925,"end_character":49},"in_reply_to":"ffb9cba7_d32c259b","updated":"2019-05-08 18:38:34.000000000","message":"Done","commit_id":"051260b0ddc1488ed946d395f48becc4651002f4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"26ad9272f99d213a7911db3c60bcca05840cbaa4","unresolved":false,"context_lines":[{"line_number":421,"context_line":"    def __init__(self, compute):"},{"line_number":422,"context_line":"        super(ComputeVirtAPI, self).__init__()"},{"line_number":423,"context_line":"        self._compute \u003d compute"},{"line_number":424,"context_line":"        self._placementclient \u003d None"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"    def _default_error_callback(self, event_name, instance):"},{"line_number":427,"context_line":"        raise exception.NovaException(_(\u0027Instance event failed\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_66e75014","line":424,"updated":"2019-06-24 21:04:01.000000000","message":"We should be able to get this from compute.reportclient if we set that before constructing this virtapi object. Then the ComputeManager/ResourceTracker/ComputeVirtAPI would all be using the same SchedulerReportClient with the same ProviderTree cache and we can use set_traits_for_provider which relies on the cache.","commit_id":"f658668c5dff7031f519a6c92866e556503e0274"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"97cc1230ea98e99800c8ff47e71ca1092e22afd1","unresolved":false,"context_lines":[{"line_number":421,"context_line":"    def __init__(self, compute):"},{"line_number":422,"context_line":"        super(ComputeVirtAPI, self).__init__()"},{"line_number":423,"context_line":"        self._compute \u003d compute"},{"line_number":424,"context_line":"        self._placementclient \u003d None"},{"line_number":425,"context_line":""},{"line_number":426,"context_line":"    def _default_error_callback(self, event_name, instance):"},{"line_number":427,"context_line":"        raise exception.NovaException(_(\u0027Instance event failed\u0027))"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_151f855b","line":424,"in_reply_to":"9fb8cfa7_66e75014","updated":"2019-06-25 20:36:12.000000000","message":"Done","commit_id":"f658668c5dff7031f519a6c92866e556503e0274"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eadc24a35111aec71920bf51918d3dbc73db11a7","unresolved":false,"context_lines":[{"line_number":4964,"context_line":"        \"\"\"todo docstring\"\"\""},{"line_number":4965,"context_line":"        # Get the compute node(s) on this host. Remember that ironic can be"},{"line_number":4966,"context_line":"        # managing more than one compute node."},{"line_number":4967,"context_line":"        nodes \u003d objects.ComputeNodeList.get_all_by_host(context, self.host)"},{"line_number":4968,"context_line":"        # For each node, we want to set (or remove) a disabled trait on the"},{"line_number":4969,"context_line":"        # related resource provider in placement so the scheduler filters it"},{"line_number":4970,"context_line":"        # based on enabled status."}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_911f1c07","line":4967,"updated":"2019-06-24 21:54:39.000000000","message":"Can we just use self.rt.compute_nodes.values() here? And then raise ComputeHostNotFound if there are no nodes in the RT for whatever reason.","commit_id":"5800435cc3690f3764b6489db841fc58682be361"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0e0bb7f3a0e4a9a1038174b3dd03a98ae46f2db2","unresolved":false,"context_lines":[{"line_number":4964,"context_line":"        \"\"\"todo docstring\"\"\""},{"line_number":4965,"context_line":"        # Get the compute node(s) on this host. Remember that ironic can be"},{"line_number":4966,"context_line":"        # managing more than one compute node."},{"line_number":4967,"context_line":"        nodes \u003d objects.ComputeNodeList.get_all_by_host(context, self.host)"},{"line_number":4968,"context_line":"        # For each node, we want to set (or remove) a disabled trait on the"},{"line_number":4969,"context_line":"        # related resource provider in placement so the scheduler filters it"},{"line_number":4970,"context_line":"        # based on enabled status."}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_958e1577","line":4967,"in_reply_to":"9fb8cfa7_911f1c07","updated":"2019-06-25 20:41:05.000000000","message":"Done","commit_id":"5800435cc3690f3764b6489db841fc58682be361"}],"nova/scheduler/client/report.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e2db138bc6cb96f44bfafc6e86bb51af5a7b8a59","unresolved":false,"context_lines":[{"line_number":1073,"context_line":"        :returns: Response object if the status code was 200, else the method"},{"line_number":1074,"context_line":"                  raises an error."},{"line_number":1075,"context_line":"        \"\"\""},{"line_number":1076,"context_line":"        self._ensure_traits(context, traits)"},{"line_number":1077,"context_line":""},{"line_number":1078,"context_line":"        payload \u003d {"},{"line_number":1079,"context_line":"            \u0027resource_provider_generation\u0027: generation,"}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_13471d4e","line":1076,"updated":"2019-04-22 18:26:48.000000000","message":"If we\u0027re using a standard trait we shouldn\u0027t need this.","commit_id":"051260b0ddc1488ed946d395f48becc4651002f4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"26ad9272f99d213a7911db3c60bcca05840cbaa4","unresolved":false,"context_lines":[{"line_number":1053,"context_line":"            rp_uuid, json[\u0027traits\u0027],"},{"line_number":1054,"context_line":"            generation\u003djson[\u0027resource_provider_generation\u0027])"},{"line_number":1055,"context_line":""},{"line_number":1056,"context_line":"    def set_provider_traits(self, context, rp_uuid, traits, generation):"},{"line_number":1057,"context_line":"        \"\"\"Replace a provider\u0027s traits with those specified."},{"line_number":1058,"context_line":""},{"line_number":1059,"context_line":"        The provider must exist - this method does not attempt to create it."}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_e68a6019","line":1056,"updated":"2019-06-24 21:04:01.000000000","message":"We can avoid this new method if the ComputeVirtAPI re-uses the ComputeManager.reportclient (which is coming from ResourceTracker).","commit_id":"f658668c5dff7031f519a6c92866e556503e0274"}],"nova/scheduler/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"24d8ab210513d65b359e730b29898ad85254be63","unresolved":false,"context_lines":[{"line_number":59,"context_line":"        self.placement_client \u003d report.SchedulerReportClient()"},{"line_number":60,"context_line":"        # TODO(mriedem): Remove this when COMPUTE_STATUS_DISABLED is a standard"},{"line_number":61,"context_line":"        # trait and we depend on the minimum version of os-traits for it."},{"line_number":62,"context_line":"        self.placement_client.put("},{"line_number":63,"context_line":"            \u0027/traits/CUSTOM_COMPUTE_STATUS_DISABLED\u0027, {}, version\u003d\u00271.6\u0027)"},{"line_number":64,"context_line":"        if not scheduler_driver:"},{"line_number":65,"context_line":"            scheduler_driver \u003d CONF.scheduler.driver"}],"source_content_type":"text/x-python","patch_set":6,"id":"9fb8cfa7_70e9efe0","line":62,"updated":"2019-06-28 19:39:43.000000000","message":"This makes a bunch of non-integration tests fail since they aren\u0027t using the fixture...really just need to get that standard trait change released.","commit_id":"7ec92b8b2d6277d4c58c99e244aa191692ec48b8"}],"nova/scheduler/request_filter.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"7ea62d24919b73572eac3319ebb6510edf0799b4","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    # don\u0027t persist the change. There might be a better way to do this with"},{"line_number":102,"context_line":"    # unnumbered request groups without any resources."},{"line_number":103,"context_line":"    request_spec.flavor.extra_specs["},{"line_number":104,"context_line":"        \u0027trait:CUSTOM_COMPUTE_STATUS_DISABLED\u0027] \u003d \u0027forbidden\u0027"},{"line_number":105,"context_line":"    request_spec.obj_reset_changes(fields\u003d[\u0027flavor\u0027], recursive\u003dTrue)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_93d0ed52","line":104,"range":{"start_line":104,"start_character":9,"end_line":104,"end_character":45},"updated":"2019-04-22 18:32:22.000000000","message":"so if people dislike this trate we could take 2 other approches.\n\nfirst we could have a standard \n\nCOMPUTE_HOST tratit that is placed on the root RP of all compute nodes.\n\nthat will allow us to exclode non compute node RPs in the futre. e.g. cinder storage host, top of rack switch(bandwith is there resrocue) \n\n\nso instead of using a forbiden trait we woudl use a retuired trait of \"COMPUTE_HOST\" and if a service is diable nova would remove that trait form the RP.  when the service is restarted it will jsut add it again.\n\n\n\nthe other approch would be to not use trait and instead use a \nplacement aggrate.    we can use a uuid5 to define a fixed aggregate uuid and all enabled compute services can be set as a member of that aggreate. the we just do a member_of placement query to ensure we only get back enabled hosts in the allocation candiates.\n\n\nwhen a compute service is disabled nova can simply remove the compe node form the aggrate.","commit_id":"051260b0ddc1488ed946d395f48becc4651002f4"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"09341f12bee0dfe9ab1ad0942e7ad2e1f0900611","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    # don\u0027t persist the change. There might be a better way to do this with"},{"line_number":102,"context_line":"    # unnumbered request groups without any resources."},{"line_number":103,"context_line":"    request_spec.flavor.extra_specs["},{"line_number":104,"context_line":"        \u0027trait:CUSTOM_COMPUTE_STATUS_DISABLED\u0027] \u003d \u0027forbidden\u0027"},{"line_number":105,"context_line":"    request_spec.obj_reset_changes(fields\u003d[\u0027flavor\u0027], recursive\u003dTrue)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_b3897127","line":104,"range":{"start_line":104,"start_character":9,"end_line":104,"end_character":45},"in_reply_to":"ffb9cba7_93d0ed52","updated":"2019-04-22 18:41:13.000000000","message":"\u003e we can use a uuid5 to define a fixed aggregate uuid and all enabled compute services can be set as a member of that aggreate. the we just do a member_of placement query to ensure we only get back enabled hosts in the allocation candiates. when a compute service is disabled nova can simply remove the compe node form the aggrate.\n\nIf you\u0027ve got 10K compute nodes in your deployment, throwing 90% of them into an aggregate is probably going to not scale very well. If we went the aggregates route, as mentioned in the commit message comment, I\u0027d go the other way and throw disabled computes into an aggregate and then do negative member_of filtering on that one.","commit_id":"051260b0ddc1488ed946d395f48becc4651002f4"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cbc58d284cd6022171f2b1e334724772ae0661d0","unresolved":false,"context_lines":[{"line_number":101,"context_line":"    # don\u0027t persist the change. There might be a better way to do this with"},{"line_number":102,"context_line":"    # unnumbered request groups without any resources."},{"line_number":103,"context_line":"    request_spec.flavor.extra_specs["},{"line_number":104,"context_line":"        \u0027trait:CUSTOM_COMPUTE_STATUS_DISABLED\u0027] \u003d \u0027forbidden\u0027"},{"line_number":105,"context_line":"    request_spec.obj_reset_changes(fields\u003d[\u0027flavor\u0027], recursive\u003dTrue)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"ffb9cba7_330d813e","line":104,"range":{"start_line":104,"start_character":9,"end_line":104,"end_character":45},"in_reply_to":"ffb9cba7_b3897127","updated":"2019-04-22 19:03:53.000000000","message":"yes that would also work.\n\ni had mistakenly assumed negitive member_of was still pending on the placment side. whic is why i phrased it that way.\n\nbut based on the api ref it is.\n\nhttps://developer.openstack.org/api-ref/placement/?expanded\u003dlist-allocation-candidates-detail#list-allocation-candidates\n\nfrom a db point of the aggrates table it basicaly 2 uuid fields both of which are index so doing a not member  or member query is relitivly efficent if you ignore the fact we are comparing uuids as 36 charater stings.","commit_id":"051260b0ddc1488ed946d395f48becc4651002f4"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"fac21e760e2225f3502e62bbe1445d2675e6a23b","unresolved":false,"context_lines":[{"line_number":100,"context_line":"    # unnumbered request groups without any resources."},{"line_number":101,"context_line":"    request_spec.flavor.extra_specs["},{"line_number":102,"context_line":"        \u0027trait:CUSTOM_COMPUTE_STATUS_DISABLED\u0027] \u003d \u0027forbidden\u0027"},{"line_number":103,"context_line":"    request_spec.obj_reset_changes(fields\u003d[\u0027flavor\u0027], recursive\u003dTrue)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"ALL_REQUEST_FILTERS \u003d ["}],"source_content_type":"text/x-python","patch_set":2,"id":"ffb9cba7_b3f7a359","line":103,"updated":"2019-04-30 15:20:31.000000000","message":"This doesn\u0027t seem like too bad of a workaround for that other known issue about using RequestGroup directly. It uses a standard way to request (or exclude, in this case) a trait in the flavor, and avoids persisting it in case the policy changes in the future (i.e. the operator changes the scheduler_query_placement_for_enabled_computes flag).\n\nAs such, I\u0027ve done the same thing in my image type filter patch.","commit_id":"6c1c1c5a8c0ef169daddfdba1c18c2bed4b1cd25"}],"nova/test.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"26ad9272f99d213a7911db3c60bcca05840cbaa4","unresolved":false,"context_lines":[{"line_number":595,"context_line":"    def test_api_methods(self):"},{"line_number":596,"context_line":"        self.assertIsNotNone(self.cover_api)"},{"line_number":597,"context_line":""},{"line_number":598,"context_line":"        def member_filter(member):"},{"line_number":599,"context_line":"            return (inspect.isfunction(member) and"},{"line_number":600,"context_line":"                    not member.__name__.startswith(\u0027_\u0027))"},{"line_number":601,"context_line":"        members \u003d inspect.getmembers(self.cover_api, member_filter)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_2674f835","line":598,"updated":"2019-06-24 21:04:01.000000000","message":"This can likely go away if we remove ComputeVirtAPI._placementclient.","commit_id":"f658668c5dff7031f519a6c92866e556503e0274"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"97cc1230ea98e99800c8ff47e71ca1092e22afd1","unresolved":false,"context_lines":[{"line_number":595,"context_line":"    def test_api_methods(self):"},{"line_number":596,"context_line":"        self.assertIsNotNone(self.cover_api)"},{"line_number":597,"context_line":""},{"line_number":598,"context_line":"        def member_filter(member):"},{"line_number":599,"context_line":"            return (inspect.isfunction(member) and"},{"line_number":600,"context_line":"                    not member.__name__.startswith(\u0027_\u0027))"},{"line_number":601,"context_line":"        members \u003d inspect.getmembers(self.cover_api, member_filter)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_554e5d6f","line":598,"in_reply_to":"9fb8cfa7_2674f835","updated":"2019-06-25 20:36:12.000000000","message":"Done","commit_id":"f658668c5dff7031f519a6c92866e556503e0274"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8d0b2c72a6ee250299f37b547bbc1cfb717ad222","unresolved":false,"context_lines":[{"line_number":461,"context_line":"        # ProviderTree cache defeat the purpose of creating a new"},{"line_number":462,"context_line":"        # ResourceTracker? Could we avoid creating a new RT and just call"},{"line_number":463,"context_line":"        # compute.manager.reset() which will flush the cache?"},{"line_number":464,"context_line":"        compute.manager.rt \u003d resource_tracker.ResourceTracker("},{"line_number":465,"context_line":"            host, driver, reportclient\u003dcompute.reportclient)"},{"line_number":466,"context_line":"        compute.start()"},{"line_number":467,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"9fb8cfa7_1e0f7488","line":464,"updated":"2019-06-28 00:30:54.000000000","message":"This was the cause of the functional test failure I think, and we can remove it anyway b/c of gibi\u0027s recent changes.","commit_id":"8df89ccfd6b418a57c78d401d2c156d10acef569"}],"nova/tests/functional/fixtures.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"8d0b2c72a6ee250299f37b547bbc1cfb717ad222","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            self._fake_delete))"},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"        self.api \u003d PlacementApiClient(self)"},{"line_number":93,"context_line":"        # TODO(mriedem): Remove this when COMPUTE_STATUS_DISABLED is a standard"},{"line_number":94,"context_line":"        # trait and we depend on the minimum version of os-traits for it."},{"line_number":95,"context_line":"        self.api.put(\u0027/traits/CUSTOM_COMPUTE_STATUS_DISABLED\u0027, body\u003d{},"},{"line_number":96,"context_line":"                     version\u003d\u00271.6\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"9fb8cfa7_3e2d98fd","line":93,"updated":"2019-06-28 00:30:54.000000000","message":"Move this to the scheduler so tempest runs will work with the custom trait until we can require the min version of os-traits with the standard trait.","commit_id":"8df89ccfd6b418a57c78d401d2c156d10acef569"}],"nova/tests/functional/wsgi/test_services.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"26ad9272f99d213a7911db3c60bcca05840cbaa4","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        # Now disable the compute service via the API."},{"line_number":197,"context_line":"        # TODO(mriedem): This is using 2.latest but we also want to test 2.1."},{"line_number":198,"context_line":"        # TODO(mriedem): Also need to test the forced-down case."},{"line_number":199,"context_line":"        self.admin_api.put_service(service[\u0027id\u0027], {\u0027status\u0027: \u0027disabled\u0027})"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"        # The update to placement should be synchronous so check the provider"}],"source_content_type":"text/x-python","patch_set":3,"id":"9fb8cfa7_c69abc60","line":198,"range":{"start_line":198,"start_character":47,"end_line":198,"end_character":58},"updated":"2019-06-24 21:04:01.000000000","message":"We can just make sure the service is forced-down but the trait isn\u0027t on the provider, i.e. test downing the compute, setting disabled, then restart the service and the trait should get synced.","commit_id":"f658668c5dff7031f519a6c92866e556503e0274"}],"nova/tests/unit/compute/test_virtapi.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"eadc24a35111aec71920bf51918d3dbc73db11a7","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            self.virtapi.update_provider_enabled(*args, **kwargs)"},{"line_number":71,"context_line":"            return"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        if method in (\u0027aggregate_metadata_add\u0027, \u0027aggregate_metadata_delete\u0027,"},{"line_number":74,"context_line":"                      \u0027security_group_rule_get_by_security_group\u0027):"},{"line_number":75,"context_line":"            # NOTE(danms): FakeVirtAPI will convert the first argument to"},{"line_number":76,"context_line":"            # argument[\u0027id\u0027], so expect that in the actual db call"},{"line_number":77,"context_line":"            e_args \u003d tuple([args[0][\u0027id\u0027]] + list(args[1:]))"},{"line_number":78,"context_line":"        elif method \u003d\u003d \u0027security_group_get_by_instance\u0027:"},{"line_number":79,"context_line":"            e_args \u003d tuple([args[0][\u0027uuid\u0027]] + list(args[1:]))"},{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            e_args \u003d args"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        with mock.patch.object(db, method,"},{"line_number":84,"context_line":"                               return_value\u003d\u0027it worked\u0027) as mock_call:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_b10b40d3","line":81,"range":{"start_line":73,"start_character":8,"end_line":81,"end_character":25},"updated":"2019-06-24 21:54:39.000000000","message":"This could all be removed (separately).","commit_id":"5800435cc3690f3764b6489db841fc58682be361"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0e0bb7f3a0e4a9a1038174b3dd03a98ae46f2db2","unresolved":false,"context_lines":[{"line_number":70,"context_line":"            self.virtapi.update_provider_enabled(*args, **kwargs)"},{"line_number":71,"context_line":"            return"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"        if method in (\u0027aggregate_metadata_add\u0027, \u0027aggregate_metadata_delete\u0027,"},{"line_number":74,"context_line":"                      \u0027security_group_rule_get_by_security_group\u0027):"},{"line_number":75,"context_line":"            # NOTE(danms): FakeVirtAPI will convert the first argument to"},{"line_number":76,"context_line":"            # argument[\u0027id\u0027], so expect that in the actual db call"},{"line_number":77,"context_line":"            e_args \u003d tuple([args[0][\u0027id\u0027]] + list(args[1:]))"},{"line_number":78,"context_line":"        elif method \u003d\u003d \u0027security_group_get_by_instance\u0027:"},{"line_number":79,"context_line":"            e_args \u003d tuple([args[0][\u0027uuid\u0027]] + list(args[1:]))"},{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            e_args \u003d args"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"        with mock.patch.object(db, method,"},{"line_number":84,"context_line":"                               return_value\u003d\u0027it worked\u0027) as mock_call:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_15f0e5fc","line":81,"range":{"start_line":73,"start_character":8,"end_line":81,"end_character":25},"in_reply_to":"9fb8cfa7_b10b40d3","updated":"2019-06-25 20:41:05.000000000","message":"Done: https://review.opendev.org/#/c/667419/","commit_id":"5800435cc3690f3764b6489db841fc58682be361"}]}
