)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f436d46304e208741879c842c76a1416ff350e56","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Enable request filter isolate_aggregates"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"* Added a new config option \u0027enable_isolated_aggregates_filtering\u0027"},{"line_number":10,"context_line":"  which by default will be disabled."},{"line_number":11,"context_line":"* Enabled request filter \u0027isolate_aggregates\u0027 before calling placement"},{"line_number":12,"context_line":"  for getting allocation_candidates."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"7faddb67_009d25ba","line":9,"range":{"start_line":9,"start_character":29,"end_line":9,"end_character":65},"updated":"2019-08-14 12:04:14.000000000","message":"enable_isolated_aggregate_filtering is the current name of the config","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"43068c3c06a7d535efc59e646bfc5459175603ae","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Enable request filter isolate_aggregates"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"* Added a new config option \u0027enable_isolated_aggregates_filtering\u0027"},{"line_number":10,"context_line":"  which by default will be disabled."},{"line_number":11,"context_line":"* Enabled request filter \u0027isolate_aggregates\u0027 before calling placement"},{"line_number":12,"context_line":"  for getting allocation_candidates."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"7faddb67_00d2f75c","line":9,"range":{"start_line":9,"start_character":29,"end_line":9,"end_character":65},"in_reply_to":"7faddb67_009d25ba","updated":"2019-08-15 00:26:57.000000000","message":"Done","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"}],"doc/source/admin/configuration/schedulers.rst":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"806b6a02d408a1e36fce3c08f64de62424306d01","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":".. _compute-scheduler-filters:"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Prefiltering"},{"line_number":53,"context_line":"~~~~~~~~~~~~"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"As of the Rocky release, the scheduling process includes a prefilter"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7faddb67_9a33a1ab","line":52,"updated":"2019-07-31 18:22:14.000000000","message":"There should be a section in here about the new pre-filter, which I guess could just link to reference/forbidden-aggregates.rst.","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"4653cc9ef28981a93baeefe7e1ae2f5256135c0b","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":".. _compute-scheduler-filters:"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"Prefiltering"},{"line_number":53,"context_line":"~~~~~~~~~~~~"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"As of the Rocky release, the scheduling process includes a prefilter"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7faddb67_bba63bab","line":52,"in_reply_to":"7faddb67_9a33a1ab","updated":"2019-08-07 13:07:49.000000000","message":"Done, added \u0027Isolate Aggregates\u0027 section.","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"806b6a02d408a1e36fce3c08f64de62424306d01","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"   # Separator used between the namespace and keys (string)."},{"line_number":239,"context_line":"   aggregate_image_properties_isolation_separator \u003d ."},{"line_number":240,"context_line":""},{"line_number":241,"context_line":".. _AggregateInstanceExtraSpecsFilter:"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"AggregateInstanceExtraSpecsFilter"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7faddb67_bac53d5e","line":240,"updated":"2019-07-31 18:22:14.000000000","message":"Maybe we should take this opportunity to add a note about the bug and link to the forbidden-aggregates docs.","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"4653cc9ef28981a93baeefe7e1ae2f5256135c0b","unresolved":false,"context_lines":[{"line_number":237,"context_line":""},{"line_number":238,"context_line":"   # Separator used between the namespace and keys (string)."},{"line_number":239,"context_line":"   aggregate_image_properties_isolation_separator \u003d ."},{"line_number":240,"context_line":""},{"line_number":241,"context_line":".. _AggregateInstanceExtraSpecsFilter:"},{"line_number":242,"context_line":""},{"line_number":243,"context_line":"AggregateInstanceExtraSpecsFilter"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7faddb67_3bb48bd1","line":240,"in_reply_to":"7faddb67_bac53d5e","updated":"2019-08-07 13:07:49.000000000","message":"Done","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e3f9649e1590d9b0f041841e446893e8644b9ea3","unresolved":false,"context_lines":[{"line_number":103,"context_line":"------------------"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Starting in the Train release, there is an optional placement pre-request filter"},{"line_number":106,"context_line":"`isolate-aggregate"},{"line_number":107,"context_line":"\u003chttps://specs.openstack.org/openstack/nova-specs/specs/train/approved/placement-req-filter-forbidden-aggregates.html\u003e`_"},{"line_number":108,"context_line":"which will get the required traits set in both flavor and image from"},{"line_number":109,"context_line":"request_spec object and compare it with the required traits set in the"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7faddb67_97b9c8ed","line":106,"range":{"start_line":106,"start_character":1,"end_line":106,"end_character":18},"updated":"2019-08-07 22:33:38.000000000","message":"isolate-aggregates\n\nbut\n\nwhy doesn\u0027t this just point to the new doc instead of the spec?\n\n :doc:`reference/isolate-aggregates`","commit_id":"78d8484420e57d6dab678ddfd1cb2b99c978a72d"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"35a9f964e6226a9de4b0ed782914a83ef8235efc","unresolved":false,"context_lines":[{"line_number":103,"context_line":"------------------"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Starting in the Train release, there is an optional placement pre-request filter"},{"line_number":106,"context_line":"`isolate-aggregate"},{"line_number":107,"context_line":"\u003chttps://specs.openstack.org/openstack/nova-specs/specs/train/approved/placement-req-filter-forbidden-aggregates.html\u003e`_"},{"line_number":108,"context_line":"which will get the required traits set in both flavor and image from"},{"line_number":109,"context_line":"request_spec object and compare it with the required traits set in the"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7faddb67_4a0dda33","line":106,"range":{"start_line":106,"start_character":1,"end_line":106,"end_character":18},"in_reply_to":"7faddb67_97b9c8ed","updated":"2019-08-08 12:38:28.000000000","message":"Done","commit_id":"78d8484420e57d6dab678ddfd1cb2b99c978a72d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e3f9649e1590d9b0f041841e446893e8644b9ea3","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":"This filter has limitation as described in `LP_bug"},{"line_number":254,"context_line":"\u003chttps://bugs.launchpad.net/nova/+bug/1677217\u003e`_"},{"line_number":255,"context_line":"which is addressed in placement `isolate_aggregates"},{"line_number":256,"context_line":"\u003chttps://docs.openstack.org/nova/latest/reference/isolate-aggregates.html\u003e`_"},{"line_number":257,"context_line":"request filter."},{"line_number":258,"context_line":""},{"line_number":259,"context_line":".. _AggregateInstanceExtraSpecsFilter:"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7faddb67_578110fb","line":256,"range":{"start_line":255,"start_character":32,"end_line":256,"end_character":76},"updated":"2019-08-07 22:33:38.000000000","message":"Use the :doc: role for this\n\n :doc:`reference/isolate-aggregates`","commit_id":"78d8484420e57d6dab678ddfd1cb2b99c978a72d"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"35a9f964e6226a9de4b0ed782914a83ef8235efc","unresolved":false,"context_lines":[{"line_number":252,"context_line":""},{"line_number":253,"context_line":"This filter has limitation as described in `LP_bug"},{"line_number":254,"context_line":"\u003chttps://bugs.launchpad.net/nova/+bug/1677217\u003e`_"},{"line_number":255,"context_line":"which is addressed in placement `isolate_aggregates"},{"line_number":256,"context_line":"\u003chttps://docs.openstack.org/nova/latest/reference/isolate-aggregates.html\u003e`_"},{"line_number":257,"context_line":"request filter."},{"line_number":258,"context_line":""},{"line_number":259,"context_line":".. _AggregateInstanceExtraSpecsFilter:"}],"source_content_type":"text/x-rst","patch_set":12,"id":"7faddb67_ea19267a","line":256,"range":{"start_line":255,"start_character":32,"end_line":256,"end_character":76},"in_reply_to":"7faddb67_578110fb","updated":"2019-08-08 12:38:28.000000000","message":"Done","commit_id":"78d8484420e57d6dab678ddfd1cb2b99c978a72d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d1b4cc714903166f10dd17c48b3cf44b260a2e8d","unresolved":false,"context_lines":[{"line_number":103,"context_line":"------------------"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"Starting in the Train release, there is an optional placement pre-request filter"},{"line_number":106,"context_line":":doc:`isolate-aggregates \u003c/reference/isolate-aggregates\u003e`."},{"line_number":107,"context_line":"which will get the required traits set in both flavor and image from"},{"line_number":108,"context_line":"request_spec object and compare it with the required traits set in the"},{"line_number":109,"context_line":"aggregate metadata. If any of the traits are not matching with the aggregate"}],"source_content_type":"text/x-rst","patch_set":13,"id":"7faddb67_0a4a82ab","line":106,"range":{"start_line":106,"start_character":6,"end_line":106,"end_character":13},"updated":"2019-08-08 13:04:15.000000000","message":"This is fine, but note that you don\u0027t have to give your own title. If you just say :doc:`/foo/bar` sphinx will pick up the title from the document itself.","commit_id":"018fe6dfef0851f259b0b1cad40d5a956aeb4cd3"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"d1b4cc714903166f10dd17c48b3cf44b260a2e8d","unresolved":false,"context_lines":[{"line_number":107,"context_line":"which will get the required traits set in both flavor and image from"},{"line_number":108,"context_line":"request_spec object and compare it with the required traits set in the"},{"line_number":109,"context_line":"aggregate metadata. If any of the traits are not matching with the aggregate"},{"line_number":110,"context_line":"metadata, it will include that aggregate as isolated aggregate in the"},{"line_number":111,"context_line":"member_of query parameter of GET /allocation_candidates API."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"7faddb67_aa032e76","line":110,"range":{"start_line":110,"start_character":44,"end_line":110,"end_character":52},"updated":"2019-08-08 13:04:15.000000000","message":"This one could actually say \"a forbidden\" since we\u0027re now talking about a placement api-ism. It could also link to the spec for that feature, I suppose. But this is okay.","commit_id":"018fe6dfef0851f259b0b1cad40d5a956aeb4cd3"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"15c343ee2edb6f7c9d2323e4657c74770075944a","unresolved":false,"context_lines":[{"line_number":108,"context_line":"request_spec object and compare it with the required traits set in the"},{"line_number":109,"context_line":"aggregate metadata. If any of the traits are not matching with the aggregate"},{"line_number":110,"context_line":"metadata, it will include that aggregate as a `forbidden aggregate`_ in the"},{"line_number":111,"context_line":"member_of query parameter of GET /allocation_candidates API."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":".. _forbidden aggregate: https://docs.openstack.org/placement/latest/specs/train/implemented/2005297-negative-aggregate-membership.html"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"7faddb67_bbd9fff4","line":111,"range":{"start_line":111,"start_character":29,"end_line":111,"end_character":55},"updated":"2019-08-29 16:32:39.000000000","message":"``GET /allocation_candidates``","commit_id":"f48422247af3a98b05a3d61fe6b4a1ae2656f2e1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"15c343ee2edb6f7c9d2323e4657c74770075944a","unresolved":false,"context_lines":[{"line_number":108,"context_line":"request_spec object and compare it with the required traits set in the"},{"line_number":109,"context_line":"aggregate metadata. If any of the traits are not matching with the aggregate"},{"line_number":110,"context_line":"metadata, it will include that aggregate as a `forbidden aggregate`_ in the"},{"line_number":111,"context_line":"member_of query parameter of GET /allocation_candidates API."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":".. _forbidden aggregate: https://docs.openstack.org/placement/latest/specs/train/implemented/2005297-negative-aggregate-membership.html"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":15,"id":"7faddb67_1bd373d7","line":111,"range":{"start_line":111,"start_character":0,"end_line":111,"end_character":9},"updated":"2019-08-29 16:32:39.000000000","message":"``member_of``","commit_id":"f48422247af3a98b05a3d61fe6b4a1ae2656f2e1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"15c343ee2edb6f7c9d2323e4657c74770075944a","unresolved":false,"context_lines":[{"line_number":250,"context_line":"   # Separator used between the namespace and keys (string)."},{"line_number":251,"context_line":"   aggregate_image_properties_isolation_separator \u003d ."},{"line_number":252,"context_line":""},{"line_number":253,"context_line":"This filter has limitation as described in `LP_bug"},{"line_number":254,"context_line":"\u003chttps://bugs.launchpad.net/nova/+bug/1677217\u003e`_"},{"line_number":255,"context_line":"which is addressed in placement"},{"line_number":256,"context_line":":doc:`/reference/isolate-aggregates`"}],"source_content_type":"text/x-rst","patch_set":15,"id":"7faddb67_5b97abec","line":253,"range":{"start_line":253,"start_character":16,"end_line":253,"end_character":26},"updated":"2019-08-29 16:32:39.000000000","message":"can you call out the limitations here, perhaps as a NOTE?","commit_id":"f48422247af3a98b05a3d61fe6b4a1ae2656f2e1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"15c343ee2edb6f7c9d2323e4657c74770075944a","unresolved":false,"context_lines":[{"line_number":108,"context_line":"request_spec object and compare it with the required traits set in the"},{"line_number":109,"context_line":"aggregate metadata. If any of the traits are not matching with the aggregate"},{"line_number":110,"context_line":"metadata, it will include that aggregate as a `forbidden aggregate`_ in the"},{"line_number":111,"context_line":"member_of query parameter of GET /allocation_candidates API."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":".. _forbidden aggregate: https://docs.openstack.org/placement/latest/specs/train/implemented/2005297-negative-aggregate-membership.html"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"7faddb67_db2862ef","line":111,"range":{"start_line":111,"start_character":29,"end_line":111,"end_character":55},"updated":"2019-08-29 16:32:39.000000000","message":"``GET /allocation_candidates``","commit_id":"f25be6f8503aad0d1588669eb9076a078db4faca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"15c343ee2edb6f7c9d2323e4657c74770075944a","unresolved":false,"context_lines":[{"line_number":108,"context_line":"request_spec object and compare it with the required traits set in the"},{"line_number":109,"context_line":"aggregate metadata. If any of the traits are not matching with the aggregate"},{"line_number":110,"context_line":"metadata, it will include that aggregate as a `forbidden aggregate`_ in the"},{"line_number":111,"context_line":"member_of query parameter of GET /allocation_candidates API."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":".. _forbidden aggregate: https://docs.openstack.org/placement/latest/specs/train/implemented/2005297-negative-aggregate-membership.html"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"7faddb67_1bf11a96","line":111,"range":{"start_line":111,"start_character":0,"end_line":111,"end_character":9},"updated":"2019-08-29 16:32:39.000000000","message":"``member_of``","commit_id":"f25be6f8503aad0d1588669eb9076a078db4faca"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"14b401511658922d8dbc9e1aa5cd62a1430d577d","unresolved":false,"context_lines":[{"line_number":108,"context_line":"request_spec object and compare it with the required traits set in the"},{"line_number":109,"context_line":"aggregate metadata. If any of the traits are not matching with the aggregate"},{"line_number":110,"context_line":"metadata, it will include that aggregate as a `forbidden aggregate`_ in the"},{"line_number":111,"context_line":"member_of query parameter of GET /allocation_candidates API."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":".. _forbidden aggregate: https://docs.openstack.org/placement/latest/specs/train/implemented/2005297-negative-aggregate-membership.html"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"7faddb67_36309de9","line":111,"range":{"start_line":111,"start_character":0,"end_line":111,"end_character":9},"in_reply_to":"7faddb67_1bf11a96","updated":"2019-08-30 11:08:12.000000000","message":"Done","commit_id":"f25be6f8503aad0d1588669eb9076a078db4faca"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"14b401511658922d8dbc9e1aa5cd62a1430d577d","unresolved":false,"context_lines":[{"line_number":108,"context_line":"request_spec object and compare it with the required traits set in the"},{"line_number":109,"context_line":"aggregate metadata. If any of the traits are not matching with the aggregate"},{"line_number":110,"context_line":"metadata, it will include that aggregate as a `forbidden aggregate`_ in the"},{"line_number":111,"context_line":"member_of query parameter of GET /allocation_candidates API."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":".. _forbidden aggregate: https://docs.openstack.org/placement/latest/specs/train/implemented/2005297-negative-aggregate-membership.html"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"7faddb67_963711e4","line":111,"range":{"start_line":111,"start_character":29,"end_line":111,"end_character":55},"in_reply_to":"7faddb67_db2862ef","updated":"2019-08-30 11:08:12.000000000","message":"Done","commit_id":"f25be6f8503aad0d1588669eb9076a078db4faca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"15c343ee2edb6f7c9d2323e4657c74770075944a","unresolved":false,"context_lines":[{"line_number":276,"context_line":"   # Separator used between the namespace and keys (string)."},{"line_number":277,"context_line":"   aggregate_image_properties_isolation_separator \u003d ."},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"This filter has limitation as described in `LP_bug"},{"line_number":280,"context_line":"\u003chttps://bugs.launchpad.net/nova/+bug/1677217\u003e`_"},{"line_number":281,"context_line":"which is addressed in placement"},{"line_number":282,"context_line":":doc:`/reference/isolate-aggregates`"}],"source_content_type":"text/x-rst","patch_set":20,"id":"7faddb67_bb356647","line":279,"range":{"start_line":279,"start_character":16,"end_line":279,"end_character":26},"updated":"2019-08-29 16:32:39.000000000","message":"limitations","commit_id":"f25be6f8503aad0d1588669eb9076a078db4faca"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"14b401511658922d8dbc9e1aa5cd62a1430d577d","unresolved":false,"context_lines":[{"line_number":276,"context_line":"   # Separator used between the namespace and keys (string)."},{"line_number":277,"context_line":"   aggregate_image_properties_isolation_separator \u003d ."},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"This filter has limitation as described in `LP_bug"},{"line_number":280,"context_line":"\u003chttps://bugs.launchpad.net/nova/+bug/1677217\u003e`_"},{"line_number":281,"context_line":"which is addressed in placement"},{"line_number":282,"context_line":":doc:`/reference/isolate-aggregates`"}],"source_content_type":"text/x-rst","patch_set":20,"id":"7faddb67_562d198d","line":279,"range":{"start_line":279,"start_character":16,"end_line":279,"end_character":26},"in_reply_to":"7faddb67_bb356647","updated":"2019-08-30 11:08:12.000000000","message":"Done","commit_id":"f25be6f8503aad0d1588669eb9076a078db4faca"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"15c343ee2edb6f7c9d2323e4657c74770075944a","unresolved":false,"context_lines":[{"line_number":278,"context_line":""},{"line_number":279,"context_line":"This filter has limitation as described in `LP_bug"},{"line_number":280,"context_line":"\u003chttps://bugs.launchpad.net/nova/+bug/1677217\u003e`_"},{"line_number":281,"context_line":"which is addressed in placement"},{"line_number":282,"context_line":":doc:`/reference/isolate-aggregates`"},{"line_number":283,"context_line":"request filter."},{"line_number":284,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"7faddb67_5b3c722f","line":281,"range":{"start_line":281,"start_character":6,"end_line":281,"end_character":8},"updated":"2019-08-29 16:32:39.000000000","message":"are","commit_id":"f25be6f8503aad0d1588669eb9076a078db4faca"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"14b401511658922d8dbc9e1aa5cd62a1430d577d","unresolved":false,"context_lines":[{"line_number":278,"context_line":""},{"line_number":279,"context_line":"This filter has limitation as described in `LP_bug"},{"line_number":280,"context_line":"\u003chttps://bugs.launchpad.net/nova/+bug/1677217\u003e`_"},{"line_number":281,"context_line":"which is addressed in placement"},{"line_number":282,"context_line":":doc:`/reference/isolate-aggregates`"},{"line_number":283,"context_line":"request filter."},{"line_number":284,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"7faddb67_f64be55b","line":281,"range":{"start_line":281,"start_character":6,"end_line":281,"end_character":8},"in_reply_to":"7faddb67_5b3c722f","updated":"2019-08-30 11:08:12.000000000","message":"Done","commit_id":"f25be6f8503aad0d1588669eb9076a078db4faca"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"86cb910227297962faf822cb274945a02a937f3a","unresolved":false,"context_lines":[{"line_number":108,"context_line":"request_spec object and compare it with the required traits set in the"},{"line_number":109,"context_line":"aggregate metadata. If any of the traits are not matching with the aggregate"},{"line_number":110,"context_line":"metadata, it will include that aggregate as a `forbidden aggregate`_ in the"},{"line_number":111,"context_line":"``member_of`` query parameter of ``GET /allocation_candidates`` API."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":".. _forbidden aggregate: https://docs.openstack.org/placement/latest/specs/train/implemented/2005297-negative-aggregate-membership.html"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":29,"id":"5faad753_170e1a34","line":111,"updated":"2019-09-09 16:00:39.000000000","message":"IMO this paragraph is too developer-oriented. It should describe more \"what\" and less \"how\".\n\n\"\"\"\nStarting in the Train release, there is an optional request filter :doc:`...`. When enabled, the traits required in the server\u0027s flavor and image must be at least those required in an aggregate\u0027s metadata in order for the server to be eligible to boot on hosts in that aggregate.\n\"\"\"\n\n...or something similar. Point is, the audience of this document shouldn\u0027t need to know anything about the request_spec object or placement query parameters.","commit_id":"4113853b3f4929af038f4c9ad22d5d49f7ea4374"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"be681e3d8d7006f0ac4191e872305b656a78ed9c","unresolved":false,"context_lines":[{"line_number":108,"context_line":"request_spec object and compare it with the required traits set in the"},{"line_number":109,"context_line":"aggregate metadata. If any of the traits are not matching with the aggregate"},{"line_number":110,"context_line":"metadata, it will include that aggregate as a `forbidden aggregate`_ in the"},{"line_number":111,"context_line":"``member_of`` query parameter of ``GET /allocation_candidates`` API."},{"line_number":112,"context_line":""},{"line_number":113,"context_line":".. _forbidden aggregate: https://docs.openstack.org/placement/latest/specs/train/implemented/2005297-negative-aggregate-membership.html"},{"line_number":114,"context_line":""}],"source_content_type":"text/x-rst","patch_set":29,"id":"5faad753_d69e3b06","line":111,"in_reply_to":"5faad753_170e1a34","updated":"2019-09-09 20:26:36.000000000","message":"Done, Thanks Eric for precise comment.","commit_id":"4113853b3f4929af038f4c9ad22d5d49f7ea4374"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"86cb910227297962faf822cb274945a02a937f3a","unresolved":false,"context_lines":[{"line_number":278,"context_line":""},{"line_number":279,"context_line":".. note::"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"   This filter has limitations as described in `LP_bug"},{"line_number":282,"context_line":"   \u003chttps://bugs.launchpad.net/nova/+bug/1677217\u003e`_"},{"line_number":283,"context_line":"   which are addressed in placement :doc:`/reference/isolate-aggregates`"},{"line_number":284,"context_line":"   request filter."}],"source_content_type":"text/x-rst","patch_set":29,"id":"5faad753_774aee55","line":281,"range":{"start_line":281,"start_character":48,"end_line":281,"end_character":54},"updated":"2019-09-09 16:00:39.000000000","message":"This renders as \u0027LP_bug\u0027. Suggest \u0027bug 1677217\u0027 instead.","commit_id":"4113853b3f4929af038f4c9ad22d5d49f7ea4374"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4987d23878cc2bb2551f53d6503da184e2d94424","unresolved":false,"context_lines":[{"line_number":108,"context_line":"least those required in an aggregate\u0027s metadata in order for the server to be"},{"line_number":109,"context_line":"eligible to boot on hosts in that aggregate."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":".. _forbidden aggregate: https://docs.openstack.org/placement/latest/specs/train/implemented/2005297-negative-aggregate-membership.html"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"Filter scheduler"},{"line_number":114,"context_line":"~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":30,"id":"5faad753_d6139b65","line":111,"range":{"start_line":111,"start_character":0,"end_line":111,"end_character":135},"updated":"2019-09-09 20:32:37.000000000","message":"This is no longer used and can be removed.","commit_id":"8e20e565d8dc66a35ee8372cb4acd76cc7f3063a"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"290a18cccc92156f3c4e8e6241e0461bee3729bf","unresolved":false,"context_lines":[{"line_number":108,"context_line":"least those required in an aggregate\u0027s metadata in order for the server to be"},{"line_number":109,"context_line":"eligible to boot on hosts in that aggregate."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":".. _forbidden aggregate: https://docs.openstack.org/placement/latest/specs/train/implemented/2005297-negative-aggregate-membership.html"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"Filter scheduler"},{"line_number":114,"context_line":"~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":30,"id":"5faad753_997d541e","line":111,"range":{"start_line":111,"start_character":0,"end_line":111,"end_character":135},"in_reply_to":"5faad753_d6139b65","updated":"2019-09-09 20:54:15.000000000","message":"Done, my miss","commit_id":"8e20e565d8dc66a35ee8372cb4acd76cc7f3063a"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"4987d23878cc2bb2551f53d6503da184e2d94424","unresolved":false,"context_lines":[{"line_number":276,"context_line":""},{"line_number":277,"context_line":".. note::"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"   This filter has limitations as described in `LP_bug"},{"line_number":280,"context_line":"   \u003chttps://bugs.launchpad.net/nova/+bug/1677217\u003e`_"},{"line_number":281,"context_line":"   which are addressed in placement :doc:`/reference/isolate-aggregates`"},{"line_number":282,"context_line":"   request filter."}],"source_content_type":"text/x-rst","patch_set":30,"id":"5faad753_b60a9f23","line":279,"range":{"start_line":279,"start_character":48,"end_line":279,"end_character":54},"updated":"2019-09-09 20:32:37.000000000","message":"see PS29 comment","commit_id":"8e20e565d8dc66a35ee8372cb4acd76cc7f3063a"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"290a18cccc92156f3c4e8e6241e0461bee3729bf","unresolved":false,"context_lines":[{"line_number":276,"context_line":""},{"line_number":277,"context_line":".. note::"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"   This filter has limitations as described in `LP_bug"},{"line_number":280,"context_line":"   \u003chttps://bugs.launchpad.net/nova/+bug/1677217\u003e`_"},{"line_number":281,"context_line":"   which are addressed in placement :doc:`/reference/isolate-aggregates`"},{"line_number":282,"context_line":"   request filter."}],"source_content_type":"text/x-rst","patch_set":30,"id":"5faad753_5977dc3b","line":279,"range":{"start_line":279,"start_character":48,"end_line":279,"end_character":54},"in_reply_to":"5faad753_b60a9f23","updated":"2019-09-09 20:54:15.000000000","message":"Done, my miss, sorry","commit_id":"8e20e565d8dc66a35ee8372cb4acd76cc7f3063a"}],"doc/source/cli/nova-status.rst":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3f0c2a19cebdb44fc3066502980c5f1daa310a72","unresolved":false,"context_lines":[{"line_number":132,"context_line":""},{"line_number":133,"context_line":"  **20.0.0 (Train)**"},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"  * Checks for the Placement API are modified to require version 1.32."},{"line_number":136,"context_line":"  * Checks to ensure block-storage (cinder) API version 3.44 is"},{"line_number":137,"context_line":"    available in order to support multi-attach volumes."},{"line_number":138,"context_line":"    If ``[cinder]/auth_type`` is not configured this is a no-op check."}],"source_content_type":"text/x-rst","patch_set":22,"id":"7faddb67_93825ffe","line":135,"updated":"2019-09-05 20:09:35.000000000","message":"This delta should go with the code that constructs the forbidden agg querystring.","commit_id":"730ad9a2a5188e0c3b281d8c649c2bcb4455e2f0"}],"doc/source/reference/forbidden-aggregates.rst":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Problem description"},{"line_number":20,"context_line":"-------------------"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Let\u0027s say I want to setup an aggregate ``ABC`` with hosts that allows you to"},{"line_number":23,"context_line":"run only certain licensed images on it. So, I will need to tag the aggregate"},{"line_number":24,"context_line":"with metata for example ``\u003cLICENSED\u003dWINDOWS\u003e`` and then if I boot image containing"}],"source_content_type":"text/x-rst","patch_set":1,"id":"9fb8cfa7_e2b5307f","line":21,"updated":"2019-06-27 17:19:59.000000000","message":"nts: reword for grammar","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7f13c3ead6da4e527897b5e6a4382e4d2c97d537","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Problem description"},{"line_number":20,"context_line":"-------------------"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Let\u0027s say I want to setup an aggregate ``ABC`` with hosts that allows you to"},{"line_number":23,"context_line":"run only certain licensed images on it. So, I will need to tag the aggregate"},{"line_number":24,"context_line":"with metata for example ``\u003cLICENSED\u003dWINDOWS\u003e`` and then if I boot image containing"}],"source_content_type":"text/x-rst","patch_set":1,"id":"9fb8cfa7_6096064f","line":21,"in_reply_to":"9fb8cfa7_e2b5307f","updated":"2019-06-28 15:45:25.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7f13c3ead6da4e527897b5e6a4382e4d2c97d537","unresolved":false,"context_lines":[{"line_number":40,"context_line":"config option to True in nova.conf and restart nova-scheduler service."},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"Configure aggregate ``ABC`` and add hosts ``HOST1`` and ``HOST2`` to it in"},{"line_number":43,"context_line":"Nova and sync it with placement service using the"},{"line_number":44,"context_line":"``nova-manage placement sync-aggregates`` command. Then, you will need to add"},{"line_number":45,"context_line":"required trait ``trait:CUSTOM_LICENSED_WINDOWS\u003drequired`` to the resource"},{"line_number":46,"context_line":"providers ``HOST1`` and ``HOST2`` in placement service. Add"},{"line_number":47,"context_line":"``trait:CUSTOM_LICENSED_WINDOWS\u003drequired`` metadata to the aggregate ``ABC``"}],"source_content_type":"text/x-rst","patch_set":1,"id":"9fb8cfa7_7a755363","line":44,"range":{"start_line":43,"start_character":9,"end_line":44,"end_character":49},"updated":"2019-06-28 15:45:25.000000000","message":"This isn\u0027t necessary - happens automatically. The sync command is for upgrades from versions where that wasn\u0027t the case.\n\nDone","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7f13c3ead6da4e527897b5e6a4382e4d2c97d537","unresolved":false,"context_lines":[{"line_number":65,"context_line":"not return ``HOST1`` and ``HOST2`` as allocation candidates for booting"},{"line_number":66,"context_line":"instance."},{"line_number":67,"context_line":""},{"line_number":68,"context_line":".. _placement-req-filter-forbidden-aggregates: https://blueprints.launchpad.net/nova/+spec/placement-req-filter-forbidden-aggregates"}],"source_content_type":"text/x-rst","patch_set":1,"id":"9fb8cfa7_5adf2f65","line":68,"range":{"start_line":68,"start_character":47,"end_line":68,"end_character":132},"updated":"2019-06-28 15:45:25.000000000","message":"I\u0027m going to link this to the spec instead, as I think that\u0027s a more useful reference.","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"52f15ab6cf9d731395eefdc60a5638d40b6eec56","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Filtering hosts by forbidden aggregates"},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Problem description"},{"line_number":20,"context_line":"-------------------"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"I want to set up an aggregate ``ABC`` with hosts that allow you to run only"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7faddb67_440bead4","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":19},"updated":"2019-07-17 01:06:53.000000000","message":"nit: \u0027Backgroud\u0027 is better?","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"4653cc9ef28981a93baeefe7e1ae2f5256135c0b","unresolved":false,"context_lines":[{"line_number":16,"context_line":"Filtering hosts by forbidden aggregates"},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Problem description"},{"line_number":20,"context_line":"-------------------"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"I want to set up an aggregate ``ABC`` with hosts that allow you to run only"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7faddb67_bbd4fbea","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":19},"in_reply_to":"7faddb67_440bead4","updated":"2019-08-07 13:07:49.000000000","message":"Done,  refer https://review.opendev.org/#/c/667952/11/doc/source/reference/isolate-aggregates.rst","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"806b6a02d408a1e36fce3c08f64de62424306d01","unresolved":false,"context_lines":[{"line_number":36,"context_line":"--------"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"The above problem is addressed by blueprint"},{"line_number":39,"context_line":"`placement-req-filter-forbidden-aggregates`_."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"The following example assumes you have configured aggregate ``ABC`` and added"},{"line_number":42,"context_line":"hosts ``HOST1`` and ``HOST2`` to it in Nova, and that you want to isolate those"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7faddb67_7aa105a9","line":39,"updated":"2019-07-31 18:22:14.000000000","message":"nit: ...which was implemented in the 20.0.0 Train release.","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"4653cc9ef28981a93baeefe7e1ae2f5256135c0b","unresolved":false,"context_lines":[{"line_number":36,"context_line":"--------"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"The above problem is addressed by blueprint"},{"line_number":39,"context_line":"`placement-req-filter-forbidden-aggregates`_."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"The following example assumes you have configured aggregate ``ABC`` and added"},{"line_number":42,"context_line":"hosts ``HOST1`` and ``HOST2`` to it in Nova, and that you want to isolate those"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7faddb67_1bfd0f6e","line":39,"in_reply_to":"7faddb67_7aa105a9","updated":"2019-08-07 13:07:49.000000000","message":"Done","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"806b6a02d408a1e36fce3c08f64de62424306d01","unresolved":false,"context_lines":[{"line_number":92,"context_line":"``HOST2`` because aggregate ``ABC`` requires that trait."},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"The above example uses a ``CUSTOM_LICENSED_WINDOWS`` trait, but you can use any"},{"line_number":95,"context_line":"custom or standard trait in a similar fashion."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"The filter supports the use of multiple traits across multiple aggregates. The"},{"line_number":98,"context_line":"combination of flavor and image metadata must require **all** of the traits"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7faddb67_5aac499e","line":95,"range":{"start_line":95,"start_character":10,"end_line":95,"end_character":24},"updated":"2019-07-31 18:22:14.000000000","message":"nit: could link to https://docs.openstack.org/os-traits/latest/","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"4653cc9ef28981a93baeefe7e1ae2f5256135c0b","unresolved":false,"context_lines":[{"line_number":92,"context_line":"``HOST2`` because aggregate ``ABC`` requires that trait."},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"The above example uses a ``CUSTOM_LICENSED_WINDOWS`` trait, but you can use any"},{"line_number":95,"context_line":"custom or standard trait in a similar fashion."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"The filter supports the use of multiple traits across multiple aggregates. The"},{"line_number":98,"context_line":"combination of flavor and image metadata must require **all** of the traits"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7faddb67_3b024b71","line":95,"range":{"start_line":95,"start_character":10,"end_line":95,"end_character":24},"in_reply_to":"7faddb67_5aac499e","updated":"2019-08-07 13:07:49.000000000","message":"Done","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"806b6a02d408a1e36fce3c08f64de62424306d01","unresolved":false,"context_lines":[{"line_number":95,"context_line":"custom or standard trait in a similar fashion."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"The filter supports the use of multiple traits across multiple aggregates. The"},{"line_number":98,"context_line":"combination of flavor and image metadata must require **all** of the traits"},{"line_number":99,"context_line":"configured on the aggregate in order to pass."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":".. _placement-req-filter-forbidden-aggregates: https://specs.openstack.org/openstack/nova-specs/specs/train/approved/placement-req-filter-forbidden-aggregates.html"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7faddb67_ba445db9","line":98,"updated":"2019-07-31 18:22:14.000000000","message":"Is there a functional test covering this? It\u0027s hard for me to tell just from skimming since there is no example here of what it means. e.g. does it mean if host1 is in an aggregate with required traits A and B and I\u0027m creating a server with flavor that has required traits B and C, then it won\u0027t land on host1 since host1 requires trait A which isn\u0027t in the flavor, right? IOW, the required traits on the aggregate must be a subset of the required traits in the flavor and/or image to be accepted by hosts in that aggregate.","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"4653cc9ef28981a93baeefe7e1ae2f5256135c0b","unresolved":false,"context_lines":[{"line_number":95,"context_line":"custom or standard trait in a similar fashion."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"The filter supports the use of multiple traits across multiple aggregates. The"},{"line_number":98,"context_line":"combination of flavor and image metadata must require **all** of the traits"},{"line_number":99,"context_line":"configured on the aggregate in order to pass."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":".. _placement-req-filter-forbidden-aggregates: https://specs.openstack.org/openstack/nova-specs/specs/train/approved/placement-req-filter-forbidden-aggregates.html"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7faddb67_dbf69791","line":98,"in_reply_to":"7faddb67_60e872b2","updated":"2019-08-07 13:07:49.000000000","message":"Done, added \u0027test_filter_with_traits_image_flavor_subset_of_aggregates\u0027 [1] and \u0027test_filter_with_traits_image_flavor_disjoint_of_aggregates\u0027 [2]\n\n[1]: https://review.opendev.org/#/c/667952/11/nova/tests/functional/test_aggregates.py@631\n[2]: https://review.opendev.org/#/c/667952/11/nova/tests/functional/test_aggregates.py@664","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1264a83660b254672848d0a1b56246000c016018","unresolved":false,"context_lines":[{"line_number":95,"context_line":"custom or standard trait in a similar fashion."},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"The filter supports the use of multiple traits across multiple aggregates. The"},{"line_number":98,"context_line":"combination of flavor and image metadata must require **all** of the traits"},{"line_number":99,"context_line":"configured on the aggregate in order to pass."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":".. _placement-req-filter-forbidden-aggregates: https://specs.openstack.org/openstack/nova-specs/specs/train/approved/placement-req-filter-forbidden-aggregates.html"}],"source_content_type":"text/x-rst","patch_set":10,"id":"7faddb67_60e872b2","line":98,"in_reply_to":"7faddb67_ba445db9","updated":"2019-07-31 20:16:47.000000000","message":"Your analysis is correct.\n\nThere\u0027s a functional test covering the positive (success) side [1] where one trait is on the image and one is on the flavor, and the combination is a superset (in this case an exact match) of what\u0027s on the host\u0027s aggregate.\n\nAnd there\u0027s a test where the img+flv don\u0027t require anything, so the instance doesn\u0027t land [2].\n\nBut I don\u0027t see a test where the img+flv have a nonempty set of required traits that\u0027s a subset or disjoint set of the traits on the aggregates.\n\n[1] https://review.opendev.org/#/c/667952/10/nova/tests/functional/test_aggregates.py@569 (test_filter_with_traits_on_image_and_flavor)\n[2] https://review.opendev.org/#/c/667952/10/nova/tests/functional/test_aggregates.py@503 (test_filter_with_no_valid_host)","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"}],"doc/source/reference/index.rst":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":28,"context_line":"  ``ComputeDriver.update_provider_tree`` method."},{"line_number":29,"context_line":"* :doc:`/reference/upgrade-checks`: A guide to writing automated upgrade"},{"line_number":30,"context_line":"  checks."},{"line_number":31,"context_line":"* :doc:`/reference/forbidden-aggregates`: Describe how the newly added placement"},{"line_number":32,"context_line":"  filter works in nova to isolate group of hosts."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Debugging"}],"source_content_type":"text/x-rst","patch_set":1,"id":"9fb8cfa7_c2aeec2c","line":31,"range":{"start_line":31,"start_character":42,"end_line":31,"end_character":50},"updated":"2019-06-27 17:19:59.000000000","message":"Describes","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":29,"context_line":"* :doc:`/reference/upgrade-checks`: A guide to writing automated upgrade"},{"line_number":30,"context_line":"  checks."},{"line_number":31,"context_line":"* :doc:`/reference/forbidden-aggregates`: Describe how the newly added placement"},{"line_number":32,"context_line":"  filter works in nova to isolate group of hosts."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Debugging"},{"line_number":35,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":1,"id":"9fb8cfa7_62a94022","line":32,"range":{"start_line":32,"start_character":34,"end_line":32,"end_character":39},"updated":"2019-06-27 17:19:59.000000000","message":"groups","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"58fe3352b9324dc1d36c25f69e3a7ab848f19a30","unresolved":false,"context_lines":[{"line_number":28,"context_line":"  ``ComputeDriver.update_provider_tree`` method."},{"line_number":29,"context_line":"* :doc:`/reference/upgrade-checks`: A guide to writing automated upgrade"},{"line_number":30,"context_line":"  checks."},{"line_number":31,"context_line":"* :doc:`/reference/forbidden-aggregates`: Describes how the newly added placement"},{"line_number":32,"context_line":"  filter works in nova to isolate groups of hosts."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Debugging"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7faddb67_0db6ceda","line":31,"range":{"start_line":31,"start_character":60,"end_line":31,"end_character":71},"updated":"2019-07-10 21:05:40.000000000","message":"Strike (this won\u0027t always be newly added)","commit_id":"83b32f0ee68b7470f7545783faba861384256327"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"fa1772d80f0701c1ab850091c7fe345b8dc6b311","unresolved":false,"context_lines":[{"line_number":28,"context_line":"  ``ComputeDriver.update_provider_tree`` method."},{"line_number":29,"context_line":"* :doc:`/reference/upgrade-checks`: A guide to writing automated upgrade"},{"line_number":30,"context_line":"  checks."},{"line_number":31,"context_line":"* :doc:`/reference/forbidden-aggregates`: Describes how the newly added placement"},{"line_number":32,"context_line":"  filter works in nova to isolate groups of hosts."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Debugging"}],"source_content_type":"text/x-rst","patch_set":6,"id":"7faddb67_c946637d","line":31,"range":{"start_line":31,"start_character":60,"end_line":31,"end_character":71},"in_reply_to":"7faddb67_0db6ceda","updated":"2019-07-11 09:07:21.000000000","message":"Done","commit_id":"83b32f0ee68b7470f7545783faba861384256327"}],"doc/source/reference/isolate-aggregates.rst":[{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"8b932e4eda17343acad40fd1e8660ade517ec46a","unresolved":false,"context_lines":[{"line_number":13,"context_line":"      License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"      under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Filtering hosts by isolate aggregates"},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Background"}],"source_content_type":"text/x-rst","patch_set":16,"id":"7faddb67_e3eb3e75","line":16,"range":{"start_line":16,"start_character":19,"end_line":16,"end_character":26},"updated":"2019-08-13 22:40:49.000000000","message":"isolated?","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f436d46304e208741879c842c76a1416ff350e56","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"   .. code-block:: console"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"     # server_id\u003d$(openstack --os-compute-api-version 2.53 hypervisor show HOST1 -f value -c id)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"   Start to build the command line by first collecting existing traits for ``HOST1``"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"7faddb67_e0824952","line":63,"updated":"2019-08-14 12:04:14.000000000","message":"you could do it from placement too as the name of the resource provider is the hostname","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"43068c3c06a7d535efc59e646bfc5459175603ae","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"   .. code-block:: console"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"     # server_id\u003d$(openstack --os-compute-api-version 2.53 hypervisor show HOST1 -f value -c id)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"   Start to build the command line by first collecting existing traits for ``HOST1``"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":16,"id":"7faddb67_c0c7ff97","line":63,"in_reply_to":"7faddb67_e0824952","updated":"2019-08-15 00:26:57.000000000","message":"Done","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c96b2434f49520f347240e938f393125275c8ca2","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"   .. code-block:: console"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"     # server_id\u003d$(openstack resource provider show \u003cHOST1_UUID\u003e)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"   Start to build the command line by first collecting existing traits for ``HOST1``"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":26,"id":"5faad753_01f02790","line":63,"range":{"start_line":63,"start_character":7,"end_line":63,"end_character":16},"updated":"2019-09-07 15:22:04.000000000","message":"host_id? resource_provider_id? I think the \u0027server\u0027 term is used for the instances you create with openstack server create","commit_id":"b7b96b0224ea698e7aa4fc5498ad732325f2a9ad"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"623a7a9348e8f6bdc9281d964e78ad8025a0a3f0","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"   .. code-block:: console"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"     # server_id\u003d$(openstack resource provider show \u003cHOST1_UUID\u003e)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"   Start to build the command line by first collecting existing traits for ``HOST1``"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":26,"id":"5faad753_e3f70af5","line":63,"range":{"start_line":63,"start_character":7,"end_line":63,"end_character":16},"in_reply_to":"5faad753_01f02790","updated":"2019-09-08 18:08:57.000000000","message":"Done","commit_id":"b7b96b0224ea698e7aa4fc5498ad732325f2a9ad"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c96b2434f49520f347240e938f393125275c8ca2","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"   .. code-block:: console"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"     # traits\u003d$(openstack --os-placement-api-version 1.6 resource provider trait list -f value -c name $server_id | sed \u0027s/^/--trait /\u0027)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"   Replace ``HOST1``\\ \u0027s traits, adding ``CUSTOM_LICENSED_WINDOWS``"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-rst","patch_set":26,"id":"5faad753_61347b4b","line":69,"range":{"start_line":69,"start_character":95,"end_line":69,"end_character":102},"updated":"2019-09-07 15:22:04.000000000","message":"nit: this is unnecessary","commit_id":"b7b96b0224ea698e7aa4fc5498ad732325f2a9ad"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"623a7a9348e8f6bdc9281d964e78ad8025a0a3f0","unresolved":false,"context_lines":[{"line_number":66,"context_line":""},{"line_number":67,"context_line":"   .. code-block:: console"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"     # traits\u003d$(openstack --os-placement-api-version 1.6 resource provider trait list -f value -c name $server_id | sed \u0027s/^/--trait /\u0027)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"   Replace ``HOST1``\\ \u0027s traits, adding ``CUSTOM_LICENSED_WINDOWS``"},{"line_number":72,"context_line":""}],"source_content_type":"text/x-rst","patch_set":26,"id":"5faad753_83dc1675","line":69,"range":{"start_line":69,"start_character":95,"end_line":69,"end_character":102},"in_reply_to":"5faad753_61347b4b","updated":"2019-09-08 18:08:57.000000000","message":"Done","commit_id":"b7b96b0224ea698e7aa4fc5498ad732325f2a9ad"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3a3a9c194469b0e4698160e50032f91ccf342f92","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"   .. code-block:: console"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"     # server\u003d$(openstack resource provider show \u003cHOST1_UUID\u003e)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"   Start to build the command line by first collecting existing traits for ``HOST1``"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":28,"id":"5faad753_eb2fdcf3","line":63,"range":{"start_line":63,"start_character":7,"end_line":63,"end_character":13},"updated":"2019-09-09 08:40:14.000000000","message":"Sorry I wasn\u0027t precise enough. I would like to see this name other than \u0027server\u0027 or \u0027server_id\u0027 as server term i used for the VMs created in nova.  I suggest to use \u0027host_id\u0027 instead.","commit_id":"d76bdec79cc50997c2c7cddab1f8a636fa4da26d"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"be681e3d8d7006f0ac4191e872305b656a78ed9c","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"   .. code-block:: console"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"     # server\u003d$(openstack resource provider show \u003cHOST1_UUID\u003e)"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"   Start to build the command line by first collecting existing traits for ``HOST1``"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-rst","patch_set":28,"id":"5faad753_56fd6b38","line":63,"range":{"start_line":63,"start_character":7,"end_line":63,"end_character":13},"in_reply_to":"5faad753_eb2fdcf3","updated":"2019-09-09 20:26:36.000000000","message":"Done","commit_id":"d76bdec79cc50997c2c7cddab1f8a636fa4da26d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"86cb910227297962faf822cb274945a02a937f3a","unresolved":false,"context_lines":[{"line_number":13,"context_line":"      License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"      under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Filtering hosts by isolate aggregates"},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Background"}],"source_content_type":"text/x-rst","patch_set":29,"id":"5faad753_d76642ee","line":16,"range":{"start_line":16,"start_character":19,"end_line":16,"end_character":26},"updated":"2019-09-09 16:00:39.000000000","message":"isolated or isolating","commit_id":"4113853b3f4929af038f4c9ad22d5d49f7ea4374"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"be681e3d8d7006f0ac4191e872305b656a78ed9c","unresolved":false,"context_lines":[{"line_number":13,"context_line":"      License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"      under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Filtering hosts by isolate aggregates"},{"line_number":17,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Background"}],"source_content_type":"text/x-rst","patch_set":29,"id":"5faad753_76fae742","line":16,"range":{"start_line":16,"start_character":19,"end_line":16,"end_character":26},"in_reply_to":"5faad753_d76642ee","updated":"2019-09-09 20:26:36.000000000","message":"Done","commit_id":"4113853b3f4929af038f4c9ad22d5d49f7ea4374"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"86cb910227297962faf822cb274945a02a937f3a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"5faad753_462dbe93","line":104,"updated":"2019-09-09 16:00:39.000000000","message":"++ good document.","commit_id":"4113853b3f4929af038f4c9ad22d5d49f7ea4374"}],"nova/cmd/status.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3f0c2a19cebdb44fc3066502980c5f1daa310a72","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"7faddb67_13642fb2","updated":"2019-09-05 20:09:35.000000000","message":"This delta should go with the code that constructs the forbidden agg querystring.","commit_id":"730ad9a2a5188e0c3b281d8c649c2bcb4455e2f0"}],"nova/conf/scheduler.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7f13c3ead6da4e527897b5e6a4382e4d2c97d537","unresolved":false,"context_lines":[{"line_number":185,"context_line":"hosts that support the ``disk_format`` of the image used in the request."},{"line_number":186,"context_line":"\"\"\"),"},{"line_number":187,"context_line":"    cfg.BoolOpt(\"enable_forbidden_aggregates_filter\","},{"line_number":188,"context_line":"                default\u003dFalse,"},{"line_number":189,"context_line":"                help\u003d\"\"\""},{"line_number":190,"context_line":"This setting causes the scheduler to look up for host aggregates that should"},{"line_number":191,"context_line":"be ignored by placement for booting the requested instance. It checks if"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_c0ab3285","line":188,"range":{"start_line":188,"start_character":24,"end_line":188,"end_character":29},"updated":"2019-06-28 15:45:25.000000000","message":"Should we enable this by default?\n\nHeck, do we even need a conf option?\n\nYou have to try pretty hard and know what you\u0027re doing to make this work.\n\nIs it so by default we don\u0027t incur the performance penalty of doing the aggregate lookups every time?","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"11d2499854d91e5039ebfe94cb160d4f6e4c3fcd","unresolved":false,"context_lines":[{"line_number":185,"context_line":"hosts that support the ``disk_format`` of the image used in the request."},{"line_number":186,"context_line":"\"\"\"),"},{"line_number":187,"context_line":"    cfg.BoolOpt(\"enable_forbidden_aggregates_filter\","},{"line_number":188,"context_line":"                default\u003dFalse,"},{"line_number":189,"context_line":"                help\u003d\"\"\""},{"line_number":190,"context_line":"This setting causes the scheduler to look up for host aggregates that should"},{"line_number":191,"context_line":"be ignored by placement for booting the requested instance. It checks if"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_ad65971f","line":188,"range":{"start_line":188,"start_character":24,"end_line":188,"end_character":29},"in_reply_to":"9fb8cfa7_c0ab3285","updated":"2019-07-03 13:33:48.000000000","message":"\u003e Is it so by default we don\u0027t incur the performance penalty of doing\n \u003e the aggregate lookups every time?\n\nHaving thought about it and discussed [1] a bit, let\u0027s go ahead and keep this as is. If we can prove that the db lookup is super cheap, even for large deployments with lots of aggregates, then we could maybe later consider enabling by default.\n\n[1] http://eavesdrop.openstack.org/irclogs/%23openstack-nova/%23openstack-nova.2019-07-03.log.html#t2019-07-03T13:25:54","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    cfg.BoolOpt(\"enable_forbidden_aggregates_filter\","},{"line_number":188,"context_line":"                default\u003dFalse,"},{"line_number":189,"context_line":"                help\u003d\"\"\""},{"line_number":190,"context_line":"This setting causes the scheduler to look up for host aggregates that should"},{"line_number":191,"context_line":"be ignored by placement for booting the requested instance. It checks if"},{"line_number":192,"context_line":"aggregates has metadata key\u003d\u0027trait:\u003ctrait_name\u003e\u0027 and value\u003d\u0027required\u0027 and if"},{"line_number":193,"context_line":"trait_name from the key is not present either in the requested flavor extra"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_2265881e","line":190,"updated":"2019-06-27 17:19:59.000000000","message":"nts: reword for grammar","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7f13c3ead6da4e527897b5e6a4382e4d2c97d537","unresolved":false,"context_lines":[{"line_number":187,"context_line":"    cfg.BoolOpt(\"enable_forbidden_aggregates_filter\","},{"line_number":188,"context_line":"                default\u003dFalse,"},{"line_number":189,"context_line":"                help\u003d\"\"\""},{"line_number":190,"context_line":"This setting causes the scheduler to look up for host aggregates that should"},{"line_number":191,"context_line":"be ignored by placement for booting the requested instance. It checks if"},{"line_number":192,"context_line":"aggregates has metadata key\u003d\u0027trait:\u003ctrait_name\u003e\u0027 and value\u003d\u0027required\u0027 and if"},{"line_number":193,"context_line":"trait_name from the key is not present either in the requested flavor extra"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_80e3fa04","line":190,"in_reply_to":"9fb8cfa7_2265881e","updated":"2019-06-28 15:45:25.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"040bf93f23abb6d02475ccdd96cc41f049adb81f","unresolved":false,"context_lines":[{"line_number":184,"context_line":"This setting causes the scheduler to ask placement only for compute"},{"line_number":185,"context_line":"hosts that support the ``disk_format`` of the image used in the request."},{"line_number":186,"context_line":"\"\"\"),"},{"line_number":187,"context_line":"    cfg.BoolOpt(\"enable_forbidden_aggregates_filter\","},{"line_number":188,"context_line":"                default\u003dFalse,"},{"line_number":189,"context_line":"                help\u003d\"\"\""},{"line_number":190,"context_line":"This setting allows the scheduler to restrict hosts in aggregates based on"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_6b14a744","line":187,"range":{"start_line":187,"start_character":45,"end_line":187,"end_character":51},"updated":"2019-06-28 16:19:04.000000000","message":"\"filtering\", please.\n\nIMHO, these should describe behaviors, not indicate that we\u0027re just flipping a filter module on or off.","commit_id":"33fc878c539162aadc5448bd85e030c5684a6bec"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"806b6a02d408a1e36fce3c08f64de62424306d01","unresolved":false,"context_lines":[{"line_number":190,"context_line":"This setting allows the scheduler to restrict hosts in aggregates based on"},{"line_number":191,"context_line":"matching required traits in the aggregate metadata and the instance"},{"line_number":192,"context_line":"flavor/image. If an aggregate is configured with a property with key"},{"line_number":193,"context_line":"``trait:$TRAIT_NAME`` and value ``required``, the instance flavor extra_specs"},{"line_number":194,"context_line":"and/or image metadata must also contain ``trait:$TRAIT_NAME\u003drequired`` to be"},{"line_number":195,"context_line":"eligible to be scheduled to hosts in that aggregate."},{"line_number":196,"context_line":"\"\"\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_5a852906","line":193,"range":{"start_line":193,"start_character":34,"end_line":193,"end_character":42},"updated":"2019-07-31 18:22:14.000000000","message":"Just thinking out loud, it\u0027s kind of weird to have \"required\" be the value in an option with the name \"forbidden\" in it. Should we have called the option something like \"enable_isolated_aggregate_filtering\"? I know we\u0027ve used \"forbidden aggregates\" everywhere else for this feature though so it\u0027s a bit late in the game to argue over naming.","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"4653cc9ef28981a93baeefe7e1ae2f5256135c0b","unresolved":false,"context_lines":[{"line_number":190,"context_line":"This setting allows the scheduler to restrict hosts in aggregates based on"},{"line_number":191,"context_line":"matching required traits in the aggregate metadata and the instance"},{"line_number":192,"context_line":"flavor/image. If an aggregate is configured with a property with key"},{"line_number":193,"context_line":"``trait:$TRAIT_NAME`` and value ``required``, the instance flavor extra_specs"},{"line_number":194,"context_line":"and/or image metadata must also contain ``trait:$TRAIT_NAME\u003drequired`` to be"},{"line_number":195,"context_line":"eligible to be scheduled to hosts in that aggregate."},{"line_number":196,"context_line":"\"\"\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_fb66f355","line":193,"range":{"start_line":193,"start_character":34,"end_line":193,"end_character":42},"in_reply_to":"7faddb67_18976e47","updated":"2019-08-07 13:07:49.000000000","message":"Done","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"4653cc9ef28981a93baeefe7e1ae2f5256135c0b","unresolved":false,"context_lines":[{"line_number":190,"context_line":"This setting allows the scheduler to restrict hosts in aggregates based on"},{"line_number":191,"context_line":"matching required traits in the aggregate metadata and the instance"},{"line_number":192,"context_line":"flavor/image. If an aggregate is configured with a property with key"},{"line_number":193,"context_line":"``trait:$TRAIT_NAME`` and value ``required``, the instance flavor extra_specs"},{"line_number":194,"context_line":"and/or image metadata must also contain ``trait:$TRAIT_NAME\u003drequired`` to be"},{"line_number":195,"context_line":"eligible to be scheduled to hosts in that aggregate."},{"line_number":196,"context_line":"\"\"\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_3b856bd0","line":193,"range":{"start_line":193,"start_character":34,"end_line":193,"end_character":42},"in_reply_to":"7faddb67_4031b658","updated":"2019-08-07 13:07:49.000000000","message":"Done, changed to \u0027isolated\u0027","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"d4b56973dc86ee65593cd45fe6d126c3f02799ad","unresolved":false,"context_lines":[{"line_number":190,"context_line":"This setting allows the scheduler to restrict hosts in aggregates based on"},{"line_number":191,"context_line":"matching required traits in the aggregate metadata and the instance"},{"line_number":192,"context_line":"flavor/image. If an aggregate is configured with a property with key"},{"line_number":193,"context_line":"``trait:$TRAIT_NAME`` and value ``required``, the instance flavor extra_specs"},{"line_number":194,"context_line":"and/or image metadata must also contain ``trait:$TRAIT_NAME\u003drequired`` to be"},{"line_number":195,"context_line":"eligible to be scheduled to hosts in that aggregate."},{"line_number":196,"context_line":"\"\"\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_18976e47","line":193,"range":{"start_line":193,"start_character":34,"end_line":193,"end_character":42},"in_reply_to":"7faddb67_4031b658","updated":"2019-08-06 11:53:55.000000000","message":"I agree to use \"isolated\", it looks more apt.\nAs Matt said, if change it now, need to modify lots of place.","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"4653cc9ef28981a93baeefe7e1ae2f5256135c0b","unresolved":false,"context_lines":[{"line_number":190,"context_line":"This setting allows the scheduler to restrict hosts in aggregates based on"},{"line_number":191,"context_line":"matching required traits in the aggregate metadata and the instance"},{"line_number":192,"context_line":"flavor/image. If an aggregate is configured with a property with key"},{"line_number":193,"context_line":"``trait:$TRAIT_NAME`` and value ``required``, the instance flavor extra_specs"},{"line_number":194,"context_line":"and/or image metadata must also contain ``trait:$TRAIT_NAME\u003drequired`` to be"},{"line_number":195,"context_line":"eligible to be scheduled to hosts in that aggregate."},{"line_number":196,"context_line":"\"\"\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_5b1147af","line":193,"range":{"start_line":193,"start_character":34,"end_line":193,"end_character":42},"in_reply_to":"7faddb67_5a852906","updated":"2019-08-07 13:07:49.000000000","message":"Changing to \u0027enable_isolated_aggregates_filtering\u0027, only keeping pre-request filter name as \u0027isolate_aggregates\u0027","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"1264a83660b254672848d0a1b56246000c016018","unresolved":false,"context_lines":[{"line_number":190,"context_line":"This setting allows the scheduler to restrict hosts in aggregates based on"},{"line_number":191,"context_line":"matching required traits in the aggregate metadata and the instance"},{"line_number":192,"context_line":"flavor/image. If an aggregate is configured with a property with key"},{"line_number":193,"context_line":"``trait:$TRAIT_NAME`` and value ``required``, the instance flavor extra_specs"},{"line_number":194,"context_line":"and/or image metadata must also contain ``trait:$TRAIT_NAME\u003drequired`` to be"},{"line_number":195,"context_line":"eligible to be scheduled to hosts in that aggregate."},{"line_number":196,"context_line":"\"\"\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_4031b658","line":193,"range":{"start_line":193,"start_character":34,"end_line":193,"end_character":42},"in_reply_to":"7faddb67_5a852906","updated":"2019-07-31 20:16:47.000000000","message":"Well, this patch is the first place things are user-facing (where user encompasses admin), so it\u0027s not too late. And I agree \"isolated\" reads better than \"forbidden\". So yeah, let\u0027s argue.","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e3f9649e1590d9b0f041841e446893e8644b9ea3","unresolved":false,"context_lines":[{"line_number":184,"context_line":"This setting causes the scheduler to ask placement only for compute"},{"line_number":185,"context_line":"hosts that support the ``disk_format`` of the image used in the request."},{"line_number":186,"context_line":"\"\"\"),"},{"line_number":187,"context_line":"    cfg.BoolOpt(\"enable_isolated_aggregates_filtering\","},{"line_number":188,"context_line":"                default\u003dFalse,"},{"line_number":189,"context_line":"                help\u003d\"\"\""},{"line_number":190,"context_line":"This setting allows the scheduler to restrict hosts in aggregates based on"}],"source_content_type":"text/x-python","patch_set":12,"id":"7faddb67_f78cbcd8","line":187,"range":{"start_line":187,"start_character":33,"end_line":187,"end_character":43},"updated":"2019-08-07 22:33:38.000000000","message":"imo this should be \u0027aggregate\u0027 (singular), but it\u0027s probably not worth messing with further.","commit_id":"78d8484420e57d6dab678ddfd1cb2b99c978a72d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f436d46304e208741879c842c76a1416ff350e56","unresolved":false,"context_lines":[{"line_number":192,"context_line":"flavor/image. If an aggregate is configured with a property with key"},{"line_number":193,"context_line":"``trait:$TRAIT_NAME`` and value ``required``, the instance flavor extra_specs"},{"line_number":194,"context_line":"and/or image metadata must also contain ``trait:$TRAIT_NAME\u003drequired`` to be"},{"line_number":195,"context_line":"eligible to be scheduled to hosts in that aggregate."},{"line_number":196,"context_line":"\"\"\")"},{"line_number":197,"context_line":"]"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_00ebe511","line":195,"updated":"2019-08-14 12:04:14.000000000","message":"Can we link to the doc somehow? As that has a lot better description what this flag enables.","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"43068c3c06a7d535efc59e646bfc5459175603ae","unresolved":false,"context_lines":[{"line_number":192,"context_line":"flavor/image. If an aggregate is configured with a property with key"},{"line_number":193,"context_line":"``trait:$TRAIT_NAME`` and value ``required``, the instance flavor extra_specs"},{"line_number":194,"context_line":"and/or image metadata must also contain ``trait:$TRAIT_NAME\u003drequired`` to be"},{"line_number":195,"context_line":"eligible to be scheduled to hosts in that aggregate."},{"line_number":196,"context_line":"\"\"\")"},{"line_number":197,"context_line":"]"},{"line_number":198,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_e0cc7bbc","line":195,"in_reply_to":"7faddb67_00ebe511","updated":"2019-08-15 00:26:57.000000000","message":"Done","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3f0c2a19cebdb44fc3066502980c5f1daa310a72","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"7faddb67_f3fdd3b1","updated":"2019-09-05 20:09:35.000000000","message":"This delta should be folded into the patch that adds the request filter.","commit_id":"730ad9a2a5188e0c3b281d8c649c2bcb4455e2f0"}],"nova/objects/aggregate.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"58fe3352b9324dc1d36c25f69e3a7ab848f19a30","unresolved":false,"context_lines":[{"line_number":460,"context_line":"    if value is not None:"},{"line_number":461,"context_line":"        query \u003d query.filter(api_models.AggregateMetadata.value \u003d\u003d value)"},{"line_number":462,"context_line":"    if keys is not None:"},{"line_number":463,"context_line":"        if key_prefix:"},{"line_number":464,"context_line":"            query \u003d query.filter(api_models.AggregateMetadata.key.like("},{"line_number":465,"context_line":"                    \u0027%%%s%%\u0027 % key_prefix))"},{"line_number":466,"context_line":"        query \u003d query.filter(~api_models.AggregateMetadata.key.in_(keys))"},{"line_number":467,"context_line":"    query \u003d query.options(contains_eager(\"_metadata\"))"},{"line_number":468,"context_line":"    query \u003d query.options(joinedload(\"_hosts\"))"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_ad6d3a33","line":465,"range":{"start_line":463,"start_character":8,"end_line":465,"end_character":43},"updated":"2019-07-10 21:05:40.000000000","message":"Is this actually helpful? I expect it wouldn\u0027t filter any further than the in_ below, so is it supposed to be making it faster?\n\nAlso, if key_prefix is a prefix, shouldn\u0027t it be \u0027%s%%\u0027? Or perhaps less confusingly\n\n key_prefix + r\u0027%\u0027","commit_id":"83b32f0ee68b7470f7545783faba861384256327"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"fa1772d80f0701c1ab850091c7fe345b8dc6b311","unresolved":false,"context_lines":[{"line_number":460,"context_line":"    if value is not None:"},{"line_number":461,"context_line":"        query \u003d query.filter(api_models.AggregateMetadata.value \u003d\u003d value)"},{"line_number":462,"context_line":"    if keys is not None:"},{"line_number":463,"context_line":"        if key_prefix:"},{"line_number":464,"context_line":"            query \u003d query.filter(api_models.AggregateMetadata.key.like("},{"line_number":465,"context_line":"                    \u0027%%%s%%\u0027 % key_prefix))"},{"line_number":466,"context_line":"        query \u003d query.filter(~api_models.AggregateMetadata.key.in_(keys))"},{"line_number":467,"context_line":"    query \u003d query.options(contains_eager(\"_metadata\"))"},{"line_number":468,"context_line":"    query \u003d query.options(joinedload(\"_hosts\"))"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_d45a7a28","line":465,"range":{"start_line":463,"start_character":8,"end_line":465,"end_character":43},"in_reply_to":"7faddb67_ad6d3a33","updated":"2019-07-11 09:07:21.000000000","message":"Hi Eric,\n\n\u0027key_prefix\u0027 is necessary to method to be work.\nRather making \u0027keys\u0027 and \u0027key_prefix\u0027 both are mandatory.\nPlease refer [1] for detailed example.\n\n[1]: http://paste.openstack.org/show/754291/","commit_id":"83b32f0ee68b7470f7545783faba861384256327"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"20f19e1efc0ec182e591a67908c7d5a46e447795","unresolved":false,"context_lines":[{"line_number":460,"context_line":"    if value is not None:"},{"line_number":461,"context_line":"        query \u003d query.filter(api_models.AggregateMetadata.value \u003d\u003d value)"},{"line_number":462,"context_line":"    if keys is not None:"},{"line_number":463,"context_line":"        if key_prefix:"},{"line_number":464,"context_line":"            query \u003d query.filter(api_models.AggregateMetadata.key.like("},{"line_number":465,"context_line":"                    \u0027%%%s%%\u0027 % key_prefix))"},{"line_number":466,"context_line":"        query \u003d query.filter(~api_models.AggregateMetadata.key.in_(keys))"},{"line_number":467,"context_line":"    query \u003d query.options(contains_eager(\"_metadata\"))"},{"line_number":468,"context_line":"    query \u003d query.options(joinedload(\"_hosts\"))"}],"source_content_type":"text/x-python","patch_set":6,"id":"7faddb67_f650d30c","line":465,"range":{"start_line":463,"start_character":8,"end_line":465,"end_character":43},"in_reply_to":"7faddb67_d45a7a28","updated":"2019-07-11 17:37:09.000000000","message":"Ahhh, thank you, the example makes it clear; it was the \u0027not\u0027 that I was missing.","commit_id":"83b32f0ee68b7470f7545783faba861384256327"}],"nova/objects/request_spec.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"        #     [aggregate_UUID1, aggregate_UUID2, aggregate_UUID3]"},{"line_number":1052,"context_line":"        # meaning that the request should not be fulfilled from an RP"},{"line_number":1053,"context_line":"        # belonging to the aggregates in forbidden_aggregates field."},{"line_number":1054,"context_line":"        \u0027forbidden_aggregates\u0027: fields.ListOfStringsField(nullable\u003dTrue,"},{"line_number":1055,"context_line":"                                                          default\u003dNone),"},{"line_number":1056,"context_line":"    }"},{"line_number":1057,"context_line":""},{"line_number":1058,"context_line":"    def __init__(self, context\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_622ce0ab","line":1055,"range":{"start_line":1054,"start_character":58,"end_line":1055,"end_character":70},"updated":"2019-06-27 17:19:59.000000000","message":"Why don\u0027t these match the \u0027aggregates\u0027 field above? I.e.\n\n default\u003d[]\n\nAlso, is there a rule about adding new fields at the end? If not, it would be prettier if this could go next to the \u0027aggregates\u0027 field.","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":1051,"context_line":"        #     [aggregate_UUID1, aggregate_UUID2, aggregate_UUID3]"},{"line_number":1052,"context_line":"        # meaning that the request should not be fulfilled from an RP"},{"line_number":1053,"context_line":"        # belonging to the aggregates in forbidden_aggregates field."},{"line_number":1054,"context_line":"        \u0027forbidden_aggregates\u0027: fields.ListOfStringsField(nullable\u003dTrue,"},{"line_number":1055,"context_line":"                                                          default\u003dNone),"},{"line_number":1056,"context_line":"    }"},{"line_number":1057,"context_line":""},{"line_number":1058,"context_line":"    def __init__(self, context\u003dNone, **kwargs):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_b2270e13","line":1055,"range":{"start_line":1054,"start_character":58,"end_line":1055,"end_character":70},"in_reply_to":"9fb8cfa7_622ce0ab","updated":"2019-07-08 12:48:59.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"}],"nova/scheduler/client/report.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":44,"context_line":"WARN_EVERY \u003d 10"},{"line_number":45,"context_line":"RESHAPER_VERSION \u003d \u00271.30\u0027"},{"line_number":46,"context_line":"CONSUMER_GENERATION_VERSION \u003d \u00271.28\u0027"},{"line_number":47,"context_line":"NEGATIVE_MEMBER_OF_QUERYPARAM \u003d \u00271.32\u0027"},{"line_number":48,"context_line":"ALLOW_RESERVED_EQUAL_TOTAL_INVENTORY_VERSION \u003d \u00271.26\u0027"},{"line_number":49,"context_line":"POST_RPS_RETURNS_PAYLOAD_API_VERSION \u003d \u00271.20\u0027"},{"line_number":50,"context_line":"AGGREGATE_GENERATION_VERSION \u003d \u00271.19\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_c20a6c24","line":47,"range":{"start_line":47,"start_character":0,"end_line":47,"end_character":29},"updated":"2019-06-27 17:19:59.000000000","message":"I would name this\n\n NEGATIVE_MEMBER_OF_VERSION\n\nto gel with the other names.\n\nAlso, move it up two lines to keep the (reverse) sorting consistent.","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":44,"context_line":"WARN_EVERY \u003d 10"},{"line_number":45,"context_line":"RESHAPER_VERSION \u003d \u00271.30\u0027"},{"line_number":46,"context_line":"CONSUMER_GENERATION_VERSION \u003d \u00271.28\u0027"},{"line_number":47,"context_line":"NEGATIVE_MEMBER_OF_QUERYPARAM \u003d \u00271.32\u0027"},{"line_number":48,"context_line":"ALLOW_RESERVED_EQUAL_TOTAL_INVENTORY_VERSION \u003d \u00271.26\u0027"},{"line_number":49,"context_line":"POST_RPS_RETURNS_PAYLOAD_API_VERSION \u003d \u00271.20\u0027"},{"line_number":50,"context_line":"AGGREGATE_GENERATION_VERSION \u003d \u00271.19\u0027"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_128862e5","line":47,"range":{"start_line":47,"start_character":0,"end_line":47,"end_character":29},"in_reply_to":"9fb8cfa7_c20a6c24","updated":"2019-07-08 12:48:59.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3f0c2a19cebdb44fc3066502980c5f1daa310a72","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"7faddb67_d30777c8","updated":"2019-09-05 20:09:35.000000000","message":"This delta should go with the code that constructs the forbidden agg querystring.","commit_id":"730ad9a2a5188e0c3b281d8c649c2bcb4455e2f0"}],"nova/scheduler/request_filter.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    will be included in the list of forbidden aggregates."},{"line_number":58,"context_line":"    \"\"\""},{"line_number":59,"context_line":"    if not CONF.scheduler.enable_forbidden_aggregates_filter:"},{"line_number":60,"context_line":"        return"},{"line_number":61,"context_line":"    flavor_extra_spec \u003d request_spec.flavor.extra_specs"},{"line_number":62,"context_line":"    image_properties \u003d request_spec.image.properties"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_65338af7","line":60,"range":{"start_line":60,"start_character":8,"end_line":60,"end_character":14},"updated":"2019-06-27 17:19:59.000000000","message":"return False","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    will be included in the list of forbidden aggregates."},{"line_number":58,"context_line":"    \"\"\""},{"line_number":59,"context_line":"    if not CONF.scheduler.enable_forbidden_aggregates_filter:"},{"line_number":60,"context_line":"        return"},{"line_number":61,"context_line":"    flavor_extra_spec \u003d request_spec.flavor.extra_specs"},{"line_number":62,"context_line":"    image_properties \u003d request_spec.image.properties"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_724f56bd","line":60,"range":{"start_line":60,"start_character":8,"end_line":60,"end_character":14},"in_reply_to":"9fb8cfa7_65338af7","updated":"2019-07-08 12:48:59.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    forbidden_aggregates \u003d set()"},{"line_number":77,"context_line":"    aggregates \u003d objects.AggregateList.get_by_metadata(ctxt,"},{"line_number":78,"context_line":"                                                value\u003d\u0027required\u0027)"},{"line_number":79,"context_line":"    for agg in aggregates:"},{"line_number":80,"context_line":"        aggregate_traits \u003d set()"},{"line_number":81,"context_line":"        for key, value in agg.metadata.items():"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_2507d2cc","line":78,"updated":"2019-06-27 17:19:59.000000000","message":"✔\n\nSeems like this would be pretty cheap. I was worried we were going to be going across the wire here, but looks like not. This is goodness.","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7f13c3ead6da4e527897b5e6a4382e4d2c97d537","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    forbidden_aggregates \u003d set()"},{"line_number":77,"context_line":"    aggregates \u003d objects.AggregateList.get_by_metadata(ctxt,"},{"line_number":78,"context_line":"                                                value\u003d\u0027required\u0027)"},{"line_number":79,"context_line":"    for agg in aggregates:"},{"line_number":80,"context_line":"        aggregate_traits \u003d set()"},{"line_number":81,"context_line":"        for key, value in agg.metadata.items():"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_0094ea35","line":78,"in_reply_to":"9fb8cfa7_2507d2cc","updated":"2019-06-28 15:45:25.000000000","message":"How cheap is it IRL? Cheap enough that we needn\u0027t bother with the conf option? (cf. comment in conf/scheduler.py)","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        if len(aggregate_traits) \u003e 0:"},{"line_number":87,"context_line":"            # Add forbidden aggregate only if the required traits set in the"},{"line_number":88,"context_line":"            # aggregate metadata  are not requested in flavor and/or image."},{"line_number":89,"context_line":"            if len(list(aggregate_traits.difference("},{"line_number":90,"context_line":"                    image_flavor_traits))) \u003e 0:"},{"line_number":91,"context_line":"                forbidden_aggregates.add(agg.uuid)"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    # Set list of forbidden aggregates to destination object of request_spec"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_25bef2d4","line":90,"range":{"start_line":89,"start_character":15,"end_line":90,"end_character":47},"updated":"2019-06-27 17:19:59.000000000","message":"✔\n\nOr just:\n\n if aggregate_traits - image_flavor_traits:","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                request_spec.requested_destination is None):"},{"line_number":97,"context_line":"            request_spec.requested_destination \u003d objects.Destination()"},{"line_number":98,"context_line":"        destination \u003d request_spec.requested_destination"},{"line_number":99,"context_line":"        destination.set_forbidden_aggregates(forbidden_aggregates)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"@trace_request_filter"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_c53d96bb","line":99,"updated":"2019-06-27 17:19:59.000000000","message":"return True","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":96,"context_line":"                request_spec.requested_destination is None):"},{"line_number":97,"context_line":"            request_spec.requested_destination \u003d objects.Destination()"},{"line_number":98,"context_line":"        destination \u003d request_spec.requested_destination"},{"line_number":99,"context_line":"        destination.set_forbidden_aggregates(forbidden_aggregates)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"@trace_request_filter"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_f2d026cc","line":99,"in_reply_to":"9fb8cfa7_c53d96bb","updated":"2019-07-08 12:48:59.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            request_spec.requested_destination \u003d objects.Destination()"},{"line_number":98,"context_line":"        destination \u003d request_spec.requested_destination"},{"line_number":99,"context_line":"        destination.set_forbidden_aggregates(forbidden_aggregates)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"@trace_request_filter"},{"line_number":103,"context_line":"def require_tenant_aggregate(ctxt, request_spec):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_2578328e","line":100,"updated":"2019-06-27 17:19:59.000000000","message":"return False","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":97,"context_line":"            request_spec.requested_destination \u003d objects.Destination()"},{"line_number":98,"context_line":"        destination \u003d request_spec.requested_destination"},{"line_number":99,"context_line":"        destination.set_forbidden_aggregates(forbidden_aggregates)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"@trace_request_filter"},{"line_number":103,"context_line":"def require_tenant_aggregate(ctxt, request_spec):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_b2daaee6","line":100,"in_reply_to":"9fb8cfa7_2578328e","updated":"2019-07-08 12:48:59.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"040bf93f23abb6d02475ccdd96cc41f049adb81f","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    forbidden_aggregates \u003d set()"},{"line_number":77,"context_line":"    aggregates \u003d objects.AggregateList.get_by_metadata(ctxt,"},{"line_number":78,"context_line":"                                                value\u003d\u0027required\u0027)"},{"line_number":79,"context_line":"    for agg in aggregates:"},{"line_number":80,"context_line":"        aggregate_traits \u003d set()"},{"line_number":81,"context_line":"        for key, value in agg.metadata.items():"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_0b7bab8b","line":78,"updated":"2019-06-28 16:19:04.000000000","message":"Isn\u0027t someone going to try to also set trait:FOO\u003dforbidden in a partially-overlapping aggregate to make sure that only part of their windows machines get some instances?\n\nPoint being, I\u0027d prefer to query out the aggregates by the presence of a key of \"trait:FOO\". That should not only yield fewer things for us to process below, but also let us log, warn, or fail if they try to do complex set math that we don\u0027t support. Could we just grab all the required traits, construct the list of keys and pass them to an aggregate command as an IN query? For large numbers of aggregates with any required traits, this is going to process them all. Further, if you have an aggregate with five special boxes among ten thousand regular ones, we have to do this processing for every instance regardless of special-ness.\n\nI understand the desire to make this magically look the same as host traits, but it seems like doing that makes it fairly expensive. I\u0027ve thought of a couple ways to make this more efficient, but none I want to admit to, but I\u0027ll keep pondering.","commit_id":"33fc878c539162aadc5448bd85e030c5684a6bec"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"5f16802aa9dbcada10cdffe84826b785c0b71086","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    forbidden_aggregates \u003d set()"},{"line_number":77,"context_line":"    aggregates \u003d objects.AggregateList.get_by_metadata(ctxt,"},{"line_number":78,"context_line":"                                                value\u003d\u0027required\u0027)"},{"line_number":79,"context_line":"    for agg in aggregates:"},{"line_number":80,"context_line":"        aggregate_traits \u003d set()"},{"line_number":81,"context_line":"        for key, value in agg.metadata.items():"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_b08527af","line":78,"in_reply_to":"9fb8cfa7_0b7bab8b","updated":"2019-06-28 20:19:00.000000000","message":"\u003e Isn\u0027t someone going to try to also set trait:FOO\u003dforbidden in a\n \u003e partially-overlapping aggregate to make sure that only part of\n \u003e their windows machines get some instances?\n\nAs currently designed \u0026 written, that\u0027ll be ignored. Easiest thing is to simply document that that\u0027s not supported.\n\n(If we ever did want to support something like that - though I\u0027m not sure what it would mean - it wouldn\u0027t be a big deal to ask for aggregates with metadata value \u0027required\u0027 or \u0027forbidden\u0027.)\n\n(Also, if you wanted to satisfy a use case like that, wouldn\u0027t you just do it by putting an *additional* CUSTOM_SNOWFLAKE trait on your overlapping aggregate and requiring that trait on your FOO+SNOWFLAKE instances?)\n\n \u003e Point being, I\u0027d prefer to query out the aggregates by the presence\n \u003e of a key of \"trait:FOO\".\n\nThat only works if you know the full set of traits you could possibly be filtering on. Unfortunately, that\u0027s all of them (237 standard at 0.14.0, plus whatever custom ones you\u0027ve added).\n\nIt is explicitly *not* sufficient to ask for all the aggregates that have a key IN \"trait:%s\" % t for t in (flavor_traits + image_traits), because not all flavor+image traits (in fact very very few of them) are going to be required on aggregates.\n\nHow many aggregates are going to have metadata properties with value \u0027required\u0027 anyway? Off the cuff, I\u0027m guessing this is way more efficient than `key IN (\"trait:%s\" % t for t in $list_of_237_plus_traits)\"` or even `key LIKE \"trait:%\"`.\n\n \u003e For large numbers of\n \u003e aggregates with any required traits\n\nHow many is that? Does CERN really have tens of thousands of aggregates? Do we suspect that even as many as ten of them will have required traits?\n\nBut\n\nThis was all considered in the spec review. I believe we said we\u0027d do it the dumb way first; and if it turns out to be a problem for performance, we would find a way to save the aggregate required traits somewhere more quickly accessible.","commit_id":"33fc878c539162aadc5448bd85e030c5684a6bec"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"    forbidden_aggregates \u003d set()"},{"line_number":77,"context_line":"    aggregates \u003d objects.AggregateList.get_by_metadata(ctxt,"},{"line_number":78,"context_line":"                                                value\u003d\u0027required\u0027)"},{"line_number":79,"context_line":"    for agg in aggregates:"},{"line_number":80,"context_line":"        aggregate_traits \u003d set()"},{"line_number":81,"context_line":"        for key, value in agg.metadata.items():"}],"source_content_type":"text/x-python","patch_set":2,"id":"7faddb67_d2216ab6","line":78,"in_reply_to":"9fb8cfa7_b08527af","updated":"2019-07-08 12:48:59.000000000","message":"Added new method get_non_matching_by_metadata_keys() [1] which will return aggregates that are not matching with metadata.\n\n[1]: https://review.opendev.org/#/c/667952/3/nova/objects/aggregate.py@532","commit_id":"33fc878c539162aadc5448bd85e030c5684a6bec"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"040bf93f23abb6d02475ccdd96cc41f049adb81f","unresolved":false,"context_lines":[{"line_number":85,"context_line":"                    aggregate_traits.add(trait)"},{"line_number":86,"context_line":"        if len(aggregate_traits) \u003e 0:"},{"line_number":87,"context_line":"            # Add forbidden aggregate only if the required traits set in the"},{"line_number":88,"context_line":"            # aggregate metadata  are not requested in flavor and/or image."},{"line_number":89,"context_line":"            if len(list(aggregate_traits.difference("},{"line_number":90,"context_line":"                    image_flavor_traits))) \u003e 0:"},{"line_number":91,"context_line":"                forbidden_aggregates.add(agg.uuid)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_abb37f09","line":88,"range":{"start_line":88,"start_character":32,"end_line":88,"end_character":34},"updated":"2019-06-28 16:19:04.000000000","message":"double space here","commit_id":"33fc878c539162aadc5448bd85e030c5684a6bec"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3f1bf67280825fafd49b5ac65fd8a69b079acf8c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    will be included in the list of isolated aggregates."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    Precisely this filter gets the trait request form the image and"},{"line_number":60,"context_line":"    flavour and unions them. Then it accumulates the set of aggregates that"},{"line_number":61,"context_line":"    request traits are \"non_matching_by_metadata_keys\" and uses that to"},{"line_number":62,"context_line":"    produce the list of isolated aggregates."},{"line_number":63,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_4675f2ff","line":60,"range":{"start_line":60,"start_character":4,"end_line":60,"end_character":11},"updated":"2019-08-22 09:42:27.000000000","message":"flavor","commit_id":"2adb1105e041262ad54f6574a8b722050a482f63"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"ed616df994bb26343133cecd2accbe89bff3f44d","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    will be included in the list of isolated aggregates."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    Precisely this filter gets the trait request form the image and"},{"line_number":60,"context_line":"    flavour and unions them. Then it accumulates the set of aggregates that"},{"line_number":61,"context_line":"    request traits are \"non_matching_by_metadata_keys\" and uses that to"},{"line_number":62,"context_line":"    produce the list of isolated aggregates."},{"line_number":63,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":18,"id":"7faddb67_35ac9a9e","line":60,"range":{"start_line":60,"start_character":4,"end_line":60,"end_character":11},"in_reply_to":"7faddb67_4675f2ff","updated":"2019-08-22 13:29:53.000000000","message":"Done","commit_id":"2adb1105e041262ad54f6574a8b722050a482f63"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c27c7a86b8cc7f6fc8d2b6eca1fc2e3d2bccf03c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    will be included in the list of isolated aggregates."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    Precisely this filter gets the trait request form the image and"},{"line_number":60,"context_line":"    flavor and unions them. Then it accumulates the set of aggregates that"},{"line_number":61,"context_line":"    request traits are \"non_matching_by_metadata_keys\" and uses that to"},{"line_number":62,"context_line":"    produce the list of isolated aggregates."},{"line_number":63,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_f8a7f2a6","line":60,"range":{"start_line":60,"start_character":4,"end_line":60,"end_character":10},"updated":"2019-09-05 19:20:46.000000000","message":"Thanks for fixing this, but please do it in another patch, separate from your functional changes.","commit_id":"a971b5e72f4f2a23bc358cd535f85f8fe9b7d950"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3f0c2a19cebdb44fc3066502980c5f1daa310a72","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"7faddb67_13f98fc3","updated":"2019-09-05 20:09:35.000000000","message":"This delta should be folded into the patch that adds the request filter.","commit_id":"730ad9a2a5188e0c3b281d8c649c2bcb4455e2f0"}],"nova/scheduler/utils.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":255,"context_line":"                    resource_dict.pop(rclass)"},{"line_number":256,"context_line":"        self._clean_empties()"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    def extract_required_traits_from_rq(self):"},{"line_number":259,"context_line":"        \"\"\"Return a list of required traits from resource groups.\"\"\""},{"line_number":260,"context_line":"        required_traits \u003d []"},{"line_number":261,"context_line":"        for rg in self._rg_by_id.values():"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_65462ac3","line":258,"range":{"start_line":258,"start_character":8,"end_line":258,"end_character":39},"updated":"2019-06-27 17:19:59.000000000","message":"Nit: \"_from_rq\" is redundant","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":255,"context_line":"                    resource_dict.pop(rclass)"},{"line_number":256,"context_line":"        self._clean_empties()"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    def extract_required_traits_from_rq(self):"},{"line_number":259,"context_line":"        \"\"\"Return a list of required traits from resource groups.\"\"\""},{"line_number":260,"context_line":"        required_traits \u003d []"},{"line_number":261,"context_line":"        for rg in self._rg_by_id.values():"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_72e436ad","line":258,"range":{"start_line":258,"start_character":8,"end_line":258,"end_character":39},"in_reply_to":"9fb8cfa7_65462ac3","updated":"2019-07-08 12:48:59.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    def extract_required_traits_from_rq(self):"},{"line_number":259,"context_line":"        \"\"\"Return a list of required traits from resource groups.\"\"\""},{"line_number":260,"context_line":"        required_traits \u003d []"},{"line_number":261,"context_line":"        for rg in self._rg_by_id.values():"},{"line_number":262,"context_line":"            required_traits.extend(list(rg.required_traits))"},{"line_number":263,"context_line":"        return list(set(required_traits))"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_85979e45","line":260,"range":{"start_line":260,"start_character":0,"end_line":260,"end_character":28},"updated":"2019-06-27 17:19:59.000000000","message":"you could make this a set from the start","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":257,"context_line":""},{"line_number":258,"context_line":"    def extract_required_traits_from_rq(self):"},{"line_number":259,"context_line":"        \"\"\"Return a list of required traits from resource groups.\"\"\""},{"line_number":260,"context_line":"        required_traits \u003d []"},{"line_number":261,"context_line":"        for rg in self._rg_by_id.values():"},{"line_number":262,"context_line":"            required_traits.extend(list(rg.required_traits))"},{"line_number":263,"context_line":"        return list(set(required_traits))"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_92e1b29d","line":260,"range":{"start_line":260,"start_character":0,"end_line":260,"end_character":28},"in_reply_to":"9fb8cfa7_85979e45","updated":"2019-07-08 12:48:59.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        required_traits \u003d []"},{"line_number":261,"context_line":"        for rg in self._rg_by_id.values():"},{"line_number":262,"context_line":"            required_traits.extend(list(rg.required_traits))"},{"line_number":263,"context_line":"        return list(set(required_traits))"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    def to_querystring(self):"},{"line_number":266,"context_line":"        \"\"\"Produce a querystring of the form expected by"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_258cb234","line":263,"range":{"start_line":263,"start_character":0,"end_line":263,"end_character":41},"updated":"2019-06-27 17:19:59.000000000","message":"...and return just the set.\n\nAFAICT the caller would be quite happy with that.","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":260,"context_line":"        required_traits \u003d []"},{"line_number":261,"context_line":"        for rg in self._rg_by_id.values():"},{"line_number":262,"context_line":"            required_traits.extend(list(rg.required_traits))"},{"line_number":263,"context_line":"        return list(set(required_traits))"},{"line_number":264,"context_line":""},{"line_number":265,"context_line":"    def to_querystring(self):"},{"line_number":266,"context_line":"        \"\"\"Produce a querystring of the form expected by"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_32f0fe67","line":263,"range":{"start_line":263,"start_character":0,"end_line":263,"end_character":41},"in_reply_to":"9fb8cfa7_258cb234","updated":"2019-07-08 12:48:59.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":528,"context_line":"                                  for ored in destination.aggregates]"},{"line_number":529,"context_line":"            if destination.forbidden_aggregates:"},{"line_number":530,"context_line":"                grp \u003d res_req.get_request_group(None)"},{"line_number":531,"context_line":"                grp.forbidden_aggregates \u003d destination.forbidden_aggregates"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"    if \u0027force_hosts\u0027 in spec_obj and spec_obj.force_hosts:"},{"line_number":534,"context_line":"        # Prioritize the value from requested_destination just in case"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_a52982e6","line":531,"range":{"start_line":531,"start_character":16,"end_line":531,"end_character":75},"updated":"2019-06-27 17:19:59.000000000","message":"This will override any forbidden aggregates already in the request group. You need to merge them.\n\n[Later] Oh, it looks like we don\u0027t support any kind of member_of in the flavor - see TODO on L153-4.","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"79cbd4e9c92e4ec3bf5b50b76cfaf781282d3818","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        \"\"\""},{"line_number":281,"context_line":"        # TODO(gibi): We have a RequestGroup OVO so we can move this to that"},{"line_number":282,"context_line":"        # class as a member function."},{"line_number":283,"context_line":"        # NOTE(efried): The sorting herein is not necessary for the API; it is"},{"line_number":284,"context_line":"        # to make testing easier and logging/debugging predictable."},{"line_number":285,"context_line":"        def to_queryparams(request_group, suffix):"},{"line_number":286,"context_line":"            res \u003d request_group.resources"},{"line_number":287,"context_line":"            required_traits \u003d request_group.required_traits"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_ed25a75d","line":284,"range":{"start_line":283,"start_character":0,"end_line":284,"end_character":67},"updated":"2019-08-09 14:55:17.000000000","message":"Per this comment...","commit_id":"4d51c2aa2dd77cc2ce946c1a9b3976a7927940a5"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"f4061e82e59d1f5d0cf955a9c1cc7e8d48384b93","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        \"\"\""},{"line_number":281,"context_line":"        # TODO(gibi): We have a RequestGroup OVO so we can move this to that"},{"line_number":282,"context_line":"        # class as a member function."},{"line_number":283,"context_line":"        # NOTE(efried): The sorting herein is not necessary for the API; it is"},{"line_number":284,"context_line":"        # to make testing easier and logging/debugging predictable."},{"line_number":285,"context_line":"        def to_queryparams(request_group, suffix):"},{"line_number":286,"context_line":"            res \u003d request_group.resources"},{"line_number":287,"context_line":"            required_traits \u003d request_group.required_traits"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_14ada4e9","line":284,"range":{"start_line":283,"start_character":0,"end_line":284,"end_character":67},"in_reply_to":"7faddb67_ed25a75d","updated":"2019-08-10 09:26:40.000000000","message":"Thanks for this.","commit_id":"4d51c2aa2dd77cc2ce946c1a9b3976a7927940a5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"79cbd4e9c92e4ec3bf5b50b76cfaf781282d3818","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            if isolated_aggregates:"},{"line_number":316,"context_line":"                # member_ofN is a list of aggregate uuids. We need a"},{"line_number":317,"context_line":"                # tuple of (\u0027member_ofN, \u0027!in:uuid,uuid,...\u0027)."},{"line_number":318,"context_line":"                isolated_aggs \u003d \u0027!in:\u0027 + \u0027,\u0027.join(isolated_aggregates)"},{"line_number":319,"context_line":"                qs_params.append((\u0027member_of%s\u0027 % suffix, isolated_aggs))"},{"line_number":320,"context_line":"            return qs_params"},{"line_number":321,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_cd1c6b15","line":318,"range":{"start_line":318,"start_character":41,"end_line":318,"end_character":70},"updated":"2019-08-09 14:55:17.000000000","message":"...it\u0027s okay to make this\n\n \u0027,\u0027.join(sorted(isolated_aggregates))\n\nand then also sort when building your expected query in the test.","commit_id":"4d51c2aa2dd77cc2ce946c1a9b3976a7927940a5"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"f4061e82e59d1f5d0cf955a9c1cc7e8d48384b93","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            if isolated_aggregates:"},{"line_number":316,"context_line":"                # member_ofN is a list of aggregate uuids. We need a"},{"line_number":317,"context_line":"                # tuple of (\u0027member_ofN, \u0027!in:uuid,uuid,...\u0027)."},{"line_number":318,"context_line":"                isolated_aggs \u003d \u0027!in:\u0027 + \u0027,\u0027.join(isolated_aggregates)"},{"line_number":319,"context_line":"                qs_params.append((\u0027member_of%s\u0027 % suffix, isolated_aggs))"},{"line_number":320,"context_line":"            return qs_params"},{"line_number":321,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_54a31c01","line":318,"range":{"start_line":318,"start_character":41,"end_line":318,"end_character":70},"in_reply_to":"7faddb67_cd1c6b15","updated":"2019-08-10 09:26:40.000000000","message":"Done","commit_id":"4d51c2aa2dd77cc2ce946c1a9b3976a7927940a5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9f65f83c494027880f702f526220b11c3c36d6eb","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        \"\"\""},{"line_number":281,"context_line":"        # TODO(gibi): We have a RequestGroup OVO so we can move this to that"},{"line_number":282,"context_line":"        # class as a member function."},{"line_number":283,"context_line":"        # NOTE(efried): The sorting herein is not necessary for the API; it is"},{"line_number":284,"context_line":"        # to make testing easier and logging/debugging predictable."},{"line_number":285,"context_line":"        def to_queryparams(request_group, suffix):"},{"line_number":286,"context_line":"            res \u003d request_group.resources"},{"line_number":287,"context_line":"            required_traits \u003d request_group.required_traits"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_e6234ca6","line":284,"range":{"start_line":283,"start_character":0,"end_line":284,"end_character":67},"updated":"2019-08-13 22:54:23.000000000","message":"@melwitt ^","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"cafce6f4d203ae5f491f18815184f007696bfe4b","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        \"\"\""},{"line_number":281,"context_line":"        # TODO(gibi): We have a RequestGroup OVO so we can move this to that"},{"line_number":282,"context_line":"        # class as a member function."},{"line_number":283,"context_line":"        # NOTE(efried): The sorting herein is not necessary for the API; it is"},{"line_number":284,"context_line":"        # to make testing easier and logging/debugging predictable."},{"line_number":285,"context_line":"        def to_queryparams(request_group, suffix):"},{"line_number":286,"context_line":"            res \u003d request_group.resources"},{"line_number":287,"context_line":"            required_traits \u003d request_group.required_traits"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_e67fcc63","line":284,"range":{"start_line":283,"start_character":0,"end_line":284,"end_character":67},"in_reply_to":"7faddb67_e6234ca6","updated":"2019-08-13 23:07:39.000000000","message":"Oh, thanks. If it\u0027s for testing, we usually can either sort there or use set differences etc to verify things without depending on ordering. But if you want this for logging/debugging, fair enough.","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"29a4d594adfab42c2d128c1540026bc8075d5e36","unresolved":false,"context_lines":[{"line_number":280,"context_line":"        \"\"\""},{"line_number":281,"context_line":"        # TODO(gibi): We have a RequestGroup OVO so we can move this to that"},{"line_number":282,"context_line":"        # class as a member function."},{"line_number":283,"context_line":"        # NOTE(efried): The sorting herein is not necessary for the API; it is"},{"line_number":284,"context_line":"        # to make testing easier and logging/debugging predictable."},{"line_number":285,"context_line":"        def to_queryparams(request_group, suffix):"},{"line_number":286,"context_line":"            res \u003d request_group.resources"},{"line_number":287,"context_line":"            required_traits \u003d request_group.required_traits"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_148c9233","line":284,"range":{"start_line":283,"start_character":0,"end_line":284,"end_character":67},"in_reply_to":"7faddb67_e67fcc63","updated":"2019-08-14 02:49:29.000000000","message":"I agree in general and usually try to make the accommodation on the test side, but in this case it would entail parsing a query uri and then parsing the query string and then finding and parsing a component of that query string - effectively reversing the algorithm we used to build it in the first place. Which doesn\u0027t prove we built it right, just that we know how to reverse engineer it the same way we built it :(\n\nIt is not ideal, especially since there\u0027s a performance penalty to doing the sorting in the code. But I\u0027ve looked at this several times (including when I put that comment in) and always concluded this was the lesser evil. I would be delighted if you found a way to make it work otherwise.","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7d8d9435cd4b29bda00573e978e176986d77cac9","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            if isolated_aggregates:"},{"line_number":316,"context_line":"                # member_ofN is a list of aggregate uuids. We need a"},{"line_number":317,"context_line":"                # tuple of (\u0027member_ofN, \u0027!in:uuid,uuid,...\u0027)."},{"line_number":318,"context_line":"                isolated_aggs \u003d \u0027!in:\u0027 + \u0027,\u0027.join(sorted(isolated_aggregates))"},{"line_number":319,"context_line":"                qs_params.append((\u0027member_of%s\u0027 % suffix, isolated_aggs))"},{"line_number":320,"context_line":"            return qs_params"},{"line_number":321,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_de5a9e81","line":318,"updated":"2019-09-05 19:19:28.000000000","message":"I\u0027m guessing this should be in the patch where this code was added and not here. Since you\u0027re going to respin most of those (I think), this might as well go in there.","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":4690,"name":"melanie witt","display_name":"melwitt","email":"melwittt@gmail.com","username":"melwitt"},"change_message_id":"8b932e4eda17343acad40fd1e8660ade517ec46a","unresolved":false,"context_lines":[{"line_number":315,"context_line":"            if isolated_aggregates:"},{"line_number":316,"context_line":"                # member_ofN is a list of aggregate uuids. We need a"},{"line_number":317,"context_line":"                # tuple of (\u0027member_ofN, \u0027!in:uuid,uuid,...\u0027)."},{"line_number":318,"context_line":"                isolated_aggs \u003d \u0027!in:\u0027 + \u0027,\u0027.join(sorted(isolated_aggregates))"},{"line_number":319,"context_line":"                qs_params.append((\u0027member_of%s\u0027 % suffix, isolated_aggs))"},{"line_number":320,"context_line":"            return qs_params"},{"line_number":321,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_e3b9fe78","line":318,"updated":"2019-08-13 22:40:49.000000000","message":"Why do we need to sort the aggregates?","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"15c343ee2edb6f7c9d2323e4657c74770075944a","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                # member_ofN is a list of aggregate uuids. We need a"},{"line_number":315,"context_line":"                # tuple of (\u0027member_ofN, \u0027!in:uuid,uuid,...\u0027)."},{"line_number":316,"context_line":"                forbidden_aggs \u003d \u0027!in:\u0027 + \u0027,\u0027.join("},{"line_number":317,"context_line":"                    sorted(forbidden_aggregates))"},{"line_number":318,"context_line":"                qs_params.append((\u0027member_of%s\u0027 % suffix, forbidden_aggs))"},{"line_number":319,"context_line":"            return qs_params"},{"line_number":320,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_5b6a321b","line":317,"updated":"2019-08-29 16:32:39.000000000","message":"I was thinking this should have been there about two patches back. Here\u0027s good too","commit_id":"f25be6f8503aad0d1588669eb9076a078db4faca"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"14b401511658922d8dbc9e1aa5cd62a1430d577d","unresolved":false,"context_lines":[{"line_number":314,"context_line":"                # member_ofN is a list of aggregate uuids. We need a"},{"line_number":315,"context_line":"                # tuple of (\u0027member_ofN, \u0027!in:uuid,uuid,...\u0027)."},{"line_number":316,"context_line":"                forbidden_aggs \u003d \u0027!in:\u0027 + \u0027,\u0027.join("},{"line_number":317,"context_line":"                    sorted(forbidden_aggregates))"},{"line_number":318,"context_line":"                qs_params.append((\u0027member_of%s\u0027 % suffix, forbidden_aggs))"},{"line_number":319,"context_line":"            return qs_params"},{"line_number":320,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_1651e10e","line":317,"in_reply_to":"7faddb67_5b6a321b","updated":"2019-08-30 11:08:12.000000000","message":"Keeping here as is.","commit_id":"f25be6f8503aad0d1588669eb9076a078db4faca"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3f0c2a19cebdb44fc3066502980c5f1daa310a72","unresolved":false,"context_lines":[{"line_number":331,"context_line":"            if forbidden_aggregates:"},{"line_number":332,"context_line":"                # member_ofN is a list of aggregate uuids. We need a"},{"line_number":333,"context_line":"                # tuple of (\u0027member_ofN, \u0027!in:uuid,uuid,...\u0027)."},{"line_number":334,"context_line":"                forbidden_aggs \u003d \u0027!in:\u0027 + \u0027,\u0027.join("},{"line_number":335,"context_line":"                    sorted(forbidden_aggregates))"},{"line_number":336,"context_line":"                qs_params.append((\u0027member_of%s\u0027 % suffix, forbidden_aggs))"},{"line_number":337,"context_line":"            return qs_params"}],"source_content_type":"text/x-python","patch_set":22,"id":"7faddb67_d330d7a0","line":334,"updated":"2019-09-05 20:09:35.000000000","message":"This delta should go with the code that constructs the forbidden agg querystring.","commit_id":"730ad9a2a5188e0c3b281d8c649c2bcb4455e2f0"}],"nova/tests/functional/test_aggregates.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        server \u003d self._wait_for_state_change(created_server, \u0027BUILD\u0027)"},{"line_number":174,"context_line":"        return server"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def _create_server_with_traits(self, flavor_id, image_id):"},{"line_number":177,"context_line":"        \"\"\"Create a server with given flavor and image id\u0027s"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        :param flavor_id: the flavor id"},{"line_number":180,"context_line":"        :param image_id: the image id"},{"line_number":181,"context_line":"        :return: create server response"},{"line_number":182,"context_line":"        \"\"\""},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        server_req \u003d self._build_minimal_create_server_request("},{"line_number":185,"context_line":"            self.api, \u0027trait-based-server\u0027,"},{"line_number":186,"context_line":"            image_uuid\u003dimage_id,"},{"line_number":187,"context_line":"            flavor_id\u003dflavor_id, networks\u003d\u0027none\u0027)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        created_server \u003d self.api.post_server({\u0027server\u0027: server_req})"},{"line_number":190,"context_line":"        server \u003d self._wait_for_state_change(created_server, \u0027BUILD\u0027)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        return server"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def _create_server_with_traits_and_az(self, flavor_id, az\u003dNone):"},{"line_number":195,"context_line":"        \"\"\"Create a server with given flavor and availability zone"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        :param flavor_id: the flavor id"},{"line_number":198,"context_line":"        :param az: availability zone"},{"line_number":199,"context_line":"        :return: create server response"},{"line_number":200,"context_line":"        \"\"\""},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        server_req \u003d self._build_minimal_create_server_request("},{"line_number":203,"context_line":"            self.api, \u0027trait-based-server\u0027,"},{"line_number":204,"context_line":"            image_uuid\u003d\u0027155d900f-4e14-4e4c-a73d-069cbf4541e6\u0027,"},{"line_number":205,"context_line":"            flavor_id\u003dflavor_id, networks\u003d\u0027none\u0027, az\u003daz)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        created_server \u003d self.api.post_server({\u0027server\u0027: server_req})"},{"line_number":208,"context_line":"        server \u003d self._wait_for_state_change(created_server, \u0027BUILD\u0027)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        return server"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def _set_provider_traits(self, rp_uuid, traits):"},{"line_number":213,"context_line":"        \"\"\"This will overwrite any existing traits."}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_85dd5ede","line":210,"range":{"start_line":176,"start_character":0,"end_line":210,"end_character":21},"updated":"2019-06-27 17:19:59.000000000","message":"You should be able to DRY these into _boot_server above with judicious use of kwargs.","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        server \u003d self._wait_for_state_change(created_server, \u0027BUILD\u0027)"},{"line_number":174,"context_line":"        return server"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def _create_server_with_traits(self, flavor_id, image_id):"},{"line_number":177,"context_line":"        \"\"\"Create a server with given flavor and image id\u0027s"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        :param flavor_id: the flavor id"},{"line_number":180,"context_line":"        :param image_id: the image id"},{"line_number":181,"context_line":"        :return: create server response"},{"line_number":182,"context_line":"        \"\"\""},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        server_req \u003d self._build_minimal_create_server_request("},{"line_number":185,"context_line":"            self.api, \u0027trait-based-server\u0027,"},{"line_number":186,"context_line":"            image_uuid\u003dimage_id,"},{"line_number":187,"context_line":"            flavor_id\u003dflavor_id, networks\u003d\u0027none\u0027)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"        created_server \u003d self.api.post_server({\u0027server\u0027: server_req})"},{"line_number":190,"context_line":"        server \u003d self._wait_for_state_change(created_server, \u0027BUILD\u0027)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"        return server"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def _create_server_with_traits_and_az(self, flavor_id, az\u003dNone):"},{"line_number":195,"context_line":"        \"\"\"Create a server with given flavor and availability zone"},{"line_number":196,"context_line":""},{"line_number":197,"context_line":"        :param flavor_id: the flavor id"},{"line_number":198,"context_line":"        :param az: availability zone"},{"line_number":199,"context_line":"        :return: create server response"},{"line_number":200,"context_line":"        \"\"\""},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"        server_req \u003d self._build_minimal_create_server_request("},{"line_number":203,"context_line":"            self.api, \u0027trait-based-server\u0027,"},{"line_number":204,"context_line":"            image_uuid\u003d\u0027155d900f-4e14-4e4c-a73d-069cbf4541e6\u0027,"},{"line_number":205,"context_line":"            flavor_id\u003dflavor_id, networks\u003d\u0027none\u0027, az\u003daz)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"        created_server \u003d self.api.post_server({\u0027server\u0027: server_req})"},{"line_number":208,"context_line":"        server \u003d self._wait_for_state_change(created_server, \u0027BUILD\u0027)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"        return server"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":"    def _set_provider_traits(self, rp_uuid, traits):"},{"line_number":213,"context_line":"        \"\"\"This will overwrite any existing traits."}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_f2e90680","line":210,"range":{"start_line":176,"start_character":0,"end_line":210,"end_character":21},"in_reply_to":"9fb8cfa7_85dd5ede","updated":"2019-07-08 12:48:59.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        }"},{"line_number":280,"context_line":"        self.admin_api.post_aggregate_action(agg[\u0027id\u0027], action)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def _set_traits_to_aggregate(self, agg, trait1\u003dNone, trait2\u003dNone):"},{"line_number":283,"context_line":"        \"\"\"\"Set traits to aggregate."},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        :param agg: Name of the nova aggregate"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_a5b3c297","line":282,"updated":"2019-06-27 17:19:59.000000000","message":"Why not\n\n def _set_traits_on_aggregate(self, agg, traits):\n     action \u003d {\n         \u0027set_metadata\u0027: {\n             \u0027metadata\u0027: {\n                 \u0027trait: \u0027 + trait: \u0027required\u0027\n                 for trait in traits\n             }\n         }\n     }\n     self.admin_api.post_aggregate_action(\n         self.aggregates[agg][\u0027id\u0027], action)","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        }"},{"line_number":280,"context_line":"        self.admin_api.post_aggregate_action(agg[\u0027id\u0027], action)"},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"    def _set_traits_to_aggregate(self, agg, trait1\u003dNone, trait2\u003dNone):"},{"line_number":283,"context_line":"        \"\"\"\"Set traits to aggregate."},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"        :param agg: Name of the nova aggregate"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_b2038e42","line":282,"in_reply_to":"9fb8cfa7_a5b3c297","updated":"2019-07-08 12:48:59.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":516,"context_line":"                                  }}"},{"line_number":517,"context_line":"        self.flavor_with_trait \u003d self.api.post_flavor(flavor_body)"},{"line_number":518,"context_line":"        self.admin_api.post_extra_spec("},{"line_number":519,"context_line":"            self.flavor_with_trait[\u0027id\u0027],"},{"line_number":520,"context_line":"            {\u0027extra_specs\u0027: {\u0027trait:HW_GPU_API_DXVA\u0027: \u0027required\u0027}})"},{"line_number":521,"context_line":"        flavor_body1 \u003d {\u0027flavor\u0027: {\u0027name\u0027: \u0027test_flavor1\u0027,"},{"line_number":522,"context_line":"                                   \u0027ram\u0027: 512,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_08e8a3b0","line":519,"range":{"start_line":519,"start_character":17,"end_line":519,"end_character":34},"updated":"2019-06-27 17:19:59.000000000","message":"given how these are used, it would be easier to read the tests if they were named e.g. self.flavor_with_trait_dxva and self.flavor_with_trait_sgx","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":516,"context_line":"                                  }}"},{"line_number":517,"context_line":"        self.flavor_with_trait \u003d self.api.post_flavor(flavor_body)"},{"line_number":518,"context_line":"        self.admin_api.post_extra_spec("},{"line_number":519,"context_line":"            self.flavor_with_trait[\u0027id\u0027],"},{"line_number":520,"context_line":"            {\u0027extra_specs\u0027: {\u0027trait:HW_GPU_API_DXVA\u0027: \u0027required\u0027}})"},{"line_number":521,"context_line":"        flavor_body1 \u003d {\u0027flavor\u0027: {\u0027name\u0027: \u0027test_flavor1\u0027,"},{"line_number":522,"context_line":"                                   \u0027ram\u0027: 512,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_32955ee5","line":519,"range":{"start_line":519,"start_character":17,"end_line":519,"end_character":34},"in_reply_to":"9fb8cfa7_08e8a3b0","updated":"2019-07-08 12:48:59.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":518,"context_line":"        self.admin_api.post_extra_spec("},{"line_number":519,"context_line":"            self.flavor_with_trait[\u0027id\u0027],"},{"line_number":520,"context_line":"            {\u0027extra_specs\u0027: {\u0027trait:HW_GPU_API_DXVA\u0027: \u0027required\u0027}})"},{"line_number":521,"context_line":"        flavor_body1 \u003d {\u0027flavor\u0027: {\u0027name\u0027: \u0027test_flavor1\u0027,"},{"line_number":522,"context_line":"                                   \u0027ram\u0027: 512,"},{"line_number":523,"context_line":"                                   \u0027vcpus\u0027: 1,"},{"line_number":524,"context_line":"                                   \u0027disk\u0027: 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_45368605","line":521,"range":{"start_line":521,"start_character":8,"end_line":521,"end_character":20},"updated":"2019-06-27 17:19:59.000000000","message":"nit: no need for a new local var here","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":518,"context_line":"        self.admin_api.post_extra_spec("},{"line_number":519,"context_line":"            self.flavor_with_trait[\u0027id\u0027],"},{"line_number":520,"context_line":"            {\u0027extra_specs\u0027: {\u0027trait:HW_GPU_API_DXVA\u0027: \u0027required\u0027}})"},{"line_number":521,"context_line":"        flavor_body1 \u003d {\u0027flavor\u0027: {\u0027name\u0027: \u0027test_flavor1\u0027,"},{"line_number":522,"context_line":"                                   \u0027ram\u0027: 512,"},{"line_number":523,"context_line":"                                   \u0027vcpus\u0027: 1,"},{"line_number":524,"context_line":"                                   \u0027disk\u0027: 1"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_529a5a14","line":521,"range":{"start_line":521,"start_character":8,"end_line":521,"end_character":20},"in_reply_to":"9fb8cfa7_45368605","updated":"2019-07-08 12:48:59.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":532,"context_line":"        with nova.utils.temporary_mutation(self.api, microversion\u003d\u00272.35\u0027):"},{"line_number":533,"context_line":"            images \u003d self.api.get_images()"},{"line_number":534,"context_line":"            self.image_id_without_trait \u003d images[0][\u0027id\u0027]"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"    def test_filter_without_trait(self):"},{"line_number":537,"context_line":"        rp_uuid1 \u003d self._get_provider_uuid_by_host(\u0027host1\u0027)"},{"line_number":538,"context_line":"        self._set_provider_traits(rp_uuid1, [\u0027HW_CPU_X86_VMX\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_0858a32e","line":535,"updated":"2019-06-27 17:19:59.000000000","message":"These tests would benefit from a weigher that would prefer host1 if the forbidden aggregate filter were not in place. Otherwise it\u0027s not deterministic whether we\u0027re landing on host2 because of the filter or just by chance.\n\nSee examples using HostNameWeigher e.g. in AvailabilityZoneFilterTest (L484).","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":532,"context_line":"        with nova.utils.temporary_mutation(self.api, microversion\u003d\u00272.35\u0027):"},{"line_number":533,"context_line":"            images \u003d self.api.get_images()"},{"line_number":534,"context_line":"            self.image_id_without_trait \u003d images[0][\u0027id\u0027]"},{"line_number":535,"context_line":""},{"line_number":536,"context_line":"    def test_filter_without_trait(self):"},{"line_number":537,"context_line":"        rp_uuid1 \u003d self._get_provider_uuid_by_host(\u0027host1\u0027)"},{"line_number":538,"context_line":"        self._set_provider_traits(rp_uuid1, [\u0027HW_CPU_X86_VMX\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_f29ee605","line":535,"in_reply_to":"9fb8cfa7_0858a32e","updated":"2019-07-08 12:48:59.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":537,"context_line":"        rp_uuid1 \u003d self._get_provider_uuid_by_host(\u0027host1\u0027)"},{"line_number":538,"context_line":"        self._set_provider_traits(rp_uuid1, [\u0027HW_CPU_X86_VMX\u0027,"},{"line_number":539,"context_line":"                                             \u0027HW_CPU_X86_SGX\u0027])"},{"line_number":540,"context_line":"        self._set_traits_to_aggregate(\u0027only-host2\u0027)"},{"line_number":541,"context_line":"        self._set_traits_to_aggregate(\u0027only-host1\u0027, \u0027HW_CPU_X86_VMX\u0027,"},{"line_number":542,"context_line":"                                      \u0027HW_CPU_X86_SGX\u0027)"},{"line_number":543,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_c8912b54","line":540,"range":{"start_line":540,"start_character":8,"end_line":540,"end_character":51},"updated":"2019-06-27 17:19:59.000000000","message":"this is a no-op","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":537,"context_line":"        rp_uuid1 \u003d self._get_provider_uuid_by_host(\u0027host1\u0027)"},{"line_number":538,"context_line":"        self._set_provider_traits(rp_uuid1, [\u0027HW_CPU_X86_VMX\u0027,"},{"line_number":539,"context_line":"                                             \u0027HW_CPU_X86_SGX\u0027])"},{"line_number":540,"context_line":"        self._set_traits_to_aggregate(\u0027only-host2\u0027)"},{"line_number":541,"context_line":"        self._set_traits_to_aggregate(\u0027only-host1\u0027, \u0027HW_CPU_X86_VMX\u0027,"},{"line_number":542,"context_line":"                                      \u0027HW_CPU_X86_SGX\u0027)"},{"line_number":543,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_12a4e256","line":540,"range":{"start_line":540,"start_character":8,"end_line":540,"end_character":51},"in_reply_to":"9fb8cfa7_c8912b54","updated":"2019-07-08 12:48:59.000000000","message":"removed","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":601,"context_line":"        server \u003d self._create_server_with_traits(self.flavor_with_trait1[\u0027id\u0027],"},{"line_number":602,"context_line":"                                                 image_id_with_trait)"},{"line_number":603,"context_line":"        self.assertEqual(\u0027host2\u0027, self._get_instance_host(server))"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":""},{"line_number":606,"context_line":"class TestAggregateFiltersTogether(AggregateRequestFiltersTest):"},{"line_number":607,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_28332716","line":604,"updated":"2019-06-27 17:19:59.000000000","message":"How about a test where we bounce with NoValidHosts because the flavor and/or image doesn\u0027t require (all) the right trait(s) to land in any aggregate?","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":601,"context_line":"        server \u003d self._create_server_with_traits(self.flavor_with_trait1[\u0027id\u0027],"},{"line_number":602,"context_line":"                                                 image_id_with_trait)"},{"line_number":603,"context_line":"        self.assertEqual(\u0027host2\u0027, self._get_instance_host(server))"},{"line_number":604,"context_line":""},{"line_number":605,"context_line":""},{"line_number":606,"context_line":"class TestAggregateFiltersTogether(AggregateRequestFiltersTest):"},{"line_number":607,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_7292f6f8","line":604,"in_reply_to":"9fb8cfa7_28332716","updated":"2019-07-08 12:48:59.000000000","message":"added \u0027test_filter_with_no_valid_host\u0027 to cover up mentioned scenario.","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":657,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":658,"context_line":"        self.assertEqual(\u0027ERROR\u0027, server[\u0027status\u0027])"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    def test_tenant_with_az_and_traits_match(self):"},{"line_number":661,"context_line":"        # Grant our tenant access to the aggregate with host2"},{"line_number":662,"context_line":"        self._grant_tenant_aggregate(\u0027only-host2\u0027,"},{"line_number":663,"context_line":"                                     [self.api.project_id])"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_1358d42e","line":660,"updated":"2019-06-27 17:19:59.000000000","message":"again the weigher would be nice here\n\ntheoretically you should be able to retrofit it in setUp and have existing tests continue to Just Work","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":657,"context_line":"        server \u003d self.api.get_server(server[\u0027id\u0027])"},{"line_number":658,"context_line":"        self.assertEqual(\u0027ERROR\u0027, server[\u0027status\u0027])"},{"line_number":659,"context_line":""},{"line_number":660,"context_line":"    def test_tenant_with_az_and_traits_match(self):"},{"line_number":661,"context_line":"        # Grant our tenant access to the aggregate with host2"},{"line_number":662,"context_line":"        self._grant_tenant_aggregate(\u0027only-host2\u0027,"},{"line_number":663,"context_line":"                                     [self.api.project_id])"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_928f72cb","line":660,"in_reply_to":"9fb8cfa7_1358d42e","updated":"2019-07-08 12:48:59.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"806b6a02d408a1e36fce3c08f64de62424306d01","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        self.flags(weight_classes\u003d[__name__ + \u0027.HostNameWeigher\u0027],"},{"line_number":471,"context_line":"                   group\u003d\u0027filter_scheduler\u0027)"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"        filters \u003d CONF.filter_scheduler.enabled_filters"},{"line_number":474,"context_line":"        if \u0027AggregateImagePropertiesIsolation\u0027 in filters:"},{"line_number":475,"context_line":"            filters.remove(\u0027AggregateImagePropertiesIsolation\u0027)"},{"line_number":476,"context_line":"        if \u0027AggregateInstanceExtraSpecsFilter\u0027 in filters:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_9a0ba18c","line":473,"updated":"2019-07-31 18:22:14.000000000","message":"A comment about why these other filters are removed would be good.","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"4653cc9ef28981a93baeefe7e1ae2f5256135c0b","unresolved":false,"context_lines":[{"line_number":470,"context_line":"        self.flags(weight_classes\u003d[__name__ + \u0027.HostNameWeigher\u0027],"},{"line_number":471,"context_line":"                   group\u003d\u0027filter_scheduler\u0027)"},{"line_number":472,"context_line":""},{"line_number":473,"context_line":"        filters \u003d CONF.filter_scheduler.enabled_filters"},{"line_number":474,"context_line":"        if \u0027AggregateImagePropertiesIsolation\u0027 in filters:"},{"line_number":475,"context_line":"            filters.remove(\u0027AggregateImagePropertiesIsolation\u0027)"},{"line_number":476,"context_line":"        if \u0027AggregateInstanceExtraSpecsFilter\u0027 in filters:"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_bb707b0a","line":473,"in_reply_to":"7faddb67_9a0ba18c","updated":"2019-08-07 13:07:49.000000000","message":"Done","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"806b6a02d408a1e36fce3c08f64de62424306d01","unresolved":false,"context_lines":[{"line_number":500,"context_line":"            images \u003d self.api.get_images()"},{"line_number":501,"context_line":"            self.image_id_without_trait \u003d images[0][\u0027id\u0027]"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"    def test_filter_with_no_valid_host(self):"},{"line_number":504,"context_line":"        rp_uuid1 \u003d self._get_provider_uuid_by_host(\u0027host1\u0027)"},{"line_number":505,"context_line":"        self._set_provider_traits(rp_uuid1, [\u0027HW_CPU_X86_VMX\u0027,"},{"line_number":506,"context_line":"                                             \u0027HW_CPU_X86_SGX\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_1ac9f157","line":503,"range":{"start_line":503,"start_character":8,"end_line":503,"end_character":38},"updated":"2019-07-31 18:22:14.000000000","message":"Comments in the tests would go a long way in understanding and following them.","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"4653cc9ef28981a93baeefe7e1ae2f5256135c0b","unresolved":false,"context_lines":[{"line_number":500,"context_line":"            images \u003d self.api.get_images()"},{"line_number":501,"context_line":"            self.image_id_without_trait \u003d images[0][\u0027id\u0027]"},{"line_number":502,"context_line":""},{"line_number":503,"context_line":"    def test_filter_with_no_valid_host(self):"},{"line_number":504,"context_line":"        rp_uuid1 \u003d self._get_provider_uuid_by_host(\u0027host1\u0027)"},{"line_number":505,"context_line":"        self._set_provider_traits(rp_uuid1, [\u0027HW_CPU_X86_VMX\u0027,"},{"line_number":506,"context_line":"                                             \u0027HW_CPU_X86_SGX\u0027])"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_5b5f0775","line":503,"range":{"start_line":503,"start_character":8,"end_line":503,"end_character":38},"in_reply_to":"7faddb67_1ac9f157","updated":"2019-08-07 13:07:49.000000000","message":"Done","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f436d46304e208741879c842c76a1416ff350e56","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        return server"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def _set_provider_traits(self, rp_uuid, traits):"},{"line_number":177,"context_line":"        \"\"\"This will overwrite any existing traits."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        :param rp_uuid: UUID of the resource provider to update"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_c042ad0f","line":176,"updated":"2019-08-14 12:04:14.000000000","message":"nit: The ProviderUsageBaseTestCase functional test base class already has this helpers.","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"43068c3c06a7d535efc59e646bfc5459175603ae","unresolved":false,"context_lines":[{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        return server"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    def _set_provider_traits(self, rp_uuid, traits):"},{"line_number":177,"context_line":"        \"\"\"This will overwrite any existing traits."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        :param rp_uuid: UUID of the resource provider to update"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_60b88b10","line":176,"in_reply_to":"7faddb67_c042ad0f","updated":"2019-08-15 00:26:57.000000000","message":"Done","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f436d46304e208741879c842c76a1416ff350e56","unresolved":false,"context_lines":[{"line_number":463,"context_line":"        self.flags(enable_isolated_aggregate_filtering\u003dTrue,"},{"line_number":464,"context_line":"                   group\u003d\u0027scheduler\u0027)"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"        # Use a custom weigher that would prefer host1 if the forbidden"},{"line_number":467,"context_line":"        # aggregate filter were not in place otherwise it\u0027s not deterministic"},{"line_number":468,"context_line":"        # whether we\u0027re landing on host2 because of the filter or just by"},{"line_number":469,"context_line":"        # chance."}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_e05ec9e7","line":466,"range":{"start_line":466,"start_character":62,"end_line":466,"end_character":71},"updated":"2019-08-14 12:04:14.000000000","message":"isolate","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"43068c3c06a7d535efc59e646bfc5459175603ae","unresolved":false,"context_lines":[{"line_number":463,"context_line":"        self.flags(enable_isolated_aggregate_filtering\u003dTrue,"},{"line_number":464,"context_line":"                   group\u003d\u0027scheduler\u0027)"},{"line_number":465,"context_line":""},{"line_number":466,"context_line":"        # Use a custom weigher that would prefer host1 if the forbidden"},{"line_number":467,"context_line":"        # aggregate filter were not in place otherwise it\u0027s not deterministic"},{"line_number":468,"context_line":"        # whether we\u0027re landing on host2 because of the filter or just by"},{"line_number":469,"context_line":"        # chance."}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_203cd391","line":466,"range":{"start_line":466,"start_character":62,"end_line":466,"end_character":71},"in_reply_to":"7faddb67_e05ec9e7","updated":"2019-08-15 00:26:57.000000000","message":"Done","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f436d46304e208741879c842c76a1416ff350e56","unresolved":false,"context_lines":[{"line_number":472,"context_line":""},{"line_number":473,"context_line":"        filters \u003d CONF.filter_scheduler.enabled_filters"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"        # NOTE(shilpasd): To test `isolate_aggregates` request filter, removed"},{"line_number":476,"context_line":"        # following filters which also filters hosts based on aggregate"},{"line_number":477,"context_line":"        # metadata."},{"line_number":478,"context_line":"        if \u0027AggregateImagePropertiesIsolation\u0027 in filters:"},{"line_number":479,"context_line":"            filters.remove(\u0027AggregateImagePropertiesIsolation\u0027)"},{"line_number":480,"context_line":"        if \u0027AggregateInstanceExtraSpecsFilter\u0027 in filters:"},{"line_number":481,"context_line":"            filters.remove(\u0027AggregateInstanceExtraSpecsFilter\u0027)"},{"line_number":482,"context_line":"        self.flags(enabled_filters\u003dfilters, group\u003d\u0027filter_scheduler\u0027)"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"        super(IsolateAggregateFilterTest, self).setUp()"},{"line_number":485,"context_line":"        self.image_service \u003d nova.tests.unit.image.fake.FakeImageService()"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_c0106d03","line":482,"range":{"start_line":475,"start_character":0,"end_line":482,"end_character":69},"updated":"2019-08-14 12:04:14.000000000","message":"Are these filters also interfere with the request filter in a real deployment? If yes then I think we should document that so the admin will know that these needs to be disable if the request filter is enabled.","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"43068c3c06a7d535efc59e646bfc5459175603ae","unresolved":false,"context_lines":[{"line_number":472,"context_line":""},{"line_number":473,"context_line":"        filters \u003d CONF.filter_scheduler.enabled_filters"},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"        # NOTE(shilpasd): To test `isolate_aggregates` request filter, removed"},{"line_number":476,"context_line":"        # following filters which also filters hosts based on aggregate"},{"line_number":477,"context_line":"        # metadata."},{"line_number":478,"context_line":"        if \u0027AggregateImagePropertiesIsolation\u0027 in filters:"},{"line_number":479,"context_line":"            filters.remove(\u0027AggregateImagePropertiesIsolation\u0027)"},{"line_number":480,"context_line":"        if \u0027AggregateInstanceExtraSpecsFilter\u0027 in filters:"},{"line_number":481,"context_line":"            filters.remove(\u0027AggregateInstanceExtraSpecsFilter\u0027)"},{"line_number":482,"context_line":"        self.flags(enabled_filters\u003dfilters, group\u003d\u0027filter_scheduler\u0027)"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"        super(IsolateAggregateFilterTest, self).setUp()"},{"line_number":485,"context_line":"        self.image_service \u003d nova.tests.unit.image.fake.FakeImageService()"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_804a6724","line":482,"range":{"start_line":475,"start_character":0,"end_line":482,"end_character":69},"in_reply_to":"7faddb67_c0106d03","updated":"2019-08-15 00:26:57.000000000","message":"NO, to test filter purely added this","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3f0c2a19cebdb44fc3066502980c5f1daa310a72","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"7faddb67_73ad6382","updated":"2019-09-05 20:09:35.000000000","message":"These tests can go with the request filter (given that the conf knob is moving there too).","commit_id":"730ad9a2a5188e0c3b281d8c649c2bcb4455e2f0"}],"nova/tests/unit/objects/test_aggregate.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":229,"context_line":"        get_by_metadata_key.return_value \u003d [fake_aggregate]"},{"line_number":230,"context_line":"        aggs \u003d aggregate.AggregateList.get_by_metadata("},{"line_number":231,"context_line":"            self.context, value\u003d\u0027that\u0027)"},{"line_number":232,"context_line":"        self.assertEqual(1, len(aggs))"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    @mock.patch(\u0027nova.objects.aggregate._get_by_metadata_from_db\u0027)"},{"line_number":235,"context_line":"    def test_get_by_metadata_key_and_hosts_no_match(self, get_by_metadata_key):"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_1371b4a8","line":232,"updated":"2019-06-27 17:19:59.000000000","message":"probably overkill, but wouldn\u0027t hurt to assert it\u0027s the right one","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"}],"nova/tests/unit/objects/test_request_spec.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"7d8d9435cd4b29bda00573e978e176986d77cac9","unresolved":false,"context_lines":[{"line_number":1050,"context_line":"        self.assertNotIn(\u0027provider_uuids\u0027, primitive)"},{"line_number":1051,"context_line":"        self.assertIn(\u0027required_traits\u0027, primitive)"},{"line_number":1052,"context_line":""},{"line_number":1053,"context_line":"    def test_obj_make_compatible_request_group_with_forbidden_aggs(self):"},{"line_number":1054,"context_line":"        obj \u003d objects.RequestGroup("},{"line_number":1055,"context_line":"            self.context,"},{"line_number":1056,"context_line":"            use_same_provider\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":21,"id":"7faddb67_78a6a2c2","line":1053,"updated":"2019-09-05 19:19:28.000000000","message":"This is an unnecessary change.","commit_id":"a971b5e72f4f2a23bc358cd535f85f8fe9b7d950"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"3f0c2a19cebdb44fc3066502980c5f1daa310a72","unresolved":false,"context_lines":[{"line_number":1050,"context_line":"        self.assertNotIn(\u0027provider_uuids\u0027, primitive)"},{"line_number":1051,"context_line":"        self.assertIn(\u0027required_traits\u0027, primitive)"},{"line_number":1052,"context_line":""},{"line_number":1053,"context_line":"    def test_obj_make_compatible_request_group_with_forbidden_aggs(self):"},{"line_number":1054,"context_line":"        obj \u003d objects.RequestGroup("},{"line_number":1055,"context_line":"            self.context,"},{"line_number":1056,"context_line":"            use_same_provider\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7faddb67_73d80351","line":1053,"updated":"2019-09-05 20:09:35.000000000","message":"This delta (if needed at all) should go in the patch where this test was introduced.","commit_id":"730ad9a2a5188e0c3b281d8c649c2bcb4455e2f0"}],"nova/tests/unit/scheduler/client/test_report.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"87f1b858c2edd2b15c6de66bdeafebb7fee8384f","unresolved":false,"context_lines":[{"line_number":2087,"context_line":"        expected_query \u003d ["},{"line_number":2088,"context_line":"            (\u0027group_policy\u0027, \u0027isolate\u0027),"},{"line_number":2089,"context_line":"            (\u0027limit\u0027, \u00271000\u0027),"},{"line_number":2090,"context_line":"            (\u0027member_of\u0027, \u0027!in:\u0027 + \u0027,\u0027.join(str(agg) for agg in isolated_agg)),"},{"line_number":2091,"context_line":"            (\u0027member_of\u0027, \u0027in:agg1,agg2\u0027),"},{"line_number":2092,"context_line":"            (\u0027member_of\u0027, \u0027in:agg1,agg2,agg3\u0027),"},{"line_number":2093,"context_line":"            (\u0027required\u0027, \u0027CUSTOM_TRAIT1,HW_CPU_X86_AVX,!CUSTOM_TRAIT3,\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_31f80b48","line":2090,"range":{"start_line":2090,"start_character":35,"end_line":2090,"end_character":77},"updated":"2019-08-08 21:44:52.000000000","message":"oh, we need to make this have a predictable order :(","commit_id":"4d51c2aa2dd77cc2ce946c1a9b3976a7927940a5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"79cbd4e9c92e4ec3bf5b50b76cfaf781282d3818","unresolved":false,"context_lines":[{"line_number":2087,"context_line":"        expected_query \u003d ["},{"line_number":2088,"context_line":"            (\u0027group_policy\u0027, \u0027isolate\u0027),"},{"line_number":2089,"context_line":"            (\u0027limit\u0027, \u00271000\u0027),"},{"line_number":2090,"context_line":"            (\u0027member_of\u0027, \u0027!in:\u0027 + \u0027,\u0027.join(str(agg) for agg in isolated_agg)),"},{"line_number":2091,"context_line":"            (\u0027member_of\u0027, \u0027in:agg1,agg2\u0027),"},{"line_number":2092,"context_line":"            (\u0027member_of\u0027, \u0027in:agg1,agg2,agg3\u0027),"},{"line_number":2093,"context_line":"            (\u0027required\u0027, \u0027CUSTOM_TRAIT1,HW_CPU_X86_AVX,!CUSTOM_TRAIT3,\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_edda8749","line":2090,"range":{"start_line":2090,"start_character":35,"end_line":2090,"end_character":77},"in_reply_to":"7faddb67_31f80b48","updated":"2019-08-09 14:55:17.000000000","message":"See comments in [1], and make this\n\n \u0027,\u0027.join(sorted(isolated_agg))\n\n[1] https://review.opendev.org/#/c/667952/14/nova/scheduler/utils.py","commit_id":"4d51c2aa2dd77cc2ce946c1a9b3976a7927940a5"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"f4061e82e59d1f5d0cf955a9c1cc7e8d48384b93","unresolved":false,"context_lines":[{"line_number":2087,"context_line":"        expected_query \u003d ["},{"line_number":2088,"context_line":"            (\u0027group_policy\u0027, \u0027isolate\u0027),"},{"line_number":2089,"context_line":"            (\u0027limit\u0027, \u00271000\u0027),"},{"line_number":2090,"context_line":"            (\u0027member_of\u0027, \u0027!in:\u0027 + \u0027,\u0027.join(str(agg) for agg in isolated_agg)),"},{"line_number":2091,"context_line":"            (\u0027member_of\u0027, \u0027in:agg1,agg2\u0027),"},{"line_number":2092,"context_line":"            (\u0027member_of\u0027, \u0027in:agg1,agg2,agg3\u0027),"},{"line_number":2093,"context_line":"            (\u0027required\u0027, \u0027CUSTOM_TRAIT1,HW_CPU_X86_AVX,!CUSTOM_TRAIT3,\u0027"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_74a65812","line":2090,"range":{"start_line":2090,"start_character":35,"end_line":2090,"end_character":77},"in_reply_to":"7faddb67_edda8749","updated":"2019-08-10 09:26:40.000000000","message":"Done","commit_id":"4d51c2aa2dd77cc2ce946c1a9b3976a7927940a5"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"9f65f83c494027880f702f526220b11c3c36d6eb","unresolved":false,"context_lines":[{"line_number":2087,"context_line":"        expected_query \u003d ["},{"line_number":2088,"context_line":"            (\u0027group_policy\u0027, \u0027isolate\u0027),"},{"line_number":2089,"context_line":"            (\u0027limit\u0027, \u00271000\u0027),"},{"line_number":2090,"context_line":"            (\u0027member_of\u0027, \u0027!in:\u0027 + \u0027,\u0027.join(sorted(isolated_agg))),"},{"line_number":2091,"context_line":"            (\u0027member_of\u0027, \u0027in:agg1,agg2\u0027),"},{"line_number":2092,"context_line":"            (\u0027member_of\u0027, \u0027in:agg1,agg2,agg3\u0027),"},{"line_number":2093,"context_line":"            (\u0027required\u0027, \u0027CUSTOM_TRAIT1,HW_CPU_X86_AVX,!CUSTOM_TRAIT3,\u0027"}],"source_content_type":"text/x-python","patch_set":16,"id":"7faddb67_863a98ca","line":2090,"range":{"start_line":2090,"start_character":39,"end_line":2090,"end_character":65},"updated":"2019-08-13 22:54:23.000000000","message":"@melwitt: If we didn\u0027t sort them on the source side, it would be really hard to validate this.","commit_id":"3fda0cb739c0c3295da6e96a50c0594624fea6c5"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"15c343ee2edb6f7c9d2323e4657c74770075944a","unresolved":false,"context_lines":[{"line_number":2162,"context_line":"            expected_query)"},{"line_number":2163,"context_line":"        self.assertEqual(mock.sentinel.alloc_reqs, alloc_reqs)"},{"line_number":2164,"context_line":"        self.ks_adap_mock.get.assert_called_once_with("},{"line_number":2165,"context_line":"            expected_url, microversion\u003d\u00271.32\u0027,"},{"line_number":2166,"context_line":"            global_request_id\u003dself.context.global_id)"},{"line_number":2167,"context_line":"        self.assertEqual(mock.sentinel.p_sums, p_sums)"},{"line_number":2168,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_bb9fa600","line":2165,"range":{"start_line":2165,"start_character":39,"end_line":2165,"end_character":45},"updated":"2019-08-29 16:32:39.000000000","message":"nice cleanup for later: Set this to NEGATIVE_MEMBER_OF_VERSION ?","commit_id":"f25be6f8503aad0d1588669eb9076a078db4faca"}],"nova/tests/unit/scheduler/test_request_filter.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        self.assertEqual("},{"line_number":139,"context_line":"            \u0027,\u0027.join(sorted([uuids.agg1, uuids.agg2, uuids.agg4])),"},{"line_number":140,"context_line":"            \u0027,\u0027.join(sorted("},{"line_number":141,"context_line":"            reqspec.requested_destination.forbidden_aggregates)))"},{"line_number":142,"context_line":"        getmd.assert_called_once_with(self.context, value\u003d\u0027required\u0027)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    @mock.patch(\u0027nova.objects.AggregateList.get_by_metadata\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_f3a2e0fb","line":141,"updated":"2019-06-27 17:19:59.000000000","message":"++","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"aacc3bebab4604450518fd95f99f475c6c2c5bd2","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        self.assertEqual("},{"line_number":139,"context_line":"            \u0027,\u0027.join(sorted([uuids.agg1, uuids.agg2, uuids.agg4])),"},{"line_number":140,"context_line":"            \u0027,\u0027.join(sorted("},{"line_number":141,"context_line":"            reqspec.requested_destination.forbidden_aggregates)))"},{"line_number":142,"context_line":"        getmd.assert_called_once_with(self.context, value\u003d\u0027required\u0027)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    @mock.patch(\u0027nova.objects.AggregateList.get_by_metadata\u0027)"}],"source_content_type":"text/x-python","patch_set":1,"id":"7faddb67_72abd61c","line":141,"in_reply_to":"9fb8cfa7_f3a2e0fb","updated":"2019-07-08 12:48:59.000000000","message":"Done","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"15c343ee2edb6f7c9d2323e4657c74770075944a","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        reqspec \u003d objects.RequestSpec(flavor\u003dfake_flavor, image\u003dfake_image)"},{"line_number":128,"context_line":"        result \u003d request_filter.isolate_aggregates(self.context, reqspec)"},{"line_number":129,"context_line":"        self.assertTrue(result)"},{"line_number":130,"context_line":"        self.assertEqual("},{"line_number":131,"context_line":"            \u0027,\u0027.join(sorted([uuids.agg1, uuids.agg2, uuids.agg4])),"},{"line_number":132,"context_line":"            \u0027,\u0027.join(sorted("},{"line_number":133,"context_line":"                reqspec.requested_destination.isolated_aggregates)))"},{"line_number":134,"context_line":"        self.assertItemsEqual("},{"line_number":135,"context_line":"            set([uuids.agg1, uuids.agg2, uuids.agg4]),"},{"line_number":136,"context_line":"            reqspec.requested_destination.isolated_aggregates)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        keys \u003d [\u0027trait:%s\u0027 % trait for trait in traits]"},{"line_number":139,"context_line":"        mock_getnotmd.assert_called_once_with(self.context, mock.ANY,"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_bbb80675","line":136,"range":{"start_line":130,"start_character":0,"end_line":136,"end_character":62},"updated":"2019-08-29 16:32:39.000000000","message":"Do we _really_ need both of these? Can we drop one?","commit_id":"f25be6f8503aad0d1588669eb9076a078db4faca"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"14b401511658922d8dbc9e1aa5cd62a1430d577d","unresolved":false,"context_lines":[{"line_number":127,"context_line":"        reqspec \u003d objects.RequestSpec(flavor\u003dfake_flavor, image\u003dfake_image)"},{"line_number":128,"context_line":"        result \u003d request_filter.isolate_aggregates(self.context, reqspec)"},{"line_number":129,"context_line":"        self.assertTrue(result)"},{"line_number":130,"context_line":"        self.assertEqual("},{"line_number":131,"context_line":"            \u0027,\u0027.join(sorted([uuids.agg1, uuids.agg2, uuids.agg4])),"},{"line_number":132,"context_line":"            \u0027,\u0027.join(sorted("},{"line_number":133,"context_line":"                reqspec.requested_destination.isolated_aggregates)))"},{"line_number":134,"context_line":"        self.assertItemsEqual("},{"line_number":135,"context_line":"            set([uuids.agg1, uuids.agg2, uuids.agg4]),"},{"line_number":136,"context_line":"            reqspec.requested_destination.isolated_aggregates)"},{"line_number":137,"context_line":""},{"line_number":138,"context_line":"        keys \u003d [\u0027trait:%s\u0027 % trait for trait in traits]"},{"line_number":139,"context_line":"        mock_getnotmd.assert_called_once_with(self.context, mock.ANY,"}],"source_content_type":"text/x-python","patch_set":20,"id":"7faddb67_d656e905","line":136,"range":{"start_line":130,"start_character":0,"end_line":136,"end_character":62},"in_reply_to":"7faddb67_bbb80675","updated":"2019-08-30 11:08:12.000000000","message":"Done","commit_id":"f25be6f8503aad0d1588669eb9076a078db4faca"}],"releasenotes/notes/bp-placement-req-filter-forbidden-aggregates-26f34213ca757b5a.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"59f8043aa434d3c739cf7f4402d148b6facc4d52","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Blueprint `placement-req-filter-forbidden-aggregates`_ adds the ability to allow operators to set traits on"},{"line_number":5,"context_line":"    aggregates which if not requested in flavor extra specs or image properties will result in ignoring all hosts"},{"line_number":6,"context_line":"    belonging to those aggregates from booting the request instances."}],"source_content_type":"text/x-yaml","patch_set":1,"id":"9fb8cfa7_d3947c8d","line":3,"updated":"2019-06-27 17:19:59.000000000","message":"nts: reword \u0026 wrap","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"7f13c3ead6da4e527897b5e6a4382e4d2c97d537","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    * ``[scheduler]/enable_forbidden_aggregates_filter \u003d True``"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"    .. _placement-req-filter-forbidden-aggregates: https://blueprints.launchpad.net/nova/+spec/placement-req-filter-forbidden-aggregates"}],"source_content_type":"text/x-yaml","patch_set":1,"id":"9fb8cfa7_a0af1e7b","line":14,"range":{"start_line":14,"start_character":51,"end_line":14,"end_character":136},"updated":"2019-06-28 15:45:25.000000000","message":"ditto linking to spec, that okay?","commit_id":"fd2d856fb7429696a00f27ad9c577e00c5784302"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"70a3fe6fdcad1d808a780183bfa90379f6c4667f","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    extra specs or image properties will result in disallowing all hosts"},{"line_number":7,"context_line":"    belonging to those aggregates from booting the requested instances. This"},{"line_number":8,"context_line":"    feature is enabled via a new config option"},{"line_number":9,"context_line":"    ``[scheduler] enable_forbidden_aggregates_filtering``. See `Filtering hosts by"},{"line_number":10,"context_line":"    forbidden aggregates`_ for more details."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    .. _placement-req-filter-forbidden-aggregates: https://specs.openstack.org/openstack/nova-specs/specs/train/approved/placement-req-filter-forbidden-aggregates.html"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"7faddb67_433f67b3","line":9,"updated":"2019-07-16 16:33:38.000000000","message":"nit: long line","commit_id":"a7f13e76c821b44193023fd7c732f8c3bfe84ae0"},{"author":{"_account_id":26458,"name":"Brin Zhang","email":"zhangbailin@inspur.com","username":"zhangbailin"},"change_message_id":"d4b56973dc86ee65593cd45fe6d126c3f02799ad","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    forbidden aggregates`_ for more details."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    .. _placement-req-filter-forbidden-aggregates: https://specs.openstack.org/openstack/nova-specs/specs/train/approved/placement-req-filter-forbidden-aggregates.html"},{"line_number":13,"context_line":"    .. _`Filtering hosts by forbidden aggregates`: https://docs.openstack.org/nova/latest/reference/forbidden-aggregates.html"}],"source_content_type":"text/x-yaml","patch_set":10,"id":"7faddb67_d303f70b","line":13,"range":{"start_line":13,"start_character":8,"end_line":13,"end_character":49},"updated":"2019-08-06 11:53:55.000000000","message":"nit:s/Filtering hosts by forbidden aggregates/`Filtering hosts by forbidden aggregates`\n\nredunant \u0027\u0027","commit_id":"64ca613fc2abe3ee7b0ada0854bb5cdc2c6c2eac"}],"releasenotes/notes/bp-placement-req-filter-isolated-aggregates-26f34213ca757b5a.yaml":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e3f9649e1590d9b0f041841e446893e8644b9ea3","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    extra specs or image properties will result in disallowing all hosts"},{"line_number":7,"context_line":"    belonging to those aggregates from booting the requested instances. This"},{"line_number":8,"context_line":"    feature is enabled via a new config option"},{"line_number":9,"context_line":"    ``[scheduler] enable_isolated_aggregates_filtering``. See `Filtering hosts by"},{"line_number":10,"context_line":"    isolated aggregates`_ for more details."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    .. _placement-req-filter-forbidden-aggregates: https://specs.openstack.org/openstack/nova-specs/specs/train/approved/placement-req-filter-forbidden-aggregates.html"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"7faddb67_17af182c","line":9,"range":{"start_line":9,"start_character":79,"end_line":9,"end_character":81},"updated":"2019-08-07 22:33:38.000000000","message":"wrap","commit_id":"78d8484420e57d6dab678ddfd1cb2b99c978a72d"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"35a9f964e6226a9de4b0ed782914a83ef8235efc","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    extra specs or image properties will result in disallowing all hosts"},{"line_number":7,"context_line":"    belonging to those aggregates from booting the requested instances. This"},{"line_number":8,"context_line":"    feature is enabled via a new config option"},{"line_number":9,"context_line":"    ``[scheduler] enable_isolated_aggregates_filtering``. See `Filtering hosts by"},{"line_number":10,"context_line":"    isolated aggregates`_ for more details."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    .. _placement-req-filter-forbidden-aggregates: https://specs.openstack.org/openstack/nova-specs/specs/train/approved/placement-req-filter-forbidden-aggregates.html"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"7faddb67_aa256eb0","line":9,"range":{"start_line":9,"start_character":79,"end_line":9,"end_character":81},"in_reply_to":"7faddb67_17af182c","updated":"2019-08-08 12:38:28.000000000","message":"Done","commit_id":"78d8484420e57d6dab678ddfd1cb2b99c978a72d"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e3f9649e1590d9b0f041841e446893e8644b9ea3","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    isolated aggregates`_ for more details."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    .. _placement-req-filter-forbidden-aggregates: https://specs.openstack.org/openstack/nova-specs/specs/train/approved/placement-req-filter-forbidden-aggregates.html"},{"line_number":13,"context_line":"    .. _Filtering hosts by isolated aggregates: https://docs.openstack.org/nova/latest/reference/forbidden-aggregates.html"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"7faddb67_77ba0c6f","line":13,"range":{"start_line":13,"start_character":97,"end_line":13,"end_character":106},"updated":"2019-08-07 22:33:38.000000000","message":"isolated","commit_id":"78d8484420e57d6dab678ddfd1cb2b99c978a72d"},{"author":{"_account_id":27302,"name":"Shilpa Devharakar","email":"shilpa.devharakar@nttdata.com","username":"shilpa.devharakar"},"change_message_id":"35a9f964e6226a9de4b0ed782914a83ef8235efc","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    isolated aggregates`_ for more details."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"    .. _placement-req-filter-forbidden-aggregates: https://specs.openstack.org/openstack/nova-specs/specs/train/approved/placement-req-filter-forbidden-aggregates.html"},{"line_number":13,"context_line":"    .. _Filtering hosts by isolated aggregates: https://docs.openstack.org/nova/latest/reference/forbidden-aggregates.html"}],"source_content_type":"text/x-yaml","patch_set":12,"id":"7faddb67_ca2a2a7d","line":13,"range":{"start_line":13,"start_character":97,"end_line":13,"end_character":106},"in_reply_to":"7faddb67_77ba0c6f","updated":"2019-08-08 12:38:28.000000000","message":"Done","commit_id":"78d8484420e57d6dab678ddfd1cb2b99c978a72d"}]}
