)]}'
{".zuul.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1d8b11a9e680c9a9a7cb25fbdfc6611f406292e3","unresolved":true,"context_lines":[{"line_number":150,"context_line":"              run_continuous_audit_tests: true"},{"line_number":151,"context_line":"              run_zone_migration_extra_tests: true"},{"line_number":152,"context_line":"              run_zone_migration_storage_tests: true"},{"line_number":153,"context_line":"              run_bfv_tests: true"},{"line_number":154,"context_line":"      # tempest variables"},{"line_number":155,"context_line":"      tempest_test_regex: watcher_tempest_plugin.tests\\.(api|scenario)"},{"line_number":156,"context_line":"      # excluding tests with tag \"real_load\""}],"source_content_type":"text/x-yaml","patch_set":9,"id":"ad582399_b21b2ce1","line":153,"updated":"2026-05-06 17:08:56.000000000","message":"the test have at least run on master\n\nhttps://storage.gra.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_30b/openstack/30b1cbaf2a28434fbaf9ad6e3d92b0ac/testr_results.html\n\nand are skipping on stable\n\n2026-05-05 14:32:37.191030 | controller | {0} setUpClass (watcher_tempest_plugin.tests.scenario.test_execute_host_maintenance.TestExecuteHostMaintenanceStrategyBfV) ... SKIPPED: Boot from volume tests are not enabled.\nhttps://zuul.opendev.org/t/openstack/build/0f4fcfc553474aac92ee0d9a0331ea16/log/job-output.txt#61098","commit_id":"5461b3611d211286d856282a44ae727e88242259"}],"/COMMIT_MSG":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d973ffc389b7496d66ccdda2d8d0884aac3edb07","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Alfredo Moralejo \u003camoralej@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-04-28 21:25:56 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix disk accounting for BFV instances"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Boot-from-volume instances store their root disk on Cinder storage,"},{"line_number":10,"context_line":"not on the local compute node. However, Watcher unconditionally used"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"d3cb2a5a_f5137dfa","line":7,"updated":"2026-04-28 20:55:06.000000000","message":"so i have a leger concern with this in general that i need to capture\n\nthere are some operation on cider data voluems that may or may not be allowed for boot volumes\n\nfor example you cannot detach a boot volumes.\n\ni have some concern realted to how BFV instnace interact with the host mantiance stragy or other stragies thyat allow pritization or movign of both instnace and voluems\n\nfrom a nova point of view you can only move the instnace or the volume at a given tiem\n\ni think we do handel that properly today but have you though about how bfv instance interact with all the stragies in general.\n\ni dont know if this inital support coudl have other gotchas that need testing and documentation before we consider this truly supported.","commit_id":"02b41922fe516c62ff2a889f3dd49f8c90707271"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9d48bd29c8a4a1da8fed6c4f289d623c0886f4d5","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Alfredo Moralejo \u003camoralej@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-04-28 21:25:56 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix disk accounting for BFV instances"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Boot-from-volume instances store their root disk on Cinder storage,"},{"line_number":10,"context_line":"not on the local compute node. However, Watcher unconditionally used"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9e2087a3_60b73d88","line":7,"in_reply_to":"a9a0240e_1030ac10","updated":"2026-04-29 10:23:52.000000000","message":"Acknowledged","commit_id":"02b41922fe516c62ff2a889f3dd49f8c90707271"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a059ffaa15f32842e749cdf598db4b63626127e0","unresolved":true,"context_lines":[{"line_number":4,"context_line":"Commit:     Alfredo Moralejo \u003camoralej@redhat.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2026-04-28 21:25:56 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Fix disk accounting for BFV instances"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Boot-from-volume instances store their root disk on Cinder storage,"},{"line_number":10,"context_line":"not on the local compute node. However, Watcher unconditionally used"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"a9a0240e_1030ac10","line":7,"in_reply_to":"d3cb2a5a_f5137dfa","updated":"2026-04-29 08:10:30.000000000","message":"We don\u0027t dettach volumes in any operation afaik.\n\nWRT the zone_migration strategy, actually we don\u0027t do vm and volume migrations simultaneously. The parameter with_attached_volume regulates only that, if it\u0027s true, the instances with attached volumes to be migrated will be the first ones to be included in the list of vms to be migrated, but that does not imply that the migrations are done in parallel.\n\nSaid that, it makes sense to add coverage in tempest for that. I started adding tests for workload_stabilization and workload_balance which have identified issues with bfv but will add tests for zone_migration in follow up.","commit_id":"02b41922fe516c62ff2a889f3dd49f8c90707271"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d973ffc389b7496d66ccdda2d8d0884aac3edb07","unresolved":true,"context_lines":[{"line_number":16,"context_line":"checking whether the instance has an associated image. Also include"},{"line_number":17,"context_line":"ephemeral and swap disk in the calculation, as both are always"},{"line_number":18,"context_line":"created locally even for boot-from-volume instances if the flavor"},{"line_number":19,"context_line":"set them \u003e 0."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Implements: blueprint improve-instances-disk-usage-model"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1283ea05_a7e96cf9","line":19,"updated":"2026-04-28 20:55:06.000000000","message":"so technially both swap and epheraml are alwasy screated on the default images_type\nstroage backend \n\nif that is rbd or /var/lib/nova/instances is on nfs that can be remote storage\n\nin both of those case nova report the full capsicy of the remote storage as the local capcity fo all node using that storage.","commit_id":"02b41922fe516c62ff2a889f3dd49f8c90707271"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a059ffaa15f32842e749cdf598db4b63626127e0","unresolved":true,"context_lines":[{"line_number":16,"context_line":"checking whether the instance has an associated image. Also include"},{"line_number":17,"context_line":"ephemeral and swap disk in the calculation, as both are always"},{"line_number":18,"context_line":"created locally even for boot-from-volume instances if the flavor"},{"line_number":19,"context_line":"set them \u003e 0."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Implements: blueprint improve-instances-disk-usage-model"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"395d8d52_0bdeaf28","line":19,"in_reply_to":"1283ea05_a7e96cf9","updated":"2026-04-29 08:10:30.000000000","message":"So, iiuc, in the cases of shared remote storage for nova, it shouldn\u0027t be an issue.","commit_id":"02b41922fe516c62ff2a889f3dd49f8c90707271"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9d48bd29c8a4a1da8fed6c4f289d623c0886f4d5","unresolved":false,"context_lines":[{"line_number":16,"context_line":"checking whether the instance has an associated image. Also include"},{"line_number":17,"context_line":"ephemeral and swap disk in the calculation, as both are always"},{"line_number":18,"context_line":"created locally even for boot-from-volume instances if the flavor"},{"line_number":19,"context_line":"set them \u003e 0."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Implements: blueprint improve-instances-disk-usage-model"},{"line_number":22,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"2c6d4c3b_1e8189cf","line":19,"in_reply_to":"395d8d52_0bdeaf28","updated":"2026-04-29 10:23:52.000000000","message":"correct, norrammly i use the term \"nova provisioned storage\" to refer to any storage for a vm that nova creates be it local or remote as distinct form cinder provision storage.\n\nnova epmeral stoage should only ever be used to refer to storage form the flavor epmeral_gb never the root disk. but you rundersnding is correct.","commit_id":"02b41922fe516c62ff2a889f3dd49f8c90707271"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d49522775701838ac6eb8c8115d2070036468e7e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"34e69543_acbe100d","updated":"2026-04-28 16:08:17.000000000","message":"i need to loop back to this but i woul really prefer math.ceil here for readblity.","commit_id":"ce81e7b46e67982ea0fdd9dbd0fe6bae508b13ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9d48bd29c8a4a1da8fed6c4f289d623c0886f4d5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"109feff5_29f04599","updated":"2026-04-29 10:23:52.000000000","message":"i would personally do this slighly differently but im ok with the current veriosn i think +1 until doug and joan have had a change to take a look","commit_id":"38c3b621bc707561f99792e590b27468c20a3126"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"0bfe1818bc6eae78cd42b13662d55b3047dbc8e5","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":5,"id":"378dcacf_f66d1fc3","in_reply_to":"109feff5_29f04599","updated":"2026-04-29 11:37:18.000000000","message":"FTR, I\u0027m testing this patch with workload_balance and workload_stabilization in https://review.opendev.org/c/openstack/watcher-tempest-plugin/+/986616\n\nFirst i executed with current master code to check it fails\n\nhttps://review.opendev.org/c/openstack/watcher-tempest-plugin/+/986616/3#message-d8594c215a4a8ac037dcd6601dede2d26a07c7b1\n\nNow, I\u0027m running it with depends-on to validate it.\n\nI\u0027ll add a test for zone_migrate on top.","commit_id":"38c3b621bc707561f99792e590b27468c20a3126"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"bbc3833565000c99b69546d997b816d99be614da","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"60823104_c6d35d7c","updated":"2026-04-29 12:04:15.000000000","message":"+1: the patch looks good to me, i will just check tempest results from the other patch before turn this to a +2","commit_id":"54b8ee7058c14fb0e7233e3fcb63d2a5110ee38c"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"e2d80eec4a7b020d40e63d878b6d5b3c7790dca6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"3b9f789d_9d3f4dd8","updated":"2026-04-29 15:31:48.000000000","message":"lgtm overall, I\u0027ve pointed some small things, but we could proceed without them as well","commit_id":"99ce421c0c7590d5ab33eed29cc51235e4140793"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"8cf6eebd6100afe6436f4bb2bf6d674aa4fdef55","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"3ed17231_9d1b73a4","updated":"2026-05-04 13:55:47.000000000","message":"This LGTM, lets see if we don\u0027t have any other feedback before merging","commit_id":"5461b3611d211286d856282a44ae727e88242259"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1d8b11a9e680c9a9a7cb25fbdfc6611f406292e3","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"a7c5262b_ae8cffd2","updated":"2026-05-06 17:08:56.000000000","message":"im torn\ni spent the better part of the last hour lookign at this and at our exisitng test infrastucure.\n\nwe have not really tested the end to end behvior when you have bfv + swawp/ephermal in teh tempest tests.\n\ni also dont see a easey way to validate thatin any of the existign unit tests\n\nso without buildign the funcitonal test suite tempst is the only way to validate this end to end.\n\ni think the change is correct, but i dont think the testing is enough to consider bfv guest more then experimental and we are missing docuemation fo the many limiations that exist here. pluse one for now and we can dicuss it again tomorrow.","commit_id":"5461b3611d211286d856282a44ae727e88242259"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"aee997c1dde1e53f75be8a4e0e6dd894356ea6d1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"5f8e82c9_9ffa41a0","updated":"2026-05-08 13:23:45.000000000","message":"recheck","commit_id":"5461b3611d211286d856282a44ae727e88242259"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"05c969f103d3dcf40450431470342ac4244a445e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"0fd7eabf_fe541fe7","updated":"2026-04-30 08:31:38.000000000","message":"thanks Alfredo, lgtm","commit_id":"5461b3611d211286d856282a44ae727e88242259"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"7f130ca8c2e1314099d4ebeb3f5241b3993731c2","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"dd03d9dc_47c3234e","in_reply_to":"a7c5262b_ae8cffd2","updated":"2026-05-07 06:21:12.000000000","message":"I\u0027m updating the tests in the watcher-tempest-plugin with your feedback.\n\nWRT \" we are missing docuemation fo the many limiations that exist here\", you mean in the BfV part? which ones?","commit_id":"5461b3611d211286d856282a44ae727e88242259"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"875d61549f7c75e293ae5800d79f34e92250556f","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":9,"id":"e4c9d836_f8c96d25","in_reply_to":"dd03d9dc_47c3234e","updated":"2026-05-08 11:16:55.000000000","message":"for one if the non default CROSS_AZ_ATTACH\u003dFalse is set in nova the AZ of the compute host and cidner backend will need to match but in a default deployment they do not. watcher cant assume that cross az attach is disabeld today as it cant and it cant assume the names fo the sotrage az and comptue shoudl match.\n\nthat gap applies to all oru volume operation so its not nessiarly bfv specfic but there are changes in other behvior with regards to boot volumes vs data volumes\n\nthinks like how rebuild works or similar.\n\ngiven you have added a test that catully move the vm and added a test for swap/ephmeral i think there si now enough coverage to proceed with this patch but my gut says there are still dragon burried here htat we have not uncovered so im nervous ot advocate for using this with bfv vms untilw we have let this bake for a while","commit_id":"5461b3611d211286d856282a44ae727e88242259"}],"releasenotes/notes/fix-bfv-disk-accounting-773a95ec368843d5.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d973ffc389b7496d66ccdda2d8d0884aac3edb07","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":"    Enhances local disk accounting for boot-from-volume instances and"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"acd5a990_54570d29","line":1,"in_reply_to":"216c6779_6bcad512","updated":"2026-04-28 20:55:06.000000000","message":"Acknowledged","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"9bd5feb211a2b88d9c688799d1d9cbc22807d6b1","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":"    Enhances local disk accounting for boot-from-volume instances and"}],"source_content_type":"text/x-yaml","patch_set":2,"id":"216c6779_6bcad512","line":1,"in_reply_to":"abb66620_4f9dfe1f","updated":"2026-04-28 15:56:39.000000000","message":"We discussed about this and decided to treat it as a specless blueprint.","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d973ffc389b7496d66ccdda2d8d0884aac3edb07","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":"    Enhances local disk accounting for boot-from-volume instances and"},{"line_number":5,"context_line":"    when flavors has ephemeral and/or swap devices."}],"source_content_type":"text/x-yaml","patch_set":4,"id":"1edf5112_fccd3e9b","line":2,"in_reply_to":"37f55814_0029df39","updated":"2026-04-28 20:55:06.000000000","message":"my reveivew bot seam to be more open to this as a bug then i am :)","commit_id":"02b41922fe516c62ff2a889f3dd49f8c90707271"}],"watcher/common/nova_helper.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"9bd5feb211a2b88d9c688799d1d9cbc22807d6b1","unresolved":false,"context_lines":[{"line_number":125,"context_line":"    pinned_availability_zone: str | None"},{"line_number":126,"context_line":"    image: dict | None"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    @property"},{"line_number":129,"context_line":"    def is_boot_from_volume(self) -\u003e bool:"},{"line_number":130,"context_line":"        return self.image is None"},{"line_number":131,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"673bb5d2_a0fc68df","line":128,"in_reply_to":"1b582f82_8dd32b69","updated":"2026-04-28 15:56:39.000000000","message":"Done.","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d973ffc389b7496d66ccdda2d8d0884aac3edb07","unresolved":true,"context_lines":[{"line_number":154,"context_line":"        # image \u003d \"\", openstacksdk returns image\u003dNone. In any other"},{"line_number":155,"context_line":"        # case it returns {\u0027id\u0027: \u003cimage id\u003e}. We add a guard for the"},{"line_number":156,"context_line":"        # case where it returns {\u0027id\u0027: None}."},{"line_number":157,"context_line":"        image_data \u003d None"},{"line_number":158,"context_line":"        if ("},{"line_number":159,"context_line":"            nova_server.image is not None"},{"line_number":160,"context_line":"            and getattr(nova_server.image, \u0027id\u0027, None) is not None"},{"line_number":161,"context_line":"        ):"},{"line_number":162,"context_line":"            image_data \u003d {\u0027id\u0027: nova_server.image.id}"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        return cls("},{"line_number":165,"context_line":"            uuid\u003dnova_server.id,"},{"line_number":166,"context_line":"            name\u003dnova_server.name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"75436b65_75c06dff","line":163,"range":{"start_line":157,"start_character":0,"end_line":163,"end_character":1},"updated":"2026-04-28 20:55:06.000000000","message":"so the sdk object has 2 relvent field \n\nhttps://github.com/openstack/openstacksdk/blob/master/openstack/compute/v2/server.py#L160-L162\n\n    #: The image reference, as a ID or full URL, for the image to use for\n    #: this server.\n    image_id \u003d resource.Body(\u0027imageRef\u0027)\n    #: The image property as returned from server.\n    image \u003d resource.Body(\u0027image\u0027, type\u003dimage.Image)\n\nso this could just be \n```\n        image_data \u003d getattr(nova_server.image or {}, \u0027id\u0027, None)\n```\n\nbut i think it can also be \n\n\n\n```suggestion\n        image_data \u003d nova_server.image.id  if nova_server.image else None\n```\nimage wont raise an atibute error\n\n\n```\n\u003e\u003e\u003e from openstack.compute.v2 import server\n\u003e\u003e\u003e sot \u003d server.Server()\n\u003e\u003e\u003e sot\nopenstack.compute.v2.server.Server()\n\u003e\u003e\u003e sot.image\n\u003e\u003e\u003e type(sot.image)\n\u003cclass \u0027NoneType\u0027\u003e\n```\n\nso while we cant safely defer it without chekcing for None \nwe can make thsi a trivial if without using a reflection helper method","commit_id":"ce81e7b46e67982ea0fdd9dbd0fe6bae508b13ed"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a059ffaa15f32842e749cdf598db4b63626127e0","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        # image \u003d \"\", openstacksdk returns image\u003dNone. In any other"},{"line_number":155,"context_line":"        # case it returns {\u0027id\u0027: \u003cimage id\u003e}. We add a guard for the"},{"line_number":156,"context_line":"        # case where it returns {\u0027id\u0027: None}."},{"line_number":157,"context_line":"        image_data \u003d None"},{"line_number":158,"context_line":"        if ("},{"line_number":159,"context_line":"            nova_server.image is not None"},{"line_number":160,"context_line":"            and getattr(nova_server.image, \u0027id\u0027, None) is not None"},{"line_number":161,"context_line":"        ):"},{"line_number":162,"context_line":"            image_data \u003d {\u0027id\u0027: nova_server.image.id}"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"        return cls("},{"line_number":165,"context_line":"            uuid\u003dnova_server.id,"},{"line_number":166,"context_line":"            name\u003dnova_server.name,"}],"source_content_type":"text/x-python","patch_set":3,"id":"d613b59d_c9505581","line":163,"range":{"start_line":157,"start_character":0,"end_line":163,"end_character":1},"in_reply_to":"75436b65_75c06dff","updated":"2026-04-29 08:10:30.000000000","message":"Done","commit_id":"ce81e7b46e67982ea0fdd9dbd0fe6bae508b13ed"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a059ffaa15f32842e749cdf598db4b63626127e0","unresolved":false,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    @property"},{"line_number":129,"context_line":"    def is_boot_from_volume(self) -\u003e bool:"},{"line_number":130,"context_line":"        \"\"\"Check if server os boot from volume."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        :returns: True when is boot from volume (image is None)."},{"line_number":133,"context_line":"                  False when boot from image."}],"source_content_type":"text/x-python","patch_set":4,"id":"d8431fe2_7a4f6193","line":130,"in_reply_to":"1a1eece4_dbc478da","updated":"2026-04-29 08:10:30.000000000","message":"Done","commit_id":"02b41922fe516c62ff2a889f3dd49f8c90707271"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d973ffc389b7496d66ccdda2d8d0884aac3edb07","unresolved":true,"context_lines":[{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    @property"},{"line_number":129,"context_line":"    def is_boot_from_volume(self) -\u003e bool:"},{"line_number":130,"context_line":"        \"\"\"Check if server os boot from volume."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        :returns: True when is boot from volume (image is None)."},{"line_number":133,"context_line":"                  False when boot from image."}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1eece4_dbc478da","line":130,"in_reply_to":"d5c3552e_76bec016","updated":"2026-04-28 20:55:06.000000000","message":"thats valid\n\n \u0027Check if server is boot from volume\u0027 or \u0027Check if the server boots from volume\u0027.\n \n are both impovments","commit_id":"02b41922fe516c62ff2a889f3dd49f8c90707271"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"e2d80eec4a7b020d40e63d878b6d5b3c7790dca6","unresolved":true,"context_lines":[{"line_number":128,"context_line":"    @property"},{"line_number":129,"context_line":"    def is_boot_from_volume(self) -\u003e bool:"},{"line_number":130,"context_line":"        \"\"\"Check if server is boot from volume."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        :returns: True when is boot from volume (image is None)."},{"line_number":133,"context_line":"                  False when boot from image."},{"line_number":134,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"320c3952_08ab456f","line":131,"in_reply_to":"03d36cfc_d6f3408b","updated":"2026-04-29 15:31:48.000000000","message":"\u003e The is_boot_from_volume property docstring says \u0027True when is boot from volume\u0027 which has a grammatical error. Should read \u0027True when booting from volume\u0027 or \u0027True when the server boots from volume\u0027.\n\u003e \n\u003e **Severity**: SUGGESTION | **Confidence**: 0.8\n\u003e \n\u003e **Benefit**: Improves clarity and professionalism of the API documentation for the Server dataclass property.\n\u003e \n\u003e **Recommendation**:\n\u003e Change the docstring to \u0027:returns: True when the server boots from volume (image is None). False when booting from a local image.\u0027\n\nthis is a nit, but worth fixing it imo","commit_id":"99ce421c0c7590d5ab33eed29cc51235e4140793"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a85112a7ad1618010beee4734ca4ccebbc0e7e91","unresolved":false,"context_lines":[{"line_number":128,"context_line":"    @property"},{"line_number":129,"context_line":"    def is_boot_from_volume(self) -\u003e bool:"},{"line_number":130,"context_line":"        \"\"\"Check if server is boot from volume."},{"line_number":131,"context_line":""},{"line_number":132,"context_line":"        :returns: True when is boot from volume (image is None)."},{"line_number":133,"context_line":"                  False when boot from image."},{"line_number":134,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":7,"id":"6c0cc34e_6caf51ea","line":131,"in_reply_to":"320c3952_08ab456f","updated":"2026-04-30 06:30:10.000000000","message":"Done","commit_id":"99ce421c0c7590d5ab33eed29cc51235e4140793"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"8399eb758a27fb4c19c7cf220a559f43f4b4d15a","unresolved":false,"context_lines":[{"line_number":123,"context_line":"    metadata: dict"},{"line_number":124,"context_line":"    availability_zone: str | None"},{"line_number":125,"context_line":"    pinned_availability_zone: str | None"},{"line_number":126,"context_line":"    image: dict | None"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    @property"},{"line_number":129,"context_line":"    def is_boot_from_volume(self) -\u003e bool:"}],"source_content_type":"text/x-python","patch_set":8,"id":"e779453d_eb189e2e","line":126,"in_reply_to":"24c4c17c_70d76795","updated":"2026-04-30 07:56:35.000000000","message":"Yep. Fixing it.","commit_id":"5b5b752366bfec42b2aad33dfb6b3040c5a1bd35"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1d8b11a9e680c9a9a7cb25fbdfc6611f406292e3","unresolved":true,"context_lines":[{"line_number":123,"context_line":"    metadata: dict"},{"line_number":124,"context_line":"    availability_zone: str | None"},{"line_number":125,"context_line":"    pinned_availability_zone: str | None"},{"line_number":126,"context_line":"    image: str | None"},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"    @property"},{"line_number":129,"context_line":"    def is_boot_from_volume(self) -\u003e bool:"}],"source_content_type":"text/x-python","patch_set":9,"id":"b856d2c9_cfa27b8b","line":126,"in_reply_to":"8eafbedd_ed5775a3","updated":"2026-05-06 17:08:56.000000000","message":"i agree this woudl be slightly better\n\nalthough we can modify this in the future if needed.","commit_id":"5461b3611d211286d856282a44ae727e88242259"}],"watcher/decision_engine/model/collector/nova.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d973ffc389b7496d66ccdda2d8d0884aac3edb07","unresolved":true,"context_lines":[{"line_number":493,"context_line":"        :return: An instance node for the graph."},{"line_number":494,"context_line":"        \"\"\""},{"line_number":495,"context_line":"        flavor \u003d instance.flavor"},{"line_number":496,"context_line":"        root_disk \u003d 0 if instance.is_boot_from_volume else flavor[\"disk\"]"},{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("}],"source_content_type":"text/x-python","patch_set":2,"id":"c853216a_7efd3330","line":496,"in_reply_to":"026e2d44_19ceb472","updated":"2026-04-28 20:55:06.000000000","message":"this is true but thsi also requrie a min microverion of  2.47\nfor this to work\n\nhave you condiered addint local_disk as a propety on the server dataclsss instead of ding it here?\n\nhttps://github.com/openstack/watcher/blob/master/watcher/common/nova_helper.py#L105\n\nwe currently default our min version to 2.56\n\nhttps://docs.openstack.org/watcher/latest/configuration/watcher.html#nova_client.api_version\n\nwhoever technially watcher should not have that config at all and we should be robust to this in the code.\n\nthat option is an unsafe hack.","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"e2d80eec4a7b020d40e63d878b6d5b3c7790dca6","unresolved":true,"context_lines":[{"line_number":493,"context_line":"        :return: An instance node for the graph."},{"line_number":494,"context_line":"        \"\"\""},{"line_number":495,"context_line":"        flavor \u003d instance.flavor"},{"line_number":496,"context_line":"        root_disk \u003d 0 if instance.is_boot_from_volume else flavor[\"disk\"]"},{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("}],"source_content_type":"text/x-python","patch_set":2,"id":"4ea85bce_b43c8d76","line":496,"in_reply_to":"20fed2bc_3cce89eb","updated":"2026-04-29 15:31:48.000000000","message":"in this case the amount of duplication IMO is fine, but considering backports it\u0027s better to have this out of the Server class since that will not exist in the 2025 branches. If we really wanted to avoid the duplication we could move the logic to some utility function, but I\u0027m not sure it\u0027s worth it in this case","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"8cf6eebd6100afe6436f4bb2bf6d674aa4fdef55","unresolved":true,"context_lines":[{"line_number":493,"context_line":"        :return: An instance node for the graph."},{"line_number":494,"context_line":"        \"\"\""},{"line_number":495,"context_line":"        flavor \u003d instance.flavor"},{"line_number":496,"context_line":"        root_disk \u003d 0 if instance.is_boot_from_volume else flavor[\"disk\"]"},{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("}],"source_content_type":"text/x-python","patch_set":2,"id":"6fd715b0_b0972b4c","line":496,"in_reply_to":"4ea85bce_b43c8d76","updated":"2026-05-04 13:55:47.000000000","message":"It is debatable if it should leave inside or outside of the dataclass. I am OK with the way that was proposed.","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1d8b11a9e680c9a9a7cb25fbdfc6611f406292e3","unresolved":true,"context_lines":[{"line_number":493,"context_line":"        :return: An instance node for the graph."},{"line_number":494,"context_line":"        \"\"\""},{"line_number":495,"context_line":"        flavor \u003d instance.flavor"},{"line_number":496,"context_line":"        root_disk \u003d 0 if instance.is_boot_from_volume else flavor[\"disk\"]"},{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("}],"source_content_type":"text/x-python","patch_set":2,"id":"98eac2c6_83dcdbbd","line":496,"in_reply_to":"6fd715b0_b0972b4c","updated":"2026-05-06 17:08:56.000000000","message":"this is not backportable upstream so we generally shoudl not write code with downstream only backprtas as a signifcinat design critira\n\nwith that said this is likely ok in this once case but its less clean then it could have been","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"bbc3833565000c99b69546d997b816d99be614da","unresolved":true,"context_lines":[{"line_number":493,"context_line":"        :return: An instance node for the graph."},{"line_number":494,"context_line":"        \"\"\""},{"line_number":495,"context_line":"        flavor \u003d instance.flavor"},{"line_number":496,"context_line":"        root_disk \u003d 0 if instance.is_boot_from_volume else flavor[\"disk\"]"},{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("}],"source_content_type":"text/x-python","patch_set":2,"id":"20fed2bc_3cce89eb","line":496,"in_reply_to":"78d7f133_13881ec2","updated":"2026-04-29 12:04:15.000000000","message":"It could be a property in server dataclass too yeah. Both ways are fine for me to be honest, but you can also think which change is better to backport in the end and go with the better approach.","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"9bd5feb211a2b88d9c688799d1d9cbc22807d6b1","unresolved":true,"context_lines":[{"line_number":493,"context_line":"        :return: An instance node for the graph."},{"line_number":494,"context_line":"        \"\"\""},{"line_number":495,"context_line":"        flavor \u003d instance.flavor"},{"line_number":496,"context_line":"        root_disk \u003d 0 if instance.is_boot_from_volume else flavor[\"disk\"]"},{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("}],"source_content_type":"text/x-python","patch_set":2,"id":"026e2d44_19ceb472","line":496,"in_reply_to":"b6ac9abb_9f5c2314","updated":"2026-04-28 15:56:39.000000000","message":"Yes, that\u0027s because collector builds it from the Server object in the API while notification builds it from the nova notifications payload which uses different identificators and objects structure.","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a059ffaa15f32842e749cdf598db4b63626127e0","unresolved":true,"context_lines":[{"line_number":493,"context_line":"        :return: An instance node for the graph."},{"line_number":494,"context_line":"        \"\"\""},{"line_number":495,"context_line":"        flavor \u003d instance.flavor"},{"line_number":496,"context_line":"        root_disk \u003d 0 if instance.is_boot_from_volume else flavor[\"disk\"]"},{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("}],"source_content_type":"text/x-python","patch_set":2,"id":"d0acd67f_b004cfa0","line":496,"in_reply_to":"c853216a_7efd3330","updated":"2026-04-29 08:10:30.000000000","message":"2.47 is Pike release https://docs.openstack.org/nova/latest/reference/api-microversion-history.html\n\nI think it\u0027s safe to asume we have \u003e\u003d 2.47 (in addition that we default our in to 2.56 as you mentioned).\n\nwrt:\n\nhave you condiered addint local_disk as a propety on the server dataclsss instead of ding it here?\n\nhttps://github.com/openstack/watcher/blob/master/watcher/common/nova_helper.py#L105\n\nI liked the idea of keep the Server dataclass in the nova_helper close to the openstacksdk object and make this kind of processing in the collector. I could change it there is a justification for it and improves something.","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9d48bd29c8a4a1da8fed6c4f289d623c0886f4d5","unresolved":true,"context_lines":[{"line_number":493,"context_line":"        :return: An instance node for the graph."},{"line_number":494,"context_line":"        \"\"\""},{"line_number":495,"context_line":"        flavor \u003d instance.flavor"},{"line_number":496,"context_line":"        root_disk \u003d 0 if instance.is_boot_from_volume else flavor[\"disk\"]"},{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("}],"source_content_type":"text/x-python","patch_set":2,"id":"78d7f133_13881ec2","line":496,"in_reply_to":"d0acd67f_b004cfa0","updated":"2026-04-29 10:23:52.000000000","message":"well the improvment is that we keep the queise on the object local to the object rather then spreadign them across the code\n\nthat what i was orginally hoping we would do.\n\neigher work but readonly views fo the data are ok to have on the dataclas.\n\nif we were usign ovos for that we woudl include it on the ovo so the fact its a dataclass does not really change anything.","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"95d1690a8ec95131249494c8c57c34b9ee41e1e2","unresolved":true,"context_lines":[{"line_number":494,"context_line":"        \"\"\""},{"line_number":495,"context_line":"        flavor \u003d instance.flavor"},{"line_number":496,"context_line":"        root_disk \u003d 0 if instance.is_boot_from_volume else flavor[\"disk\"]"},{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("},{"line_number":500,"context_line":"            root_disk + flavor[\"ephemeral\"] + -(-flavor[\"swap\"] // 1024)"}],"source_content_type":"text/x-python","patch_set":2,"id":"67c73176_5fc3db77","line":497,"in_reply_to":"0495c9b1_dc17ce54","updated":"2026-04-28 18:14:22.000000000","message":"the helper shouldn\u0027t be needed but I agree on using math since it is part of the standard library","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d973ffc389b7496d66ccdda2d8d0884aac3edb07","unresolved":false,"context_lines":[{"line_number":494,"context_line":"        \"\"\""},{"line_number":495,"context_line":"        flavor \u003d instance.flavor"},{"line_number":496,"context_line":"        root_disk \u003d 0 if instance.is_boot_from_volume else flavor[\"disk\"]"},{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("},{"line_number":500,"context_line":"            root_disk + flavor[\"ephemeral\"] + -(-flavor[\"swap\"] // 1024)"}],"source_content_type":"text/x-python","patch_set":2,"id":"d54ec32f_026ca8d7","line":497,"in_reply_to":"3e781664_ba2f9a2d","updated":"2026-04-28 20:55:06.000000000","message":"Done","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b8768e6532d43f571da2924322b99525d0a32b0b","unresolved":true,"context_lines":[{"line_number":494,"context_line":"        \"\"\""},{"line_number":495,"context_line":"        flavor \u003d instance.flavor"},{"line_number":496,"context_line":"        root_disk \u003d 0 if instance.is_boot_from_volume else flavor[\"disk\"]"},{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("},{"line_number":500,"context_line":"            root_disk + flavor[\"ephemeral\"] + -(-flavor[\"swap\"] // 1024)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3e781664_ba2f9a2d","line":497,"in_reply_to":"67c73176_5fc3db77","updated":"2026-04-28 19:12:56.000000000","message":"Ack, I will update to use math.","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"9bd5feb211a2b88d9c688799d1d9cbc22807d6b1","unresolved":true,"context_lines":[{"line_number":494,"context_line":"        \"\"\""},{"line_number":495,"context_line":"        flavor \u003d instance.flavor"},{"line_number":496,"context_line":"        root_disk \u003d 0 if instance.is_boot_from_volume else flavor[\"disk\"]"},{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("},{"line_number":500,"context_line":"            root_disk + flavor[\"ephemeral\"] + -(-flavor[\"swap\"] // 1024)"}],"source_content_type":"text/x-python","patch_set":2,"id":"765fd062_ed5e3124","line":497,"in_reply_to":"72339f95_2ff01e07","updated":"2026-04-28 15:56:39.000000000","message":"Actually i didn\u0027t want to import math un purpose. I added comment in the two places where i\u0027m doing ceiling division, i don\u0027t think it\u0027s worthy to do one operation method tbh, but i can if others request it.","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d49522775701838ac6eb8c8115d2070036468e7e","unresolved":true,"context_lines":[{"line_number":494,"context_line":"        \"\"\""},{"line_number":495,"context_line":"        flavor \u003d instance.flavor"},{"line_number":496,"context_line":"        root_disk \u003d 0 if instance.is_boot_from_volume else flavor[\"disk\"]"},{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("},{"line_number":500,"context_line":"            root_disk + flavor[\"ephemeral\"] + -(-flavor[\"swap\"] // 1024)"}],"source_content_type":"text/x-python","patch_set":2,"id":"0495c9b1_dc17ce54","line":497,"in_reply_to":"765fd062_ed5e3124","updated":"2026-04-28 16:08:17.000000000","message":"well i woudl prefer you did because i dont think doing it the way you have is a good approch\n\nit is far to error prone and much harder to read.","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"9bd5feb211a2b88d9c688799d1d9cbc22807d6b1","unresolved":true,"context_lines":[{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("},{"line_number":500,"context_line":"            root_disk + flavor[\"ephemeral\"] + -(-flavor[\"swap\"] // 1024)"},{"line_number":501,"context_line":"        )"},{"line_number":502,"context_line":"        instance_attributes \u003d {"},{"line_number":503,"context_line":"            \"uuid\": instance.uuid,"}],"source_content_type":"text/x-python","patch_set":2,"id":"4d8f2f11_efd9b086","line":500,"in_reply_to":"461c8085_14758eae","updated":"2026-04-28 15:56:39.000000000","message":"ephemeral and swap are always included even if value is 0","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"95d1690a8ec95131249494c8c57c34b9ee41e1e2","unresolved":true,"context_lines":[{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("},{"line_number":500,"context_line":"            root_disk + flavor[\"ephemeral\"] + -(-flavor[\"swap\"] // 1024)"},{"line_number":501,"context_line":"        )"},{"line_number":502,"context_line":"        instance_attributes \u003d {"},{"line_number":503,"context_line":"            \"uuid\": instance.uuid,"}],"source_content_type":"text/x-python","patch_set":2,"id":"fbe3fd07_9b6cc74f","line":500,"in_reply_to":"4d8f2f11_efd9b086","updated":"2026-04-28 18:14:22.000000000","message":"right, if unspecified they are 0 by default[1]\n\n[1] https://docs.openstack.org/nova/2026.1/user/flavors.html","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a059ffaa15f32842e749cdf598db4b63626127e0","unresolved":true,"context_lines":[{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("},{"line_number":500,"context_line":"            root_disk + flavor[\"ephemeral\"] + -(-flavor[\"swap\"] // 1024)"},{"line_number":501,"context_line":"        )"},{"line_number":502,"context_line":"        instance_attributes \u003d {"},{"line_number":503,"context_line":"            \"uuid\": instance.uuid,"}],"source_content_type":"text/x-python","patch_set":2,"id":"7ba7d45d_4a47073e","line":500,"in_reply_to":"65ef61ac_26e5fc48","updated":"2026-04-29 08:10:30.000000000","message":"As mentioned before, 2.47 is Pike which is not supported since long ago. Also, we have minimal default to 2.56.","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9d48bd29c8a4a1da8fed6c4f289d623c0886f4d5","unresolved":false,"context_lines":[{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("},{"line_number":500,"context_line":"            root_disk + flavor[\"ephemeral\"] + -(-flavor[\"swap\"] // 1024)"},{"line_number":501,"context_line":"        )"},{"line_number":502,"context_line":"        instance_attributes \u003d {"},{"line_number":503,"context_line":"            \"uuid\": instance.uuid,"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a44dabd_179613d0","line":500,"in_reply_to":"7ba7d45d_4a47073e","updated":"2026-04-29 10:23:52.000000000","message":"yes but nova min micorversion on master is 2.1 we can defer fixing this till later as watcher is in gerneal using microvertsion incorrectly so we can adress this when we get aroudn to removing the config option.\n\nwe dont actuly set a min value on that config option we only set a default so its possibel for operators to set it lower and that will break parts of watcher.\n\nin ci we set it even higher but api with microversion are not indeded to be called with a singel version for every call. at some point we will have to set it higher again for another feature and it may brake some other functionatliy so this is technical debt that shoudl be corrected as part of or after the sdk migrtion is done.","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d973ffc389b7496d66ccdda2d8d0884aac3edb07","unresolved":true,"context_lines":[{"line_number":497,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":498,"context_line":"        # round up."},{"line_number":499,"context_line":"        local_disk \u003d ("},{"line_number":500,"context_line":"            root_disk + flavor[\"ephemeral\"] + -(-flavor[\"swap\"] // 1024)"},{"line_number":501,"context_line":"        )"},{"line_number":502,"context_line":"        instance_attributes \u003d {"},{"line_number":503,"context_line":"            \"uuid\": instance.uuid,"}],"source_content_type":"text/x-python","patch_set":2,"id":"65ef61ac_26e5fc48","line":500,"in_reply_to":"fbe3fd07_9b6cc74f","updated":"2026-04-28 20:55:06.000000000","message":"yes and no\n\nthis is only present in  2.47 and above\n\nso this depen on if you requst a new enough micorversion.\n\nunlike flavor extaspecs this is not configurabl by policy just by microversion.\n\nhttps://docs.openstack.org/api-ref/compute/#id30\n\nso we shoudl first request it with at least 2.47 and in genral we shoudl prefer .get() for dictionary access to avoid key errors\n\nhttps://github.com/openstack/watcher/blob/master/watcher/common/nova_helper.py#L120\n\nwe may be creating our own data clasess but we cant rely on the flavor dict havign these keys in general unless wo knwo the micoversoin used.","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"95d1690a8ec95131249494c8c57c34b9ee41e1e2","unresolved":true,"context_lines":[{"line_number":503,"context_line":"            \"uuid\": instance.uuid,"},{"line_number":504,"context_line":"            \"name\": instance.name,"},{"line_number":505,"context_line":"            \"memory\": flavor[\"ram\"],"},{"line_number":506,"context_line":"            \"disk\": local_disk,"},{"line_number":507,"context_line":"            \"vcpus\": flavor[\"vcpus\"],"},{"line_number":508,"context_line":"            \"state\": instance.vm_state,"},{"line_number":509,"context_line":"            \"metadata\": instance.metadata,"}],"source_content_type":"text/x-python","patch_set":3,"id":"b287ebea_45ff21e1","line":506,"range":{"start_line":506,"start_character":13,"end_line":506,"end_character":17},"updated":"2026-04-28 18:14:22.000000000","message":"Do make sense to keep disk as flavor[\u0027disk\u0027] and have a new local_disk attribute? I don\u0027t see why strategies would need the flavor disk instead of the ephemeral disk size used by the instance. Just asking..","commit_id":"ce81e7b46e67982ea0fdd9dbd0fe6bae508b13ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"9d48bd29c8a4a1da8fed6c4f289d623c0886f4d5","unresolved":true,"context_lines":[{"line_number":503,"context_line":"            \"uuid\": instance.uuid,"},{"line_number":504,"context_line":"            \"name\": instance.name,"},{"line_number":505,"context_line":"            \"memory\": flavor[\"ram\"],"},{"line_number":506,"context_line":"            \"disk\": local_disk,"},{"line_number":507,"context_line":"            \"vcpus\": flavor[\"vcpus\"],"},{"line_number":508,"context_line":"            \"state\": instance.vm_state,"},{"line_number":509,"context_line":"            \"metadata\": instance.metadata,"}],"source_content_type":"text/x-python","patch_set":3,"id":"8c3d6fe3_7b6b6383","line":506,"range":{"start_line":506,"start_character":13,"end_line":506,"end_character":17},"in_reply_to":"1ec73844_1927962c","updated":"2026-04-29 10:23:52.000000000","message":"yep this is ok to leave as it is for now for my perspective\n\ndoug has a vaild point that we may want to hav eboth the falgovr disk an local disk\n\nits also true that this si techniall a change in the api behvior.\nif we wanted to have the api be purly backward compatible we woudl need\nto keep disk as flavor[root_gb]\nand add a new filed or filed for the ephrmal/swap or loca_disk\n\nthat is stricly better form an api compatibltiy point of view but i think its arguablly misleading to be showting the flavor value today.\n\nso im ok with either approch.","commit_id":"ce81e7b46e67982ea0fdd9dbd0fe6bae508b13ed"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a85112a7ad1618010beee4734ca4ccebbc0e7e91","unresolved":false,"context_lines":[{"line_number":503,"context_line":"            \"uuid\": instance.uuid,"},{"line_number":504,"context_line":"            \"name\": instance.name,"},{"line_number":505,"context_line":"            \"memory\": flavor[\"ram\"],"},{"line_number":506,"context_line":"            \"disk\": local_disk,"},{"line_number":507,"context_line":"            \"vcpus\": flavor[\"vcpus\"],"},{"line_number":508,"context_line":"            \"state\": instance.vm_state,"},{"line_number":509,"context_line":"            \"metadata\": instance.metadata,"}],"source_content_type":"text/x-python","patch_set":3,"id":"6c1855dd_b3542ca4","line":506,"range":{"start_line":506,"start_character":13,"end_line":506,"end_character":17},"in_reply_to":"2cb80a5c_b1d4355d","updated":"2026-04-30 06:30:10.000000000","message":"Done","commit_id":"ce81e7b46e67982ea0fdd9dbd0fe6bae508b13ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d973ffc389b7496d66ccdda2d8d0884aac3edb07","unresolved":true,"context_lines":[{"line_number":503,"context_line":"            \"uuid\": instance.uuid,"},{"line_number":504,"context_line":"            \"name\": instance.name,"},{"line_number":505,"context_line":"            \"memory\": flavor[\"ram\"],"},{"line_number":506,"context_line":"            \"disk\": local_disk,"},{"line_number":507,"context_line":"            \"vcpus\": flavor[\"vcpus\"],"},{"line_number":508,"context_line":"            \"state\": instance.vm_state,"},{"line_number":509,"context_line":"            \"metadata\": instance.metadata,"}],"source_content_type":"text/x-python","patch_set":3,"id":"a20f4e9e_bfb1bffe","line":506,"range":{"start_line":506,"start_character":13,"end_line":506,"end_character":17},"in_reply_to":"72ce32a7_cb5018ff","updated":"2026-04-28 20:55:06.000000000","message":"not above i think adding a local_disk propry on teh server dataclss woudl be a slightly better approach.\n\nthen this can just be instnace.local_disk for the model\n\nin genreeal we do need to be carful with ephmeral storage\n\ni know we transfer the data on ephermal disk  when we live migrate but the epmeral stoage is lost (not the root disk) on resize and shelve.\n\n\ni belvie we try to rpeseve it on cold migrate\nbut we will need to be a littel carful in general when vms have ephermal\n\nat some tpoint hat shoudl be incldued more completely in the data model\n\ninfract we probably shoudl include the entire flavor eventually.\n\nfor now i think it si ok to have disk be local_disk","commit_id":"ce81e7b46e67982ea0fdd9dbd0fe6bae508b13ed"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"bbc3833565000c99b69546d997b816d99be614da","unresolved":true,"context_lines":[{"line_number":503,"context_line":"            \"uuid\": instance.uuid,"},{"line_number":504,"context_line":"            \"name\": instance.name,"},{"line_number":505,"context_line":"            \"memory\": flavor[\"ram\"],"},{"line_number":506,"context_line":"            \"disk\": local_disk,"},{"line_number":507,"context_line":"            \"vcpus\": flavor[\"vcpus\"],"},{"line_number":508,"context_line":"            \"state\": instance.vm_state,"},{"line_number":509,"context_line":"            \"metadata\": instance.metadata,"}],"source_content_type":"text/x-python","patch_set":3,"id":"92b53fd0_56871f99","line":506,"range":{"start_line":506,"start_character":13,"end_line":506,"end_character":17},"in_reply_to":"8c3d6fe3_7b6b6383","updated":"2026-04-29 12:04:15.000000000","message":"yeah, that\u0027s was my concern. That we are changing the response of this api which may affect out of the tree strategies. But I am also considering that we are fixing the model by returning a more realistic local disk allocation without requiring changes in the strategies.\nSo I am ok with following this approach. \"disk\" seems more correct now that only reporting flavor[\"disk\"]","commit_id":"ce81e7b46e67982ea0fdd9dbd0fe6bae508b13ed"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"e2d80eec4a7b020d40e63d878b6d5b3c7790dca6","unresolved":true,"context_lines":[{"line_number":503,"context_line":"            \"uuid\": instance.uuid,"},{"line_number":504,"context_line":"            \"name\": instance.name,"},{"line_number":505,"context_line":"            \"memory\": flavor[\"ram\"],"},{"line_number":506,"context_line":"            \"disk\": local_disk,"},{"line_number":507,"context_line":"            \"vcpus\": flavor[\"vcpus\"],"},{"line_number":508,"context_line":"            \"state\": instance.vm_state,"},{"line_number":509,"context_line":"            \"metadata\": instance.metadata,"}],"source_content_type":"text/x-python","patch_set":3,"id":"2cb80a5c_b1d4355d","line":506,"range":{"start_line":506,"start_character":13,"end_line":506,"end_character":17},"in_reply_to":"92b53fd0_56871f99","updated":"2026-04-29 15:31:48.000000000","message":"given the points discussed I think it might make sense to document the meaning of the `disk` property in https://github.com/openstack/watcher/blob/b0a807ffd6001de51c707006438d60e86498346e/watcher/decision_engine/model/element/instance.py#L52 with a comment","commit_id":"ce81e7b46e67982ea0fdd9dbd0fe6bae508b13ed"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a059ffaa15f32842e749cdf598db4b63626127e0","unresolved":true,"context_lines":[{"line_number":503,"context_line":"            \"uuid\": instance.uuid,"},{"line_number":504,"context_line":"            \"name\": instance.name,"},{"line_number":505,"context_line":"            \"memory\": flavor[\"ram\"],"},{"line_number":506,"context_line":"            \"disk\": local_disk,"},{"line_number":507,"context_line":"            \"vcpus\": flavor[\"vcpus\"],"},{"line_number":508,"context_line":"            \"state\": instance.vm_state,"},{"line_number":509,"context_line":"            \"metadata\": instance.metadata,"}],"source_content_type":"text/x-python","patch_set":3,"id":"1ec73844_1927962c","line":506,"range":{"start_line":506,"start_character":13,"end_line":506,"end_character":17},"in_reply_to":"a20f4e9e_bfb1bffe","updated":"2026-04-29 08:10:30.000000000","message":"Thanks for the details about behavior with ephemeral disks. So far we are not including resize as resulting actions on any of the strategies (other than the actuator which is mainly to test or as a way to trigger any action \"at your own risk\". It seems a good topic to define how to handle resizes when using ephemeral in future.\n\nWRT disk vs local_disk, in your last sentence \"for now i think it si ok to have disk be local_disk\", so I understand you are happy with the current approach for now?","commit_id":"ce81e7b46e67982ea0fdd9dbd0fe6bae508b13ed"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b8768e6532d43f571da2924322b99525d0a32b0b","unresolved":true,"context_lines":[{"line_number":503,"context_line":"            \"uuid\": instance.uuid,"},{"line_number":504,"context_line":"            \"name\": instance.name,"},{"line_number":505,"context_line":"            \"memory\": flavor[\"ram\"],"},{"line_number":506,"context_line":"            \"disk\": local_disk,"},{"line_number":507,"context_line":"            \"vcpus\": flavor[\"vcpus\"],"},{"line_number":508,"context_line":"            \"state\": instance.vm_state,"},{"line_number":509,"context_line":"            \"metadata\": instance.metadata,"}],"source_content_type":"text/x-python","patch_set":3,"id":"72ce32a7_cb5018ff","line":506,"range":{"start_line":506,"start_character":13,"end_line":506,"end_character":17},"in_reply_to":"b287ebea_45ff21e1","updated":"2026-04-28 19:12:56.000000000","message":"Checking the different usages of the instance.disk from the model in watcher (both in model\u0027s methods as in:\n\nhttps://github.com/openstack/watcher/blob/58a2fc9a37fafeb8c58374b3df50f170d0d626fb/watcher/decision_engine/model/model_root.py#L233-L242\n\nused in:\n\nhttps://github.com/openstack/watcher/blob/58a2fc9a37fafeb8c58374b3df50f170d0d626fb/watcher/decision_engine/model/model_root.py#L244-L248\n\nor in different strategies as in:\n\nhttps://github.com/openstack/watcher/blob/master/watcher/decision_engine/strategy/strategies/workload_balance.py#L197\n\nhttps://github.com/openstack/watcher/blob/master/watcher/decision_engine/strategy/strategies/workload_balance.py#L207-L211\n\nhttps://github.com/openstack/watcher/blob/master/watcher/decision_engine/strategy/strategies/vm_workload_consolidation.py#L394\n\nI think all have the meaning of \"The ammount of disk assigned for this vm in the compute node\" and it\u0027s used to calculate if a node has disk space for an instance. If we leave that field as is and add a new one, we\u0027d need to fix all those methods for the new field. I don\u0027t see a place where the behavior of disk \u003d flavor.disk unconditionally is actually expected so I\u0027d avoid adding an extra field.","commit_id":"ce81e7b46e67982ea0fdd9dbd0fe6bae508b13ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1d8b11a9e680c9a9a7cb25fbdfc6611f406292e3","unresolved":true,"context_lines":[{"line_number":498,"context_line":"        root_disk \u003d 0 if instance.is_boot_from_volume else flavor[\"disk\"]"},{"line_number":499,"context_line":"        # swap is in MB; math.ceil(x / 1024) is ceiling division to GB to"},{"line_number":500,"context_line":"        # always round up."},{"line_number":501,"context_line":"        local_disk \u003d ("},{"line_number":502,"context_line":"            root_disk + flavor[\"ephemeral\"] + math.ceil(flavor[\"swap\"] / 1024)"},{"line_number":503,"context_line":"        )"},{"line_number":504,"context_line":"        instance_attributes \u003d {"}],"source_content_type":"text/x-python","patch_set":9,"id":"8e01fb10_60b8129a","line":501,"in_reply_to":"b2a9ac82_31f12212","updated":"2026-05-06 17:08:56.000000000","message":"normalising on  flavor.get(\u0027ephemeral\u0027, 0)  would be preferable yes.","commit_id":"5461b3611d211286d856282a44ae727e88242259"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"8cf6eebd6100afe6436f4bb2bf6d674aa4fdef55","unresolved":true,"context_lines":[{"line_number":499,"context_line":"        # swap is in MB; math.ceil(x / 1024) is ceiling division to GB to"},{"line_number":500,"context_line":"        # always round up."},{"line_number":501,"context_line":"        local_disk \u003d ("},{"line_number":502,"context_line":"            root_disk + flavor[\"ephemeral\"] + math.ceil(flavor[\"swap\"] / 1024)"},{"line_number":503,"context_line":"        )"},{"line_number":504,"context_line":"        instance_attributes \u003d {"},{"line_number":505,"context_line":"            \"uuid\": instance.uuid,"}],"source_content_type":"text/x-python","patch_set":9,"id":"0dea435a_42ec19cc","line":502,"range":{"start_line":502,"start_character":12,"end_line":502,"end_character":70},"updated":"2026-05-04 13:55:47.000000000","message":"it seems that we have both flavor attributes as integer since 2.47[1], so I think that we should be good. \n\nNote that in flavor list details the swap defaulted to 0 starting at 2.65 [2]. But this is not the case, since we populate with  server list details.\n\n[1] https://github.com/openstack/nova/blob/2e0bfb1102d8af376c110a169eba42e0905dae07/nova/api/openstack/compute/schemas/servers.py#L1130-L1145\n[2] https://docs.openstack.org/api-ref/compute/#show-flavor-details","commit_id":"5461b3611d211286d856282a44ae727e88242259"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1d8b11a9e680c9a9a7cb25fbdfc6611f406292e3","unresolved":true,"context_lines":[{"line_number":499,"context_line":"        # swap is in MB; math.ceil(x / 1024) is ceiling division to GB to"},{"line_number":500,"context_line":"        # always round up."},{"line_number":501,"context_line":"        local_disk \u003d ("},{"line_number":502,"context_line":"            root_disk + flavor[\"ephemeral\"] + math.ceil(flavor[\"swap\"] / 1024)"},{"line_number":503,"context_line":"        )"},{"line_number":504,"context_line":"        instance_attributes \u003d {"},{"line_number":505,"context_line":"            \"uuid\": instance.uuid,"}],"source_content_type":"text/x-python","patch_set":9,"id":"581d4db6_25c88af5","line":502,"in_reply_to":"1235f691_a9145574","updated":"2026-05-06 17:08:56.000000000","message":"this is slightly cleaner but both are accpable.\n\nin general i avoid dict access via subscript where reasonabel to do so\n\nbut this is not enought o respine on its own.","commit_id":"5461b3611d211286d856282a44ae727e88242259"}],"watcher/decision_engine/model/element/instance.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"8399eb758a27fb4c19c7cf220a559f43f4b4d15a","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        \"name\": ovo_fields.StringField(),"},{"line_number":50,"context_line":"        \"state\": ovo_fields.StringField(default\u003dInstanceState.ACTIVE.value),"},{"line_number":51,"context_line":"        \"memory\": ovo_fields.NonNegativeIntegerField(),"},{"line_number":52,"context_line":"        # disk is the size of storage resource assigned to the Instance in the"},{"line_number":53,"context_line":"        # compute node in GB."},{"line_number":54,"context_line":"        \"disk\": ovo_fields.NonNegativeIntegerField(),"},{"line_number":55,"context_line":"        \"vcpus\": ovo_fields.NonNegativeIntegerField(),"}],"source_content_type":"text/x-python","patch_set":8,"id":"069015b0_fbaf405b","line":52,"in_reply_to":"3541f8b6_84983802","updated":"2026-04-30 07:56:35.000000000","message":"Done","commit_id":"5b5b752366bfec42b2aad33dfb6b3040c5a1bd35"}],"watcher/decision_engine/model/notification/nova.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d49522775701838ac6eb8c8115d2070036468e7e","unresolved":true,"context_lines":[{"line_number":94,"context_line":"        disk_gb +\u003d instance_flavor_data.get(\u0027ephemeral_gb\u0027, 0)"},{"line_number":95,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":96,"context_line":"        # round up."},{"line_number":97,"context_line":"        disk_gb +\u003d -(-instance_flavor_data.get(\u0027swap\u0027, 0) // 1024)"},{"line_number":98,"context_line":"        instance_metadata \u003d data[\u0027nova_object.data\u0027][\u0027metadata\u0027]"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        instance.update("}],"source_content_type":"text/x-python","patch_set":3,"id":"3066ab30_64e57ea0","line":97,"range":{"start_line":97,"start_character":19,"end_line":97,"end_character":22},"updated":"2026-04-28 16:08:17.000000000","message":"why do that when you can do math.ceil?\n\nhttps://docs.python.org/3/library/math.html#math.ceil\n```suggestion\n        disk_gb +\u003d math.ceil(instance_flavor_data.get(\u0027swap\u0027, 0) / 1024)\n```","commit_id":"ce81e7b46e67982ea0fdd9dbd0fe6bae508b13ed"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"95d1690a8ec95131249494c8c57c34b9ee41e1e2","unresolved":true,"context_lines":[{"line_number":94,"context_line":"        disk_gb +\u003d instance_flavor_data.get(\u0027ephemeral_gb\u0027, 0)"},{"line_number":95,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":96,"context_line":"        # round up."},{"line_number":97,"context_line":"        disk_gb +\u003d -(-instance_flavor_data.get(\u0027swap\u0027, 0) // 1024)"},{"line_number":98,"context_line":"        instance_metadata \u003d data[\u0027nova_object.data\u0027][\u0027metadata\u0027]"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        instance.update("}],"source_content_type":"text/x-python","patch_set":3,"id":"b688b5a9_91cc0599","line":97,"range":{"start_line":97,"start_character":19,"end_line":97,"end_character":22},"in_reply_to":"3066ab30_64e57ea0","updated":"2026-04-28 18:14:22.000000000","message":"+1","commit_id":"ce81e7b46e67982ea0fdd9dbd0fe6bae508b13ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d973ffc389b7496d66ccdda2d8d0884aac3edb07","unresolved":false,"context_lines":[{"line_number":94,"context_line":"        disk_gb +\u003d instance_flavor_data.get(\u0027ephemeral_gb\u0027, 0)"},{"line_number":95,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":96,"context_line":"        # round up."},{"line_number":97,"context_line":"        disk_gb +\u003d -(-instance_flavor_data.get(\u0027swap\u0027, 0) // 1024)"},{"line_number":98,"context_line":"        instance_metadata \u003d data[\u0027nova_object.data\u0027][\u0027metadata\u0027]"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        instance.update("}],"source_content_type":"text/x-python","patch_set":3,"id":"00871d1a_eb60d7a9","line":97,"range":{"start_line":97,"start_character":19,"end_line":97,"end_character":22},"in_reply_to":"6e74b1f7_e4aac2ed","updated":"2026-04-28 20:55:06.000000000","message":"Done","commit_id":"ce81e7b46e67982ea0fdd9dbd0fe6bae508b13ed"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"b8768e6532d43f571da2924322b99525d0a32b0b","unresolved":true,"context_lines":[{"line_number":94,"context_line":"        disk_gb +\u003d instance_flavor_data.get(\u0027ephemeral_gb\u0027, 0)"},{"line_number":95,"context_line":"        # swap is in MB; -(-x // 1024) is ceiling division to GB to always"},{"line_number":96,"context_line":"        # round up."},{"line_number":97,"context_line":"        disk_gb +\u003d -(-instance_flavor_data.get(\u0027swap\u0027, 0) // 1024)"},{"line_number":98,"context_line":"        instance_metadata \u003d data[\u0027nova_object.data\u0027][\u0027metadata\u0027]"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        instance.update("}],"source_content_type":"text/x-python","patch_set":3,"id":"6e74b1f7_e4aac2ed","line":97,"range":{"start_line":97,"start_character":19,"end_line":97,"end_character":22},"in_reply_to":"b688b5a9_91cc0599","updated":"2026-04-28 19:12:56.000000000","message":"Moving it to math.","commit_id":"ce81e7b46e67982ea0fdd9dbd0fe6bae508b13ed"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d973ffc389b7496d66ccdda2d8d0884aac3edb07","unresolved":true,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        memory_mb \u003d instance_flavor_data[\u0027memory_mb\u0027]"},{"line_number":89,"context_line":"        num_cores \u003d instance_flavor_data[\u0027vcpus\u0027]"},{"line_number":90,"context_line":"        disk_gb \u003d instance_flavor_data[\u0027root_gb\u0027]"},{"line_number":91,"context_line":"        # Boot-from-volume instances don\u0027t consume local compute disk."},{"line_number":92,"context_line":"        image_uuid \u003d instance_data.get(\u0027image_uuid\u0027)"},{"line_number":93,"context_line":"        if not image_uuid:"},{"line_number":94,"context_line":"            disk_gb \u003d 0"},{"line_number":95,"context_line":"        # Ephemeral and swap are always local, even for boot-from-volume."},{"line_number":96,"context_line":"        disk_gb +\u003d instance_flavor_data.get(\u0027ephemeral_gb\u0027, 0)"},{"line_number":97,"context_line":"        # swap is in MB; math.ceil(x / 1024) is ceiling division to GB to"}],"source_content_type":"text/x-python","patch_set":4,"id":"d2d6f28e_5182f3c9","line":94,"range":{"start_line":90,"start_character":8,"end_line":94,"end_character":23},"updated":"2026-04-28 20:55:06.000000000","message":"we probably should call this local_disk\n\n```suggestion\n        # Boot-from-volume instances don\u0027t consume local compute disk.\n        local_disk \u003d (\n            instance_flavor_data[\u0027root_gb\u0027] if\n            instance_data.get(\u0027image_uuid\u0027) else 0)\n```","commit_id":"02b41922fe516c62ff2a889f3dd49f8c90707271"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a059ffaa15f32842e749cdf598db4b63626127e0","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"        memory_mb \u003d instance_flavor_data[\u0027memory_mb\u0027]"},{"line_number":89,"context_line":"        num_cores \u003d instance_flavor_data[\u0027vcpus\u0027]"},{"line_number":90,"context_line":"        disk_gb \u003d instance_flavor_data[\u0027root_gb\u0027]"},{"line_number":91,"context_line":"        # Boot-from-volume instances don\u0027t consume local compute disk."},{"line_number":92,"context_line":"        image_uuid \u003d instance_data.get(\u0027image_uuid\u0027)"},{"line_number":93,"context_line":"        if not image_uuid:"},{"line_number":94,"context_line":"            disk_gb \u003d 0"},{"line_number":95,"context_line":"        # Ephemeral and swap are always local, even for boot-from-volume."},{"line_number":96,"context_line":"        disk_gb +\u003d instance_flavor_data.get(\u0027ephemeral_gb\u0027, 0)"},{"line_number":97,"context_line":"        # swap is in MB; math.ceil(x / 1024) is ceiling division to GB to"}],"source_content_type":"text/x-python","patch_set":4,"id":"f0d56ada_46d944c4","line":94,"range":{"start_line":90,"start_character":8,"end_line":94,"end_character":23},"in_reply_to":"d2d6f28e_5182f3c9","updated":"2026-04-29 08:10:30.000000000","message":"Done","commit_id":"02b41922fe516c62ff2a889f3dd49f8c90707271"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"8cf6eebd6100afe6436f4bb2bf6d674aa4fdef55","unresolved":true,"context_lines":[{"line_number":94,"context_line":"            else 0"},{"line_number":95,"context_line":"        )"},{"line_number":96,"context_line":"        # Ephemeral and swap are always local, even for boot-from-volume."},{"line_number":97,"context_line":"        disk_gb +\u003d instance_flavor_data.get(\u0027ephemeral_gb\u0027, 0)"},{"line_number":98,"context_line":"        # swap is in MB; math.ceil(x / 1024) is ceiling division to GB to"},{"line_number":99,"context_line":"        # always round up."},{"line_number":100,"context_line":"        disk_gb +\u003d math.ceil(instance_flavor_data.get(\u0027swap\u0027, 0) / 1024)"},{"line_number":101,"context_line":"        instance_metadata \u003d data[\u0027nova_object.data\u0027][\u0027metadata\u0027]"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        instance.update("}],"source_content_type":"text/x-python","patch_set":9,"id":"26cc8f75_6fbbe7dd","line":100,"range":{"start_line":97,"start_character":0,"end_line":100,"end_character":72},"updated":"2026-05-04 13:55:47.000000000","message":"swap was added in playload 1.1, which is a long time ago, i think that is fine to proceed without at payload version validation here.\n\nhttps://github.com/openstack/nova/commit/8d9b3d6b9daf9872ed90b044f296ef32aee610d2#diff-16716687108cb893e4000beb7e3673bbab85aaef6cd3bdc28d91d6e58eefde64","commit_id":"5461b3611d211286d856282a44ae727e88242259"}],"watcher/tests/unit/common/test_nova_helper.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"a059ffaa15f32842e749cdf598db4b63626127e0","unresolved":false,"context_lines":[{"line_number":1694,"context_line":"        self.assertIsNone(wrapped.image)"},{"line_number":1695,"context_line":"        self.assertTrue(wrapped.is_boot_from_volume)"},{"line_number":1696,"context_line":""},{"line_number":1697,"context_line":"    def test_server_boot_from_volume_empty_string_image(self):"},{"line_number":1698,"context_line":"        sdk_server \u003d self.create_openstacksdk_server(image\u003d\u0027\u0027)"},{"line_number":1699,"context_line":"        wrapped \u003d nova_helper.Server.from_openstacksdk(sdk_server)"},{"line_number":1700,"context_line":"        self.assertIsNone(wrapped.image)"}],"source_content_type":"text/x-python","patch_set":4,"id":"7c27f99a_c1d6dfa4","line":1697,"in_reply_to":"b8f1acc8_fbdfb055","updated":"2026-04-29 08:10:30.000000000","message":"That\u0027s also my understanding.","commit_id":"02b41922fe516c62ff2a889f3dd49f8c90707271"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"d973ffc389b7496d66ccdda2d8d0884aac3edb07","unresolved":true,"context_lines":[{"line_number":1694,"context_line":"        self.assertIsNone(wrapped.image)"},{"line_number":1695,"context_line":"        self.assertTrue(wrapped.is_boot_from_volume)"},{"line_number":1696,"context_line":""},{"line_number":1697,"context_line":"    def test_server_boot_from_volume_empty_string_image(self):"},{"line_number":1698,"context_line":"        sdk_server \u003d self.create_openstacksdk_server(image\u003d\u0027\u0027)"},{"line_number":1699,"context_line":"        wrapped \u003d nova_helper.Server.from_openstacksdk(sdk_server)"},{"line_number":1700,"context_line":"        self.assertIsNone(wrapped.image)"}],"source_content_type":"text/x-python","patch_set":4,"id":"b8f1acc8_fbdfb055","line":1697,"in_reply_to":"beebed35_901681ff","updated":"2026-04-28 20:55:06.000000000","message":"so i do not belive tha tit will be the empty sting for what its worht.\nso im not sur this shoudl be tested","commit_id":"02b41922fe516c62ff2a889f3dd49f8c90707271"}],"watcher/tests/unit/decision_engine/cluster/test_nova_cdmc.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1d8b11a9e680c9a9a7cb25fbdfc6611f406292e3","unresolved":false,"context_lines":[{"line_number":385,"context_line":"        self.assertEqual(2048, fake_instance.memory)"},{"line_number":386,"context_line":"        self.assertEqual(2, fake_instance.vcpus)"},{"line_number":387,"context_line":""},{"line_number":388,"context_line":"    def test_build_instance_node_boot_from_volume_with_ephemeral(self):"},{"line_number":389,"context_line":"        model_builder \u003d nova.NovaModelBuilder(osc\u003dmock.MagicMock())"},{"line_number":390,"context_line":"        model_builder.model \u003d mock.MagicMock()"},{"line_number":391,"context_line":"        model_builder.model.extended_attributes_enabled \u003d False"}],"source_content_type":"text/x-python","patch_set":9,"id":"a03f5b62_cf5e9ff9","line":388,"in_reply_to":"c6b021da_a60db76e","updated":"2026-05-06 17:08:56.000000000","message":"we could do this but its not strictly needed","commit_id":"5461b3611d211286d856282a44ae727e88242259"}],"watcher/tests/unit/decision_engine/model/notification/test_nova_notifications.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"9bd5feb211a2b88d9c688799d1d9cbc22807d6b1","unresolved":false,"context_lines":[{"line_number":276,"context_line":""},{"line_number":277,"context_line":"        self.assertEqual(element.InstanceState.PAUSED.value, instance0.state)"},{"line_number":278,"context_line":""},{"line_number":279,"context_line":"    def test_nova_instance_update_boot_from_volume(self):"},{"line_number":280,"context_line":"        compute_model \u003d self.fake_cdmc.generate_scenario_3_with_2_nodes()"},{"line_number":281,"context_line":"        self.fake_cdmc.cluster_data_model \u003d compute_model"},{"line_number":282,"context_line":"        handler \u003d novanotification.VersionedNotification(self.fake_cdmc)"}],"source_content_type":"text/x-python","patch_set":2,"id":"55ea6ee7_b0b4c052","line":279,"in_reply_to":"9aefa967_c90e05c3","updated":"2026-04-28 15:56:39.000000000","message":"Done","commit_id":"78d28052ad0817d3758306ef623b1d6fd709d839"}]}
