)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"140191107bef9693c8c18e5ffe9ad2e890d7eec9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"e9a4ccb6_a58dcccf","updated":"2026-02-03 08:40:53.000000000","message":"recheck","commit_id":"fe5164610623e0c7b8bf420c2baa6b504d017df2"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"c0caa20cb2935a4e5cff84fa9d004997e117bb70","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"9befd729_a97f26e9","updated":"2026-02-02 16:01:02.000000000","message":"recheck unrelated devstack compute failure","commit_id":"fe5164610623e0c7b8bf420c2baa6b504d017df2"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"bf08831366bd3f10d3bbd11f27620b2cd276439f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":28,"id":"d6aa6b9b_ca94a285","updated":"2026-02-23 15:21:50.000000000","message":"LGMT, some comments can be fixed in follow ups. I will check with Alfredo if he is also OK with the change before W+1","commit_id":"8c11479ad0db4d0dcca8b2e8140cf7b6324e45f9"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"fce6c12dc6bd48caf0b5b01a23739e83e4906b9f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":28,"id":"9df9cc43_1b0ecb87","updated":"2026-02-19 17:47:17.000000000","message":"recheck","commit_id":"8c11479ad0db4d0dcca8b2e8140cf7b6324e45f9"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"795e2ed667ea0b030efb85bd9d6cbb481cafa03d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":28,"id":"11b3063c_e237cebe","in_reply_to":"d6aa6b9b_ca94a285","updated":"2026-02-24 07:55:35.000000000","message":"LGTM too","commit_id":"8c11479ad0db4d0dcca8b2e8140cf7b6324e45f9"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"74ebf43e818e37c362ecef563ad31b20c4adfda4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"501d4e66_bb3c33ca","updated":"2026-02-24 11:18:51.000000000","message":"recheck unrelated failure in the continuous audit tempest test","commit_id":"06e361e0aa18b78bbe830b01fc3cc6d9cc1efca2"}],"devstack/lib/watcher":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"537fc25108ced74a2465ed2ffcd4fd18c9fb3f7c","unresolved":true,"context_lines":[{"line_number":171,"context_line":"}"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"# configure the section to connect to other services, e.g [nova]"},{"line_number":174,"context_line":"function configure_watcher_other_client_section {"},{"line_number":175,"context_line":"    local section\u003d$1"},{"line_number":176,"context_line":"    iniset $WATCHER_CONF $section auth_type \"password\""},{"line_number":177,"context_line":"    iniset $WATCHER_CONF $section auth_url \"$KEYSTONE_SERVICE_URI\""}],"source_content_type":"application/octet-stream","patch_set":25,"id":"f0e906b1_dc60985a","line":174,"range":{"start_line":174,"start_character":9,"end_line":174,"end_character":47},"updated":"2026-02-18 14:56:13.000000000","message":"we are adding or recnetly added a helper for this in devstack that we could reuse\n\nhttps://review.opendev.org/c/openstack/devstack/+/954751\n\n\nthat shoudl merge soon but we can adress this in a follow up","commit_id":"497ea1d2f3301d68c2477e1785474d0b1ea9c3a3"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"5888776fe128c29d92e7a0488472d2e47f7bda21","unresolved":false,"context_lines":[{"line_number":171,"context_line":"}"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"# configure the section to connect to other services, e.g [nova]"},{"line_number":174,"context_line":"function configure_watcher_other_client_section {"},{"line_number":175,"context_line":"    local section\u003d$1"},{"line_number":176,"context_line":"    iniset $WATCHER_CONF $section auth_type \"password\""},{"line_number":177,"context_line":"    iniset $WATCHER_CONF $section auth_url \"$KEYSTONE_SERVICE_URI\""}],"source_content_type":"application/octet-stream","patch_set":25,"id":"0b2bd0c9_25f2b36f","line":174,"range":{"start_line":174,"start_character":9,"end_line":174,"end_character":47},"in_reply_to":"e1b98c3b_676f5577","updated":"2026-02-19 08:52:06.000000000","message":"Done","commit_id":"497ea1d2f3301d68c2477e1785474d0b1ea9c3a3"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"a555c8afba6a89d9441b2e8f0f346505300980dd","unresolved":true,"context_lines":[{"line_number":171,"context_line":"}"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"# configure the section to connect to other services, e.g [nova]"},{"line_number":174,"context_line":"function configure_watcher_other_client_section {"},{"line_number":175,"context_line":"    local section\u003d$1"},{"line_number":176,"context_line":"    iniset $WATCHER_CONF $section auth_type \"password\""},{"line_number":177,"context_line":"    iniset $WATCHER_CONF $section auth_url \"$KEYSTONE_SERVICE_URI\""}],"source_content_type":"application/octet-stream","patch_set":25,"id":"e1b98c3b_676f5577","line":174,"range":{"start_line":174,"start_character":9,"end_line":174,"end_character":47},"in_reply_to":"f0e906b1_dc60985a","updated":"2026-02-19 08:19:32.000000000","message":"oh that\u0027s cool, I have to update this patch, so I\u0027ll wait until that lands and use it","commit_id":"497ea1d2f3301d68c2477e1785474d0b1ea9c3a3"}],"releasenotes/notes/prepare-openstacksdk-migration-73cc43ab26ed47e6.yaml":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"a51996923ea70f2103faed9c0a8a7a39733fc884","unresolved":true,"context_lines":[{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Connection settings for Nova should be added"},{"line_number":5,"context_line":"    directly to the [nova] section of the configuration now, instead of nova_client."},{"line_number":6,"context_line":"deprecations:"},{"line_number":7,"context_line":"  - |"},{"line_number":8,"context_line":"    The nova_client configuration options are deprecated and will be removed"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"1f984277_62a7584c","line":5,"range":{"start_line":5,"start_character":72,"end_line":5,"end_character":83},"updated":"2026-02-18 19:49:23.000000000","message":"nit: [nova_client] and other below, since [nova] has the brackets","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"5888776fe128c29d92e7a0488472d2e47f7bda21","unresolved":false,"context_lines":[{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Connection settings for Nova should be added"},{"line_number":5,"context_line":"    directly to the [nova] section of the configuration now, instead of nova_client."},{"line_number":6,"context_line":"deprecations:"},{"line_number":7,"context_line":"  - |"},{"line_number":8,"context_line":"    The nova_client configuration options are deprecated and will be removed"}],"source_content_type":"text/x-yaml","patch_set":19,"id":"99434c3d_55493545","line":5,"range":{"start_line":5,"start_character":72,"end_line":5,"end_character":83},"in_reply_to":"1f984277_62a7584c","updated":"2026-02-19 08:52:06.000000000","message":"good point, fixed!","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b6603ab795aab9a68d42ce61d200320825697df6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"upgrade:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    Connection settings for Nova should be added"}],"source_content_type":"text/x-yaml","patch_set":28,"id":"c640cc9a_d16a1ce2","line":1,"in_reply_to":"5432bbd5_e83fbc95","updated":"2026-02-19 11:41:03.000000000","message":"no this is fine as is.\nwe have a fallback in place to the old value and config docs so we should be covered.","commit_id":"8c11479ad0db4d0dcca8b2e8140cf7b6324e45f9"}],"watcher/common/clients.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"73992cfe13f8daaf8e4e3aa993d640681edd281e","unresolved":true,"context_lines":[{"line_number":57,"context_line":"    # NOTE(jgilaber): load the auth plugin from the config in case it\u0027s never"},{"line_number":58,"context_line":"    # been loaded before. The auth plugin is only used when creating a new"},{"line_number":59,"context_line":"    # session, but we need to ensure the auth_url config value is set to use"},{"line_number":60,"context_line":"    # the user token from the context object"},{"line_number":61,"context_line":"    auth \u003d ka_loading.load_auth_from_conf_options("},{"line_number":62,"context_line":"        CONF, _CLIENTS_AUTH_GROUP"},{"line_number":63,"context_line":"    )"},{"line_number":64,"context_line":"    if context is not None:"},{"line_number":65,"context_line":"        # create a connection using the user\u0027s token if unavailable"},{"line_number":66,"context_line":"        conn \u003d connection.Connection("},{"line_number":67,"context_line":"            token\u003dcontext.auth_token,"},{"line_number":68,"context_line":"            auth_type\u003d\"v3token\","},{"line_number":69,"context_line":"            project_id\u003dcontext.project_id,"},{"line_number":70,"context_line":"            project_domain_id\u003dcontext.project_domain_id,"},{"line_number":71,"context_line":"            auth_url\u003dCONF.watcher_clients_auth.auth_url"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        return conn"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    if session is None:"},{"line_number":76,"context_line":"        # if we don\u0027t have a user token nor a created session, create a new"},{"line_number":77,"context_line":"        # one"},{"line_number":78,"context_line":"        session \u003d ka_loading.load_session_from_conf_options("},{"line_number":79,"context_line":"            CONF, _CLIENTS_AUTH_GROUP, auth\u003dauth"},{"line_number":80,"context_line":"        )"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    return connection.Connection(session\u003dsession, oslo_conf\u003dCONF)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def check_min_nova_api_version(config_version):"}],"source_content_type":"text/x-python","patch_set":18,"id":"fe930ec7_c36bf3ac","line":82,"range":{"start_line":60,"start_character":0,"end_line":82,"end_character":65},"updated":"2026-02-11 16:32:41.000000000","message":"I think you also need to parametrize the region_name and identity_interface for the connection which is defined on each client config section (nova_client, cinder_client), etc... and it\u0027s not part of the session.","commit_id":"2010d162605a86f50c81f36d8afb353cd654859e"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"7c3725199d67a699108d6862e06f5b891a899f48","unresolved":true,"context_lines":[{"line_number":57,"context_line":"    # NOTE(jgilaber): load the auth plugin from the config in case it\u0027s never"},{"line_number":58,"context_line":"    # been loaded before. The auth plugin is only used when creating a new"},{"line_number":59,"context_line":"    # session, but we need to ensure the auth_url config value is set to use"},{"line_number":60,"context_line":"    # the user token from the context object"},{"line_number":61,"context_line":"    auth \u003d ka_loading.load_auth_from_conf_options("},{"line_number":62,"context_line":"        CONF, _CLIENTS_AUTH_GROUP"},{"line_number":63,"context_line":"    )"},{"line_number":64,"context_line":"    if context is not None:"},{"line_number":65,"context_line":"        # create a connection using the user\u0027s token if unavailable"},{"line_number":66,"context_line":"        conn \u003d connection.Connection("},{"line_number":67,"context_line":"            token\u003dcontext.auth_token,"},{"line_number":68,"context_line":"            auth_type\u003d\"v3token\","},{"line_number":69,"context_line":"            project_id\u003dcontext.project_id,"},{"line_number":70,"context_line":"            project_domain_id\u003dcontext.project_domain_id,"},{"line_number":71,"context_line":"            auth_url\u003dCONF.watcher_clients_auth.auth_url"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        return conn"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    if session is None:"},{"line_number":76,"context_line":"        # if we don\u0027t have a user token nor a created session, create a new"},{"line_number":77,"context_line":"        # one"},{"line_number":78,"context_line":"        session \u003d ka_loading.load_session_from_conf_options("},{"line_number":79,"context_line":"            CONF, _CLIENTS_AUTH_GROUP, auth\u003dauth"},{"line_number":80,"context_line":"        )"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    return connection.Connection(session\u003dsession, oslo_conf\u003dCONF)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def check_min_nova_api_version(config_version):"}],"source_content_type":"text/x-python","patch_set":18,"id":"809f5dd6_1ff358c5","line":82,"range":{"start_line":60,"start_character":0,"end_line":82,"end_character":65},"in_reply_to":"37e37fc4_ee1dfc46","updated":"2026-02-18 10:06:33.000000000","message":"My understanding is that when using `connection.Connection` as in:\n\n```\n        conn \u003d connection.Connection(\n            token\u003dcontext.auth_token,\n            auth_type\u003d\"v3token\",\n            project_id\u003dcontext.project_id,\n            project_domain_id\u003dcontext.project_domain_id,\n            auth_url\u003dCONF.watcher_clients_auth.auth_url\n        )\n```\n\nIt does not read oslo config options at all and will rely in default values for the rest of parameters including region_name and interface. In order to make it use the ones we want we also need to pass those values from parameters, config files (as you did in last PS for auth_url) or maybe we can read from other context keys.\n\nIn https://docs.openstack.org/openstacksdk/latest/user/guides/connect.html#create-connection there is an example of this way of constructing the connection which includes the region. Also see https://github.com/openstack/openstacksdk/blob/master/openstack/connection.py#L83-L93","commit_id":"2010d162605a86f50c81f36d8afb353cd654859e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"537fc25108ced74a2465ed2ffcd4fd18c9fb3f7c","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    # NOTE(jgilaber): load the auth plugin from the config in case it\u0027s never"},{"line_number":58,"context_line":"    # been loaded before. The auth plugin is only used when creating a new"},{"line_number":59,"context_line":"    # session, but we need to ensure the auth_url config value is set to use"},{"line_number":60,"context_line":"    # the user token from the context object"},{"line_number":61,"context_line":"    auth \u003d ka_loading.load_auth_from_conf_options("},{"line_number":62,"context_line":"        CONF, _CLIENTS_AUTH_GROUP"},{"line_number":63,"context_line":"    )"},{"line_number":64,"context_line":"    if context is not None:"},{"line_number":65,"context_line":"        # create a connection using the user\u0027s token if unavailable"},{"line_number":66,"context_line":"        conn \u003d connection.Connection("},{"line_number":67,"context_line":"            token\u003dcontext.auth_token,"},{"line_number":68,"context_line":"            auth_type\u003d\"v3token\","},{"line_number":69,"context_line":"            project_id\u003dcontext.project_id,"},{"line_number":70,"context_line":"            project_domain_id\u003dcontext.project_domain_id,"},{"line_number":71,"context_line":"            auth_url\u003dCONF.watcher_clients_auth.auth_url"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        return conn"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    if session is None:"},{"line_number":76,"context_line":"        # if we don\u0027t have a user token nor a created session, create a new"},{"line_number":77,"context_line":"        # one"},{"line_number":78,"context_line":"        session \u003d ka_loading.load_session_from_conf_options("},{"line_number":79,"context_line":"            CONF, _CLIENTS_AUTH_GROUP, auth\u003dauth"},{"line_number":80,"context_line":"        )"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    return connection.Connection(session\u003dsession, oslo_conf\u003dCONF)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def check_min_nova_api_version(config_version):"}],"source_content_type":"text/x-python","patch_set":18,"id":"90bd6be6_ea7a3fc5","line":82,"range":{"start_line":60,"start_character":0,"end_line":82,"end_character":65},"in_reply_to":"40ad90fa_3d0fccfd","updated":"2026-02-18 14:56:13.000000000","message":"Acknowledged","commit_id":"2010d162605a86f50c81f36d8afb353cd654859e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b6184abe7cdb02b8301422b1ecc9497315e0517a","unresolved":true,"context_lines":[{"line_number":57,"context_line":"    # NOTE(jgilaber): load the auth plugin from the config in case it\u0027s never"},{"line_number":58,"context_line":"    # been loaded before. The auth plugin is only used when creating a new"},{"line_number":59,"context_line":"    # session, but we need to ensure the auth_url config value is set to use"},{"line_number":60,"context_line":"    # the user token from the context object"},{"line_number":61,"context_line":"    auth \u003d ka_loading.load_auth_from_conf_options("},{"line_number":62,"context_line":"        CONF, _CLIENTS_AUTH_GROUP"},{"line_number":63,"context_line":"    )"},{"line_number":64,"context_line":"    if context is not None:"},{"line_number":65,"context_line":"        # create a connection using the user\u0027s token if unavailable"},{"line_number":66,"context_line":"        conn \u003d connection.Connection("},{"line_number":67,"context_line":"            token\u003dcontext.auth_token,"},{"line_number":68,"context_line":"            auth_type\u003d\"v3token\","},{"line_number":69,"context_line":"            project_id\u003dcontext.project_id,"},{"line_number":70,"context_line":"            project_domain_id\u003dcontext.project_domain_id,"},{"line_number":71,"context_line":"            auth_url\u003dCONF.watcher_clients_auth.auth_url"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        return conn"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    if session is None:"},{"line_number":76,"context_line":"        # if we don\u0027t have a user token nor a created session, create a new"},{"line_number":77,"context_line":"        # one"},{"line_number":78,"context_line":"        session \u003d ka_loading.load_session_from_conf_options("},{"line_number":79,"context_line":"            CONF, _CLIENTS_AUTH_GROUP, auth\u003dauth"},{"line_number":80,"context_line":"        )"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    return connection.Connection(session\u003dsession, oslo_conf\u003dCONF)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def check_min_nova_api_version(config_version):"}],"source_content_type":"text/x-python","patch_set":18,"id":"d8a3f434_4f8a49ef","line":82,"range":{"start_line":60,"start_character":0,"end_line":82,"end_character":65},"in_reply_to":"7ffaeb24_9dd76485","updated":"2026-02-11 18:59:27.000000000","message":"yes and no\n\nso you are correct that the region shoudl be take care fo by ensureing we are using keystoneauth\n\nbut we need to ensure we registery the defautl keyston auth config option under nova and entirly remvoe \n\nhttps://docs.openstack.org/watcher/latest/configuration/watcher.html#watcher-clients-auth\n\nin the fureu because each openstack servce any be in indepenent region and cna use entirly independnet ca certs for example.\n\nthis is existing technial debt in watcher but we shoudl not rely on https://docs.openstack.org/watcher/latest/configuration/watcher.html#watcher-clients-auth\ngoing forward\n\nwe shoudl however fall back to watcher-clients-auth if the value are not in the nova section by having oslo default the nova values to the watcher-clients-auth values.","commit_id":"2010d162605a86f50c81f36d8afb353cd654859e"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"55c6d29f69c16ed2ca3064d46f9d5b1f141f750a","unresolved":true,"context_lines":[{"line_number":57,"context_line":"    # NOTE(jgilaber): load the auth plugin from the config in case it\u0027s never"},{"line_number":58,"context_line":"    # been loaded before. The auth plugin is only used when creating a new"},{"line_number":59,"context_line":"    # session, but we need to ensure the auth_url config value is set to use"},{"line_number":60,"context_line":"    # the user token from the context object"},{"line_number":61,"context_line":"    auth \u003d ka_loading.load_auth_from_conf_options("},{"line_number":62,"context_line":"        CONF, _CLIENTS_AUTH_GROUP"},{"line_number":63,"context_line":"    )"},{"line_number":64,"context_line":"    if context is not None:"},{"line_number":65,"context_line":"        # create a connection using the user\u0027s token if unavailable"},{"line_number":66,"context_line":"        conn \u003d connection.Connection("},{"line_number":67,"context_line":"            token\u003dcontext.auth_token,"},{"line_number":68,"context_line":"            auth_type\u003d\"v3token\","},{"line_number":69,"context_line":"            project_id\u003dcontext.project_id,"},{"line_number":70,"context_line":"            project_domain_id\u003dcontext.project_domain_id,"},{"line_number":71,"context_line":"            auth_url\u003dCONF.watcher_clients_auth.auth_url"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        return conn"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    if session is None:"},{"line_number":76,"context_line":"        # if we don\u0027t have a user token nor a created session, create a new"},{"line_number":77,"context_line":"        # one"},{"line_number":78,"context_line":"        session \u003d ka_loading.load_session_from_conf_options("},{"line_number":79,"context_line":"            CONF, _CLIENTS_AUTH_GROUP, auth\u003dauth"},{"line_number":80,"context_line":"        )"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    return connection.Connection(session\u003dsession, oslo_conf\u003dCONF)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def check_min_nova_api_version(config_version):"}],"source_content_type":"text/x-python","patch_set":18,"id":"40ad90fa_3d0fccfd","line":82,"range":{"start_line":60,"start_character":0,"end_line":82,"end_character":65},"in_reply_to":"809f5dd6_1ff358c5","updated":"2026-02-18 11:46:07.000000000","message":"I\u0027ve added the two parameters when creating the connection using the token from the Context object","commit_id":"2010d162605a86f50c81f36d8afb353cd654859e"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"1ad384c171fadf8960c1a0959f45f3626f277cc3","unresolved":true,"context_lines":[{"line_number":57,"context_line":"    # NOTE(jgilaber): load the auth plugin from the config in case it\u0027s never"},{"line_number":58,"context_line":"    # been loaded before. The auth plugin is only used when creating a new"},{"line_number":59,"context_line":"    # session, but we need to ensure the auth_url config value is set to use"},{"line_number":60,"context_line":"    # the user token from the context object"},{"line_number":61,"context_line":"    auth \u003d ka_loading.load_auth_from_conf_options("},{"line_number":62,"context_line":"        CONF, _CLIENTS_AUTH_GROUP"},{"line_number":63,"context_line":"    )"},{"line_number":64,"context_line":"    if context is not None:"},{"line_number":65,"context_line":"        # create a connection using the user\u0027s token if unavailable"},{"line_number":66,"context_line":"        conn \u003d connection.Connection("},{"line_number":67,"context_line":"            token\u003dcontext.auth_token,"},{"line_number":68,"context_line":"            auth_type\u003d\"v3token\","},{"line_number":69,"context_line":"            project_id\u003dcontext.project_id,"},{"line_number":70,"context_line":"            project_domain_id\u003dcontext.project_domain_id,"},{"line_number":71,"context_line":"            auth_url\u003dCONF.watcher_clients_auth.auth_url"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        return conn"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    if session is None:"},{"line_number":76,"context_line":"        # if we don\u0027t have a user token nor a created session, create a new"},{"line_number":77,"context_line":"        # one"},{"line_number":78,"context_line":"        session \u003d ka_loading.load_session_from_conf_options("},{"line_number":79,"context_line":"            CONF, _CLIENTS_AUTH_GROUP, auth\u003dauth"},{"line_number":80,"context_line":"        )"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    return connection.Connection(session\u003dsession, oslo_conf\u003dCONF)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def check_min_nova_api_version(config_version):"}],"source_content_type":"text/x-python","patch_set":18,"id":"37e37fc4_ee1dfc46","line":82,"range":{"start_line":60,"start_character":0,"end_line":82,"end_character":65},"in_reply_to":"d8a3f434_4f8a49ef","updated":"2026-02-17 19:48:41.000000000","message":"ack, I\u0027ll also register the auth options in the nova group and add the watcher-clients-auth as fallback as suggested","commit_id":"2010d162605a86f50c81f36d8afb353cd654859e"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"0693bd0710ae6dd1f6af3bbdc972a23c9f2fabe6","unresolved":true,"context_lines":[{"line_number":57,"context_line":"    # NOTE(jgilaber): load the auth plugin from the config in case it\u0027s never"},{"line_number":58,"context_line":"    # been loaded before. The auth plugin is only used when creating a new"},{"line_number":59,"context_line":"    # session, but we need to ensure the auth_url config value is set to use"},{"line_number":60,"context_line":"    # the user token from the context object"},{"line_number":61,"context_line":"    auth \u003d ka_loading.load_auth_from_conf_options("},{"line_number":62,"context_line":"        CONF, _CLIENTS_AUTH_GROUP"},{"line_number":63,"context_line":"    )"},{"line_number":64,"context_line":"    if context is not None:"},{"line_number":65,"context_line":"        # create a connection using the user\u0027s token if unavailable"},{"line_number":66,"context_line":"        conn \u003d connection.Connection("},{"line_number":67,"context_line":"            token\u003dcontext.auth_token,"},{"line_number":68,"context_line":"            auth_type\u003d\"v3token\","},{"line_number":69,"context_line":"            project_id\u003dcontext.project_id,"},{"line_number":70,"context_line":"            project_domain_id\u003dcontext.project_domain_id,"},{"line_number":71,"context_line":"            auth_url\u003dCONF.watcher_clients_auth.auth_url"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        return conn"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    if session is None:"},{"line_number":76,"context_line":"        # if we don\u0027t have a user token nor a created session, create a new"},{"line_number":77,"context_line":"        # one"},{"line_number":78,"context_line":"        session \u003d ka_loading.load_session_from_conf_options("},{"line_number":79,"context_line":"            CONF, _CLIENTS_AUTH_GROUP, auth\u003dauth"},{"line_number":80,"context_line":"        )"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    return connection.Connection(session\u003dsession, oslo_conf\u003dCONF)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def check_min_nova_api_version(config_version):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7ffaeb24_9dd76485","line":82,"range":{"start_line":60,"start_character":0,"end_line":82,"end_character":65},"in_reply_to":"fe930ec7_c36bf3ac","updated":"2026-02-11 18:06:51.000000000","message":"this should be taken from the oslo conf, this is why in this change I deprecated the [nova_client] config section in favor of [nova], because the openstacksdk reads that directly","commit_id":"2010d162605a86f50c81f36d8afb353cd654859e"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b6184abe7cdb02b8301422b1ecc9497315e0517a","unresolved":false,"context_lines":[{"line_number":46,"context_line":"warnings.simplefilter(\"once\")"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def get_sdk_connection(session\u003dNone, context\u003dNone):"},{"line_number":50,"context_line":"    \"\"\"Create and return an OpenStackSDK Connection object."},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    :param session: Optional keystone session. If not provided, a new session"}],"source_content_type":"text/x-python","patch_set":19,"id":"8cf36ed6_90c41330","line":49,"in_reply_to":"be606f50_4315c099","updated":"2026-02-11 18:59:27.000000000","message":"i think this is fine.","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"57ebbb7e2a4aa2cffc095ce5f43e090e06a894f3","unresolved":true,"context_lines":[{"line_number":63,"context_line":"    )"},{"line_number":64,"context_line":"    if context is not None:"},{"line_number":65,"context_line":"        # create a connection using the user\u0027s token if unavailable"},{"line_number":66,"context_line":"        conn \u003d connection.Connection("},{"line_number":67,"context_line":"            token\u003dcontext.auth_token,"},{"line_number":68,"context_line":"            auth_type\u003d\"v3token\","},{"line_number":69,"context_line":"            project_id\u003dcontext.project_id,"},{"line_number":70,"context_line":"            project_domain_id\u003dcontext.project_domain_id,"},{"line_number":71,"context_line":"            auth_url\u003dCONF.watcher_clients_auth.auth_url"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        return conn"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    if session is None:"}],"source_content_type":"text/x-python","patch_set":19,"id":"6bdbb9ca_452c5d5e","line":72,"range":{"start_line":66,"start_character":0,"end_line":72,"end_character":9},"updated":"2026-02-12 17:25:36.000000000","message":"As my tests, this is not reading any configuration and it\u0027s always building the connection with default interface and region_name. Apparently the oslo_config only can be used when a session is created and you need to pass interface and region_name options as parameters of Connection in this case.\n\nI\u0027d propose to add **kwargs here from the get_sdk_connection. That would allow to pass the region and interface when calling the get_sdk_connection in case we want to create it from an existing context and read it from nova section, or you can add an option as conf_group to use and get the values from the config file in get_sdk_connection method.","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"5888776fe128c29d92e7a0488472d2e47f7bda21","unresolved":false,"context_lines":[{"line_number":63,"context_line":"    )"},{"line_number":64,"context_line":"    if context is not None:"},{"line_number":65,"context_line":"        # create a connection using the user\u0027s token if unavailable"},{"line_number":66,"context_line":"        conn \u003d connection.Connection("},{"line_number":67,"context_line":"            token\u003dcontext.auth_token,"},{"line_number":68,"context_line":"            auth_type\u003d\"v3token\","},{"line_number":69,"context_line":"            project_id\u003dcontext.project_id,"},{"line_number":70,"context_line":"            project_domain_id\u003dcontext.project_domain_id,"},{"line_number":71,"context_line":"            auth_url\u003dCONF.watcher_clients_auth.auth_url"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        return conn"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    if session is None:"}],"source_content_type":"text/x-python","patch_set":19,"id":"a52a7c32_0e204742","line":72,"range":{"start_line":66,"start_character":0,"end_line":72,"end_character":9},"in_reply_to":"0e0cd4f5_49861709","updated":"2026-02-19 08:52:06.000000000","message":"Acknowledged","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"537fc25108ced74a2465ed2ffcd4fd18c9fb3f7c","unresolved":true,"context_lines":[{"line_number":63,"context_line":"    )"},{"line_number":64,"context_line":"    if context is not None:"},{"line_number":65,"context_line":"        # create a connection using the user\u0027s token if unavailable"},{"line_number":66,"context_line":"        conn \u003d connection.Connection("},{"line_number":67,"context_line":"            token\u003dcontext.auth_token,"},{"line_number":68,"context_line":"            auth_type\u003d\"v3token\","},{"line_number":69,"context_line":"            project_id\u003dcontext.project_id,"},{"line_number":70,"context_line":"            project_domain_id\u003dcontext.project_domain_id,"},{"line_number":71,"context_line":"            auth_url\u003dCONF.watcher_clients_auth.auth_url"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        return conn"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    if session is None:"}],"source_content_type":"text/x-python","patch_set":19,"id":"0e0cd4f5_49861709","line":72,"range":{"start_line":66,"start_character":0,"end_line":72,"end_character":9},"in_reply_to":"5b3acd5e_678d1c44","updated":"2026-02-18 14:56:13.000000000","message":"so the token has a catalog but we do need to supprot nova being in region 1 and cinder being in region 2\n\n\nlets park this for now but we shoudl file a bug for proper  multi region supprot in watcher\n\ncurrently watcher can supprot diffent services beitng in diffent region but it cant talkd to a single service that has multiple regiouns and that a gap we will need to adress in teh future.","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"f18ee97521ccf03288cab8deb1f8d988c833fcad","unresolved":true,"context_lines":[{"line_number":63,"context_line":"    )"},{"line_number":64,"context_line":"    if context is not None:"},{"line_number":65,"context_line":"        # create a connection using the user\u0027s token if unavailable"},{"line_number":66,"context_line":"        conn \u003d connection.Connection("},{"line_number":67,"context_line":"            token\u003dcontext.auth_token,"},{"line_number":68,"context_line":"            auth_type\u003d\"v3token\","},{"line_number":69,"context_line":"            project_id\u003dcontext.project_id,"},{"line_number":70,"context_line":"            project_domain_id\u003dcontext.project_domain_id,"},{"line_number":71,"context_line":"            auth_url\u003dCONF.watcher_clients_auth.auth_url"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        return conn"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    if session is None:"}],"source_content_type":"text/x-python","patch_set":19,"id":"c46794a6_6eeaf8aa","line":72,"range":{"start_line":66,"start_character":0,"end_line":72,"end_character":9},"in_reply_to":"6bdbb9ca_452c5d5e","updated":"2026-02-12 17:54:50.000000000","message":"this is the create a connection form a prexisting toke path.\n\nbut if we ant it to read the config we need to actully pass it the config.\n\nthe token ahs a catalong so the logic of this path i guess is to use the endpoint that are part of the catalog in the edxisting token so imnot sure if we need to read the config or not in this case.","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"1ad384c171fadf8960c1a0959f45f3626f277cc3","unresolved":true,"context_lines":[{"line_number":63,"context_line":"    )"},{"line_number":64,"context_line":"    if context is not None:"},{"line_number":65,"context_line":"        # create a connection using the user\u0027s token if unavailable"},{"line_number":66,"context_line":"        conn \u003d connection.Connection("},{"line_number":67,"context_line":"            token\u003dcontext.auth_token,"},{"line_number":68,"context_line":"            auth_type\u003d\"v3token\","},{"line_number":69,"context_line":"            project_id\u003dcontext.project_id,"},{"line_number":70,"context_line":"            project_domain_id\u003dcontext.project_domain_id,"},{"line_number":71,"context_line":"            auth_url\u003dCONF.watcher_clients_auth.auth_url"},{"line_number":72,"context_line":"        )"},{"line_number":73,"context_line":"        return conn"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"    if session is None:"}],"source_content_type":"text/x-python","patch_set":19,"id":"5b3acd5e_678d1c44","line":72,"range":{"start_line":66,"start_character":0,"end_line":72,"end_character":9},"in_reply_to":"c46794a6_6eeaf8aa","updated":"2026-02-17 19:48:41.000000000","message":"honestly I\u0027m not sure if we\u0027d need to pass the region_name here or not, I have not found a clear answer in the documentation. I\u0027ve been working using the nova function as a guide https://github.com/openstack/nova/blob/8a4b000216c7a6c2673af78d7eb7f9bf938dc867/nova/utils.py#L945-L962 since it was the clearest example I could find of a project using openstacksdk. In Nova, they allow kwargs, but as far as I can see it\u0027s only used for passing an option related to a microversion https://github.com/openstack/nova/blob/f3d9188a937518e9dbfa434436ba336bc2107fc2/nova/share/manila.py#L41. I assumed what @smooney@redhat.com mentioned, that the token would contain all the necessary information","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"57ebbb7e2a4aa2cffc095ce5f43e090e06a894f3","unresolved":true,"context_lines":[{"line_number":79,"context_line":"            CONF, _CLIENTS_AUTH_GROUP, auth\u003dauth"},{"line_number":80,"context_line":"        )"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    return connection.Connection(session\u003dsession, oslo_conf\u003dCONF)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def check_min_nova_api_version(config_version):"}],"source_content_type":"text/x-python","patch_set":19,"id":"bd698e2c_b31068e2","line":82,"range":{"start_line":82,"start_character":4,"end_line":82,"end_character":65},"updated":"2026-02-12 17:25:36.000000000","message":"This way of building the connection from session is working as expected wrt the conf, reading nova section, etc... (with the exception of the interface option which i commented in watcher/conf/nova.py.","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"1ad384c171fadf8960c1a0959f45f3626f277cc3","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            CONF, _CLIENTS_AUTH_GROUP, auth\u003dauth"},{"line_number":80,"context_line":"        )"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    return connection.Connection(session\u003dsession, oslo_conf\u003dCONF)"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"def check_min_nova_api_version(config_version):"}],"source_content_type":"text/x-python","patch_set":19,"id":"3baeb74d_e9941338","line":82,"range":{"start_line":82,"start_character":4,"end_line":82,"end_character":65},"in_reply_to":"bd698e2c_b31068e2","updated":"2026-02-17 19:48:41.000000000","message":"Acknowledged, thanks for testing Alfredo!","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b6184abe7cdb02b8301422b1ecc9497315e0517a","unresolved":false,"context_lines":[{"line_number":91,"context_line":"    \"\"\""},{"line_number":92,"context_line":"    min_required \u003d nova_api_versions.APIVersion(MIN_NOVA_API_VERSION)"},{"line_number":93,"context_line":"    if nova_api_versions.APIVersion(config_version) \u003c min_required:"},{"line_number":94,"context_line":"        raise ValueError(f\u0027Invalid nova.api_version {config_version}. \u0027"},{"line_number":95,"context_line":"                         f\u0027{MIN_NOVA_API_VERSION} or greater is required.\u0027)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"aa5873c4_8d45e8d0","line":94,"in_reply_to":"1d2633bc_d1025913","updated":"2026-02-11 18:59:27.000000000","message":"ya so i need to refine this. we do not translate logs anymore but we tchnially shoudl translate excption hwoever i cofnigured the tooling to block that.\n\nfor now we can ignore this and we shoudl deceid how we will proceed with this later.","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"537fc25108ced74a2465ed2ffcd4fd18c9fb3f7c","unresolved":true,"context_lines":[{"line_number":89,"context_line":"            region_name\u003dregion_name,"},{"line_number":90,"context_line":"            interface\u003dinterface"},{"line_number":91,"context_line":"        )"},{"line_number":92,"context_line":"        return conn"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    if session is None:"},{"line_number":95,"context_line":"        # if we don\u0027t have a user token nor a created session, create a new"}],"source_content_type":"text/x-python","patch_set":25,"id":"50da9121_9580d667","line":92,"updated":"2026-02-18 14:56:13.000000000","message":"this looks ok to me as well","commit_id":"497ea1d2f3301d68c2477e1785474d0b1ea9c3a3"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"5888776fe128c29d92e7a0488472d2e47f7bda21","unresolved":false,"context_lines":[{"line_number":89,"context_line":"            region_name\u003dregion_name,"},{"line_number":90,"context_line":"            interface\u003dinterface"},{"line_number":91,"context_line":"        )"},{"line_number":92,"context_line":"        return conn"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    if session is None:"},{"line_number":95,"context_line":"        # if we don\u0027t have a user token nor a created session, create a new"}],"source_content_type":"text/x-python","patch_set":25,"id":"b0a2fdee_447ed3dd","line":92,"in_reply_to":"145417bb_206ef20c","updated":"2026-02-19 08:52:06.000000000","message":"Acknowledged","commit_id":"497ea1d2f3301d68c2477e1785474d0b1ea9c3a3"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"8465c3d1ca24984f3005d9db6c0475571fb12de3","unresolved":true,"context_lines":[{"line_number":89,"context_line":"            region_name\u003dregion_name,"},{"line_number":90,"context_line":"            interface\u003dinterface"},{"line_number":91,"context_line":"        )"},{"line_number":92,"context_line":"        return conn"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    if session is None:"},{"line_number":95,"context_line":"        # if we don\u0027t have a user token nor a created session, create a new"}],"source_content_type":"text/x-python","patch_set":25,"id":"145417bb_206ef20c","line":92,"in_reply_to":"50da9121_9580d667","updated":"2026-02-18 15:11:51.000000000","message":"yep, I think this is now creating the conection properly in both cases.","commit_id":"497ea1d2f3301d68c2477e1785474d0b1ea9c3a3"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"537fc25108ced74a2465ed2ffcd4fd18c9fb3f7c","unresolved":true,"context_lines":[{"line_number":98,"context_line":"            CONF, conf_group, auth\u003dauth"},{"line_number":99,"context_line":"        )"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    return connection.Connection(session\u003dsession, oslo_conf\u003dCONF)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"def check_min_nova_api_version(config_version):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3e19deb4_5ec2ac34","line":101,"updated":"2026-02-18 14:56:13.000000000","message":"this should work for the conf workflow","commit_id":"497ea1d2f3301d68c2477e1785474d0b1ea9c3a3"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"5888776fe128c29d92e7a0488472d2e47f7bda21","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            CONF, conf_group, auth\u003dauth"},{"line_number":99,"context_line":"        )"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"    return connection.Connection(session\u003dsession, oslo_conf\u003dCONF)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"def check_min_nova_api_version(config_version):"}],"source_content_type":"text/x-python","patch_set":25,"id":"dac76497_c8242bf0","line":101,"in_reply_to":"3e19deb4_5ec2ac34","updated":"2026-02-19 08:52:06.000000000","message":"Acknowledged","commit_id":"497ea1d2f3301d68c2477e1785474d0b1ea9c3a3"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"5888776fe128c29d92e7a0488472d2e47f7bda21","unresolved":true,"context_lines":[{"line_number":46,"context_line":"warnings.simplefilter(\"once\")"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def get_sdk_connection("},{"line_number":50,"context_line":"    conf_group, session\u003dNone, context\u003dNone, interface\u003dNone, region_name\u003dNone"},{"line_number":51,"context_line":"):"},{"line_number":52,"context_line":"    \"\"\"Create and return an OpenStackSDK Connection object."}],"source_content_type":"text/x-python","patch_set":27,"id":"9e3b4c2d_8ac9d264","line":49,"in_reply_to":"770e7222_992380e9","updated":"2026-02-19 08:52:06.000000000","message":"\u003e Missing type hints for new public function\n\u003e \n\u003e **Severity**: WARNING | **Confidence**: 0.7\n\u003e \n\u003e **Impact**: The get_sdk_connection function lacks type hints for parameters and return value. This reduces IDE support and makes the code less self-documenting.\n\u003e \n\u003e **Suggestion**:\n\u003e Add type hints to the function signature: \u0027def get_sdk_connection(conf_group: str, session: Optional[ksa_session.Session] \u003d None, context: Optional[context.RequestContext] \u003d None, interface: Optional[str] \u003d None, region_name: Optional[str] \u003d None) -\u003e connection.Connection:\u0027\n\nDone, I think it\u0027s a good idea to slowly start adding type hints to the code and this seems a good point to start","commit_id":"5a4acf71021d0b2efcb40db28c18f4cb5e6e045c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b6603ab795aab9a68d42ce61d200320825697df6","unresolved":false,"context_lines":[{"line_number":46,"context_line":"warnings.simplefilter(\"once\")"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def get_sdk_connection("},{"line_number":50,"context_line":"    conf_group, session\u003dNone, context\u003dNone, interface\u003dNone, region_name\u003dNone"},{"line_number":51,"context_line":"):"},{"line_number":52,"context_line":"    \"\"\"Create and return an OpenStackSDK Connection object."}],"source_content_type":"text/x-python","patch_set":27,"id":"3aed278f_4a8bf4ef","line":49,"in_reply_to":"9e3b4c2d_8ac9d264","updated":"2026-02-19 11:41:03.000000000","message":"yes and this is something that ai can help with.\n\nmy priorty list in this regard is shortly after RC1 im going to push the patches to mvoe us to ruff and enable import sorting for formating\n\ni have a few other minor automation tweaks i want to add too.\n\nthen i woud like to start on typing\n\nthis cycle stephen finucan added types to almost all of oslo.\n\ni suggested they try and get claude to help withit and the created a really helpful claude.md\n\nhttps://github.com/stephenfin/openstack-agentsmd/blob/main/AGENTS.md?plain\u003d1#L110-L212\n\nso once we have better auto formating in places with ruff i would like to start lookign at typing following the leasons that he learned and distilled form doing this for all of oslo and the sdk\n\nim going to do this for cyborg as well once i have pre-commit and ruff ectra in place there.\n\nfirst step will be graually add linters and fix the finding then ill swap to ruff for formating and start typing everyting.","commit_id":"5a4acf71021d0b2efcb40db28c18f4cb5e6e045c"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"bf08831366bd3f10d3bbd11f27620b2cd276439f","unresolved":true,"context_lines":[{"line_number":71,"context_line":"    if context is not None:"},{"line_number":72,"context_line":"        if interface is None:"},{"line_number":73,"context_line":"            if \"valid_interfaces\" in CONF[conf_group]:"},{"line_number":74,"context_line":"                interface \u003d CONF[conf_group].valid_interfaces"},{"line_number":75,"context_line":"            elif \"interface\" in CONF[conf_group]:"},{"line_number":76,"context_line":"                interface \u003d CONF[conf_group].interface"},{"line_number":77,"context_line":"        if region_name is None and \"region_name\" in CONF[conf_group]:"}],"source_content_type":"text/x-python","patch_set":27,"id":"e52cc7ab_e3bfd846","line":74,"in_reply_to":"16e5ba47_8f4055fa","updated":"2026-02-23 15:21:50.000000000","message":"Ack, since we now support valid_interfaces for nova config, I think that is valid to get the first interface from the list.","commit_id":"5a4acf71021d0b2efcb40db28c18f4cb5e6e045c"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"a51996923ea70f2103faed9c0a8a7a39733fc884","unresolved":true,"context_lines":[{"line_number":71,"context_line":"    if context is not None:"},{"line_number":72,"context_line":"        if interface is None:"},{"line_number":73,"context_line":"            if \"valid_interfaces\" in CONF[conf_group]:"},{"line_number":74,"context_line":"                interface \u003d CONF[conf_group].valid_interfaces"},{"line_number":75,"context_line":"            elif \"interface\" in CONF[conf_group]:"},{"line_number":76,"context_line":"                interface \u003d CONF[conf_group].interface"},{"line_number":77,"context_line":"        if region_name is None and \"region_name\" in CONF[conf_group]:"}],"source_content_type":"text/x-python","patch_set":27,"id":"9bb0b1d9_f98560d2","line":74,"in_reply_to":"5f43b335_9b422d48","updated":"2026-02-18 19:49:23.000000000","message":"This looks like an issue. Or should you provide the valid_interfaces to Connection?","commit_id":"5a4acf71021d0b2efcb40db28c18f4cb5e6e045c"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"5888776fe128c29d92e7a0488472d2e47f7bda21","unresolved":true,"context_lines":[{"line_number":71,"context_line":"    if context is not None:"},{"line_number":72,"context_line":"        if interface is None:"},{"line_number":73,"context_line":"            if \"valid_interfaces\" in CONF[conf_group]:"},{"line_number":74,"context_line":"                interface \u003d CONF[conf_group].valid_interfaces"},{"line_number":75,"context_line":"            elif \"interface\" in CONF[conf_group]:"},{"line_number":76,"context_line":"                interface \u003d CONF[conf_group].interface"},{"line_number":77,"context_line":"        if region_name is None and \"region_name\" in CONF[conf_group]:"}],"source_content_type":"text/x-python","patch_set":27,"id":"b9b417ea_af65a49b","line":74,"in_reply_to":"9bb0b1d9_f98560d2","updated":"2026-02-19 08:52:06.000000000","message":"yes, I think this is a valid issue. I could not find a matching example in the documentation, but the way keystoneauth handles these parameters is to assign the value of `valid_interfaces` to `interface`, so we should pass a string to be safe","commit_id":"5a4acf71021d0b2efcb40db28c18f4cb5e6e045c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b6603ab795aab9a68d42ce61d200320825697df6","unresolved":true,"context_lines":[{"line_number":71,"context_line":"    if context is not None:"},{"line_number":72,"context_line":"        if interface is None:"},{"line_number":73,"context_line":"            if \"valid_interfaces\" in CONF[conf_group]:"},{"line_number":74,"context_line":"                interface \u003d CONF[conf_group].valid_interfaces"},{"line_number":75,"context_line":"            elif \"interface\" in CONF[conf_group]:"},{"line_number":76,"context_line":"                interface \u003d CONF[conf_group].interface"},{"line_number":77,"context_line":"        if region_name is None and \"region_name\" in CONF[conf_group]:"}],"source_content_type":"text/x-python","patch_set":27,"id":"16e5ba47_8f4055fa","line":74,"in_reply_to":"b9b417ea_af65a49b","updated":"2026-02-19 11:41:03.000000000","message":"ya so the general best practice is prefer supproting the list of interfaces which is preferecally ordered\n\n\ni.e. [\"internal\", \"public\"]\n\n\nwhere as interface only supproted one value\n\nbut watcher only supproted interface before so this is an enchnmetn that coud be made later\nhttps://docs.openstack.org/watcher/latest/configuration/watcher.html#aetos_client.interface","commit_id":"5a4acf71021d0b2efcb40db28c18f4cb5e6e045c"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b6603ab795aab9a68d42ce61d200320825697df6","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def get_sdk_connection("},{"line_number":52,"context_line":"        conf_group: str, session: ka_session.Session | None \u003d None,"},{"line_number":53,"context_line":"        context: context.RequestContext | None \u003d None,"},{"line_number":54,"context_line":"        interface: str | None \u003d None, region_name: str | None \u003d None"},{"line_number":55,"context_line":"        ) -\u003e connection.Connection:"}],"source_content_type":"text/x-python","patch_set":28,"id":"5a71392a_76e4011e","line":52,"in_reply_to":"c559f1b8_d0caa5fb","updated":"2026-02-19 11:41:03.000000000","message":"no we only supprot python 3.10+ and the future annotation is deprecated i need to explcity tell it not to recomment this anymore.\nand imporantly have my review bot read pyproject.toml so it know what versions of python we supprot.","commit_id":"8c11479ad0db4d0dcca8b2e8140cf7b6324e45f9"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"bf08831366bd3f10d3bbd11f27620b2cd276439f","unresolved":true,"context_lines":[{"line_number":75,"context_line":"    if context is not None:"},{"line_number":76,"context_line":"        if interface is None:"},{"line_number":77,"context_line":"            if \"valid_interfaces\" in CONF[conf_group]:"},{"line_number":78,"context_line":"                interface \u003d CONF[conf_group].valid_interfaces[0]"},{"line_number":79,"context_line":"            elif \"interface\" in CONF[conf_group]:"},{"line_number":80,"context_line":"                interface \u003d CONF[conf_group].interface"},{"line_number":81,"context_line":"        if region_name is None and \"region_name\" in CONF[conf_group]:"}],"source_content_type":"text/x-python","patch_set":28,"id":"92c852dc_35122f2f","line":78,"in_reply_to":"59d4cec5_b8e5fb9e","updated":"2026-02-23 15:21:50.000000000","message":"in general, we should check if we will end with an exception in these lines and if needed, we can try/except here instead of using getattr as previous suggested by teim-ci.","commit_id":"8c11479ad0db4d0dcca8b2e8140cf7b6324e45f9"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"bf08831366bd3f10d3bbd11f27620b2cd276439f","unresolved":true,"context_lines":[{"line_number":106,"context_line":"def check_min_nova_api_version(config_version):"},{"line_number":107,"context_line":"    \"\"\"Validates the minimum required nova API version."},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"    :param config_version: The configured [nova_client]/api_version value"},{"line_number":110,"context_line":"    :raises: ValueError if the configured version is less than the required"},{"line_number":111,"context_line":"        minimum"},{"line_number":112,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":28,"id":"3a9a8b09_4ad06d4e","line":109,"in_reply_to":"e7a98dc5_a69b61e2","updated":"2026-02-23 15:21:50.000000000","message":"Yes, can be fixed in a follow up","commit_id":"8c11479ad0db4d0dcca8b2e8140cf7b6324e45f9"}],"watcher/common/nova_helper.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"537fc25108ced74a2465ed2ffcd4fd18c9fb3f7c","unresolved":false,"context_lines":[{"line_number":89,"context_line":"    return decorator"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"@dc.dataclass(frozen\u003dTrue)"},{"line_number":93,"context_line":"class Server:"},{"line_number":94,"context_line":"    \"\"\"Pure dataclass for server data."},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"889aa488_66259cfb","line":92,"in_reply_to":"3da02569_e03f836f","updated":"2026-02-18 14:56:13.000000000","message":"Done","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b6184abe7cdb02b8301422b1ecc9497315e0517a","unresolved":true,"context_lines":[{"line_number":89,"context_line":"    return decorator"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":""},{"line_number":92,"context_line":"@dc.dataclass(frozen\u003dTrue)"},{"line_number":93,"context_line":"class Server:"},{"line_number":94,"context_line":"    \"\"\"Pure dataclass for server data."},{"line_number":95,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"3da02569_e03f836f","line":92,"in_reply_to":"e4700525_574b7b87","updated":"2026-02-11 18:59:27.000000000","message":"good suggestion\nwe can do that in a followup\n\nim more insterested in adding `__post_init__` methods for uuid validateion and any other validation we may want btu this is also valid","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"a51996923ea70f2103faed9c0a8a7a39733fc884","unresolved":true,"context_lines":[{"line_number":160,"context_line":"        :returns: Server dataclass instance"},{"line_number":161,"context_line":"        :raises: InvalidUUID if server ID is not a valid UUID"},{"line_number":162,"context_line":"        \"\"\""},{"line_number":163,"context_line":"        try:"},{"line_number":164,"context_line":"            uuid.UUID(nova_server.id)"},{"line_number":165,"context_line":"        except (ValueError, AttributeError, TypeError):"},{"line_number":166,"context_line":"            raise exception.InvalidUUID(uuid\u003dnova_server.id)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        return cls("},{"line_number":169,"context_line":"            uuid\u003dnova_server.id,"}],"source_content_type":"text/x-python","patch_set":21,"id":"4eb0f368_aa7f1593","line":166,"range":{"start_line":163,"start_character":0,"end_line":166,"end_character":60},"updated":"2026-02-18 19:49:23.000000000","message":"can\u0027t we consider this as covered by `__post_init__` from previous patch? Same for the following \"from_openstacksdk\" methods","commit_id":"88694f96d2c95cccf3de1229f8a3dd2a43131c60"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"5888776fe128c29d92e7a0488472d2e47f7bda21","unresolved":false,"context_lines":[{"line_number":160,"context_line":"        :returns: Server dataclass instance"},{"line_number":161,"context_line":"        :raises: InvalidUUID if server ID is not a valid UUID"},{"line_number":162,"context_line":"        \"\"\""},{"line_number":163,"context_line":"        try:"},{"line_number":164,"context_line":"            uuid.UUID(nova_server.id)"},{"line_number":165,"context_line":"        except (ValueError, AttributeError, TypeError):"},{"line_number":166,"context_line":"            raise exception.InvalidUUID(uuid\u003dnova_server.id)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"        return cls("},{"line_number":169,"context_line":"            uuid\u003dnova_server.id,"}],"source_content_type":"text/x-python","patch_set":21,"id":"82317002_fb6df7bf","line":166,"range":{"start_line":163,"start_character":0,"end_line":166,"end_character":60},"in_reply_to":"4eb0f368_aa7f1593","updated":"2026-02-19 08:52:06.000000000","message":"yes, good catch, I must have reintroduced this by mistake while rebasing, fixed it","commit_id":"88694f96d2c95cccf3de1229f8a3dd2a43131c60"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"537fc25108ced74a2465ed2ffcd4fd18c9fb3f7c","unresolved":false,"context_lines":[{"line_number":38,"context_line":"CONF \u003d conf.CONF"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"def nova_retries(call):"},{"line_number":42,"context_line":"    @functools.wraps(call)"},{"line_number":43,"context_line":"    def wrapper(*args, **kwargs):"},{"line_number":44,"context_line":"        retries \u003d CONF.nova.http_retries"}],"source_content_type":"text/x-python","patch_set":25,"id":"4c331942_a4448e8b","line":41,"in_reply_to":"ffb3811a_dfe4bd8c","updated":"2026-02-18 14:56:13.000000000","message":"that fair. but its out os scope of this patch.\n\nit woudl be good to review this in the future","commit_id":"497ea1d2f3301d68c2477e1785474d0b1ea9c3a3"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"537fc25108ced74a2465ed2ffcd4fd18c9fb3f7c","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                else:"},{"line_number":87,"context_line":"                    resource_id \u003d \u0027unknown\u0027"},{"line_number":88,"context_line":"                LOG.debug(\"%s %s was not found\", resource_type, resource_id)"},{"line_number":89,"context_line":"                msg \u003d f\"{resource_id} of type {resource_type}\""},{"line_number":90,"context_line":"                raise exception.ComputeResourceNotFound(msg)"},{"line_number":91,"context_line":"            except nvexceptions.ClientException as e:"},{"line_number":92,"context_line":"                LOG.error(\"Nova client error: %s\", e)"}],"source_content_type":"text/x-python","patch_set":25,"id":"86d8110e_cf5995ab","line":89,"in_reply_to":"ead7c5aa_18da1dbf","updated":"2026-02-18 14:56:13.000000000","message":"so this woudl only be user facing if we ere to set it in teh reason filed for the action failure.\n\n\nfor now this is fine","commit_id":"497ea1d2f3301d68c2477e1785474d0b1ea9c3a3"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"537fc25108ced74a2465ed2ffcd4fd18c9fb3f7c","unresolved":false,"context_lines":[{"line_number":155,"context_line":"        )"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    @classmethod"},{"line_number":158,"context_line":"    def from_openstacksdk(cls, nova_server):"},{"line_number":159,"context_line":"        \"\"\"Create a Server dataclass from a OpenStackSDK Server object."},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"        :param nova_server: OpenStackSDK Server object"}],"source_content_type":"text/x-python","patch_set":25,"id":"e5d934fa_ab17127d","line":158,"in_reply_to":"884e49e7_0ba305fd","updated":"2026-02-18 14:56:13.000000000","message":"no, validation is in post_init now","commit_id":"497ea1d2f3301d68c2477e1785474d0b1ea9c3a3"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b6603ab795aab9a68d42ce61d200320825697df6","unresolved":false,"context_lines":[{"line_number":171,"context_line":"            task_state\u003dnova_server.task_state,"},{"line_number":172,"context_line":"            power_state\u003dnova_server.power_state,"},{"line_number":173,"context_line":"            status\u003dnova_server.status,"},{"line_number":174,"context_line":"            flavor\u003dnova_server.flavor,"},{"line_number":175,"context_line":"            tenant_id\u003dnova_server.project_id,"},{"line_number":176,"context_line":"            locked\u003dnova_server.is_locked,"},{"line_number":177,"context_line":"            metadata\u003dnova_server.metadata,"}],"source_content_type":"text/x-python","patch_set":28,"id":"e6a53da4_1f67be5a","line":174,"in_reply_to":"5f390ff6_8a463bf7","updated":"2026-02-19 11:41:03.000000000","message":"no this si not needed.","commit_id":"8c11479ad0db4d0dcca8b2e8140cf7b6324e45f9"}],"watcher/conf/nova.py":[{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"57ebbb7e2a4aa2cffc095ce5f43e090e06a894f3","unresolved":true,"context_lines":[{"line_number":65,"context_line":"API being available which is enforced with this option. See"},{"line_number":66,"context_line":"https://docs.openstack.org/nova/latest/reference/api-microversion-history.html"},{"line_number":67,"context_line":"for the compute API microversion history."},{"line_number":68,"context_line":"\"\"\"),"},{"line_number":69,"context_line":"]"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"0b053f7d_3f9dd0f8","line":68,"updated":"2026-02-12 17:25:36.000000000","message":"I\u0027ve been testing the customization of the region name and endpoint type with this version of the patch. My findings are:\n\n\n- The region_name from the nova section is properly handled (although region_name option does not appear in the docs in the nova seciont https://2ab898ac057f191c4223-4ded48f58878beea96cc9e7c321252b1.ssl.cf5.rackcdn.com/openstack/30dfc177e26d410da7ec2ab46de34f10/docs/configuration/watcher.html#nova . TBH, I\u0027m not sure if that\u0027s related to how the document is done or there is a real issue.\n\n- The interface customization, does not work as my testing. Note that the expected option in the nova section is `interface` , not endpoint_type. I think you need to add something like:\n\n```\n    cfg.StrOpt(\u0027interface\u0027,\n               default\u003d\"publicURL\",\n               help\u003d\"Type of endpoint to use in nova.\",\n               deprecated_group\u003d\u0027nova_client\u0027,\n               deprecated_name\u003d\u0027endpoint_type\u0027),\n```","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"1ad384c171fadf8960c1a0959f45f3626f277cc3","unresolved":true,"context_lines":[{"line_number":65,"context_line":"API being available which is enforced with this option. See"},{"line_number":66,"context_line":"https://docs.openstack.org/nova/latest/reference/api-microversion-history.html"},{"line_number":67,"context_line":"for the compute API microversion history."},{"line_number":68,"context_line":"\"\"\"),"},{"line_number":69,"context_line":"]"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"0e6cbb83_5b2bd14e","line":68,"in_reply_to":"0b053f7d_3f9dd0f8","updated":"2026-02-17 19:48:41.000000000","message":"the missing option was a mistake on my part, it\u0027ll be fixed in patchset 22. Regarding the `interface` option, looking at keystoneauth it seems `valid_interface` is the preferred option https://github.com/openstack/keystoneauth/blob/942d15fd26dd147928d045228db93d1d5cdf988c/keystoneauth1/loading/adapter.py#L56-L60","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"7c3725199d67a699108d6862e06f5b891a899f48","unresolved":true,"context_lines":[{"line_number":65,"context_line":"API being available which is enforced with this option. See"},{"line_number":66,"context_line":"https://docs.openstack.org/nova/latest/reference/api-microversion-history.html"},{"line_number":67,"context_line":"for the compute API microversion history."},{"line_number":68,"context_line":"\"\"\"),"},{"line_number":69,"context_line":"]"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"95c65e58_a980015e","line":68,"in_reply_to":"0e6cbb83_5b2bd14e","updated":"2026-02-18 10:06:33.000000000","message":"I think that, when using openstacksdk, the interface is managed from openstacksdk itself, in https://github.com/openstack/openstacksdk/blob/e0845449d3570e0a6bc90660440fb6f46721fd2b/openstack/config/cloud_region.py#L607-L612 and relies in the  `interface` option in the `service_type` section, similarly to `region_name`.","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"55c6d29f69c16ed2ca3064d46f9d5b1f141f750a","unresolved":true,"context_lines":[{"line_number":65,"context_line":"API being available which is enforced with this option. See"},{"line_number":66,"context_line":"https://docs.openstack.org/nova/latest/reference/api-microversion-history.html"},{"line_number":67,"context_line":"for the compute API microversion history."},{"line_number":68,"context_line":"\"\"\"),"},{"line_number":69,"context_line":"]"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"c90666ad_66672c96","line":68,"in_reply_to":"95c65e58_a980015e","updated":"2026-02-18 11:46:07.000000000","message":"looks like we need to pass this when creating the connection using the context token, I\u0027ll add the argument","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"537fc25108ced74a2465ed2ffcd4fd18c9fb3f7c","unresolved":false,"context_lines":[{"line_number":65,"context_line":"API being available which is enforced with this option. See"},{"line_number":66,"context_line":"https://docs.openstack.org/nova/latest/reference/api-microversion-history.html"},{"line_number":67,"context_line":"for the compute API microversion history."},{"line_number":68,"context_line":"\"\"\"),"},{"line_number":69,"context_line":"]"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"6d53c392_14163a65","line":68,"in_reply_to":"c90666ad_66672c96","updated":"2026-02-18 14:56:13.000000000","message":"Done","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"57ebbb7e2a4aa2cffc095ce5f43e090e06a894f3","unresolved":true,"context_lines":[{"line_number":73,"context_line":"    conf.register_group(nova)"},{"line_number":74,"context_line":"    conf.register_opts(NOVA_OPTS, group\u003dnova)"},{"line_number":75,"context_line":"    # NOTE(jgilaber): match the adapter options that were previously passed"},{"line_number":76,"context_line":"    # through the [nova_client group], except for endpoint_type which needs to"},{"line_number":77,"context_line":"    # be handled after the configuration is parsed because it might need a"},{"line_number":78,"context_line":"    # string manipulation in case the configuration contains a *URL value (e.g"},{"line_number":79,"context_line":"    # publicURL)"},{"line_number":80,"context_line":"    deprecations \u003d {"},{"line_number":81,"context_line":"        \u0027region_name\u0027: [cfg.DeprecatedOpt(\u0027region_name\u0027, \u0027nova_client\u0027)]"},{"line_number":82,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":19,"id":"78c24af7_aebac075","line":79,"range":{"start_line":76,"start_character":39,"end_line":79,"end_character":16},"updated":"2026-02-12 17:25:36.000000000","message":"I don\u0027t understand well that comment endpoint_type.","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"537fc25108ced74a2465ed2ffcd4fd18c9fb3f7c","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    conf.register_group(nova)"},{"line_number":74,"context_line":"    conf.register_opts(NOVA_OPTS, group\u003dnova)"},{"line_number":75,"context_line":"    # NOTE(jgilaber): match the adapter options that were previously passed"},{"line_number":76,"context_line":"    # through the [nova_client group], except for endpoint_type which needs to"},{"line_number":77,"context_line":"    # be handled after the configuration is parsed because it might need a"},{"line_number":78,"context_line":"    # string manipulation in case the configuration contains a *URL value (e.g"},{"line_number":79,"context_line":"    # publicURL)"},{"line_number":80,"context_line":"    deprecations \u003d {"},{"line_number":81,"context_line":"        \u0027region_name\u0027: [cfg.DeprecatedOpt(\u0027region_name\u0027, \u0027nova_client\u0027)]"},{"line_number":82,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":19,"id":"4e0221bd_56ced3b6","line":79,"range":{"start_line":76,"start_character":39,"end_line":79,"end_character":16},"in_reply_to":"2c0ab4d8_75892ff0","updated":"2026-02-18 14:56:13.000000000","message":"Done","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"1ad384c171fadf8960c1a0959f45f3626f277cc3","unresolved":true,"context_lines":[{"line_number":73,"context_line":"    conf.register_group(nova)"},{"line_number":74,"context_line":"    conf.register_opts(NOVA_OPTS, group\u003dnova)"},{"line_number":75,"context_line":"    # NOTE(jgilaber): match the adapter options that were previously passed"},{"line_number":76,"context_line":"    # through the [nova_client group], except for endpoint_type which needs to"},{"line_number":77,"context_line":"    # be handled after the configuration is parsed because it might need a"},{"line_number":78,"context_line":"    # string manipulation in case the configuration contains a *URL value (e.g"},{"line_number":79,"context_line":"    # publicURL)"},{"line_number":80,"context_line":"    deprecations \u003d {"},{"line_number":81,"context_line":"        \u0027region_name\u0027: [cfg.DeprecatedOpt(\u0027region_name\u0027, \u0027nova_client\u0027)]"},{"line_number":82,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":19,"id":"b640fcd9_a3cedf5d","line":79,"range":{"start_line":76,"start_character":39,"end_line":79,"end_character":16},"in_reply_to":"78c24af7_aebac075","updated":"2026-02-17 19:48:41.000000000","message":"to avoid the upgrade impact on a deployment that use the `endpoint_type` option with for example `publicURL`, we need to replace the `URL` part, since for the keystoneauth adapter `valid_interfaces` option only `public`, `internal` and `admin` are valid options https://github.com/openstack/keystoneauth/blob/master/keystoneauth1/loading/adapter.py#L319","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"7c3725199d67a699108d6862e06f5b891a899f48","unresolved":true,"context_lines":[{"line_number":73,"context_line":"    conf.register_group(nova)"},{"line_number":74,"context_line":"    conf.register_opts(NOVA_OPTS, group\u003dnova)"},{"line_number":75,"context_line":"    # NOTE(jgilaber): match the adapter options that were previously passed"},{"line_number":76,"context_line":"    # through the [nova_client group], except for endpoint_type which needs to"},{"line_number":77,"context_line":"    # be handled after the configuration is parsed because it might need a"},{"line_number":78,"context_line":"    # string manipulation in case the configuration contains a *URL value (e.g"},{"line_number":79,"context_line":"    # publicURL)"},{"line_number":80,"context_line":"    deprecations \u003d {"},{"line_number":81,"context_line":"        \u0027region_name\u0027: [cfg.DeprecatedOpt(\u0027region_name\u0027, \u0027nova_client\u0027)]"},{"line_number":82,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":19,"id":"c61b6b63_a22d6eb0","line":79,"range":{"start_line":76,"start_character":39,"end_line":79,"end_character":16},"in_reply_to":"b640fcd9_a3cedf5d","updated":"2026-02-18 10:06:33.000000000","message":"I got it now, thanks.\n\nWhat I understand from https://github.com/openstack/keystoneauth/blob/master/keystoneauth1/loading/adapter.py#L319-L329 is that, that code will take care of prioritizing the values of `valid_interfaces` or `interface` from the config on each service section, but it\u0027s not copying the value of interface to valid_interfaces. BTW, with that in mind, we may need to add valid_interfaces option to the nova group and use it by default instead of the interfaces one.\n\nSaid this, my understanding is that, openstacksdk will only use those options from config file when openstacksdk uses the from_config option.","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"55c6d29f69c16ed2ca3064d46f9d5b1f141f750a","unresolved":true,"context_lines":[{"line_number":73,"context_line":"    conf.register_group(nova)"},{"line_number":74,"context_line":"    conf.register_opts(NOVA_OPTS, group\u003dnova)"},{"line_number":75,"context_line":"    # NOTE(jgilaber): match the adapter options that were previously passed"},{"line_number":76,"context_line":"    # through the [nova_client group], except for endpoint_type which needs to"},{"line_number":77,"context_line":"    # be handled after the configuration is parsed because it might need a"},{"line_number":78,"context_line":"    # string manipulation in case the configuration contains a *URL value (e.g"},{"line_number":79,"context_line":"    # publicURL)"},{"line_number":80,"context_line":"    deprecations \u003d {"},{"line_number":81,"context_line":"        \u0027region_name\u0027: [cfg.DeprecatedOpt(\u0027region_name\u0027, \u0027nova_client\u0027)]"},{"line_number":82,"context_line":"    }"}],"source_content_type":"text/x-python","patch_set":19,"id":"2c0ab4d8_75892ff0","line":79,"range":{"start_line":76,"start_character":39,"end_line":79,"end_character":16},"in_reply_to":"c61b6b63_a22d6eb0","updated":"2026-02-18 11:46:07.000000000","message":"I\u0027ve already added both `valid_interface` and `interface` options to the [nova] group using the `register_adapter_conf_options`. I might need to ensure they are passed when creating the connection using the user token though","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b6184abe7cdb02b8301422b1ecc9497315e0517a","unresolved":true,"context_lines":[{"line_number":83,"context_line":"    ks_loading.register_adapter_conf_options("},{"line_number":84,"context_line":"        cfg.CONF, nova, include_deprecated\u003dFalse,"},{"line_number":85,"context_line":"        deprecated_opts\u003ddeprecations"},{"line_number":86,"context_line":"    )"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def list_opts():"}],"source_content_type":"text/x-python","patch_set":19,"id":"0d0452e7_0fa4d636","line":86,"updated":"2026-02-11 18:59:27.000000000","message":"looking at the rendered docs you have not properly  regestered the oen form keystone auth\n\nhttps://storage.gra.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_af7/openstack/af74514080fb4a2180bac591b4e0273a/docs/configuration/watcher.html#nova\n\nor you have but you have not update teh docs properly i think its the former.\n\nby the wya you shoudl not be falling back on https://storage.gra.cloud.ovh.net/v1/AUTH_dcaab5e32b234d56b626f72581e3644c/zuul_opendev_logs_af7/openstack/af74514080fb4a2180bac591b4e0273a/docs/configuration/watcher.html#keystone-authtoken","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"1ad384c171fadf8960c1a0959f45f3626f277cc3","unresolved":true,"context_lines":[{"line_number":83,"context_line":"    ks_loading.register_adapter_conf_options("},{"line_number":84,"context_line":"        cfg.CONF, nova, include_deprecated\u003dFalse,"},{"line_number":85,"context_line":"        deprecated_opts\u003ddeprecations"},{"line_number":86,"context_line":"    )"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def list_opts():"}],"source_content_type":"text/x-python","patch_set":19,"id":"4b753fdf_4919fb31","line":86,"in_reply_to":"0d0452e7_0fa4d636","updated":"2026-02-17 19:48:41.000000000","message":"indeed, I missed adding the options in the `list_opts` below, once that is done, they show up in the docs page. About the last point in your comment, do you mean the nova group should also have the keystoneauth session and auth conf options?","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":16312,"name":"Alfredo Moralejo","email":"amoralej@redhat.com","username":"amoralej"},"change_message_id":"7c3725199d67a699108d6862e06f5b891a899f48","unresolved":true,"context_lines":[{"line_number":83,"context_line":"    ks_loading.register_adapter_conf_options("},{"line_number":84,"context_line":"        cfg.CONF, nova, include_deprecated\u003dFalse,"},{"line_number":85,"context_line":"        deprecated_opts\u003ddeprecations"},{"line_number":86,"context_line":"    )"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def list_opts():"}],"source_content_type":"text/x-python","patch_set":19,"id":"62581e6d_0b03a7e3","line":86,"in_reply_to":"4b753fdf_4919fb31","updated":"2026-02-18 10:06:33.000000000","message":"note that currently, the keystone authentication parameters are only in watcher_clients, in the service sections we only have region_name and interface IIUC. I think that should be good enough, I doubt we have cases where we want different keystone credentials or url, per service right?","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"5888776fe128c29d92e7a0488472d2e47f7bda21","unresolved":false,"context_lines":[{"line_number":83,"context_line":"    ks_loading.register_adapter_conf_options("},{"line_number":84,"context_line":"        cfg.CONF, nova, include_deprecated\u003dFalse,"},{"line_number":85,"context_line":"        deprecated_opts\u003ddeprecations"},{"line_number":86,"context_line":"    )"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def list_opts():"}],"source_content_type":"text/x-python","patch_set":19,"id":"4e7c1f1b_0bc44f7c","line":86,"in_reply_to":"5035dfeb_ad9ccada","updated":"2026-02-19 08:52:06.000000000","message":"Acknowledged","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"55c6d29f69c16ed2ca3064d46f9d5b1f141f750a","unresolved":true,"context_lines":[{"line_number":83,"context_line":"    ks_loading.register_adapter_conf_options("},{"line_number":84,"context_line":"        cfg.CONF, nova, include_deprecated\u003dFalse,"},{"line_number":85,"context_line":"        deprecated_opts\u003ddeprecations"},{"line_number":86,"context_line":"    )"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def list_opts():"}],"source_content_type":"text/x-python","patch_set":19,"id":"af54a043_a2d6c529","line":86,"in_reply_to":"62581e6d_0b03a7e3","updated":"2026-02-18 11:46:07.000000000","message":"that seems to be precisely the pattern I\u0027ve seen in several projects, for example nova adds several keystoneauth options in the [cinder] config https://github.com/openstack/nova/blob/8a4b000216c7a6c2673af78d7eb7f9bf938dc867/nova/conf/cinder.py#L119-L121, cyborg does the same thing for the [nova] section https://github.com/openstack/cyborg/blob/ad54e096b18e91d6eebcda0af3ced8e805aa68fc/cyborg/conf/nova.py#L30 via an utility function https://github.com/openstack/cyborg/blob/master/cyborg/conf/utils.py#L58","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"537fc25108ced74a2465ed2ffcd4fd18c9fb3f7c","unresolved":true,"context_lines":[{"line_number":83,"context_line":"    ks_loading.register_adapter_conf_options("},{"line_number":84,"context_line":"        cfg.CONF, nova, include_deprecated\u003dFalse,"},{"line_number":85,"context_line":"        deprecated_opts\u003ddeprecations"},{"line_number":86,"context_line":"    )"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"def list_opts():"}],"source_content_type":"text/x-python","patch_set":19,"id":"5035dfeb_ad9ccada","line":86,"in_reply_to":"af54a043_a2d6c529","updated":"2026-02-18 14:56:13.000000000","message":"no the usage of watcher_clients was identified as one of the orgianl tech debt item to remove in the future\n\nit prevents us form doing some deployment toplogies that shoudl work and it will bit us downstream in teh future so we need to have sperate auth sections for each service\n\nwe can fallback if not specired sepreatly btu long term \n\nwatcher_clients should be remvoed","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"}],"watcher/conf/nova_client.py":[{"author":{"_account_id":30002,"name":"Douglas Viroel","email":"viroel@gmail.com","username":"dviroel"},"change_message_id":"a51996923ea70f2103faed9c0a8a7a39733fc884","unresolved":true,"context_lines":[{"line_number":31,"context_line":"                   \u0027To replace the frozen novaclient with the \u0027"},{"line_number":32,"context_line":"                   \u0027openstacksdk compute proxy, the options need to \u0027"},{"line_number":33,"context_line":"                   \u0027be under the [nova] group.\u0027"},{"line_number":34,"context_line":"               ),"},{"line_number":35,"context_line":"               help\u003df\"\"\""},{"line_number":36,"context_line":"Version of Nova API to use in novaclient."},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"bc204f42_9a802a27","line":34,"updated":"2026-02-18 19:49:23.000000000","message":"only this one doesn\u0027t have \"deprecated_since\u003d\u00272026.1\u0027\"?","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"},{"author":{"_account_id":34452,"name":"Joan Gilabert","display_name":"jgilaber","email":"jgilaber@redhat.com","username":"jgilaber"},"change_message_id":"5888776fe128c29d92e7a0488472d2e47f7bda21","unresolved":false,"context_lines":[{"line_number":31,"context_line":"                   \u0027To replace the frozen novaclient with the \u0027"},{"line_number":32,"context_line":"                   \u0027openstacksdk compute proxy, the options need to \u0027"},{"line_number":33,"context_line":"                   \u0027be under the [nova] group.\u0027"},{"line_number":34,"context_line":"               ),"},{"line_number":35,"context_line":"               help\u003df\"\"\""},{"line_number":36,"context_line":"Version of Nova API to use in novaclient."},{"line_number":37,"context_line":""}],"source_content_type":"text/x-python","patch_set":19,"id":"32536d7d_12f99d3b","line":34,"in_reply_to":"bc204f42_9a802a27","updated":"2026-02-19 08:52:06.000000000","message":"thanks, I missed this one, I\u0027ve added it now","commit_id":"d269919a519f391d303b5ed0b4657fb7580ad1fc"}],"watcher/tests/unit/common/test_clients.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b6603ab795aab9a68d42ce61d200320825697df6","unresolved":false,"context_lines":[{"line_number":25,"context_line":"try:"},{"line_number":26,"context_line":"    from monascaclient.v2_0 import client as monclient_v2"},{"line_number":27,"context_line":"    MONASCA_INSTALLED \u003d True"},{"line_number":28,"context_line":"except Exception:  # ImportError or others"},{"line_number":29,"context_line":"    MONASCA_INSTALLED \u003d False"},{"line_number":30,"context_line":"from novaclient import client as nvclient"},{"line_number":31,"context_line":""}],"source_content_type":"text/x-python","patch_set":28,"id":"10ba5f84_266d9d33","line":28,"in_reply_to":"b8bd7a18_79a2aa33","updated":"2026-02-19 11:41:03.000000000","message":"this is being deleted  in a diffent patch so we can ignore\nits also out of scope fo this change.","commit_id":"8c11479ad0db4d0dcca8b2e8140cf7b6324e45f9"}],"watcher/tests/unit/common/test_nova_helper.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b6603ab795aab9a68d42ce61d200320825697df6","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from novaclient.v2 import servers"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from watcher.common import clients"},{"line_number":30,"context_line":"from watcher.common import exception"},{"line_number":31,"context_line":"from watcher.common import nova_helper"},{"line_number":32,"context_line":"from watcher.common import utils"},{"line_number":33,"context_line":"from watcher import conf"}],"source_content_type":"text/x-python","patch_set":28,"id":"162149c0_7125eda3","line":30,"in_reply_to":"90730c72_7534d42a","updated":"2026-02-19 11:41:03.000000000","message":"this is another thing im hopeing to use api to fix but in a seperate serise of patches.","commit_id":"8c11479ad0db4d0dcca8b2e8140cf7b6324e45f9"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"b6603ab795aab9a68d42ce61d200320825697df6","unresolved":false,"context_lines":[{"line_number":27,"context_line":"from novaclient.v2 import servers"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"from watcher.common import clients"},{"line_number":30,"context_line":"from watcher.common import exception"},{"line_number":31,"context_line":"from watcher.common import nova_helper"},{"line_number":32,"context_line":"from watcher.common import utils"},{"line_number":33,"context_line":"from watcher import conf"}],"source_content_type":"text/x-python","patch_set":28,"id":"ca782998_85c7cf98","line":30,"in_reply_to":"92c9dcff_33503488","updated":"2026-02-19 11:41:03.000000000","message":"this is valid but we coudl do that in a follow up\n\nthis si really testign oslo behavior however so i dont think this is strictly requried","commit_id":"8c11479ad0db4d0dcca8b2e8140cf7b6324e45f9"}],"watcher/tests/unit/common/utils.py":[{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"537fc25108ced74a2465ed2ffcd4fd18c9fb3f7c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2026 Red Hat, Inc."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":25,"id":"ff66dfc7_09d64933","line":1,"in_reply_to":"56325930_56ab2b46","updated":"2026-02-18 14:56:13.000000000","message":"that not a bad idea but also just a nice ot have","commit_id":"497ea1d2f3301d68c2477e1785474d0b1ea9c3a3"}]}
