)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"20efd52043bcef23b5e48fc21452c45ad2bebf80","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"3c330d23_f4a2fa84","updated":"2025-02-03 16:42:12.000000000","message":"forgot the reno relnote, doh","commit_id":"421f2cdc3d040f20bea9e1ed1e59439e697b2e7c"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"2d38f6c753e8704e6ede12d1ff7d7d609928629d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"209fdad3_6d6f5fd2","updated":"2025-02-05 10:12:32.000000000","message":"-1 mainly because the tests are not working for \"old\" python 3.10 / 3.9.","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"3be73a791576da798d00372fd3a8e7ddb22c5c60","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"e6d0f794_61a2cfc4","updated":"2025-02-06 10:20:39.000000000","message":"doh, I left some TODO 😊","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b9a22220b24d587f16c0dfdc4ad27b0e122ff4f8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"5f0b2634_57191b17","updated":"2025-02-11 12:15:30.000000000","message":"I think we need to be more specific when considering the image props in the weigher to avoid unwanted side effects of the weigher.","commit_id":"4105884a14355431cfc03d3e393cbc293c70b102"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"1679d36b811f948ec3cd3044172513df8ce050af","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"a129cf98_257843e5","updated":"2025-02-11 08:57:49.000000000","message":"recheck same error on volume for both nova-next and nova-multi-cell\n\ntempest.scenario.test_volume_boot_pattern.TestVolumeBootPattern.test_image_defined_boot_from_volume","commit_id":"4105884a14355431cfc03d3e393cbc293c70b102"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"53f2fd4e47cb3c8e004f550084fa0d1bb56b6f04","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"d91fcb52_e4df1c47","updated":"2025-02-12 15:26:02.000000000","message":"there still seams to be a lot of dicussion on the degsin of this so im not sure this should proceed as a specless blueprint aht this point\n\nunless we go back to the design we approved in the blueprint","commit_id":"75c91f589ef41879d140d21138ec0e76c4e53d8f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"983ef4e9f499e18d5b7097d8f6e85477e72afa9b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"57762ccf_a0825e4b","updated":"2025-02-14 15:02:19.000000000","message":"Confused about the o.vo list problem and why that\u0027s not addressed here, but perhaps I\u0027m missing something.","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"37d4f9a507b45bc16622677b538c2d9b7c75133f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"6b9a7f81_142edc6e","updated":"2025-02-14 08:53:15.000000000","message":"recheck py312 timeout","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e0ab600ea687568b9c707dc3ba2c615d3fbf1cc0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"15781d77_86e0f688","updated":"2025-02-17 11:16:27.000000000","message":"so comments inline but mostly agreeign with dan +1 to signify that i dont really object to the current direction so im happy to proceed once dan and gibi are content.","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a3bb78d2e4aeecd73683d628b7134530177b4f69","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"3d9cd9d5_2514251d","updated":"2025-02-18 08:37:15.000000000","message":"There is a race condition where the instance can be deleted while we try to schedule again it in https://github.com/openstack/tempest/blob/338a3b7224a55e88fc46d7f80e8896a3231b910e/tempest/api/compute/images/test_images_oneserver_negative.py#L158 so the weigher fails : \nhttps://4d2664479333d0a7d727-a4adcb41e06ec456a00383225f090da6.ssl.cf5.rackcdn.com/940642/9/check/nova-multi-cell/bbf5fea/controller/logs/screen-n-sch.txt\n\n```\nImagesOneServerNegativeTestJSON-728670221-project-member] Exception during message handling: nova.exception.InstanceNotFound: Instance 84fdf4bf-a36e-4afc-a121-953619ccdbf3 could not be found.\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server Traceback (most recent call last):\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/data/venv/lib/python3.12/site-packages/oslo_messaging/rpc/server.py\", line 174, in _process_incoming\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     res \u003d self.dispatcher.dispatch(message)\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/data/venv/lib/python3.12/site-packages/oslo_messaging/rpc/dispatcher.py\", line 309, in dispatch\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     return self._do_dispatch(endpoint, method, ctxt, args)\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/data/venv/lib/python3.12/site-packages/oslo_messaging/rpc/dispatcher.py\", line 229, in _do_dispatch\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     result \u003d func(ctxt, **new_args)\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server              ^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/data/venv/lib/python3.12/site-packages/oslo_messaging/rpc/server.py\", line 269, in inner\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     return func(*args, **kwargs)\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server            ^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/scheduler/manager.py\", line 257, in select_destinations\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     selections \u003d self._select_destinations(\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server                  ^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/scheduler/manager.py\", line 284, in _select_destinations\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     selections \u003d self._schedule(\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server                  ^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/scheduler/manager.py\", line 421, in _schedule\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     hosts \u003d self._get_sorted_hosts(spec_obj, hosts, num)\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/scheduler/manager.py\", line 713, in _get_sorted_hosts\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     weighed_hosts \u003d self.host_manager.get_weighed_hosts(\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/scheduler/host_manager.py\", line 622, in get_weighed_hosts\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     return self.weight_handler.get_weighed_objects(self.weighers,\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/weights.py\", line 134, in get_weighed_objects\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     weights \u003d weigher.weigh_objects(weighed_objs, weighing_properties)\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/weights.py\", line 110, in weigh_objects\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     weight \u003d self._weigh_object(obj.obj, weight_properties)\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/scheduler/weights/image_props.py\", line 62, in _weigh_object\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     if inst.image_meta else set()\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server        ^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/objects/instance.py\", line 258, in image_meta\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     return objects.ImageMeta.from_instance(self)\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/objects/image_meta.py\", line 125, in from_instance\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     sysmeta \u003d utils.instance_sys_meta(instance)\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/utils.py\", line 548, in instance_sys_meta\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     if not instance.get(\u0027system_metadata\u0027):\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/data/venv/lib/python3.12/site-packages/oslo_versionedobjects/base.py\", line 767, in get\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     return getattr(self, key)\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server            ^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/data/venv/lib/python3.12/site-packages/oslo_versionedobjects/base.py\", line 67, in getter\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     self.obj_load_attr(name)\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/objects/base.py\", line 130, in wrapper\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     return fn(self, attrname)\nFeb 17 19:20:02.785954 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server            ^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/objects/instance.py\", line 1148, in obj_load_attr\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     self._obj_load_attr(attrname)\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/objects/instance.py\", line 1212, in _obj_load_attr\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     self._load_generic(attrname)\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/objects/instance.py\", line 922, in _load_generic\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     instance \u003d self.__class__.get_by_uuid(self._context,\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/data/venv/lib/python3.12/site-packages/oslo_versionedobjects/base.py\", line 184, in wrapper\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     result \u003d fn(cls, context, *args, **kwargs)\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/objects/instance.py\", line 530, in get_by_uuid\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     db_inst \u003d cls._db_instance_get_by_uuid(context, uuid, columns_to_join,\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/db/main/api.py\", line 179, in wrapper\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     return f(*args, **kwargs)\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server            ^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/objects/instance.py\", line 522, in _db_instance_get_by_uuid\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     return db.instance_get_by_uuid(context, uuid,\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/db/utils.py\", line 35, in wrapper\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     return f(*args, **kwargs)\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server            ^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/db/main/api.py\", line 241, in wrapper\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     return f(context, *args, **kwargs)\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server            ^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/db/main/api.py\", line 1395, in instance_get_by_uuid\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     return _instance_get_by_uuid(context, uuid,\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server   File \"/opt/stack/nova/nova/db/main/api.py\", line 1405, in _instance_get_by_uuid\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server     raise exception.InstanceNotFound(instance_id\u003duuid)\nFeb 17 19:20:02.792582 np0039881226 nova-scheduler[84264]: ERROR oslo_messaging.rpc.server nova.exception.InstanceNotFound: Instance 84fdf4bf-a36e-4afc-a121-953619ccdbf3 could not be found.```","commit_id":"dfffc0e0004b6795ab2f0b9bddf94168d45e5117"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9630d1cb7864374eaea0faf658de225b781cb07b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"3827a03d_84c5daba","updated":"2025-02-17 18:39:35.000000000","message":"im +2 but i wont +w to give gibi  time to review.","commit_id":"dfffc0e0004b6795ab2f0b9bddf94168d45e5117"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8087d4cd999165f4bb8a4a0d3aebf95428ab5d7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"1da61612_74a2a188","updated":"2025-02-18 19:15:58.000000000","message":"Exposing that race may have been a blessing in disguise...","commit_id":"bb14c2ff4b29d37af279de74be353a987a15e1b5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"275b65e031f6de40fee79cea524fc8a2854c809f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"9855cf72_8d16aded","updated":"2025-02-18 21:35:04.000000000","message":"Sylvain, if you want me to take over this tomorrow and try to get that query/fill thing fleshed out, tested, and used here I can do that so you can move on to other stuff.","commit_id":"bb14c2ff4b29d37af279de74be353a987a15e1b5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4d30177c04f22b8ba01cd9a3de38feb5e500878d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"159f3657_b794d1d3","in_reply_to":"9855cf72_8d16aded","updated":"2025-02-19 08:02:46.000000000","message":"Thanks Dan for your comments and indeed the lazyloading of the system metadata was one concern a bit earlier.\n\nLet\u0027s discuss this when you\u0027re back on today, for sure.","commit_id":"bb14c2ff4b29d37af279de74be353a987a15e1b5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"5d1deb437fd6be8f73f9b81045d2abfc56009f61","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"f764c5d5_33056efa","updated":"2025-02-20 14:53:45.000000000","message":"No lazy-loading seen in the n-sch log, so seems good to me!","commit_id":"acd6c733c6c9c08dd449173f96d16fb159d53f8e"}],"nova/conf/scheduler.py":[{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"2d38f6c753e8704e6ede12d1ff7d7d609928629d","unresolved":true,"context_lines":[{"line_number":553,"context_line":""},{"line_number":554,"context_line":"The multiplier is used for weighting hosts based on the reported"},{"line_number":555,"context_line":"image properties for the instances they have."},{"line_number":556,"context_line":"Negative numbers indicate preferring hosts with XXXX, while positive numbers"},{"line_number":557,"context_line":"mean preferring hosts with more hosts (ie. choosing to pack)."},{"line_number":558,"context_line":"The default is 0.0 which means that you have to choose a strategy if you want"},{"line_number":559,"context_line":"to use it."},{"line_number":560,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"aeb99551_ad5a9a6f","line":557,"range":{"start_line":556,"start_character":0,"end_line":557,"end_character":61},"updated":"2025-02-05 10:12:32.000000000","message":"I think what you used above is better/clearer:\nA positive value will favor hosts with the same image properties (packing\nstrategy) while a negative value will follow a spread strategy that will\nfavor hosts not already having instances with those image properties.","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"52ed9036c4162e1ba4e29db50fc9310b5b753144","unresolved":false,"context_lines":[{"line_number":553,"context_line":""},{"line_number":554,"context_line":"The multiplier is used for weighting hosts based on the reported"},{"line_number":555,"context_line":"image properties for the instances they have."},{"line_number":556,"context_line":"Negative numbers indicate preferring hosts with XXXX, while positive numbers"},{"line_number":557,"context_line":"mean preferring hosts with more hosts (ie. choosing to pack)."},{"line_number":558,"context_line":"The default is 0.0 which means that you have to choose a strategy if you want"},{"line_number":559,"context_line":"to use it."},{"line_number":560,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"546ef670_3cf5f004","line":557,"range":{"start_line":556,"start_character":0,"end_line":557,"end_character":61},"in_reply_to":"aeb99551_ad5a9a6f","updated":"2025-02-07 16:23:49.000000000","message":"Done","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"032901ca60264b17988920a7c235efe927ce6224","unresolved":true,"context_lines":[{"line_number":577,"context_line":"  .. code-block:: ini"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    [filter_scheduler]"},{"line_number":580,"context_line":"    image_props_weight_multiplier\u003d1.0"},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"* Disable weigher influence"},{"line_number":583,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"8fe58c5b_34d7b410","line":580,"range":{"start_line":580,"start_character":34,"end_line":580,"end_character":37},"updated":"2025-02-12 17:54:16.000000000","message":"this should be -1.0 for spreading\n\nthis woudl be softly prefring to pack\n\nsince positive is pack and negitive is spread","commit_id":"859f76882ab5fc0803fa74faf96c50d8d7e55260"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"300a1b65573e2846861adc255c507fc5587911d9","unresolved":false,"context_lines":[{"line_number":577,"context_line":"  .. code-block:: ini"},{"line_number":578,"context_line":""},{"line_number":579,"context_line":"    [filter_scheduler]"},{"line_number":580,"context_line":"    image_props_weight_multiplier\u003d1.0"},{"line_number":581,"context_line":""},{"line_number":582,"context_line":"* Disable weigher influence"},{"line_number":583,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"8682798c_9a02ee05","line":580,"range":{"start_line":580,"start_character":34,"end_line":580,"end_character":37},"in_reply_to":"8fe58c5b_34d7b410","updated":"2025-02-13 18:48:52.000000000","message":"Done","commit_id":"859f76882ab5fc0803fa74faf96c50d8d7e55260"}],"nova/objects/base.py":[{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"9930788cf19ce2499e81cd4e71aadfb4c5367a8c","unresolved":true,"context_lines":[{"line_number":178,"context_line":"        finally:"},{"line_number":179,"context_line":"            self._context \u003d original_context"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    #  NOTE(sbauza): This is generic enough that it could be ported to o.vo"},{"line_number":182,"context_line":"    @property"},{"line_number":183,"context_line":"    def set_fields(self):"},{"line_number":184,"context_line":"        \"\"\"Returns a set of tuples containing each field with its value.\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"acb1c91f_1985244f","line":181,"range":{"start_line":181,"start_character":72,"end_line":181,"end_character":73},"updated":"2025-02-10 09:49:16.000000000","message":"Typo here.","commit_id":"613e96c2b95db2780357004ef235666cb40f25a9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ef2de8dc318158d71d20cae2544432d1f928943b","unresolved":true,"context_lines":[{"line_number":178,"context_line":"        finally:"},{"line_number":179,"context_line":"            self._context \u003d original_context"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    #  NOTE(sbauza): This is generic enough that it could be ported to o.vo"},{"line_number":182,"context_line":"    @property"},{"line_number":183,"context_line":"    def set_fields(self):"},{"line_number":184,"context_line":"        \"\"\"Returns a set of tuples containing each field with its value.\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"6fa63671_082815ba","line":181,"range":{"start_line":181,"start_character":72,"end_line":181,"end_character":73},"in_reply_to":"acb1c91f_1985244f","updated":"2025-02-11 15:54:47.000000000","message":"I must be missing it -- what\u0027s the typo?","commit_id":"613e96c2b95db2780357004ef235666cb40f25a9"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f50ed6618f6d0772f7992a60b979de2a830d17a2","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        finally:"},{"line_number":179,"context_line":"            self._context \u003d original_context"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    #  NOTE(sbauza): This is generic enough that it could be ported to o.vo"},{"line_number":182,"context_line":"    @property"},{"line_number":183,"context_line":"    def set_fields(self):"},{"line_number":184,"context_line":"        \"\"\"Returns a set of tuples containing each field with its value.\"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"5d57a1d2_2361b25a","line":181,"range":{"start_line":181,"start_character":72,"end_line":181,"end_character":73},"in_reply_to":"acb1c91f_1985244f","updated":"2025-02-11 17:14:35.000000000","message":"nope, this is the standard acronym for oslo.versionedobjects :-)","commit_id":"613e96c2b95db2780357004ef235666cb40f25a9"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"ef2de8dc318158d71d20cae2544432d1f928943b","unresolved":true,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    #  NOTE(sbauza): This is generic enough that it could be ported to o.vo"},{"line_number":182,"context_line":"    @property"},{"line_number":183,"context_line":"    def set_fields(self):"},{"line_number":184,"context_line":"        \"\"\"Returns a set of tuples containing each field with its value.\"\"\""},{"line_number":185,"context_line":"        return {(field, getattr(self, field))"},{"line_number":186,"context_line":"                for field in self.fields if field in self}"}],"source_content_type":"text/x-python","patch_set":5,"id":"9d52a4a8_072fae0e","line":183,"updated":"2025-02-11 15:54:47.000000000","message":"This is also basically like `dict.items()` so it might be good to just mirror that, especially given our dict-compat heritage here :)","commit_id":"4105884a14355431cfc03d3e393cbc293c70b102"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"08bf64a94b5b74667baf7d622cde4279eb7b6a63","unresolved":false,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    #  NOTE(sbauza): This is generic enough that it could be ported to o.vo"},{"line_number":182,"context_line":"    @property"},{"line_number":183,"context_line":"    def set_fields(self):"},{"line_number":184,"context_line":"        \"\"\"Returns a set of tuples containing each field with its value.\"\"\""},{"line_number":185,"context_line":"        return {(field, getattr(self, field))"},{"line_number":186,"context_line":"                for field in self.fields if field in self}"}],"source_content_type":"text/x-python","patch_set":5,"id":"04251ed0_fdc5d235","line":183,"in_reply_to":"9d52a4a8_072fae0e","updated":"2025-02-11 18:22:13.000000000","message":"Done","commit_id":"4105884a14355431cfc03d3e393cbc293c70b102"}],"nova/objects/image_meta.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"983ef4e9f499e18d5b7097d8f6e85477e72afa9b","unresolved":true,"context_lines":[{"line_number":736,"context_line":""},{"line_number":737,"context_line":"        return obj"},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"    # NOTE(sbauza): This is generic enough that it could be ported to o.vo"},{"line_number":740,"context_line":"    def to_dict(self):"},{"line_number":741,"context_line":"        \"\"\"Returns a dictionary of image properties that are set.\"\"\""},{"line_number":742,"context_line":"        return base.obj_to_primitive(self)"}],"source_content_type":"text/x-python","patch_set":8,"id":"a5d685b4_093f3ca8","line":739,"updated":"2025-02-14 15:02:19.000000000","message":"Again, I think if people want that, then they should just mix-in dictcompat :)","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4d7ff6bfc23143cdc053101c519bd188251d02ed","unresolved":false,"context_lines":[{"line_number":736,"context_line":""},{"line_number":737,"context_line":"        return obj"},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"    # NOTE(sbauza): This is generic enough that it could be ported to o.vo"},{"line_number":740,"context_line":"    def to_dict(self):"},{"line_number":741,"context_line":"        \"\"\"Returns a dictionary of image properties that are set.\"\"\""},{"line_number":742,"context_line":"        return base.obj_to_primitive(self)"}],"source_content_type":"text/x-python","patch_set":8,"id":"bf90b6b8_ab7556c6","line":739,"in_reply_to":"401608aa_e9ef0790","updated":"2025-02-17 16:57:20.000000000","message":"well, I didn\u0027t want to make invasive changes and given the object was already providing a from_dict() method, I thought this was aligned, but please review again the change once I reupload it and propose something else if you want it, no worries.","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"deaef5b73483dc3acebd77f208e79b633ca6c26c","unresolved":false,"context_lines":[{"line_number":736,"context_line":""},{"line_number":737,"context_line":"        return obj"},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"    # NOTE(sbauza): This is generic enough that it could be ported to o.vo"},{"line_number":740,"context_line":"    def to_dict(self):"},{"line_number":741,"context_line":"        \"\"\"Returns a dictionary of image properties that are set.\"\"\""},{"line_number":742,"context_line":"        return base.obj_to_primitive(self)"}],"source_content_type":"text/x-python","patch_set":8,"id":"c30cc87e_35e1e12f","line":739,"in_reply_to":"a5d685b4_093f3ca8","updated":"2025-02-17 10:45:47.000000000","message":"I\u0027ll remove that comment","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4ecc7df56c579416fcc1f88b6b732ae53b40cbaf","unresolved":false,"context_lines":[{"line_number":736,"context_line":""},{"line_number":737,"context_line":"        return obj"},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"    # NOTE(sbauza): This is generic enough that it could be ported to o.vo"},{"line_number":740,"context_line":"    def to_dict(self):"},{"line_number":741,"context_line":"        \"\"\"Returns a dictionary of image properties that are set.\"\"\""},{"line_number":742,"context_line":"        return base.obj_to_primitive(self)"}],"source_content_type":"text/x-python","patch_set":8,"id":"a10e0bc6_c6cc7f62","line":739,"in_reply_to":"bf90b6b8_ab7556c6","updated":"2025-02-17 17:26:32.000000000","message":"I would just remove the comment and leave the code, but it\u0027s not critical either way.","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e0ab600ea687568b9c707dc3ba2c615d3fbf1cc0","unresolved":true,"context_lines":[{"line_number":736,"context_line":""},{"line_number":737,"context_line":"        return obj"},{"line_number":738,"context_line":""},{"line_number":739,"context_line":"    # NOTE(sbauza): This is generic enough that it could be ported to o.vo"},{"line_number":740,"context_line":"    def to_dict(self):"},{"line_number":741,"context_line":"        \"\"\"Returns a dictionary of image properties that are set.\"\"\""},{"line_number":742,"context_line":"        return base.obj_to_primitive(self)"}],"source_content_type":"text/x-python","patch_set":8,"id":"401608aa_e9ef0790","line":739,"in_reply_to":"c30cc87e_35e1e12f","updated":"2025-02-17 11:16:27.000000000","message":"i kind of agree with dan although we are ment to avoid dictcompat mixin as it was intended as a transitionary path although i dont object to using it in this class specfically if we agree its cleaner.\n\nif we were to prot this to ovo i would proably implemnt this differntly.\ni.e. implement __iter__ such that you could iterate over all the set filed tuples of a object or simialr.\n\nto_dict is not actully what you wanted you wanted to iterate over the set members but didnt way to write a function to do that.\n\nyou just using obj_to_primitive and to_dict so you can achive that.\n\nanyway if you remove the comment and or just use the dictcomap mixing in ok with it assume dan is too.","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"983ef4e9f499e18d5b7097d8f6e85477e72afa9b","unresolved":true,"context_lines":[{"line_number":739,"context_line":"    # NOTE(sbauza): This is generic enough that it could be ported to o.vo"},{"line_number":740,"context_line":"    def to_dict(self):"},{"line_number":741,"context_line":"        \"\"\"Returns a dictionary of image properties that are set.\"\"\""},{"line_number":742,"context_line":"        return base.obj_to_primitive(self)"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def get(self, name, defvalue\u003dNone):"},{"line_number":745,"context_line":"        \"\"\"Get the value of an attribute"}],"source_content_type":"text/x-python","patch_set":8,"id":"0371a208_c0eb65a5","line":742,"updated":"2025-02-14 15:02:19.000000000","message":"Did you resolve the problem with this not working as expected because it left some of the List subclasses in it? I don\u0027t see where a change was made for that.","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"deaef5b73483dc3acebd77f208e79b633ca6c26c","unresolved":true,"context_lines":[{"line_number":739,"context_line":"    # NOTE(sbauza): This is generic enough that it could be ported to o.vo"},{"line_number":740,"context_line":"    def to_dict(self):"},{"line_number":741,"context_line":"        \"\"\"Returns a dictionary of image properties that are set.\"\"\""},{"line_number":742,"context_line":"        return base.obj_to_primitive(self)"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def get(self, name, defvalue\u003dNone):"},{"line_number":745,"context_line":"        \"\"\"Get the value of an attribute"}],"source_content_type":"text/x-python","patch_set":8,"id":"bb150fc9_bb6336e8","line":742,"in_reply_to":"0371a208_c0eb65a5","updated":"2025-02-17 10:45:47.000000000","message":"Yup, because I eventually stringified the value : \n\n``{(key, f\"{value}\") for key, value in something.to_dict()}``\nhttps://review.opendev.org/c/openstack/nova/+/940642/8/nova/scheduler/weights/image_props.py\n\nSo basically the set hashes the list by the string :-)","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4ecc7df56c579416fcc1f88b6b732ae53b40cbaf","unresolved":false,"context_lines":[{"line_number":739,"context_line":"    # NOTE(sbauza): This is generic enough that it could be ported to o.vo"},{"line_number":740,"context_line":"    def to_dict(self):"},{"line_number":741,"context_line":"        \"\"\"Returns a dictionary of image properties that are set.\"\"\""},{"line_number":742,"context_line":"        return base.obj_to_primitive(self)"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def get(self, name, defvalue\u003dNone):"},{"line_number":745,"context_line":"        \"\"\"Get the value of an attribute"}],"source_content_type":"text/x-python","patch_set":8,"id":"8e98d3de_9b3371dc","line":742,"in_reply_to":"b740c490_9e4d173e","updated":"2025-02-17 17:26:32.000000000","message":"String is least effort and I don\u0027t really think implementing the hash is the right way. What we want is an actual primitive and not a \"hashable thing\". We don\u0027t want to make it past these sorts of checks and ever send something non-primitive over the wire.","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e0ab600ea687568b9c707dc3ba2c615d3fbf1cc0","unresolved":true,"context_lines":[{"line_number":739,"context_line":"    # NOTE(sbauza): This is generic enough that it could be ported to o.vo"},{"line_number":740,"context_line":"    def to_dict(self):"},{"line_number":741,"context_line":"        \"\"\"Returns a dictionary of image properties that are set.\"\"\""},{"line_number":742,"context_line":"        return base.obj_to_primitive(self)"},{"line_number":743,"context_line":""},{"line_number":744,"context_line":"    def get(self, name, defvalue\u003dNone):"},{"line_number":745,"context_line":"        \"\"\"Get the value of an attribute"}],"source_content_type":"text/x-python","patch_set":8,"id":"b740c490_9e4d173e","line":742,"in_reply_to":"bb150fc9_bb6336e8","updated":"2025-02-17 11:16:27.000000000","message":"the alternative was either to fix ovo to define a hash function or modify our class definitons for our list types.\n\ni suggested just making the tuple a string  instead wehn we used it\nas the least invaisive change","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"}],"nova/scheduler/weights/image_props.py":[{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"2d38f6c753e8704e6ede12d1ff7d7d609928629d","unresolved":true,"context_lines":[{"line_number":14,"context_line":"Image Properties Weigher. Weigh hosts by the image metadata properties"},{"line_number":15,"context_line":"related to the existing instances."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The default is to select hosts with XXXX for a spreading strategy."},{"line_number":18,"context_line":"If you prefer to invert this behavior set the \u0027image_props_weight_multiplier\u0027"},{"line_number":19,"context_line":"option to a positive number and the weighing has the opposite effect of the"},{"line_number":20,"context_line":"default."},{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from collections import Counter"}],"source_content_type":"text/x-python","patch_set":2,"id":"4433d6c5_67ebbf8c","line":20,"range":{"start_line":17,"start_character":0,"end_line":20,"end_character":8},"updated":"2025-02-05 10:12:32.000000000","message":"ditto.","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a18b1f04e1be12acedd3fcc4fc2b1c396ebb0eca","unresolved":true,"context_lines":[{"line_number":14,"context_line":"Image Properties Weigher. Weigh hosts by the image metadata properties"},{"line_number":15,"context_line":"related to the existing instances."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The default is to select hosts with XXXX for a spreading strategy."},{"line_number":18,"context_line":"If you prefer to invert this behavior set the \u0027image_props_weight_multiplier\u0027"},{"line_number":19,"context_line":"option to a positive number and the weighing has the opposite effect of the"},{"line_number":20,"context_line":"default."},{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from collections import Counter"}],"source_content_type":"text/x-python","patch_set":2,"id":"535f4122_c62b8da4","line":20,"range":{"start_line":17,"start_character":0,"end_line":20,"end_character":8},"in_reply_to":"4433d6c5_67ebbf8c","updated":"2025-02-05 18:42:24.000000000","message":"What\u0027s the XXXX? Are you looking for help with wording?","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"52ed9036c4162e1ba4e29db50fc9310b5b753144","unresolved":false,"context_lines":[{"line_number":14,"context_line":"Image Properties Weigher. Weigh hosts by the image metadata properties"},{"line_number":15,"context_line":"related to the existing instances."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The default is to select hosts with XXXX for a spreading strategy."},{"line_number":18,"context_line":"If you prefer to invert this behavior set the \u0027image_props_weight_multiplier\u0027"},{"line_number":19,"context_line":"option to a positive number and the weighing has the opposite effect of the"},{"line_number":20,"context_line":"default."},{"line_number":21,"context_line":"\"\"\""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from collections import Counter"}],"source_content_type":"text/x-python","patch_set":2,"id":"c4e007e4_6ed67620","line":20,"range":{"start_line":17,"start_character":0,"end_line":20,"end_character":8},"in_reply_to":"535f4122_c62b8da4","updated":"2025-02-07 16:23:49.000000000","message":"it was litterally a doc TODO when I started to write the module and then I forgot to modify it later 😊","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"2d38f6c753e8704e6ede12d1ff7d7d609928629d","unresolved":true,"context_lines":[{"line_number":52,"context_line":"           If you want to spread instances with the same properties between"},{"line_number":53,"context_line":"           hosts, change the multiplier value to a negative number."},{"line_number":54,"context_line":"        \"\"\""},{"line_number":55,"context_line":"        requested_props \u003d (_set(weight_properties.image.properties)"},{"line_number":56,"context_line":"                           if weight_properties.image"},{"line_number":57,"context_line":"                           else set())"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        existing_props \u003d [tup for iter in [_set(inst.image_meta.properties)"},{"line_number":60,"context_line":"                          if inst.image_meta else set()"}],"source_content_type":"text/x-python","patch_set":2,"id":"e4267a85_0ce2c582","line":57,"range":{"start_line":55,"start_character":8,"end_line":57,"end_character":38},"updated":"2025-02-05 10:12:32.000000000","message":"I don\u0027t like ternary. But let\u0027s say it is ok. 😊","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"52ed9036c4162e1ba4e29db50fc9310b5b753144","unresolved":false,"context_lines":[{"line_number":52,"context_line":"           If you want to spread instances with the same properties between"},{"line_number":53,"context_line":"           hosts, change the multiplier value to a negative number."},{"line_number":54,"context_line":"        \"\"\""},{"line_number":55,"context_line":"        requested_props \u003d (_set(weight_properties.image.properties)"},{"line_number":56,"context_line":"                           if weight_properties.image"},{"line_number":57,"context_line":"                           else set())"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        existing_props \u003d [tup for iter in [_set(inst.image_meta.properties)"},{"line_number":60,"context_line":"                          if inst.image_meta else set()"}],"source_content_type":"text/x-python","patch_set":2,"id":"896c5af4_d50feea0","line":57,"range":{"start_line":55,"start_character":8,"end_line":57,"end_character":38},"in_reply_to":"10e7f9ab_ff84c19c","updated":"2025-02-07 16:23:49.000000000","message":"image can be None so we still need the ternary","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"9b9eab0902e064ea4af094403032bbd60af8f3c7","unresolved":true,"context_lines":[{"line_number":52,"context_line":"           If you want to spread instances with the same properties between"},{"line_number":53,"context_line":"           hosts, change the multiplier value to a negative number."},{"line_number":54,"context_line":"        \"\"\""},{"line_number":55,"context_line":"        requested_props \u003d (_set(weight_properties.image.properties)"},{"line_number":56,"context_line":"                           if weight_properties.image"},{"line_number":57,"context_line":"                           else set())"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        existing_props \u003d [tup for iter in [_set(inst.image_meta.properties)"},{"line_number":60,"context_line":"                          if inst.image_meta else set()"}],"source_content_type":"text/x-python","patch_set":2,"id":"6e95d9d5_e37338c6","line":57,"range":{"start_line":55,"start_character":8,"end_line":57,"end_character":38},"in_reply_to":"23d1179e_5c365e3b","updated":"2025-02-06 10:25:12.000000000","message":"Dan, fine with me, although you have bad taste. 😅","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f744b3fd91ce142edb8487ef085523bc6afe7778","unresolved":true,"context_lines":[{"line_number":52,"context_line":"           If you want to spread instances with the same properties between"},{"line_number":53,"context_line":"           hosts, change the multiplier value to a negative number."},{"line_number":54,"context_line":"        \"\"\""},{"line_number":55,"context_line":"        requested_props \u003d (_set(weight_properties.image.properties)"},{"line_number":56,"context_line":"                           if weight_properties.image"},{"line_number":57,"context_line":"                           else set())"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        existing_props \u003d [tup for iter in [_set(inst.image_meta.properties)"},{"line_number":60,"context_line":"                          if inst.image_meta else set()"}],"source_content_type":"text/x-python","patch_set":2,"id":"7512f5bf_c7892fbf","line":57,"range":{"start_line":55,"start_character":8,"end_line":57,"end_character":38},"in_reply_to":"6e95d9d5_e37338c6","updated":"2025-02-06 10:48:07.000000000","message":"real trinaries use : ?\npython is too readable with spelling out the words.\n\nthe real question is why is why did you call it _set\n\nthat is very confusing, itnially i was like are we somehow translating this.","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"65e94fda15e725cd17fad01314eae86d2011cccd","unresolved":true,"context_lines":[{"line_number":52,"context_line":"           If you want to spread instances with the same properties between"},{"line_number":53,"context_line":"           hosts, change the multiplier value to a negative number."},{"line_number":54,"context_line":"        \"\"\""},{"line_number":55,"context_line":"        requested_props \u003d (_set(weight_properties.image.properties)"},{"line_number":56,"context_line":"                           if weight_properties.image"},{"line_number":57,"context_line":"                           else set())"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        existing_props \u003d [tup for iter in [_set(inst.image_meta.properties)"},{"line_number":60,"context_line":"                          if inst.image_meta else set()"}],"source_content_type":"text/x-python","patch_set":2,"id":"10e7f9ab_ff84c19c","line":57,"range":{"start_line":55,"start_character":8,"end_line":57,"end_character":38},"in_reply_to":"7512f5bf_c7892fbf","updated":"2025-02-06 10:57:01.000000000","message":"by the way if you add the set_fields funciton i think this becomes\n```\n requested_props \u003d weight_properties.image.properties.set_filed or set()\n```","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a18b1f04e1be12acedd3fcc4fc2b1c396ebb0eca","unresolved":true,"context_lines":[{"line_number":52,"context_line":"           If you want to spread instances with the same properties between"},{"line_number":53,"context_line":"           hosts, change the multiplier value to a negative number."},{"line_number":54,"context_line":"        \"\"\""},{"line_number":55,"context_line":"        requested_props \u003d (_set(weight_properties.image.properties)"},{"line_number":56,"context_line":"                           if weight_properties.image"},{"line_number":57,"context_line":"                           else set())"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        existing_props \u003d [tup for iter in [_set(inst.image_meta.properties)"},{"line_number":60,"context_line":"                          if inst.image_meta else set()"}],"source_content_type":"text/x-python","patch_set":2,"id":"23d1179e_5c365e3b","line":57,"range":{"start_line":55,"start_character":8,"end_line":57,"end_character":38},"in_reply_to":"e4267a85_0ce2c582","updated":"2025-02-05 18:42:24.000000000","message":"I vote *for* ternary :)","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"2d38f6c753e8704e6ede12d1ff7d7d609928629d","unresolved":true,"context_lines":[{"line_number":56,"context_line":"                           if weight_properties.image"},{"line_number":57,"context_line":"                           else set())"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        existing_props \u003d [tup for iter in [_set(inst.image_meta.properties)"},{"line_number":60,"context_line":"                          if inst.image_meta else set()"},{"line_number":61,"context_line":"                          for inst in host_state.instances.values()]"},{"line_number":62,"context_line":"                          for tup in iter]"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        # Let\u0027s make them Counters for easy maths"},{"line_number":65,"context_line":"        existing_props \u003d Counter(existing_props)"}],"source_content_type":"text/x-python","patch_set":2,"id":"d1eb76df_b07686e3","line":62,"range":{"start_line":59,"start_character":8,"end_line":62,"end_character":42},"updated":"2025-02-05 10:12:32.000000000","message":"This one gave me a headache. 😕\nI think it can be written:\n```python\nexisting_props \u003d []\nfor inst in host_state.instances.values():\n    if inst.image_meta:\n        existing_props.extend(_set(inst.image_meta.properties))\n```\n\nI know this is not functional, but in this case I find it easier to read.","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"52ed9036c4162e1ba4e29db50fc9310b5b753144","unresolved":false,"context_lines":[{"line_number":56,"context_line":"                           if weight_properties.image"},{"line_number":57,"context_line":"                           else set())"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        existing_props \u003d [tup for iter in [_set(inst.image_meta.properties)"},{"line_number":60,"context_line":"                          if inst.image_meta else set()"},{"line_number":61,"context_line":"                          for inst in host_state.instances.values()]"},{"line_number":62,"context_line":"                          for tup in iter]"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        # Let\u0027s make them Counters for easy maths"},{"line_number":65,"context_line":"        existing_props \u003d Counter(existing_props)"}],"source_content_type":"text/x-python","patch_set":2,"id":"feff38b8_b3dd16f2","line":62,"range":{"start_line":59,"start_character":8,"end_line":62,"end_character":42},"in_reply_to":"492f3357_67577f25","updated":"2025-02-07 16:23:49.000000000","message":"Acknowledged","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"9b9eab0902e064ea4af094403032bbd60af8f3c7","unresolved":true,"context_lines":[{"line_number":56,"context_line":"                           if weight_properties.image"},{"line_number":57,"context_line":"                           else set())"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        existing_props \u003d [tup for iter in [_set(inst.image_meta.properties)"},{"line_number":60,"context_line":"                          if inst.image_meta else set()"},{"line_number":61,"context_line":"                          for inst in host_state.instances.values()]"},{"line_number":62,"context_line":"                          for tup in iter]"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        # Let\u0027s make them Counters for easy maths"},{"line_number":65,"context_line":"        existing_props \u003d Counter(existing_props)"}],"source_content_type":"text/x-python","patch_set":2,"id":"492f3357_67577f25","line":62,"range":{"start_line":59,"start_character":8,"end_line":62,"end_character":42},"in_reply_to":"884e842a_cf25d811","updated":"2025-02-06 10:25:12.000000000","message":"Yes, list comprehensions are usually more efficient. However, I’m not convinced it will make a significant difference in this case, but I won’t ask for a microbenchmark. :)\n\nI tend to favor something more readable without comments, over a slightly more performant approach.\nThat said, I can live with the list comprehension, as I can read it.","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a18b1f04e1be12acedd3fcc4fc2b1c396ebb0eca","unresolved":true,"context_lines":[{"line_number":56,"context_line":"                           if weight_properties.image"},{"line_number":57,"context_line":"                           else set())"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        existing_props \u003d [tup for iter in [_set(inst.image_meta.properties)"},{"line_number":60,"context_line":"                          if inst.image_meta else set()"},{"line_number":61,"context_line":"                          for inst in host_state.instances.values()]"},{"line_number":62,"context_line":"                          for tup in iter]"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"        # Let\u0027s make them Counters for easy maths"},{"line_number":65,"context_line":"        existing_props \u003d Counter(existing_props)"}],"source_content_type":"text/x-python","patch_set":2,"id":"884e842a_cf25d811","line":62,"range":{"start_line":59,"start_character":8,"end_line":62,"end_character":42},"in_reply_to":"d1eb76df_b07686e3","updated":"2025-02-05 18:42:24.000000000","message":"The listcomp is far more efficient, so I prefer what Sylvain has here. It\u0027s definitely harder to read when you need to, but at runtime it\u0027s better.\n\nA comment above this explaining what it\u0027s doing and showing the format of the tuple to be stored in the resulting list would help,","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f744b3fd91ce142edb8487ef085523bc6afe7778","unresolved":true,"context_lines":[{"line_number":29,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def _set(props_obj):"},{"line_number":33,"context_line":"    \"\"\"Returns a set of tuples containing all ImageMetaProps fields that"},{"line_number":34,"context_line":"       are set."},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":"    prim \u003d props_obj.obj_to_primitive()"},{"line_number":37,"context_line":"    props_dict \u003d prim[\u0027nova_object.data\u0027]"},{"line_number":38,"context_line":"    return set(props_dict.items())"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ImagePropertiesWeigher(weights.BaseHostWeigher):"}],"source_content_type":"text/x-python","patch_set":3,"id":"489497dc_ec3feaf3","line":38,"range":{"start_line":32,"start_character":0,"end_line":38,"end_character":34},"updated":"2025-02-06 10:48:07.000000000","message":"why?\n\nyour passing weight_properties.image.properties\n\nimage is https://github.com/openstack/nova/blob/master/nova/objects/request_spec.py#L67\n\nan ImageMeta object\n\nand prperies si an ImateMetaProps object\n\nhttps://github.com/openstack/nova/blob/master/nova/objects/image_meta.py#L75\n\n\nyou shoudl extend the ImageMetaProps class with a set_fields function\nhttps://github.com/openstack/nova/blob/master/nova/objects/image_meta.py#L158\n\nwhich is basically\n```\ndef set_fields(self):\n    return {field for field in self.fields if field in self}\n```\n\novo know if the filed is set or not adn you can test with the filed name as a stinc with the in keyword because the overload __contians__\n\nset_fields might even existin in ovo since its a pretty common thing but its trivial to write without having to do obj_to_primitive","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"52ed9036c4162e1ba4e29db50fc9310b5b753144","unresolved":false,"context_lines":[{"line_number":29,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"def _set(props_obj):"},{"line_number":33,"context_line":"    \"\"\"Returns a set of tuples containing all ImageMetaProps fields that"},{"line_number":34,"context_line":"       are set."},{"line_number":35,"context_line":"    \"\"\""},{"line_number":36,"context_line":"    prim \u003d props_obj.obj_to_primitive()"},{"line_number":37,"context_line":"    props_dict \u003d prim[\u0027nova_object.data\u0027]"},{"line_number":38,"context_line":"    return set(props_dict.items())"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"class ImagePropertiesWeigher(weights.BaseHostWeigher):"}],"source_content_type":"text/x-python","patch_set":3,"id":"59ce85a1_f7b4f23a","line":38,"range":{"start_line":32,"start_character":0,"end_line":38,"end_character":34},"in_reply_to":"489497dc_ec3feaf3","updated":"2025-02-07 16:23:49.000000000","message":"good point, I\u0027ll ship it in the base nova object class so any object could inherit that property.","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f744b3fd91ce142edb8487ef085523bc6afe7778","unresolved":true,"context_lines":[{"line_number":46,"context_line":"            host_state, \u0027image_props_weight_multiplier\u0027,"},{"line_number":47,"context_line":"            CONF.filter_scheduler.image_props_weight_multiplier)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _weigh_object(self, host_state, weight_properties):"},{"line_number":50,"context_line":"        \"\"\"Higher weights win.  We want to choose hosts with the more common"},{"line_number":51,"context_line":"           existing image properties that are used by instances by default."},{"line_number":52,"context_line":"           If you want to spread instances with the same properties between"}],"source_content_type":"text/x-python","patch_set":3,"id":"281b55c7_ff205340","line":49,"updated":"2025-02-06 10:48:07.000000000","message":"weight_properties is actully a request_spec object\ncan we call it that liek we do in the affinity and  pci weighers.\n\nhttps://github.com/openstack/nova/blob/master/nova/scheduler/weights/affinity.py#L73\nhttps://github.com/openstack/nova/blob/master/nova/scheduler/weights/pci.py#L47\n\nwe passs the request spec here \nhttps://github.com/openstack/nova/blob/master/nova/scheduler/manager.py#L713-L714\n\nwhich is then propagated here\n\nhttps://github.com/openstack/nova/blob/master/nova/scheduler/host_manager.py#L622-L623\nand here\n\nhttps://github.com/openstack/nova/blob/master/nova/weights.py#L134\n\nweighing_properties or weight_properties\n\nare the old names but we are in consitent in the spelling and it obsucres what we are actuly passing.","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"52ed9036c4162e1ba4e29db50fc9310b5b753144","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            host_state, \u0027image_props_weight_multiplier\u0027,"},{"line_number":47,"context_line":"            CONF.filter_scheduler.image_props_weight_multiplier)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _weigh_object(self, host_state, weight_properties):"},{"line_number":50,"context_line":"        \"\"\"Higher weights win.  We want to choose hosts with the more common"},{"line_number":51,"context_line":"           existing image properties that are used by instances by default."},{"line_number":52,"context_line":"           If you want to spread instances with the same properties between"}],"source_content_type":"text/x-python","patch_set":3,"id":"2fec5b42_32083964","line":49,"in_reply_to":"281b55c7_ff205340","updated":"2025-02-07 16:23:49.000000000","message":"Acknowledged","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"032901ca60264b17988920a7c235efe927ce6224","unresolved":true,"context_lines":[{"line_number":46,"context_line":"            host_state, \u0027image_props_weight_multiplier\u0027,"},{"line_number":47,"context_line":"            CONF.filter_scheduler.image_props_weight_multiplier)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _weigh_object(self, host_state, weight_properties):"},{"line_number":50,"context_line":"        \"\"\"Higher weights win.  We want to choose hosts with the more common"},{"line_number":51,"context_line":"           existing image properties that are used by instances by default."},{"line_number":52,"context_line":"           If you want to spread instances with the same properties between"}],"source_content_type":"text/x-python","patch_set":3,"id":"4089ee49_2de20d81","line":49,"in_reply_to":"2fec5b42_32083964","updated":"2025-02-12 17:54:16.000000000","message":"this still applies.","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"300a1b65573e2846861adc255c507fc5587911d9","unresolved":false,"context_lines":[{"line_number":46,"context_line":"            host_state, \u0027image_props_weight_multiplier\u0027,"},{"line_number":47,"context_line":"            CONF.filter_scheduler.image_props_weight_multiplier)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def _weigh_object(self, host_state, weight_properties):"},{"line_number":50,"context_line":"        \"\"\"Higher weights win.  We want to choose hosts with the more common"},{"line_number":51,"context_line":"           existing image properties that are used by instances by default."},{"line_number":52,"context_line":"           If you want to spread instances with the same properties between"}],"source_content_type":"text/x-python","patch_set":3,"id":"0c9e51f9_4eaaca63","line":49,"in_reply_to":"4089ee49_2de20d81","updated":"2025-02-13 18:48:52.000000000","message":"ah sorry, OK, will change the name then","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f744b3fd91ce142edb8487ef085523bc6afe7778","unresolved":true,"context_lines":[{"line_number":67,"context_line":"        common_count \u003d Counter({prop: existing_props.get(prop, 0)"},{"line_number":68,"context_line":"                               for prop in common_props})"},{"line_number":69,"context_line":"        # here we return the number of common properties that are already used."},{"line_number":70,"context_line":"        return sum(common_count.values())"}],"source_content_type":"text/x-python","patch_set":3,"id":"8dbab992_4359804c","line":70,"updated":"2025-02-06 10:48:07.000000000","message":"this feel more complex and slow then the algorthim i propsoed.\n\nwhy are you using counters in stead of just calling len() on the resultant sets produced by the union and intersection.","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"52ed9036c4162e1ba4e29db50fc9310b5b753144","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        common_count \u003d Counter({prop: existing_props.get(prop, 0)"},{"line_number":68,"context_line":"                               for prop in common_props})"},{"line_number":69,"context_line":"        # here we return the number of common properties that are already used."},{"line_number":70,"context_line":"        return sum(common_count.values())"}],"source_content_type":"text/x-python","patch_set":3,"id":"11284dbc_28718f94","line":70,"in_reply_to":"8dbab992_4359804c","updated":"2025-02-07 16:23:49.000000000","message":"Done","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"9930788cf19ce2499e81cd4e71aadfb4c5367a8c","unresolved":true,"context_lines":[{"line_number":60,"context_line":"        common_props \u003d requested_props \u0026 set(existing_props)"},{"line_number":61,"context_line":"        weigh \u003d 0"},{"line_number":62,"context_line":"        for prop in common_props:"},{"line_number":63,"context_line":"            weigh +\u003d existing_props.count(prop)"},{"line_number":64,"context_line":"        return weigh"}],"source_content_type":"text/x-python","patch_set":4,"id":"55f45257_8e583462","line":63,"range":{"start_line":63,"start_character":21,"end_line":63,"end_character":47},"updated":"2025-02-10 09:49:16.000000000","message":"I must miss something, but there is not count method on a set.\n\n```\n\u003e\u003e\u003e toto\n{\u0027truc\u0027, \u0027bidule\u0027}\n\u003e\u003e\u003e type(toto)\n\u003cclass \u0027set\u0027\u003e\n\u003e\u003e\u003e toto.count(\"bidule\")\nTraceback (most recent call last):\n  File \"\u003cpython-input-10\u003e\", line 1, in \u003cmodule\u003e\n    toto.count(\"bidule\")\n    ^^^^^^^^^^\nAttributeError: \u0027set\u0027 object has no attribute \u0027count\u0027\n```","commit_id":"613e96c2b95db2780357004ef235666cb40f25a9"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"74fdedee062ab03ba99776cc25cc84cf5add32b2","unresolved":false,"context_lines":[{"line_number":60,"context_line":"        common_props \u003d requested_props \u0026 set(existing_props)"},{"line_number":61,"context_line":"        weigh \u003d 0"},{"line_number":62,"context_line":"        for prop in common_props:"},{"line_number":63,"context_line":"            weigh +\u003d existing_props.count(prop)"},{"line_number":64,"context_line":"        return weigh"}],"source_content_type":"text/x-python","patch_set":4,"id":"db97dc95_5730d8f0","line":63,"range":{"start_line":63,"start_character":21,"end_line":63,"end_character":47},"in_reply_to":"55f45257_8e583462","updated":"2025-02-10 10:08:51.000000000","message":"My bad. I just realized it is a list. I was confused by the set(existing_props).","commit_id":"613e96c2b95db2780357004ef235666cb40f25a9"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"b9a22220b24d587f16c0dfdc4ad27b0e122ff4f8","unresolved":true,"context_lines":[{"line_number":27,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class ImagePropertiesWeigher(weights.BaseHostWeigher):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def weight_multiplier(self, host_state):"},{"line_number":33,"context_line":"        \"\"\"Override the weight multiplier.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"932beb0e_c4933c32","line":30,"updated":"2025-02-11 12:15:30.000000000","message":"I\u0027m wondering how this will be used and what will be the potential side effects enabling this weigher. I know that one of the use case is to pack windows instances to hosts due to licencing. If the image has os_type\u003dwindows set then this weigher will pack the VMs using that image as expected. However there is side effect. If the weigher is enabled then it will pack based on all other image types as well so it will affect non windows VMs as well. I.e. it will also pack all the VMs that uses common image types like hw_firmware_type\u003duefi or even trait:HW_CPU_X86_AVX2\u003drequired. I think this will cause surprising results of VM placement. \n\nI suggest to add another config option for the weigher so that the deployer can list the name of the image properties to be considered in the weighing like os_type. This way the side effects can be limited. (not fully avoided as having os_type there still means not just the windows VMs will be packed but also the linux VMs will be packed, but at least the uefi VMs will not be packed.)","commit_id":"4105884a14355431cfc03d3e393cbc293c70b102"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3165add96cf8b67e162b1c373b46a8c6f6dddaeb","unresolved":true,"context_lines":[{"line_number":27,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class ImagePropertiesWeigher(weights.BaseHostWeigher):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def weight_multiplier(self, host_state):"},{"line_number":33,"context_line":"        \"\"\"Override the weight multiplier.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"abd2fe18_f82082f8","line":30,"in_reply_to":"3b1ce0f9_e5c9361b","updated":"2025-02-12 13:40:21.000000000","message":"I strongly believe we need to go back to the use case triggered this feature and see if \n* we understood the use case the same way and if yes then\n* does this feature actually solves the use case or not\n\nIt very well be that I misunderstood the use case or I missing some of the use cases behind this feature. But I think if I\u0027m not then the current solution here will not be useful for the use case.\n\n---\n\n\u003e If you want strict packing for license reasons, a weigher seems like a bad idea to me in general I guess.\n\nI only have this quote from the downstream tracker about the use case: \n\"they would like to pack Windows instances on the same hosts.\"\n\nI have a vague memory (and no written record) discussing why they are not using the already existing AggregateImagePropertiesIsolation[1] filter with a traits from [2]. The answer was as far as I remember that such setup creates a static pool of hosts serving the windows guests. What they need is a dynamically growing set of hosts serving windows guests while still minimizing the size of that set. \n\n\n[1] https://docs.openstack.org/nova/latest/admin/scheduling.html#aggregateimagepropertiesisolation\n[2] https://docs.openstack.org/nova/latest/reference/isolate-aggregates.html\n\n---\n\n\u003e Isn\u0027t that example way too small to really be relevant here? Your chosen ordering is a good example of why a weigher is not the same as a filter, but when you get a lot more instances, it seems like they will start to coalesce, especially if you\u0027re doing the cloudy thing of booting most with the same image.\n\nI\u0027m not sure I follow. I think VMs from ImgA and ImgC will always be attracting each other as they have more things in common. As the number of image properties grow the relevance of the single os_type image property shrinks causing even less attraction between windows VMs from different images. \n\n\u003e Further, if you constrain your target hosts in a way to say windows guests must be on the windows-allowed subpool I think it will coalesce faster.\n\nIf they are already in the windows only subpool then I think we don\u0027t need this weigher just need to set the existing weighers to pack by cpu/mem. \n\nIf this is a subpool that has all the windows VMs but can also have other VMs then I think we are back to the question. Will this weigher ensure that windows VMs attract each other in the subpool or other non-windows VMs become more attractive for a subset of windows VMs while not for the others.\n\n\u003e Going back to my expression thing, perhaps this could instead take a dict of properties and weights:\n\u003e ```image_props_weigher \u003d {\u0027os_type\u0027: 5000, \u0027hw_firmware_type\u0027: 200}```\n\u003e Which would mean \"strong affinity for hosts with other instances that have a matching os_type, weak affinity for using uefi/bios.\" I just kinda expect that once you do that someone will say \"but linux and BSD are the same type of system, so I want strong affinity for either of those, if I\u0027m booting a linux guest\". But, maybe I\u0027m pessimistic :)\n\nYeah this is an extension of my idea of having a config option listing what the weigher cares about, with the extra info of how much the weigher should care about such properties. So I\u0027m fine with this extension (pending the whole use case discussion).","commit_id":"4105884a14355431cfc03d3e393cbc293c70b102"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"500cd4aaa4929251db73240354f5ed5cc9de6029","unresolved":true,"context_lines":[{"line_number":27,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class ImagePropertiesWeigher(weights.BaseHostWeigher):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def weight_multiplier(self, host_state):"},{"line_number":33,"context_line":"        \"\"\"Override the weight multiplier.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"a84fe969_44ea1604","line":30,"in_reply_to":"72112821_06cfc051","updated":"2025-02-11 17:53:14.000000000","message":"I feel like in the current form this can only be used as a very soft magnet, otherwise it will stat expressing packing for unexpected things. And when the deployer tries to compensate such packing by increasing the weight of other weighers (to spread, or to pack differently) then this weigher will be even more soft to the point where it will stop being useful for packing windows VMs to hosts. Maybe it is a generic problem with weighers being a global thing. But for me it feels like this will not be a solution for the use case I know about except in a very limited env where only a single weigher,this, will be used.\n\nI have no better idea to fix this weigher other than going down the route to limit what image properties the weigher is looking at. So if the config knob is seems to be too complext then maybe my \"pack the windows VMs\" use case needs a specific OsTypeWindowsImagePropertiesWeigher that can be just turned on and hardcoded to only look at os_type\u003dwindows.\n\n//later\n\nI have another counter. Even if only this weigher will be enabled in the env to pack windows VMs to hosts. By looking at all the image properties it might not be able to pack by os_type\u003dwindows as that is only one of may other image properties used. I.e. we have 3 images:\n* ImgA: os_type\u003dwindows, os_shutdown_timeout\u003d200, hw_firmware_type\u003dbios\n* ImgB: os_type\u003dwindows, os_shutdown_timeout\u003d100, hw_firmware_type\u003duefi\n* ImgC: os_shutdown_timeout\u003d200, hw_firmware_type\u003dbios\n\nNow boot VMs:\n* VM1 with ImgB landing on host1\n* VM2 with ImgC landing on host2 as there is no common image properties between VM1 and VM2\n* VM3 with ImgA landing on host2 as VM3(ImgA) is more similar to VM2(ImgC) than to VM1(ImgB)\n\nso the windows VMs are not packed but spread. :/\n\nI believe we need to go back to the specific use cases we want to solve and see if this is a solution for them. I think it isn\u0027t.","commit_id":"4105884a14355431cfc03d3e393cbc293c70b102"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"08bf64a94b5b74667baf7d622cde4279eb7b6a63","unresolved":true,"context_lines":[{"line_number":27,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class ImagePropertiesWeigher(weights.BaseHostWeigher):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def weight_multiplier(self, host_state):"},{"line_number":33,"context_line":"        \"\"\"Override the weight multiplier.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"3b1ce0f9_e5c9361b","line":30,"in_reply_to":"72112821_06cfc051","updated":"2025-02-11 18:22:13.000000000","message":"I leave others commenting this good point. What I could do if you want is to provide a new conf option that would be optional for this and if the value is None, then the weigh would look for all of the properties so both of you could be happy.","commit_id":"4105884a14355431cfc03d3e393cbc293c70b102"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"300a1b65573e2846861adc255c507fc5587911d9","unresolved":false,"context_lines":[{"line_number":27,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class ImagePropertiesWeigher(weights.BaseHostWeigher):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def weight_multiplier(self, host_state):"},{"line_number":33,"context_line":"        \"\"\"Override the weight multiplier.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"b253ddeb_125e66c0","line":30,"in_reply_to":"79c98a2e_20ef09db","updated":"2025-02-13 18:48:52.000000000","message":"This has been discussed on a Gmeet. We agreed on a multi-change series for this weigher : \n* this change will only weigh for each of the properties\n* a second patch will use a same way that the metricweigher for configuring specific multipliers for each property\n* a third patch (perhaps on F) will look at the RP preferred traits for knowing which properties are preferred for each host.","commit_id":"4105884a14355431cfc03d3e393cbc293c70b102"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4d7c1f27ab5aac89e3f13f72353c9d087bbdeec9","unresolved":true,"context_lines":[{"line_number":27,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class ImagePropertiesWeigher(weights.BaseHostWeigher):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def weight_multiplier(self, host_state):"},{"line_number":33,"context_line":"        \"\"\"Override the weight multiplier.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"72112821_06cfc051","line":30,"in_reply_to":"932beb0e_c4933c32","updated":"2025-02-11 15:14:25.000000000","message":"I guess I assumed this was sort of a given and that this was a very soft form of affinity with very few actual guarantee-able behaviors. Adding a config knob for which things get considered seems to me like a slippery slope as it seems like a single global cluster-wide setting won\u0027t be sufficient. Wouldn\u0027t that likely lead to the need for more complex expressions? Like, \"If os_type\u003dwindows, then consider X-windowsy-thing, but ignore X-linuxy-thing\".\n\nI figured this was intended to be like a weak magnet, trying to draw instances that are literally booted with the same set of conditions together, but that\u0027s it. In that case, simplicity seems better to me. If you only consider a few things, you make the effect larger (i.e. considering two things with one being not the same, so 50% mismatch). If you consider 20 things and one is different, then only 5% different.","commit_id":"4105884a14355431cfc03d3e393cbc293c70b102"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1651919fa26153a8d53e8b543eac35e130839992","unresolved":true,"context_lines":[{"line_number":27,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class ImagePropertiesWeigher(weights.BaseHostWeigher):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def weight_multiplier(self, host_state):"},{"line_number":33,"context_line":"        \"\"\"Override the weight multiplier.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"8ac0e568_0dc613af","line":30,"in_reply_to":"a84fe969_44ea1604","updated":"2025-02-11 18:09:32.000000000","message":"If you want strict packing for license reasons, a weigher seems like a bad idea to me in general I guess. Wouldn\u0027t it be better to define a custom trait on those hosts and require windows flavors to go there? I guess the goal is to make it somewhat more dynamic (and/or to tightly pack and not just enforce that windows guests are booted on a sub-pool), but I dunno..\n\n\u003eso the windows VMs are not packed but spread. :/\n\nIsn\u0027t that example way too small to really be relevant here? Your chosen ordering is a good example of why a weigher is not the same as a filter, but when you get a lot more instances, it seems like they will start to coalesce, especially if you\u0027re doing the cloudy thing of booting most with the same image. Further, if you constrain your target hosts in a way to say windows guests *must* be on the windows-allowed subpool I think it will coalesce faster.\n\nAnyway, I totally get your point, I\u0027m just saying I thought this was *intended* to be a weak magnet. If it\u0027s not, then perhaps it\u0027s not the best idea anyway.\n\nGoing back to my expression thing, perhaps this could instead take a dict of properties and weights:\n```\nimage_props_weigher \u003d {\u0027os_type\u0027: 5000, \u0027hw_firmware_type\u0027: 200}\n```\n\nWhich would mean \"strong affinity for hosts with other instances that have a matching os_type, weak affinity for using uefi/bios.\" I just kinda expect that once you do that someone will say \"but linux and BSD are the same type of system,  so I want strong affinity for either of those, if I\u0027m booting a linux guest\". But, maybe I\u0027m pessimistic :)","commit_id":"4105884a14355431cfc03d3e393cbc293c70b102"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"53f2fd4e47cb3c8e004f550084fa0d1bb56b6f04","unresolved":true,"context_lines":[{"line_number":27,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class ImagePropertiesWeigher(weights.BaseHostWeigher):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def weight_multiplier(self, host_state):"},{"line_number":33,"context_line":"        \"\"\"Override the weight multiplier.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"c1562b00_b02c3dc4","line":30,"in_reply_to":"abd2fe18_f82082f8","updated":"2025-02-12 15:26:02.000000000","message":"i dont thik we need to have per property wights or condier the number of vms that use the same proprty on a given host\n\nwe could do that btu that is very diffent form what we approved as a specless blueprint and calls into question if we shoudl revert to a spec like we normlaly do for new weighers","commit_id":"4105884a14355431cfc03d3e393cbc293c70b102"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"032901ca60264b17988920a7c235efe927ce6224","unresolved":true,"context_lines":[{"line_number":27,"context_line":"CONF \u003d nova.conf.CONF"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"class ImagePropertiesWeigher(weights.BaseHostWeigher):"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    def weight_multiplier(self, host_state):"},{"line_number":33,"context_line":"        \"\"\"Override the weight multiplier.\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"79c98a2e_20ef09db","line":30,"in_reply_to":"c1562b00_b02c3dc4","updated":"2025-02-12 17:54:16.000000000","message":"so i think if we really belvie\n\nimage_props_weigher \u003d {\u0027os_type\u0027: 5000, \u0027hw_firmware_type\u0027: 200}\n\nis useful we could evolve to that over time.\n\nimage_props_weight_multiplier woudl decirbe the relitive multipler for this weigher vs the other \n\nadn image_props_weigher \u003d {\u0027os_type\u0027: 5000, \u0027hw_firmware_type\u0027: 200} could tweak how the per host wight is calulated.\n\nthsi is similar to the metrics weither and if we were to do this i think i woudl want to keep the syntax teh same between the two if possible.\n\nhow do we feel about adding a second patch on top for that and then discussing?","commit_id":"4105884a14355431cfc03d3e393cbc293c70b102"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"032901ca60264b17988920a7c235efe927ce6224","unresolved":true,"context_lines":[{"line_number":53,"context_line":"        # Given we get a list of instances with each of the instances having a"},{"line_number":54,"context_line":"        # set of tuples, we want to unpack that list of set of tuples into a"},{"line_number":55,"context_line":"        # list of tuples."},{"line_number":56,"context_line":"        existing_props \u003d [tup for iter in ["},{"line_number":57,"context_line":"                            set(inst.image_meta.properties.to_dict().items())"},{"line_number":58,"context_line":"                            if inst.image_meta else set()"},{"line_number":59,"context_line":"                            for inst in host_state.instances.values()]"}],"source_content_type":"text/x-python","patch_set":7,"id":"c45d13dc_deae4620","line":56,"range":{"start_line":56,"start_character":34,"end_line":56,"end_character":38},"updated":"2025-02-12 17:54:16.000000000","message":"nit: this is syntax hyligitin in orange because its the name of a built in python function so your technially aliasign that function in this context.\n\nstyle wise i would prefer if you gave it a diffent name but this is likely ok.","commit_id":"859f76882ab5fc0803fa74faf96c50d8d7e55260"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"300a1b65573e2846861adc255c507fc5587911d9","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        # Given we get a list of instances with each of the instances having a"},{"line_number":54,"context_line":"        # set of tuples, we want to unpack that list of set of tuples into a"},{"line_number":55,"context_line":"        # list of tuples."},{"line_number":56,"context_line":"        existing_props \u003d [tup for iter in ["},{"line_number":57,"context_line":"                            set(inst.image_meta.properties.to_dict().items())"},{"line_number":58,"context_line":"                            if inst.image_meta else set()"},{"line_number":59,"context_line":"                            for inst in host_state.instances.values()]"}],"source_content_type":"text/x-python","patch_set":7,"id":"f3447db0_a97686d6","line":56,"range":{"start_line":56,"start_character":34,"end_line":56,"end_character":38},"in_reply_to":"c45d13dc_deae4620","updated":"2025-02-13 18:48:52.000000000","message":"Done","commit_id":"859f76882ab5fc0803fa74faf96c50d8d7e55260"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"032901ca60264b17988920a7c235efe927ce6224","unresolved":true,"context_lines":[{"line_number":62,"context_line":"        common_props \u003d requested_props \u0026 set(existing_props)"},{"line_number":63,"context_line":"        weigh \u003d 0"},{"line_number":64,"context_line":"        for prop in common_props:"},{"line_number":65,"context_line":"            weigh +\u003d existing_props.count(prop)"},{"line_number":66,"context_line":"        return weigh"}],"source_content_type":"text/x-python","patch_set":7,"id":"3b7790a2_d539b580","line":65,"updated":"2025-02-12 17:54:16.000000000","message":"we basically would jsut modify this for the per property weights.\n\nreusing this logic\n \nhttps://github.com/openstack/nova/blob/master/nova/scheduler/weights/metrics.py#L57-L62\n\nhttps://github.com/openstack/nova/blob/master/nova/scheduler/weights/metrics.py#L39-L47","commit_id":"859f76882ab5fc0803fa74faf96c50d8d7e55260"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1bb1e9ba6913ee7aa93039e8fb116b8c136fb471","unresolved":true,"context_lines":[{"line_number":62,"context_line":"        common_props \u003d requested_props \u0026 set(existing_props)"},{"line_number":63,"context_line":"        weigh \u003d 0"},{"line_number":64,"context_line":"        for prop in common_props:"},{"line_number":65,"context_line":"            weigh +\u003d existing_props.count(prop)"},{"line_number":66,"context_line":"        return weigh"}],"source_content_type":"text/x-python","patch_set":7,"id":"8caf26c3_040a9b2e","line":65,"in_reply_to":"3b7790a2_d539b580","updated":"2025-02-12 17:55:54.000000000","message":"https://docs.openstack.org/nova/latest/admin/scheduling.html#utilization-aware-scheduling","commit_id":"859f76882ab5fc0803fa74faf96c50d8d7e55260"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"300a1b65573e2846861adc255c507fc5587911d9","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        common_props \u003d requested_props \u0026 set(existing_props)"},{"line_number":63,"context_line":"        weigh \u003d 0"},{"line_number":64,"context_line":"        for prop in common_props:"},{"line_number":65,"context_line":"            weigh +\u003d existing_props.count(prop)"},{"line_number":66,"context_line":"        return weigh"}],"source_content_type":"text/x-python","patch_set":7,"id":"4528f976_bcb52999","line":65,"in_reply_to":"8caf26c3_040a9b2e","updated":"2025-02-13 18:48:52.000000000","message":"It will be done in the follow-up patch as agreed.","commit_id":"859f76882ab5fc0803fa74faf96c50d8d7e55260"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"983ef4e9f499e18d5b7097d8f6e85477e72afa9b","unresolved":true,"context_lines":[{"line_number":42,"context_line":"           hosts, change the multiplier value to a negative number."},{"line_number":43,"context_line":"        \"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        weigh \u003d 0.0"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # request_spec is a RequestSpec object which can have its image"},{"line_number":48,"context_line":"        # field set to None"}],"source_content_type":"text/x-python","patch_set":8,"id":"ea2ed68c_c39ca89d","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":13},"updated":"2025-02-14 15:02:19.000000000","message":"\"Weigh\" is a verb, so \"weight\" would be better.","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4d7ff6bfc23143cdc053101c519bd188251d02ed","unresolved":false,"context_lines":[{"line_number":42,"context_line":"           hosts, change the multiplier value to a negative number."},{"line_number":43,"context_line":"        \"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        weigh \u003d 0.0"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # request_spec is a RequestSpec object which can have its image"},{"line_number":48,"context_line":"        # field set to None"}],"source_content_type":"text/x-python","patch_set":8,"id":"ecf54f63_261e9a55","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":13},"in_reply_to":"8bfd3d10_229859d5","updated":"2025-02-17 16:57:20.000000000","message":"because I haven\u0027t uploaded yet 😄","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e0ab600ea687568b9c707dc3ba2c615d3fbf1cc0","unresolved":true,"context_lines":[{"line_number":42,"context_line":"           hosts, change the multiplier value to a negative number."},{"line_number":43,"context_line":"        \"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        weigh \u003d 0.0"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # request_spec is a RequestSpec object which can have its image"},{"line_number":48,"context_line":"        # field set to None"}],"source_content_type":"text/x-python","patch_set":8,"id":"8bfd3d10_229859d5","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":13},"in_reply_to":"9c91d1fd_6fcfd24f","updated":"2025-02-17 11:16:27.000000000","message":"not actully done","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"deaef5b73483dc3acebd77f208e79b633ca6c26c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"           hosts, change the multiplier value to a negative number."},{"line_number":43,"context_line":"        \"\"\""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        weigh \u003d 0.0"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        # request_spec is a RequestSpec object which can have its image"},{"line_number":48,"context_line":"        # field set to None"}],"source_content_type":"text/x-python","patch_set":8,"id":"9c91d1fd_6fcfd24f","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":13},"in_reply_to":"ea2ed68c_c39ca89d","updated":"2025-02-17 10:45:47.000000000","message":"Done","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"e0ab600ea687568b9c707dc3ba2c615d3fbf1cc0","unresolved":true,"context_lines":[{"line_number":48,"context_line":"        # field set to None"},{"line_number":49,"context_line":"        if request_spec.image:"},{"line_number":50,"context_line":"            # List values aren\u0027t hashable so we need to stringify them."},{"line_number":51,"context_line":"            requested_props \u003d {(key, f\"{value}\") for key, value in"},{"line_number":52,"context_line":"                request_spec.image.properties.to_dict().items()}"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            requested_props \u003d set()"}],"source_content_type":"text/x-python","patch_set":8,"id":"02d55618_c9bea3c9","line":51,"range":{"start_line":51,"start_character":31,"end_line":51,"end_character":48},"updated":"2025-02-17 11:16:27.000000000","message":"nit: while this works i was orginally suggesting \n\n\n```\nf\"{key}, {value}\"\n```\n\nwhat you propsoed will work but you could have alos written it as\n```\n(key, str(value))\n```","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"4d7ff6bfc23143cdc053101c519bd188251d02ed","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        # field set to None"},{"line_number":49,"context_line":"        if request_spec.image:"},{"line_number":50,"context_line":"            # List values aren\u0027t hashable so we need to stringify them."},{"line_number":51,"context_line":"            requested_props \u003d {(key, f\"{value}\") for key, value in"},{"line_number":52,"context_line":"                request_spec.image.properties.to_dict().items()}"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            requested_props \u003d set()"}],"source_content_type":"text/x-python","patch_set":8,"id":"abd1b1e0_9edb3013","line":51,"range":{"start_line":51,"start_character":31,"end_line":51,"end_character":48},"in_reply_to":"02d55618_c9bea3c9","updated":"2025-02-17 16:57:20.000000000","message":"yeah, good point, will change that, this makes easier to read","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4ecc7df56c579416fcc1f88b6b732ae53b40cbaf","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        # field set to None"},{"line_number":49,"context_line":"        if request_spec.image:"},{"line_number":50,"context_line":"            # List values aren\u0027t hashable so we need to stringify them."},{"line_number":51,"context_line":"            requested_props \u003d {(key, f\"{value}\") for key, value in"},{"line_number":52,"context_line":"                request_spec.image.properties.to_dict().items()}"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            requested_props \u003d set()"}],"source_content_type":"text/x-python","patch_set":8,"id":"be7f668f_035deafb","line":51,"range":{"start_line":51,"start_character":31,"end_line":51,"end_character":48},"in_reply_to":"abd1b1e0_9edb3013","updated":"2025-02-17 17:26:32.000000000","message":"The f-string is why I missed it. I hate f-strings. IMHO, making this `(key, str(value)}` would be far superior, but I won\u0027t -1 over it.","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"77240c0c895e2d48839ef8108436b3be4fac72d8","unresolved":true,"context_lines":[{"line_number":42,"context_line":"           If you want to spread instances with the same properties between"},{"line_number":43,"context_line":"           hosts, change the multiplier value to a negative number."},{"line_number":44,"context_line":"        \"\"\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        weight \u003d 0.0"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        # request_spec is a RequestSpec object which can have its image"}],"source_content_type":"text/x-python","patch_set":10,"id":"32bf8d84_b638b617","line":45,"updated":"2025-02-19 15:49:25.000000000","message":"This should be a NOP if our multiplier is zero.","commit_id":"bb14c2ff4b29d37af279de74be353a987a15e1b5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"04708347f18ad0d2b6340e98fa4a0ef7daebc65c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"           If you want to spread instances with the same properties between"},{"line_number":43,"context_line":"           hosts, change the multiplier value to a negative number."},{"line_number":44,"context_line":"        \"\"\""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"        weight \u003d 0.0"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        # request_spec is a RequestSpec object which can have its image"}],"source_content_type":"text/x-python","patch_set":10,"id":"d39c4284_77e3c824","line":45,"in_reply_to":"32bf8d84_b638b617","updated":"2025-02-19 18:21:42.000000000","message":"Done","commit_id":"bb14c2ff4b29d37af279de74be353a987a15e1b5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a8087d4cd999165f4bb8a4a0d3aebf95428ab5d7","unresolved":true,"context_lines":[{"line_number":60,"context_line":"                props \u003d {(key, str(value)) for key, value in"},{"line_number":61,"context_line":"                         inst.image_meta.properties.to_dict().items()"},{"line_number":62,"context_line":"                         } if inst.image_meta else set()"},{"line_number":63,"context_line":"            except exception.InstanceNotFound:"},{"line_number":64,"context_line":"                # the host state can be a bit stale as the instance could no"},{"line_number":65,"context_line":"                # longer exist on the host if the instance deletion arrives"},{"line_number":66,"context_line":"                # before the scheduler gets the RPC message of the deletion"}],"source_content_type":"text/x-python","patch_set":10,"id":"27484dcb_b8f3f662","line":63,"updated":"2025-02-18 19:15:58.000000000","message":"This means you\u0027re lazy-loading sysmeta from each instance on the host sequentially. That would be super bad to do on every scheduling operation. Either we need to bulk update them or include them in whatever query is populating `host_state.instances`.","commit_id":"bb14c2ff4b29d37af279de74be353a987a15e1b5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"dda86877dbbcadefcb8c517db0002a577c4be81b","unresolved":true,"context_lines":[{"line_number":60,"context_line":"                props \u003d {(key, str(value)) for key, value in"},{"line_number":61,"context_line":"                         inst.image_meta.properties.to_dict().items()"},{"line_number":62,"context_line":"                         } if inst.image_meta else set()"},{"line_number":63,"context_line":"            except exception.InstanceNotFound:"},{"line_number":64,"context_line":"                # the host state can be a bit stale as the instance could no"},{"line_number":65,"context_line":"                # longer exist on the host if the instance deletion arrives"},{"line_number":66,"context_line":"                # before the scheduler gets the RPC message of the deletion"}],"source_content_type":"text/x-python","patch_set":10,"id":"f859aa4c_8b874a68","line":63,"in_reply_to":"27484dcb_b8f3f662","updated":"2025-02-18 20:00:15.000000000","message":"So since we\u0027re in the scheduler, we could add something like this to `InstanceList` which will fill instances\u0027 sysmeta efficiently from the DB. It is also idempotent and free if all the instances are already filled, so we can just do it here and it will patch up memory for us as we go. However, while this is massively more efficient than what is here now, it\u0027s definitely not free. At the mininum we should make this a no-op if our weight\u003d\u003d0.\n```\ndiff --git a/nova/objects/instance.py b/nova/objects/instance.py\nindex 8f76fd4f5a..7da6c8fc4c 100644\n--- a/nova/objects/instance.py\n+++ b/nova/objects/instance.py\n@@ -1588,6 +1588,17 @@ class InstanceList(base.ObjectListBase, base.NovaObject):\n\n         return faults_by_uuid.keys()\n\n+    def fill_sysmeta(self):\n+        db_inst_shells \u003d {inst.uuid: {\u0027uuid\u0027: inst.uuid} for inst in self\n+                          if \u0027system_metadata\u0027 not in inst}\n+        if db_inst_shells:\n+            db._instances_fill_metadata(self.context,\n+                                        db_inst_shells.values(),\n+                                        manual_joins\u003d[\u0027system_metadata\u0027])\n+            for inst in self:\n+                inst.system_metadata \u003d (\n+                    db_inst_shells[inst.uuid].system_metadata)\n+\n     @base.remotable_classmethod\n     def get_uuids_by_host(cls, context, host):\n         return db.instance_get_all_uuids_by_hosts(context, [host])[host]\n```","commit_id":"bb14c2ff4b29d37af279de74be353a987a15e1b5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"77240c0c895e2d48839ef8108436b3be4fac72d8","unresolved":true,"context_lines":[{"line_number":60,"context_line":"                props \u003d {(key, str(value)) for key, value in"},{"line_number":61,"context_line":"                         inst.image_meta.properties.to_dict().items()"},{"line_number":62,"context_line":"                         } if inst.image_meta else set()"},{"line_number":63,"context_line":"            except exception.InstanceNotFound:"},{"line_number":64,"context_line":"                # the host state can be a bit stale as the instance could no"},{"line_number":65,"context_line":"                # longer exist on the host if the instance deletion arrives"},{"line_number":66,"context_line":"                # before the scheduler gets the RPC message of the deletion"}],"source_content_type":"text/x-python","patch_set":10,"id":"dc8b5fa3_283de452","line":63,"in_reply_to":"896256f1_90864029","updated":"2025-02-19 15:49:25.000000000","message":"Okay, so I would rebase this patch on:\n\nhttps://review.opendev.org/c/openstack/nova/+/942214\n\nand then do something like this:\n```\ninsts \u003d objects.InstanceList(self.host_state.instances.values())\ninsts.fill_metadata()\n```\n\nAnd then process the instance list for properties like you are currently doing.","commit_id":"bb14c2ff4b29d37af279de74be353a987a15e1b5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"eb649205e9a96735441da1a0895194513d6ee99f","unresolved":true,"context_lines":[{"line_number":60,"context_line":"                props \u003d {(key, str(value)) for key, value in"},{"line_number":61,"context_line":"                         inst.image_meta.properties.to_dict().items()"},{"line_number":62,"context_line":"                         } if inst.image_meta else set()"},{"line_number":63,"context_line":"            except exception.InstanceNotFound:"},{"line_number":64,"context_line":"                # the host state can be a bit stale as the instance could no"},{"line_number":65,"context_line":"                # longer exist on the host if the instance deletion arrives"},{"line_number":66,"context_line":"                # before the scheduler gets the RPC message of the deletion"}],"source_content_type":"text/x-python","patch_set":10,"id":"f258f695_366eeb06","line":63,"in_reply_to":"a2dd77d7_91fe1cc7","updated":"2025-02-18 20:17:59.000000000","message":"oh this version has the \n\n```\nif \u0027system_metadata\u0027 not in inst\n```\noptimisation in it too\n\nalthoguh i think \n```\n\n+             for inst in self:\n+                inst.system_metadata \u003d (\n+                    db_inst_shells[inst.uuid].system_metadata)\n```\n\nis wrong because db_inst_shells is subset of self\n\nso db_inst_shells[inst.uuid] might rasie a key error i think","commit_id":"bb14c2ff4b29d37af279de74be353a987a15e1b5"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"04708347f18ad0d2b6340e98fa4a0ef7daebc65c","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                props \u003d {(key, str(value)) for key, value in"},{"line_number":61,"context_line":"                         inst.image_meta.properties.to_dict().items()"},{"line_number":62,"context_line":"                         } if inst.image_meta else set()"},{"line_number":63,"context_line":"            except exception.InstanceNotFound:"},{"line_number":64,"context_line":"                # the host state can be a bit stale as the instance could no"},{"line_number":65,"context_line":"                # longer exist on the host if the instance deletion arrives"},{"line_number":66,"context_line":"                # before the scheduler gets the RPC message of the deletion"}],"source_content_type":"text/x-python","patch_set":10,"id":"8c69476a_7931cf5f","line":63,"in_reply_to":"dc8b5fa3_283de452","updated":"2025-02-19 18:21:42.000000000","message":"Done","commit_id":"bb14c2ff4b29d37af279de74be353a987a15e1b5"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"1f715e53f681e6c15f48f7238331a4e51b736c25","unresolved":true,"context_lines":[{"line_number":60,"context_line":"                props \u003d {(key, str(value)) for key, value in"},{"line_number":61,"context_line":"                         inst.image_meta.properties.to_dict().items()"},{"line_number":62,"context_line":"                         } if inst.image_meta else set()"},{"line_number":63,"context_line":"            except exception.InstanceNotFound:"},{"line_number":64,"context_line":"                # the host state can be a bit stale as the instance could no"},{"line_number":65,"context_line":"                # longer exist on the host if the instance deletion arrives"},{"line_number":66,"context_line":"                # before the scheduler gets the RPC message of the deletion"}],"source_content_type":"text/x-python","patch_set":10,"id":"896256f1_90864029","line":63,"in_reply_to":"f258f695_366eeb06","updated":"2025-02-18 20:22:02.000000000","message":"Yep, totally untested too, but that\u0027s the gist of what we need to do...","commit_id":"bb14c2ff4b29d37af279de74be353a987a15e1b5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"60b0a3d37c85ccf3bc9ecc7401dead5190c2de72","unresolved":true,"context_lines":[{"line_number":60,"context_line":"                props \u003d {(key, str(value)) for key, value in"},{"line_number":61,"context_line":"                         inst.image_meta.properties.to_dict().items()"},{"line_number":62,"context_line":"                         } if inst.image_meta else set()"},{"line_number":63,"context_line":"            except exception.InstanceNotFound:"},{"line_number":64,"context_line":"                # the host state can be a bit stale as the instance could no"},{"line_number":65,"context_line":"                # longer exist on the host if the instance deletion arrives"},{"line_number":66,"context_line":"                # before the scheduler gets the RPC message of the deletion"}],"source_content_type":"text/x-python","patch_set":10,"id":"a2dd77d7_91fe1cc7","line":63,"in_reply_to":"f859aa4c_8b874a68","updated":"2025-02-18 20:11:53.000000000","message":"i discusse this with dan a littel.\n\npreviously i had disucssed this topic on irc with sylvain and suggested replacemign hwoe we lookup the instance in the host manger to also lookup the system metadata \ninstead of just the uuid.\n\ndan pointed out that even if we did that in the fallback path for when \n\nhttps://docs.openstack.org/nova/latest/configuration/config.html#filter_scheduler.track_instance_changes\n\nwas disableld we woudl still have to backfill the instance we get updats for when \n\ntrack_instance_changes is enabled.\n\nso so based on that conversation i agree we will need to have a single function like fill_sysmeta to do this in at most a single call to the db per schedule.\n\ndan and i also chatted about posible addtional optimisation like consucting the InstanceList from only the instance that are missing the system metadta\n\nwe also discssed only doing this if the weigher is enabeld which means only doing it if image_props_weight_multiplier is not 0","commit_id":"bb14c2ff4b29d37af279de74be353a987a15e1b5"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"87a95eb55c464692321feb22514d9d148dc8ab4e","unresolved":true,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        weight \u003d 0.0"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        # Disable this weigher if we don\u0027t use it as it\u0027s a bit costly."},{"line_number":50,"context_line":"        if CONF.filter_scheduler.image_props_weight_multiplier \u003d\u003d 0.0:"},{"line_number":51,"context_line":"            return weight"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"880a63c1_279028a5","line":49,"in_reply_to":"31ca2b6f_8ae81370","updated":"2025-02-20 02:49:57.000000000","message":"\u003e pep8: E265 block comment should start with \u0027# \u0027\n\nim just goign to fix this myself and reuppload\n\nyou have a non pritable charater a unicode NO-BREAK SPACE\nhttps://www.fileformat.info/info/unicode/char/00a0/index.htm\nif i delte the \"space\" that is not a space and add a normal ascii space\nits fine..\n\nin hexeidi its litrally `23 C2 A0  44` vs `23 20 44`","commit_id":"a42e016a63a8d0d9c731fbd1d88490159b651162"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"92ce4a71e313c0cae7abda139168f687d4c2a887","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        weight \u003d 0.0"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"        # Disable this weigher if we don\u0027t use it as it\u0027s a bit costly."},{"line_number":50,"context_line":"        if CONF.filter_scheduler.image_props_weight_multiplier \u003d\u003d 0.0:"},{"line_number":51,"context_line":"            return weight"},{"line_number":52,"context_line":""}],"source_content_type":"text/x-python","patch_set":11,"id":"fe41ff05_e3022656","line":49,"in_reply_to":"880a63c1_279028a5","updated":"2025-02-20 08:35:14.000000000","message":"That\u0027s my fucking VSCodium env that adds a new space due to some option I need to look at 😞","commit_id":"a42e016a63a8d0d9c731fbd1d88490159b651162"}],"nova/tests/unit/objects/test_image_meta.py":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"983ef4e9f499e18d5b7097d8f6e85477e72afa9b","unresolved":true,"context_lines":[{"line_number":146,"context_line":"                          virtprops.get,"},{"line_number":147,"context_line":"                          \"doesnotexist\")"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def test_to_dict(self):"},{"line_number":150,"context_line":"        props \u003d {\u0027os_type\u0027: \u0027windows\u0027}"},{"line_number":151,"context_line":"        virtprops \u003d objects.ImageMetaProps.from_dict(props)"},{"line_number":152,"context_line":"        self.assertEqual({\u0027os_type\u0027: \u0027windows\u0027},"}],"source_content_type":"text/x-python","patch_set":8,"id":"da18bb9a_3067b640","line":149,"updated":"2025-02-14 15:02:19.000000000","message":"I\u0027d guess maybe adding a listproperty to the test object to make sure you don\u0027t trip over the CoercedList thing would be good, no?","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"a3bb78d2e4aeecd73683d628b7134530177b4f69","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                          virtprops.get,"},{"line_number":147,"context_line":"                          \"doesnotexist\")"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def test_to_dict(self):"},{"line_number":150,"context_line":"        props \u003d {\u0027os_type\u0027: \u0027windows\u0027}"},{"line_number":151,"context_line":"        virtprops \u003d objects.ImageMetaProps.from_dict(props)"},{"line_number":152,"context_line":"        self.assertEqual({\u0027os_type\u0027: \u0027windows\u0027},"}],"source_content_type":"text/x-python","patch_set":8,"id":"90137485_453d19ec","line":149,"in_reply_to":"3b770b75_9e24a96d","updated":"2025-02-18 08:37:15.000000000","message":"Acknowledged","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4ecc7df56c579416fcc1f88b6b732ae53b40cbaf","unresolved":true,"context_lines":[{"line_number":146,"context_line":"                          virtprops.get,"},{"line_number":147,"context_line":"                          \"doesnotexist\")"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def test_to_dict(self):"},{"line_number":150,"context_line":"        props \u003d {\u0027os_type\u0027: \u0027windows\u0027}"},{"line_number":151,"context_line":"        virtprops \u003d objects.ImageMetaProps.from_dict(props)"},{"line_number":152,"context_line":"        self.assertEqual({\u0027os_type\u0027: \u0027windows\u0027},"}],"source_content_type":"text/x-python","patch_set":8,"id":"3b770b75_9e24a96d","line":149,"in_reply_to":"6b30a148_abd72a94","updated":"2025-02-17 17:26:32.000000000","message":"I know, just saying we should make sure we don\u0027t regress that, but not critical.","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"deaef5b73483dc3acebd77f208e79b633ca6c26c","unresolved":true,"context_lines":[{"line_number":146,"context_line":"                          virtprops.get,"},{"line_number":147,"context_line":"                          \"doesnotexist\")"},{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    def test_to_dict(self):"},{"line_number":150,"context_line":"        props \u003d {\u0027os_type\u0027: \u0027windows\u0027}"},{"line_number":151,"context_line":"        virtprops \u003d objects.ImageMetaProps.from_dict(props)"},{"line_number":152,"context_line":"        self.assertEqual({\u0027os_type\u0027: \u0027windows\u0027},"}],"source_content_type":"text/x-python","patch_set":8,"id":"6b30a148_abd72a94","line":149,"in_reply_to":"da18bb9a_3067b640","updated":"2025-02-17 10:45:47.000000000","message":"No, what\u0027s tripping is when you want to settify a list having a CoercedList (or any inherited list object) as one value.","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"}],"nova/tests/unit/scheduler/weights/test_weights_image_props.py":[{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"241ead65833d0a5fb6cbb40d554749f0b7da9e3f","unresolved":true,"context_lines":[{"line_number":29,"context_line":"        self.weight_handler \u003d weights.HostWeightHandler()"},{"line_number":30,"context_line":"        self.weighers \u003d [image_props.ImagePropertiesWeigher()]"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        self.stub_out(\u0027nova.objects.ImageMeta.from_instance\u0027,"},{"line_number":33,"context_line":"                      self._fake_image_meta_from_instance)"},{"line_number":34,"context_line":"        self.prop_pc \u003d objects.ImageMeta("},{"line_number":35,"context_line":"            properties\u003dobjects.ImageMetaProps(hw_machine_type\u003d\u0027pc\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"0bf55b7c_bf1aa885","line":32,"updated":"2025-02-05 11:33:11.000000000","message":"Later, doing this will fix 3.10 and 3.12 tests:\n\n```\n    def setUp(self):\n        super().setUp()\n        self.weight_handler \u003d weights.HostWeightHandler()\n        self.weighers \u003d [image_props.ImagePropertiesWeigher()]\n\n        # self.stub_out(\u0027nova.objects.ImageMeta.from_instance\u0027,\n        #               self._fake_image_meta_from_instance)\n\n        self.stub_out(\n            \"nova.objects.ImageMeta.from_instance\",\n            lambda truc, inst: self._fake_image_meta_from_instance(inst),\n        )\n   ...\n\n    def _fake_image_meta_from_instance(self, inst):\n```\n\n_fake_image_meta_from_instance is declared with only 1 argument.\n\nThe stub with the lambda correctly forwards only the second argument.\ntruc (the unexpected first argument) is ignored\nSo it can handle various argument numbers between 3.10( and 3.12 (stricter).","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"52ed9036c4162e1ba4e29db50fc9310b5b753144","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        self.weight_handler \u003d weights.HostWeightHandler()"},{"line_number":30,"context_line":"        self.weighers \u003d [image_props.ImagePropertiesWeigher()]"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        self.stub_out(\u0027nova.objects.ImageMeta.from_instance\u0027,"},{"line_number":33,"context_line":"                      self._fake_image_meta_from_instance)"},{"line_number":34,"context_line":"        self.prop_pc \u003d objects.ImageMeta("},{"line_number":35,"context_line":"            properties\u003dobjects.ImageMetaProps(hw_machine_type\u003d\u0027pc\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"00346506_e7d1486e","line":32,"in_reply_to":"0bf55b7c_bf1aa885","updated":"2025-02-07 16:23:49.000000000","message":"Done","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"2d38f6c753e8704e6ede12d1ff7d7d609928629d","unresolved":true,"context_lines":[{"line_number":99,"context_line":"        )"},{"line_number":100,"context_line":"        hostinfo_list \u003d self._get_all_hosts()"},{"line_number":101,"context_line":"        # we request for both windows and pc machine type"},{"line_number":102,"context_line":"        weighed_host \u003d self._get_weighed_host("},{"line_number":103,"context_line":"            hostinfo_list,"},{"line_number":104,"context_line":"            weight_properties\u003dobjects.RequestSpec("},{"line_number":105,"context_line":"                image\u003dself.prop_win_pc))"}],"source_content_type":"text/x-python","patch_set":2,"id":"6dfed91a_6cba7d4c","line":102,"updated":"2025-02-05 10:12:32.000000000","message":"Lot\u0027s of tests are failing with python 3.10, however it is working fine with 3.12.\n```\n    TypeError: ImagePropertiesWeigherTestCase._fake_image_meta_from_instance() missing 1 required positional argument: \u0027inst\u0027\n```\n\nThis seems to be linked to the signature of:\n    def _fake_image_meta_from_instance(self, _self, inst):\n\nAt the moment I have not fully understand the issue but I can say that:\nThe _self parameter works with python 3.12 and not 3.10.\nRemoving the _self parameter works with python 3.10 but not with 3.12.","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"52ed9036c4162e1ba4e29db50fc9310b5b753144","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        )"},{"line_number":100,"context_line":"        hostinfo_list \u003d self._get_all_hosts()"},{"line_number":101,"context_line":"        # we request for both windows and pc machine type"},{"line_number":102,"context_line":"        weighed_host \u003d self._get_weighed_host("},{"line_number":103,"context_line":"            hostinfo_list,"},{"line_number":104,"context_line":"            weight_properties\u003dobjects.RequestSpec("},{"line_number":105,"context_line":"                image\u003dself.prop_win_pc))"}],"source_content_type":"text/x-python","patch_set":2,"id":"21845c43_0007b97f","line":102,"in_reply_to":"6dfed91a_6cba7d4c","updated":"2025-02-07 16:23:49.000000000","message":"This is due to the fact that py310 awaits three params because it\u0027s passing the object instance (self) while py39 doesn\u0027t.\n\nI\u0027ll just provide a staticmethod, so we won\u0027t have this issue.","commit_id":"73443a34e28f16cb2c51ac4b2dde7b510afcb170"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a18b1f04e1be12acedd3fcc4fc2b1c396ebb0eca","unresolved":true,"context_lines":[{"line_number":100,"context_line":"        self.flags("},{"line_number":101,"context_line":"            image_props_weight_multiplier\u003d1.0,"},{"line_number":102,"context_line":"            group\u003d\u0027filter_scheduler\u0027"},{"line_number":103,"context_line":"        )"},{"line_number":104,"context_line":"        hostinfo_list \u003d self._get_all_hosts()"},{"line_number":105,"context_line":"        # we request for both windows and pc machine type"},{"line_number":106,"context_line":"        weighed_host \u003d self._get_weighed_host("}],"source_content_type":"text/x-python","patch_set":3,"id":"941adf32_208f2401","line":103,"updated":"2025-02-05 18:42:24.000000000","message":"Man, I didn\u0027t realize you were in the \"likes to waste two extra lines\" club lately... :)","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"52ed9036c4162e1ba4e29db50fc9310b5b753144","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        self.flags("},{"line_number":101,"context_line":"            image_props_weight_multiplier\u003d1.0,"},{"line_number":102,"context_line":"            group\u003d\u0027filter_scheduler\u0027"},{"line_number":103,"context_line":"        )"},{"line_number":104,"context_line":"        hostinfo_list \u003d self._get_all_hosts()"},{"line_number":105,"context_line":"        # we request for both windows and pc machine type"},{"line_number":106,"context_line":"        weighed_host \u003d self._get_weighed_host("}],"source_content_type":"text/x-python","patch_set":3,"id":"4fca1e25_c289862c","line":103,"in_reply_to":"941adf32_208f2401","updated":"2025-02-07 16:23:49.000000000","message":"I have bad copy/paste taste 😄","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a18b1f04e1be12acedd3fcc4fc2b1c396ebb0eca","unresolved":true,"context_lines":[{"line_number":124,"context_line":"                image\u003dPROP_PC))"},{"line_number":125,"context_line":"        self.assertEqual(1.0, weighed_host.weight)"},{"line_number":126,"context_line":"        # host2 and host3 have instances with pc machine type so are equally"},{"line_number":127,"context_line":"        # weighed so we return the first of both."},{"line_number":128,"context_line":"        self.assertEqual(\u0027host2\u0027, weighed_host.obj.host)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def test_multiplier_linux(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"6ad42fc9_4c524468","line":127,"updated":"2025-02-05 18:42:24.000000000","message":"Seems like this could hide things not working as you expect. Why not return the list and assert that it\u0027s as you expect?","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"52ed9036c4162e1ba4e29db50fc9310b5b753144","unresolved":false,"context_lines":[{"line_number":124,"context_line":"                image\u003dPROP_PC))"},{"line_number":125,"context_line":"        self.assertEqual(1.0, weighed_host.weight)"},{"line_number":126,"context_line":"        # host2 and host3 have instances with pc machine type so are equally"},{"line_number":127,"context_line":"        # weighed so we return the first of both."},{"line_number":128,"context_line":"        self.assertEqual(\u0027host2\u0027, weighed_host.obj.host)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":"    def test_multiplier_linux(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"dd4e2f4e_0e5d9a54","line":127,"in_reply_to":"6ad42fc9_4c524468","updated":"2025-02-07 16:23:49.000000000","message":"Done","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"8def7edd9b58c9a8ae2e12042a65280d70be8d26","unresolved":false,"context_lines":[{"line_number":45,"context_line":"        self.stub_out(\u0027nova.objects.ImageMeta.from_instance\u0027,"},{"line_number":46,"context_line":"                      self._fake_image_meta_from_instance)"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    @staticmethod"},{"line_number":49,"context_line":"    def _fake_image_meta_from_instance(self, inst):"},{"line_number":50,"context_line":"        # inst1 is on host2"},{"line_number":51,"context_line":"        if inst.uuid \u003d\u003d uuids.inst1:"},{"line_number":52,"context_line":"            return PROP_WIN_PC"}],"source_content_type":"text/x-python","patch_set":5,"id":"db9cadec_1990ba12","line":49,"range":{"start_line":48,"start_character":4,"end_line":49,"end_character":51},"updated":"2025-02-10 10:15:01.000000000","message":"👍","commit_id":"4105884a14355431cfc03d3e393cbc293c70b102"}],"releasenotes/notes/bp-image-metadata-props-weigher-b09125e1837428f5.yaml":[{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a18b1f04e1be12acedd3fcc4fc2b1c396ebb0eca","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    A new `ImagePropertiesWeigher` weigher has been added. It will compare the"},{"line_number":5,"context_line":"    number of image properties asked by the user for each of the host with how"},{"line_number":6,"context_line":"    many existing instances use them. By default this weigher is enabled but"},{"line_number":7,"context_line":"    with a value of 0.0 for"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"f52d958d_a2bb2f15","line":4,"range":{"start_line":4,"start_character":35,"end_line":4,"end_character":42},"updated":"2025-02-05 18:42:24.000000000","message":"I think you could remove this as it isn\u0027t necessary and makes this not read very smoothly (IMHO).","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f50ed6618f6d0772f7992a60b979de2a830d17a2","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":"    A new `ImagePropertiesWeigher` weigher has been added. It will compare the"},{"line_number":5,"context_line":"    number of image properties asked by the user for each of the host with how"},{"line_number":6,"context_line":"    many existing instances use them. By default this weigher is enabled but"},{"line_number":7,"context_line":"    with a value of 0.0 for"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"785325be_7eb2fe12","line":4,"range":{"start_line":4,"start_character":35,"end_line":4,"end_character":42},"in_reply_to":"f52d958d_a2bb2f15","updated":"2025-02-11 17:14:35.000000000","message":"Done","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a18b1f04e1be12acedd3fcc4fc2b1c396ebb0eca","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    A new `ImagePropertiesWeigher` weigher has been added. It will compare the"},{"line_number":5,"context_line":"    number of image properties asked by the user for each of the host with how"},{"line_number":6,"context_line":"    many existing instances use them. By default this weigher is enabled but"},{"line_number":7,"context_line":"    with a value of 0.0 for"},{"line_number":8,"context_line":"    :oslo.config:option:`filter_scheduler.image_props_weight_multiplier` which"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"facf7ff2_9015c24d","line":5,"range":{"start_line":5,"start_character":14,"end_line":5,"end_character":48},"updated":"2025-02-05 18:42:24.000000000","message":"This is not accurate, right? It\u0027s the image properties of the current image being booted, not \"asked by the user\" right?","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f50ed6618f6d0772f7992a60b979de2a830d17a2","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    A new `ImagePropertiesWeigher` weigher has been added. It will compare the"},{"line_number":5,"context_line":"    number of image properties asked by the user for each of the host with how"},{"line_number":6,"context_line":"    many existing instances use them. By default this weigher is enabled but"},{"line_number":7,"context_line":"    with a value of 0.0 for"},{"line_number":8,"context_line":"    :oslo.config:option:`filter_scheduler.image_props_weight_multiplier` which"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"d41aeed8_a01593d9","line":5,"range":{"start_line":5,"start_character":14,"end_line":5,"end_character":48},"in_reply_to":"facf7ff2_9015c24d","updated":"2025-02-11 17:14:35.000000000","message":"Done","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"a18b1f04e1be12acedd3fcc4fc2b1c396ebb0eca","unresolved":true,"context_lines":[{"line_number":6,"context_line":"    many existing instances use them. By default this weigher is enabled but"},{"line_number":7,"context_line":"    with a value of 0.0 for"},{"line_number":8,"context_line":"    :oslo.config:option:`filter_scheduler.image_props_weight_multiplier` which"},{"line_number":9,"context_line":"    won\u0027t modify the existing scheduling behaviour."},{"line_number":10,"context_line":"    If you want to pack instances having the same image properties on the same"},{"line_number":11,"context_line":"    hosts, modify `image_props_weight_multiplier` to a positive value. If you"},{"line_number":12,"context_line":"    want to spread instances with the same properties around all hosts, then"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"f4119a85_29d7bcac","line":9,"range":{"start_line":9,"start_character":41,"end_line":9,"end_character":50},"updated":"2025-02-05 18:42:24.000000000","message":"Got a weird extra U in here :)\n\nhttps://docs.openstack.org/doc-contrib-guide/writing-style/general-writing-guidelines.html#use-standard-english","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"f50ed6618f6d0772f7992a60b979de2a830d17a2","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    many existing instances use them. By default this weigher is enabled but"},{"line_number":7,"context_line":"    with a value of 0.0 for"},{"line_number":8,"context_line":"    :oslo.config:option:`filter_scheduler.image_props_weight_multiplier` which"},{"line_number":9,"context_line":"    won\u0027t modify the existing scheduling behaviour."},{"line_number":10,"context_line":"    If you want to pack instances having the same image properties on the same"},{"line_number":11,"context_line":"    hosts, modify `image_props_weight_multiplier` to a positive value. If you"},{"line_number":12,"context_line":"    want to spread instances with the same properties around all hosts, then"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"ad5d5d69_e957dfe2","line":9,"range":{"start_line":9,"start_character":41,"end_line":9,"end_character":50},"in_reply_to":"43e6a809_3d3dd9e4","updated":"2025-02-11 17:14:35.000000000","message":"Done","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":16207,"name":"ribaudr","display_name":"uggla","email":"rene.ribaud@gmail.com","username":"uggla","status":"Red Hat"},"change_message_id":"9b9eab0902e064ea4af094403032bbd60af8f3c7","unresolved":true,"context_lines":[{"line_number":6,"context_line":"    many existing instances use them. By default this weigher is enabled but"},{"line_number":7,"context_line":"    with a value of 0.0 for"},{"line_number":8,"context_line":"    :oslo.config:option:`filter_scheduler.image_props_weight_multiplier` which"},{"line_number":9,"context_line":"    won\u0027t modify the existing scheduling behaviour."},{"line_number":10,"context_line":"    If you want to pack instances having the same image properties on the same"},{"line_number":11,"context_line":"    hosts, modify `image_props_weight_multiplier` to a positive value. If you"},{"line_number":12,"context_line":"    want to spread instances with the same properties around all hosts, then"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"43e6a809_3d3dd9e4","line":9,"range":{"start_line":9,"start_character":41,"end_line":9,"end_character":50},"in_reply_to":"f4119a85_29d7bcac","updated":"2025-02-06 10:25:12.000000000","message":":)","commit_id":"ffca7fa654694c761e5f07df8ab236f5a9eb242a"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"983ef4e9f499e18d5b7097d8f6e85477e72afa9b","unresolved":true,"context_lines":[{"line_number":10,"context_line":"    If you want to pack instances having the same image properties on the same"},{"line_number":11,"context_line":"    hosts, modify `image_props_weight_multiplier` to a positive value. If you"},{"line_number":12,"context_line":"    want to spread instances with the same properties around all hosts, then"},{"line_number":13,"context_line":"    please modify `image_props_weight_multiplier` to a negative value."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":8,"id":"fb4e9073_495305f8","line":13,"updated":"2025-02-14 15:02:19.000000000","message":"What\u0027s the plan for the second patch? Seems like having two renos will just be more confusing if we\u0027re planning to merge that. If we are, perhaps squash or just do the reno in the second? I haven\u0027t looked at that, but will go do it now.","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9630d1cb7864374eaea0faf658de225b781cb07b","unresolved":true,"context_lines":[{"line_number":10,"context_line":"    If you want to pack instances having the same image properties on the same"},{"line_number":11,"context_line":"    hosts, modify `image_props_weight_multiplier` to a positive value. If you"},{"line_number":12,"context_line":"    want to spread instances with the same properties around all hosts, then"},{"line_number":13,"context_line":"    please modify `image_props_weight_multiplier` to a negative value."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":8,"id":"df2d6c88_f0196ec5","line":13,"in_reply_to":"820a7e01_5c80be39","updated":"2025-02-17 18:39:35.000000000","message":"i am ok with the way its currently proposed and amending it\n\nwe do that form time to time wiht larger series like manilla shares where we make incremental progress.\n\ni dont object to dans proposal but i would not block on this either way since the follow up is amending and not adding a new release note.\n\nif we hit featur freeze and the followup is not merged then we can just update that patch to create a new release not explaining the new functionlaity for 2025.2","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4ecc7df56c579416fcc1f88b6b732ae53b40cbaf","unresolved":true,"context_lines":[{"line_number":10,"context_line":"    If you want to pack instances having the same image properties on the same"},{"line_number":11,"context_line":"    hosts, modify `image_props_weight_multiplier` to a positive value. If you"},{"line_number":12,"context_line":"    want to spread instances with the same properties around all hosts, then"},{"line_number":13,"context_line":"    please modify `image_props_weight_multiplier` to a negative value."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":8,"id":"820a7e01_5c80be39","line":13,"in_reply_to":"c33499ae_660f2fee","updated":"2025-02-17 17:26:32.000000000","message":"Let\u0027s just add the reno in the second patch explaining the full situation. If we decide not to land it for some reason, we can just land a reno by itself.","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"deaef5b73483dc3acebd77f208e79b633ca6c26c","unresolved":true,"context_lines":[{"line_number":10,"context_line":"    If you want to pack instances having the same image properties on the same"},{"line_number":11,"context_line":"    hosts, modify `image_props_weight_multiplier` to a positive value. If you"},{"line_number":12,"context_line":"    want to spread instances with the same properties around all hosts, then"},{"line_number":13,"context_line":"    please modify `image_props_weight_multiplier` to a negative value."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":8,"id":"c33499ae_660f2fee","line":13,"in_reply_to":"fb4e9073_495305f8","updated":"2025-02-17 10:45:47.000000000","message":"Good point, I wasn\u0027t updating the reno file in the latter patch, so let me see what I can do.","commit_id":"d6ac25a095d9a3d16ec236875063d8e2c66b8a65"}]}
