)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"cc3ced4423d7cc3a2121e122f08f0e53ffeeaa1f","unresolved":false,"context_lines":[{"line_number":10,"context_line":"  request filters"},{"line_number":11,"context_line":"- This change adds a config option for the new"},{"line_number":12,"context_line":"  image metadata prefilter"},{"line_number":13,"context_line":"- This change chreates a table driven prfilter"},{"line_number":14,"context_line":"  with no current transforms which will be extended"},{"line_number":15,"context_line":"  in follow up patches."},{"line_number":16,"context_line":"- This adds basic unit test of the table driven prefilter"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9fb8cfa7_65ad6130","line":13,"range":{"start_line":13,"start_character":14,"end_line":13,"end_character":22},"updated":"2019-06-18 22:42:52.000000000","message":"creates","commit_id":"afdd0062d70cc53bebb14e9e9ec792f7cf44f1d8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"cc3ced4423d7cc3a2121e122f08f0e53ffeeaa1f","unresolved":false,"context_lines":[{"line_number":15,"context_line":"  in follow up patches."},{"line_number":16,"context_line":"- This adds basic unit test of the table driven prefilter"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Partial-Implements: bp/image-metadata-prefiltering"},{"line_number":19,"context_line":"Change-Id: I257ff81e23cdae6f2b62ec3d071b8f8f32d97781"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9fb8cfa7_c00c3b3d","line":18,"range":{"start_line":18,"start_character":20,"end_line":18,"end_character":23},"updated":"2019-06-18 22:42:52.000000000","message":"spell out \u0027blueprint \u0027 (no /) to make gerrit link this","commit_id":"afdd0062d70cc53bebb14e9e9ec792f7cf44f1d8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"05d3e218d227c4eaececf07c332f3855f087006c","unresolved":false,"context_lines":[{"line_number":15,"context_line":"  in follow up patches."},{"line_number":16,"context_line":"- This adds basic unit test of the table driven prefilter"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"Partial-Implements: bp/image-metadata-prefiltering"},{"line_number":19,"context_line":"Change-Id: I257ff81e23cdae6f2b62ec3d071b8f8f32d97781"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"9fb8cfa7_aa49bd60","line":18,"range":{"start_line":18,"start_character":20,"end_line":18,"end_character":23},"in_reply_to":"9fb8cfa7_c00c3b3d","updated":"2019-06-20 16:47:54.000000000","message":"ah you are right its been a while since i used this form","commit_id":"afdd0062d70cc53bebb14e9e9ec792f7cf44f1d8"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","unresolved":false,"context_lines":[{"line_number":14,"context_line":"  to transform image metadata into required traits."},{"line_number":15,"context_line":"- This change adds a new config option to enable"},{"line_number":16,"context_line":"  the transform_image_metadata request filter."},{"line_number":17,"context_line":"- This change order the request filters alphabetically."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Implements: blueprint image-metadata-prefiltering"},{"line_number":20,"context_line":"Change-Id: I257ff81e23cdae6f2b62ec3d071b8f8f32d97781"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"3fa7e38b_0070853f","line":17,"updated":"2019-10-30 14:37:32.000000000","message":"I always say that if you need an itemized list of all the stuff a patch is doing, you probably need multiple patches. In this case, I definitely think it applies. Please separate the refactor from the functional change.","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"}],"nova/conf/scheduler.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"cc3ced4423d7cc3a2121e122f08f0e53ffeeaa1f","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(\"image_metadata_prefilter\","},{"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 transform well known image metadata"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_40312bec","line":187,"updated":"2019-06-18 22:42:52.000000000","message":"Did we decide we needed a config option to switch this on? Why?","commit_id":"afdd0062d70cc53bebb14e9e9ec792f7cf44f1d8"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"c5d208a5a04b5d70d9c7e6bc4084c81726525f0e","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(\"image_metadata_prefilter\","},{"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 transform well known image metadata"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_30a77c0e","line":187,"in_reply_to":"9fb8cfa7_0a6489e4","updated":"2019-06-20 18:47:24.000000000","message":"Also, upgrades.","commit_id":"afdd0062d70cc53bebb14e9e9ec792f7cf44f1d8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"a0eac308d75e84e563ae2cf441f7c827b82545fd","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(\"image_metadata_prefilter\","},{"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 transform well known image metadata"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_bb2fcd86","line":187,"in_reply_to":"9fb8cfa7_30a77c0e","updated":"2019-06-20 19:46:28.000000000","message":"Ack, I was thinking of this upside down","commit_id":"afdd0062d70cc53bebb14e9e9ec792f7cf44f1d8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"05d3e218d227c4eaececf07c332f3855f087006c","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(\"image_metadata_prefilter\","},{"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 transform well known image metadata"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_0a6489e4","line":187,"in_reply_to":"9fb8cfa7_40312bec","updated":"2019-06-20 16:47:54.000000000","message":"not all virt dirver might support reporting the traits so its opt in.","commit_id":"afdd0062d70cc53bebb14e9e9ec792f7cf44f1d8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"cc3ced4423d7cc3a2121e122f08f0e53ffeeaa1f","unresolved":false,"context_lines":[{"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 transform well known image metadata"},{"line_number":191,"context_line":"properties into placement required traits to filter host based on image"},{"line_number":192,"context_line":"metadata."},{"line_number":193,"context_line":"\"\"\"),"},{"line_number":194,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_05aa6518","line":191,"range":{"start_line":191,"start_character":52,"end_line":191,"end_character":56},"updated":"2019-06-18 22:42:52.000000000","message":"hosts","commit_id":"afdd0062d70cc53bebb14e9e9ec792f7cf44f1d8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"cc3ced4423d7cc3a2121e122f08f0e53ffeeaa1f","unresolved":false,"context_lines":[{"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 transform well known image metadata"},{"line_number":191,"context_line":"properties into placement required traits to filter host based on image"},{"line_number":192,"context_line":"metadata."},{"line_number":193,"context_line":"\"\"\"),"},{"line_number":194,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_e566312a","line":191,"range":{"start_line":191,"start_character":42,"end_line":191,"end_character":51},"updated":"2019-06-18 22:42:52.000000000","message":"to enable filtering of?","commit_id":"afdd0062d70cc53bebb14e9e9ec792f7cf44f1d8"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ec3c4e83529f93034ea22f69be2c6c68346e2388","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(\"image_metadata_prefilter\","},{"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 transform well known image metadata"},{"line_number":191,"context_line":"properties into placement required traits to filter host based on image"},{"line_number":192,"context_line":"metadata."},{"line_number":193,"context_line":"\"\"\"),"},{"line_number":194,"context_line":"]"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"filter_scheduler_group \u003d cfg.OptGroup(name\u003d\"filter_scheduler\","}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_81c3a238","line":193,"range":{"start_line":187,"start_character":0,"end_line":193,"end_character":5},"updated":"2019-08-09 11:42:28.000000000","message":"Do we definitely need this? Why would a driver _not_ be reporting these traits?","commit_id":"7752355df21e9c079cdd3b08d983da11038c86eb"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"2bff8c6781897c3b2bfa356a99e18c3ad6148d4f","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(\"image_metadata_prefilter\","},{"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 transform well known image metadata"},{"line_number":191,"context_line":"properties into placement required traits to filter host based on image"},{"line_number":192,"context_line":"metadata."},{"line_number":193,"context_line":"\"\"\"),"},{"line_number":194,"context_line":"]"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"filter_scheduler_group \u003d cfg.OptGroup(name\u003d\"filter_scheduler\","}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_bfd0d2f8","line":193,"range":{"start_line":187,"start_character":0,"end_line":193,"end_character":5},"in_reply_to":"7faddb67_75541d22","updated":"2019-08-15 22:45:23.000000000","message":"I wonder if we could make this a workarounds option so, or maybe immediately deprecate it, assuming we have no reason to keep it long term","commit_id":"7752355df21e9c079cdd3b08d983da11038c86eb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"605e135feadbf2287bb9d8b4418d8594e6641549","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(\"image_metadata_prefilter\","},{"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 transform well known image metadata"},{"line_number":191,"context_line":"properties into placement required traits to filter host based on image"},{"line_number":192,"context_line":"metadata."},{"line_number":193,"context_line":"\"\"\"),"},{"line_number":194,"context_line":"]"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"filter_scheduler_group \u003d cfg.OptGroup(name\u003d\"filter_scheduler\","}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_75541d22","line":193,"range":{"start_line":187,"start_character":0,"end_line":193,"end_character":5},"in_reply_to":"7faddb67_81c3a238","updated":"2019-08-09 17:23:54.000000000","message":"well for one i have only added support in the libvirt dirver so all the rest wont be reporting it.\nits also requried for upgrades as you should only enable this after all the compute nodes are upgraded. but yes in general all drivers should report these tratis","commit_id":"7752355df21e9c079cdd3b08d983da11038c86eb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"368d32427f479a3e337b8c58e040586edd799699","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(\"image_metadata_prefilter\","},{"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 transform well known image metadata"},{"line_number":191,"context_line":"properties into placement required traits to filter host based on image"},{"line_number":192,"context_line":"metadata."},{"line_number":193,"context_line":"\"\"\"),"},{"line_number":194,"context_line":"]"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"filter_scheduler_group \u003d cfg.OptGroup(name\u003d\"filter_scheduler\","}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_7513245d","line":193,"range":{"start_line":187,"start_character":0,"end_line":193,"end_character":5},"in_reply_to":"7faddb67_bfd0d2f8","updated":"2019-08-20 12:06:09.000000000","message":"no we cant. we need this until hypverv vmware and powervm drivers report the triats for the device models they support.\n\nwhich is why this default to false as it currently will only work as expected with  libvirt. it will exist for at least the Train and U cycle so i expect the earliest it can be removed is V\n\nif we deprecated it imediatly we might be able to remove it in U but we would still want the prefilter disabled in train\nby default.","commit_id":"7752355df21e9c079cdd3b08d983da11038c86eb"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"155e441e088599117231dfaa251911fc522e56e9","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(\"image_metadata_prefilter\","},{"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 transform well known image metadata"},{"line_number":191,"context_line":"properties into placement required traits to filter host based on image"},{"line_number":192,"context_line":"metadata."},{"line_number":193,"context_line":"\"\"\"),"},{"line_number":194,"context_line":"]"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"filter_scheduler_group \u003d cfg.OptGroup(name\u003d\"filter_scheduler\","}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_b23cc430","line":193,"range":{"start_line":187,"start_character":0,"end_line":193,"end_character":5},"updated":"2019-08-28 10:11:27.000000000","message":"We discussed this previously [1], but I don\u0027t think we settled on anything. Do we want to consider deprecating this immediately so we can remove it in a future release? It sounds like a short term thing, right? I\u0027d also be happy waiting a cycle but could we add a TODO comment so we remember to come back and do it eventually?\n\nhttps://review.opendev.org/#/c/665775/10/nova/conf/scheduler.py@193","commit_id":"9592f4e6e0376062fe69c672a634ec949f8d70f1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b4ad37110357083cb66e95f333904a72912c0479","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(\"image_metadata_prefilter\","},{"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 transform well known image metadata"},{"line_number":191,"context_line":"properties into placement required traits to filter host based on image"},{"line_number":192,"context_line":"metadata."},{"line_number":193,"context_line":"\"\"\"),"},{"line_number":194,"context_line":"]"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"filter_scheduler_group \u003d cfg.OptGroup(name\u003d\"filter_scheduler\","}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_55853a58","line":193,"range":{"start_line":187,"start_character":0,"end_line":193,"end_character":5},"in_reply_to":"7faddb67_b23cc430","updated":"2019-08-28 11:21:06.000000000","message":"no as i said previously we cant deprecate it until all virt dirver support this feature if they supprot the image proerties. so we need to add support to hyperv and vmware.\n\ni can may look at doing that but i dont really have a way to test. well without instlaling with both hyperviors which is not something i plan to do in the short term\n\nthe image properties may be defied in the libvirt section in the metadefs but it looks like over time hyperv and vmware alos started using them. i could add a todo i guess for the hyperv and vmware support.","commit_id":"9592f4e6e0376062fe69c672a634ec949f8d70f1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","unresolved":false,"context_lines":[{"line_number":195,"context_line":"eligible to be scheduled to hosts in that aggregate. More technical details"},{"line_number":196,"context_line":"at https://docs.openstack.org/nova/latest/reference/isolate-aggregates.html"},{"line_number":197,"context_line":"\"\"\"),"},{"line_number":198,"context_line":"    cfg.BoolOpt(\"image_metadata_prefilter\","},{"line_number":199,"context_line":"                default\u003dFalse,"},{"line_number":200,"context_line":"                help\u003d\"\"\""},{"line_number":201,"context_line":"This setting causes the scheduler to transform well known image metadata"}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_4038bdd1","line":198,"range":{"start_line":198,"start_character":17,"end_line":198,"end_character":41},"updated":"2019-10-30 14:37:32.000000000","message":"I would like this to look like (most) all the other conf options in this group, so start with a verb. Something like query_placement_for_image_properties would match with most of the other ones?","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"d1876a80e09803e5a71dab89af4edb207ae11415","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                help\u003d\"\"\""},{"line_number":201,"context_line":"This setting causes the scheduler to transform well known image metadata"},{"line_number":202,"context_line":"properties into placement required traits to filter host based on image"},{"line_number":203,"context_line":"metadata."},{"line_number":204,"context_line":"\"\"\"),"},{"line_number":205,"context_line":"]"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"1fa4df85_40a7a1a8","line":203,"updated":"2020-03-18 23:56:23.000000000","message":"Maybe note that, \"please use this feature before you finish the full upgrade of U release, otherwise, you may not successful scheduling the instance.\",","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"cd172ae98dcc193fd2fb1989c8e6999ce2ea2542","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                help\u003d\"\"\""},{"line_number":201,"context_line":"This setting causes the scheduler to transform well known image metadata"},{"line_number":202,"context_line":"properties into placement required traits to filter host based on image"},{"line_number":203,"context_line":"metadata."},{"line_number":204,"context_line":"\"\"\"),"},{"line_number":205,"context_line":"]"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"1fa4df85_428b1c67","line":203,"in_reply_to":"1fa4df85_279b9273","updated":"2020-03-19 13:34:33.000000000","message":"\u003e ideally they would enable this before upgrading to V but i dont\n \u003e think this need to be done before fully completing the U upgrade.\n\nI mean without full completing U upgrade, some of nodes are old, they don\u0027t report the bus traits, but with this option enabled, we will require the bus traits, so the old nodes can\u0027t be scheduled.","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4021b7a2b21e3cfcb200bf01a4d6c5c7ec8760b2","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                help\u003d\"\"\""},{"line_number":201,"context_line":"This setting causes the scheduler to transform well known image metadata"},{"line_number":202,"context_line":"properties into placement required traits to filter host based on image"},{"line_number":203,"context_line":"metadata."},{"line_number":204,"context_line":"\"\"\"),"},{"line_number":205,"context_line":"]"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"1fa4df85_e7281a87","line":203,"in_reply_to":"1fa4df85_40a7a1a8","updated":"2020-03-19 13:32:14.000000000","message":"Done","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8e34e342f9766f3b64dcab73ed0883720bc225ec","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                help\u003d\"\"\""},{"line_number":201,"context_line":"This setting causes the scheduler to transform well known image metadata"},{"line_number":202,"context_line":"properties into placement required traits to filter host based on image"},{"line_number":203,"context_line":"metadata."},{"line_number":204,"context_line":"\"\"\"),"},{"line_number":205,"context_line":"]"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"1fa4df85_279b9273","line":203,"in_reply_to":"1fa4df85_40a7a1a8","updated":"2020-03-19 13:10:40.000000000","message":"that would not be correct.\n\nif you do not enable this feature it will work exactly as it it does today.\n\nspecficaly the schduler will not check if the host support virtualiastion fo any of the requested devices and just assuem it does and it will select a hots that may fail to spawn the guest.\n\nwe still would like to see people opt into this if they are using the libvirt driver in U but stating\n\"please use this feature before you finish the full upgrade of U release, otherwise, you may not successful scheduling the instance.\",\n\nis too stong a statement.\n\nthis feature is intended to reduce the rate of no vaild host errors in a mixed hypervior envionment or during a rolling upgrade but its not required to successfuly schdule.\n\nideally they would enable this before upgrading to V but i dont think this need to be done before fully completing the U upgrade.","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"ea1dfa84417a9e1f591290b2d3a5d676f208a0a6","unresolved":false,"context_lines":[{"line_number":200,"context_line":"                help\u003d\"\"\""},{"line_number":201,"context_line":"This setting causes the scheduler to transform well known image metadata"},{"line_number":202,"context_line":"properties into placement required traits to filter host based on image"},{"line_number":203,"context_line":"metadata."},{"line_number":204,"context_line":"\"\"\"),"},{"line_number":205,"context_line":"]"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"1fa4df85_62c6589d","line":203,"in_reply_to":"1fa4df85_428b1c67","updated":"2020-03-19 13:35:40.000000000","message":"so your saying you should not set this to true until you complete the U upgrade. if so i agree","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"}],"nova/scheduler/request_filter.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1b938d0187d8fa91bf32f5bca50cc5d851b9d270","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    limit results accordingly."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    :param ctxt: A RequestContext"},{"line_number":59,"context_line":"    :param request_spec: An objects.RequestSpec to be inspected/modified"},{"line_number":60,"context_line":"    \"\"\""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    enabled \u003d CONF.scheduler.limit_tenants_to_placement_aggregate"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_90f2e899","line":59,"updated":"2019-06-20 19:17:28.000000000","message":"I\u0027d like to say that I think these docstring additions are pointless. There\u0027s a calling convention for these, so there\u0027s no reason to document the same thing over and over. Further, it\u0027s extremely obvious what these are from the param names. Further further, they\u0027re all called from a single dispatch point, so if you really think that \"context is a context\" is a useful clarification (I don\u0027t) then I say put it at the single dispatch point.","commit_id":"afdd0062d70cc53bebb14e9e9ec792f7cf44f1d8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"27364173e4c3f46b7a7caa60515c421da49759c0","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    limit results accordingly."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    :param ctxt: A RequestContext"},{"line_number":59,"context_line":"    :param request_spec: An objects.RequestSpec to be inspected/modified"},{"line_number":60,"context_line":"    \"\"\""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    enabled \u003d CONF.scheduler.limit_tenants_to_placement_aggregate"}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_d6e5b80b","line":59,"in_reply_to":"9fb8cfa7_90f2e899","updated":"2019-06-20 20:32:14.000000000","message":"i was only adding this becasue stephen always asks me to if im touching function that dont have them but yes they dont really add much value other than the fact that we signel that the request_sepc will be modified but that is part of the calling convention.\n\nill drop these so in the next version.","commit_id":"afdd0062d70cc53bebb14e9e9ec792f7cf44f1d8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"cc3ced4423d7cc3a2121e122f08f0e53ffeeaa1f","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    request_spec.obj_reset_changes(fields\u003d[\u0027flavor\u0027], recursive\u003dTrue)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"METADATA_TRANSFORMS \u003d {"},{"line_number":171,"context_line":"# TODO(sean-k-mooney): implement the transform functions here."},{"line_number":172,"context_line":"}"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"@trace_request_filter"},{"line_number":176,"context_line":"def transform_image_metadata(ctxt, request_spec):"},{"line_number":177,"context_line":"    \"\"\" Transform image metadata to required traits."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    This will modify the request_spec to request hosts that support"},{"line_number":180,"context_line":"    virtualisation capablities based on the image metadata properties."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    :param ctxt: A RequestContext"},{"line_number":183,"context_line":"    :param request_spec: An objects.RequestSpec to be inspected/modified"},{"line_number":184,"context_line":"    \"\"\""},{"line_number":185,"context_line":"    if not CONF.scheduler.image_metadata_prefilter:"},{"line_number":186,"context_line":"        return False"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    for key, transform in METADATA_TRANSFORMS.items():"},{"line_number":189,"context_line":"        if key in request_spec.image.properties:"},{"line_number":190,"context_line":"            request_spec \u003d transform(request_spec)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    return True"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"ALL_REQUEST_FILTERS \u003d ["}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_a05587fc","line":192,"range":{"start_line":170,"start_character":0,"end_line":192,"end_character":15},"updated":"2019-06-18 22:42:52.000000000","message":"This really doesn\u0027t make sense to add separately from the next patch.\n\nBut see comments there.","commit_id":"afdd0062d70cc53bebb14e9e9ec792f7cf44f1d8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"05d3e218d227c4eaececf07c332f3855f087006c","unresolved":false,"context_lines":[{"line_number":167,"context_line":"    request_spec.obj_reset_changes(fields\u003d[\u0027flavor\u0027], recursive\u003dTrue)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":""},{"line_number":170,"context_line":"METADATA_TRANSFORMS \u003d {"},{"line_number":171,"context_line":"# TODO(sean-k-mooney): implement the transform functions here."},{"line_number":172,"context_line":"}"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"@trace_request_filter"},{"line_number":176,"context_line":"def transform_image_metadata(ctxt, request_spec):"},{"line_number":177,"context_line":"    \"\"\" Transform image metadata to required traits."},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    This will modify the request_spec to request hosts that support"},{"line_number":180,"context_line":"    virtualisation capablities based on the image metadata properties."},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    :param ctxt: A RequestContext"},{"line_number":183,"context_line":"    :param request_spec: An objects.RequestSpec to be inspected/modified"},{"line_number":184,"context_line":"    \"\"\""},{"line_number":185,"context_line":"    if not CONF.scheduler.image_metadata_prefilter:"},{"line_number":186,"context_line":"        return False"},{"line_number":187,"context_line":""},{"line_number":188,"context_line":"    for key, transform in METADATA_TRANSFORMS.items():"},{"line_number":189,"context_line":"        if key in request_spec.image.properties:"},{"line_number":190,"context_line":"            request_spec \u003d transform(request_spec)"},{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    return True"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"ALL_REQUEST_FILTERS \u003d ["}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_ea49f531","line":192,"range":{"start_line":170,"start_character":0,"end_line":192,"end_character":15},"in_reply_to":"9fb8cfa7_a05587fc","updated":"2019-06-20 16:47:54.000000000","message":"i wanted to break this feautre up into a series fo small patches.\n\nin this one i have fully asserted all of the behavior ro the filter funciton iself an then in the follow up patches i can assert teh behavior of the indivigual transforms.\n\nso i was trying to keep the congnitive load down by makeing the changes small and easy to parse.\n\nim adding 3 differnt resouce inilally\n\nstorage bus (hw_disk_bus and hw_cdrom_bus)\nvideo model (hw_video_model)\nvif model   (hw_vif_model)\n\nand if my vpmu spec is approved i will add that as a 4th trasform later.\n\nregarding the follow up patch i have replied. the ransforms can jsut be function or functors in faction the only requirement is that the key is the name of a fileld int eh image metadata properties and teh value is something that is callable so lamdas or function, functors all will work.","commit_id":"afdd0062d70cc53bebb14e9e9ec792f7cf44f1d8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5169e7f3a03504772e1900676dd6a54732aa5ee0","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    :param filter_name: Name of the request filter for logging."},{"line_number":78,"context_line":"    \"\"\""},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    trait_name \u003d add_trait(request_spec, prefix, key(request_spec).upper())"},{"line_number":81,"context_line":"    if filter_name:"},{"line_number":82,"context_line":"        LOG.debug(\u0027%s request filter added required \u0027"},{"line_number":83,"context_line":"                  \u0027trait %s\u0027, (filter_name, trait_name))"}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_7e8e1e28","line":80,"range":{"start_line":80,"start_character":65,"end_line":80,"end_character":73},"updated":"2019-06-21 03:17:23.000000000","message":"this isn\u0027t needed since i moved it to add_trait","commit_id":"0f88f11ab3d6ebc92134337664dc97c30078c348"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5169e7f3a03504772e1900676dd6a54732aa5ee0","unresolved":false,"context_lines":[{"line_number":182,"context_line":"        return False"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"IMAGE_METADATA_TRAITS_PREFIX \u003d {"},{"line_number":186,"context_line":"    \"hw_cdrom_bus\": \"COMPUTE_STORAGE_BUS\","},{"line_number":187,"context_line":"    \"hw_disk_bus\": \"COMPUTE_STORAGE_BUS\","},{"line_number":188,"context_line":"    \"hw_video_model\": \"COMPUTE_GRAPHICS_MODEL\","}],"source_content_type":"text/x-python","patch_set":2,"id":"9fb8cfa7_9ebaf2bd","line":185,"range":{"start_line":185,"start_character":0,"end_line":185,"end_character":27},"updated":"2019-06-21 03:17:23.000000000","message":"ill move this into the transform_image_metadata function.","commit_id":"0f88f11ab3d6ebc92134337664dc97c30078c348"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ec3c4e83529f93034ea22f69be2c6c68346e2388","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        return ran"},{"line_number":47,"context_line":"    return wrapper"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def validate_trait(trait):"},{"line_number":51,"context_line":"    return len(os_traits.check_traits([trait])[1]) \u003d\u003d 0"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def add_trait(request_spec, prefix, suffix):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_01e572dc","line":51,"range":{"start_line":49,"start_character":0,"end_line":51,"end_character":55},"updated":"2019-08-09 11:42:28.000000000","message":"Care to add a comment explaining why this is doing this?","commit_id":"7752355df21e9c079cdd3b08d983da11038c86eb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"605e135feadbf2287bb9d8b4418d8594e6641549","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        return ran"},{"line_number":47,"context_line":"    return wrapper"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"def validate_trait(trait):"},{"line_number":51,"context_line":"    return len(os_traits.check_traits([trait])[1]) \u003d\u003d 0"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"def add_trait(request_spec, prefix, suffix):"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_f516cd55","line":51,"range":{"start_line":49,"start_character":0,"end_line":51,"end_character":55},"in_reply_to":"7faddb67_01e572dc","updated":"2019-08-09 17:23:54.000000000","message":"i think i had at one point.\n\nbut basice it returns a tuple of list e.g. \n([vaild],[invalid])  so the trait is valid if the invalide list is empty.\n\ni might want to also cache this as this is kind of expensive to do. e.g. calling check_traiats is not that cheap","commit_id":"7752355df21e9c079cdd3b08d983da11038c86eb"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ec3c4e83529f93034ea22f69be2c6c68346e2388","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    visualisation capabilities based on the image metadata properties."},{"line_number":191,"context_line":"    \"\"\""},{"line_number":192,"context_line":"    prefix_map \u003d {"},{"line_number":193,"context_line":"        \"hw_cdrom_bus\": \"COMPUTE_STORAGE_BUS\","},{"line_number":194,"context_line":"        \"hw_disk_bus\": \"COMPUTE_STORAGE_BUS\","},{"line_number":195,"context_line":"        \"hw_video_model\": \"COMPUTE_GRAPHICS_MODEL\","},{"line_number":196,"context_line":"        \"hw_vif_model\": \"COMPUTE_NET_VIF_MODEL\""}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_2103ce75","line":193,"range":{"start_line":193,"start_character":24,"end_line":193,"end_character":45},"updated":"2019-08-09 11:42:28.000000000","message":"Lets use the constants:\n\n  os_traits.COMPUTE_STORAGE_BUS\n\nDitto for below","commit_id":"7752355df21e9c079cdd3b08d983da11038c86eb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"368d32427f479a3e337b8c58e040586edd799699","unresolved":false,"context_lines":[{"line_number":190,"context_line":"    visualisation capabilities based on the image metadata properties."},{"line_number":191,"context_line":"    \"\"\""},{"line_number":192,"context_line":"    prefix_map \u003d {"},{"line_number":193,"context_line":"        \"hw_cdrom_bus\": \"COMPUTE_STORAGE_BUS\","},{"line_number":194,"context_line":"        \"hw_disk_bus\": \"COMPUTE_STORAGE_BUS\","},{"line_number":195,"context_line":"        \"hw_video_model\": \"COMPUTE_GRAPHICS_MODEL\","},{"line_number":196,"context_line":"        \"hw_vif_model\": \"COMPUTE_NET_VIF_MODEL\""}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_52263ecd","line":193,"range":{"start_line":193,"start_character":24,"end_line":193,"end_character":45},"in_reply_to":"7faddb67_2103ce75","updated":"2019-08-20 12:06:09.000000000","message":"these do not exists\n\nthere are only top level constnast of the indiviual traits\nnot the prefixes\n\nCOMPUTE_STORAGE_BUS is not a trait its a prefix that you append a storage but too like SATA to form a trait\n\nCOMPUTE_STORAGE_BUS_SATA","commit_id":"7752355df21e9c079cdd3b08d983da11038c86eb"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ec3c4e83529f93034ea22f69be2c6c68346e2388","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        \"hw_video_model\": \"COMPUTE_GRAPHICS_MODEL\","},{"line_number":196,"context_line":"        \"hw_vif_model\": \"COMPUTE_NET_VIF_MODEL\""},{"line_number":197,"context_line":"    }"},{"line_number":198,"context_line":"    if not CONF.scheduler.image_metadata_prefilter:"},{"line_number":199,"context_line":"        return False"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    try:"},{"line_number":202,"context_line":"        for key, prefix in prefix_map.items():"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_a1eedeb1","line":199,"range":{"start_line":198,"start_character":0,"end_line":199,"end_character":20},"updated":"2019-08-09 11:42:28.000000000","message":"As noted previously, I don\u0027t know why we need this. If we really do, we need a comment to that effect","commit_id":"7752355df21e9c079cdd3b08d983da11038c86eb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"368d32427f479a3e337b8c58e040586edd799699","unresolved":false,"context_lines":[{"line_number":195,"context_line":"        \"hw_video_model\": \"COMPUTE_GRAPHICS_MODEL\","},{"line_number":196,"context_line":"        \"hw_vif_model\": \"COMPUTE_NET_VIF_MODEL\""},{"line_number":197,"context_line":"    }"},{"line_number":198,"context_line":"    if not CONF.scheduler.image_metadata_prefilter:"},{"line_number":199,"context_line":"        return False"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    try:"},{"line_number":202,"context_line":"        for key, prefix in prefix_map.items():"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_3204e217","line":199,"range":{"start_line":198,"start_character":0,"end_line":199,"end_character":20},"in_reply_to":"7faddb67_a1eedeb1","updated":"2019-08-20 12:06:09.000000000","message":"we need this for non libvirt virt dirver that use some of these image propertes like vmware.\n\nthey are only defiend under the libvirt section in the metadef but other virt drivers used them after libvirt intoduced them and never updated the metadefs to reflect that. so on non libvit cloud you will want to disable thsi pre-filter until support is added for reporting the traits.","commit_id":"7752355df21e9c079cdd3b08d983da11038c86eb"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"21a15dfd9422325e4d8cfad53135e48fc87ce7af","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def add_trait(request_spec, prefix, suffix):"},{"line_number":52,"context_line":"    trait_name \u003d \"{}_{}\".format(prefix, suffix).upper()"},{"line_number":53,"context_line":"    if utils.valid_trait(trait_name):"},{"line_number":54,"context_line":"        # NOTE(danms): We are using the transient flavor in the request spec"},{"line_number":55,"context_line":"        # to add the trait that we need. We make sure that we reset the"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_729c0c6a","line":52,"range":{"start_line":52,"start_character":4,"end_line":52,"end_character":55},"updated":"2019-08-28 09:57:55.000000000","message":"im going to pull this out into a normalise_trait util function as i need it in the trait reporting patches too.","commit_id":"9592f4e6e0376062fe69c672a634ec949f8d70f1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"155e441e088599117231dfaa251911fc522e56e9","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        return False"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    try:"},{"line_number":174,"context_line":"        transform_trait(request_spec, \u0027COMPUTE_IMAGE_TYPE\u0027,"},{"line_number":175,"context_line":"            attrgetter(\u0027image.disk_format\u0027),"},{"line_number":176,"context_line":"            filter_name\u003d\u0027require_image_type_support\u0027)"},{"line_number":177,"context_line":"        return True"},{"line_number":178,"context_line":"    except ValueError:"},{"line_number":179,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_924188a9","line":176,"range":{"start_line":174,"start_character":0,"end_line":176,"end_character":53},"updated":"2019-08-28 10:11:27.000000000","message":"I have no idea what this is doing. Can you add a comment?","commit_id":"9592f4e6e0376062fe69c672a634ec949f8d70f1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b4ad37110357083cb66e95f333904a72912c0479","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        return False"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    try:"},{"line_number":174,"context_line":"        transform_trait(request_spec, \u0027COMPUTE_IMAGE_TYPE\u0027,"},{"line_number":175,"context_line":"            attrgetter(\u0027image.disk_format\u0027),"},{"line_number":176,"context_line":"            filter_name\u003d\u0027require_image_type_support\u0027)"},{"line_number":177,"context_line":"        return True"},{"line_number":178,"context_line":"    except ValueError:"},{"line_number":179,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_956652bb","line":176,"range":{"start_line":174,"start_character":0,"end_line":176,"end_character":53},"in_reply_to":"7faddb67_924188a9","updated":"2019-08-28 11:21:06.000000000","message":"sure.\n\nthe flexablity of transform_trait is really for its other use below. this was just a refactoring to keep the code common between require_image_type_support and transform_image_metadata\n\nit gets the request_spec.image.disk_format value, add the \u0027COMPUTE_IMAGE_TYPE\u0027 prefix, normaliesas and validate the trait and appends it to the require trits if it is set.\n\n attrgetter() that is basicly\n\nclass attrgetter():\n    def __init__(self, target):\n        self.target \u003d target\n    def __call__(data)\n        return getattr(data, self.target)\n\nalthough i think it implemented as a funtion that returns another function instead of a functor class, under the hood https://docs.python.org/3/library/operator.html#operator.attrgetter\n\nin the above case as i said\n\nattrgetter(\u0027image.disk_format\u0027) gets applied to request_spec\n\nand basicaly becomes request_spec.image.disk\n\ni wrote transform_trait so that the key fucntion (thrid argument) can accpet any callable that takes the model( frist argument) and returns a sting.\n\nso attrgetter(\u0027image.disk_format\u0027)\ncould also be\nlamdata x: x.image.disk_format\n\nthe standard operator are intended to not require writing those lambdas over and over again.\n\nthis is how filter and sorted are implemented internally\nhttps://docs.python.org/3/howto/sorting.html#key-functions\nthey accept a model and a key function.\n\nso im just using the same idiom which i hoped people would understand.\n\nhttps://docs.python.org/3/howto/sorting.html#operator-module-functions\nsuggest/implies that the operators are considerd simplere and are faster.\n\n if you think the lambda is clearer i can use that instead of the standard lib operators module here but i cant use  a simple lambda in the for loop below so i was being consistent.\n\ni hope that helps.\n\ngive how fundamental to sorting and filtering key functions are i expect most people to be familiar with them. for filter the predicate funtion you pass is a specal case fo a keyfuntion that returns a boolean. i.e. all predicate functions are key functions but not all key functions are predecates.","commit_id":"9592f4e6e0376062fe69c672a634ec949f8d70f1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"155e441e088599117231dfaa251911fc522e56e9","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        \"hw_video_model\": \"COMPUTE_GRAPHICS_MODEL\","},{"line_number":193,"context_line":"        \"hw_vif_model\": \"COMPUTE_NET_VIF_MODEL\""},{"line_number":194,"context_line":"    }"},{"line_number":195,"context_line":"    if not CONF.scheduler.image_metadata_prefilter:"},{"line_number":196,"context_line":"        return False"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    try:"},{"line_number":199,"context_line":"        for key, prefix in prefix_map.items():"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_5215509a","line":196,"range":{"start_line":195,"start_character":0,"end_line":196,"end_character":20},"updated":"2019-08-28 10:11:27.000000000","message":"nit: this could go before the \u0027prefix_map\u0027 definition. No point generating something only to immediately throw it away","commit_id":"9592f4e6e0376062fe69c672a634ec949f8d70f1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b4ad37110357083cb66e95f333904a72912c0479","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        \"hw_video_model\": \"COMPUTE_GRAPHICS_MODEL\","},{"line_number":193,"context_line":"        \"hw_vif_model\": \"COMPUTE_NET_VIF_MODEL\""},{"line_number":194,"context_line":"    }"},{"line_number":195,"context_line":"    if not CONF.scheduler.image_metadata_prefilter:"},{"line_number":196,"context_line":"        return False"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    try:"},{"line_number":199,"context_line":"        for key, prefix in prefix_map.items():"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_f580e6c1","line":196,"range":{"start_line":195,"start_character":0,"end_line":196,"end_character":20},"in_reply_to":"7faddb67_5215509a","updated":"2019-08-28 11:21:06.000000000","message":"yes ill move it","commit_id":"9592f4e6e0376062fe69c672a634ec949f8d70f1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c0805cb89b65721aebda237f2c967aaae3dd5cd9","unresolved":false,"context_lines":[{"line_number":192,"context_line":"        \"hw_video_model\": \"COMPUTE_GRAPHICS_MODEL\","},{"line_number":193,"context_line":"        \"hw_vif_model\": \"COMPUTE_NET_VIF_MODEL\""},{"line_number":194,"context_line":"    }"},{"line_number":195,"context_line":"    if not CONF.scheduler.image_metadata_prefilter:"},{"line_number":196,"context_line":"        return False"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    try:"},{"line_number":199,"context_line":"        for key, prefix in prefix_map.items():"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_d232955e","line":196,"range":{"start_line":195,"start_character":0,"end_line":196,"end_character":20},"in_reply_to":"7faddb67_f580e6c1","updated":"2019-08-28 20:38:18.000000000","message":"Done","commit_id":"9592f4e6e0376062fe69c672a634ec949f8d70f1"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"155e441e088599117231dfaa251911fc522e56e9","unresolved":false,"context_lines":[{"line_number":226,"context_line":"              \u0027trait %s\u0027, trait_name)"},{"line_number":227,"context_line":"    return True"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"# list  of filters in alphabetical order"},{"line_number":231,"context_line":"ALL_REQUEST_FILTERS \u003d ["},{"line_number":232,"context_line":"    compute_status_filter,"},{"line_number":233,"context_line":"    map_az_to_placement_aggregate,"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_120fd888","line":230,"range":{"start_line":229,"start_character":0,"end_line":230,"end_character":40},"updated":"2019-08-28 10:11:27.000000000","message":"Did mriedem ask for this? I bet mriedem asked for this :D","commit_id":"9592f4e6e0376062fe69c672a634ec949f8d70f1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"c0805cb89b65721aebda237f2c967aaae3dd5cd9","unresolved":false,"context_lines":[{"line_number":226,"context_line":"              \u0027trait %s\u0027, trait_name)"},{"line_number":227,"context_line":"    return True"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":""},{"line_number":230,"context_line":"# list  of filters in alphabetical order"},{"line_number":231,"context_line":"ALL_REQUEST_FILTERS \u003d ["},{"line_number":232,"context_line":"    compute_status_filter,"},{"line_number":233,"context_line":"    map_az_to_placement_aggregate,"}],"source_content_type":"text/x-python","patch_set":14,"id":"7faddb67_726641be","line":230,"range":{"start_line":229,"start_character":0,"end_line":230,"end_character":40},"in_reply_to":"7faddb67_120fd888","updated":"2019-08-28 20:38:18.000000000","message":"no this just annoyed me.\nthe filters are not ment to have any ordering depency.\nwhen i added my filter to the list it broke test  that were unrelated so i put these in order when i was fixing that.","commit_id":"9592f4e6e0376062fe69c672a634ec949f8d70f1"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    else:"},{"line_number":62,"context_line":"        LOG.error((\u0027Computed trait name %r is not valid; \u0027"},{"line_number":63,"context_line":"                   \u0027is os-traits up to date?\u0027), trait_name)"},{"line_number":64,"context_line":"        raise ValueError()"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"def transform_trait(request_spec, prefix, key, filter_name\u003d\"\"):"}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_c07a6d86","line":64,"range":{"start_line":64,"start_character":24,"end_line":64,"end_character":26},"updated":"2019-10-30 14:37:32.000000000","message":"Need a message in here, even if you plan to catch it, IMHO.","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        raise ValueError()"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"def transform_trait(request_spec, prefix, key, filter_name\u003d\"\"):"},{"line_number":68,"context_line":"    \"\"\"Updates the RequestSpec with a temporary required"},{"line_number":69,"context_line":"    trait request from a key function and traits prefix."},{"line_number":70,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_40943d8b","line":67,"range":{"start_line":67,"start_character":59,"end_line":67,"end_character":61},"updated":"2019-10-30 14:37:32.000000000","message":"Why not just None for this default? I think that\u0027s far more conventional, and it doesn\u0027t look like you need it to be a string if it\u0027s false-y. Further, why is this even optional? The two places I see you using it, you pass it.","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","unresolved":false,"context_lines":[{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    :param request_spec: An objects.RequestSpec instance"},{"line_number":72,"context_line":"    :param prefix: A os_trait prefix"},{"line_number":73,"context_line":"    :param key: A key function that projects a value form"},{"line_number":74,"context_line":"                the RequestSpec object."},{"line_number":75,"context_line":"    :param filter_name: Name of the request filter for logging."},{"line_number":76,"context_line":"    \"\"\""},{"line_number":77,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_a0e89115","line":74,"range":{"start_line":73,"start_character":16,"end_line":74,"end_character":38},"updated":"2019-10-30 14:37:32.000000000","message":"This seems unnecessarily complex to me. People that don\u0027t read this will undoubtedly expect to pass a string in for an arg named \"key\", and even once they realize they need a callable, they\u0027ll just have to go look at what other things pass here. I\u0027m not sure why we can\u0027t just pass the actual value here.","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        # transform_trait updates the request spec by extracting"},{"line_number":218,"context_line":"        # the value of request_spec.image.disk_format using the"},{"line_number":219,"context_line":"        # provided key function and generating a trait using"},{"line_number":220,"context_line":"        # the trait prefix COMPUTE_IMAGE_TYPE. if the trait"},{"line_number":221,"context_line":"        # is valid it then append the trait request to the embedded"},{"line_number":222,"context_line":"        # flavor and resets changes on the object to make the change"},{"line_number":223,"context_line":"        # temporary."}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_6094d936","line":220,"range":{"start_line":220,"start_character":47,"end_line":220,"end_character":48},"updated":"2019-10-30 14:37:32.000000000","message":"\"If\"","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        # provided key function and generating a trait using"},{"line_number":220,"context_line":"        # the trait prefix COMPUTE_IMAGE_TYPE. if the trait"},{"line_number":221,"context_line":"        # is valid it then append the trait request to the embedded"},{"line_number":222,"context_line":"        # flavor and resets changes on the object to make the change"},{"line_number":223,"context_line":"        # temporary."},{"line_number":224,"context_line":"        transform_trait(request_spec, \u0027COMPUTE_IMAGE_TYPE\u0027,"},{"line_number":225,"context_line":"            attrgetter(\u0027image.disk_format\u0027),"}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_00a5e59e","line":222,"range":{"start_line":222,"start_character":53,"end_line":222,"end_character":68},"updated":"2019-10-30 14:37:32.000000000","message":"\"avoid persisting them\"","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","unresolved":false,"context_lines":[{"line_number":219,"context_line":"        # provided key function and generating a trait using"},{"line_number":220,"context_line":"        # the trait prefix COMPUTE_IMAGE_TYPE. if the trait"},{"line_number":221,"context_line":"        # is valid it then append the trait request to the embedded"},{"line_number":222,"context_line":"        # flavor and resets changes on the object to make the change"},{"line_number":223,"context_line":"        # temporary."},{"line_number":224,"context_line":"        transform_trait(request_spec, \u0027COMPUTE_IMAGE_TYPE\u0027,"},{"line_number":225,"context_line":"            attrgetter(\u0027image.disk_format\u0027),"}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_20a2619b","line":222,"range":{"start_line":222,"start_character":21,"end_line":222,"end_character":27},"updated":"2019-10-30 14:37:32.000000000","message":"reset","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","unresolved":false,"context_lines":[{"line_number":225,"context_line":"            attrgetter(\u0027image.disk_format\u0027),"},{"line_number":226,"context_line":"            filter_name\u003d\u0027require_image_type_support\u0027)"},{"line_number":227,"context_line":"        return True"},{"line_number":228,"context_line":"    except ValueError:"},{"line_number":229,"context_line":"        return False"},{"line_number":230,"context_line":""},{"line_number":231,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_00e965e1","line":228,"updated":"2019-10-30 14:37:32.000000000","message":"This refactor should be in a patch prior to the one where you add your new filter to help rule out any changes in behavior and so we can see what test change (if any) is required to keep it working.","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","unresolved":false,"context_lines":[{"line_number":234,"context_line":"    \"\"\"Transform image metadata to required traits."},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    This will modify the request_spec to request hosts that support"},{"line_number":237,"context_line":"    visualisation capabilities based on the image metadata properties."},{"line_number":238,"context_line":"    \"\"\""},{"line_number":239,"context_line":"    if not CONF.scheduler.image_metadata_prefilter:"},{"line_number":240,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_c0bcadbc","line":237,"range":{"start_line":237,"start_character":4,"end_line":237,"end_character":17},"updated":"2019-10-30 14:37:32.000000000","message":"virtualization?","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"46a97b84aff0ec4b5a942315bc035af2bbb8b5c6","unresolved":false,"context_lines":[{"line_number":234,"context_line":"    \"\"\"Transform image metadata to required traits."},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"    This will modify the request_spec to request hosts that support"},{"line_number":237,"context_line":"    visualisation capabilities based on the image metadata properties."},{"line_number":238,"context_line":"    \"\"\""},{"line_number":239,"context_line":"    if not CONF.scheduler.image_metadata_prefilter:"},{"line_number":240,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_a1b6cc8b","line":237,"range":{"start_line":237,"start_character":4,"end_line":237,"end_character":17},"in_reply_to":"3fa7e38b_c0bcadbc","updated":"2020-02-20 16:34:06.000000000","message":"Done","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","unresolved":false,"context_lines":[{"line_number":254,"context_line":"                    filter_name\u003d\"transform_image_metadata\")"},{"line_number":255,"context_line":"        return True"},{"line_number":256,"context_line":"    except ValueError:"},{"line_number":257,"context_line":"        return False"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"@trace_request_filter"}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_60fb797a","line":257,"updated":"2019-10-30 14:37:32.000000000","message":"In both cases here, I think I\u0027d rather LOG.error the exception instead of depending on it being done in transform_trait(). Yes, it saves you 1.0 lines of code doing it in the inner, but if you\u0027re debugging and trying to figure out when and what this function does on error, you have to dig pretty deep to find it.","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"46a97b84aff0ec4b5a942315bc035af2bbb8b5c6","unresolved":false,"context_lines":[{"line_number":254,"context_line":"                    filter_name\u003d\"transform_image_metadata\")"},{"line_number":255,"context_line":"        return True"},{"line_number":256,"context_line":"    except ValueError:"},{"line_number":257,"context_line":"        return False"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"@trace_request_filter"}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_c1b9887b","line":257,"in_reply_to":"3fa7e38b_60fb797a","updated":"2020-02-20 16:34:06.000000000","message":"Done","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","unresolved":false,"context_lines":[{"line_number":278,"context_line":"    return True"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"# list  of filters in alphabetical order"},{"line_number":282,"context_line":"ALL_REQUEST_FILTERS \u003d ["},{"line_number":283,"context_line":"    compute_status_filter,"},{"line_number":284,"context_line":"    isolate_aggregates,"}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_2021014e","line":281,"updated":"2019-10-30 14:37:32.000000000","message":"Pretty sure I said this before, but I do not agree with the assertion that these should be run in alphabetical order. One filter may alter the request spec depending on the things done by a previous filter, and/or there may be dependencies at some point. Sorting these could totally introduce a behavioral change, especially later if someone adds something in one release that needs to go in the middle. The names of these are not visible to the operator, so the alphabetical nature isn\u0027t discoverable.\n\nIMHO, we should append to the end of this list when adding one, unless there\u0027s a reason one filter needs to run before another (which is possible and legit), in which case it goes where it needs to go.\n\nI *definitely* don\u0027t want you sorting this list in this patch as it\u0027s already doing too much.","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"46a97b84aff0ec4b5a942315bc035af2bbb8b5c6","unresolved":false,"context_lines":[{"line_number":278,"context_line":"    return True"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"# list  of filters in alphabetical order"},{"line_number":282,"context_line":"ALL_REQUEST_FILTERS \u003d ["},{"line_number":283,"context_line":"    compute_status_filter,"},{"line_number":284,"context_line":"    isolate_aggregates,"}],"source_content_type":"text/x-python","patch_set":21,"id":"3fa7e38b_e6bdbab2","line":281,"in_reply_to":"3fa7e38b_2021014e","updated":"2020-02-20 16:34:06.000000000","message":"Done","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2aea1638b90bfbdcc83cd897614d76efea2f265a","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    for key, prefix in prefix_map.items():"},{"line_number":216,"context_line":"        if key in request_spec.image.properties:"},{"line_number":217,"context_line":"            value \u003d getattr(request_spec.image.properties, key)"},{"line_number":218,"context_line":"            trait_name \u003d f\u0027{prefix}_{value.upper()}\u0027"},{"line_number":219,"context_line":"            if not hasattr(os_traits, trait_name):"},{"line_number":220,"context_line":"                LOG.error((\u0027Computed trait name %r is not valid; \u0027"},{"line_number":221,"context_line":"                           \u0027is os-traits up to date?\u0027), trait_name)"}],"source_content_type":"text/x-python","patch_set":24,"id":"1fa4df85_7371ec75","line":218,"range":{"start_line":218,"start_character":10,"end_line":218,"end_character":52},"updated":"2020-03-09 17:40:09.000000000","message":"-1 you need to do the replace of \u0027-\u0027 with \u0027_\u0027\nthis is why i had that in a separate utility function since its simple to forget.","commit_id":"4d7a8da591928f97dfec1095e59250e5529622db"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1cad3ecf06e8ba6e18dca342ea01152445cf0a4c","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    for key, prefix in prefix_map.items():"},{"line_number":216,"context_line":"        if key in request_spec.image.properties:"},{"line_number":217,"context_line":"            value \u003d getattr(request_spec.image.properties, key)"},{"line_number":218,"context_line":"            trait_name \u003d f\u0027{prefix}_{value.upper()}\u0027"},{"line_number":219,"context_line":"            if not hasattr(os_traits, trait_name):"},{"line_number":220,"context_line":"                LOG.error((\u0027Computed trait name %r is not valid; \u0027"},{"line_number":221,"context_line":"                           \u0027is os-traits up to date?\u0027), trait_name)"}],"source_content_type":"text/x-python","patch_set":24,"id":"1fa4df85_9326e867","line":218,"range":{"start_line":218,"start_character":10,"end_line":218,"end_character":52},"in_reply_to":"1fa4df85_7371ec75","updated":"2020-03-09 17:44:23.000000000","message":"the value of VIF_MODEL_SPAPR_VLAN is \u0027spapr-vlan\u0027\nso we need to transform that to \u0027COMPUTE_NET_VIF_MODEL_SPAPR_VLAN\u0027 .\n\nhttps://github.com/openstack/nova/blob/abd1f05a0b7b0a0dbfbb429ad697839b836c22cd/nova/network/model.py#L129","commit_id":"4d7a8da591928f97dfec1095e59250e5529622db"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"464fd0fc937e238ffac2a89a3eed5b38f967db6e","unresolved":false,"context_lines":[{"line_number":215,"context_line":"    for key, prefix in prefix_map.items():"},{"line_number":216,"context_line":"        if key in request_spec.image.properties:"},{"line_number":217,"context_line":"            value \u003d getattr(request_spec.image.properties, key)"},{"line_number":218,"context_line":"            trait_name \u003d f\u0027{prefix}_{value.upper()}\u0027"},{"line_number":219,"context_line":"            if not hasattr(os_traits, trait_name):"},{"line_number":220,"context_line":"                LOG.error((\u0027Computed trait name %r is not valid; \u0027"},{"line_number":221,"context_line":"                           \u0027is os-traits up to date?\u0027), trait_name)"}],"source_content_type":"text/x-python","patch_set":24,"id":"1fa4df85_e0b89211","line":218,"range":{"start_line":218,"start_character":10,"end_line":218,"end_character":52},"in_reply_to":"1fa4df85_9326e867","updated":"2020-03-10 16:48:13.000000000","message":"Good catch. Done.","commit_id":"4d7a8da591928f97dfec1095e59250e5529622db"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"34f796f643572c71721dd5aaf9222db38822d3e4","unresolved":false,"context_lines":[{"line_number":198,"context_line":"    \"\"\"Transform image metadata to required traits."},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    This will modify the request_spec to request hosts that support"},{"line_number":201,"context_line":"    visualisation capabilities based on the image metadata properties."},{"line_number":202,"context_line":"    \"\"\""},{"line_number":203,"context_line":"    if not CONF.scheduler.image_metadata_prefilter:"},{"line_number":204,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":25,"id":"1fa4df85_df986c76","line":201,"range":{"start_line":201,"start_character":4,"end_line":201,"end_character":17},"updated":"2020-03-17 15:02:14.000000000","message":"not just visualization","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"31f17fa0e421bd8f7fe3c3ad19a49b69bb69dcae","unresolved":false,"context_lines":[{"line_number":198,"context_line":"    \"\"\"Transform image metadata to required traits."},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    This will modify the request_spec to request hosts that support"},{"line_number":201,"context_line":"    visualisation capabilities based on the image metadata properties."},{"line_number":202,"context_line":"    \"\"\""},{"line_number":203,"context_line":"    if not CONF.scheduler.image_metadata_prefilter:"},{"line_number":204,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":25,"id":"1fa4df85_fb2761b5","line":201,"range":{"start_line":201,"start_character":4,"end_line":201,"end_character":17},"in_reply_to":"1fa4df85_df986c76","updated":"2020-03-18 18:50:33.000000000","message":"this shoudl be virtualisation not visualisation.","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4021b7a2b21e3cfcb200bf01a4d6c5c7ec8760b2","unresolved":false,"context_lines":[{"line_number":198,"context_line":"    \"\"\"Transform image metadata to required traits."},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    This will modify the request_spec to request hosts that support"},{"line_number":201,"context_line":"    visualisation capabilities based on the image metadata properties."},{"line_number":202,"context_line":"    \"\"\""},{"line_number":203,"context_line":"    if not CONF.scheduler.image_metadata_prefilter:"},{"line_number":204,"context_line":"        return False"}],"source_content_type":"text/x-python","patch_set":25,"id":"1fa4df85_c7587e32","line":201,"range":{"start_line":201,"start_character":4,"end_line":201,"end_character":17},"in_reply_to":"1fa4df85_fb2761b5","updated":"2020-03-19 13:32:14.000000000","message":"Done","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"34f796f643572c71721dd5aaf9222db38822d3e4","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    for key, prefix in prefix_map.items():"},{"line_number":216,"context_line":"        if key in request_spec.image.properties:"},{"line_number":217,"context_line":"            value \u003d getattr(request_spec.image.properties, key).replace("},{"line_number":218,"context_line":"                \u0027-\u0027, \u0027_\u0027).upper()"},{"line_number":219,"context_line":"            trait_name \u003d f\u0027{prefix}_{value}\u0027"},{"line_number":220,"context_line":"            if not hasattr(os_traits, trait_name):"}],"source_content_type":"text/x-python","patch_set":25,"id":"1fa4df85_5fe9dcb4","line":217,"range":{"start_line":217,"start_character":20,"end_line":217,"end_character":63},"updated":"2020-03-17 15:02:14.000000000","message":"key is always in request_spec.image.properties due to the above condition. So I don\u0027t see why we need dynamic field access here.","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"31f17fa0e421bd8f7fe3c3ad19a49b69bb69dcae","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    for key, prefix in prefix_map.items():"},{"line_number":216,"context_line":"        if key in request_spec.image.properties:"},{"line_number":217,"context_line":"            value \u003d getattr(request_spec.image.properties, key).replace("},{"line_number":218,"context_line":"                \u0027-\u0027, \u0027_\u0027).upper()"},{"line_number":219,"context_line":"            trait_name \u003d f\u0027{prefix}_{value}\u0027"},{"line_number":220,"context_line":"            if not hasattr(os_traits, trait_name):"}],"source_content_type":"text/x-python","patch_set":25,"id":"1fa4df85_db806549","line":217,"range":{"start_line":217,"start_character":20,"end_line":217,"end_character":63},"in_reply_to":"1fa4df85_5fe9dcb4","updated":"2020-03-18 18:50:33.000000000","message":"this cant be request_spec.image.properties[key] since its not a dict its a class.\nhowever it does have a get method \nhttps://github.com/openstack/nova/blob/master/nova/objects/image_meta.py#L640\nso we could use that although it will do the dynamic lookup itself.","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1992a57ceaae69865b0c651652f1922a3af1e864","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    for key, prefix in prefix_map.items():"},{"line_number":216,"context_line":"        if key in request_spec.image.properties:"},{"line_number":217,"context_line":"            value \u003d getattr(request_spec.image.properties, key).replace("},{"line_number":218,"context_line":"                \u0027-\u0027, \u0027_\u0027).upper()"},{"line_number":219,"context_line":"            trait_name \u003d f\u0027{prefix}_{value}\u0027"},{"line_number":220,"context_line":"            if not hasattr(os_traits, trait_name):"}],"source_content_type":"text/x-python","patch_set":25,"id":"df33271e_f074e59b","line":217,"range":{"start_line":217,"start_character":20,"end_line":217,"end_character":63},"in_reply_to":"1fa4df85_67af4ae3","updated":"2020-03-24 15:09:27.000000000","message":"Ahh it is a class not adict. Then the original code also make sense. Thanks and sorry.","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4021b7a2b21e3cfcb200bf01a4d6c5c7ec8760b2","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"    for key, prefix in prefix_map.items():"},{"line_number":216,"context_line":"        if key in request_spec.image.properties:"},{"line_number":217,"context_line":"            value \u003d getattr(request_spec.image.properties, key).replace("},{"line_number":218,"context_line":"                \u0027-\u0027, \u0027_\u0027).upper()"},{"line_number":219,"context_line":"            trait_name \u003d f\u0027{prefix}_{value}\u0027"},{"line_number":220,"context_line":"            if not hasattr(os_traits, trait_name):"}],"source_content_type":"text/x-python","patch_set":25,"id":"1fa4df85_67af4ae3","line":217,"range":{"start_line":217,"start_character":20,"end_line":217,"end_character":63},"in_reply_to":"1fa4df85_db806549","updated":"2020-03-19 13:32:14.000000000","message":"Done","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"cf167429196c59d33240d24c4014a3d66cad51a4","unresolved":false,"context_lines":[{"line_number":220,"context_line":"            if not hasattr(os_traits, trait_name):"},{"line_number":221,"context_line":"                LOG.error((\u0027Computed trait name %r is not valid; \u0027"},{"line_number":222,"context_line":"                           \u0027is os-traits up to date?\u0027), trait_name)"},{"line_number":223,"context_line":"                return False"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"            trait_names.append(trait_name)"},{"line_number":226,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"1fa4df85_79283d96","line":223,"range":{"start_line":223,"start_character":16,"end_line":223,"end_character":28},"updated":"2020-03-20 08:07:11.000000000","message":"maybe we should hard failed at here. Then the admin can fix that. I\u0027m not sure.","commit_id":"32d68307dad4870ad44b5996c2f8d42467783ba1"}],"nova/tests/unit/scheduler/test_request_filter.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"cc3ced4423d7cc3a2121e122f08f0e53ffeeaa1f","unresolved":false,"context_lines":[{"line_number":257,"context_line":"                self.context, reqspec))"},{"line_number":258,"context_line":"            known_mock.assert_called_once_with(reqspec)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"            # assert that we invoke the noop transfrom function for unknown"},{"line_number":261,"context_line":"            # metadata properties."},{"line_number":262,"context_line":"            known_mock.reset_mock()"},{"line_number":263,"context_line":"            properties \u003d objects.ImageMetaProps("}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_052d85a7","line":260,"range":{"start_line":260,"start_character":45,"end_line":260,"end_character":54},"updated":"2019-06-18 22:42:52.000000000","message":"transform","commit_id":"afdd0062d70cc53bebb14e9e9ec792f7cf44f1d8"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"cc3ced4423d7cc3a2121e122f08f0e53ffeeaa1f","unresolved":false,"context_lines":[{"line_number":257,"context_line":"                self.context, reqspec))"},{"line_number":258,"context_line":"            known_mock.assert_called_once_with(reqspec)"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"            # assert that we invoke the noop transfrom function for unknown"},{"line_number":261,"context_line":"            # metadata properties."},{"line_number":262,"context_line":"            known_mock.reset_mock()"},{"line_number":263,"context_line":"            properties \u003d objects.ImageMetaProps("}],"source_content_type":"text/x-python","patch_set":1,"id":"9fb8cfa7_8512d561","line":260,"range":{"start_line":260,"start_character":26,"end_line":260,"end_character":44},"updated":"2019-06-18 22:42:52.000000000","message":"we do not invoke a","commit_id":"afdd0062d70cc53bebb14e9e9ec792f7cf44f1d8"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"6c8391be3606c226ef02fcf634d41b9a64ed71ab","unresolved":false,"context_lines":[{"line_number":302,"context_line":"                         spec.flavor.extra_specs)"},{"line_number":303,"context_line":"        log.debug.assert_called_once_with("},{"line_number":304,"context_line":"            \u0027%s request filter added required trait %s\u0027,"},{"line_number":305,"context_line":"            (\"test_filter\", \"COMPUTE_STORAGE_BUS_SATA\"))"},{"line_number":306,"context_line":""},{"line_number":307,"context_line":"    @mock.patch.object(request_filter, \"validate_trait\","},{"line_number":308,"context_line":"                       new\u003dmock.Mock(return_value\u003dTrue))"}],"source_content_type":"text/x-python","patch_set":4,"id":"9fb8cfa7_cba08545","line":305,"range":{"start_line":305,"start_character":13,"end_line":305,"end_character":55},"updated":"2019-06-24 20:38:11.000000000","message":"this should not be wrapped in a tuple","commit_id":"65465f8818cf4df505509d7af9891e355f9cd3bf"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"34f796f643572c71721dd5aaf9222db38822d3e4","unresolved":false,"context_lines":[{"line_number":427,"context_line":"        }"},{"line_number":428,"context_line":"        self.assertEqual(expected, reqspec.root_required)"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    def test_transform_image_metadata__disabled(self):"},{"line_number":431,"context_line":"        self.flags(image_metadata_prefilter\u003dFalse, group\u003d\u0027scheduler\u0027)"},{"line_number":432,"context_line":"        reqspec \u003d objects.RequestSpec(flavor\u003dobjects.Flavor(extra_specs\u003d{}))"},{"line_number":433,"context_line":"        # Assert that we completely skip the filter if disabled"}],"source_content_type":"text/x-python","patch_set":25,"id":"1fa4df85_f52309bd","line":430,"range":{"start_line":430,"start_character":37,"end_line":430,"end_character":39},"updated":"2020-03-17 15:02:14.000000000","message":"double underscore?","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1992a57ceaae69865b0c651652f1922a3af1e864","unresolved":false,"context_lines":[{"line_number":427,"context_line":"        }"},{"line_number":428,"context_line":"        self.assertEqual(expected, reqspec.root_required)"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    def test_transform_image_metadata__disabled(self):"},{"line_number":431,"context_line":"        self.flags(image_metadata_prefilter\u003dFalse, group\u003d\u0027scheduler\u0027)"},{"line_number":432,"context_line":"        reqspec \u003d objects.RequestSpec(flavor\u003dobjects.Flavor(extra_specs\u003d{}))"},{"line_number":433,"context_line":"        # Assert that we completely skip the filter if disabled"}],"source_content_type":"text/x-python","patch_set":25,"id":"df33271e_7060d5cf","line":430,"range":{"start_line":430,"start_character":37,"end_line":430,"end_character":39},"in_reply_to":"1fa4df85_c2586c32","updated":"2020-03-24 15:09:27.000000000","message":"OK, I start getting use to it :)","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4021b7a2b21e3cfcb200bf01a4d6c5c7ec8760b2","unresolved":false,"context_lines":[{"line_number":427,"context_line":"        }"},{"line_number":428,"context_line":"        self.assertEqual(expected, reqspec.root_required)"},{"line_number":429,"context_line":""},{"line_number":430,"context_line":"    def test_transform_image_metadata__disabled(self):"},{"line_number":431,"context_line":"        self.flags(image_metadata_prefilter\u003dFalse, group\u003d\u0027scheduler\u0027)"},{"line_number":432,"context_line":"        reqspec \u003d objects.RequestSpec(flavor\u003dobjects.Flavor(extra_specs\u003d{}))"},{"line_number":433,"context_line":"        # Assert that we completely skip the filter if disabled"}],"source_content_type":"text/x-python","patch_set":25,"id":"1fa4df85_c2586c32","line":430,"range":{"start_line":430,"start_character":37,"end_line":430,"end_character":39},"in_reply_to":"1fa4df85_f52309bd","updated":"2020-03-19 13:32:14.000000000","message":"Intentional :)","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"34f796f643572c71721dd5aaf9222db38822d3e4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"1fa4df85_d5284d98","line":438,"updated":"2020-03-17 15:02:14.000000000","message":"We are missing a test case where the image property value result in a an invalid trait.","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"4021b7a2b21e3cfcb200bf01a4d6c5c7ec8760b2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"1fa4df85_e24d6872","line":438,"in_reply_to":"1fa4df85_d5284d98","updated":"2020-03-19 13:32:14.000000000","message":"I can\u0027t do that because the fields we\u0027re checking in \u0027ImageMetaProps\u0027 are all enum-type fields and yield the following if an invalid value is given:\n\n  ValueError: Field value foo is invalid","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1992a57ceaae69865b0c651652f1922a3af1e864","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"df33271e_f082254f","line":438,"in_reply_to":"1fa4df85_e24d6872","updated":"2020-03-24 15:09:27.000000000","message":"Ohh so this can only happen if the os-traits and the ImageMetaProps diverges which is not today. OK.","commit_id":"184884383bdbe126938f8f34f4166e0ee474db49"}],"releasenotes/notes/image-metadata-prefiltering-2921c1d38951f7a9.yaml":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","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":"    Nova support specifying hyperviors sepcific device models via image properties."},{"line_number":5,"context_line":"    In this release a new image metadata prefilter has been added to allow"},{"line_number":6,"context_line":"    translation of device model request to standard traits. By enabling this feature"},{"line_number":7,"context_line":"    nova is able to utilize placement to select hypervisor hosts that are capable of"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"3fa7e38b_00c2c553","line":4,"range":{"start_line":4,"start_character":28,"end_line":4,"end_character":47},"updated":"2019-10-30 14:37:32.000000000","message":"hypervisor-specific","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","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":"    Nova support specifying hyperviors sepcific device models via image properties."},{"line_number":5,"context_line":"    In this release a new image metadata prefilter has been added to allow"},{"line_number":6,"context_line":"    translation of device model request to standard traits. By enabling this feature"},{"line_number":7,"context_line":"    nova is able to utilize placement to select hypervisor hosts that are capable of"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"3fa7e38b_e0c44962","line":4,"range":{"start_line":4,"start_character":9,"end_line":4,"end_character":16},"updated":"2019-10-30 14:37:32.000000000","message":"supports","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"46a97b84aff0ec4b5a942315bc035af2bbb8b5c6","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":"    Nova support specifying hyperviors sepcific device models via image properties."},{"line_number":5,"context_line":"    In this release a new image metadata prefilter has been added to allow"},{"line_number":6,"context_line":"    translation of device model request to standard traits. By enabling this feature"},{"line_number":7,"context_line":"    nova is able to utilize placement to select hypervisor hosts that are capable of"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"3fa7e38b_06ced657","line":4,"range":{"start_line":4,"start_character":28,"end_line":4,"end_character":47},"in_reply_to":"3fa7e38b_00c2c553","updated":"2020-02-20 16:34:06.000000000","message":"Done","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"46a97b84aff0ec4b5a942315bc035af2bbb8b5c6","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":"    Nova support specifying hyperviors sepcific device models via image properties."},{"line_number":5,"context_line":"    In this release a new image metadata prefilter has been added to allow"},{"line_number":6,"context_line":"    translation of device model request to standard traits. By enabling this feature"},{"line_number":7,"context_line":"    nova is able to utilize placement to select hypervisor hosts that are capable of"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"3fa7e38b_e6d29afe","line":4,"range":{"start_line":4,"start_character":9,"end_line":4,"end_character":16},"in_reply_to":"3fa7e38b_e0c44962","updated":"2020-02-20 16:34:06.000000000","message":"Done","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Nova support specifying hyperviors sepcific device models via image properties."},{"line_number":5,"context_line":"    In this release a new image metadata prefilter has been added to allow"},{"line_number":6,"context_line":"    translation of device model request to standard traits. By enabling this feature"},{"line_number":7,"context_line":"    nova is able to utilize placement to select hypervisor hosts that are capable of"},{"line_number":8,"context_line":"    virtualizing the requested devices. This feature is currently supported by the"},{"line_number":9,"context_line":"    libvirt virt driver and can be enabled by defining"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"3fa7e38b_60a619c3","line":6,"range":{"start_line":6,"start_character":32,"end_line":6,"end_character":39},"updated":"2019-10-30 14:37:32.000000000","message":"requests","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"46a97b84aff0ec4b5a942315bc035af2bbb8b5c6","unresolved":false,"context_lines":[{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Nova support specifying hyperviors sepcific device models via image properties."},{"line_number":5,"context_line":"    In this release a new image metadata prefilter has been added to allow"},{"line_number":6,"context_line":"    translation of device model request to standard traits. By enabling this feature"},{"line_number":7,"context_line":"    nova is able to utilize placement to select hypervisor hosts that are capable of"},{"line_number":8,"context_line":"    virtualizing the requested devices. This feature is currently supported by the"},{"line_number":9,"context_line":"    libvirt virt driver and can be enabled by defining"}],"source_content_type":"text/x-yaml","patch_set":21,"id":"3fa7e38b_a6fee26a","line":6,"range":{"start_line":6,"start_character":32,"end_line":6,"end_character":39},"in_reply_to":"3fa7e38b_60a619c3","updated":"2020-02-20 16:34:06.000000000","message":"Done","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    translation of device model request to standard traits. By enabling this feature"},{"line_number":7,"context_line":"    nova is able to utilize placement to select hypervisor hosts that are capable of"},{"line_number":8,"context_line":"    virtualizing the requested devices. This feature is currently supported by the"},{"line_number":9,"context_line":"    libvirt virt driver and can be enabled by defining"},{"line_number":10,"context_line":"    ``[scheduler]/image_metadata_prefilter\u003dTrue`` in the controller ``nova.conf``."}],"source_content_type":"text/x-yaml","patch_set":21,"id":"3fa7e38b_40919d51","line":9,"range":{"start_line":9,"start_character":12,"end_line":9,"end_character":16},"updated":"2019-10-30 14:37:32.000000000","message":"s/virt//","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"46a97b84aff0ec4b5a942315bc035af2bbb8b5c6","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    translation of device model request to standard traits. By enabling this feature"},{"line_number":7,"context_line":"    nova is able to utilize placement to select hypervisor hosts that are capable of"},{"line_number":8,"context_line":"    virtualizing the requested devices. This feature is currently supported by the"},{"line_number":9,"context_line":"    libvirt virt driver and can be enabled by defining"},{"line_number":10,"context_line":"    ``[scheduler]/image_metadata_prefilter\u003dTrue`` in the controller ``nova.conf``."}],"source_content_type":"text/x-yaml","patch_set":21,"id":"3fa7e38b_c6019e6e","line":9,"range":{"start_line":9,"start_character":12,"end_line":9,"end_character":16},"in_reply_to":"3fa7e38b_40919d51","updated":"2020-02-20 16:34:06.000000000","message":"Done","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"3d50f882c33504a8bc18230340c1541fe276380c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"3fa7e38b_c08eed2c","line":11,"updated":"2019-10-30 14:37:32.000000000","message":"I think you need at least a little explanation of why you might do this.. \"Makes scheduling faster\" or something.","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"46a97b84aff0ec4b5a942315bc035af2bbb8b5c6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"3fa7e38b_46328e5d","line":11,"in_reply_to":"3fa7e38b_c08eed2c","updated":"2020-02-20 16:34:06.000000000","message":"Done","commit_id":"6b248dec4762c1dd0d494fdd069206861783b378"},{"author":{"_account_id":10135,"name":"Lee Yarwood","display_name":"Lee Yarwood","email":"lyarwood@redhat.com","username":"lyarwood"},"change_message_id":"361bdf0d89000626daa80de487b1bb7d911740bf","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    A new image metadata prefilter has been added to allow translation of"},{"line_number":5,"context_line":"    hypervisor-specific device model requests to standard traits. When this"},{"line_number":6,"context_line":"    feature is enabled, nova is able to utilize placement to select hosts that"},{"line_number":7,"context_line":"    are capable of virtualizing the requested devices, avoiding hosts that"},{"line_number":8,"context_line":"    could not support the request. This feature is currently supported by the"},{"line_number":9,"context_line":"    libvirt driver and can be enabled by configuring the"},{"line_number":10,"context_line":"    ``[scheduler]/image_metadata_prefilter`` to ``True`` in the controller"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"1fa4df85_80c7d945","line":7,"range":{"start_line":7,"start_character":19,"end_line":7,"end_character":31},"updated":"2020-03-02 17:40:38.000000000","message":"emulating?","commit_id":"12f9e1d5d2dae3ec7b3b9374141c1b6d6acb00cf"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e66ac53cba2d8c67bde2c0ae03a9bfc77bc06eaa","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    A new image metadata prefilter has been added to allow translation of"},{"line_number":5,"context_line":"    hypervisor-specific device model requests to standard traits. When this"},{"line_number":6,"context_line":"    feature is enabled, nova is able to utilize placement to select hosts that"},{"line_number":7,"context_line":"    are capable of virtualizing the requested devices, avoiding hosts that"},{"line_number":8,"context_line":"    could not support the request. This feature is currently supported by the"},{"line_number":9,"context_line":"    libvirt driver and can be enabled by configuring the"},{"line_number":10,"context_line":"    ``[scheduler]/image_metadata_prefilter`` to ``True`` in the controller"}],"source_content_type":"text/x-yaml","patch_set":23,"id":"1fa4df85_0b6be1b6","line":7,"range":{"start_line":7,"start_character":19,"end_line":7,"end_character":31},"in_reply_to":"1fa4df85_80c7d945","updated":"2020-03-04 17:40:49.000000000","message":"Done","commit_id":"12f9e1d5d2dae3ec7b3b9374141c1b6d6acb00cf"}]}
