)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"923f4dfb0731d9668e78d52116ee71c28c02f55b","unresolved":true,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2026-10-27 12:16:15 -0500"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add type validation to validator tool"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Adds `_validate_opt_type` function to verify the type of an option value"},{"line_number":10,"context_line":"using the original option\u0027s `type.__call__` `method to do the verification."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Type validation is off by default but can be used by passing"},{"line_number":13,"context_line":"\"--validate-type\" to validator.py."},{"line_number":14,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"e065db96_c259ff55","line":11,"range":{"start_line":8,"start_character":1,"end_line":11,"end_character":1},"updated":"2026-10-28 13:14:03.000000000","message":"nit: can you wrap at \u003c\u003d 72 chars?","commit_id":"ea091a2ad53f56732ea197b82897aad18a5ede67"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"923f4dfb0731d9668e78d52116ee71c28c02f55b","unresolved":true,"context_lines":[{"line_number":10,"context_line":"using the original option\u0027s `type.__call__` `method to do the verification."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Type validation is off by default but can be used by passing"},{"line_number":13,"context_line":"\"--validate-type\" to validator.py."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Change-Id: Id67bac641e1f4e52e2d74492ac63f288e2a57d7e"},{"line_number":16,"context_line":"Signed-off-by: Clif Houck \u003cme@clifhouck.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"104e0213_23a4d7a7","line":13,"updated":"2026-10-28 13:14:03.000000000","message":"people don\u0027t call validator.py: they call `oslo-config-validator`\n\n```suggestion\n\"--validate-type\" to oslo-config-validator\n```\n\nAlso an example might be helpful? I did:\n\n```\noslo-config-validator \\\n  --config-file ./etc/nova/nova-config-generator.conf \\\n  --input-file /etc/nova/nova.conf \\\n  --validate-type\n```\n\nfrom the nova repo root dir, fwiw","commit_id":"ea091a2ad53f56732ea197b82897aad18a5ede67"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"923f4dfb0731d9668e78d52116ee71c28c02f55b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"55c2361a_2512b9a7","updated":"2026-10-28 13:14:03.000000000","message":"Couple of comments. Could do with a release note also","commit_id":"ea091a2ad53f56732ea197b82897aad18a5ede67"}],"oslo_config/tests/test_validator.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"ffa6e2b1a7d47305cd94732bdd9007f15114a1b4","unresolved":true,"context_lines":[{"line_number":68,"context_line":"\"\"\""},{"line_number":69,"context_line":"TYPE_VALIDATION_FAILURE_CONF \u003d \"\"\""},{"line_number":70,"context_line":"[foo]"},{"line_number":71,"context_line":"opt \u003d notaboolean"},{"line_number":72,"context_line":"\"\"\""},{"line_number":73,"context_line":""},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"b187234f_965f6960","line":71,"updated":"2026-10-28 13:16:11.000000000","message":"could we add a test for interpolation too? e.g.\n\n```\n[bar]\nmynumber \u003d 3\nopt \u003d $mynumber\n```\n\nidk how widely used that is, but I know nova *does* make some use of it","commit_id":"ea091a2ad53f56732ea197b82897aad18a5ede67"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"923f4dfb0731d9668e78d52116ee71c28c02f55b","unresolved":true,"context_lines":[{"line_number":181,"context_line":"        )"},{"line_number":182,"context_line":"        m \u003d mock.mock_open(read_data\u003dTYPE_VALIDATION_FAILURE_CONF)"},{"line_number":183,"context_line":"        with mock.patch(\u0027builtins.open\u0027, m):"},{"line_number":184,"context_line":"            self.assertEqual(1, validator._validate(self.conf))"}],"source_content_type":"text/x-python","patch_set":3,"id":"7ab923f7_469fa414","line":184,"updated":"2026-10-28 13:14:03.000000000","message":"Can you inspect the logs to ensure we\u0027re failing on the correct thing(s)? `LoggerFixture` / `FakeLogger` should already be registered here courtesy of oslotest","commit_id":"ea091a2ad53f56732ea197b82897aad18a5ede67"}],"oslo_config/validator.py":[{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"86ba880f19beef9020044cab95780ad6c08cf375","unresolved":true,"context_lines":[{"line_number":83,"context_line":"    cfg.BoolOpt("},{"line_number":84,"context_line":"        \u0027validate-type\u0027,"},{"line_number":85,"context_line":"        default\u003dFalse,"},{"line_number":86,"context_line":"        help\u003d\u0027Test data provided for each option by attempting to cast \u0027"},{"line_number":87,"context_line":"        \u0027it to the specified configuration type.\u0027,"},{"line_number":88,"context_line":"    ),"},{"line_number":89,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":2,"id":"3fe50c88_532eea5c","line":86,"updated":"2026-10-26 21:29:00.000000000","message":"I should probably reword this","commit_id":"fef7dac43e1143a13013a3a7112e19e4355d556d"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"b83466d182c338f774cca13f9eec249a2865c352","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    cfg.BoolOpt("},{"line_number":84,"context_line":"        \u0027validate-type\u0027,"},{"line_number":85,"context_line":"        default\u003dFalse,"},{"line_number":86,"context_line":"        help\u003d\u0027Test data provided for each option by attempting to cast \u0027"},{"line_number":87,"context_line":"        \u0027it to the specified configuration type.\u0027,"},{"line_number":88,"context_line":"    ),"},{"line_number":89,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":2,"id":"efdedd6c_153b0d9f","line":86,"in_reply_to":"3fe50c88_532eea5c","updated":"2026-10-27 17:17:33.000000000","message":"Done","commit_id":"fef7dac43e1143a13013a3a7112e19e4355d556d"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"86ba880f19beef9020044cab95780ad6c08cf375","unresolved":true,"context_lines":[{"line_number":251,"context_line":"        # Validates the value(s) of the option using the registered type"},{"line_number":252,"context_line":"        # class."},{"line_number":253,"context_line":"        for value in options[option_name]:"},{"line_number":254,"context_line":"            options_by_group[section][option_name].type(value)"},{"line_number":255,"context_line":"    except ValueError as e:"},{"line_number":256,"context_line":"        LOG.warning("},{"line_number":257,"context_line":"            \"A value of option \u0027%s\u0027 failed type validation: %s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"36bb73df_c072bb1e","line":254,"updated":"2026-10-26 21:29:00.000000000","message":"This should now do type validation with the original option\u0027s arguments, since it\u0027s referring to it directly.","commit_id":"fef7dac43e1143a13013a3a7112e19e4355d556d"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"b83466d182c338f774cca13f9eec249a2865c352","unresolved":false,"context_lines":[{"line_number":251,"context_line":"        # Validates the value(s) of the option using the registered type"},{"line_number":252,"context_line":"        # class."},{"line_number":253,"context_line":"        for value in options[option_name]:"},{"line_number":254,"context_line":"            options_by_group[section][option_name].type(value)"},{"line_number":255,"context_line":"    except ValueError as e:"},{"line_number":256,"context_line":"        LOG.warning("},{"line_number":257,"context_line":"            \"A value of option \u0027%s\u0027 failed type validation: %s\","}],"source_content_type":"text/x-python","patch_set":2,"id":"dcb78ff2_4d73af55","line":254,"in_reply_to":"36bb73df_c072bb1e","updated":"2026-10-27 17:17:33.000000000","message":"Done","commit_id":"fef7dac43e1143a13013a3a7112e19e4355d556d"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"86ba880f19beef9020044cab95780ad6c08cf375","unresolved":true,"context_lines":[{"line_number":278,"context_line":"    for group_name, group_info in groups.items():"},{"line_number":279,"context_line":"        for item in groups[group_name][\u0027namespaces\u0027]:"},{"line_number":280,"context_line":"            if item[0] in conf.namespace:"},{"line_number":281,"context_line":"                options_by_group[group_name] \u003d {"},{"line_number":282,"context_line":"                    opt.name: opt for opt in item[1]"},{"line_number":283,"context_line":"                }"},{"line_number":284,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"7a1fab3b_07aac4e2","line":281,"updated":"2026-10-26 21:29:00.000000000","message":"This isn\u0027t quite right... if there are multiple namespaces with the same group name then a group will be overwritten. Need to fix this.","commit_id":"fef7dac43e1143a13013a3a7112e19e4355d556d"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"b83466d182c338f774cca13f9eec249a2865c352","unresolved":false,"context_lines":[{"line_number":278,"context_line":"    for group_name, group_info in groups.items():"},{"line_number":279,"context_line":"        for item in groups[group_name][\u0027namespaces\u0027]:"},{"line_number":280,"context_line":"            if item[0] in conf.namespace:"},{"line_number":281,"context_line":"                options_by_group[group_name] \u003d {"},{"line_number":282,"context_line":"                    opt.name: opt for opt in item[1]"},{"line_number":283,"context_line":"                }"},{"line_number":284,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"8cc5fe56_d41a8b75","line":281,"in_reply_to":"7a1fab3b_07aac4e2","updated":"2026-10-27 17:17:33.000000000","message":"Done","commit_id":"fef7dac43e1143a13013a3a7112e19e4355d556d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"923f4dfb0731d9668e78d52116ee71c28c02f55b","unresolved":true,"context_lines":[{"line_number":204,"context_line":"    if group not in opt_data[\u0027options\u0027]:"},{"line_number":205,"context_line":"        return False"},{"line_number":206,"context_line":"    name_data \u003d [o[\u0027name\u0027] for o in opt_data[\u0027options\u0027][group][\u0027opts\u0027]]"},{"line_number":207,"context_line":"    name_data +\u003d [o.get(\u0027dest\u0027) for o in opt_data[\u0027options\u0027][group][\u0027opts\u0027]]"},{"line_number":208,"context_line":"    return option in name_data"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"46e770e0_9f0162ca","line":207,"updated":"2026-10-28 13:14:03.000000000","message":"fwiw we use both name and dest to check if an option is present, but we seem to only use the former to pull the opt for type checking. Should we checking both below also?","commit_id":"ea091a2ad53f56732ea197b82897aad18a5ede67"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"923f4dfb0731d9668e78d52116ee71c28c02f55b","unresolved":true,"context_lines":[{"line_number":267,"context_line":"        for item in groups[group_name][\u0027namespaces\u0027]:"},{"line_number":268,"context_line":"            if item[0] in conf.namespace:"},{"line_number":269,"context_line":"                if item[0] not in organized_options:"},{"line_number":270,"context_line":"                    organized_options[item[0]] \u003d {}"},{"line_number":271,"context_line":"                organized_options[item[0]][group_name] \u003d {"},{"line_number":272,"context_line":"                    opt.name: opt for opt in item[1]"},{"line_number":273,"context_line":"                }"},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"    return organized_options"},{"line_number":276,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"0b1844a7_bb654a98","line":273,"range":{"start_line":270,"start_character":51,"end_line":273,"end_character":17},"updated":"2026-10-28 13:14:03.000000000","message":"per above, do we need to store `opt.dest` also (or somehow normalize things)?","commit_id":"ea091a2ad53f56732ea197b82897aad18a5ede67"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"923f4dfb0731d9668e78d52116ee71c28c02f55b","unresolved":true,"context_lines":[{"line_number":298,"context_line":"            continue"},{"line_number":299,"context_line":"        for option in options:"},{"line_number":300,"context_line":"            if _validate_deprecated_opt(section, option, opt_data):"},{"line_number":301,"context_line":"                LOG.warning(\u0027Deprecated opt %s/%s found\u0027, section, option)"},{"line_number":302,"context_line":"                warnings \u003d True"},{"line_number":303,"context_line":"            else:"},{"line_number":304,"context_line":"                opt_present \u003d _validate_opt_presence(section, option, opt_data)"}],"source_content_type":"text/x-python","patch_set":3,"id":"a5f5e5b3_06234b91","line":301,"updated":"2026-10-28 13:14:03.000000000","message":"This is a pre-existing issue, but I assume the fact that we  *don\u0027t* validate deprecated opts is okay here?","commit_id":"ea091a2ad53f56732ea197b82897aad18a5ede67"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"923f4dfb0731d9668e78d52116ee71c28c02f55b","unresolved":true,"context_lines":[{"line_number":303,"context_line":"            else:"},{"line_number":304,"context_line":"                opt_present \u003d _validate_opt_presence(section, option, opt_data)"},{"line_number":305,"context_line":"                if opt_present:"},{"line_number":306,"context_line":"                    if conf.validate_type and conf.namespace:"},{"line_number":307,"context_line":"                        type_validated \u003d _validate_opt_type("},{"line_number":308,"context_line":"                            conf.namespace,"},{"line_number":309,"context_line":"                            section,"}],"source_content_type":"text/x-python","patch_set":3,"id":"0cc4178e_17e3a4aa","line":306,"updated":"2026-10-28 13:14:03.000000000","message":"Do we want to raise an error if a user requests `--validate-type` and `--opt-data` instead? I\u0027m guessing we *must* load opts from the entrypoint? Something like\n\n```suggestion\n                    if conf.validate_type:\n                        if not conf.namespace:\n                            # user provided --opt-data instead\n                            raise RuntimeError(\n                                \u0027Cannot validate types against serialized \u0027\n                                \u0027options definitions\u0027\n                            )\n\n```","commit_id":"ea091a2ad53f56732ea197b82897aad18a5ede67"}]}
