)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"3246ed868bb548835312a529b116daa6957b5f1b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"50c609e9_aa7e054a","updated":"2026-06-23 19:57:40.000000000","message":"I don\u0027t see any issue with the implementation. Checking if someone wants to comment around nullable host/node info","commit_id":"e63fe149c2e7bff71dbeb601772fe1dc9fe6ce44"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"2a40405ce0e6a904c30d6b6fc0129d3bdc6946bc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"062d82e2_1ad5c999","updated":"2026-06-24 11:32:40.000000000","message":"Lets move on with this, we are good with additional model attributes since the API freeze during this cycle, so no breaking api is expected and unit tests handle this for us.","commit_id":"e63fe149c2e7bff71dbeb601772fe1dc9fe6ce44"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"9f780af99e680cd57ced81013e098518860f1573","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"56ffcdbf_14376212","updated":"2026-06-09 13:23:28.000000000","message":"check-rdo","commit_id":"e63fe149c2e7bff71dbeb601772fe1dc9fe6ce44"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"b27f43b7c51b1d0bc367b714fbbe3553cc9008f8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"98bd560a_75b05910","updated":"2026-06-09 10:10:11.000000000","message":"check-rdo","commit_id":"e63fe149c2e7bff71dbeb601772fe1dc9fe6ce44"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"9d0bbcc983946a7c1b837c0327840544ae405cc3","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"5064e782_ca50fdd7","updated":"2026-06-23 19:27:29.000000000","message":"teim-ci: manual","commit_id":"e63fe149c2e7bff71dbeb601772fe1dc9fe6ce44"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"86d97545e85533e6e805cd85766fa44ab20e0c88","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"e096090e_f7e09797","updated":"2026-06-09 10:10:36.000000000","message":"thanks Alfredo, the addition lgtm","commit_id":"e63fe149c2e7bff71dbeb601772fe1dc9fe6ce44"}],"watcher/decision_engine/model/element/instance.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:manual-ci","change_message_id":"89680044b97780486a008a58c0999f690b71bc15","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        \"metadata\": wfields.JsonField(),"},{"line_number":58,"context_line":"        \"project_id\": wfields.UUIDField(),"},{"line_number":59,"context_line":"        \"locked\": ovo_fields.BooleanField(default\u003dFalse),"},{"line_number":60,"context_line":"        \"host\": ovo_fields.StringField(),"},{"line_number":61,"context_line":"        \"hypervisor_hostname\": ovo_fields.StringField(),"},{"line_number":62,"context_line":"        \"created\": ovo_fields.DateTimeField(),"},{"line_number":63,"context_line":"        # New fields for extended compute model"}],"source_content_type":"text/x-python","patch_set":1,"id":"b71bad71_1e9407a8","line":60,"updated":"2026-06-23 19:46:23.000000000","message":"New Instance model fields (host, hypervisor_hostname, created) are defined without nullable\u003dTrue, causing ValueError crashes when Nova notifications deliver None values for unscheduled or error-state instances\n\n**Severity**: CRITICAL | **Confidence**: 0.9\n\n**Risk**: Notification handler crashes with ValueError when processing instance.create.end or instance.update notifications for instances without a host assigned (building, error state, scheduling failures). Silently drops notifications causing the compute data model to diverge from reality.\n\n**Priority**: Before merge\n**Why This Matters**: The notification handler at nova.py:115-119 sets these fields directly from instance_data where host and node can be None. Verified that inst.update({\u0027host\u0027: None}) raises ValueError on non-nullable StringField. This breaks notification processing for real-world unscheduled instances.\n\n**Recommendation**:\nAdd nullable\u003dTrue to all three new fields: ovo_fields.StringField(nullable\u003dTrue) for host and hypervisor_hostname, and ovo_fields.DateTimeField(nullable\u003dTrue) for created. This matches the Server dataclass which already types hypervisor_hostname as str | None.","commit_id":"e63fe149c2e7bff71dbeb601772fe1dc9fe6ce44"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"44fa522792d1aa01f4ce446670c7b2b813ca107a","unresolved":true,"context_lines":[{"line_number":57,"context_line":"        \"metadata\": wfields.JsonField(),"},{"line_number":58,"context_line":"        \"project_id\": wfields.UUIDField(),"},{"line_number":59,"context_line":"        \"locked\": ovo_fields.BooleanField(default\u003dFalse),"},{"line_number":60,"context_line":"        \"host\": ovo_fields.StringField(),"},{"line_number":61,"context_line":"        \"hypervisor_hostname\": ovo_fields.StringField(),"},{"line_number":62,"context_line":"        \"created\": ovo_fields.DateTimeField(),"},{"line_number":63,"context_line":"        # New fields for extended compute model"}],"source_content_type":"text/x-python","patch_set":1,"id":"d51c15cb_028c1f1b","line":60,"in_reply_to":"63024740_92c7db2f","updated":"2026-06-24 09:47:12.000000000","message":"Yep, you are right. Also the collector only adds instances assigned to hosts:\n\nhttps://github.com/openstack/watcher/blob/master/watcher/decision_engine/model/collector/nova.py#L467-L478\n\nSo host and hypervisor_hostname should always have a value.","commit_id":"e63fe149c2e7bff71dbeb601772fe1dc9fe6ce44"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"3246ed868bb548835312a529b116daa6957b5f1b","unresolved":true,"context_lines":[{"line_number":57,"context_line":"        \"metadata\": wfields.JsonField(),"},{"line_number":58,"context_line":"        \"project_id\": wfields.UUIDField(),"},{"line_number":59,"context_line":"        \"locked\": ovo_fields.BooleanField(default\u003dFalse),"},{"line_number":60,"context_line":"        \"host\": ovo_fields.StringField(),"},{"line_number":61,"context_line":"        \"hypervisor_hostname\": ovo_fields.StringField(),"},{"line_number":62,"context_line":"        \"created\": ovo_fields.DateTimeField(),"},{"line_number":63,"context_line":"        # New fields for extended compute model"}],"source_content_type":"text/x-python","patch_set":1,"id":"63024740_92c7db2f","line":60,"in_reply_to":"b71bad71_1e9407a8","updated":"2026-06-23 19:57:40.000000000","message":"watcher don\u0027t process instance creation error notifications, only create.end. Watcher don\u0027t handle instances that are lock associated with a node, so host, created_at should always be present.","commit_id":"e63fe149c2e7bff71dbeb601772fe1dc9fe6ce44"}],"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:manual-ci","change_message_id":"89680044b97780486a008a58c0999f690b71bc15","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# under the License."},{"line_number":14,"context_line":"#"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"\"\"\"Utilities for Watcher tests of code from the common module.\"\"\""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from openstack.compute.v2 import aggregate"}],"source_content_type":"text/x-python","patch_set":1,"id":"24480857_b4343a6a","line":16,"updated":"2026-06-23 19:46:23.000000000","message":"Extra blank line introduced between the Apache license header and the module docstring in test utils.py\n\n**Severity**: WARNING | **Confidence**: 0.9\n\n**Impact**: Cosmetic style inconsistency. Two blank lines now appear between the license block and the docstring where conventionally there should be one.\n\n**Suggestion**:\nRemove the extra blank line so there is a single blank line between the license header and the module docstring, matching the pattern used in other test utility files.","commit_id":"e63fe149c2e7bff71dbeb601772fe1dc9fe6ce44"}]}
