)]}'
{"watcher/common/ironic_helper.py":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"b49024ec172d0fad8e6d74633eab59e30321e9b9","unresolved":false,"context_lines":[{"line_number":71,"context_line":"            for node in self.ironic.node.list()"},{"line_number":72,"context_line":"        ]"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def get_ironic_node_by_uuid(self, node_uuid: str) -\u003e None:"},{"line_number":75,"context_line":"        \"\"\"Get ironic node by node UUID\"\"\""},{"line_number":76,"context_line":"        try:"},{"line_number":77,"context_line":"            node \u003d self.ironic.node.get(node_uuid)"}],"source_content_type":"text/x-python","patch_set":2,"id":"6c9b3ec6_cdee74ad","line":74,"updated":"2026-07-31 11:00:43.000000000","message":"The method get_ironic_node_by_uuid is annotated with return type -\u003e None, but it returns an IronicNode object (IronicNode.from_ironicclient(node)) on the final line. The annotation should be -\u003e IronicNode to match the actual return value and the pattern used by get_ironic_node_list which is corre...\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Any static type checker (mypy, pyright) will report errors at call sites that use the return value as an IronicNode. Developers relying on the annotation will be misled into thinking the method returns None.\n\n**Suggestion**:\nChange the return type annotation from -\u003e None to -\u003e IronicNode to match the actual return value.","commit_id":"f0ac21feabe598efd1e91ae679ba0493f9552bc8"}],"watcher/tests/unit/common/utils.py":[{"author":{"_account_id":28006,"name":"teim-ci","display_name":"teim-ci","email":"ci@seanmooney.info","username":"ci-sean-mooney","status":"this is a third-party ci account run by sean-k-mooney on irc\nhosted at zuul.teim.app"},"tag":"autogenerated:zuul:automatic-ci","change_message_id":"b49024ec172d0fad8e6d74633eab59e30321e9b9","unresolved":false,"context_lines":[{"line_number":306,"context_line":"            \u0027uuid\u0027: kwargs.pop(\u0027uuid\u0027, w_utils.generate_uuid()),"},{"line_number":307,"context_line":"            \u0027power_state\u0027: kwargs.pop(\u0027power_state\u0027, \u0027power on\u0027),"},{"line_number":308,"context_line":"            \u0027maintenance\u0027: kwargs.pop(\u0027maintenance\u0027, False),"},{"line_number":309,"context_line":"            \u0027maintenance_reason\u0027: kwargs.pop(\u0027maintenance_reason\u0027, \"None\"),"},{"line_number":310,"context_line":"            \u0027extra\u0027: kwargs.pop(\u0027extra\u0027, {\u0027compute_node_id\u0027: \u00271\u0027}),"},{"line_number":311,"context_line":"        }"},{"line_number":312,"context_line":"        node_info.update(kwargs)"}],"source_content_type":"text/x-python","patch_set":2,"id":"b0b68791_f824ee87","line":309,"updated":"2026-07-31 11:00:43.000000000","message":"The create_ironicclient_node test helper sets the default maintenance_reason to the string \"None\" rather than Python None. The IronicNode dataclass types maintenance_reason as str | None, and real ironic API responses use JSON null (deserialized to Python None) when a node is not in maintenance....\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Tests using the default maintenance_reason will not accurately represent production data where maintenance_reason is None (not the string \"None\") when a node is not in maintenance. Any future test asserting maintenance_reason is None will fail unless the caller explicitly passes None.\n\n**Recommendation**:\nChange the default from \"None\" to None so the test helper faithfully represents the data shape returned by the ironic API.","commit_id":"f0ac21feabe598efd1e91ae679ba0493f9552bc8"}]}
