)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"33487f9aac0b6b061a4f06f8ce21869862331dd0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"13087a7e_5ce07b2a","updated":"2026-01-15 18:31:44.000000000","message":"recheck","commit_id":"a37caae375c625917c3052e5dc91d9ca14e5d7db"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"3059d36386ba517d6c0fe2f58e914f3c56bfe7b1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"23700905_78ed5671","updated":"2026-01-21 06:50:20.000000000","message":"check-rdo","commit_id":"68312660d19b79a07b209cb2d995f85d91dff376"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"4ab06d0f83776f250404b67cee88ab70ea8628e2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"1094f3f5_f3d42059","updated":"2026-01-20 11:02:54.000000000","message":"recheck","commit_id":"68312660d19b79a07b209cb2d995f85d91dff376"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"f5cc3db6076c429f61d6e3ae89ac05c3c458cc67","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"b612b0b1_2f2b2eb4","updated":"2026-01-30 16:27:58.000000000","message":"Great work!\n\nI still need to invest some more time but so far, my main comment is if we should take advantage of these patches to clarify which are expected to be public methods and which one internal ones in the nova_helper. So far, some methods which are only used by other methods in the class are returning novaclient objects. We probably may rename those as private in this or a follow up patch, wdyt?\n\nOther than that, just som minor comments.","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"2f87377751994ed21b312688a386f894c8c28d3e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":22,"id":"57366f9d_35289d35","updated":"2026-02-12 11:07:24.000000000","message":"I think that I still need to go through all files again. Added some comments inline. I think that in general we can change the helper interface here but we should also use this refactor to make them follow a pattern (like the return types)\nWe may want to propose changes to what Actions returns in a different patch, instead of this one too.","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"0cacc1447d7ba8e0a4d260419edebe2a4c546722","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"b789c954_74011bf2","updated":"2026-02-16 18:35:23.000000000","message":"I think that the only thing is a missing try/except only, other things are most nits. Thanks Joan","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"de7f28ad0968d32441840b18a657c813197a6379","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":24,"id":"ec077813_5ea8243d","updated":"2026-02-17 17:08:08.000000000","message":"Just some minor issues, but I\u0027d say this one is ready to go.","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"331f60715102921db05270a3e7c88044f76472ae","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":25,"id":"e18f2480_e248e2b2","updated":"2026-02-18 19:09:13.000000000","message":"Thanks for all the updates in this patch Joan.","commit_id":"bf6c7e2e27b8c48941652e63d8f65e23e6f6a146"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"da7dcb1d79964627733fe925fe9c2de1f4cc4db1","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":25,"id":"15945220_a292031b","updated":"2026-02-18 14:15:50.000000000","message":"i dont see anything that could not be impoved in a follow up and this makes the code so much nicer to read so big +2","commit_id":"bf6c7e2e27b8c48941652e63d8f65e23e6f6a146"}],"watcher/applier/actions/migration.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5ef722f42b471529be76a4b9477939508ddfd836","unresolved":false,"context_lines":[{"line_number":161,"context_line":"        nova \u003d nova_helper.NovaHelper(osc\u003dself.osc)"},{"line_number":162,"context_line":"        # check that instance exists before trying to migrate it, it does not"},{"line_number":163,"context_line":"        # exists, it will raise a InstanceNotFound exception"},{"line_number":164,"context_line":"        nova.find_instance(self.instance_uuid)"},{"line_number":165,"context_line":"        if destination is None:"},{"line_number":166,"context_line":"            LOG.debug(\"Migrating instance %s, destination node will be \""},{"line_number":167,"context_line":"                      \"determined by nova-scheduler\", self.instance_uuid)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3d877c3a_3dacaa47","line":164,"updated":"2026-02-09 18:28:10.000000000","message":"so the orginal intent of creating our own class for the nova resouces was to seperate our usage of the client form teh type that are returned and the excpetion that are raised.\n\nyou are converting the not found exeption here\n\nhttps://review.opendev.org/c/openstack/watcher/+/972913/11/watcher/common/nova_helper.py#439\n\nbut you not handelign any other exepction that might be rased.\n\nwe should perhaps consider a decorator that will convert and uncaught excptions form the client into a a generic helper client exception\n\nso without internally catchign an dconverting the novaclient InstanceNotFound excpetion into a watcher.novaclient.InstanceNotFound excption we woudl have not actully broken the depency.\n\nthis is not a problem currently but it woudl be easy to miss a method so we shoudl consider a more fool proof solution later","commit_id":"7e3a464536f2b5891a883017b3f1ca9374707800"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5ef722f42b471529be76a4b9477939508ddfd836","unresolved":true,"context_lines":[{"line_number":218,"context_line":"                _(\"Instance %s not found\") % self.instance_uuid)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        # Check that the instance is running on source_node"},{"line_number":221,"context_line":"        instance_host \u003d getattr(instance, \u0027OS-EXT-SRV-ATTR:host\u0027, None)"},{"line_number":222,"context_line":"        if instance_host !\u003d self.source_node:"},{"line_number":223,"context_line":"            raise exception.ActionSkipped("},{"line_number":224,"context_line":"                _(\"Instance %(instance)s is not running on source node \""}],"source_content_type":"text/x-python","patch_set":11,"id":"60c86114_5db8fa02","side":"PARENT","line":221,"updated":"2026-02-09 18:28:10.000000000","message":"i liek that this is cleaning up some of the exsitn usage of getattr as well.","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"a44632df7fe4c4cdafe9f0fbdd19bf09b40bf246","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                _(\"Instance %s not found\") % self.instance_uuid)"},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"        # Check that the instance is running on source_node"},{"line_number":221,"context_line":"        instance_host \u003d getattr(instance, \u0027OS-EXT-SRV-ATTR:host\u0027, None)"},{"line_number":222,"context_line":"        if instance_host !\u003d self.source_node:"},{"line_number":223,"context_line":"            raise exception.ActionSkipped("},{"line_number":224,"context_line":"                _(\"Instance %(instance)s is not running on source node \""}],"source_content_type":"text/x-python","patch_set":11,"id":"8f818030_923a239a","side":"PARENT","line":221,"in_reply_to":"60c86114_5db8fa02","updated":"2026-02-10 13:02:14.000000000","message":"Acknowledged","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"0cacc1447d7ba8e0a4d260419edebe2a4c546722","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        # check that instance exists before trying to migrate it, it does not"},{"line_number":163,"context_line":"        # exists, it will raise a InstanceNotFound exception"},{"line_number":164,"context_line":"        nova.find_instance(self.instance_uuid)"},{"line_number":165,"context_line":"        if destination is None:"},{"line_number":166,"context_line":"            LOG.debug(\"Migrating instance %s, destination node will be \""},{"line_number":167,"context_line":"                      \"determined by nova-scheduler\", self.instance_uuid)"},{"line_number":168,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"3f1d54d3_9a7a60bf","line":165,"in_reply_to":"525b73bf_b295f34a","updated":"2026-02-16 18:35:23.000000000","message":"Setting to resolved since we are not chanding anything here anymore.","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"06c9a9433350ce6f66af0e6c369c014683460bc2","unresolved":true,"context_lines":[{"line_number":162,"context_line":"        # check that instance exists before trying to migrate it, it does not"},{"line_number":163,"context_line":"        # exists, it will raise a InstanceNotFound exception"},{"line_number":164,"context_line":"        nova.find_instance(self.instance_uuid)"},{"line_number":165,"context_line":"        if destination is None:"},{"line_number":166,"context_line":"            LOG.debug(\"Migrating instance %s, destination node will be \""},{"line_number":167,"context_line":"                      \"determined by nova-scheduler\", self.instance_uuid)"},{"line_number":168,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"dee9ec88_6d905eed","line":165,"in_reply_to":"5f12ce84_01b6dc13","updated":"2026-02-11 18:40:27.000000000","message":"right so hwere you missed once case wehre you need to early return\n\n nova.find_instance(self.instance_uuid) nolonger rasise so you need to do\n \n``` \nif nova.find_instance(self.instance_uuid) is None:\n  return true\n```\n\ni dont know if we want to treat that as a successs or not but if thre is nothing to migrate that feels as good as anything else.\n\nby the way this is where typing woudl hlep this return a bool right?","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f725c5ac300a9a55d33eaadbb22519aa68ae39b8","unresolved":true,"context_lines":[{"line_number":162,"context_line":"        # check that instance exists before trying to migrate it, it does not"},{"line_number":163,"context_line":"        # exists, it will raise a InstanceNotFound exception"},{"line_number":164,"context_line":"        nova.find_instance(self.instance_uuid)"},{"line_number":165,"context_line":"        if destination is None:"},{"line_number":166,"context_line":"            LOG.debug(\"Migrating instance %s, destination node will be \""},{"line_number":167,"context_line":"                      \"determined by nova-scheduler\", self.instance_uuid)"},{"line_number":168,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"737c0b03_798ee899","line":165,"in_reply_to":"88f99018_8d99ccd6","updated":"2026-02-12 11:42:42.000000000","message":"we cant rely on the precondition because it may have existed at that point and then not exist when we call execute\n\nso we can make this set it to skipped also but as doug said in the future but for now False is probaly more correct\n\nbut i guess the meta comment for this seires is it ideally shoudl not change any behvior just be a plain refactor so the code shoudl be have as it did before where it would not have succeeded because the code woudl have raised an uncaught excption","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"2f87377751994ed21b312688a386f894c8c28d3e","unresolved":true,"context_lines":[{"line_number":162,"context_line":"        # check that instance exists before trying to migrate it, it does not"},{"line_number":163,"context_line":"        # exists, it will raise a InstanceNotFound exception"},{"line_number":164,"context_line":"        nova.find_instance(self.instance_uuid)"},{"line_number":165,"context_line":"        if destination is None:"},{"line_number":166,"context_line":"            LOG.debug(\"Migrating instance %s, destination node will be \""},{"line_number":167,"context_line":"                      \"determined by nova-scheduler\", self.instance_uuid)"},{"line_number":168,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"88f99018_8d99ccd6","line":165,"in_reply_to":"dee9ec88_6d905eed","updated":"2026-02-12 11:07:24.000000000","message":"I don\u0027t think that we should change the behavior in this series of patches.\n\u0027True\u0027 here means that the instance was migrated to the destination host. Maybe we should change this in a different patch? and discuss more?\nWe already treat in pre_condition that a InstanceNotFound exception should move the action to SKIPPED, but we don\u0027t have support for that in execute(). I more in favor or returning False.\nLets see what folks think about that.","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"2288eb2d03aae8d171cff9124cace527f35649e2","unresolved":true,"context_lines":[{"line_number":162,"context_line":"        # check that instance exists before trying to migrate it, it does not"},{"line_number":163,"context_line":"        # exists, it will raise a InstanceNotFound exception"},{"line_number":164,"context_line":"        nova.find_instance(self.instance_uuid)"},{"line_number":165,"context_line":"        if destination is None:"},{"line_number":166,"context_line":"            LOG.debug(\"Migrating instance %s, destination node will be \""},{"line_number":167,"context_line":"                      \"determined by nova-scheduler\", self.instance_uuid)"},{"line_number":168,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"c26980bd_ba8abe33","line":165,"in_reply_to":"dee9ec88_6d905eed","updated":"2026-02-12 10:58:54.000000000","message":"If the instance does not exist, the pre_condition must set the action as SKIPPED and not execute it so I would make it fail in execute. There is still the case where a instance is deleted right between the check in pre_condition and execute but imo that\u0027s rare enough to let it fail.","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ce5e8d636f5355e7d2a7f93692f5295007b5bf66","unresolved":true,"context_lines":[{"line_number":162,"context_line":"        # check that instance exists before trying to migrate it, it does not"},{"line_number":163,"context_line":"        # exists, it will raise a InstanceNotFound exception"},{"line_number":164,"context_line":"        nova.find_instance(self.instance_uuid)"},{"line_number":165,"context_line":"        if destination is None:"},{"line_number":166,"context_line":"            LOG.debug(\"Migrating instance %s, destination node will be \""},{"line_number":167,"context_line":"                      \"determined by nova-scheduler\", self.instance_uuid)"},{"line_number":168,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":21,"id":"525b73bf_b295f34a","line":165,"in_reply_to":"dee9ec88_6d905eed","updated":"2026-02-12 16:46:11.000000000","message":"yes, I missed this one thanks, I think the best would probably to go back to raising an exception, since it was the pre-existing behaviour.\n\nOn the typing issue, yes this should return a bool, as it returns the result from the nova_helper `watcher_non_live_migrate_instance` or `live_migrate_instance` which is a bool. I\u0027ve considered adding type hints at some point, but the main reason I\u0027ve not done so is because this patches are already quite big","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"}],"watcher/applier/actions/resize.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"06c9a9433350ce6f66af0e6c369c014683460bc2","unresolved":false,"context_lines":[{"line_number":77,"context_line":"        nova \u003d nova_helper.NovaHelper(osc\u003dself.osc)"},{"line_number":78,"context_line":"        LOG.debug(\"Resize instance %s to %s flavor\", self.instance_uuid,"},{"line_number":79,"context_line":"                  self.flavor)"},{"line_number":80,"context_line":"        result \u003d None"},{"line_number":81,"context_line":"        try:"},{"line_number":82,"context_line":"            result \u003d nova.resize_instance("},{"line_number":83,"context_line":"                instance_id\u003dself.instance_uuid, flavor\u003dself.flavor)"}],"source_content_type":"text/x-python","patch_set":21,"id":"f5d64195_153f089a","line":80,"range":{"start_line":80,"start_character":17,"end_line":80,"end_character":21},"updated":"2026-02-11 18:40:27.000000000","message":"nit: i guess we passed None before but False might have been better again typing woudl be nice here eventuslly","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"06c9a9433350ce6f66af0e6c369c014683460bc2","unresolved":true,"context_lines":[{"line_number":85,"context_line":"            LOG.exception(exc)"},{"line_number":86,"context_line":"            LOG.critical("},{"line_number":87,"context_line":"                \"Unexpected error occurred. Resizing failed for \""},{"line_number":88,"context_line":"                \"instance %s.\", self.instance_uuid)"},{"line_number":89,"context_line":"        return result"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def execute(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"35bc365f_aa7dfb34","line":88,"updated":"2026-02-11 18:40:27.000000000","message":"so the net change here is instead of checkign if the instnace exist which woudl raise we are just trying the migrate and leting that raise can catching it\n\nso the resullt will now by a resturn of None instead of an excption if the instnace that we were tryign to migrate was deleted.\n\nthat probaly ok but calling out that this is not a direct refactor\nyour also changing behvior.\n\nas lon as the migrate action is still marked as failed this shoudl not be user visable otherwise we changed a failed action to a success.\n\nit woudl be ok to erport this as a skipped explcity but not success in my opipion","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ce5e8d636f5355e7d2a7f93692f5295007b5bf66","unresolved":true,"context_lines":[{"line_number":85,"context_line":"            LOG.exception(exc)"},{"line_number":86,"context_line":"            LOG.critical("},{"line_number":87,"context_line":"                \"Unexpected error occurred. Resizing failed for \""},{"line_number":88,"context_line":"                \"instance %s.\", self.instance_uuid)"},{"line_number":89,"context_line":"        return result"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def execute(self):"}],"source_content_type":"text/x-python","patch_set":21,"id":"1b256862_2e348875","line":88,"in_reply_to":"35bc365f_aa7dfb34","updated":"2026-02-12 16:46:11.000000000","message":"yes, this is also a change I missed after the change to find_instance. With the last version, we can revert this action change, the original code should work fine","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"2f87377751994ed21b312688a386f894c8c28d3e","unresolved":true,"context_lines":[{"line_number":94,"context_line":"    def revert(self):"},{"line_number":95,"context_line":"        LOG.warning(\"revert not supported\")"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def pre_condition(self):"},{"line_number":98,"context_line":"        # TODO(jed): check if the instance exists / check if the instance is on"},{"line_number":99,"context_line":"        # the source_node"},{"line_number":100,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":22,"id":"fd8d9e10_af2afb9a","line":97,"range":{"start_line":97,"start_character":8,"end_line":97,"end_character":21},"updated":"2026-02-12 11:07:24.000000000","message":"not sure why we don\u0027t skip the action here, when instance doesn not exist. Is there a pending review?","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"5c71d4a8ea44239133fb6ba42f90fbb0785b4876","unresolved":true,"context_lines":[{"line_number":94,"context_line":"    def revert(self):"},{"line_number":95,"context_line":"        LOG.warning(\"revert not supported\")"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def pre_condition(self):"},{"line_number":98,"context_line":"        # TODO(jed): check if the instance exists / check if the instance is on"},{"line_number":99,"context_line":"        # the source_node"},{"line_number":100,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":22,"id":"f7f62532_59b4bc1d","line":97,"range":{"start_line":97,"start_character":8,"end_line":97,"end_character":21},"in_reply_to":"e6e2d648_1969dbfe","updated":"2026-02-17 16:26:29.000000000","message":"No, it\u0027s in my todo list. I was expecting to send the patch for resize after openstacksdk adoption","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"9c66f2a1cdeae39d3998b0b9acd876466fe96dcd","unresolved":true,"context_lines":[{"line_number":94,"context_line":"    def revert(self):"},{"line_number":95,"context_line":"        LOG.warning(\"revert not supported\")"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def pre_condition(self):"},{"line_number":98,"context_line":"        # TODO(jed): check if the instance exists / check if the instance is on"},{"line_number":99,"context_line":"        # the source_node"},{"line_number":100,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":22,"id":"93c1453b_a2633d65","line":97,"range":{"start_line":97,"start_character":8,"end_line":97,"end_character":21},"in_reply_to":"f7f62532_59b4bc1d","updated":"2026-02-17 16:31:52.000000000","message":"I can easily send a patch based on novaclient approach if you want to merge it and rebase on top","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ce5e8d636f5355e7d2a7f93692f5295007b5bf66","unresolved":true,"context_lines":[{"line_number":94,"context_line":"    def revert(self):"},{"line_number":95,"context_line":"        LOG.warning(\"revert not supported\")"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    def pre_condition(self):"},{"line_number":98,"context_line":"        # TODO(jed): check if the instance exists / check if the instance is on"},{"line_number":99,"context_line":"        # the source_node"},{"line_number":100,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":22,"id":"e6e2d648_1969dbfe","line":97,"range":{"start_line":97,"start_character":8,"end_line":97,"end_character":21},"in_reply_to":"fd8d9e10_af2afb9a","updated":"2026-02-12 16:46:11.000000000","message":"I could not see any open patch for it, @amoralej@redhat.com is there any?","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"}],"watcher/applier/actions/stop.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"06c9a9433350ce6f66af0e6c369c014683460bc2","unresolved":true,"context_lines":[{"line_number":85,"context_line":"        else:"},{"line_number":86,"context_line":"            # Check if failure was due to instance not found (idempotent)"},{"line_number":87,"context_line":"            try:"},{"line_number":88,"context_line":"                nova.find_instance(self.instance_uuid)"},{"line_number":89,"context_line":"            except exception.InstanceNotFound:"},{"line_number":90,"context_line":"                LOG.info("},{"line_number":91,"context_line":"                    \"Instance %(uuid)s not found, \""}],"source_content_type":"text/x-python","patch_set":21,"id":"7831cd22_369c3c31","line":88,"updated":"2026-02-11 18:40:27.000000000","message":"this nolonger raises right os this try excpte is wrong.","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ce5e8d636f5355e7d2a7f93692f5295007b5bf66","unresolved":true,"context_lines":[{"line_number":85,"context_line":"        else:"},{"line_number":86,"context_line":"            # Check if failure was due to instance not found (idempotent)"},{"line_number":87,"context_line":"            try:"},{"line_number":88,"context_line":"                nova.find_instance(self.instance_uuid)"},{"line_number":89,"context_line":"            except exception.InstanceNotFound:"},{"line_number":90,"context_line":"                LOG.info("},{"line_number":91,"context_line":"                    \"Instance %(uuid)s not found, \""}],"source_content_type":"text/x-python","patch_set":21,"id":"ce493414_28f68af2","line":88,"in_reply_to":"7831cd22_369c3c31","updated":"2026-02-12 16:46:11.000000000","message":"right, this was removed in patchset 22","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"2288eb2d03aae8d171cff9124cace527f35649e2","unresolved":true,"context_lines":[{"line_number":85,"context_line":"        else:"},{"line_number":86,"context_line":"            # Check if failure was due to instance not found (idempotent)"},{"line_number":87,"context_line":"            try:"},{"line_number":88,"context_line":"                nova.find_instance(self.instance_uuid)"},{"line_number":89,"context_line":"            except exception.InstanceNotFound:"},{"line_number":90,"context_line":"                LOG.info("},{"line_number":91,"context_line":"                    \"Instance %(uuid)s not found, \""}],"source_content_type":"text/x-python","patch_set":21,"id":"62584cfa_f2364328","line":88,"in_reply_to":"7831cd22_369c3c31","updated":"2026-02-12 10:58:54.000000000","message":"yeah, we need to decide what to do with nova.find_instance on notfound, return None or raise a specific instance. I\u0027m inclined by exception although both can work, but need to be consistent.","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":false,"context_lines":[{"line_number":85,"context_line":"        else:"},{"line_number":86,"context_line":"            # Check if failure was due to instance not found (idempotent)"},{"line_number":87,"context_line":"            try:"},{"line_number":88,"context_line":"                nova.find_instance(self.instance_uuid)"},{"line_number":89,"context_line":"            except exception.InstanceNotFound:"},{"line_number":90,"context_line":"                LOG.info("},{"line_number":91,"context_line":"                    \"Instance %(uuid)s not found, \""}],"source_content_type":"text/x-python","patch_set":21,"id":"96d0fd6b_9ffe9b8f","line":88,"in_reply_to":"ce493414_28f68af2","updated":"2026-02-17 19:48:35.000000000","message":"Done","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"2288eb2d03aae8d171cff9124cace527f35649e2","unresolved":true,"context_lines":[{"line_number":152,"context_line":"        # Check that the instance exists"},{"line_number":153,"context_line":"        try:"},{"line_number":154,"context_line":"            instance \u003d nova.find_instance(self.instance_uuid)"},{"line_number":155,"context_line":"        except exception.InstanceNotFound:"},{"line_number":156,"context_line":"            raise exception.ActionSkipped("},{"line_number":157,"context_line":"                _(\"Instance %s not found\") % self.instance_uuid)"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"86af5d02_1f7eb4db","line":155,"range":{"start_line":155,"start_character":0,"end_line":155,"end_character":2},"updated":"2026-02-12 10:58:54.000000000","message":"ditto about exception or none","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        # Check that the instance exists"},{"line_number":153,"context_line":"        try:"},{"line_number":154,"context_line":"            instance \u003d nova.find_instance(self.instance_uuid)"},{"line_number":155,"context_line":"        except exception.InstanceNotFound:"},{"line_number":156,"context_line":"            raise exception.ActionSkipped("},{"line_number":157,"context_line":"                _(\"Instance %s not found\") % self.instance_uuid)"},{"line_number":158,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"d4da6ddb_fc2b5916","line":155,"range":{"start_line":155,"start_character":0,"end_line":155,"end_character":2},"in_reply_to":"86af5d02_1f7eb4db","updated":"2026-02-17 19:48:35.000000000","message":"Done","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"}],"watcher/common/nova_helper.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5ef722f42b471529be76a4b9477939508ddfd836","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        :param nova_server: novaclient servers.Server object"},{"line_number":87,"context_line":"        :returns: Server dataclass instance"},{"line_number":88,"context_line":"        \"\"\""},{"line_number":89,"context_line":"        server_dict \u003d nova_server.to_dict()"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        return cls("},{"line_number":92,"context_line":"            id\u003dnova_server.id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"a4f73ffd_291d10c8","line":89,"in_reply_to":"366f51b2_6efaf66a","updated":"2026-02-09 18:28:10.000000000","message":"\u003e Missing error handling in from_novaclient methods for incomplete novaclient objects\n\u003e \n\u003e **Severity**: SUGGESTION | **Confidence**: 0.7\n\u003e \n\u003e **Benefit**: Would improve robustness when novaclient objects are missing expected attributes\n\u003e \n\u003e **Recommendation**:\n\u003e Consider adding try/except blocks around attribute access in from_novaclient methods to handle cases where novaclient objects don\u0027t have expected attributes, with sensible defaults\n\n\nthis we can ignore.\n\nwe will alwsy have compelte obejct for any given microverson at least.","commit_id":"dcf06dcd3518af19d791539e68b4a8568b15645f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5ef722f42b471529be76a4b9477939508ddfd836","unresolved":true,"context_lines":[{"line_number":403,"context_line":""},{"line_number":404,"context_line":"    @nova_retries"},{"line_number":405,"context_line":"    def get_instance_by_uuid(self, instance_uuid):"},{"line_number":406,"context_line":"        return [Server.from_novaclient(instance) for instance in"},{"line_number":407,"context_line":"                self.nova.servers.list(search_opts\u003d{\"all_tenants\": True,"},{"line_number":408,"context_line":"                                                    \"uuid\": instance_uuid})]"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    @nova_retries"},{"line_number":411,"context_line":"    def get_flavor_list(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"34db27de_42ad0bf6","line":408,"range":{"start_line":406,"start_character":1,"end_line":408,"end_character":76},"updated":"2026-02-09 18:28:10.000000000","message":"this is generatly the limit of the complexity fo a list comprehetnion that i think is good i.e. no more then 3-5 lines\n\nif we need more then that we shudl break it up.","commit_id":"dcf06dcd3518af19d791539e68b4a8568b15645f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"340d961ddf4ff6c089044b598a80bc4391551082","unresolved":false,"context_lines":[{"line_number":403,"context_line":""},{"line_number":404,"context_line":"    @nova_retries"},{"line_number":405,"context_line":"    def get_instance_by_uuid(self, instance_uuid):"},{"line_number":406,"context_line":"        return [Server.from_novaclient(instance) for instance in"},{"line_number":407,"context_line":"                self.nova.servers.list(search_opts\u003d{\"all_tenants\": True,"},{"line_number":408,"context_line":"                                                    \"uuid\": instance_uuid})]"},{"line_number":409,"context_line":""},{"line_number":410,"context_line":"    @nova_retries"},{"line_number":411,"context_line":"    def get_flavor_list(self):"}],"source_content_type":"text/x-python","patch_set":11,"id":"59df9b2b_dab80132","line":408,"range":{"start_line":406,"start_character":1,"end_line":408,"end_character":76},"in_reply_to":"34db27de_42ad0bf6","updated":"2026-02-11 18:22:05.000000000","message":"Acknowledged","commit_id":"dcf06dcd3518af19d791539e68b4a8568b15645f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5ef722f42b471529be76a4b9477939508ddfd836","unresolved":false,"context_lines":[{"line_number":327,"context_line":"    def get_compute_node_list(self):"},{"line_number":328,"context_line":"        hypervisors \u003d self.nova.hypervisors.list()"},{"line_number":329,"context_line":"        # filter out baremetal nodes from hypervisors"},{"line_number":330,"context_line":"        compute_nodes \u003d [Hypervisor.from_novaclient(node) for node in"},{"line_number":331,"context_line":"                         hypervisors if node.hypervisor_type !\u003d \u0027ironic\u0027]"},{"line_number":332,"context_line":"        return compute_nodes"},{"line_number":333,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9a34cfce_37ba0bdf","line":330,"in_reply_to":"d5712ed6_e02e2f41","updated":"2026-02-09 18:28:10.000000000","message":"we do not want to change the return type form a list ot a generator so this si acceptable overhead.\n\nwe do not need to assing compute noed however so this could be \n\n```suggestion\n       return [Hypervisor.from_novaclient(node) ...]\n```","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5ef722f42b471529be76a4b9477939508ddfd836","unresolved":true,"context_lines":[{"line_number":342,"context_line":"        :param detailed: If true, include information about the compute service"},{"line_number":343,"context_line":"            per hypervisor (requires microversion 2.53)"},{"line_number":344,"context_line":"        \"\"\""},{"line_number":345,"context_line":"        hypervisors \u003d self.nova.hypervisors.search("},{"line_number":346,"context_line":"            node_name, servers\u003dservers, detailed\u003ddetailed)"},{"line_number":347,"context_line":"        return [Hypervisor.from_novaclient(h) for h in hypervisors]"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    def get_compute_node_by_hostname(self, node_hostname):"},{"line_number":350,"context_line":"        \"\"\"Get compute node by hostname"}],"source_content_type":"text/x-python","patch_set":14,"id":"9736f5a5_9185fba3","line":347,"range":{"start_line":345,"start_character":0,"end_line":347,"end_character":67},"updated":"2026-02-09 18:28:10.000000000","message":"nit: this could also be \n\n```suggestion\n        return [\n            Hypervisor.from_novaclient(h) for h in\n            self.nova.hypervisors.search(\n                node_name, servers\u003dservers, detailed\u003ddetailed]\n```\n\nas an aside  im conflcited if i prefer a list comprehention a until funciton or usign itertools and map\n\nthis is the same as\n```\nreturn list(map(Hypervisor.from_novaclient, hypervisors)\n```\n\nwe coudl also defien a helper Hypervisor.from_iter() that woudl do the same\n\ni think while the complexity of the list comprehension is small im ok with this approach","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"a44632df7fe4c4cdafe9f0fbdd19bf09b40bf246","unresolved":true,"context_lines":[{"line_number":342,"context_line":"        :param detailed: If true, include information about the compute service"},{"line_number":343,"context_line":"            per hypervisor (requires microversion 2.53)"},{"line_number":344,"context_line":"        \"\"\""},{"line_number":345,"context_line":"        hypervisors \u003d self.nova.hypervisors.search("},{"line_number":346,"context_line":"            node_name, servers\u003dservers, detailed\u003ddetailed)"},{"line_number":347,"context_line":"        return [Hypervisor.from_novaclient(h) for h in hypervisors]"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    def get_compute_node_by_hostname(self, node_hostname):"},{"line_number":350,"context_line":"        \"\"\"Get compute node by hostname"}],"source_content_type":"text/x-python","patch_set":14,"id":"fbd0dd15_bbf4c3c6","line":347,"range":{"start_line":345,"start_character":0,"end_line":347,"end_character":67},"in_reply_to":"9736f5a5_9185fba3","updated":"2026-02-10 13:02:14.000000000","message":"I used a list comprehension since that is the more \"pythonic\" way, and more common I think that map, however I could adopt any of the other two options presented, I don\u0027t feel strongly against any of them","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"340d961ddf4ff6c089044b598a80bc4391551082","unresolved":false,"context_lines":[{"line_number":342,"context_line":"        :param detailed: If true, include information about the compute service"},{"line_number":343,"context_line":"            per hypervisor (requires microversion 2.53)"},{"line_number":344,"context_line":"        \"\"\""},{"line_number":345,"context_line":"        hypervisors \u003d self.nova.hypervisors.search("},{"line_number":346,"context_line":"            node_name, servers\u003dservers, detailed\u003ddetailed)"},{"line_number":347,"context_line":"        return [Hypervisor.from_novaclient(h) for h in hypervisors]"},{"line_number":348,"context_line":""},{"line_number":349,"context_line":"    def get_compute_node_by_hostname(self, node_hostname):"},{"line_number":350,"context_line":"        \"\"\"Get compute node by hostname"}],"source_content_type":"text/x-python","patch_set":14,"id":"30469fd5_3fef9bd8","line":347,"range":{"start_line":345,"start_character":0,"end_line":347,"end_character":67},"in_reply_to":"fbd0dd15_bbf4c3c6","updated":"2026-02-11 18:22:05.000000000","message":"stick with the list comprehetion but at some point the complexiy can mean its better to revert to a basic for loop or other constucts just pointing out that there is a treshold hwere they can be too dense to reaily read\n\nthere were map or its filter cousins can come in.\n\nor just a plain old for loop","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"f5cc3db6076c429f61d6e3ae89ac05c3c458cc67","unresolved":true,"context_lines":[{"line_number":412,"context_line":"        flavors \u003d self.nova.flavors.list(**{\u0027is_public\u0027: None})"},{"line_number":413,"context_line":"        return [Flavor.from_novaclient(f) for f in flavors]"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    @nova_retries"},{"line_number":416,"context_line":"    def get_flavor(self, flavor):"},{"line_number":417,"context_line":"        return self.nova.flavors.get(flavor)"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"    @nova_retries"},{"line_number":420,"context_line":"    def get_aggregate_list(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"086dd501_c5f1609e","line":417,"range":{"start_line":415,"start_character":0,"end_line":417,"end_character":44},"updated":"2026-01-30 16:27:58.000000000","message":"This should return a Flavor object?","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"63e24cfa4683362be80551c2d8269ee1273fdc66","unresolved":false,"context_lines":[{"line_number":412,"context_line":"        flavors \u003d self.nova.flavors.list(**{\u0027is_public\u0027: None})"},{"line_number":413,"context_line":"        return [Flavor.from_novaclient(f) for f in flavors]"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"    @nova_retries"},{"line_number":416,"context_line":"    def get_flavor(self, flavor):"},{"line_number":417,"context_line":"        return self.nova.flavors.get(flavor)"},{"line_number":418,"context_line":""},{"line_number":419,"context_line":"    @nova_retries"},{"line_number":420,"context_line":"    def get_aggregate_list(self):"}],"source_content_type":"text/x-python","patch_set":14,"id":"1470b176_9e10471d","line":417,"range":{"start_line":415,"start_character":0,"end_line":417,"end_character":44},"in_reply_to":"086dd501_c5f1609e","updated":"2026-02-02 14:50:16.000000000","message":"that\u0027s right, I think I missed it because it\u0027s currently only used internally in the `resize_instance` method, I\u0027ve changed it to return a Flavor object","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5ef722f42b471529be76a4b9477939508ddfd836","unresolved":true,"context_lines":[{"line_number":437,"context_line":"            instance \u003d self.nova.servers.get(instance_id)"},{"line_number":438,"context_line":"            return Server.from_novaclient(instance)"},{"line_number":439,"context_line":"        except nvexceptions.NotFound:"},{"line_number":440,"context_line":"            raise exception.InstanceNotFound(name\u003dinstance_id)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    @nova_retries"},{"line_number":443,"context_line":"    def nova_start_instance(self, instance_id):"}],"source_content_type":"text/x-python","patch_set":14,"id":"c226dd49_9721f2dd","line":440,"updated":"2026-02-09 18:28:10.000000000","message":"this sould protially return None if not found baed on the prior usage.\nsince otherwise you will need a lot more try caches as the old code was checkign if we got a value i think.","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"340d961ddf4ff6c089044b598a80bc4391551082","unresolved":false,"context_lines":[{"line_number":437,"context_line":"            instance \u003d self.nova.servers.get(instance_id)"},{"line_number":438,"context_line":"            return Server.from_novaclient(instance)"},{"line_number":439,"context_line":"        except nvexceptions.NotFound:"},{"line_number":440,"context_line":"            raise exception.InstanceNotFound(name\u003dinstance_id)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    @nova_retries"},{"line_number":443,"context_line":"    def nova_start_instance(self, instance_id):"}],"source_content_type":"text/x-python","patch_set":14,"id":"61c2ec86_966e25f1","line":440,"in_reply_to":"03587fff_ba8ca18c","updated":"2026-02-11 18:22:05.000000000","message":"rightr what im really pointing out is you need to be consitent\n\neither we cant and raise the watcehr instance not found excption\nor we need to return None but yuou need to then fix the behvior in that case.","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"a44632df7fe4c4cdafe9f0fbdd19bf09b40bf246","unresolved":true,"context_lines":[{"line_number":437,"context_line":"            instance \u003d self.nova.servers.get(instance_id)"},{"line_number":438,"context_line":"            return Server.from_novaclient(instance)"},{"line_number":439,"context_line":"        except nvexceptions.NotFound:"},{"line_number":440,"context_line":"            raise exception.InstanceNotFound(name\u003dinstance_id)"},{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    @nova_retries"},{"line_number":443,"context_line":"    def nova_start_instance(self, instance_id):"}],"source_content_type":"text/x-python","patch_set":14,"id":"03587fff_ba8ca18c","line":440,"in_reply_to":"c226dd49_9721f2dd","updated":"2026-02-10 13:02:14.000000000","message":"the thing is that I don\u0027t think the assumed prior usage is correct. In my devstack dev environment I did a quick test calling novaclient\u0027s `servers.get` with the uuid of a vm that does not exist and that does not return None, it raises a `novaclient.exceptions.NotFound` instead:\n\n```\n(Pdb) instance2 \u003d nova().servers.get(\u0027not-existing-vm\u0027)\n*** novaclient.exceptions.NotFound: Instance not-existing-vm could not be found. (HTTP 404) (Request-ID: req-97d18535-223a-4e30-9650-8dc12158b357)\n(Pdb) instance2\n*** NameError: name \u0027instance2\u0027 is not defined\n```\n\nmaybe a better option would be to catch the exception, log it and return None to avoid adding further try/catch blocks","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"f5cc3db6076c429f61d6e3ae89ac05c3c458cc67","unresolved":true,"context_lines":[{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    @nova_retries"},{"line_number":443,"context_line":"    def nova_start_instance(self, instance_id):"},{"line_number":444,"context_line":"        return self.nova.servers.start(instance_id)"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    @nova_retries"},{"line_number":447,"context_line":"    def nova_stop_instance(self, instance_id):"}],"source_content_type":"text/x-python","patch_set":14,"id":"8c500c9a_8825c792","line":444,"updated":"2026-01-30 16:27:58.000000000","message":"This returns an object of type `novaclient.base.TupleWithMeta` with content similar to (\u003cResponse [202]\u003e, None). \n\nhttps://github.com/openstack/python-novaclient/blob/master/novaclient/base.py#L540\n\nI think this is not a problem because this method is only used inside nova_helper, and any attempt to star an instance is done via the start_instance method. It\u0027d be nice if we would better define what are private and public interfaces and avoid returning external objects in public.\n\nThe same applies to all the actions methods below, resize, confirm_resize etc...","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"63e24cfa4683362be80551c2d8269ee1273fdc66","unresolved":true,"context_lines":[{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    @nova_retries"},{"line_number":443,"context_line":"    def nova_start_instance(self, instance_id):"},{"line_number":444,"context_line":"        return self.nova.servers.start(instance_id)"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    @nova_retries"},{"line_number":447,"context_line":"    def nova_stop_instance(self, instance_id):"}],"source_content_type":"text/x-python","patch_set":14,"id":"a071f734_85073177","line":444,"in_reply_to":"8c500c9a_8825c792","updated":"2026-02-02 14:50:16.000000000","message":"that\u0027s a good point, I\u0027ve changed those methods to start with an underscore to clearly mark that they aren\u0027t intended to be public. The return object is not used for any of them, so I don\u0027t think it\u0027s worth it to create a wrapper for them","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ce5e8d636f5355e7d2a7f93692f5295007b5bf66","unresolved":false,"context_lines":[{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    @nova_retries"},{"line_number":443,"context_line":"    def nova_start_instance(self, instance_id):"},{"line_number":444,"context_line":"        return self.nova.servers.start(instance_id)"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    @nova_retries"},{"line_number":447,"context_line":"    def nova_stop_instance(self, instance_id):"}],"source_content_type":"text/x-python","patch_set":14,"id":"8d63c1f1_ed6cc237","line":444,"in_reply_to":"9f8cb03b_8bde957f","updated":"2026-02-12 16:46:11.000000000","message":"Acknowledged","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ab48317e29fa264753ab8d7414b6a136bfb3617f","unresolved":true,"context_lines":[{"line_number":441,"context_line":""},{"line_number":442,"context_line":"    @nova_retries"},{"line_number":443,"context_line":"    def nova_start_instance(self, instance_id):"},{"line_number":444,"context_line":"        return self.nova.servers.start(instance_id)"},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"    @nova_retries"},{"line_number":447,"context_line":"    def nova_stop_instance(self, instance_id):"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f8cb03b_8bde957f","line":444,"in_reply_to":"a071f734_85073177","updated":"2026-02-04 09:32:46.000000000","message":"it works for me as soon as those are only used inside the NovaHelper and i think there never was a properly documented public api in the NovaHelper to be used out of the repo.","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5ef722f42b471529be76a4b9477939508ddfd836","unresolved":true,"context_lines":[{"line_number":533,"context_line":"        retry \u003d retry or CONF.nova.migration_max_retries"},{"line_number":534,"context_line":"        interval \u003d interval or CONF.nova.migration_interval"},{"line_number":535,"context_line":"        # Looking for the instance to migrate"},{"line_number":536,"context_line":"        try:"},{"line_number":537,"context_line":"            instance \u003d self.find_instance(instance_id)"},{"line_number":538,"context_line":"        except exception.InstanceNotFound:"},{"line_number":539,"context_line":"            LOG.debug(\"Instance %s not found !\", instance_id)"},{"line_number":540,"context_line":"            return False"},{"line_number":541,"context_line":"        host_name \u003d instance.host"},{"line_number":542,"context_line":"        LOG.debug("},{"line_number":543,"context_line":"            {\u0027instance\u0027: instance_id, \u0027host\u0027: host_name})"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"        previous_status \u003d instance.status"},{"line_number":546,"context_line":"        self.instance_migrate(instance_id, dest_hostname)"},{"line_number":547,"context_line":"        instance \u003d self.find_instance(instance_id)"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        while (instance.status not in"},{"line_number":550,"context_line":"                [\"VERIFY_RESIZE\", \"ERROR\"] and retry):"},{"line_number":551,"context_line":"            instance \u003d self.find_instance(instance_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"d3dddc03_884e7376","line":548,"range":{"start_line":536,"start_character":4,"end_line":548,"end_character":1},"updated":"2026-02-09 18:28:10.000000000","message":"here is a simple example of wehre in some case you are assueming find wil raise and in other you are assumign it return None if not found.\n\nwe need to chosoe one behviaor and stick with it\n\nprevioulsy id did nto raise when not found looking at the prior usage of the fucntion.","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":false,"context_lines":[{"line_number":533,"context_line":"        retry \u003d retry or CONF.nova.migration_max_retries"},{"line_number":534,"context_line":"        interval \u003d interval or CONF.nova.migration_interval"},{"line_number":535,"context_line":"        # Looking for the instance to migrate"},{"line_number":536,"context_line":"        try:"},{"line_number":537,"context_line":"            instance \u003d self.find_instance(instance_id)"},{"line_number":538,"context_line":"        except exception.InstanceNotFound:"},{"line_number":539,"context_line":"            LOG.debug(\"Instance %s not found !\", instance_id)"},{"line_number":540,"context_line":"            return False"},{"line_number":541,"context_line":"        host_name \u003d instance.host"},{"line_number":542,"context_line":"        LOG.debug("},{"line_number":543,"context_line":"            {\u0027instance\u0027: instance_id, \u0027host\u0027: host_name})"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"        previous_status \u003d instance.status"},{"line_number":546,"context_line":"        self.instance_migrate(instance_id, dest_hostname)"},{"line_number":547,"context_line":"        instance \u003d self.find_instance(instance_id)"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        while (instance.status not in"},{"line_number":550,"context_line":"                [\"VERIFY_RESIZE\", \"ERROR\"] and retry):"},{"line_number":551,"context_line":"            instance \u003d self.find_instance(instance_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"d89cc554_c07449b0","line":548,"range":{"start_line":536,"start_character":4,"end_line":548,"end_character":1},"in_reply_to":"51bab6e6_65c9179d","updated":"2026-02-17 19:48:35.000000000","message":"Done","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"2288eb2d03aae8d171cff9124cace527f35649e2","unresolved":true,"context_lines":[{"line_number":533,"context_line":"        retry \u003d retry or CONF.nova.migration_max_retries"},{"line_number":534,"context_line":"        interval \u003d interval or CONF.nova.migration_interval"},{"line_number":535,"context_line":"        # Looking for the instance to migrate"},{"line_number":536,"context_line":"        try:"},{"line_number":537,"context_line":"            instance \u003d self.find_instance(instance_id)"},{"line_number":538,"context_line":"        except exception.InstanceNotFound:"},{"line_number":539,"context_line":"            LOG.debug(\"Instance %s not found !\", instance_id)"},{"line_number":540,"context_line":"            return False"},{"line_number":541,"context_line":"        host_name \u003d instance.host"},{"line_number":542,"context_line":"        LOG.debug("},{"line_number":543,"context_line":"            {\u0027instance\u0027: instance_id, \u0027host\u0027: host_name})"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"        previous_status \u003d instance.status"},{"line_number":546,"context_line":"        self.instance_migrate(instance_id, dest_hostname)"},{"line_number":547,"context_line":"        instance \u003d self.find_instance(instance_id)"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        while (instance.status not in"},{"line_number":550,"context_line":"                [\"VERIFY_RESIZE\", \"ERROR\"] and retry):"},{"line_number":551,"context_line":"            instance \u003d self.find_instance(instance_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"51bab6e6_65c9179d","line":548,"range":{"start_line":536,"start_character":4,"end_line":548,"end_character":1},"in_reply_to":"9d162f1d_8385f417","updated":"2026-02-12 10:58:54.000000000","message":"As commented below, IMO raising a watcher exception is more consistent to previous behavior that returning None.","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"340d961ddf4ff6c089044b598a80bc4391551082","unresolved":false,"context_lines":[{"line_number":533,"context_line":"        retry \u003d retry or CONF.nova.migration_max_retries"},{"line_number":534,"context_line":"        interval \u003d interval or CONF.nova.migration_interval"},{"line_number":535,"context_line":"        # Looking for the instance to migrate"},{"line_number":536,"context_line":"        try:"},{"line_number":537,"context_line":"            instance \u003d self.find_instance(instance_id)"},{"line_number":538,"context_line":"        except exception.InstanceNotFound:"},{"line_number":539,"context_line":"            LOG.debug(\"Instance %s not found !\", instance_id)"},{"line_number":540,"context_line":"            return False"},{"line_number":541,"context_line":"        host_name \u003d instance.host"},{"line_number":542,"context_line":"        LOG.debug("},{"line_number":543,"context_line":"            {\u0027instance\u0027: instance_id, \u0027host\u0027: host_name})"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"        previous_status \u003d instance.status"},{"line_number":546,"context_line":"        self.instance_migrate(instance_id, dest_hostname)"},{"line_number":547,"context_line":"        instance \u003d self.find_instance(instance_id)"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        while (instance.status not in"},{"line_number":550,"context_line":"                [\"VERIFY_RESIZE\", \"ERROR\"] and retry):"},{"line_number":551,"context_line":"            instance \u003d self.find_instance(instance_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"345e5924_1c4cf99d","line":548,"range":{"start_line":536,"start_character":4,"end_line":548,"end_character":1},"in_reply_to":"9d162f1d_8385f417","updated":"2026-02-11 18:22:05.000000000","message":"cool ill revew for that so.","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"a44632df7fe4c4cdafe9f0fbdd19bf09b40bf246","unresolved":true,"context_lines":[{"line_number":533,"context_line":"        retry \u003d retry or CONF.nova.migration_max_retries"},{"line_number":534,"context_line":"        interval \u003d interval or CONF.nova.migration_interval"},{"line_number":535,"context_line":"        # Looking for the instance to migrate"},{"line_number":536,"context_line":"        try:"},{"line_number":537,"context_line":"            instance \u003d self.find_instance(instance_id)"},{"line_number":538,"context_line":"        except exception.InstanceNotFound:"},{"line_number":539,"context_line":"            LOG.debug(\"Instance %s not found !\", instance_id)"},{"line_number":540,"context_line":"            return False"},{"line_number":541,"context_line":"        host_name \u003d instance.host"},{"line_number":542,"context_line":"        LOG.debug("},{"line_number":543,"context_line":"            {\u0027instance\u0027: instance_id, \u0027host\u0027: host_name})"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"        previous_status \u003d instance.status"},{"line_number":546,"context_line":"        self.instance_migrate(instance_id, dest_hostname)"},{"line_number":547,"context_line":"        instance \u003d self.find_instance(instance_id)"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        while (instance.status not in"},{"line_number":550,"context_line":"                [\"VERIFY_RESIZE\", \"ERROR\"] and retry):"},{"line_number":551,"context_line":"            instance \u003d self.find_instance(instance_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9d162f1d_8385f417","line":548,"range":{"start_line":536,"start_character":4,"end_line":548,"end_character":1},"in_reply_to":"d3dddc03_884e7376","updated":"2026-02-10 13:02:14.000000000","message":"I will change the `find_instance` method to return None when the instance is not found and apply that consistently","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5ef722f42b471529be76a4b9477939508ddfd836","unresolved":true,"context_lines":[{"line_number":538,"context_line":"        except exception.InstanceNotFound:"},{"line_number":539,"context_line":"            LOG.debug(\"Instance %s not found !\", instance_id)"},{"line_number":540,"context_line":"            return False"},{"line_number":541,"context_line":"        host_name \u003d instance.host"},{"line_number":542,"context_line":"        LOG.debug("},{"line_number":543,"context_line":"            {\u0027instance\u0027: instance_id, \u0027host\u0027: host_name})"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"        previous_status \u003d instance.status"},{"line_number":546,"context_line":"        self.instance_migrate(instance_id, dest_hostname)"},{"line_number":547,"context_line":"        instance \u003d self.find_instance(instance_id)"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        while (instance.status not in"},{"line_number":550,"context_line":"                [\"VERIFY_RESIZE\", \"ERROR\"] and retry):"},{"line_number":551,"context_line":"            instance \u003d self.find_instance(instance_id)"},{"line_number":552,"context_line":"            time.sleep(interval)"},{"line_number":553,"context_line":"            retry -\u003d 1"},{"line_number":554,"context_line":"        new_hostname \u003d instance.host"},{"line_number":555,"context_line":""},{"line_number":556,"context_line":"        if (host_name !\u003d new_hostname and"},{"line_number":557,"context_line":"                instance.status \u003d\u003d \u0027VERIFY_RESIZE\u0027):"},{"line_number":558,"context_line":"            if not self.confirm_resize(instance, previous_status):"},{"line_number":559,"context_line":"                return False"},{"line_number":560,"context_line":"            LOG.debug("},{"line_number":561,"context_line":"                \"cold migration succeeded : \""},{"line_number":562,"context_line":"                \"instance %(instance)s is now on host \u0027%(host)s\u0027.\","},{"line_number":563,"context_line":"                {\u0027instance\u0027: instance_id, \u0027host\u0027: new_hostname})"},{"line_number":564,"context_line":"            return True"},{"line_number":565,"context_line":"        else:"},{"line_number":566,"context_line":"            LOG.debug("},{"line_number":567,"context_line":"                \"cold migration for instance %s failed\", instance_id)"},{"line_number":568,"context_line":"            return False"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"    def resize_instance(self, instance_id, flavor, retry\u003dNone, interval\u003dNone):"},{"line_number":571,"context_line":"        \"\"\"This method resizes given instance with specified flavor."}],"source_content_type":"text/x-python","patch_set":14,"id":"ca69b05c_a81b7683","line":568,"range":{"start_line":541,"start_character":7,"end_line":568,"end_character":24},"updated":"2026-02-09 18:28:10.000000000","message":"you shoudl move all of this into the try since each addtional call to find could raise and your  not handleing thos indepenely.\n\nthat will protect agaisn the instnace being deleteed during the execution fo the cold migration.\n\nprevioslly the code woudl have resultiend in an atirbute error so this is kind fo a prexisitng error because it assumes instance will never be None once we are in the body of the else\n\nalterenitvely we coudl jsut add targeted trys for each call to find.\n\nthat may be better in some regards so its up to you if you want to fix this now with one try, fix it with smaller try excpets to handle ti more cleanly or  file a bug.","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ce5e8d636f5355e7d2a7f93692f5295007b5bf66","unresolved":false,"context_lines":[{"line_number":538,"context_line":"        except exception.InstanceNotFound:"},{"line_number":539,"context_line":"            LOG.debug(\"Instance %s not found !\", instance_id)"},{"line_number":540,"context_line":"            return False"},{"line_number":541,"context_line":"        host_name \u003d instance.host"},{"line_number":542,"context_line":"        LOG.debug("},{"line_number":543,"context_line":"            {\u0027instance\u0027: instance_id, \u0027host\u0027: host_name})"},{"line_number":544,"context_line":""},{"line_number":545,"context_line":"        previous_status \u003d instance.status"},{"line_number":546,"context_line":"        self.instance_migrate(instance_id, dest_hostname)"},{"line_number":547,"context_line":"        instance \u003d self.find_instance(instance_id)"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"        while (instance.status not in"},{"line_number":550,"context_line":"                [\"VERIFY_RESIZE\", \"ERROR\"] and retry):"},{"line_number":551,"context_line":"            instance \u003d self.find_instance(instance_id)"},{"line_number":552,"context_line":"            time.sleep(interval)"},{"line_number":553,"context_line":"            retry -\u003d 1"},{"line_number":554,"context_line":"        new_hostname \u003d instance.host"},{"line_number":555,"context_line":""},{"line_number":556,"context_line":"        if (host_name !\u003d new_hostname and"},{"line_number":557,"context_line":"                instance.status \u003d\u003d \u0027VERIFY_RESIZE\u0027):"},{"line_number":558,"context_line":"            if not self.confirm_resize(instance, previous_status):"},{"line_number":559,"context_line":"                return False"},{"line_number":560,"context_line":"            LOG.debug("},{"line_number":561,"context_line":"                \"cold migration succeeded : \""},{"line_number":562,"context_line":"                \"instance %(instance)s is now on host \u0027%(host)s\u0027.\","},{"line_number":563,"context_line":"                {\u0027instance\u0027: instance_id, \u0027host\u0027: new_hostname})"},{"line_number":564,"context_line":"            return True"},{"line_number":565,"context_line":"        else:"},{"line_number":566,"context_line":"            LOG.debug("},{"line_number":567,"context_line":"                \"cold migration for instance %s failed\", instance_id)"},{"line_number":568,"context_line":"            return False"},{"line_number":569,"context_line":""},{"line_number":570,"context_line":"    def resize_instance(self, instance_id, flavor, retry\u003dNone, interval\u003dNone):"},{"line_number":571,"context_line":"        \"\"\"This method resizes given instance with specified flavor."}],"source_content_type":"text/x-python","patch_set":14,"id":"6e4c9b85_869fd6c0","line":568,"range":{"start_line":541,"start_character":7,"end_line":568,"end_character":24},"in_reply_to":"ca69b05c_a81b7683","updated":"2026-02-12 16:46:11.000000000","message":"this was resolved in patchset  by checking the result of each `find_instance` call","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5ef722f42b471529be76a4b9477939508ddfd836","unresolved":true,"context_lines":[{"line_number":602,"context_line":"        try:"},{"line_number":603,"context_line":"            flavor_id \u003d self.get_flavor(flavor).id"},{"line_number":604,"context_line":"        except nvexceptions.NotFound:"},{"line_number":605,"context_line":"            flavor_id \u003d [f.id for f in self.get_flavor_list() if"},{"line_number":606,"context_line":"                         f.flavor_name \u003d\u003d flavor][0]"},{"line_number":607,"context_line":"        except nvexceptions.ClientException as e:"},{"line_number":608,"context_line":"            LOG.debug(\"Nova client exception occurred while resizing \""},{"line_number":609,"context_line":"                      \"instance %s. Exception: %s\", instance_id, e)"}],"source_content_type":"text/x-python","patch_set":14,"id":"48c223c7_7a7380db","line":606,"range":{"start_line":605,"start_character":0,"end_line":606,"end_character":52},"updated":"2026-02-09 18:28:10.000000000","message":"this can raise as the flavor may not befoudn so [0] is not safe\n\n\n\n```suggestion\n            flavor_id \u003d next((f.id for f in self.get_flavor_list() if\n                         f.flavor_name \u003d\u003d flavor), None)\n```\n\nthen on lin 611 you woudl do\n\n   if not flavor_id: -\u003e  if flavor_id is None:","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"a44632df7fe4c4cdafe9f0fbdd19bf09b40bf246","unresolved":false,"context_lines":[{"line_number":602,"context_line":"        try:"},{"line_number":603,"context_line":"            flavor_id \u003d self.get_flavor(flavor).id"},{"line_number":604,"context_line":"        except nvexceptions.NotFound:"},{"line_number":605,"context_line":"            flavor_id \u003d [f.id for f in self.get_flavor_list() if"},{"line_number":606,"context_line":"                         f.flavor_name \u003d\u003d flavor][0]"},{"line_number":607,"context_line":"        except nvexceptions.ClientException as e:"},{"line_number":608,"context_line":"            LOG.debug(\"Nova client exception occurred while resizing \""},{"line_number":609,"context_line":"                      \"instance %s. Exception: %s\", instance_id, e)"}],"source_content_type":"text/x-python","patch_set":14,"id":"0dcb4661_9b072a3b","line":606,"range":{"start_line":605,"start_character":0,"end_line":606,"end_character":52},"in_reply_to":"48c223c7_7a7380db","updated":"2026-02-10 13:02:14.000000000","message":"thanks fixed!","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5ef722f42b471529be76a4b9477939508ddfd836","unresolved":true,"context_lines":[{"line_number":673,"context_line":""},{"line_number":674,"context_line":"        self.instance_live_migrate(instance_id, dest_hostname)"},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        instance \u003d self.find_instance(instance_id)"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"        # NOTE: If destination host is not specified for live migration"},{"line_number":679,"context_line":"        # let nova scheduler choose the destination host."}],"source_content_type":"text/x-python","patch_set":14,"id":"d783a431_7d1ca07d","line":676,"updated":"2026-02-09 18:28:10.000000000","message":"same meta comment currently this can raise. we should perhaps consier having it return None instead if its not found.","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"340d961ddf4ff6c089044b598a80bc4391551082","unresolved":false,"context_lines":[{"line_number":673,"context_line":""},{"line_number":674,"context_line":"        self.instance_live_migrate(instance_id, dest_hostname)"},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        instance \u003d self.find_instance(instance_id)"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"        # NOTE: If destination host is not specified for live migration"},{"line_number":679,"context_line":"        # let nova scheduler choose the destination host."}],"source_content_type":"text/x-python","patch_set":14,"id":"e3b5f71f_8b8fc91f","line":676,"in_reply_to":"c810c29e_9c5bc88b","updated":"2026-02-11 18:22:05.000000000","message":"Acknowledged","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"a44632df7fe4c4cdafe9f0fbdd19bf09b40bf246","unresolved":true,"context_lines":[{"line_number":673,"context_line":""},{"line_number":674,"context_line":"        self.instance_live_migrate(instance_id, dest_hostname)"},{"line_number":675,"context_line":""},{"line_number":676,"context_line":"        instance \u003d self.find_instance(instance_id)"},{"line_number":677,"context_line":""},{"line_number":678,"context_line":"        # NOTE: If destination host is not specified for live migration"},{"line_number":679,"context_line":"        # let nova scheduler choose the destination host."}],"source_content_type":"text/x-python","patch_set":14,"id":"c810c29e_9c5bc88b","line":676,"in_reply_to":"d783a431_7d1ca07d","updated":"2026-02-10 13:02:14.000000000","message":"I\u0027ve changed all the get_ methods to return None when the resource is not found to be consistent in patchset 19","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"2288eb2d03aae8d171cff9124cace527f35649e2","unresolved":true,"context_lines":[{"line_number":57,"context_line":"    return wrapper"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def handle_not_found(resource_type, id_arg_index\u003d1):"},{"line_number":61,"context_line":"    \"\"\"Decorator to handle NotFound exceptions from novaclient."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    This decorator catches novaclient NotFound exceptions and returns None"}],"source_content_type":"text/x-python","patch_set":21,"id":"d008badd_c2e9bff5","line":60,"range":{"start_line":60,"start_character":0,"end_line":60,"end_character":2},"updated":"2026-02-12 10:58:54.000000000","message":"I have doubts we want to manage notfound returning None. For the particular case of find_instance i.e., previous code was inconsistent, in some places it was expecting None and in others nvexceptions.NotFound, but the actual behavior was that it was raising the nvexceptions.NotFound. IMO changing it to return None is more risky than moving to a new watcher.exceptions.NotFound (or something similar).\n\nWith the previous behavior, if it failed to get a resource and it was not catching the specific Exception, it\u0027d forward it up likely leading to failed actions or something like that. Transforming that to None, we need to make sure it\u0027s checking the actual returned value on each call so for me it\u0027s more consistent with previous behavior to raise an Exception that move to None.\n\nIn any case, we need to review the code but I incline to raise a NotFound exception instead of returning None.","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    return wrapper"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"def handle_not_found(resource_type, id_arg_index\u003d1):"},{"line_number":61,"context_line":"    \"\"\"Decorator to handle NotFound exceptions from novaclient."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    This decorator catches novaclient NotFound exceptions and returns None"}],"source_content_type":"text/x-python","patch_set":21,"id":"a2ab9aba_83cb3249","line":60,"range":{"start_line":60,"start_character":0,"end_line":60,"end_character":2},"in_reply_to":"d008badd_c2e9bff5","updated":"2026-02-17 19:48:35.000000000","message":"Done","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"06c9a9433350ce6f66af0e6c369c014683460bc2","unresolved":true,"context_lines":[{"line_number":461,"context_line":"        return [Server.from_novaclient(s) for s in servers]"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"    @nova_retries"},{"line_number":464,"context_line":"    def get_instance_by_uuid(self, instance_uuid):"},{"line_number":465,"context_line":"        \"\"\"Get a list of instances matching the given UUID."},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        :param instance_uuid: the UUID of the instance to search for"}],"source_content_type":"text/x-python","patch_set":21,"id":"b1b60cb2_2325cdc4","line":464,"updated":"2026-02-11 18:40:27.000000000","message":"this really shoudl not be returnign a list\nthe server uuid shoudl be gloably uniwue so this shoudl return a `Server|None`","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":true,"context_lines":[{"line_number":461,"context_line":"        return [Server.from_novaclient(s) for s in servers]"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"    @nova_retries"},{"line_number":464,"context_line":"    def get_instance_by_uuid(self, instance_uuid):"},{"line_number":465,"context_line":"        \"\"\"Get a list of instances matching the given UUID."},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        :param instance_uuid: the UUID of the instance to search for"}],"source_content_type":"text/x-python","patch_set":21,"id":"8fa4aa9b_33c29f54","line":464,"in_reply_to":"67905474_09feb474","updated":"2026-02-17 19:48:35.000000000","message":"done, I changed the method to raise if no instance is found and also updated the docstring","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"da7dcb1d79964627733fe925fe9c2de1f4cc4db1","unresolved":false,"context_lines":[{"line_number":461,"context_line":"        return [Server.from_novaclient(s) for s in servers]"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"    @nova_retries"},{"line_number":464,"context_line":"    def get_instance_by_uuid(self, instance_uuid):"},{"line_number":465,"context_line":"        \"\"\"Get a list of instances matching the given UUID."},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        :param instance_uuid: the UUID of the instance to search for"}],"source_content_type":"text/x-python","patch_set":21,"id":"b8dae1a2_806b7956","line":464,"in_reply_to":"8fa4aa9b_33c29f54","updated":"2026-02-18 14:15:50.000000000","message":"Done","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"2f87377751994ed21b312688a386f894c8c28d3e","unresolved":true,"context_lines":[{"line_number":461,"context_line":"        return [Server.from_novaclient(s) for s in servers]"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"    @nova_retries"},{"line_number":464,"context_line":"    def get_instance_by_uuid(self, instance_uuid):"},{"line_number":465,"context_line":"        \"\"\"Get a list of instances matching the given UUID."},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        :param instance_uuid: the UUID of the instance to search for"}],"source_content_type":"text/x-python","patch_set":21,"id":"b7143644_bd3ddd98","line":464,"in_reply_to":"b1b60cb2_2325cdc4","updated":"2026-02-12 11:07:24.000000000","message":"Agree, and I think that since we are refactoring this, it is fine to fix","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ce5e8d636f5355e7d2a7f93692f5295007b5bf66","unresolved":true,"context_lines":[{"line_number":461,"context_line":"        return [Server.from_novaclient(s) for s in servers]"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"    @nova_retries"},{"line_number":464,"context_line":"    def get_instance_by_uuid(self, instance_uuid):"},{"line_number":465,"context_line":"        \"\"\"Get a list of instances matching the given UUID."},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        :param instance_uuid: the UUID of the instance to search for"}],"source_content_type":"text/x-python","patch_set":21,"id":"d9f4b840_5630323d","line":464,"in_reply_to":"b1b60cb2_2325cdc4","updated":"2026-02-12 16:46:11.000000000","message":"yes, that is an odd choice, I\u0027m also not sure what is the point of using the list api instead of `find_instance`. Anyway, this method is only used in https://github.com/openstack/watcher/blob/a71d3ea663cc55c921b2ff8cf678cf269838e454/watcher/decision_engine/planner/workload_stabilization.py#L267 so it should  be easy to fix","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"0cacc1447d7ba8e0a4d260419edebe2a4c546722","unresolved":true,"context_lines":[{"line_number":461,"context_line":"        return [Server.from_novaclient(s) for s in servers]"},{"line_number":462,"context_line":""},{"line_number":463,"context_line":"    @nova_retries"},{"line_number":464,"context_line":"    def get_instance_by_uuid(self, instance_uuid):"},{"line_number":465,"context_line":"        \"\"\"Get a list of instances matching the given UUID."},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"        :param instance_uuid: the UUID of the instance to search for"}],"source_content_type":"text/x-python","patch_set":21,"id":"67905474_09feb474","line":464,"in_reply_to":"d9f4b840_5630323d","updated":"2026-02-16 18:35:23.000000000","message":"I am in favor of changing this method to raise a NotFound exception, to have the expected behavior from a get_resource* method, i.e., methods that get a single resource should return the resource or raise NotFound, while methods that \"list\" always return a list (with elements or empty list). I think that is a good oportunity to fix this class.","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"06c9a9433350ce6f66af0e6c369c014683460bc2","unresolved":true,"context_lines":[{"line_number":527,"context_line":"        :param instance_id: the UUID of the instance to find"},{"line_number":528,"context_line":"        :returns: Server wrapper object if found, None if not found"},{"line_number":529,"context_line":"        \"\"\""},{"line_number":530,"context_line":"        instance \u003d self.nova.servers.get(instance_id)"},{"line_number":531,"context_line":"        return Server.from_novaclient(instance)"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"    @nova_retries"}],"source_content_type":"text/x-python","patch_set":21,"id":"e12ceb48_2f155d42","line":530,"in_reply_to":"7396c968_a3413416","updated":"2026-02-11 18:40:27.000000000","message":"yep this s a logic bug\n\n\nyou said you woudl update the consume to expect none so we need to fix the remaining cases","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":false,"context_lines":[{"line_number":527,"context_line":"        :param instance_id: the UUID of the instance to find"},{"line_number":528,"context_line":"        :returns: Server wrapper object if found, None if not found"},{"line_number":529,"context_line":"        \"\"\""},{"line_number":530,"context_line":"        instance \u003d self.nova.servers.get(instance_id)"},{"line_number":531,"context_line":"        return Server.from_novaclient(instance)"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"    @nova_retries"}],"source_content_type":"text/x-python","patch_set":21,"id":"ac8874c3_a4ef8b4d","line":530,"in_reply_to":"762736ad_c2c767b9","updated":"2026-02-17 19:48:35.000000000","message":"Done","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ce5e8d636f5355e7d2a7f93692f5295007b5bf66","unresolved":true,"context_lines":[{"line_number":527,"context_line":"        :param instance_id: the UUID of the instance to find"},{"line_number":528,"context_line":"        :returns: Server wrapper object if found, None if not found"},{"line_number":529,"context_line":"        \"\"\""},{"line_number":530,"context_line":"        instance \u003d self.nova.servers.get(instance_id)"},{"line_number":531,"context_line":"        return Server.from_novaclient(instance)"},{"line_number":532,"context_line":""},{"line_number":533,"context_line":"    @nova_retries"}],"source_content_type":"text/x-python","patch_set":21,"id":"762736ad_c2c767b9","line":530,"in_reply_to":"e12ceb48_2f155d42","updated":"2026-02-12 16:46:11.000000000","message":"yep I did miss a few, I\u0027ve gone now over all the calls and the behaviour should be consistent","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"2f87377751994ed21b312688a386f894c8c28d3e","unresolved":true,"context_lines":[{"line_number":78,"context_line":"            try:"},{"line_number":79,"context_line":"                return func(*args, **kwargs)"},{"line_number":80,"context_line":"            except nvexceptions.NotFound:"},{"line_number":81,"context_line":"                resource_id \u003d args[id_arg_index] if len(args) \u003e id_arg_index \\"},{"line_number":82,"context_line":"                    else \u0027unknown\u0027"},{"line_number":83,"context_line":"                LOG.debug(\"%s %s was not found\", resource_type, resource_id)"},{"line_number":84,"context_line":"                return None"}],"source_content_type":"text/x-python","patch_set":22,"id":"87622df5_ead1660a","line":81,"range":{"start_line":81,"start_character":77,"end_line":81,"end_character":78},"updated":"2026-02-12 11:07:24.000000000","message":"parentheses are preferred to break lines[1]\n\n[1] https://docs.openstack.org/hacking/latest/user/hacking.html","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ce5e8d636f5355e7d2a7f93692f5295007b5bf66","unresolved":true,"context_lines":[{"line_number":78,"context_line":"            try:"},{"line_number":79,"context_line":"                return func(*args, **kwargs)"},{"line_number":80,"context_line":"            except nvexceptions.NotFound:"},{"line_number":81,"context_line":"                resource_id \u003d args[id_arg_index] if len(args) \u003e id_arg_index \\"},{"line_number":82,"context_line":"                    else \u0027unknown\u0027"},{"line_number":83,"context_line":"                LOG.debug(\"%s %s was not found\", resource_type, resource_id)"},{"line_number":84,"context_line":"                return None"}],"source_content_type":"text/x-python","patch_set":22,"id":"d0e475a5_b8b8715e","line":81,"range":{"start_line":81,"start_character":77,"end_line":81,"end_character":78},"in_reply_to":"87622df5_ead1660a","updated":"2026-02-12 16:46:11.000000000","message":"thanks, I replaced it with an if/else block so that is shorter and more readable","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            try:"},{"line_number":79,"context_line":"                return func(*args, **kwargs)"},{"line_number":80,"context_line":"            except nvexceptions.NotFound:"},{"line_number":81,"context_line":"                resource_id \u003d args[id_arg_index] if len(args) \u003e id_arg_index \\"},{"line_number":82,"context_line":"                    else \u0027unknown\u0027"},{"line_number":83,"context_line":"                LOG.debug(\"%s %s was not found\", resource_type, resource_id)"},{"line_number":84,"context_line":"                return None"}],"source_content_type":"text/x-python","patch_set":22,"id":"952fa056_60238050","line":81,"range":{"start_line":81,"start_character":77,"end_line":81,"end_character":78},"in_reply_to":"d0e475a5_b8b8715e","updated":"2026-02-17 19:48:35.000000000","message":"Done","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"2f87377751994ed21b312688a386f894c8c28d3e","unresolved":true,"context_lines":[{"line_number":409,"context_line":"            )"},{"line_number":410,"context_line":"        ]"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def get_compute_node_by_hostname(self, node_hostname):"},{"line_number":413,"context_line":"        \"\"\"Get compute node by hostname"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"        :param node_hostname: Compute service hostname"}],"source_content_type":"text/x-python","patch_set":22,"id":"3d923ddc_c4c73376","line":412,"range":{"start_line":412,"start_character":8,"end_line":412,"end_character":36},"updated":"2026-02-12 11:07:24.000000000","message":"why we don\u0027t return None instead of raising NotFound in this one?","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"0cacc1447d7ba8e0a4d260419edebe2a4c546722","unresolved":false,"context_lines":[{"line_number":409,"context_line":"            )"},{"line_number":410,"context_line":"        ]"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def get_compute_node_by_hostname(self, node_hostname):"},{"line_number":413,"context_line":"        \"\"\"Get compute node by hostname"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"        :param node_hostname: Compute service hostname"}],"source_content_type":"text/x-python","patch_set":22,"id":"244ef6fc_db22ff10","line":412,"range":{"start_line":412,"start_character":8,"end_line":412,"end_character":36},"in_reply_to":"1f4b642e_0f306284","updated":"2026-02-16 18:35:23.000000000","message":"ack, so based on discussion in irc meeting we decided to continue to raise exception when not found.","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ce5e8d636f5355e7d2a7f93692f5295007b5bf66","unresolved":true,"context_lines":[{"line_number":409,"context_line":"            )"},{"line_number":410,"context_line":"        ]"},{"line_number":411,"context_line":""},{"line_number":412,"context_line":"    def get_compute_node_by_hostname(self, node_hostname):"},{"line_number":413,"context_line":"        \"\"\"Get compute node by hostname"},{"line_number":414,"context_line":""},{"line_number":415,"context_line":"        :param node_hostname: Compute service hostname"}],"source_content_type":"text/x-python","patch_set":22,"id":"1f4b642e_0f306284","line":412,"range":{"start_line":412,"start_character":8,"end_line":412,"end_character":36},"in_reply_to":"3d923ddc_c4c73376","updated":"2026-02-12 16:46:11.000000000","message":"I left it as is since it was explicitely raising this before and the behavior was consistent. I\u0027ll bring the topic up in the IRC meeting so we can decide on the behaviour we want","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"2f87377751994ed21b312688a386f894c8c28d3e","unresolved":true,"context_lines":[{"line_number":1053,"context_line":""},{"line_number":1054,"context_line":"        while server.vm_state !\u003d state and retry:"},{"line_number":1055,"context_line":"            time.sleep(sleep)"},{"line_number":1056,"context_line":"            server \u003d self.find_instance(server.uuid)"},{"line_number":1057,"context_line":"            retry -\u003d 1"},{"line_number":1058,"context_line":"        return server.vm_state \u003d\u003d state"},{"line_number":1059,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"4e2aae74_d0909598","line":1056,"range":{"start_line":1056,"start_character":0,"end_line":1056,"end_character":52},"updated":"2026-02-12 11:07:24.000000000","message":"this can return None here and will raise a AttributeError","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ce5e8d636f5355e7d2a7f93692f5295007b5bf66","unresolved":true,"context_lines":[{"line_number":1053,"context_line":""},{"line_number":1054,"context_line":"        while server.vm_state !\u003d state and retry:"},{"line_number":1055,"context_line":"            time.sleep(sleep)"},{"line_number":1056,"context_line":"            server \u003d self.find_instance(server.uuid)"},{"line_number":1057,"context_line":"            retry -\u003d 1"},{"line_number":1058,"context_line":"        return server.vm_state \u003d\u003d state"},{"line_number":1059,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"7ff0ab4c_1ae8c1e0","line":1056,"range":{"start_line":1056,"start_character":0,"end_line":1056,"end_character":52},"in_reply_to":"4e2aae74_d0909598","updated":"2026-02-12 16:46:11.000000000","message":"thanks, fixed in the next patchset","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":false,"context_lines":[{"line_number":1053,"context_line":""},{"line_number":1054,"context_line":"        while server.vm_state !\u003d state and retry:"},{"line_number":1055,"context_line":"            time.sleep(sleep)"},{"line_number":1056,"context_line":"            server \u003d self.find_instance(server.uuid)"},{"line_number":1057,"context_line":"            retry -\u003d 1"},{"line_number":1058,"context_line":"        return server.vm_state \u003d\u003d state"},{"line_number":1059,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"1f3ca91d_105c35b2","line":1056,"range":{"start_line":1056,"start_character":0,"end_line":1056,"end_character":52},"in_reply_to":"7ff0ab4c_1ae8c1e0","updated":"2026-02-17 19:48:35.000000000","message":"Done","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"2f87377751994ed21b312688a386f894c8c28d3e","unresolved":true,"context_lines":[{"line_number":1071,"context_line":"        \"\"\"Get the list of running migrations for an instance."},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        :param instance_id: the UUID of the instance"},{"line_number":1074,"context_line":"        :returns: list of ServerMigration wrapper objects, None if instance"},{"line_number":1075,"context_line":"            not found"},{"line_number":1076,"context_line":"        \"\"\""},{"line_number":1077,"context_line":"        migrations \u003d self.nova.server_migrations.list(server\u003dinstance_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"0d84e3af_285d4fd0","line":1074,"range":{"start_line":1074,"start_character":59,"end_line":1074,"end_character":63},"updated":"2026-02-12 11:07:24.000000000","message":"it will return [] right?","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ce5e8d636f5355e7d2a7f93692f5295007b5bf66","unresolved":true,"context_lines":[{"line_number":1071,"context_line":"        \"\"\"Get the list of running migrations for an instance."},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        :param instance_id: the UUID of the instance"},{"line_number":1074,"context_line":"        :returns: list of ServerMigration wrapper objects, None if instance"},{"line_number":1075,"context_line":"            not found"},{"line_number":1076,"context_line":"        \"\"\""},{"line_number":1077,"context_line":"        migrations \u003d self.nova.server_migrations.list(server\u003dinstance_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"8472f591_8036955f","line":1074,"range":{"start_line":1074,"start_character":59,"end_line":1074,"end_character":63},"in_reply_to":"0d84e3af_285d4fd0","updated":"2026-02-12 16:46:11.000000000","message":"this will return an empty list if there are no server migrations for the instance_id, and None if the there is no instance with `instance_id`","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"0cacc1447d7ba8e0a4d260419edebe2a4c546722","unresolved":true,"context_lines":[{"line_number":1071,"context_line":"        \"\"\"Get the list of running migrations for an instance."},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        :param instance_id: the UUID of the instance"},{"line_number":1074,"context_line":"        :returns: list of ServerMigration wrapper objects, None if instance"},{"line_number":1075,"context_line":"            not found"},{"line_number":1076,"context_line":"        \"\"\""},{"line_number":1077,"context_line":"        migrations \u003d self.nova.server_migrations.list(server\u003dinstance_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"982ad2a5_c8970175","line":1074,"range":{"start_line":1074,"start_character":59,"end_line":1074,"end_character":63},"in_reply_to":"8472f591_8036955f","updated":"2026-02-16 18:35:23.000000000","message":"is this still valid? now we raise expection for instance not found and return a empty list if there are no migrations","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":true,"context_lines":[{"line_number":1071,"context_line":"        \"\"\"Get the list of running migrations for an instance."},{"line_number":1072,"context_line":""},{"line_number":1073,"context_line":"        :param instance_id: the UUID of the instance"},{"line_number":1074,"context_line":"        :returns: list of ServerMigration wrapper objects, None if instance"},{"line_number":1075,"context_line":"            not found"},{"line_number":1076,"context_line":"        \"\"\""},{"line_number":1077,"context_line":"        migrations \u003d self.nova.server_migrations.list(server\u003dinstance_id)"}],"source_content_type":"text/x-python","patch_set":22,"id":"2b52b9b2_de41ffa2","line":1074,"range":{"start_line":1074,"start_character":59,"end_line":1074,"end_character":63},"in_reply_to":"982ad2a5_c8970175","updated":"2026-02-17 19:48:35.000000000","message":"thanks, I fixed the docstring","commit_id":"0d3bd2b62458da050239724be6194db0b00d5dd6"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"de7f28ad0968d32441840b18a657c813197a6379","unresolved":true,"context_lines":[{"line_number":644,"context_line":"        :raises: NovaClientError if there is any problem while calling the Nova"},{"line_number":645,"context_line":"        api"},{"line_number":646,"context_line":"        \"\"\""},{"line_number":647,"context_line":"        instance_id \u003d instance.uuid"},{"line_number":648,"context_line":"        self._instance_confirm_resize(instance.uuid)"},{"line_number":649,"context_line":"        try:"},{"line_number":650,"context_line":"            instance \u003d self.find_instance(instance.uuid)"}],"source_content_type":"text/x-python","patch_set":24,"id":"d3b6dce7_62569a6d","line":647,"range":{"start_line":647,"start_character":8,"end_line":647,"end_character":19},"updated":"2026-02-17 17:08:08.000000000","message":"nit. Inconsistent usage of instance_id and instance.uuid in the method.","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":true,"context_lines":[{"line_number":644,"context_line":"        :raises: NovaClientError if there is any problem while calling the Nova"},{"line_number":645,"context_line":"        api"},{"line_number":646,"context_line":"        \"\"\""},{"line_number":647,"context_line":"        instance_id \u003d instance.uuid"},{"line_number":648,"context_line":"        self._instance_confirm_resize(instance.uuid)"},{"line_number":649,"context_line":"        try:"},{"line_number":650,"context_line":"            instance \u003d self.find_instance(instance.uuid)"}],"source_content_type":"text/x-python","patch_set":24,"id":"e15e9f08_803aa6e7","line":647,"range":{"start_line":647,"start_character":8,"end_line":647,"end_character":19},"in_reply_to":"d3b6dce7_62569a6d","updated":"2026-02-17 19:48:35.000000000","message":"thanks, I fixed it","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"da7dcb1d79964627733fe925fe9c2de1f4cc4db1","unresolved":false,"context_lines":[{"line_number":644,"context_line":"        :raises: NovaClientError if there is any problem while calling the Nova"},{"line_number":645,"context_line":"        api"},{"line_number":646,"context_line":"        \"\"\""},{"line_number":647,"context_line":"        instance_id \u003d instance.uuid"},{"line_number":648,"context_line":"        self._instance_confirm_resize(instance.uuid)"},{"line_number":649,"context_line":"        try:"},{"line_number":650,"context_line":"            instance \u003d self.find_instance(instance.uuid)"}],"source_content_type":"text/x-python","patch_set":24,"id":"20cefbe9_2dad8674","line":647,"range":{"start_line":647,"start_character":8,"end_line":647,"end_character":19},"in_reply_to":"e15e9f08_803aa6e7","updated":"2026-02-18 14:15:50.000000000","message":"Done","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"0cacc1447d7ba8e0a4d260419edebe2a4c546722","unresolved":true,"context_lines":[{"line_number":736,"context_line":""},{"line_number":737,"context_line":"        previous_status \u003d instance.status"},{"line_number":738,"context_line":"        self._instance_migrate(instance_id, dest_hostname)"},{"line_number":739,"context_line":"        instance \u003d self.find_instance(instance_id)"},{"line_number":740,"context_line":"        if instance is None:"},{"line_number":741,"context_line":"            LOG.debug("},{"line_number":742,"context_line":"                \"Instance %s not found, can\u0027t cold migrate it.\", instance_id"},{"line_number":743,"context_line":"            )"},{"line_number":744,"context_line":"            return False"},{"line_number":745,"context_line":""},{"line_number":746,"context_line":"        while (instance.status not in"},{"line_number":747,"context_line":"                [\"VERIFY_RESIZE\", \"ERROR\"] and retry):"}],"source_content_type":"text/x-python","patch_set":24,"id":"1c8d26f6_3ec9e164","line":744,"range":{"start_line":739,"start_character":0,"end_line":744,"end_character":24},"updated":"2026-02-16 18:35:23.000000000","message":"try/except exception.ComputeResourceNotFound..","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":true,"context_lines":[{"line_number":736,"context_line":""},{"line_number":737,"context_line":"        previous_status \u003d instance.status"},{"line_number":738,"context_line":"        self._instance_migrate(instance_id, dest_hostname)"},{"line_number":739,"context_line":"        instance \u003d self.find_instance(instance_id)"},{"line_number":740,"context_line":"        if instance is None:"},{"line_number":741,"context_line":"            LOG.debug("},{"line_number":742,"context_line":"                \"Instance %s not found, can\u0027t cold migrate it.\", instance_id"},{"line_number":743,"context_line":"            )"},{"line_number":744,"context_line":"            return False"},{"line_number":745,"context_line":""},{"line_number":746,"context_line":"        while (instance.status not in"},{"line_number":747,"context_line":"                [\"VERIFY_RESIZE\", \"ERROR\"] and retry):"}],"source_content_type":"text/x-python","patch_set":24,"id":"b93aaf47_52947f33","line":744,"range":{"start_line":739,"start_character":0,"end_line":744,"end_character":24},"in_reply_to":"1c8d26f6_3ec9e164","updated":"2026-02-17 19:48:35.000000000","message":"thanks, I missed this one","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"331f60715102921db05270a3e7c88044f76472ae","unresolved":false,"context_lines":[{"line_number":736,"context_line":""},{"line_number":737,"context_line":"        previous_status \u003d instance.status"},{"line_number":738,"context_line":"        self._instance_migrate(instance_id, dest_hostname)"},{"line_number":739,"context_line":"        instance \u003d self.find_instance(instance_id)"},{"line_number":740,"context_line":"        if instance is None:"},{"line_number":741,"context_line":"            LOG.debug("},{"line_number":742,"context_line":"                \"Instance %s not found, can\u0027t cold migrate it.\", instance_id"},{"line_number":743,"context_line":"            )"},{"line_number":744,"context_line":"            return False"},{"line_number":745,"context_line":""},{"line_number":746,"context_line":"        while (instance.status not in"},{"line_number":747,"context_line":"                [\"VERIFY_RESIZE\", \"ERROR\"] and retry):"}],"source_content_type":"text/x-python","patch_set":24,"id":"feadba6e_aa2c0123","line":744,"range":{"start_line":739,"start_character":0,"end_line":744,"end_character":24},"in_reply_to":"b93aaf47_52947f33","updated":"2026-02-18 19:09:13.000000000","message":"Done","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"de7f28ad0968d32441840b18a657c813197a6379","unresolved":true,"context_lines":[{"line_number":813,"context_line":"                flavor_id \u003d next((f.id for f in self.get_flavor_list() if"},{"line_number":814,"context_line":"                                  f.flavor_name \u003d\u003d flavor), None)"},{"line_number":815,"context_line":"        except exception.NovaClientError as e:"},{"line_number":816,"context_line":"            LOG.debug(\"Nova client exception occurred while resizing \""},{"line_number":817,"context_line":"                      \"instance %s. Exception: %s\", instance_id, e)"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"        if not flavor_id:"},{"line_number":820,"context_line":"            LOG.debug(\"Flavor not found: %s, could not resize\", flavor)"}],"source_content_type":"text/x-python","patch_set":24,"id":"a2a263a3_842c836e","line":817,"range":{"start_line":816,"start_character":0,"end_line":817,"end_character":67},"updated":"2026-02-17 17:08:08.000000000","message":"I have doubts if we should `return False` here, bug given that you are keeping the same behavior and that we are checking flavor_id below, i guess it\u0027s fine.","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"331f60715102921db05270a3e7c88044f76472ae","unresolved":false,"context_lines":[{"line_number":813,"context_line":"                flavor_id \u003d next((f.id for f in self.get_flavor_list() if"},{"line_number":814,"context_line":"                                  f.flavor_name \u003d\u003d flavor), None)"},{"line_number":815,"context_line":"        except exception.NovaClientError as e:"},{"line_number":816,"context_line":"            LOG.debug(\"Nova client exception occurred while resizing \""},{"line_number":817,"context_line":"                      \"instance %s. Exception: %s\", instance_id, e)"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"        if not flavor_id:"},{"line_number":820,"context_line":"            LOG.debug(\"Flavor not found: %s, could not resize\", flavor)"}],"source_content_type":"text/x-python","patch_set":24,"id":"f5cb8c82_210eeee6","line":817,"range":{"start_line":816,"start_character":0,"end_line":817,"end_character":67},"in_reply_to":"8022eaab_3c09b5aa","updated":"2026-02-18 19:09:13.000000000","message":"Acknowledged","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":true,"context_lines":[{"line_number":813,"context_line":"                flavor_id \u003d next((f.id for f in self.get_flavor_list() if"},{"line_number":814,"context_line":"                                  f.flavor_name \u003d\u003d flavor), None)"},{"line_number":815,"context_line":"        except exception.NovaClientError as e:"},{"line_number":816,"context_line":"            LOG.debug(\"Nova client exception occurred while resizing \""},{"line_number":817,"context_line":"                      \"instance %s. Exception: %s\", instance_id, e)"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"        if not flavor_id:"},{"line_number":820,"context_line":"            LOG.debug(\"Flavor not found: %s, could not resize\", flavor)"}],"source_content_type":"text/x-python","patch_set":24,"id":"8022eaab_3c09b5aa","line":817,"range":{"start_line":816,"start_character":0,"end_line":817,"end_character":67},"in_reply_to":"a2a263a3_842c836e","updated":"2026-02-17 19:48:35.000000000","message":"yes, that would make sense, but the behaviour is still correct, so I haven\u0027t modified it","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":false,"context_lines":[{"line_number":973,"context_line":"            try:"},{"line_number":974,"context_line":"                self._live_migration_abort(instance_id, migration_id)"},{"line_number":975,"context_line":"            except (exception.exception.ComputeResourceNotFound,"},{"line_number":976,"context_line":"                    exception.NovaClientError) as e:"},{"line_number":977,"context_line":"                # Note: Does not return from here, as abort request can\u0027t be"},{"line_number":978,"context_line":"                # accepted but migration still going on."},{"line_number":979,"context_line":"                LOG.exception(e)"}],"source_content_type":"text/x-python","patch_set":24,"id":"79f81916_739a2556","line":976,"in_reply_to":"bcd11430_74c93fdb","updated":"2026-02-17 19:48:35.000000000","message":"\u003e Exception typo in nova_helper.py line 976\n\u003e \n\u003e **Severity**: WARNING | **Confidence**: 0.8\n\u003e \n\u003e **Impact**: Runtime error\n\u003e \n\u003e **Suggestion**:\n\u003e Fix exception path\n\nindeed I had a double `exception`, I\u0027ve fixed it","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"0cacc1447d7ba8e0a4d260419edebe2a4c546722","unresolved":true,"context_lines":[{"line_number":1131,"context_line":"            retry -\u003d 1"},{"line_number":1132,"context_line":"        return server.vm_state \u003d\u003d state"},{"line_number":1133,"context_line":""},{"line_number":1134,"context_line":"    def get_hostname(self, instance):"},{"line_number":1135,"context_line":"        \"\"\"Get the hostname of the compute node hosting an instance."},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":"        :param instance: Server wrapper object"}],"source_content_type":"text/x-python","patch_set":24,"id":"f53f72c2_07826523","line":1134,"range":{"start_line":1134,"start_character":8,"end_line":1134,"end_character":20},"updated":"2026-02-16 18:35:23.000000000","message":"I think that we could consider removing this method","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"da7dcb1d79964627733fe925fe9c2de1f4cc4db1","unresolved":true,"context_lines":[{"line_number":1131,"context_line":"            retry -\u003d 1"},{"line_number":1132,"context_line":"        return server.vm_state \u003d\u003d state"},{"line_number":1133,"context_line":""},{"line_number":1134,"context_line":"    def get_hostname(self, instance):"},{"line_number":1135,"context_line":"        \"\"\"Get the hostname of the compute node hosting an instance."},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":"        :param instance: Server wrapper object"}],"source_content_type":"text/x-python","patch_set":24,"id":"406872cf_cc107753","line":1134,"range":{"start_line":1134,"start_character":8,"end_line":1134,"end_character":20},"in_reply_to":"21555d67_a77f5be6","updated":"2026-02-18 14:15:50.000000000","message":"lets considert this later in the seiies but for now its fine.","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":true,"context_lines":[{"line_number":1131,"context_line":"            retry -\u003d 1"},{"line_number":1132,"context_line":"        return server.vm_state \u003d\u003d state"},{"line_number":1133,"context_line":""},{"line_number":1134,"context_line":"    def get_hostname(self, instance):"},{"line_number":1135,"context_line":"        \"\"\"Get the hostname of the compute node hosting an instance."},{"line_number":1136,"context_line":""},{"line_number":1137,"context_line":"        :param instance: Server wrapper object"}],"source_content_type":"text/x-python","patch_set":24,"id":"21555d67_a77f5be6","line":1134,"range":{"start_line":1134,"start_character":8,"end_line":1134,"end_character":20},"in_reply_to":"f53f72c2_07826523","updated":"2026-02-17 19:48:35.000000000","message":"we could, but I left it as is since it\u0027s used at least in one place in the workload_stabilization planner","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"da7dcb1d79964627733fe925fe9c2de1f4cc4db1","unresolved":false,"context_lines":[{"line_number":116,"context_line":"    availability_zone: str | None"},{"line_number":117,"context_line":"    pinned_availability_zone: str | None"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"    def __post_init__(self):"},{"line_number":120,"context_line":"        \"\"\"Validate UUID after initialization.\"\"\""},{"line_number":121,"context_line":"        try:"},{"line_number":122,"context_line":"            uuid.UUID(self.uuid)"}],"source_content_type":"text/x-python","patch_set":25,"id":"170c65a9_bb85d3dd","line":119,"in_reply_to":"25719322_78b1ba53","updated":"2026-02-18 14:15:50.000000000","message":"thanks for adding this","commit_id":"bf6c7e2e27b8c48941652e63d8f65e23e6f6a146"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"da7dcb1d79964627733fe925fe9c2de1f4cc4db1","unresolved":false,"context_lines":[{"line_number":659,"context_line":"            )"},{"line_number":660,"context_line":"            return False"},{"line_number":661,"context_line":""},{"line_number":662,"context_line":"        while instance.status !\u003d previous_status and retry:"},{"line_number":663,"context_line":"            try:"},{"line_number":664,"context_line":"                instance \u003d self.find_instance(instance_id)"},{"line_number":665,"context_line":"            except exception.ComputeResourceNotFound:"}],"source_content_type":"text/x-python","patch_set":25,"id":"b6ba88af_1f3d0880","line":662,"updated":"2026-02-18 14:15:50.000000000","message":"note to selfe this feel swrong to me but its was the prior logic so we agreed to preserve that in this chagne.\n\nthere might be a bug here but we can revisti this later","commit_id":"bf6c7e2e27b8c48941652e63d8f65e23e6f6a146"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"da7dcb1d79964627733fe925fe9c2de1f4cc4db1","unresolved":true,"context_lines":[{"line_number":903,"context_line":"        # NOTE: If destination host is not specified for live migration"},{"line_number":904,"context_line":"        # let nova scheduler choose the destination host."},{"line_number":905,"context_line":"        if dest_hostname is None:"},{"line_number":906,"context_line":"            while (instance.status not in [\u0027ACTIVE\u0027, \u0027ERROR\u0027] and retry):"},{"line_number":907,"context_line":"                try:"},{"line_number":908,"context_line":"                    instance \u003d self.find_instance(instance_id)"},{"line_number":909,"context_line":"                except exception.ComputeResourceNotFound:"}],"source_content_type":"text/x-python","patch_set":25,"id":"fdbe24ba_053c58ae","line":906,"range":{"start_line":906,"start_character":11,"end_line":906,"end_character":73},"updated":"2026-02-18 14:15:50.000000000","message":"we do something like this often so we shoudl add a helper for this in a followup","commit_id":"bf6c7e2e27b8c48941652e63d8f65e23e6f6a146"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"da7dcb1d79964627733fe925fe9c2de1f4cc4db1","unresolved":true,"context_lines":[{"line_number":926,"context_line":"            else:"},{"line_number":927,"context_line":"                return False"},{"line_number":928,"context_line":""},{"line_number":929,"context_line":"        while instance.host !\u003d dest_hostname and retry:"},{"line_number":930,"context_line":"            try:"},{"line_number":931,"context_line":"                instance \u003d self.find_instance(instance_id)"},{"line_number":932,"context_line":"            except exception.ComputeResourceNotFound:"}],"source_content_type":"text/x-python","patch_set":25,"id":"c3d99a7f_2e0a0ec3","line":929,"updated":"2026-02-18 14:15:50.000000000","message":"i would be nice to have a helper for generic retyl loops in genreal as well but again that can be a future improvment.","commit_id":"bf6c7e2e27b8c48941652e63d8f65e23e6f6a146"}],"watcher/decision_engine/strategy/strategies/zone_migration.py":[{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from oslo_utils import timeutils"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from cinderclient.v3.volumes import Volume"},{"line_number":19,"context_line":"from novaclient.v2.servers import Server"},{"line_number":20,"context_line":"from watcher._i18n import _"},{"line_number":21,"context_line":"from watcher.common import cinder_helper"},{"line_number":22,"context_line":"from watcher.common import nova_helper"}],"source_content_type":"text/x-python","patch_set":24,"id":"33cc4d10_e2a3b33e","line":19,"in_reply_to":"664a9a4d_47944c3f","updated":"2026-02-17 19:48:35.000000000","message":"\u003e Server import collision in zone_migration.py\n\u003e \n\u003e **Severity**: WARNING | **Confidence**: 0.9\n\u003e \n\u003e **Impact**: Type confusion\n\u003e \n\u003e **Suggestion**:\n\u003e Use alias for Server import\nFixed, this import is no longer needed, since it uses a `nova_helper.Server` instead.","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"}],"watcher/tests/unit/applier/actions/test_migration.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5ef722f42b471529be76a4b9477939508ddfd836","unresolved":true,"context_lines":[{"line_number":18,"context_line":"import jsonschema"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from novaclient.v2 import hypervisors"},{"line_number":21,"context_line":"from novaclient.v2 import servers"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from watcher.applier.actions import base as baction"},{"line_number":24,"context_line":"from watcher.applier.actions import migration"}],"source_content_type":"text/x-python","patch_set":11,"id":"a268b2f6_49b4c95f","side":"PARENT","line":21,"updated":"2026-02-09 18:28:10.000000000","message":"it is nice that we can start removign these inprot before we actully start replacing the logic with the sdk","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"a44632df7fe4c4cdafe9f0fbdd19bf09b40bf246","unresolved":false,"context_lines":[{"line_number":18,"context_line":"import jsonschema"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from novaclient.v2 import hypervisors"},{"line_number":21,"context_line":"from novaclient.v2 import servers"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"from watcher.applier.actions import base as baction"},{"line_number":24,"context_line":"from watcher.applier.actions import migration"}],"source_content_type":"text/x-python","patch_set":11,"id":"44a372f7_cb8ec35b","side":"PARENT","line":21,"in_reply_to":"a268b2f6_49b4c95f","updated":"2026-02-10 13:02:14.000000000","message":"Acknowledged","commit_id":"fa4e3d8a350111ad2337bdc5d7c79b3fc562e7aa"}],"watcher/tests/unit/applier/workflow_engine/test_taskflow_action_container.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5ef722f42b471529be76a4b9477939508ddfd836","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    def test_execute_with_failed_execute(self):"},{"line_number":68,"context_line":"        nova_util \u003d nova_helper.NovaHelper()"},{"line_number":69,"context_line":"        instance \u003d \"31b9dd5c-b1fd-4f61-9b68-a47096326dac\""},{"line_number":70,"context_line":"        nova_util.nova.servers.get.side_effect \u003d ["},{"line_number":71,"context_line":"            test_utils.create_nova_server(id\u003dinstance),"},{"line_number":72,"context_line":"            nvexceptions.NotFound(\"404\")"},{"line_number":73,"context_line":"        ]"},{"line_number":74,"context_line":"        action_plan \u003d obj_utils.create_test_action_plan("},{"line_number":75,"context_line":"            self.context, audit_id\u003dself.audit.id,"},{"line_number":76,"context_line":"            strategy_id\u003dself.strategy.id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"da94359f_5a39e776","line":73,"range":{"start_line":70,"start_character":8,"end_line":73,"end_character":9},"updated":"2026-02-09 18:28:10.000000000","message":"so in general the desion engine and appler shoudl nto be using nvoa client directly\n\nso the fact that you are mocking nova_util.nova. actully is indiecation this test is mockign too deeply for this to still be considered a unit test.\n\n\nthis shoudl proably be mockign find_isntance or we shoudl ahve a server_list funciton on the helper.\n\nhttps://github.com/openstack/watcher/blob/master/watcher/common/nova_helper.py#L181-L183\n\n\nwe do not need to fix that now but we shoudl not see any  nova_util.nova.* mocking in these unit tests in genreal.\n\n\nthe fact we are doign\n\n@mock.patch.object(clients.OpenStackClients, \u0027nova\u0027, mock.Mock()) \nis also kind of a redflag for unit tests sicne this test shoudl only be testing the logic in \n\nhttps://github.com/openstack/watcher/blob/master/watcher/applier/workflow_engine/default.py#L155-L169\n\nthere is litrally no point in that fucntio that shoudl ever call the nova client. or use an isntnace.\n\nthat is requried only because we tryign to use the migrate action but we coudl have still used the nop action for this test or a mock that woudl jsut have an execute function that returns none.\n\nthat a bit off topic but this test has a bunch fo complexity that shoudl not exist which is adding no acutal value.","commit_id":"dcf06dcd3518af19d791539e68b4a8568b15645f"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"da7dcb1d79964627733fe925fe9c2de1f4cc4db1","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    def test_execute_with_failed_execute(self):"},{"line_number":68,"context_line":"        nova_util \u003d nova_helper.NovaHelper()"},{"line_number":69,"context_line":"        instance \u003d \"31b9dd5c-b1fd-4f61-9b68-a47096326dac\""},{"line_number":70,"context_line":"        nova_util.nova.servers.get.side_effect \u003d ["},{"line_number":71,"context_line":"            test_utils.create_nova_server(id\u003dinstance),"},{"line_number":72,"context_line":"            nvexceptions.NotFound(\"404\")"},{"line_number":73,"context_line":"        ]"},{"line_number":74,"context_line":"        action_plan \u003d obj_utils.create_test_action_plan("},{"line_number":75,"context_line":"            self.context, audit_id\u003dself.audit.id,"},{"line_number":76,"context_line":"            strategy_id\u003dself.strategy.id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"1b6f6bd0_f1eeeef0","line":73,"range":{"start_line":70,"start_character":8,"end_line":73,"end_character":9},"in_reply_to":"6038be05_539cde68","updated":"2026-02-18 14:15:50.000000000","message":"Acknowledged","commit_id":"dcf06dcd3518af19d791539e68b4a8568b15645f"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"a44632df7fe4c4cdafe9f0fbdd19bf09b40bf246","unresolved":true,"context_lines":[{"line_number":67,"context_line":"    def test_execute_with_failed_execute(self):"},{"line_number":68,"context_line":"        nova_util \u003d nova_helper.NovaHelper()"},{"line_number":69,"context_line":"        instance \u003d \"31b9dd5c-b1fd-4f61-9b68-a47096326dac\""},{"line_number":70,"context_line":"        nova_util.nova.servers.get.side_effect \u003d ["},{"line_number":71,"context_line":"            test_utils.create_nova_server(id\u003dinstance),"},{"line_number":72,"context_line":"            nvexceptions.NotFound(\"404\")"},{"line_number":73,"context_line":"        ]"},{"line_number":74,"context_line":"        action_plan \u003d obj_utils.create_test_action_plan("},{"line_number":75,"context_line":"            self.context, audit_id\u003dself.audit.id,"},{"line_number":76,"context_line":"            strategy_id\u003dself.strategy.id,"}],"source_content_type":"text/x-python","patch_set":11,"id":"6038be05_539cde68","line":73,"range":{"start_line":70,"start_character":8,"end_line":73,"end_character":9},"in_reply_to":"da94359f_5a39e776","updated":"2026-02-10 13:02:14.000000000","message":"agreed, I did only the changes required to keep it green because the patches in this chain are already big enough without trying to fix more not strictly related issues.","commit_id":"dcf06dcd3518af19d791539e68b4a8568b15645f"}],"watcher/tests/unit/common/test_nova_helper.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"f5cc3db6076c429f61d6e3ae89ac05c3c458cc67","unresolved":true,"context_lines":[{"line_number":78,"context_line":"            hypervisors.HypervisorManager, info\u003dhypervisor_info)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    @staticmethod"},{"line_number":81,"context_line":"    def fake_migration(*args, **kwargs):"},{"line_number":82,"context_line":"        migration \u003d mock.MagicMock()"},{"line_number":83,"context_line":"        migration.id \u003d args[0]"},{"line_number":84,"context_line":"        return migration"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    @staticmethod"},{"line_number":87,"context_line":"    def fake_nova_find_list(nova_util, fake_find\u003dNone, fake_list\u003dNone):"}],"source_content_type":"text/x-python","patch_set":14,"id":"2ecc04dc_09ae86cc","side":"PARENT","line":84,"range":{"start_line":81,"start_character":0,"end_line":84,"end_character":24},"updated":"2026-01-30 16:27:58.000000000","message":"we could switch to the create_nova_migration you added in test/common/utils instead and get rid of this?","commit_id":"6e92c2e959be536080a830f97e3d9a1654ef8e12"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"63e24cfa4683362be80551c2d8269ee1273fdc66","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            hypervisors.HypervisorManager, info\u003dhypervisor_info)"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"    @staticmethod"},{"line_number":81,"context_line":"    def fake_migration(*args, **kwargs):"},{"line_number":82,"context_line":"        migration \u003d mock.MagicMock()"},{"line_number":83,"context_line":"        migration.id \u003d args[0]"},{"line_number":84,"context_line":"        return migration"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"    @staticmethod"},{"line_number":87,"context_line":"    def fake_nova_find_list(nova_util, fake_find\u003dNone, fake_list\u003dNone):"}],"source_content_type":"text/x-python","patch_set":14,"id":"5345d6cb_c2b5527d","side":"PARENT","line":84,"range":{"start_line":81,"start_character":0,"end_line":84,"end_character":24},"in_reply_to":"2ecc04dc_09ae86cc","updated":"2026-02-02 14:50:16.000000000","message":"yes, I missed that one, fixed now, thanks!","commit_id":"6e92c2e959be536080a830f97e3d9a1654ef8e12"}],"watcher/tests/unit/common/utils.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"5ef722f42b471529be76a4b9477939508ddfd836","unresolved":true,"context_lines":[{"line_number":31,"context_line":"        :returns: novaclient.v2.servers.Server object"},{"line_number":32,"context_line":"        \"\"\""},{"line_number":33,"context_line":"        server_info \u003d {"},{"line_number":34,"context_line":"            \u0027id\u0027: kwargs.pop(\u0027id\u0027, \u0027test_id\u0027),"},{"line_number":35,"context_line":"            \u0027name\u0027: kwargs.pop(\u0027name\u0027, \u0027test-server\u0027),"},{"line_number":36,"context_line":"            \u0027status\u0027: kwargs.pop(\u0027status\u0027, \u0027ACTIVE\u0027),"},{"line_number":37,"context_line":"            \u0027created\u0027: kwargs.pop(\u0027created\u0027, \u00272026-01-09T12:00:00Z\u0027),"}],"source_content_type":"text/x-python","patch_set":14,"id":"65b3f48b_fcea08f4","line":34,"range":{"start_line":34,"start_character":36,"end_line":34,"end_character":43},"updated":"2026-02-09 18:28:10.000000000","message":"this should be a uuid","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"a44632df7fe4c4cdafe9f0fbdd19bf09b40bf246","unresolved":true,"context_lines":[{"line_number":31,"context_line":"        :returns: novaclient.v2.servers.Server object"},{"line_number":32,"context_line":"        \"\"\""},{"line_number":33,"context_line":"        server_info \u003d {"},{"line_number":34,"context_line":"            \u0027id\u0027: kwargs.pop(\u0027id\u0027, \u0027test_id\u0027),"},{"line_number":35,"context_line":"            \u0027name\u0027: kwargs.pop(\u0027name\u0027, \u0027test-server\u0027),"},{"line_number":36,"context_line":"            \u0027status\u0027: kwargs.pop(\u0027status\u0027, \u0027ACTIVE\u0027),"},{"line_number":37,"context_line":"            \u0027created\u0027: kwargs.pop(\u0027created\u0027, \u00272026-01-09T12:00:00Z\u0027),"}],"source_content_type":"text/x-python","patch_set":14,"id":"f92b12a4_e1ab51c3","line":34,"range":{"start_line":34,"start_character":36,"end_line":34,"end_character":43},"in_reply_to":"65b3f48b_fcea08f4","updated":"2026-02-10 13:02:14.000000000","message":"right, I changed the default to be a uuid","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ce5e8d636f5355e7d2a7f93692f5295007b5bf66","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        :returns: novaclient.v2.servers.Server object"},{"line_number":32,"context_line":"        \"\"\""},{"line_number":33,"context_line":"        server_info \u003d {"},{"line_number":34,"context_line":"            \u0027id\u0027: kwargs.pop(\u0027id\u0027, \u0027test_id\u0027),"},{"line_number":35,"context_line":"            \u0027name\u0027: kwargs.pop(\u0027name\u0027, \u0027test-server\u0027),"},{"line_number":36,"context_line":"            \u0027status\u0027: kwargs.pop(\u0027status\u0027, \u0027ACTIVE\u0027),"},{"line_number":37,"context_line":"            \u0027created\u0027: kwargs.pop(\u0027created\u0027, \u00272026-01-09T12:00:00Z\u0027),"}],"source_content_type":"text/x-python","patch_set":14,"id":"f1bcfaf5_0bf91c01","line":34,"range":{"start_line":34,"start_character":36,"end_line":34,"end_character":43},"in_reply_to":"f92b12a4_e1ab51c3","updated":"2026-02-12 16:46:11.000000000","message":"Done","commit_id":"2da26d2117f7155d42dd4cbddd6314ffc62babda"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"da7dcb1d79964627733fe925fe9c2de1f4cc4db1","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class NovaResourcesMixin:"},{"line_number":27,"context_line":"    def create_nova_server(self, **kwargs):"},{"line_number":28,"context_line":"        \"\"\"Create a real novaclient Server object."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param kwargs: additional server attributes"}],"source_content_type":"text/x-python","patch_set":21,"id":"de318e65_784a8ad4","line":27,"in_reply_to":"8bdd5925_5fca5f34","updated":"2026-02-18 14:15:50.000000000","message":"Done","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"ce5e8d636f5355e7d2a7f93692f5295007b5bf66","unresolved":true,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class NovaResourcesMixin:"},{"line_number":27,"context_line":"    def create_nova_server(self, **kwargs):"},{"line_number":28,"context_line":"        \"\"\"Create a real novaclient Server object."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param kwargs: additional server attributes"}],"source_content_type":"text/x-python","patch_set":21,"id":"8bdd5925_5fca5f34","line":27,"in_reply_to":"cdb451c4_98fd54c6","updated":"2026-02-12 16:46:11.000000000","message":"ack, I\u0027ve moved the uuid check to the __post_init__","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"06c9a9433350ce6f66af0e6c369c014683460bc2","unresolved":true,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class NovaResourcesMixin:"},{"line_number":27,"context_line":"    def create_nova_server(self, **kwargs):"},{"line_number":28,"context_line":"        \"\"\"Create a real novaclient Server object."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"        :param kwargs: additional server attributes"}],"source_content_type":"text/x-python","patch_set":21,"id":"cdb451c4_98fd54c6","line":27,"in_reply_to":"f5fe7612_d7103217","updated":"2026-02-11 18:40:27.000000000","message":"we can kill 2 birds with oen stone by adding \n\n`def __post_init__(self):` function to do the validation to the dataclass defintions\n\nthat would be the better approch.","commit_id":"abfbf62743e34ebf00e827447457cd6a9d98e559"}],"watcher/tests/unit/decision_engine/model/gnocchi_metrics.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"de7f28ad0968d32441840b18a657c813197a6379","unresolved":true,"context_lines":[{"line_number":217,"context_line":"        mock \u003d {}"},{"line_number":218,"context_line":"        # node 0"},{"line_number":219,"context_line":"        mock[\u0027d000ef1f-dc19-4982-9383-087498bfde03\u0027] \u003d 7"},{"line_number":220,"context_line":"        mock[\u0027INSTANCE_0\u0027] \u003d 7"},{"line_number":221,"context_line":"        mock[\u0027d010ef1f-dc19-4982-9383-087498bfde03\u0027] \u003d 7"},{"line_number":222,"context_line":"        # node 1"},{"line_number":223,"context_line":"        mock[\u0027d020ef1f-dc19-4982-9383-087498bfde03\u0027] \u003d 10"}],"source_content_type":"text/x-python","patch_set":24,"id":"a59d2dd4_2c669f03","line":220,"updated":"2026-02-17 17:08:08.000000000","message":"I think we can remove this line?","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"1360fa1f1e000bb08610f4e895fc550f009ad2a8","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        mock \u003d {}"},{"line_number":218,"context_line":"        # node 0"},{"line_number":219,"context_line":"        mock[\u0027d000ef1f-dc19-4982-9383-087498bfde03\u0027] \u003d 7"},{"line_number":220,"context_line":"        mock[\u0027INSTANCE_0\u0027] \u003d 7"},{"line_number":221,"context_line":"        mock[\u0027d010ef1f-dc19-4982-9383-087498bfde03\u0027] \u003d 7"},{"line_number":222,"context_line":"        # node 1"},{"line_number":223,"context_line":"        mock[\u0027d020ef1f-dc19-4982-9383-087498bfde03\u0027] \u003d 10"}],"source_content_type":"text/x-python","patch_set":24,"id":"a4ff3561_e2e672ca","line":220,"in_reply_to":"390003a1_e19c8ecc","updated":"2026-02-18 10:20:07.000000000","message":"thanks, got it.","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":true,"context_lines":[{"line_number":217,"context_line":"        mock \u003d {}"},{"line_number":218,"context_line":"        # node 0"},{"line_number":219,"context_line":"        mock[\u0027d000ef1f-dc19-4982-9383-087498bfde03\u0027] \u003d 7"},{"line_number":220,"context_line":"        mock[\u0027INSTANCE_0\u0027] \u003d 7"},{"line_number":221,"context_line":"        mock[\u0027d010ef1f-dc19-4982-9383-087498bfde03\u0027] \u003d 7"},{"line_number":222,"context_line":"        # node 1"},{"line_number":223,"context_line":"        mock[\u0027d020ef1f-dc19-4982-9383-087498bfde03\u0027] \u003d 10"}],"source_content_type":"text/x-python","patch_set":24,"id":"390003a1_e19c8ecc","line":220,"in_reply_to":"a59d2dd4_2c669f03","updated":"2026-02-17 19:48:35.000000000","message":"not quite. I did not change all the fake scenario to use actual uuids, only those that were used in tests were Server or Hypervisor objects would be created. This function is used by other tests that used the old fake ids. I did not want  to change all the fake scenarios to avoid making this change even bigger. We could do that as a follow up at the end of the chain","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"}],"watcher/tests/unit/decision_engine/model/monasca_metrics.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"de7f28ad0968d32441840b18a657c813197a6379","unresolved":true,"context_lines":[{"line_number":97,"context_line":"        uuid \u003d resource.uuid"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        measurements \u003d {}"},{"line_number":100,"context_line":"        # node 0"},{"line_number":101,"context_line":"        measurements[\u0027INSTANCE_0\u0027] \u003d 7"},{"line_number":102,"context_line":"        measurements[\u0027d000ef1f-dc19-4982-9383-087498bfde03\u0027] \u003d 7"},{"line_number":103,"context_line":"        measurements[\u0027d010ef1f-dc19-4982-9383-087498bfde03\u0027] \u003d 7"}],"source_content_type":"text/x-python","patch_set":24,"id":"9bb2aff9_3f257395","line":100,"updated":"2026-02-17 17:08:08.000000000","message":"remove this?","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"1360fa1f1e000bb08610f4e895fc550f009ad2a8","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        uuid \u003d resource.uuid"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        measurements \u003d {}"},{"line_number":100,"context_line":"        # node 0"},{"line_number":101,"context_line":"        measurements[\u0027INSTANCE_0\u0027] \u003d 7"},{"line_number":102,"context_line":"        measurements[\u0027d000ef1f-dc19-4982-9383-087498bfde03\u0027] \u003d 7"},{"line_number":103,"context_line":"        measurements[\u0027d010ef1f-dc19-4982-9383-087498bfde03\u0027] \u003d 7"}],"source_content_type":"text/x-python","patch_set":24,"id":"2c6d2f61_91d4a15d","line":100,"in_reply_to":"8dac9ca1_e67ead9c","updated":"2026-02-18 10:20:07.000000000","message":"Acknowledged","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"251697ff3c8ac7a7231f0eba831c5fea8eb73c2c","unresolved":true,"context_lines":[{"line_number":97,"context_line":"        uuid \u003d resource.uuid"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"        measurements \u003d {}"},{"line_number":100,"context_line":"        # node 0"},{"line_number":101,"context_line":"        measurements[\u0027INSTANCE_0\u0027] \u003d 7"},{"line_number":102,"context_line":"        measurements[\u0027d000ef1f-dc19-4982-9383-087498bfde03\u0027] \u003d 7"},{"line_number":103,"context_line":"        measurements[\u0027d010ef1f-dc19-4982-9383-087498bfde03\u0027] \u003d 7"}],"source_content_type":"text/x-python","patch_set":24,"id":"8dac9ca1_e67ead9c","line":100,"in_reply_to":"9bb2aff9_3f257395","updated":"2026-02-17 19:48:35.000000000","message":"same as above, this is still used by tests using a fake model not modified","commit_id":"d7567812c984b65fc8da34c3279cb8b17db01353"}]}
