)]}'
{"api-ref/source/watcher-api-v1-datamodel.inc":[{"robot_id":"zuul","robot_run_id":"02424cbd234b4be9946bc38d9f5c5053","url":"https://zuul.teim.app/t/main/buildset/02424cbd234b4be9946bc38d9f5c5053","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":"f44d094407d1955cb89251f1f5aecad7f6c80893","patch_set":1,"id":"8f5df680_319e0a16","line":21,"updated":"2026-04-30 11:41:07.000000000","message":"The API reference note says \u0027Other fields that are documented in the Response section are not automatically exposed through this API.\u0027 This wording is contradictory -- if they are documented in the Response section, they should be exposed.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Clearer documentation prevents confusion for API consumers trying to understand which fields they will receive.\n\n**Recommendation**:\nRephrase to something like: \u0027Only the fields listed in the Response section below are returned. Other internal model fields that may exist on the underlying objects are not exposed through this API endpoint.\u0027","commit_id":"a24abfcd1894cf5585c2fb95eafdafcc29c75481"}],"doc/source/contributor/plugin/cdmc-plugin.rst":[{"robot_id":"zuul","robot_run_id":"9da0d5a45c9a4d9d99338c82ee078f6d","url":"https://zuul.teim.app/t/main/buildset/9da0d5a45c9a4d9d99338c82ee078f6d","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":"57049bbb311ff1df3b366291ee9f70f2afd72b02","patch_set":4,"id":"1b843812_56e59e2d","line":117,"updated":"2026-05-04 11:40:21.000000000","message":"The contributor documentation section \u0027Managing fields in model objects\u0027 describes adding and removing fields but does not mention the frozen field allowlists or the steps needed to expose a new field through the API.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Developers adding new model fields would have clear instructions on updating the frozen allowlists, reducing the chance of fields being accidentally exposed or hidden.\n\n**Recommendation**:\nAdd a brief note in the \u0027Adding new fields\u0027 subsection pointing to FROZEN_NODE_FIELDS/FROZEN_SERVER_FIELDS in data_model.py and the commented steps already present in the source code, so contributors know where to add new fields to the allowlist when they should be API-visible.","commit_id":"c0648c041b0bd71c31493c9ee4e86e0b064541b1"}],"releasenotes/notes/freeze-data-model-api-fields-d811e6675c3d455f.yaml":[{"robot_id":"zuul","robot_run_id":"02424cbd234b4be9946bc38d9f5c5053","url":"https://zuul.teim.app/t/main/buildset/02424cbd234b4be9946bc38d9f5c5053","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":"f44d094407d1955cb89251f1f5aecad7f6c80893","patch_set":1,"id":"edc20d77_0c5a4cdd","line":2,"updated":"2026-04-30 11:41:07.000000000","message":"The release note category is \u0027upgrade\u0027 but the change is backward-compatible -- no fields are removed, only silently excluded if they were never documented. An \u0027upgrade\u0027 note may alarm operators into expecting a breaking change.\n\n**Severity**: WARNING | **Confidence**: 0.7\n\n**Impact**: Operators reading release notes may incorrectly assume this is a breaking change requiring migration planning.\n\n**Suggestion**:\nConsider moving this under a \u0027fixes\u0027 or \u0027other\u0027 section instead of \u0027upgrade\u0027. Alternatively, keep it under \u0027upgrade\u0027 but add an explicit note such as \u0027This is a non-breaking change; all previously available fields are still returned.\u0027","commit_id":"a24abfcd1894cf5585c2fb95eafdafcc29c75481"}],"watcher/api/controllers/v1/data_model.py":[{"robot_id":"zuul","robot_run_id":"02424cbd234b4be9946bc38d9f5c5053","url":"https://zuul.teim.app/t/main/buildset/02424cbd234b4be9946bc38d9f5c5053","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":"f44d094407d1955cb89251f1f5aecad7f6c80893","patch_set":1,"id":"6dfa1218_0a338d0e","line":38,"updated":"2026-04-30 11:41:07.000000000","message":"The FROZEN_NODE_FIELDS and FROZEN_SERVER_FIELDS sets duplicate the field names already declared on the ComputeNode and Instance model objects. A future developer adding a new model field must remember to update both places.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Reduces the risk of the frozen sets drifting out of sync with the actual model fields. A derived set would be self-maintaining.\n\n**Recommendation**:\nConsider adding a runtime or test-time assertion that verifies every field on ComputeNode (prefixed with \u0027node_\u0027) and Instance (prefixed with \u0027server_\u0027) is either in the frozen set or intentionally excluded. This could be a dedicated test method that introspects the model classes and compares against the frozen sets, failing CI if a new field is added without updating the allowlist.","commit_id":"a24abfcd1894cf5585c2fb95eafdafcc29c75481"},{"robot_id":"zuul","robot_run_id":"02424cbd234b4be9946bc38d9f5c5053","url":"https://zuul.teim.app/t/main/buildset/02424cbd234b4be9946bc38d9f5c5053","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":"f44d094407d1955cb89251f1f5aecad7f6c80893","patch_set":1,"id":"80c7a56f_c420fb23","line":82,"updated":"2026-04-30 11:41:07.000000000","message":"filter_data_model_fields() mutates the input dict in place by replacing obj[\u0027context\u0027]. While safe today because the RPC call returns a freshly deserialized dict, this side-effect is fragile if a future caller passes a shared reference.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: A future refactor could unintentionally corrupt data if the same dict is reused elsewhere. The function\u0027s name does not clearly signal mutation.\n\n**Suggestion**:\nConsider either (a) documenting the in-place mutation in the docstring, e.g. \u0027Modifies obj in place\u0027, or (b) returning a new dict so the caller assigns the result: rpc_all_data_model \u003d filter_data_model_fields(rpc_all_data_model). Option (b) would also make the function easier to unit-test in isolation.","commit_id":"a24abfcd1894cf5585c2fb95eafdafcc29c75481"},{"robot_id":"zuul","robot_run_id":"cff276d7f1264b6da69166b8978f3aa1","url":"https://zuul.teim.app/t/main/buildset/cff276d7f1264b6da69166b8978f3aa1","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":"03a3065a9f9621e5ed7e7e3ad111a72d52a88147","patch_set":3,"id":"cd48bb5b_843150d2","line":38,"updated":"2026-04-30 15:13:14.000000000","message":"The frozenset literals for FROZEN_NODE_FIELDS and FROZEN_SERVER_FIELDS use multi-line formatting with braces on separate lines. While valid Python, using a single frozenset({...}) call with the opening brace on the same line would be more conventional for OpenStack code.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Consistency with the rest of the watcher codebase and typical OpenStack formatting conventions for set/dict literals.\n\n**Recommendation**:\nReformat to keep the opening brace on the same line as frozenset(. For example:\n  FROZEN_NODE_FIELDS \u003d frozenset({\n      \u0027node_uuid\u0027,\n      ...\n  })\nThis is a minor style nit and not blocking.","commit_id":"d835370c3544db97f6b887b4e9524f5f5541884b"},{"robot_id":"zuul","robot_run_id":"cff276d7f1264b6da69166b8978f3aa1","url":"https://zuul.teim.app/t/main/buildset/cff276d7f1264b6da69166b8978f3aa1","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":"03a3065a9f9621e5ed7e7e3ad111a72d52a88147","patch_set":3,"id":"45f2ed56_757c40ee","line":88,"updated":"2026-04-30 15:13:14.000000000","message":"filter_data_model_fields mutates the input dict in place by replacing obj[\u0027context\u0027]. If the RPC caller retains a reference, its context list will be altered. This is consistent with hide_fields_in_newer_versions but worth noting.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: If the decision engine RPC API caches or re-uses the response dict, the filter would modify the cached object. This could cause data loss for internal consumers that expect the full field set.\n\n**Suggestion**:\nConsider making a shallow copy before filtering, or document explicitly that the function mutates its argument. At minimum, add a comment noting this is intentional and mirrors hide_fields_in_newer_versions. Since the RPC response appears to be freshly constructed each time, this is low risk in practice.","commit_id":"d835370c3544db97f6b887b4e9524f5f5541884b"},{"robot_id":"zuul","robot_run_id":"9da0d5a45c9a4d9d99338c82ee078f6d","url":"https://zuul.teim.app/t/main/buildset/9da0d5a45c9a4d9d99338c82ee078f6d","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":"57049bbb311ff1df3b366291ee9f70f2afd72b02","patch_set":4,"id":"487d6ceb_4693d664","line":1,"updated":"2026-05-04 11:40:21.000000000","message":"The commit subject \u0027Freeze data_model API response fields\u0027 is 41 characters and uses imperative mood, which is good. However, the body could more explicitly state that this is a backwards-compatible change with no microversion bump.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Reviewers scanning the commit message would immediately understand there is no API version impact, reducing review friction.\n\n**Recommendation**:\nConsider adding a sentence to the commit body such as \u0027No new API microversion is introduced; all previously available fields remain unchanged.\u0027 This is a minor suggestion and does not block merge.","commit_id":"c0648c041b0bd71c31493c9ee4e86e0b064541b1"},{"robot_id":"zuul","robot_run_id":"9da0d5a45c9a4d9d99338c82ee078f6d","url":"https://zuul.teim.app/t/main/buildset/9da0d5a45c9a4d9d99338c82ee078f6d","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":"57049bbb311ff1df3b366291ee9f70f2afd72b02","patch_set":4,"id":"3bdb7887_6d83e244","line":88,"updated":"2026-05-04 11:40:21.000000000","message":"filter_data_model_fields() mutates the RPC response dict in place. If get_data_model_info() is later called from another code path that does not expect mutation, the shared reference could cause subtle bugs. The pre-existing hide_fields_in_newer_versions() has the same pattern, so this is consistent, but worth noting.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: If the RPC response object is ever reused or cached, the in-place mutation could strip fields from other consumers. Currently the response is created fresh per request, so the risk is low.\n\n**Suggestion**:\nConsider documenting the in-place mutation contract in the docstring, e.g. \u0027Modifies obj in place; caller should pass a fresh copy if the original is needed.\u0027 Alternatively, return a new dict instead of mutating. This matches the existing hide_fields_in_newer_versions pattern so no change is strictly required.","commit_id":"c0648c041b0bd71c31493c9ee4e86e0b064541b1"}],"watcher/tests/unit/api/v1/test_data_model.py":[{"robot_id":"zuul","robot_run_id":"02424cbd234b4be9946bc38d9f5c5053","url":"https://zuul.teim.app/t/main/buildset/02424cbd234b4be9946bc38d9f5c5053","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":"f44d094407d1955cb89251f1f5aecad7f6c80893","patch_set":1,"id":"ef1c738a_34cd1a2e","line":318,"updated":"2026-04-30 11:41:07.000000000","message":"test_all_model_fields_filtered_to_frozen_set uses model.to_list() and checks only the first entry. When the model contains both compute-only nodes (no instances) and nodes with instances, the first entry may be a node-only dict without any server fields.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: Testing all entries in the response ensures both node-only and node+server entries are properly filtered.\n\n**Recommendation**:\nConsider iterating over all entries in response[\u0027context\u0027] and asserting that each entry\u0027s keys are a subset of FROZEN_NODE_FIELDS | FROZEN_SERVER_FIELDS. This would also cover node-only entries that should not contain any server_ keys.","commit_id":"a24abfcd1894cf5585c2fb95eafdafcc29c75481"},{"robot_id":"zuul","robot_run_id":"cff276d7f1264b6da69166b8978f3aa1","url":"https://zuul.teim.app/t/main/buildset/cff276d7f1264b6da69166b8978f3aa1","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":"03a3065a9f9621e5ed7e7e3ad111a72d52a88147","patch_set":3,"id":"c455fb3d_96e8468b","line":251,"updated":"2026-04-30 15:13:14.000000000","message":"The test test_unknown_fields_stripped_alongside_version_hiding only tests v1.3 (which triggers version-based hiding) but does not test the v1.6 path where version-based hiding is inactive. Adding a complementary test at v1.6 would verify the filter works independently of version hiding.\n\n**Severity**: WARNING | **Confidence**: 0.8\n\n**Impact**: Incomplete test coverage of the interaction between filter_data_model_fields and hide_fields_in_newer_versions at different API versions. The v1.6 path (where version hiding does nothing) is not explicitly tested with an unknown field present.\n\n**Suggestion**:\nAdd a test variant that uses version\u003d\u00271.6\u0027 with the same fake_response containing an unknown field and verify that the unknown field is stripped while server_pinned_az and server_flavor_extra_specs are preserved.","commit_id":"d835370c3544db97f6b887b4e9524f5f5541884b"},{"robot_id":"zuul","robot_run_id":"cff276d7f1264b6da69166b8978f3aa1","url":"https://zuul.teim.app/t/main/buildset/cff276d7f1264b6da69166b8978f3aa1","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":"03a3065a9f9621e5ed7e7e3ad111a72d52a88147","patch_set":3,"id":"54b58d47_4fcc26d4","line":291,"updated":"2026-04-30 15:13:14.000000000","message":"The _fill_missing_fields helper in TestFilterDataModelFields catches NotImplementedError broadly for all unset fields and falls back to assigning \u0027fake\u0027 for non-nullable unknown types. If a new field type is added that the _dummy list does not cover, the test may mask a real issue.\n\n**Severity**: SUGGESTION | **Confidence**: 0.7\n\n**Benefit**: More robust test helper that would alert developers if new field types are introduced that are not covered by the dummy mapping.\n\n**Recommendation**:\nConsider adding a LOG.warning or comment in the else branch noting that an unhandled field type was encountered. This is a test utility so the risk is minimal, but it would improve debuggability.","commit_id":"d835370c3544db97f6b887b4e9524f5f5541884b"},{"robot_id":"zuul","robot_run_id":"9da0d5a45c9a4d9d99338c82ee078f6d","url":"https://zuul.teim.app/t/main/buildset/9da0d5a45c9a4d9d99338c82ee078f6d","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":"57049bbb311ff1df3b366291ee9f70f2afd72b02","patch_set":4,"id":"47c8c1c0_9f98c2ed","line":335,"updated":"2026-05-04 11:40:21.000000000","message":"The test_all_model_fields_filtered_to_frozen_set test asserts that the first entry in the response context equals the union of all frozen fields. However, the first entry could be a node-only entry (no server fields) depending on the faker output order, making the assertion fragile.\n\n**Severity**: SUGGESTION | **Confidence**: 0.8\n\n**Benefit**: Makes the test robust against changes in the faker model ordering, preventing false test failures in the future.\n\n**Recommendation**:\nInstead of checking only the first entry, iterate over all context entries and verify each entry\u0027s keys are a subset of _FROZEN_ALL_FIELDS. Alternatively, assert that the union of all entry key sets equals the frozen set, which covers both node-only and combined entries.","commit_id":"c0648c041b0bd71c31493c9ee4e86e0b064541b1"}]}
