)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"31656fe4d12a999be00c75cadf3495234bd71bb8","unresolved":true,"context_lines":[{"line_number":23,"context_line":"TODO:"},{"line_number":24,"context_line":"  1. Add more unit tests to cover new coded added"},{"line_number":25,"context_line":"  2. Add a release note"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Change-Id: I7969e1ee295c2c625fbfc1f2acdee13ddd82e7dd"},{"line_number":28,"context_line":"Signed-off-by: Douglas Viroel \u003cviroel@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"99607e14_27b53d2c","line":26,"updated":"2025-11-26 20:52:47.000000000","message":"Assisted-By: ...","commit_id":"35128dfd067430172eadd007e1946d5a12fc00fe"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2de239b018f5370a7fcff85b08acc52e9c98f45c","unresolved":false,"context_lines":[{"line_number":23,"context_line":"TODO:"},{"line_number":24,"context_line":"  1. Add more unit tests to cover new coded added"},{"line_number":25,"context_line":"  2. Add a release note"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Change-Id: I7969e1ee295c2c625fbfc1f2acdee13ddd82e7dd"},{"line_number":28,"context_line":"Signed-off-by: Douglas Viroel \u003cviroel@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"bbaea3b1_1e6e9e3f","line":26,"in_reply_to":"99607e14_27b53d2c","updated":"2026-01-26 12:59:12.000000000","message":"Done","commit_id":"35128dfd067430172eadd007e1946d5a12fc00fe"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"31656fe4d12a999be00c75cadf3495234bd71bb8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"66953da1_4969001a","updated":"2025-11-26 20:52:47.000000000","message":"Still wip","commit_id":"35128dfd067430172eadd007e1946d5a12fc00fe"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"d9482df68225365999ca3ae55d5b996296411fd0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"9524427d_554f7503","updated":"2025-12-05 09:28:04.000000000","message":"LGTM, Thanks!","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"c10cfd1faded8449b3315f2b75d9c183dfd6f2a7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"ac016016_5f13ef1c","updated":"2026-01-05 11:27:08.000000000","message":"lgtm, thanks!","commit_id":"dbfba3f247f75182e25717499f68d95d261d3e44"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8fba8566fe91095e449769ec707b116cc15cdb9d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"edf3ca54_4da88088","updated":"2026-02-09 20:32:20.000000000","message":"i think this is ok to move forward with","commit_id":"229bce2a91e904dfabf99cdb56272c334943e4a4"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"10a2e777414c98f908dcaad657185ec60b8dbbe1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"1e993834_e42eb39f","updated":"2026-02-11 13:33:06.000000000","message":"recheck\n\ngrenade job is back to green [1]\n\n[1] https://zuul.opendev.org/t/openstack/builds?job_name\u003dwatcher-grenade\u0026project\u003dopenstack/watcher","commit_id":"229bce2a91e904dfabf99cdb56272c334943e4a4"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"5aebb307bc6359da2c527a28b378aa5db34e6672","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"adbcde70_f9c94f39","updated":"2026-02-11 17:44:02.000000000","message":"recheck\n\nin aethos job, compute-1 n-cpu failed with:\n\"\u0027Failed to connect to libvirt: Cannot recv data: Connection reset by peer\u0027\"","commit_id":"229bce2a91e904dfabf99cdb56272c334943e4a4"}],"releasenotes/notes/remove-evenlet-timeout-cdm-7f8761c92bbca808.yaml":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2de239b018f5370a7fcff85b08acc52e9c98f45c","unresolved":true,"context_lines":[{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The previous collector operation timeout mechanism, which was based on the"},{"line_number":5,"context_line":"    ``period`` configuration option, has been replaced by a new configuratio"},{"line_number":6,"context_line":"    option `resources_collector_timeout`. This new configuration option"},{"line_number":7,"context_line":"    provides more explicit control over the timeout for resource collection"},{"line_number":8,"context_line":"    operations in the Compute Cluster Data Model. Operators should review and"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"14acc046_80090915","line":5,"range":{"start_line":5,"start_character":64,"end_line":5,"end_character":76},"updated":"2026-01-26 12:59:12.000000000","message":"```suggestion\n    ``period`` configuration option, has been replaced by a new configuration\n```","commit_id":"dbfba3f247f75182e25717499f68d95d261d3e44"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"42dc47cae5b08d055f8d6fd24bf8357f1ecb4b08","unresolved":false,"context_lines":[{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The previous collector operation timeout mechanism, which was based on the"},{"line_number":5,"context_line":"    ``period`` configuration option, has been replaced by a new configuratio"},{"line_number":6,"context_line":"    option `resources_collector_timeout`. This new configuration option"},{"line_number":7,"context_line":"    provides more explicit control over the timeout for resource collection"},{"line_number":8,"context_line":"    operations in the Compute Cluster Data Model. Operators should review and"}],"source_content_type":"text/x-yaml","patch_set":3,"id":"2fda361d_605e0384","line":5,"range":{"start_line":5,"start_character":64,"end_line":5,"end_character":76},"in_reply_to":"14acc046_80090915","updated":"2026-01-26 14:06:37.000000000","message":"Done. Fixed in PS5","commit_id":"dbfba3f247f75182e25717499f68d95d261d3e44"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"698d6ab09f77a6c8d6d5e8ae38b84d9e09bb7966","unresolved":false,"context_lines":[{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The previous collector operation timeout mechanism, which was based on the"},{"line_number":5,"context_line":"    ``period`` configuration option, has been replaced by a new configuratio"},{"line_number":6,"context_line":"    option `resources_collector_timeout`. This new configuration option"},{"line_number":7,"context_line":"    provides more explicit control over the timeout for resource collection"},{"line_number":8,"context_line":"    operations in the Compute Cluster Data Model. Operators should review and"}],"source_content_type":"text/x-yaml","patch_set":4,"id":"e816e8e5_d5227c52","line":5,"in_reply_to":"708386f7_d5802603","updated":"2026-01-26 11:43:22.000000000","message":"\u003e Release note contains a typo in configuration option name\n\u003e \n\u003e **Severity**: WARNING | **Confidence**: 0.9\n\u003e \n\u003e **Impact**: Documentation clarity for operators deploying the change\n\u003e \n\u003e **Suggestion**:\n\u003e Fix the typo from \u0027period```\u0027 to \u0027period\u0027 and \u0027configuratio\u0027 to \u0027configuration\u0027 in the release note to improve documentation quality and prevent operator confusion.\n\ndone","commit_id":"c7e0589c60f0130ebe8d40c989421518b5d892e2"}],"watcher/conf/collector.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fd69be86e3e24032c99fa7ad8b11bfc0883ca6f8","unresolved":false,"context_lines":[{"line_number":47,"context_line":"               help\u003d\"Time before retry after failed query to \""},{"line_number":48,"context_line":"                    \"external service.\","},{"line_number":49,"context_line":"               deprecated_name\u003d\"api_query_timeout\"),"},{"line_number":50,"context_line":"    cfg.IntOpt(\"compute_resources_collector_timeout\","},{"line_number":51,"context_line":"               min\u003d30,"},{"line_number":52,"context_line":"               default\u003d600,"},{"line_number":53,"context_line":"               help\u003d\"Timeout in seconds for collecting multiple compute \""}],"source_content_type":"text/x-python","patch_set":7,"id":"42367239_ddcb7ae3","line":50,"in_reply_to":"4256f995_c5c0513d","updated":"2026-02-09 18:26:01.000000000","message":"i really need to make time to add refence info for oslo config.\n\nanyway you have min\u003d30 so this is validated and we intentionlly dont want a max value","commit_id":"fc657f718ff520f1364e67488ff1f815a412a469"}],"watcher/decision_engine/model/collector/base.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8fba8566fe91095e449769ec707b116cc15cdb9d","unresolved":false,"context_lines":[{"line_number":190,"context_line":"        Whenever called this synchronization will perform a drop-in replacement"},{"line_number":191,"context_line":"        with the existing cluster data model"},{"line_number":192,"context_line":"        \"\"\""},{"line_number":193,"context_line":"        try:"},{"line_number":194,"context_line":"            self.cluster_data_model \u003d self.execute()"},{"line_number":195,"context_line":"        except Exception as e:"},{"line_number":196,"context_line":"            LOG.exception(e)"}],"source_content_type":"text/x-python","patch_set":9,"id":"a62518b9_e6d26522","line":193,"in_reply_to":"03f6b539_485397aa","updated":"2026-02-09 20:32:20.000000000","message":"in general yes this is valid\nwe could document that we are intetially catching all expcton and dealing with it by marking the data model as stable bu tim ok with the current code","commit_id":"229bce2a91e904dfabf99cdb56272c334943e4a4"}],"watcher/decision_engine/model/collector/cinder.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2de239b018f5370a7fcff85b08acc52e9c98f45c","unresolved":true,"context_lines":[{"line_number":158,"context_line":"            return builder.execute(self._data_model_scope)"},{"line_number":159,"context_line":"        except Exception as e:"},{"line_number":160,"context_line":"            LOG.exception(e)"},{"line_number":161,"context_line":"            raise exception.ClusterDataModelCollectionError("},{"line_number":162,"context_line":"                cdm\u003d\"storage\")"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"class CinderModelBuilder(base.BaseModelBuilder):"}],"source_content_type":"text/x-python","patch_set":3,"id":"6fc4300e_d0b43000","line":162,"range":{"start_line":161,"start_character":0,"end_line":162,"end_character":30},"updated":"2026-01-26 12:59:12.000000000","message":"nit: https://docs.python.org/3/tutorial/errors.html#exception-chaining\n\n\n```suggestion\n            raise exception.ClusterDataModelCollectionError(\n                cdm\u003d\"storage\") from e\n```","commit_id":"dbfba3f247f75182e25717499f68d95d261d3e44"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cfd7db268d3d3a69ad11efdceea156d9fc5d7c32","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            return builder.execute(self._data_model_scope)"},{"line_number":159,"context_line":"        except Exception as e:"},{"line_number":160,"context_line":"            LOG.exception(e)"},{"line_number":161,"context_line":"            raise exception.ClusterDataModelCollectionError("},{"line_number":162,"context_line":"                cdm\u003d\"storage\")"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"class CinderModelBuilder(base.BaseModelBuilder):"}],"source_content_type":"text/x-python","patch_set":3,"id":"610453de_4363074a","line":162,"range":{"start_line":161,"start_character":0,"end_line":162,"end_character":30},"in_reply_to":"22437501_4ee1a2dd","updated":"2026-02-05 13:15:27.000000000","message":"Done","commit_id":"dbfba3f247f75182e25717499f68d95d261d3e44"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"42dc47cae5b08d055f8d6fd24bf8357f1ecb4b08","unresolved":true,"context_lines":[{"line_number":158,"context_line":"            return builder.execute(self._data_model_scope)"},{"line_number":159,"context_line":"        except Exception as e:"},{"line_number":160,"context_line":"            LOG.exception(e)"},{"line_number":161,"context_line":"            raise exception.ClusterDataModelCollectionError("},{"line_number":162,"context_line":"                cdm\u003d\"storage\")"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"class CinderModelBuilder(base.BaseModelBuilder):"}],"source_content_type":"text/x-python","patch_set":3,"id":"22437501_4ee1a2dd","line":162,"range":{"start_line":161,"start_character":0,"end_line":162,"end_character":30},"in_reply_to":"6fc4300e_d0b43000","updated":"2026-01-26 14:06:37.000000000","message":"ack, make sense, I will update in the next ps","commit_id":"dbfba3f247f75182e25717499f68d95d261d3e44"}],"watcher/decision_engine/model/collector/ironic.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2de239b018f5370a7fcff85b08acc52e9c98f45c","unresolved":true,"context_lines":[{"line_number":73,"context_line":"        except Exception as e:"},{"line_number":74,"context_line":"            LOG.exception(e)"},{"line_number":75,"context_line":"            raise exception.ClusterDataModelCollectionError("},{"line_number":76,"context_line":"                cdm\u003d\"baremetal\")"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class BareMetalModelBuilder(base.BaseModelBuilder):"}],"source_content_type":"text/x-python","patch_set":3,"id":"4c9f2ed8_0a4a1a2d","line":76,"updated":"2026-01-26 12:59:12.000000000","message":"same here we shoudl proabluy use exepction chaing for better debuging by addign from e","commit_id":"dbfba3f247f75182e25717499f68d95d261d3e44"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cfd7db268d3d3a69ad11efdceea156d9fc5d7c32","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        except Exception as e:"},{"line_number":74,"context_line":"            LOG.exception(e)"},{"line_number":75,"context_line":"            raise exception.ClusterDataModelCollectionError("},{"line_number":76,"context_line":"                cdm\u003d\"baremetal\")"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class BareMetalModelBuilder(base.BaseModelBuilder):"}],"source_content_type":"text/x-python","patch_set":3,"id":"87c1b56f_008c7ed0","line":76,"in_reply_to":"05b1f9af_452b7780","updated":"2026-02-05 13:15:27.000000000","message":"Done","commit_id":"dbfba3f247f75182e25717499f68d95d261d3e44"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"42dc47cae5b08d055f8d6fd24bf8357f1ecb4b08","unresolved":true,"context_lines":[{"line_number":73,"context_line":"        except Exception as e:"},{"line_number":74,"context_line":"            LOG.exception(e)"},{"line_number":75,"context_line":"            raise exception.ClusterDataModelCollectionError("},{"line_number":76,"context_line":"                cdm\u003d\"baremetal\")"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":""},{"line_number":79,"context_line":"class BareMetalModelBuilder(base.BaseModelBuilder):"}],"source_content_type":"text/x-python","patch_set":3,"id":"05b1f9af_452b7780","line":76,"in_reply_to":"4c9f2ed8_0a4a1a2d","updated":"2026-01-26 14:06:37.000000000","message":"Yes, thanks","commit_id":"dbfba3f247f75182e25717499f68d95d261d3e44"}],"watcher/decision_engine/model/collector/nova.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ebf0bd0b04b50f989810512e847f002e3da3645c","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        ]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    @classmethod"},{"line_number":172,"context_line":"    def get_config_opts(cls):"},{"line_number":173,"context_line":"        return super().get_config_opts() + ["},{"line_number":174,"context_line":"            cfg.IntOpt("},{"line_number":175,"context_line":"                \"resources_collector_timeout\","},{"line_number":176,"context_line":"                help\u003d\"Timeout in seconds for collecting multiple compute \""},{"line_number":177,"context_line":"                     \"resources from nova. Note that this timeout does not \""},{"line_number":178,"context_line":"                     \"represent the total time for collecting all resources.\","},{"line_number":179,"context_line":"                default\u003d600),"},{"line_number":180,"context_line":"        ]"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def get_audit_scope_handler(self, audit_scope):"},{"line_number":183,"context_line":"        self._audit_scope_handler \u003d compute_scope.ComputeScope("}],"source_content_type":"text/x-python","patch_set":2,"id":"f0e123fe_622dd7f7","line":180,"range":{"start_line":172,"start_character":0,"end_line":180,"end_character":9},"updated":"2025-11-28 09:41:57.000000000","message":"Why not adding it to collector group in https://github.com/openstack/watcher/blob/master/watcher/conf/collector.py ?\n\nPersonally, I think having all options defined under conf is more clear.","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"d9482df68225365999ca3ae55d5b996296411fd0","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        ]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    @classmethod"},{"line_number":172,"context_line":"    def get_config_opts(cls):"},{"line_number":173,"context_line":"        return super().get_config_opts() + ["},{"line_number":174,"context_line":"            cfg.IntOpt("},{"line_number":175,"context_line":"                \"resources_collector_timeout\","},{"line_number":176,"context_line":"                help\u003d\"Timeout in seconds for collecting multiple compute \""},{"line_number":177,"context_line":"                     \"resources from nova. Note that this timeout does not \""},{"line_number":178,"context_line":"                     \"represent the total time for collecting all resources.\","},{"line_number":179,"context_line":"                default\u003d600),"},{"line_number":180,"context_line":"        ]"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def get_audit_scope_handler(self, audit_scope):"},{"line_number":183,"context_line":"        self._audit_scope_handler \u003d compute_scope.ComputeScope("}],"source_content_type":"text/x-python","patch_set":2,"id":"eb42c2eb_bd924fe0","line":180,"range":{"start_line":172,"start_character":0,"end_line":180,"end_character":9},"in_reply_to":"bb26abc5_6fe78744","updated":"2025-12-05 09:28:04.000000000","message":"wfm","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"f6b1ae759740440df635945dc453fb1813e0e750","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        ]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    @classmethod"},{"line_number":172,"context_line":"    def get_config_opts(cls):"},{"line_number":173,"context_line":"        return super().get_config_opts() + ["},{"line_number":174,"context_line":"            cfg.IntOpt("},{"line_number":175,"context_line":"                \"resources_collector_timeout\","},{"line_number":176,"context_line":"                help\u003d\"Timeout in seconds for collecting multiple compute \""},{"line_number":177,"context_line":"                     \"resources from nova. Note that this timeout does not \""},{"line_number":178,"context_line":"                     \"represent the total time for collecting all resources.\","},{"line_number":179,"context_line":"                default\u003d600),"},{"line_number":180,"context_line":"        ]"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def get_audit_scope_handler(self, audit_scope):"},{"line_number":183,"context_line":"        self._audit_scope_handler \u003d compute_scope.ComputeScope("}],"source_content_type":"text/x-python","patch_set":2,"id":"edc5ea53_38498c0b","line":180,"range":{"start_line":172,"start_character":0,"end_line":180,"end_character":9},"in_reply_to":"ec50dd95_53aa5158","updated":"2025-12-01 17:09:23.000000000","message":"if the timeout applies only to the compute model I\u0027m fine keeping it here, although I think I would make a reference to that in the name, maybe a name like `compute_collector_timeout` would be better. I feel like with the current name/description the scope of the parameter could be slightly ambiguous for the end user","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"64085898b82a17b69734b13ac811e0d099732918","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        ]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    @classmethod"},{"line_number":172,"context_line":"    def get_config_opts(cls):"},{"line_number":173,"context_line":"        return super().get_config_opts() + ["},{"line_number":174,"context_line":"            cfg.IntOpt("},{"line_number":175,"context_line":"                \"resources_collector_timeout\","},{"line_number":176,"context_line":"                help\u003d\"Timeout in seconds for collecting multiple compute \""},{"line_number":177,"context_line":"                     \"resources from nova. Note that this timeout does not \""},{"line_number":178,"context_line":"                     \"represent the total time for collecting all resources.\","},{"line_number":179,"context_line":"                default\u003d600),"},{"line_number":180,"context_line":"        ]"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def get_audit_scope_handler(self, audit_scope):"},{"line_number":183,"context_line":"        self._audit_scope_handler \u003d compute_scope.ComputeScope("}],"source_content_type":"text/x-python","patch_set":2,"id":"bb26abc5_6fe78744","line":180,"range":{"start_line":172,"start_character":0,"end_line":180,"end_character":9},"in_reply_to":"edc5ea53_38498c0b","updated":"2025-12-02 11:37:02.000000000","message":"not needed in this case, because it will be on [watcher_cluster_data_model_collectors.compute] group[1].\nIf we move to collector group, all collectors will accept the paramenter, but not all will be really using it.\n\n[1] https://storage.gra.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_699/openstack/69914d83dc4f4cd9b6ae7ee8fe47563c/docs/configuration/watcher.html#watcher-cluster-data-model-collectors-compute","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"9f2f35c9b31ea815e88d81b4c5940677dc3202b1","unresolved":true,"context_lines":[{"line_number":169,"context_line":"        ]"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"    @classmethod"},{"line_number":172,"context_line":"    def get_config_opts(cls):"},{"line_number":173,"context_line":"        return super().get_config_opts() + ["},{"line_number":174,"context_line":"            cfg.IntOpt("},{"line_number":175,"context_line":"                \"resources_collector_timeout\","},{"line_number":176,"context_line":"                help\u003d\"Timeout in seconds for collecting multiple compute \""},{"line_number":177,"context_line":"                     \"resources from nova. Note that this timeout does not \""},{"line_number":178,"context_line":"                     \"represent the total time for collecting all resources.\","},{"line_number":179,"context_line":"                default\u003d600),"},{"line_number":180,"context_line":"        ]"},{"line_number":181,"context_line":""},{"line_number":182,"context_line":"    def get_audit_scope_handler(self, audit_scope):"},{"line_number":183,"context_line":"        self._audit_scope_handler \u003d compute_scope.ComputeScope("}],"source_content_type":"text/x-python","patch_set":2,"id":"ec50dd95_53aa5158","line":180,"range":{"start_line":172,"start_character":0,"end_line":180,"end_character":9},"in_reply_to":"f0e123fe_622dd7f7","updated":"2025-11-28 11:53:57.000000000","message":"it is a possibility yes, but with the current implementation, only nova collector is using it, that\u0027s why I just add it here.","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"f6b1ae759740440df635945dc453fb1813e0e750","unresolved":true,"context_lines":[{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        # Futures will concurrently be added, only safe with CPython GIL"},{"line_number":365,"context_line":"        future_instances \u003d []"},{"line_number":366,"context_line":"        self.executor.do_while_futures_modify("},{"line_number":367,"context_line":"            node_futures, self._compute_node_future, future_instances)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"        # Wait for all instance jobs to finish"}],"source_content_type":"text/x-python","patch_set":2,"id":"d2f893b1_72f0c8aa","line":366,"updated":"2025-12-01 17:09:23.000000000","message":"IIUC this calls the method in https://github.com/openstack/watcher/blob/8d6f4c954b6bc0d116accba04bb188a4f06fb816/watcher/decision_engine/threading.py#L78 which does not have any timeout, should we also add a timeout parameter there?","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"178b7ff2538f025fda03433cbbea23016c98f22d","unresolved":true,"context_lines":[{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        # Futures will concurrently be added, only safe with CPython GIL"},{"line_number":365,"context_line":"        future_instances \u003d []"},{"line_number":366,"context_line":"        self.executor.do_while_futures_modify("},{"line_number":367,"context_line":"            node_futures, self._compute_node_future, future_instances)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"        # Wait for all instance jobs to finish"}],"source_content_type":"text/x-python","patch_set":2,"id":"ed06326c_23171efb","line":366,"in_reply_to":"36fc82a2_b69e5920","updated":"2026-01-02 19:01:41.000000000","message":"changes made to do_while_futures_modify too, thanks Joan","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"64085898b82a17b69734b13ac811e0d099732918","unresolved":true,"context_lines":[{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        # Futures will concurrently be added, only safe with CPython GIL"},{"line_number":365,"context_line":"        future_instances \u003d []"},{"line_number":366,"context_line":"        self.executor.do_while_futures_modify("},{"line_number":367,"context_line":"            node_futures, self._compute_node_future, future_instances)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"        # Wait for all instance jobs to finish"}],"source_content_type":"text/x-python","patch_set":2,"id":"36fc82a2_b69e5920","line":366,"in_reply_to":"d2f893b1_72f0c8aa","updated":"2025-12-02 11:37:02.000000000","message":"we could, but inside \"do_while_futures_modify\" it is calling wait_for_any multiple times, which means that we would be using the timeout multiple times there, so it wouldn\u0027t work as documented in the conf, but at the same time, the current implementation has no timeout at all. So it may be better to add there too..","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"698d6ab09f77a6c8d6d5e8ae38b84d9e09bb7966","unresolved":false,"context_lines":[{"line_number":363,"context_line":""},{"line_number":364,"context_line":"        # Futures will concurrently be added, only safe with CPython GIL"},{"line_number":365,"context_line":"        future_instances \u003d []"},{"line_number":366,"context_line":"        self.executor.do_while_futures_modify("},{"line_number":367,"context_line":"            node_futures, self._compute_node_future, future_instances)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"        # Wait for all instance jobs to finish"}],"source_content_type":"text/x-python","patch_set":2,"id":"20653048_f1373549","line":366,"in_reply_to":"ed06326c_23171efb","updated":"2026-01-26 11:43:22.000000000","message":"Done","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2de239b018f5370a7fcff85b08acc52e9c98f45c","unresolved":true,"context_lines":[{"line_number":207,"context_line":"        except Exception as e:"},{"line_number":208,"context_line":"            LOG.exception(e)"},{"line_number":209,"context_line":"            raise exception.ClusterDataModelCollectionError("},{"line_number":210,"context_line":"                cdm\u003d\"compute\")"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"class NovaModelBuilder(base.BaseModelBuilder):"}],"source_content_type":"text/x-python","patch_set":3,"id":"82851517_6f96831c","line":210,"updated":"2026-01-26 12:59:12.000000000","message":"and here\n\nwe can treat these as nits as exepction chaingin is only avaible in python 3 so we have not really used ti widely in exsitng code but we can and shoudl use it where it will help debuing in the future.","commit_id":"dbfba3f247f75182e25717499f68d95d261d3e44"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fd69be86e3e24032c99fa7ad8b11bfc0883ca6f8","unresolved":false,"context_lines":[{"line_number":207,"context_line":"        except Exception as e:"},{"line_number":208,"context_line":"            LOG.exception(e)"},{"line_number":209,"context_line":"            raise exception.ClusterDataModelCollectionError("},{"line_number":210,"context_line":"                cdm\u003d\"compute\")"},{"line_number":211,"context_line":""},{"line_number":212,"context_line":""},{"line_number":213,"context_line":"class NovaModelBuilder(base.BaseModelBuilder):"}],"source_content_type":"text/x-python","patch_set":3,"id":"cff6337b_4e073376","line":210,"in_reply_to":"82851517_6f96831c","updated":"2026-02-09 18:26:01.000000000","message":"Done","commit_id":"dbfba3f247f75182e25717499f68d95d261d3e44"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"5707e665dadeb13254badd1f312b0929f6b700ba","unresolved":true,"context_lines":[{"line_number":171,"context_line":"    @classmethod"},{"line_number":172,"context_line":"    def get_config_opts(cls):"},{"line_number":173,"context_line":"        return super().get_config_opts() + ["},{"line_number":174,"context_line":"            cfg.IntOpt("},{"line_number":175,"context_line":"                \"resources_collector_timeout\","},{"line_number":176,"context_line":"                help\u003d\"Timeout in seconds for collecting multiple compute \""},{"line_number":177,"context_line":"                     \"resources from nova. Note that this timeout does not \""}],"source_content_type":"text/x-python","patch_set":4,"id":"4f691ac7_5aae925e","line":174,"in_reply_to":"081d0906_2cb24547","updated":"2026-01-26 14:25:02.000000000","message":"So one thing is that we can do is translate 0 to None internally, allowing collector to run without timeout.","commit_id":"c7e0589c60f0130ebe8d40c989421518b5d892e2"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"698d6ab09f77a6c8d6d5e8ae38b84d9e09bb7966","unresolved":true,"context_lines":[{"line_number":171,"context_line":"    @classmethod"},{"line_number":172,"context_line":"    def get_config_opts(cls):"},{"line_number":173,"context_line":"        return super().get_config_opts() + ["},{"line_number":174,"context_line":"            cfg.IntOpt("},{"line_number":175,"context_line":"                \"resources_collector_timeout\","},{"line_number":176,"context_line":"                help\u003d\"Timeout in seconds for collecting multiple compute \""},{"line_number":177,"context_line":"                     \"resources from nova. Note that this timeout does not \""}],"source_content_type":"text/x-python","patch_set":4,"id":"42b9a5b0_83083df1","line":174,"in_reply_to":"40f838b4_4aa0dc7f","updated":"2026-01-26 11:43:22.000000000","message":"Shouldn\u0027t be needed","commit_id":"c7e0589c60f0130ebe8d40c989421518b5d892e2"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2de239b018f5370a7fcff85b08acc52e9c98f45c","unresolved":true,"context_lines":[{"line_number":171,"context_line":"    @classmethod"},{"line_number":172,"context_line":"    def get_config_opts(cls):"},{"line_number":173,"context_line":"        return super().get_config_opts() + ["},{"line_number":174,"context_line":"            cfg.IntOpt("},{"line_number":175,"context_line":"                \"resources_collector_timeout\","},{"line_number":176,"context_line":"                help\u003d\"Timeout in seconds for collecting multiple compute \""},{"line_number":177,"context_line":"                     \"resources from nova. Note that this timeout does not \""}],"source_content_type":"text/x-python","patch_set":4,"id":"b92a3ede_12a9d8d4","line":174,"in_reply_to":"42b9a5b0_83083df1","updated":"2026-01-26 12:59:12.000000000","message":"what is hte mechanics of seting this to 0 does it disabel the collector or does it run on a default interval?\n\ni woudl consider addign min\u003d1 but we do not need a max","commit_id":"c7e0589c60f0130ebe8d40c989421518b5d892e2"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"cfd7db268d3d3a69ad11efdceea156d9fc5d7c32","unresolved":true,"context_lines":[{"line_number":171,"context_line":"    @classmethod"},{"line_number":172,"context_line":"    def get_config_opts(cls):"},{"line_number":173,"context_line":"        return super().get_config_opts() + ["},{"line_number":174,"context_line":"            cfg.IntOpt("},{"line_number":175,"context_line":"                \"resources_collector_timeout\","},{"line_number":176,"context_line":"                help\u003d\"Timeout in seconds for collecting multiple compute \""},{"line_number":177,"context_line":"                     \"resources from nova. Note that this timeout does not \""}],"source_content_type":"text/x-python","patch_set":4,"id":"c60a90e2_ceaeea4d","line":174,"in_reply_to":"4f691ac7_5aae925e","updated":"2026-02-05 13:15:27.000000000","message":"so we discussed this a bit on irc \nreading the help text i woudl be infavor of settting min\u003d30 or similar \n\ni also think we need to move this to watcher/conf/* i woudl put it in https://github.com/openstack/watcher/blob/master/watcher/conf/collector.py personlaly.\n\nteh reason we are currenly puting some cofnig option in other path is because if this was an out of tree collector that we loaded with stevador we woudl need to do that\n\nbut we already know that havign `.` in config option section is an anti pattern and breaks som etoosl and that we should eb renameing \n\nhttps://docs.openstack.org/watcher/latest/configuration/watcher.html#watcher-cluster-data-model-collectors-compute anyway\n\nso if we are addign new config option i woudl prefer to put the compute collector optoins in either the collecotr or nov sections and move the period to the same section i.e. as \n\n[collectors]\ncompute_period \u003d bla\n\nor\n \n[nova]\ncollector_period \u003d xyz","commit_id":"c7e0589c60f0130ebe8d40c989421518b5d892e2"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fd69be86e3e24032c99fa7ad8b11bfc0883ca6f8","unresolved":false,"context_lines":[{"line_number":171,"context_line":"    @classmethod"},{"line_number":172,"context_line":"    def get_config_opts(cls):"},{"line_number":173,"context_line":"        return super().get_config_opts() + ["},{"line_number":174,"context_line":"            cfg.IntOpt("},{"line_number":175,"context_line":"                \"resources_collector_timeout\","},{"line_number":176,"context_line":"                help\u003d\"Timeout in seconds for collecting multiple compute \""},{"line_number":177,"context_line":"                     \"resources from nova. Note that this timeout does not \""}],"source_content_type":"text/x-python","patch_set":4,"id":"04c639fc_4e1d7b6d","line":174,"in_reply_to":"741597ff_ee752756","updated":"2026-02-09 18:26:01.000000000","message":"Acknowledged","commit_id":"c7e0589c60f0130ebe8d40c989421518b5d892e2"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"42dc47cae5b08d055f8d6fd24bf8357f1ecb4b08","unresolved":true,"context_lines":[{"line_number":171,"context_line":"    @classmethod"},{"line_number":172,"context_line":"    def get_config_opts(cls):"},{"line_number":173,"context_line":"        return super().get_config_opts() + ["},{"line_number":174,"context_line":"            cfg.IntOpt("},{"line_number":175,"context_line":"                \"resources_collector_timeout\","},{"line_number":176,"context_line":"                help\u003d\"Timeout in seconds for collecting multiple compute \""},{"line_number":177,"context_line":"                     \"resources from nova. Note that this timeout does not \""}],"source_content_type":"text/x-python","patch_set":4,"id":"081d0906_2cb24547","line":174,"in_reply_to":"b92a3ede_12a9d8d4","updated":"2026-01-26 14:06:37.000000000","message":"By setting timeout to 0 it will return right away, there is no special treatment for 0. We also don\u0027t have a no limit option in this case, which would be timeout\u003dNone. So users would able only to define a bigger timeout here. Wdyt?","commit_id":"c7e0589c60f0130ebe8d40c989421518b5d892e2"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"551d31fcb699420862990564e7653c75c92e972b","unresolved":true,"context_lines":[{"line_number":171,"context_line":"    @classmethod"},{"line_number":172,"context_line":"    def get_config_opts(cls):"},{"line_number":173,"context_line":"        return super().get_config_opts() + ["},{"line_number":174,"context_line":"            cfg.IntOpt("},{"line_number":175,"context_line":"                \"resources_collector_timeout\","},{"line_number":176,"context_line":"                help\u003d\"Timeout in seconds for collecting multiple compute \""},{"line_number":177,"context_line":"                     \"resources from nova. Note that this timeout does not \""}],"source_content_type":"text/x-python","patch_set":4,"id":"741597ff_ee752756","line":174,"in_reply_to":"c60a90e2_ceaeea4d","updated":"2026-02-06 14:28:27.000000000","message":"I think that is fine to move to [collectors] as long each collector has its own configuration (only nova has this timeout for now). I\u0027m not in favor of adding this one in [nova] in that case, since one collector could communicate with more than one service, and a timeout/period per service seems too much in my pov.\nI agree that timeout values like 0 or 1s doesn\u0027t makes too much sense here. And checking previous implementation, there was no configuration and an option to disabled it. So for this patch I agree with setting a minimum value, but I will deffer to future discussions the possibility of disabling the timeout.","commit_id":"c7e0589c60f0130ebe8d40c989421518b5d892e2"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"698d6ab09f77a6c8d6d5e8ae38b84d9e09bb7966","unresolved":true,"context_lines":[{"line_number":341,"context_line":"            LOG.warning(\"Timed out waiting to collect compute nodes \""},{"line_number":342,"context_line":"                        \"from availability zones and host aggregates. \""},{"line_number":343,"context_line":"                        \"Aborting collection of compute nodes information\")"},{"line_number":344,"context_line":"            for future in zone_aggegate_not_done:"},{"line_number":345,"context_line":"                future.cancel()"},{"line_number":346,"context_line":"            # Return and don\u0027t continue with the collection"},{"line_number":347,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":4,"id":"d135523d_9bf9a80c","line":344,"in_reply_to":"3d25897d_6482313c","updated":"2026-01-26 11:43:22.000000000","message":"future.cancel() only return True/False but we are not interested in its return. It will cancel futures that didn\u0027t started yet.","commit_id":"c7e0589c60f0130ebe8d40c989421518b5d892e2"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2de239b018f5370a7fcff85b08acc52e9c98f45c","unresolved":false,"context_lines":[{"line_number":341,"context_line":"            LOG.warning(\"Timed out waiting to collect compute nodes \""},{"line_number":342,"context_line":"                        \"from availability zones and host aggregates. \""},{"line_number":343,"context_line":"                        \"Aborting collection of compute nodes information\")"},{"line_number":344,"context_line":"            for future in zone_aggegate_not_done:"},{"line_number":345,"context_line":"                future.cancel()"},{"line_number":346,"context_line":"            # Return and don\u0027t continue with the collection"},{"line_number":347,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":4,"id":"b063aec6_996e1fe8","line":344,"in_reply_to":"d135523d_9bf9a80c","updated":"2026-01-26 12:59:12.000000000","message":"ack we coudl be explcity and do _ \u003d future.cancel but i think i agree the implict discard in this case is ok.","commit_id":"c7e0589c60f0130ebe8d40c989421518b5d892e2"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fd69be86e3e24032c99fa7ad8b11bfc0883ca6f8","unresolved":true,"context_lines":[{"line_number":323,"context_line":"            self.executor.submit("},{"line_number":324,"context_line":"                self._collect_zones, availability_zones, compute_nodes)"},{"line_number":325,"context_line":"        }"},{"line_number":326,"context_line":"        _done, zone_aggegate_not_done \u003d waiters.wait_for_all("},{"line_number":327,"context_line":"            zone_aggregate_futures,"},{"line_number":328,"context_line":"            timeout\u003dself.collector_timeout)"},{"line_number":329,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"e354f764_f0cc0d2a","line":326,"in_reply_to":"182bb653_1428278d","updated":"2026-02-09 18:26:01.000000000","message":"\u003e **Suggestion**:\n\u003e Rename \u0027zone_aggegate_not_done\u0027 to \u0027zone_aggregate_not_done\u0027 for consistency with proper spelling and similar variable names.\n\nthis is valide your missing an `r`\n```\nzone_aggegate_not_done\n-\u003e\nzone_aggregate_not_done\n```","commit_id":"fc657f718ff520f1364e67488ff1f815a412a469"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"bc158ab840ff6bde496253a9b04b44573eedd8c6","unresolved":false,"context_lines":[{"line_number":323,"context_line":"            self.executor.submit("},{"line_number":324,"context_line":"                self._collect_zones, availability_zones, compute_nodes)"},{"line_number":325,"context_line":"        }"},{"line_number":326,"context_line":"        _done, zone_aggegate_not_done \u003d waiters.wait_for_all("},{"line_number":327,"context_line":"            zone_aggregate_futures,"},{"line_number":328,"context_line":"            timeout\u003dself.collector_timeout)"},{"line_number":329,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"c575fba1_6e2ffbf0","line":326,"in_reply_to":"e354f764_f0cc0d2a","updated":"2026-02-09 19:52:36.000000000","message":"done","commit_id":"fc657f718ff520f1364e67488ff1f815a412a469"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fd69be86e3e24032c99fa7ad8b11bfc0883ca6f8","unresolved":false,"context_lines":[{"line_number":327,"context_line":"            zone_aggregate_futures,"},{"line_number":328,"context_line":"            timeout\u003dself.collector_timeout)"},{"line_number":329,"context_line":""},{"line_number":330,"context_line":"        if len(zone_aggegate_not_done) \u003e 0:"},{"line_number":331,"context_line":"            LOG.warning(\"Timed out waiting to collect compute nodes \""},{"line_number":332,"context_line":"                        \"from availability zones and host aggregates. \""},{"line_number":333,"context_line":"                        \"Aborting collection of compute nodes information\")"}],"source_content_type":"text/x-python","patch_set":7,"id":"f3b2bdc3_7d4dcf9b","line":330,"in_reply_to":"4d33c954_3101f521","updated":"2026-02-09 18:26:01.000000000","message":"no.\nwe could but not in scope fo this change.\nthis would only be relevent if we had metrics for watcher","commit_id":"fc657f718ff520f1364e67488ff1f815a412a469"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8fba8566fe91095e449769ec707b116cc15cdb9d","unresolved":true,"context_lines":[{"line_number":331,"context_line":"            LOG.warning(\"Timed out waiting to collect compute nodes \""},{"line_number":332,"context_line":"                        \"from availability zones and host aggregates. \""},{"line_number":333,"context_line":"                        \"Aborting collection of compute nodes information\")"},{"line_number":334,"context_line":"            for future in zone_aggregate_not_done:"},{"line_number":335,"context_line":"                future.cancel()"},{"line_number":336,"context_line":"            # Return and don\u0027t continue with the collection"},{"line_number":337,"context_line":"            return"}],"source_content_type":"text/x-python","patch_set":9,"id":"bdd0434b_fb824fe9","line":334,"in_reply_to":"e58785c1_6db3165b","updated":"2026-02-09 20:32:20.000000000","message":"this is really a nit\nwe could but that generally understood\n\nwe know we could be leakign the actual background task for a protracted period.","commit_id":"229bce2a91e904dfabf99cdb56272c334943e4a4"}],"watcher/decision_engine/scheduling.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"ebf0bd0b04b50f989810512e847f002e3da3645c","unresolved":true,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def add_sync_jobs(self):"},{"line_number":45,"context_line":"        for collector in self.collectors.values():"},{"line_number":46,"context_line":"            self.add_job(collector.synchronize,"},{"line_number":47,"context_line":"                         trigger\u003d\u0027interval\u0027,"},{"line_number":48,"context_line":"                         seconds\u003dcollector.config.period,"},{"line_number":49,"context_line":"                         next_run_time\u003ddatetime.datetime.now())"}],"source_content_type":"text/x-python","patch_set":2,"id":"3ca9282d_3d328be1","line":46,"range":{"start_line":46,"start_character":0,"end_line":46,"end_character":2},"updated":"2025-11-28 09:41:57.000000000","message":"I think having the timeout mechanism in the wrapper synchronize call was a more homegeneous way to apply it to any collector and to cover any possible point where the task could stuck or become longer that expected. I understand that the reason to move it to the collectors itself is to take advantadge of the usage of futures waiters there which provides us a convenient place where we can apply it, right?\n\nI\u0027d like to have the timeout applied here if possible, but also it\u0027s not worthy to do a big change only for that, so if there is no a better alternative, I\u0027m fine with this.","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"9f2f35c9b31ea815e88d81b4c5940677dc3202b1","unresolved":true,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def add_sync_jobs(self):"},{"line_number":45,"context_line":"        for collector in self.collectors.values():"},{"line_number":46,"context_line":"            self.add_job(collector.synchronize,"},{"line_number":47,"context_line":"                         trigger\u003d\u0027interval\u0027,"},{"line_number":48,"context_line":"                         seconds\u003dcollector.config.period,"},{"line_number":49,"context_line":"                         next_run_time\u003ddatetime.datetime.now())"}],"source_content_type":"text/x-python","patch_set":2,"id":"adec0e43_dc20f3ea","line":46,"range":{"start_line":46,"start_character":0,"end_line":46,"end_character":2},"in_reply_to":"3ca9282d_3d328be1","updated":"2025-11-28 11:53:57.000000000","message":"I don\u0027t see a clean way of doing this as a global timeout here, since the collector will spawn multiple threads that triggers multiplle api callm, which have their own timeout. So to do that, we would need to change all methods from the model collector and in the nova_helper (and cinder/ironic helper) to accept an Event and abort the operation based on that. The previous kill everything with eventlet would no be possible with native threads now, so I plan to drop it here now.\nBut I\u0027m still thinking if there is other easy ways of doing that, and I am open for new ideas too. Thanks for taking a look.","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"30cd14587fc8767e83f76f9da299e27fc6395658","unresolved":true,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def add_sync_jobs(self):"},{"line_number":45,"context_line":"        for collector in self.collectors.values():"},{"line_number":46,"context_line":"            self.add_job(collector.synchronize,"},{"line_number":47,"context_line":"                         trigger\u003d\u0027interval\u0027,"},{"line_number":48,"context_line":"                         seconds\u003dcollector.config.period,"},{"line_number":49,"context_line":"                         next_run_time\u003ddatetime.datetime.now())"}],"source_content_type":"text/x-python","patch_set":2,"id":"d1bed5a2_9b1ba83e","line":46,"range":{"start_line":46,"start_character":0,"end_line":46,"end_character":2},"in_reply_to":"adec0e43_dc20f3ea","updated":"2025-11-28 16:31:56.000000000","message":"If you can find an easy and clean way, it\u0027d be great. Otherwise, I think this approach is good and get the main goal which is avoiding the collector to get stuck indefinetively.","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"6e4f28bb7f60bd5bb295766c7b1be0170d457baf","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def add_sync_jobs(self):"},{"line_number":45,"context_line":"        for collector in self.collectors.values():"},{"line_number":46,"context_line":"            self.add_job(collector.synchronize,"},{"line_number":47,"context_line":"                         trigger\u003d\u0027interval\u0027,"},{"line_number":48,"context_line":"                         seconds\u003dcollector.config.period,"},{"line_number":49,"context_line":"                         next_run_time\u003ddatetime.datetime.now())"}],"source_content_type":"text/x-python","patch_set":2,"id":"034eeb35_467a877b","line":46,"range":{"start_line":46,"start_character":0,"end_line":46,"end_character":2},"in_reply_to":"d1bed5a2_9b1ba83e","updated":"2026-01-13 14:28:00.000000000","message":"Done","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"}],"watcher/decision_engine/threading.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fd69be86e3e24032c99fa7ad8b11bfc0883ca6f8","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        :param kwargs: amount of arguments for the function"},{"line_number":94,"context_line":"        \"\"\""},{"line_number":95,"context_line":""},{"line_number":96,"context_line":"        waits \u003d waiters.wait_for_any(futures, timeout\u003dfutures_timeout)"},{"line_number":97,"context_line":"        while len(waits[0]) \u003e 0 or len(waits[1]) \u003e 0:"},{"line_number":98,"context_line":"            # NOTE(dviroel): if finished futures are empty, the wait_for_any"},{"line_number":99,"context_line":"            # has returned due to a timeout, if provided by the caller."}],"source_content_type":"text/x-python","patch_set":7,"id":"9dc2628f_ddb93737","line":96,"in_reply_to":"036c54bd_4a529d42","updated":"2026-02-09 18:26:01.000000000","message":"so the config will actully block this normally but if we have set it to 0 iin the test then that proably ok for testing","commit_id":"fc657f718ff520f1364e67488ff1f815a412a469"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"bc158ab840ff6bde496253a9b04b44573eedd8c6","unresolved":true,"context_lines":[{"line_number":100,"context_line":"            # In this scenario, we cancel the remaining pending futures and"},{"line_number":101,"context_line":"            # break the loop, otherwise it may stay in the loop indefinitely."},{"line_number":102,"context_line":"            if not len(waits[0]):"},{"line_number":103,"context_line":"                LOG.debug(\"No futures finished during the timeout period, \""},{"line_number":104,"context_line":"                          \"aborting remaining pending futures\")"},{"line_number":105,"context_line":"                for future in waits[1]:"},{"line_number":106,"context_line":"                    future.cancel()"}],"source_content_type":"text/x-python","patch_set":7,"id":"9de54cb8_e5fe381e","line":103,"in_reply_to":"6c35c271_693ceca9","updated":"2026-02-09 19:52:36.000000000","message":"yeah, makes sense. I am also using this log message as Warning in other places.","commit_id":"fc657f718ff520f1364e67488ff1f815a412a469"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fd69be86e3e24032c99fa7ad8b11bfc0883ca6f8","unresolved":true,"context_lines":[{"line_number":100,"context_line":"            # In this scenario, we cancel the remaining pending futures and"},{"line_number":101,"context_line":"            # break the loop, otherwise it may stay in the loop indefinitely."},{"line_number":102,"context_line":"            if not len(waits[0]):"},{"line_number":103,"context_line":"                LOG.debug(\"No futures finished during the timeout period, \""},{"line_number":104,"context_line":"                          \"aborting remaining pending futures\")"},{"line_number":105,"context_line":"                for future in waits[1]:"},{"line_number":106,"context_line":"                    future.cancel()"}],"source_content_type":"text/x-python","patch_set":7,"id":"6c35c271_693ceca9","line":103,"in_reply_to":"8f79abaf_03aed6c8","updated":"2026-02-09 18:26:01.000000000","message":"\u003e **Recommendation**:\n\u003e Change LOG.debug to LOG.warning for consistency with other timeout logging in nova.py which uses LOG.warning. This ensures timeout events are visible in production logs.\n\n\n\nya that fair warnings are things operator should investigate\nif we are timign out in the collectors they should take action","commit_id":"fc657f718ff520f1364e67488ff1f815a412a469"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8fba8566fe91095e449769ec707b116cc15cdb9d","unresolved":false,"context_lines":[{"line_number":100,"context_line":"            # In this scenario, we cancel the remaining pending futures and"},{"line_number":101,"context_line":"            # break the loop, otherwise it may stay in the loop indefinitely."},{"line_number":102,"context_line":"            if not len(waits[0]):"},{"line_number":103,"context_line":"                LOG.debug(\"No futures finished during the timeout period, \""},{"line_number":104,"context_line":"                          \"aborting remaining pending futures\")"},{"line_number":105,"context_line":"                for future in waits[1]:"},{"line_number":106,"context_line":"                    future.cancel()"}],"source_content_type":"text/x-python","patch_set":7,"id":"dc8a7022_77827aef","line":103,"in_reply_to":"9de54cb8_e5fe381e","updated":"2026-02-09 20:32:20.000000000","message":"Done","commit_id":"fc657f718ff520f1364e67488ff1f815a412a469"}],"watcher/tests/decision_engine/cluster/test_nova_cdmc.py":[{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"f6b1ae759740440df635945dc453fb1813e0e750","unresolved":true,"context_lines":[{"line_number":201,"context_line":"    @mock.patch.object(nova_helper, \u0027NovaHelper\u0027, mock.MagicMock())"},{"line_number":202,"context_line":"    def test_add_instance_node(self):"},{"line_number":203,"context_line":"        model_builder \u003d nova.NovaModelBuilder("},{"line_number":204,"context_line":"            osc\u003dmock.MagicMock(), collector_config\u003dmock.Mock())"},{"line_number":205,"context_line":"        model_builder.model \u003d mock.MagicMock()"},{"line_number":206,"context_line":"        mock_node \u003d mock.MagicMock()"},{"line_number":207,"context_line":"        mock_host \u003d mock_node.service[\"host\"]"}],"source_content_type":"text/x-python","patch_set":2,"id":"ee26b9f9_bbc17691","line":204,"updated":"2025-12-01 17:09:23.000000000","message":"could we use the actually `CONF` object instead of a mock, since we have it defined in line 32?","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"64085898b82a17b69734b13ac811e0d099732918","unresolved":true,"context_lines":[{"line_number":201,"context_line":"    @mock.patch.object(nova_helper, \u0027NovaHelper\u0027, mock.MagicMock())"},{"line_number":202,"context_line":"    def test_add_instance_node(self):"},{"line_number":203,"context_line":"        model_builder \u003d nova.NovaModelBuilder("},{"line_number":204,"context_line":"            osc\u003dmock.MagicMock(), collector_config\u003dmock.Mock())"},{"line_number":205,"context_line":"        model_builder.model \u003d mock.MagicMock()"},{"line_number":206,"context_line":"        mock_node \u003d mock.MagicMock()"},{"line_number":207,"context_line":"        mock_host \u003d mock_node.service[\"host\"]"}],"source_content_type":"text/x-python","patch_set":2,"id":"ff6d9c76_2e3607d0","line":204,"in_reply_to":"ee26b9f9_bbc17691","updated":"2025-12-02 11:37:02.000000000","message":"yes we can, I was using mock in most of the places because most of the tests doesn\u0027t really use the config, but yes, there are other places that use.","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"178b7ff2538f025fda03433cbbea23016c98f22d","unresolved":false,"context_lines":[{"line_number":201,"context_line":"    @mock.patch.object(nova_helper, \u0027NovaHelper\u0027, mock.MagicMock())"},{"line_number":202,"context_line":"    def test_add_instance_node(self):"},{"line_number":203,"context_line":"        model_builder \u003d nova.NovaModelBuilder("},{"line_number":204,"context_line":"            osc\u003dmock.MagicMock(), collector_config\u003dmock.Mock())"},{"line_number":205,"context_line":"        model_builder.model \u003d mock.MagicMock()"},{"line_number":206,"context_line":"        mock_node \u003d mock.MagicMock()"},{"line_number":207,"context_line":"        mock_host \u003d mock_node.service[\"host\"]"}],"source_content_type":"text/x-python","patch_set":2,"id":"e894c5ba_1d5199a0","line":204,"in_reply_to":"ff6d9c76_2e3607d0","updated":"2026-01-02 19:01:41.000000000","message":"Done","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"4d705d07a425fe5dd1da30b9c261708da96a90e8","unresolved":true,"context_lines":[{"line_number":541,"context_line":"            [mock.Mock(zone\u003d\u0027av_b\u0027, host\u003d\u0027hostthree\u0027),"},{"line_number":542,"context_line":"             mock.Mock(zone\u003d\u0027av_a\u0027, host\u003d\u0027hostone\u0027)])"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        compute_node_one \u003d mock.Mock("},{"line_number":545,"context_line":"            id\u003d\u0027796fee99-65dd-4262-aa-fd2a1143faa6\u0027,"},{"line_number":546,"context_line":"            hypervisor_hostname\u003d\u0027hostone\u0027,"},{"line_number":547,"context_line":"            hypervisor_type\u003d\u0027QEMU\u0027,"},{"line_number":548,"context_line":"            state\u003d\u0027TEST_STATE\u0027,"},{"line_number":549,"context_line":"            status\u003d\u0027TEST_STATUS\u0027,"},{"line_number":550,"context_line":"            memory_mb\u003d333,"},{"line_number":551,"context_line":"            memory_mb_used\u003d100,"},{"line_number":552,"context_line":"            free_disk_gb\u003d222,"},{"line_number":553,"context_line":"            local_gb\u003d111,"},{"line_number":554,"context_line":"            local_gb_used\u003d10,"},{"line_number":555,"context_line":"            vcpus\u003d4,"},{"line_number":556,"context_line":"            vcpus_used\u003d0,"},{"line_number":557,"context_line":"            servers\u003d["},{"line_number":558,"context_line":"                {\u0027name\u0027: \u0027fake_instance\u0027,"},{"line_number":559,"context_line":"                 \u0027uuid\u0027: \u0027ef500f7e-dac8-470f-960c-169486fce71b\u0027}"},{"line_number":560,"context_line":"            ],"},{"line_number":561,"context_line":"            service\u003d{\u0027id\u0027: 123, \u0027host\u0027: \u0027hostone\u0027,"},{"line_number":562,"context_line":"                     \u0027disabled_reason\u0027: \u0027\u0027},"},{"line_number":563,"context_line":"        )"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"        compute_node_two \u003d mock.Mock("},{"line_number":566,"context_line":"            id\u003d\u0027756fef99-65dd-4262-aa-fd2a1143faa6\u0027,"},{"line_number":567,"context_line":"            hypervisor_hostname\u003d\u0027hosttwo\u0027,"},{"line_number":568,"context_line":"            hypervisor_type\u003d\u0027QEMU\u0027,"},{"line_number":569,"context_line":"            state\u003d\u0027TEST_STATE\u0027,"},{"line_number":570,"context_line":"            status\u003d\u0027TEST_STATUS\u0027,"},{"line_number":571,"context_line":"            memory_mb\u003d333,"},{"line_number":572,"context_line":"            memory_mb_used\u003d100,"},{"line_number":573,"context_line":"            free_disk_gb\u003d222,"},{"line_number":574,"context_line":"            local_gb\u003d111,"},{"line_number":575,"context_line":"            local_gb_used\u003d10,"},{"line_number":576,"context_line":"            vcpus\u003d4,"},{"line_number":577,"context_line":"            vcpus_used\u003d0,"},{"line_number":578,"context_line":"            servers\u003d["},{"line_number":579,"context_line":"                {\u0027name\u0027: \u0027fake_instance2\u0027,"},{"line_number":580,"context_line":"                 \u0027uuid\u0027: \u0027ef500f7e-dac8-47f0-960c-169486fce71b\u0027}"},{"line_number":581,"context_line":"            ],"},{"line_number":582,"context_line":"            service\u003d{\u0027id\u0027: 123, \u0027host\u0027: \u0027hosttwo\u0027,"},{"line_number":583,"context_line":"                     \u0027disabled_reason\u0027: \u0027\u0027},"},{"line_number":584,"context_line":"        )"},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"        # Set max general workers to 1 to ensure only one worker is used"},{"line_number":587,"context_line":"        # and we timed out on collecting instances"},{"line_number":588,"context_line":"        CONF.watcher_decision_engine.max_general_workers \u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"07ea5d03_938b5104","line":585,"range":{"start_line":544,"start_character":8,"end_line":585,"end_character":1},"updated":"2025-11-28 10:29:55.000000000","message":"I guess we may use real element.ComputeNodes here instead of mocks?","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"9f2f35c9b31ea815e88d81b4c5940677dc3202b1","unresolved":true,"context_lines":[{"line_number":541,"context_line":"            [mock.Mock(zone\u003d\u0027av_b\u0027, host\u003d\u0027hostthree\u0027),"},{"line_number":542,"context_line":"             mock.Mock(zone\u003d\u0027av_a\u0027, host\u003d\u0027hostone\u0027)])"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        compute_node_one \u003d mock.Mock("},{"line_number":545,"context_line":"            id\u003d\u0027796fee99-65dd-4262-aa-fd2a1143faa6\u0027,"},{"line_number":546,"context_line":"            hypervisor_hostname\u003d\u0027hostone\u0027,"},{"line_number":547,"context_line":"            hypervisor_type\u003d\u0027QEMU\u0027,"},{"line_number":548,"context_line":"            state\u003d\u0027TEST_STATE\u0027,"},{"line_number":549,"context_line":"            status\u003d\u0027TEST_STATUS\u0027,"},{"line_number":550,"context_line":"            memory_mb\u003d333,"},{"line_number":551,"context_line":"            memory_mb_used\u003d100,"},{"line_number":552,"context_line":"            free_disk_gb\u003d222,"},{"line_number":553,"context_line":"            local_gb\u003d111,"},{"line_number":554,"context_line":"            local_gb_used\u003d10,"},{"line_number":555,"context_line":"            vcpus\u003d4,"},{"line_number":556,"context_line":"            vcpus_used\u003d0,"},{"line_number":557,"context_line":"            servers\u003d["},{"line_number":558,"context_line":"                {\u0027name\u0027: \u0027fake_instance\u0027,"},{"line_number":559,"context_line":"                 \u0027uuid\u0027: \u0027ef500f7e-dac8-470f-960c-169486fce71b\u0027}"},{"line_number":560,"context_line":"            ],"},{"line_number":561,"context_line":"            service\u003d{\u0027id\u0027: 123, \u0027host\u0027: \u0027hostone\u0027,"},{"line_number":562,"context_line":"                     \u0027disabled_reason\u0027: \u0027\u0027},"},{"line_number":563,"context_line":"        )"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"        compute_node_two \u003d mock.Mock("},{"line_number":566,"context_line":"            id\u003d\u0027756fef99-65dd-4262-aa-fd2a1143faa6\u0027,"},{"line_number":567,"context_line":"            hypervisor_hostname\u003d\u0027hosttwo\u0027,"},{"line_number":568,"context_line":"            hypervisor_type\u003d\u0027QEMU\u0027,"},{"line_number":569,"context_line":"            state\u003d\u0027TEST_STATE\u0027,"},{"line_number":570,"context_line":"            status\u003d\u0027TEST_STATUS\u0027,"},{"line_number":571,"context_line":"            memory_mb\u003d333,"},{"line_number":572,"context_line":"            memory_mb_used\u003d100,"},{"line_number":573,"context_line":"            free_disk_gb\u003d222,"},{"line_number":574,"context_line":"            local_gb\u003d111,"},{"line_number":575,"context_line":"            local_gb_used\u003d10,"},{"line_number":576,"context_line":"            vcpus\u003d4,"},{"line_number":577,"context_line":"            vcpus_used\u003d0,"},{"line_number":578,"context_line":"            servers\u003d["},{"line_number":579,"context_line":"                {\u0027name\u0027: \u0027fake_instance2\u0027,"},{"line_number":580,"context_line":"                 \u0027uuid\u0027: \u0027ef500f7e-dac8-47f0-960c-169486fce71b\u0027}"},{"line_number":581,"context_line":"            ],"},{"line_number":582,"context_line":"            service\u003d{\u0027id\u0027: 123, \u0027host\u0027: \u0027hosttwo\u0027,"},{"line_number":583,"context_line":"                     \u0027disabled_reason\u0027: \u0027\u0027},"},{"line_number":584,"context_line":"        )"},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"        # Set max general workers to 1 to ensure only one worker is used"},{"line_number":587,"context_line":"        # and we timed out on collecting instances"},{"line_number":588,"context_line":"        CONF.watcher_decision_engine.max_general_workers \u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"812ea1bd_f07eaab9","line":585,"range":{"start_line":544,"start_character":8,"end_line":585,"end_character":1},"in_reply_to":"07ea5d03_938b5104","updated":"2025-11-28 11:53:57.000000000","message":"IIUC this is the resource that the client returns, so it is not really the element.ComputeNodes. element.ComputeNodes is what the Model Builder will build with this content.","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"178b7ff2538f025fda03433cbbea23016c98f22d","unresolved":true,"context_lines":[{"line_number":541,"context_line":"            [mock.Mock(zone\u003d\u0027av_b\u0027, host\u003d\u0027hostthree\u0027),"},{"line_number":542,"context_line":"             mock.Mock(zone\u003d\u0027av_a\u0027, host\u003d\u0027hostone\u0027)])"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        compute_node_one \u003d mock.Mock("},{"line_number":545,"context_line":"            id\u003d\u0027796fee99-65dd-4262-aa-fd2a1143faa6\u0027,"},{"line_number":546,"context_line":"            hypervisor_hostname\u003d\u0027hostone\u0027,"},{"line_number":547,"context_line":"            hypervisor_type\u003d\u0027QEMU\u0027,"},{"line_number":548,"context_line":"            state\u003d\u0027TEST_STATE\u0027,"},{"line_number":549,"context_line":"            status\u003d\u0027TEST_STATUS\u0027,"},{"line_number":550,"context_line":"            memory_mb\u003d333,"},{"line_number":551,"context_line":"            memory_mb_used\u003d100,"},{"line_number":552,"context_line":"            free_disk_gb\u003d222,"},{"line_number":553,"context_line":"            local_gb\u003d111,"},{"line_number":554,"context_line":"            local_gb_used\u003d10,"},{"line_number":555,"context_line":"            vcpus\u003d4,"},{"line_number":556,"context_line":"            vcpus_used\u003d0,"},{"line_number":557,"context_line":"            servers\u003d["},{"line_number":558,"context_line":"                {\u0027name\u0027: \u0027fake_instance\u0027,"},{"line_number":559,"context_line":"                 \u0027uuid\u0027: \u0027ef500f7e-dac8-470f-960c-169486fce71b\u0027}"},{"line_number":560,"context_line":"            ],"},{"line_number":561,"context_line":"            service\u003d{\u0027id\u0027: 123, \u0027host\u0027: \u0027hostone\u0027,"},{"line_number":562,"context_line":"                     \u0027disabled_reason\u0027: \u0027\u0027},"},{"line_number":563,"context_line":"        )"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"        compute_node_two \u003d mock.Mock("},{"line_number":566,"context_line":"            id\u003d\u0027756fef99-65dd-4262-aa-fd2a1143faa6\u0027,"},{"line_number":567,"context_line":"            hypervisor_hostname\u003d\u0027hosttwo\u0027,"},{"line_number":568,"context_line":"            hypervisor_type\u003d\u0027QEMU\u0027,"},{"line_number":569,"context_line":"            state\u003d\u0027TEST_STATE\u0027,"},{"line_number":570,"context_line":"            status\u003d\u0027TEST_STATUS\u0027,"},{"line_number":571,"context_line":"            memory_mb\u003d333,"},{"line_number":572,"context_line":"            memory_mb_used\u003d100,"},{"line_number":573,"context_line":"            free_disk_gb\u003d222,"},{"line_number":574,"context_line":"            local_gb\u003d111,"},{"line_number":575,"context_line":"            local_gb_used\u003d10,"},{"line_number":576,"context_line":"            vcpus\u003d4,"},{"line_number":577,"context_line":"            vcpus_used\u003d0,"},{"line_number":578,"context_line":"            servers\u003d["},{"line_number":579,"context_line":"                {\u0027name\u0027: \u0027fake_instance2\u0027,"},{"line_number":580,"context_line":"                 \u0027uuid\u0027: \u0027ef500f7e-dac8-47f0-960c-169486fce71b\u0027}"},{"line_number":581,"context_line":"            ],"},{"line_number":582,"context_line":"            service\u003d{\u0027id\u0027: 123, \u0027host\u0027: \u0027hosttwo\u0027,"},{"line_number":583,"context_line":"                     \u0027disabled_reason\u0027: \u0027\u0027},"},{"line_number":584,"context_line":"        )"},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"        # Set max general workers to 1 to ensure only one worker is used"},{"line_number":587,"context_line":"        # and we timed out on collecting instances"},{"line_number":588,"context_line":"        CONF.watcher_decision_engine.max_general_workers \u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"fc41459c_5891e833","line":585,"range":{"start_line":544,"start_character":8,"end_line":585,"end_character":1},"in_reply_to":"3c0ee903_495955c2","updated":"2026-01-02 19:01:41.000000000","message":"Done in PS3","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"30cd14587fc8767e83f76f9da299e27fc6395658","unresolved":true,"context_lines":[{"line_number":541,"context_line":"            [mock.Mock(zone\u003d\u0027av_b\u0027, host\u003d\u0027hostthree\u0027),"},{"line_number":542,"context_line":"             mock.Mock(zone\u003d\u0027av_a\u0027, host\u003d\u0027hostone\u0027)])"},{"line_number":543,"context_line":""},{"line_number":544,"context_line":"        compute_node_one \u003d mock.Mock("},{"line_number":545,"context_line":"            id\u003d\u0027796fee99-65dd-4262-aa-fd2a1143faa6\u0027,"},{"line_number":546,"context_line":"            hypervisor_hostname\u003d\u0027hostone\u0027,"},{"line_number":547,"context_line":"            hypervisor_type\u003d\u0027QEMU\u0027,"},{"line_number":548,"context_line":"            state\u003d\u0027TEST_STATE\u0027,"},{"line_number":549,"context_line":"            status\u003d\u0027TEST_STATUS\u0027,"},{"line_number":550,"context_line":"            memory_mb\u003d333,"},{"line_number":551,"context_line":"            memory_mb_used\u003d100,"},{"line_number":552,"context_line":"            free_disk_gb\u003d222,"},{"line_number":553,"context_line":"            local_gb\u003d111,"},{"line_number":554,"context_line":"            local_gb_used\u003d10,"},{"line_number":555,"context_line":"            vcpus\u003d4,"},{"line_number":556,"context_line":"            vcpus_used\u003d0,"},{"line_number":557,"context_line":"            servers\u003d["},{"line_number":558,"context_line":"                {\u0027name\u0027: \u0027fake_instance\u0027,"},{"line_number":559,"context_line":"                 \u0027uuid\u0027: \u0027ef500f7e-dac8-470f-960c-169486fce71b\u0027}"},{"line_number":560,"context_line":"            ],"},{"line_number":561,"context_line":"            service\u003d{\u0027id\u0027: 123, \u0027host\u0027: \u0027hostone\u0027,"},{"line_number":562,"context_line":"                     \u0027disabled_reason\u0027: \u0027\u0027},"},{"line_number":563,"context_line":"        )"},{"line_number":564,"context_line":""},{"line_number":565,"context_line":"        compute_node_two \u003d mock.Mock("},{"line_number":566,"context_line":"            id\u003d\u0027756fef99-65dd-4262-aa-fd2a1143faa6\u0027,"},{"line_number":567,"context_line":"            hypervisor_hostname\u003d\u0027hosttwo\u0027,"},{"line_number":568,"context_line":"            hypervisor_type\u003d\u0027QEMU\u0027,"},{"line_number":569,"context_line":"            state\u003d\u0027TEST_STATE\u0027,"},{"line_number":570,"context_line":"            status\u003d\u0027TEST_STATUS\u0027,"},{"line_number":571,"context_line":"            memory_mb\u003d333,"},{"line_number":572,"context_line":"            memory_mb_used\u003d100,"},{"line_number":573,"context_line":"            free_disk_gb\u003d222,"},{"line_number":574,"context_line":"            local_gb\u003d111,"},{"line_number":575,"context_line":"            local_gb_used\u003d10,"},{"line_number":576,"context_line":"            vcpus\u003d4,"},{"line_number":577,"context_line":"            vcpus_used\u003d0,"},{"line_number":578,"context_line":"            servers\u003d["},{"line_number":579,"context_line":"                {\u0027name\u0027: \u0027fake_instance2\u0027,"},{"line_number":580,"context_line":"                 \u0027uuid\u0027: \u0027ef500f7e-dac8-47f0-960c-169486fce71b\u0027}"},{"line_number":581,"context_line":"            ],"},{"line_number":582,"context_line":"            service\u003d{\u0027id\u0027: 123, \u0027host\u0027: \u0027hosttwo\u0027,"},{"line_number":583,"context_line":"                     \u0027disabled_reason\u0027: \u0027\u0027},"},{"line_number":584,"context_line":"        )"},{"line_number":585,"context_line":""},{"line_number":586,"context_line":"        # Set max general workers to 1 to ensure only one worker is used"},{"line_number":587,"context_line":"        # and we timed out on collecting instances"},{"line_number":588,"context_line":"        CONF.watcher_decision_engine.max_general_workers \u003d 1"}],"source_content_type":"text/x-python","patch_set":2,"id":"3c0ee903_495955c2","line":585,"range":{"start_line":544,"start_character":8,"end_line":585,"end_character":1},"in_reply_to":"812ea1bd_f07eaab9","updated":"2025-11-28 16:31:56.000000000","message":"Right, it would be the client object. I did something similar in https://review.opendev.org/c/openstack/watcher/+/966699/7/watcher/tests/applier/actions/test_migration.py to use client objects directly if you want to avoid using a mock object..","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"4d705d07a425fe5dd1da30b9c261708da96a90e8","unresolved":true,"context_lines":[{"line_number":606,"context_line":""},{"line_number":607,"context_line":"        model \u003d t_nova_cluster.execute(m_scope)"},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"        self.assertEqual(len(model.get_all_compute_nodes()), 2)"},{"line_number":610,"context_line":"        # Instances should not be added to the model due to timeout"},{"line_number":611,"context_line":"        self.assertEqual(len(model.get_all_instances()), 0)"},{"line_number":612,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"da98efb1_44a0946c","line":609,"range":{"start_line":609,"start_character":0,"end_line":609,"end_character":2},"updated":"2025-11-28 10:29:55.000000000","message":"Would it be possible to mock the future.cancel method and assert that we are calling it as expected? I think that would be more direct way of testing the timeout feature","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"178b7ff2538f025fda03433cbbea23016c98f22d","unresolved":true,"context_lines":[{"line_number":606,"context_line":""},{"line_number":607,"context_line":"        model \u003d t_nova_cluster.execute(m_scope)"},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"        self.assertEqual(len(model.get_all_compute_nodes()), 2)"},{"line_number":610,"context_line":"        # Instances should not be added to the model due to timeout"},{"line_number":611,"context_line":"        self.assertEqual(len(model.get_all_instances()), 0)"},{"line_number":612,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"b7b93437_481a0c91","line":609,"range":{"start_line":609,"start_character":0,"end_line":609,"end_character":2},"in_reply_to":"76f61117_912143a8","updated":"2026-01-02 19:01:41.000000000","message":"Done in PS3","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"9f2f35c9b31ea815e88d81b4c5940677dc3202b1","unresolved":true,"context_lines":[{"line_number":606,"context_line":""},{"line_number":607,"context_line":"        model \u003d t_nova_cluster.execute(m_scope)"},{"line_number":608,"context_line":""},{"line_number":609,"context_line":"        self.assertEqual(len(model.get_all_compute_nodes()), 2)"},{"line_number":610,"context_line":"        # Instances should not be added to the model due to timeout"},{"line_number":611,"context_line":"        self.assertEqual(len(model.get_all_instances()), 0)"},{"line_number":612,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"76f61117_912143a8","line":609,"range":{"start_line":609,"start_character":0,"end_line":609,"end_character":2},"in_reply_to":"da98efb1_44a0946c","updated":"2025-11-28 11:53:57.000000000","message":"yeah maybe, I would need to mock lot of things in the end to make that happen, which is also expected from unit test point of view. I may provide a improvement here if that works","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"4d705d07a425fe5dd1da30b9c261708da96a90e8","unresolved":true,"context_lines":[{"line_number":636,"context_line":"        # Model shouldn\u0027t have any updated compute nodes"},{"line_number":637,"context_line":"        self.assertEqual(len(model.get_all_compute_nodes()), 0)"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"        # Get compute node list and by name shouldn\u0027t be called"},{"line_number":640,"context_line":"        m_nova.get_compute_node_list.assert_not_called()"},{"line_number":641,"context_line":"        m_nova.get_compute_node_by_name.assert_not_called()"},{"line_number":642,"context_line":"        m_nova.executor.do_while_futures_modify.assert_not_called()"}],"source_content_type":"text/x-python","patch_set":2,"id":"07ce71bf_16c1824c","line":639,"range":{"start_line":639,"start_character":0,"end_line":639,"end_character":2},"updated":"2025-11-28 10:29:55.000000000","message":"I understand we are asserting this because we expect the execute to exit in the return in `if len(zone_aggegate_not_done) \u003e 0`, right?","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"9f2f35c9b31ea815e88d81b4c5940677dc3202b1","unresolved":true,"context_lines":[{"line_number":636,"context_line":"        # Model shouldn\u0027t have any updated compute nodes"},{"line_number":637,"context_line":"        self.assertEqual(len(model.get_all_compute_nodes()), 0)"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"        # Get compute node list and by name shouldn\u0027t be called"},{"line_number":640,"context_line":"        m_nova.get_compute_node_list.assert_not_called()"},{"line_number":641,"context_line":"        m_nova.get_compute_node_by_name.assert_not_called()"},{"line_number":642,"context_line":"        m_nova.executor.do_while_futures_modify.assert_not_called()"}],"source_content_type":"text/x-python","patch_set":2,"id":"22c84348_61c61102","line":639,"range":{"start_line":639,"start_character":0,"end_line":639,"end_character":2},"in_reply_to":"07ce71bf_16c1824c","updated":"2025-11-28 11:53:57.000000000","message":"correct","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"178b7ff2538f025fda03433cbbea23016c98f22d","unresolved":false,"context_lines":[{"line_number":636,"context_line":"        # Model shouldn\u0027t have any updated compute nodes"},{"line_number":637,"context_line":"        self.assertEqual(len(model.get_all_compute_nodes()), 0)"},{"line_number":638,"context_line":""},{"line_number":639,"context_line":"        # Get compute node list and by name shouldn\u0027t be called"},{"line_number":640,"context_line":"        m_nova.get_compute_node_list.assert_not_called()"},{"line_number":641,"context_line":"        m_nova.get_compute_node_by_name.assert_not_called()"},{"line_number":642,"context_line":"        m_nova.executor.do_while_futures_modify.assert_not_called()"}],"source_content_type":"text/x-python","patch_set":2,"id":"27ab286c_a49c6ddf","line":639,"range":{"start_line":639,"start_character":0,"end_line":639,"end_character":2},"in_reply_to":"22c84348_61c61102","updated":"2026-01-02 19:01:41.000000000","message":"Done","commit_id":"26da806c63c5b85012429f50f81777e2fbd8c6c1"}],"watcher/tests/unit/decision_engine/cluster/test_nova_cdmc.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"fd69be86e3e24032c99fa7ad8b11bfc0883ca6f8","unresolved":true,"context_lines":[{"line_number":592,"context_line":""},{"line_number":593,"context_line":"        # Set max general workers to 1 to ensure only one worker is used"},{"line_number":594,"context_line":"        # and we timed out on collecting instances"},{"line_number":595,"context_line":"        CONF.watcher_decision_engine.max_general_workers \u003d 1"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"        m_nh_compute_name.side_effect \u003d ["},{"line_number":598,"context_line":"            [compute_node_one], [compute_node_two]"}],"source_content_type":"text/x-python","patch_set":7,"id":"bfaa7de6_1ac599b4","line":595,"updated":"2026-02-09 18:26:01.000000000","message":"you shoudl never assig to CONF in tests\nthis cause inter test interaction\n\nyou should be using self.flags","commit_id":"fc657f718ff520f1364e67488ff1f815a412a469"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"bc158ab840ff6bde496253a9b04b44573eedd8c6","unresolved":true,"context_lines":[{"line_number":592,"context_line":""},{"line_number":593,"context_line":"        # Set max general workers to 1 to ensure only one worker is used"},{"line_number":594,"context_line":"        # and we timed out on collecting instances"},{"line_number":595,"context_line":"        CONF.watcher_decision_engine.max_general_workers \u003d 1"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"        m_nh_compute_name.side_effect \u003d ["},{"line_number":598,"context_line":"            [compute_node_one], [compute_node_two]"}],"source_content_type":"text/x-python","patch_set":7,"id":"c26b71f7_26b76949","line":595,"in_reply_to":"bfaa7de6_1ac599b4","updated":"2026-02-09 19:52:36.000000000","message":"you are correct, this is not the rigth way of setting configuration. I made the changes, please take a look again. Thanks","commit_id":"fc657f718ff520f1364e67488ff1f815a412a469"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8fba8566fe91095e449769ec707b116cc15cdb9d","unresolved":false,"context_lines":[{"line_number":592,"context_line":""},{"line_number":593,"context_line":"        # Set max general workers to 1 to ensure only one worker is used"},{"line_number":594,"context_line":"        # and we timed out on collecting instances"},{"line_number":595,"context_line":"        CONF.watcher_decision_engine.max_general_workers \u003d 1"},{"line_number":596,"context_line":""},{"line_number":597,"context_line":"        m_nh_compute_name.side_effect \u003d ["},{"line_number":598,"context_line":"            [compute_node_one], [compute_node_two]"}],"source_content_type":"text/x-python","patch_set":7,"id":"bd34f542_ccbb71c3","line":595,"in_reply_to":"c26b71f7_26b76949","updated":"2026-02-09 20:32:20.000000000","message":"Done","commit_id":"fc657f718ff520f1364e67488ff1f815a412a469"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"221f3c32fb276c8f2be021a25a2cfcc64955e873","unresolved":true,"context_lines":[{"line_number":735,"context_line":""},{"line_number":736,"context_line":"        t_nova_cluster \u003d nova.NovaModelBuilder(mock.Mock())"},{"line_number":737,"context_line":""},{"line_number":738,"context_line":"        self.assertEqual(t_nova_cluster.collector_timeout, 123)"}],"source_content_type":"text/x-python","patch_set":9,"id":"7578c961_9c906628","line":738,"range":{"start_line":738,"start_character":0,"end_line":738,"end_character":63},"updated":"2026-02-09 19:55:30.000000000","message":"Im other tests I had to assume that \"collector_timeout\" attribute is always set from \"collector.compute_resources_collector_timeout\". This test is here to guarantee that it remains true.","commit_id":"229bce2a91e904dfabf99cdb56272c334943e4a4"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"8fba8566fe91095e449769ec707b116cc15cdb9d","unresolved":false,"context_lines":[{"line_number":735,"context_line":""},{"line_number":736,"context_line":"        t_nova_cluster \u003d nova.NovaModelBuilder(mock.Mock())"},{"line_number":737,"context_line":""},{"line_number":738,"context_line":"        self.assertEqual(t_nova_cluster.collector_timeout, 123)"}],"source_content_type":"text/x-python","patch_set":9,"id":"70be9625_3874284a","line":738,"range":{"start_line":738,"start_character":0,"end_line":738,"end_character":63},"in_reply_to":"7578c961_9c906628","updated":"2026-02-09 20:32:20.000000000","message":"Acknowledged","commit_id":"229bce2a91e904dfabf99cdb56272c334943e4a4"}],"watcher/tests/unit/test_threading.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"2de239b018f5370a7fcff85b08acc52e9c98f45c","unresolved":true,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @staticmethod"},{"line_number":55,"context_line":"    def sleep_function(timeout\u003d1):"},{"line_number":56,"context_line":"        return time.sleep(timeout)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_singleton(self):"},{"line_number":59,"context_line":"        \"\"\"Ensure only one object of DecisionEngineThreadPool can be created\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"d8dd9c09_88891298","line":56,"range":{"start_line":56,"start_character":14,"end_line":56,"end_character":34},"updated":"2026-01-26 12:59:12.000000000","message":"in the unit test we should not actully sleep in general as we dont want to stall the worker sleeping.\n\ncan we just make this pass?","commit_id":"bc58b1633438b2fbf9dc8f9381ca98f2db96e58b"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"42dc47cae5b08d055f8d6fd24bf8357f1ecb4b08","unresolved":true,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    @staticmethod"},{"line_number":55,"context_line":"    def sleep_function(timeout\u003d1):"},{"line_number":56,"context_line":"        return time.sleep(timeout)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    def test_singleton(self):"},{"line_number":59,"context_line":"        \"\"\"Ensure only one object of DecisionEngineThreadPool can be created\"\"\""}],"source_content_type":"text/x-python","patch_set":5,"id":"37a94f00_732032ce","line":56,"range":{"start_line":56,"start_character":14,"end_line":56,"end_character":34},"in_reply_to":"d8dd9c09_88891298","updated":"2026-01-26 14:06:37.000000000","message":"Right, good point. The idea is to cause some delay, so we can Timeout the waiter. I think that should be possible to replace here with \u0027pass\u0027 and use timeout\u003d0, which would return the waiter right away","commit_id":"bc58b1633438b2fbf9dc8f9381ca98f2db96e58b"}]}
