)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"5cea164cc1b39a4ccef710e7e9e83d006ecd48f6","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":5,"id":"44dae2b3_d17a3779","updated":"2026-01-26 19:00:06.000000000","message":"@kajinamit@oss.nttdata.com Would it be possible to do that check as I had suggested with oslo_config?","commit_id":"28c1bc7c4d3ee2cf51cb41993af2134ac3925f05"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"2b94bcfb5ac83cefb246afd848dc35701a7a25c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"9de8cfa6_79e4abbb","in_reply_to":"44dae2b3_d17a3779","updated":"2026-01-27 08:48:05.000000000","message":"Done","commit_id":"28c1bc7c4d3ee2cf51cb41993af2134ac3925f05"}],"ironic/common/trait_based_networking/loader.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"b826d87a3174482f7e3706be9ba98394a5dade74","unresolved":true,"context_lines":[{"line_number":70,"context_line":"                return []"},{"line_number":71,"context_line":"            return self._config_file.traits()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _load_tbn_config(self):"},{"line_number":74,"context_line":"        \"\"\"Load Trait Based Networking configuration file for later use\"\"\""},{"line_number":75,"context_line":"        if not CONF.conductor.enable_trait_based_networking:"},{"line_number":76,"context_line":"            LOG.debug(_(\u0027Trait Based Networking not enabled, skipping loading \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"96b56193_b6229416","line":73,"updated":"2026-01-07 19:39:57.000000000","message":"When do the errors we\u0027re catching throughout this method first get exercised?\n\nI\u0027m basically concerned about this possibility:\n- operator running conductor w/TBN successfully\n- operator pushes out an invalid config\n- conductor stops operating in a way that\u0027s tough to detect in monitoring\n\nI\u0027m not 100% sure it\u0027s possible, but if:\n- Ironic is configured for TBN\n- TBN config cannot be loaded\n\nThe best behavior is /probably/ to fail the deployment loudly rather than fallback to the original logic in Ironic for network mapping. I don\u0027t *think* this will fail loudly as written, I think it\u0027ll fallback to the old way -- am I misreading?","commit_id":"3ebd00c155e23fe8d260672518013e236823406d"},{"author":{"_account_id":5890,"name":"Doug Goldstein","email":"cardoe@cardoe.com","username":"cardoe"},"change_message_id":"83f575c696457f2215d559f97ce7c3eb607b4147","unresolved":true,"context_lines":[{"line_number":70,"context_line":"                return []"},{"line_number":71,"context_line":"            return self._config_file.traits()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _load_tbn_config(self):"},{"line_number":74,"context_line":"        \"\"\"Load Trait Based Networking configuration file for later use\"\"\""},{"line_number":75,"context_line":"        if not CONF.conductor.enable_trait_based_networking:"},{"line_number":76,"context_line":"            LOG.debug(_(\u0027Trait Based Networking not enabled, skipping loading \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"340676d8_c5f7dfb1","line":73,"in_reply_to":"1ea56829_9facd3e8","updated":"2026-01-23 17:44:52.000000000","message":"You can have an oslo_config validator call this on the supplied argument so that we\u0027ll fail to even start up if the supplied initial file is invalid. Then for the refresh operation, if the new file is invalid you could use the existing state and throw a loud error and let the person try to refresh again.","commit_id":"3ebd00c155e23fe8d260672518013e236823406d"},{"author":{"_account_id":9816,"name":"Takashi Kajinami","email":"kajinamit@oss.nttdata.com","username":"kajinamit"},"change_message_id":"2b94bcfb5ac83cefb246afd848dc35701a7a25c7","unresolved":true,"context_lines":[{"line_number":70,"context_line":"                return []"},{"line_number":71,"context_line":"            return self._config_file.traits()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _load_tbn_config(self):"},{"line_number":74,"context_line":"        \"\"\"Load Trait Based Networking configuration file for later use\"\"\""},{"line_number":75,"context_line":"        if not CONF.conductor.enable_trait_based_networking:"},{"line_number":76,"context_line":"            LOG.debug(_(\u0027Trait Based Networking not enabled, skipping loading \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"c94eef24_16a01cee","line":73,"in_reply_to":"340676d8_c5f7dfb1","updated":"2026-01-27 08:48:05.000000000","message":"Current validation mechanism in oslo.config provides only mechanism to check a single option and does not provide the ones to\n - check consistency between multiple files\n - Run some tasks like loading and validating files according to the given value\n\nso I\u0027m afraid that current check logic can\u0027t be migrated immediately.\n\nOne option is to create an plugin mechanism to oslo.config so that it can run additional checks by oslo-config-validator. I\u0027ll check if that can be easily implemented but that\u0027s a work for long-term.","commit_id":"3ebd00c155e23fe8d260672518013e236823406d"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"0a6646dc196ef07f324e04d79e342cb753c46ce4","unresolved":true,"context_lines":[{"line_number":70,"context_line":"                return []"},{"line_number":71,"context_line":"            return self._config_file.traits()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _load_tbn_config(self):"},{"line_number":74,"context_line":"        \"\"\"Load Trait Based Networking configuration file for later use\"\"\""},{"line_number":75,"context_line":"        if not CONF.conductor.enable_trait_based_networking:"},{"line_number":76,"context_line":"            LOG.debug(_(\u0027Trait Based Networking not enabled, skipping loading \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"1ea56829_9facd3e8","line":73,"in_reply_to":"96b56193_b6229416","updated":"2026-01-16 19:27:15.000000000","message":"I added some code to the conductor so it\u0027ll try to load the configuration file if TBN is enabled and fail loudly if the configuration is invalid.","commit_id":"3ebd00c155e23fe8d260672518013e236823406d"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"6e77250e1609fc7038108e2a2cb648b8b027d942","unresolved":false,"context_lines":[{"line_number":70,"context_line":"                return []"},{"line_number":71,"context_line":"            return self._config_file.traits()"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"    def _load_tbn_config(self):"},{"line_number":74,"context_line":"        \"\"\"Load Trait Based Networking configuration file for later use\"\"\""},{"line_number":75,"context_line":"        if not CONF.conductor.enable_trait_based_networking:"},{"line_number":76,"context_line":"            LOG.debug(_(\u0027Trait Based Networking not enabled, skipping loading \u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3acc4c17_c969c479","line":73,"in_reply_to":"c94eef24_16a01cee","updated":"2026-01-28 18:12:05.000000000","message":"Acknowledged","commit_id":"3ebd00c155e23fe8d260672518013e236823406d"},{"author":{"_account_id":11655,"name":"Julia Kreger","email":"juliaashleykreger@gmail.com","username":"jkreger","status":"Flying to the moon with a Jetpack!"},"change_message_id":"4300ff6d779140c784a81eb062c5ef8bb453b5f3","unresolved":true,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class ConfigLoader(object):"},{"line_number":46,"context_line":"    def __init__(self):"},{"line_number":47,"context_line":"        self._lock \u003d threading.Lock()"},{"line_number":48,"context_line":"        self._last_mtime \u003d None"},{"line_number":49,"context_line":"        self._config_file \u003d None"},{"line_number":50,"context_line":"        self._valid \u003d False"}],"source_content_type":"text/x-python","patch_set":5,"id":"e8914144_63b34c62","line":47,"updated":"2026-01-26 15:00:32.000000000","message":"So, I think you want to re-use _LOADER_LOCK, otherwise you end up with multiple instances of self._lock on each instance of ConfigLoader that don\u0027t see each other nor possibly have the cross-threaded lock becuase it is created on line 25.","commit_id":"28c1bc7c4d3ee2cf51cb41993af2134ac3925f05"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"be50858ea594a22efff0f03c8b4807c90d9f7d14","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class ConfigLoader(object):"},{"line_number":46,"context_line":"    def __init__(self):"},{"line_number":47,"context_line":"        self._lock \u003d threading.Lock()"},{"line_number":48,"context_line":"        self._last_mtime \u003d None"},{"line_number":49,"context_line":"        self._config_file \u003d None"},{"line_number":50,"context_line":"        self._valid \u003d False"}],"source_content_type":"text/x-python","patch_set":5,"id":"d386b14e_424abee1","line":47,"in_reply_to":"469bf1c0_5d9ba598","updated":"2026-01-28 17:38:49.000000000","message":"Decided to remove the unnecessary class-level threading lock.","commit_id":"28c1bc7c4d3ee2cf51cb41993af2134ac3925f05"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"b4c7e9658cc43a8d53a1240e4b9f78c54a15fa64","unresolved":true,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class ConfigLoader(object):"},{"line_number":46,"context_line":"    def __init__(self):"},{"line_number":47,"context_line":"        self._lock \u003d threading.Lock()"},{"line_number":48,"context_line":"        self._last_mtime \u003d None"},{"line_number":49,"context_line":"        self._config_file \u003d None"},{"line_number":50,"context_line":"        self._valid \u003d False"}],"source_content_type":"text/x-python","patch_set":5,"id":"469bf1c0_5d9ba598","line":47,"in_reply_to":"e8914144_63b34c62","updated":"2026-01-26 18:12:35.000000000","message":"Yes, this took a slightly different direction than first intended. The way this is currently structured, and called by `TaskManager` there should be only one `ConfigLoader` at a time. The class-level `Lock` may not be necessary. Re-using the module-level `_LOADER_LOCK` inside the class would be a mistake imo. Unless I\u0027m misunderstanding the broader execution context.","commit_id":"28c1bc7c4d3ee2cf51cb41993af2134ac3925f05"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"4695722297535c6725b6d6c2ffe0add576ba2c02","unresolved":true,"context_lines":[{"line_number":82,"context_line":"    def _load_tbn_config(self):"},{"line_number":83,"context_line":"        \"\"\"Load Trait Based Networking configuration file for later use\"\"\""},{"line_number":84,"context_line":"        if not CONF.conductor.enable_trait_based_networking:"},{"line_number":85,"context_line":"            LOG.debug(_(\u0027Trait Based Networking not enabled, skipping loading \u0027"},{"line_number":86,"context_line":"                        \u0027configuration file.\u0027))"},{"line_number":87,"context_line":"            return"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"3932b3e1_42c8d12e","line":85,"updated":"2026-01-28 17:41:08.000000000","message":"We typically do not _() log messages.","commit_id":"e30c0cea3375ea66879a011da9cd0d945249abe5"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"6e77250e1609fc7038108e2a2cb648b8b027d942","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def _load_tbn_config(self):"},{"line_number":83,"context_line":"        \"\"\"Load Trait Based Networking configuration file for later use\"\"\""},{"line_number":84,"context_line":"        if not CONF.conductor.enable_trait_based_networking:"},{"line_number":85,"context_line":"            LOG.debug(_(\u0027Trait Based Networking not enabled, skipping loading \u0027"},{"line_number":86,"context_line":"                        \u0027configuration file.\u0027))"},{"line_number":87,"context_line":"            return"},{"line_number":88,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"32d99ac2_67df0924","line":85,"in_reply_to":"3932b3e1_42c8d12e","updated":"2026-01-28 18:12:05.000000000","message":"Done","commit_id":"e30c0cea3375ea66879a011da9cd0d945249abe5"},{"author":{"_account_id":36770,"name":"cid","display_name":"cid","email":"cid@gr-oss.io","username":"cidelight","status":"@gr-oss upstream: Doing good IRONIC things..."},"change_message_id":"75ea18913c6881f2ef1cb37f0dad26c15f3ec52b","unresolved":true,"context_lines":[{"line_number":89,"context_line":"        LOG.info((\u0027Loading Trait Based Networking configuration located at \u0027"},{"line_number":90,"context_line":"                  \u0027%(file_location)s\u0027),"},{"line_number":91,"context_line":"                 {\u0027file_location\u0027: \\"},{"line_number":92,"context_line":"                  CONF.conductor.trait_based_networking_config_file })"},{"line_number":93,"context_line":"        try:"},{"line_number":94,"context_line":"            self._config_file \u003d ConfigFile("},{"line_number":95,"context_line":"                CONF.conductor.trait_based_networking_config_file)"}],"source_content_type":"text/x-python","patch_set":8,"id":"ae554557_f4b899cf","line":92,"range":{"start_line":92,"start_character":67,"end_line":92,"end_character":68},"updated":"2026-02-03 17:21:26.000000000","message":"nit:","commit_id":"22d088d45684101907db9efb32d96f5914c9a124"}],"ironic/conductor/base_manager.py":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"4695722297535c6725b6d6c2ffe0add576ba2c02","unresolved":true,"context_lines":[{"line_number":178,"context_line":"        self._init_executors(CONF.conductor.workers_pool_size,"},{"line_number":179,"context_line":"                             CONF.conductor.reserved_workers_pool_percentage)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        # Load TBN configuration if enabled, and bail if configuration is"},{"line_number":182,"context_line":"        # invalid."},{"line_number":183,"context_line":"        if CONF.conductor.enable_trait_based_networking:"},{"line_number":184,"context_line":"            loader.tbn_config_file_traits()"}],"source_content_type":"text/x-python","patch_set":7,"id":"dd606f63_e2af39a8","line":181,"updated":"2026-01-28 17:41:08.000000000","message":"nit: typically in openstack, for comments/notes, we name ourselves e.g. # NOTE(clif): Load ....","commit_id":"e30c0cea3375ea66879a011da9cd0d945249abe5"},{"author":{"_account_id":14228,"name":"Clif Houck","email":"me@clifhouck.com","username":"clif_h"},"change_message_id":"6e77250e1609fc7038108e2a2cb648b8b027d942","unresolved":false,"context_lines":[{"line_number":178,"context_line":"        self._init_executors(CONF.conductor.workers_pool_size,"},{"line_number":179,"context_line":"                             CONF.conductor.reserved_workers_pool_percentage)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"        # Load TBN configuration if enabled, and bail if configuration is"},{"line_number":182,"context_line":"        # invalid."},{"line_number":183,"context_line":"        if CONF.conductor.enable_trait_based_networking:"},{"line_number":184,"context_line":"            loader.tbn_config_file_traits()"}],"source_content_type":"text/x-python","patch_set":7,"id":"941b9586_0f2cd643","line":181,"in_reply_to":"dd606f63_e2af39a8","updated":"2026-01-28 18:12:05.000000000","message":"Acknowledged","commit_id":"e30c0cea3375ea66879a011da9cd0d945249abe5"}]}
