)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"9601a6e6695156f690a7e5f6f634b1335d99ee20","unresolved":true,"context_lines":[{"line_number":9,"context_line":"Add a netapp_use_metrics_based_utilization config option (default"},{"line_number":10,"context_line":"True). When enabled and supported (REST client, ONTAP 9.8+), the"},{"line_number":11,"context_line":"driver reads processor_utilization from the ONTAP REST node metrics"},{"line_number":12,"context_line":"endpoint instead of the counter-based calculation. A stale value is"},{"line_number":13,"context_line":"reused for up to 10 minutes before falling back to the default"},{"line_number":14,"context_line":"utilization. Unsupported backends (ZAPI client, ONTAP \u003c 9.8) keep"},{"line_number":15,"context_line":"using the counter-based calculation."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The ASA r2 disaggregated platform has no counter-based path, so"},{"line_number":18,"context_line":"NODE_METRICS is always enabled there and the performance cache is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"70656a01_725dff34","line":15,"range":{"start_line":12,"start_character":51,"end_line":15,"end_character":36},"updated":"2026-08-17 11:10:26.000000000","message":"Is this still true? I think we can reword as we do not have 10 mins fallback anymore?","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"1827ff9822e17deed65db6ca25502e720167739e","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Add a netapp_use_metrics_based_utilization config option (default"},{"line_number":10,"context_line":"True). When enabled and supported (REST client, ONTAP 9.8+), the"},{"line_number":11,"context_line":"driver reads processor_utilization from the ONTAP REST node metrics"},{"line_number":12,"context_line":"endpoint instead of the counter-based calculation. A stale value is"},{"line_number":13,"context_line":"reused for up to 10 minutes before falling back to the default"},{"line_number":14,"context_line":"utilization. Unsupported backends (ZAPI client, ONTAP \u003c 9.8) keep"},{"line_number":15,"context_line":"using the counter-based calculation."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"The ASA r2 disaggregated platform has no counter-based path, so"},{"line_number":18,"context_line":"NODE_METRICS is always enabled there and the performance cache is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"15c3371c_74b03f6c","line":15,"range":{"start_line":12,"start_character":51,"end_line":15,"end_character":36},"in_reply_to":"70656a01_725dff34","updated":"2026-09-01 09:12:16.000000000","message":"Yes. That sentence was leftover. It described METRICS_GRACE_INTERVAL_SECONDS (600 s): on a failed metrics read the driver reused the last good processor_utilization for up to 10 minutes. That cache was removed. A failed metrics read now uses default utilization (50) immediately. Commit message updated on this patch set.","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c3326fe758dc95cc83b13f52afea2bd36530a71b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"4657f87d_9e83387f","updated":"2026-07-17 15:56:59.000000000","message":"A few things to check noted in line; mostly LGTM.","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"124df12a5bd68aae9a2806d8532ad864dc0d466b","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":3,"id":"23fd6dac_ff40ab85","updated":"2026-07-17 14:57:34.000000000","message":"Leaving neutral for now as this looks like a good patch to me.  I just had one minor concern about one of the UT (and I may just not fully understand it).  Once I could get a reply (or a fix, if necessary) I will +2.","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"a69c9b036814b3d3ae73381b74deef6046b1eef1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"f4f3c781_c36af478","updated":"2026-07-31 06:40:44.000000000","message":"Please look at comments.","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"9c4e14210b22ab02100df445f2fb76efb7c11430","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"e6df55e1_f64f18cf","in_reply_to":"23fd6dac_ff40ab85","updated":"2026-08-14 04:54:46.000000000","message":"updated UTs and made it simple to understand. please take a look","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"9c4e14210b22ab02100df445f2fb76efb7c11430","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"155f6e71_8cc2ed84","updated":"2026-08-14 04:54:46.000000000","message":"@rosmaita.fossdev@gmail.com, @anthony.galica@hitachivantara.com and @anoop.shukla@netapp.com... thank you! for detailed review. addressed review comments. please review again.","commit_id":"df921f4a7318315ca5195c8705a138d05ae28da2"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"a919217a4dc57c8cd19046ce53e9619319a6eee6","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"a8747a37_4267098d","updated":"2026-08-26 22:36:19.000000000","message":"Found a couple minor potential issues.  Not necessarily deserving of a -\n\nHowever, -1 is because I want (at the least) a sufficient answer to my question about the default True for the new setting that has side effects on other settings.","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"9601a6e6695156f690a7e5f6f634b1335d99ee20","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"3d28ef36_946dba48","updated":"2026-08-17 11:10:26.000000000","message":"LGTM.","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"1827ff9822e17deed65db6ca25502e720167739e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"0e045353_72c7fbef","updated":"2026-09-01 09:12:16.000000000","message":"@anthony.galica@hitachivantara.com and @anoop.shukla@netapp.com addressed review comments. please review again","commit_id":"33ccc1575e443c6d0d9a360bea05b8c0a9141813"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"93b1f5c7ffc722c3cddd42014f7328b9dc74f976","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"35f1d33e_ae51addb","updated":"2026-09-01 12:50:58.000000000","message":"LGTM.","commit_id":"33ccc1575e443c6d0d9a360bea05b8c0a9141813"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"fa3a8d6e7a9f897c12ce34f899d2642d12949cdc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"b0ac3651_d4320292","updated":"2026-09-04 06:36:51.000000000","message":"My questions were addressed.  LGTM.","commit_id":"33ccc1575e443c6d0d9a360bea05b8c0a9141813"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"dbbeaff2d8ff6117a5307c56a8a0570096f04444","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"b8ad3d94_ff4b412c","updated":"2026-09-02 05:39:34.000000000","message":"Run-NetApp CI","commit_id":"33ccc1575e443c6d0d9a360bea05b8c0a9141813"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"05bc0cac8a1a84483c5aa9ff65dfd59bc84dcbf5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"01d09ded_88121094","updated":"2026-09-24 05:22:16.000000000","message":"Given that there are issues with the current counter based approach of getting perf stats, this feature improvement is important for us to merge with priority. @rosmaita.fossdev@gmail.com, @anthony.galica@hitachivantara.com","commit_id":"dec6701c8404ad8e0095ee16e3c960dfa7403dc9"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"ce2d9562f93a62cc856aa41b0860d21d3fee54c7","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"22df1681_f992bfb8","updated":"2026-10-02 14:26:56.000000000","message":"Returning a +1 as the updates for implementing the cache look good to me. \n\nI do still want to make sure that the cache is only meant to reset in the one place it\u0027s reset, so I\u0027ve asked the question as well.  +2 once I get confirmation","commit_id":"dec6701c8404ad8e0095ee16e3c960dfa7403dc9"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"d8c5d1c95b7e9c71a53e7c8ae6cd1b58228ca4fb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"f1700ca4_f8c0876d","updated":"2026-10-02 15:17:55.000000000","message":"Revisions since my last review LGTM.","commit_id":"dec6701c8404ad8e0095ee16e3c960dfa7403dc9"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"a5afb3156d5256fdec50440e0697a50b153a6157","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"e393d2c7_831ddcfd","updated":"2026-10-06 10:34:50.000000000","message":"Run-NetApp CI","commit_id":"dec6701c8404ad8e0095ee16e3c960dfa7403dc9"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"65e5f14c8107631e2a3795002b32ae17c06f6cca","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"ece734db_48dfa980","updated":"2026-10-06 05:58:42.000000000","message":"Run-NetApp CI","commit_id":"dec6701c8404ad8e0095ee16e3c960dfa7403dc9"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"467a719237b0c32a0908ef97270778e3642c5949","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"d2e22cf4_01852445","updated":"2026-10-02 14:55:15.000000000","message":"Thank you! Anthony, i will ping once ZUUL is green","commit_id":"dec6701c8404ad8e0095ee16e3c960dfa7403dc9"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"e2a86e70fd9e7cbc2f16c5ee319b48a1f928b12c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"105d77f2_98b6421c","updated":"2026-10-06 19:20:29.000000000","message":"Zuul/CI now passing, LGTM","commit_id":"dec6701c8404ad8e0095ee16e3c960dfa7403dc9"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"1f8c65ecbb269c726222e0e9151776aedd10b0b0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"7fcedd37_9cc2361a","updated":"2026-10-05 04:13:23.000000000","message":"recheck","commit_id":"dec6701c8404ad8e0095ee16e3c960dfa7403dc9"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"33bc25c92b7686eb39e6f42d09dd6b51620f45c9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"cfca8f97_bf9cecd0","updated":"2026-10-02 14:47:58.000000000","message":"recheck","commit_id":"dec6701c8404ad8e0095ee16e3c960dfa7403dc9"},{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"74d1c583529762a9e6a355adcbf15e1f73f6f7c7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"3643cc48_d925afa3","updated":"2026-10-02 14:10:41.000000000","message":"recheck - i think the timeout issues for the 313 and 314 jobs have been worked out","commit_id":"dec6701c8404ad8e0095ee16e3c960dfa7403dc9"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"f9f40017a8245f9555ab35bb946ff86ccb8a7578","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"bc83b3e5_d51e6541","in_reply_to":"22df1681_f992bfb8","updated":"2026-10-02 14:27:11.000000000","message":"Also once Zuul passes.","commit_id":"dec6701c8404ad8e0095ee16e3c960dfa7403dc9"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"467a719237b0c32a0908ef97270778e3642c5949","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"a00ce8f3_ed67d344","in_reply_to":"4b976a3b_d0d3cab6","updated":"2026-10-02 14:55:15.000000000","message":"ZUUL timing out issued fresh recheck","commit_id":"dec6701c8404ad8e0095ee16e3c960dfa7403dc9"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"c499c2625e848b6211f5334e1837e380bc1174dd","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":10,"id":"4b976a3b_d0d3cab6","in_reply_to":"bc83b3e5_d51e6541","updated":"2026-10-02 14:31:38.000000000","message":"Looks like zuul isn\u0027t your fault, and brian ran a recheck.  So +2 once my question is answered.","commit_id":"dec6701c8404ad8e0095ee16e3c960dfa7403dc9"}],"cinder/tests/unit/volume/drivers/netapp/dataontap/performance/test_perf_cmode.py":[{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"124df12a5bd68aae9a2806d8532ad864dc0d466b","unresolved":true,"context_lines":[{"line_number":543,"context_line":"    def test_get_aggregates_for_pools_includes_flexgroup_only_aggr(self):"},{"line_number":544,"context_line":"        # A FlexGroup can span an aggregate that no FlexVol pool uses (aggr4)."},{"line_number":545,"context_line":"        volumes \u003d {"},{"line_number":546,"context_line":"            \u0027flexvol_pool\u0027: {\u0027netapp_aggregate\u0027: \u0027aggr1\u0027},"},{"line_number":547,"context_line":"            \u0027fg_pool\u0027: {\u0027netapp_aggregate\u0027: [\u0027aggr1\u0027, \u0027aggr4\u0027]},"},{"line_number":548,"context_line":"        }"},{"line_number":549,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"b5cea2b6_b54fa10d","line":546,"updated":"2026-07-17 14:57:34.000000000","message":"Should this be a different value?  \n\nIt\u0027s possible I don\u0027t fully understand the test, but if a set is returned and checked, I would think that ``aggr1`` here for the flex vol could just be overwritten by the ``aggr1`` below in the flex group or vice versa (i.e. I suspect both can be found and this test would pass).","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"9c4e14210b22ab02100df445f2fb76efb7c11430","unresolved":false,"context_lines":[{"line_number":543,"context_line":"    def test_get_aggregates_for_pools_includes_flexgroup_only_aggr(self):"},{"line_number":544,"context_line":"        # A FlexGroup can span an aggregate that no FlexVol pool uses (aggr4)."},{"line_number":545,"context_line":"        volumes \u003d {"},{"line_number":546,"context_line":"            \u0027flexvol_pool\u0027: {\u0027netapp_aggregate\u0027: \u0027aggr1\u0027},"},{"line_number":547,"context_line":"            \u0027fg_pool\u0027: {\u0027netapp_aggregate\u0027: [\u0027aggr1\u0027, \u0027aggr4\u0027]},"},{"line_number":548,"context_line":"        }"},{"line_number":549,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"bc57470e_d11825fa","line":546,"in_reply_to":"b5cea2b6_b54fa10d","updated":"2026-08-14 04:54:46.000000000","message":"updated UTs to use aggr3","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"}],"cinder/tests/unit/volume/drivers/netapp/dataontap/test_nvme_library.py":[{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"a919217a4dc57c8cd19046ce53e9619319a6eee6","unresolved":true,"context_lines":[{"line_number":759,"context_line":"    @ddt.data(True, False)"},{"line_number":760,"context_line":"    def test_get_pool_stats_asa_metrics_flag(self, use_metrics):"},{"line_number":761,"context_line":"        \"\"\"ASA r2 always refreshes the perf cache, regardless of the flag.\"\"\""},{"line_number":762,"context_line":"        self.library.configuration.netapp_disaggregated_platform \u003d True"},{"line_number":763,"context_line":"        self.library.configuration.netapp_use_metrics_based_utilization \u003d ("},{"line_number":764,"context_line":"            use_metrics)"},{"line_number":765,"context_line":"        self.library.using_cluster_credentials \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"967f6668_6c5dc8a5","line":762,"updated":"2026-08-26 22:36:19.000000000","message":"Should these use ``override_config``?","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"1827ff9822e17deed65db6ca25502e720167739e","unresolved":false,"context_lines":[{"line_number":759,"context_line":"    @ddt.data(True, False)"},{"line_number":760,"context_line":"    def test_get_pool_stats_asa_metrics_flag(self, use_metrics):"},{"line_number":761,"context_line":"        \"\"\"ASA r2 always refreshes the perf cache, regardless of the flag.\"\"\""},{"line_number":762,"context_line":"        self.library.configuration.netapp_disaggregated_platform \u003d True"},{"line_number":763,"context_line":"        self.library.configuration.netapp_use_metrics_based_utilization \u003d ("},{"line_number":764,"context_line":"            use_metrics)"},{"line_number":765,"context_line":"        self.library.using_cluster_credentials \u003d True"}],"source_content_type":"text/x-python","patch_set":8,"id":"a0a15824_1fe9e328","line":762,"in_reply_to":"967f6668_6c5dc8a5","updated":"2026-09-01 09:12:16.000000000","message":"Done. This test now uses self.override_config(...) for both options.","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"}],"cinder/tests/unit/volume/drivers/netapp/dataontap/utils/test_utils.py":[{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"a919217a4dc57c8cd19046ce53e9619319a6eee6","unresolved":true,"context_lines":[{"line_number":97,"context_line":"    @ddt.data(True, False)"},{"line_number":98,"context_line":"    def test_get_client_for_backend(self, use_legacy):"},{"line_number":99,"context_line":"        self.config.netapp_use_legacy_client \u003d use_legacy"},{"line_number":100,"context_line":"        self.config.netapp_use_metrics_based_utilization \u003d False"},{"line_number":101,"context_line":"        self.mock_object(utils, \u0027get_backend_configuration\u0027,"},{"line_number":102,"context_line":"                         return_value\u003dself.config)"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dc5d40dc_4828d62a","line":100,"updated":"2026-08-26 22:36:19.000000000","message":"``override_config``?","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"1827ff9822e17deed65db6ca25502e720167739e","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    @ddt.data(True, False)"},{"line_number":98,"context_line":"    def test_get_client_for_backend(self, use_legacy):"},{"line_number":99,"context_line":"        self.config.netapp_use_legacy_client \u003d use_legacy"},{"line_number":100,"context_line":"        self.config.netapp_use_metrics_based_utilization \u003d False"},{"line_number":101,"context_line":"        self.mock_object(utils, \u0027get_backend_configuration\u0027,"},{"line_number":102,"context_line":"                         return_value\u003dself.config)"},{"line_number":103,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"7e6f52c4_3262a47d","line":100,"in_reply_to":"dc5d40dc_4828d62a","updated":"2026-09-01 09:12:16.000000000","message":"Done. These tests now use self.override_config(..., group\u003dself.backend) instead of assigning on self.config.","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"a919217a4dc57c8cd19046ce53e9619319a6eee6","unresolved":true,"context_lines":[{"line_number":129,"context_line":"    @ddt.data(True, False)"},{"line_number":130,"context_line":"    def test_get_client_for_backend_with_vserver(self, use_legacy):"},{"line_number":131,"context_line":"        self.config.netapp_use_legacy_client \u003d use_legacy"},{"line_number":132,"context_line":"        self.config.netapp_use_metrics_based_utilization \u003d False"},{"line_number":133,"context_line":"        self.mock_object(utils, \u0027get_backend_configuration\u0027,"},{"line_number":134,"context_line":"                         return_value\u003dself.config)"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"0bf1bb1f_5869073f","line":132,"updated":"2026-08-26 22:36:19.000000000","message":"``override_config``?","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"1827ff9822e17deed65db6ca25502e720167739e","unresolved":false,"context_lines":[{"line_number":129,"context_line":"    @ddt.data(True, False)"},{"line_number":130,"context_line":"    def test_get_client_for_backend_with_vserver(self, use_legacy):"},{"line_number":131,"context_line":"        self.config.netapp_use_legacy_client \u003d use_legacy"},{"line_number":132,"context_line":"        self.config.netapp_use_metrics_based_utilization \u003d False"},{"line_number":133,"context_line":"        self.mock_object(utils, \u0027get_backend_configuration\u0027,"},{"line_number":134,"context_line":"                         return_value\u003dself.config)"},{"line_number":135,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"5b82deb6_1ad70513","line":132,"in_reply_to":"0bf1bb1f_5869073f","updated":"2026-09-01 09:12:16.000000000","message":"Done. These tests now use self.override_config(..., group\u003dself.backend) instead of assigning on self.config.","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"a919217a4dc57c8cd19046ce53e9619319a6eee6","unresolved":true,"context_lines":[{"line_number":163,"context_line":"            self.mock_cmode_client.assert_not_called()"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def test_get_client_for_backend_metrics_utilization_forces_rest(self):"},{"line_number":166,"context_line":"        self.config.netapp_use_legacy_client \u003d True"},{"line_number":167,"context_line":"        self.config.netapp_use_metrics_based_utilization \u003d True"},{"line_number":168,"context_line":"        self.mock_object(utils, \u0027get_backend_configuration\u0027,"},{"line_number":169,"context_line":"                         return_value\u003dself.config)"}],"source_content_type":"text/x-python","patch_set":8,"id":"e67dc2c2_0c0ce03c","line":166,"updated":"2026-08-26 22:36:19.000000000","message":"``override_config``?","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"1827ff9822e17deed65db6ca25502e720167739e","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            self.mock_cmode_client.assert_not_called()"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def test_get_client_for_backend_metrics_utilization_forces_rest(self):"},{"line_number":166,"context_line":"        self.config.netapp_use_legacy_client \u003d True"},{"line_number":167,"context_line":"        self.config.netapp_use_metrics_based_utilization \u003d True"},{"line_number":168,"context_line":"        self.mock_object(utils, \u0027get_backend_configuration\u0027,"},{"line_number":169,"context_line":"                         return_value\u003dself.config)"}],"source_content_type":"text/x-python","patch_set":8,"id":"90bcf42f_60d95af2","line":166,"in_reply_to":"e67dc2c2_0c0ce03c","updated":"2026-09-01 09:12:16.000000000","message":"Done. These tests now use self.override_config(..., group\u003dself.backend) instead of assigning on self.config.","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"}],"cinder/volume/drivers/netapp/dataontap/block_cmode.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c3326fe758dc95cc83b13f52afea2bd36530a71b","unresolved":true,"context_lines":[{"line_number":712,"context_line":"        # ASA r2 has no counter-based fallback, so always refresh via metrics."},{"line_number":713,"context_line":"        should_update_performance \u003d True"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"        if (self.using_cluster_credentials and should_update_performance):"},{"line_number":716,"context_line":"            # Update the saved cluster performance data only after the set"},{"line_number":717,"context_line":"            # time has passed.This prevents running slow real-time performance"},{"line_number":718,"context_line":"            # checks every time stats are collected. The time of the last"}],"source_content_type":"text/x-python","patch_set":3,"id":"ebb69f81_5bb9a044","line":715,"range":{"start_line":715,"start_character":43,"end_line":715,"end_character":72},"updated":"2026-07-17 15:56:59.000000000","message":"The right side conjunct will always be True because of line 713, so you are really only checking against using_cluster_credentials here -- is that what you want?  (I suspect not because this is the only place should_update_performance is used.)","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"a69c9b036814b3d3ae73381b74deef6046b1eef1","unresolved":true,"context_lines":[{"line_number":712,"context_line":"        # ASA r2 has no counter-based fallback, so always refresh via metrics."},{"line_number":713,"context_line":"        should_update_performance \u003d True"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"        if (self.using_cluster_credentials and should_update_performance):"},{"line_number":716,"context_line":"            # Update the saved cluster performance data only after the set"},{"line_number":717,"context_line":"            # time has passed.This prevents running slow real-time performance"},{"line_number":718,"context_line":"            # checks every time stats are collected. The time of the last"}],"source_content_type":"text/x-python","patch_set":3,"id":"b42292aa_c91264da","line":715,"range":{"start_line":715,"start_character":43,"end_line":715,"end_character":72},"in_reply_to":"0612c737_06932b33","updated":"2026-07-31 06:40:44.000000000","message":"Since this is under is_disaggregated boolean flag, we do not need hardcoded should_update_performance flag.","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"7061a582b0db922134e38b7f29209ba4f2774037","unresolved":false,"context_lines":[{"line_number":712,"context_line":"        # ASA r2 has no counter-based fallback, so always refresh via metrics."},{"line_number":713,"context_line":"        should_update_performance \u003d True"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"        if (self.using_cluster_credentials and should_update_performance):"},{"line_number":716,"context_line":"            # Update the saved cluster performance data only after the set"},{"line_number":717,"context_line":"            # time has passed.This prevents running slow real-time performance"},{"line_number":718,"context_line":"            # checks every time stats are collected. The time of the last"}],"source_content_type":"text/x-python","patch_set":3,"id":"ed50bb5c_94bc983c","line":715,"range":{"start_line":715,"start_character":43,"end_line":715,"end_character":72},"in_reply_to":"b42292aa_c91264da","updated":"2026-08-14 04:45:02.000000000","message":"should_update_performance flag is redundant and removed.","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"3fa84db30e75d8b614c37b8e2e00fb1856b4f109","unresolved":true,"context_lines":[{"line_number":712,"context_line":"        # ASA r2 has no counter-based fallback, so always refresh via metrics."},{"line_number":713,"context_line":"        should_update_performance \u003d True"},{"line_number":714,"context_line":""},{"line_number":715,"context_line":"        if (self.using_cluster_credentials and should_update_performance):"},{"line_number":716,"context_line":"            # Update the saved cluster performance data only after the set"},{"line_number":717,"context_line":"            # time has passed.This prevents running slow real-time performance"},{"line_number":718,"context_line":"            # checks every time stats are collected. The time of the last"}],"source_content_type":"text/x-python","patch_set":3,"id":"0612c737_06932b33","line":715,"range":{"start_line":715,"start_character":43,"end_line":715,"end_character":72},"in_reply_to":"ebb69f81_5bb9a044","updated":"2026-07-17 16:02:15.000000000","message":"I got the impression from the comment ``# ASA r2 has no counter-based fallback, so always refresh via metrics.`` that it was just performative / maybe for a future update or something.  Though I suppose I also should have asked.","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"a69c9b036814b3d3ae73381b74deef6046b1eef1","unresolved":true,"context_lines":[{"line_number":729,"context_line":"            else:"},{"line_number":730,"context_line":"                LOG.debug(\"Using the previous perf stats from last update.\")"},{"line_number":731,"context_line":""},{"line_number":732,"context_line":"            if not is_disaggregated:"},{"line_number":733,"context_line":"                # Get up-to-date aggregate capacities just once"},{"line_number":734,"context_line":"                aggregates \u003d self.ssc_library.get_ssc_aggregates()"},{"line_number":735,"context_line":"                LOG.debug(\"Getting aggregate capacities.\")"},{"line_number":736,"context_line":"                aggr_capacities \u003d self.zapi_client.get_aggregate_capacities("},{"line_number":737,"context_line":"                    aggregates)"},{"line_number":738,"context_line":"                LOG.debug(\"Aggregate capacities successfully fetched: %s\","},{"line_number":739,"context_line":"                          aggr_capacities)"},{"line_number":740,"context_line":"            else:"},{"line_number":741,"context_line":"                aggr_capacities \u003d {}"},{"line_number":742,"context_line":"        else:"},{"line_number":743,"context_line":"            aggr_capacities \u003d {}"},{"line_number":744,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"cfab8345_37f50b24","line":741,"range":{"start_line":732,"start_character":12,"end_line":741,"end_character":36},"updated":"2026-07-31 06:40:44.000000000","message":"Why is this block required to be under is_disaggregated? Have you tested this with ASAr2? ASAr2 continues to support aggregate APIs.","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"7061a582b0db922134e38b7f29209ba4f2774037","unresolved":false,"context_lines":[{"line_number":729,"context_line":"            else:"},{"line_number":730,"context_line":"                LOG.debug(\"Using the previous perf stats from last update.\")"},{"line_number":731,"context_line":""},{"line_number":732,"context_line":"            if not is_disaggregated:"},{"line_number":733,"context_line":"                # Get up-to-date aggregate capacities just once"},{"line_number":734,"context_line":"                aggregates \u003d self.ssc_library.get_ssc_aggregates()"},{"line_number":735,"context_line":"                LOG.debug(\"Getting aggregate capacities.\")"},{"line_number":736,"context_line":"                aggr_capacities \u003d self.zapi_client.get_aggregate_capacities("},{"line_number":737,"context_line":"                    aggregates)"},{"line_number":738,"context_line":"                LOG.debug(\"Aggregate capacities successfully fetched: %s\","},{"line_number":739,"context_line":"                          aggr_capacities)"},{"line_number":740,"context_line":"            else:"},{"line_number":741,"context_line":"                aggr_capacities \u003d {}"},{"line_number":742,"context_line":"        else:"},{"line_number":743,"context_line":"            aggr_capacities \u003d {}"},{"line_number":744,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"5baed195_083c085a","line":741,"range":{"start_line":732,"start_character":12,"end_line":741,"end_character":36},"in_reply_to":"cfab8345_37f50b24","updated":"2026-08-14 04:45:02.000000000","message":"Marked as resolved.","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"}],"cinder/volume/drivers/netapp/dataontap/client/client_cmode_rest.py":[{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"a69c9b036814b3d3ae73381b74deef6046b1eef1","unresolved":true,"context_lines":[{"line_number":176,"context_line":"        self.features.add_feature(\u0027USER_CAPABILITY_LIST\u0027,"},{"line_number":177,"context_line":"                                  supported\u003dontap_9_0)"},{"line_number":178,"context_line":"        self.features.add_feature(\u0027SYSTEM_METRICS\u0027, supported\u003dontap_9_0)"},{"line_number":179,"context_line":"        # NODE_METRICS requires ONTAP 9.13+; older releases use counters."},{"line_number":180,"context_line":"        self.features.add_feature(\u0027NODE_METRICS\u0027, supported\u003dontap_9_13)"},{"line_number":181,"context_line":"        self.features.add_feature(\u0027CLONE_SPLIT_STATUS\u0027, supported\u003dontap_9_0)"},{"line_number":182,"context_line":"        self.features.add_feature(\u0027FAST_CLONE_DELETE\u0027, supported\u003dontap_9_0)"},{"line_number":183,"context_line":"        self.features.add_feature(\u0027SYSTEM_CONSTITUENT_METRICS\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"e2ac70e3_4c291991","line":180,"range":{"start_line":179,"start_character":8,"end_line":180,"end_character":71},"updated":"2026-07-31 06:40:44.000000000","message":"Node Metrics APIs are supported from ONTAP 9.8 onwards.","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"7061a582b0db922134e38b7f29209ba4f2774037","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        self.features.add_feature(\u0027USER_CAPABILITY_LIST\u0027,"},{"line_number":177,"context_line":"                                  supported\u003dontap_9_0)"},{"line_number":178,"context_line":"        self.features.add_feature(\u0027SYSTEM_METRICS\u0027, supported\u003dontap_9_0)"},{"line_number":179,"context_line":"        # NODE_METRICS requires ONTAP 9.13+; older releases use counters."},{"line_number":180,"context_line":"        self.features.add_feature(\u0027NODE_METRICS\u0027, supported\u003dontap_9_13)"},{"line_number":181,"context_line":"        self.features.add_feature(\u0027CLONE_SPLIT_STATUS\u0027, supported\u003dontap_9_0)"},{"line_number":182,"context_line":"        self.features.add_feature(\u0027FAST_CLONE_DELETE\u0027, supported\u003dontap_9_0)"},{"line_number":183,"context_line":"        self.features.add_feature(\u0027SYSTEM_CONSTITUENT_METRICS\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"f964434e_ab13d245","line":180,"range":{"start_line":179,"start_character":8,"end_line":180,"end_character":71},"in_reply_to":"e2ac70e3_4c291991","updated":"2026-08-14 04:45:02.000000000","message":"update to 9.8 onwards","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"a69c9b036814b3d3ae73381b74deef6046b1eef1","unresolved":true,"context_lines":[{"line_number":1127,"context_line":"        if node_uuid:"},{"line_number":1128,"context_line":"            return node_uuid"},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"        query_args \u003d {\u0027name\u0027: node_name, \u0027fields\u0027: \u0027uuid\u0027}"},{"line_number":1131,"context_line":"        try:"},{"line_number":1132,"context_line":"            response \u003d self.send_request(\u0027/cluster/nodes\u0027, \u0027get\u0027,"},{"line_number":1133,"context_line":"                                         query\u003dquery_args,"}],"source_content_type":"text/x-python","patch_set":3,"id":"f0a43d6e_2c6528c6","line":1130,"updated":"2026-07-31 06:40:44.000000000","message":"you do not need fields query param for getting uuid. ONTAP defaults to sending name and uuid as default.","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"7061a582b0db922134e38b7f29209ba4f2774037","unresolved":false,"context_lines":[{"line_number":1127,"context_line":"        if node_uuid:"},{"line_number":1128,"context_line":"            return node_uuid"},{"line_number":1129,"context_line":""},{"line_number":1130,"context_line":"        query_args \u003d {\u0027name\u0027: node_name, \u0027fields\u0027: \u0027uuid\u0027}"},{"line_number":1131,"context_line":"        try:"},{"line_number":1132,"context_line":"            response \u003d self.send_request(\u0027/cluster/nodes\u0027, \u0027get\u0027,"},{"line_number":1133,"context_line":"                                         query\u003dquery_args,"}],"source_content_type":"text/x-python","patch_set":3,"id":"c431a0d9_2560023a","line":1130,"in_reply_to":"f0a43d6e_2c6528c6","updated":"2026-08-14 04:45:02.000000000","message":"good to have not removed after discussion.","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"a69c9b036814b3d3ae73381b74deef6046b1eef1","unresolved":true,"context_lines":[{"line_number":1168,"context_line":"                action_url, \u0027get\u0027, query\u003dquery_args, enable_tunneling\u003dFalse)"},{"line_number":1169,"context_line":"        except netapp_api.NaApiError as e:"},{"line_number":1170,"context_line":"            if e.code \u003d\u003d netapp_api.REST_UNAUTHORIZED:"},{"line_number":1171,"context_line":"                LOG.warning(\u0027Node utilization metrics require cluster scoped \u0027"},{"line_number":1172,"context_line":"                            \u0027credentials; using the default utilization for \u0027"},{"line_number":1173,"context_line":"                            \u0027node %s.\u0027, node_name)"},{"line_number":1174,"context_line":"            elif e.code \u003d\u003d netapp_api.REST_API_NOT_FOUND:"},{"line_number":1175,"context_line":"                LOG.warning(\u0027Node utilization metrics are not available for \u0027"},{"line_number":1176,"context_line":"                            \u0027node %s.\u0027, node_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"c425d72b_be8c8e11","line":1173,"range":{"start_line":1171,"start_character":15,"end_line":1173,"end_character":50},"updated":"2026-07-31 06:40:44.000000000","message":"The unauthorized response can be due to wrong credentials used as well. So instead, we can say - \"Could not fetch Node utilization metrics due to unauthorized exception; falling back to default utilization for node %s\".","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"9c4e14210b22ab02100df445f2fb76efb7c11430","unresolved":false,"context_lines":[{"line_number":1168,"context_line":"                action_url, \u0027get\u0027, query\u003dquery_args, enable_tunneling\u003dFalse)"},{"line_number":1169,"context_line":"        except netapp_api.NaApiError as e:"},{"line_number":1170,"context_line":"            if e.code \u003d\u003d netapp_api.REST_UNAUTHORIZED:"},{"line_number":1171,"context_line":"                LOG.warning(\u0027Node utilization metrics require cluster scoped \u0027"},{"line_number":1172,"context_line":"                            \u0027credentials; using the default utilization for \u0027"},{"line_number":1173,"context_line":"                            \u0027node %s.\u0027, node_name)"},{"line_number":1174,"context_line":"            elif e.code \u003d\u003d netapp_api.REST_API_NOT_FOUND:"},{"line_number":1175,"context_line":"                LOG.warning(\u0027Node utilization metrics are not available for \u0027"},{"line_number":1176,"context_line":"                            \u0027node %s.\u0027, node_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"834efa46_2418730e","line":1173,"range":{"start_line":1171,"start_character":15,"end_line":1173,"end_character":50},"in_reply_to":"c425d72b_be8c8e11","updated":"2026-08-14 04:54:46.000000000","message":"updated log message to reflect above message.","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"a919217a4dc57c8cd19046ce53e9619319a6eee6","unresolved":true,"context_lines":[{"line_number":1126,"context_line":"        Returns None if the UUID cannot be determined."},{"line_number":1127,"context_line":"        \"\"\""},{"line_number":1128,"context_line":"        if not node_name:"},{"line_number":1129,"context_line":"            return None"},{"line_number":1130,"context_line":""},{"line_number":1131,"context_line":"        node_uuid \u003d getattr(self, \u0027_node_uuid_cache\u0027, {}).get(node_name)"},{"line_number":1132,"context_line":"        if node_uuid:"}],"source_content_type":"text/x-python","patch_set":8,"id":"7cf58b3a_58895121","line":1129,"updated":"2026-08-26 22:36:19.000000000","message":"Is this likely to happen?\n\nYou don\u0027t need to change this if you don\u0027t want to, but there\u0027s a part of me that wonders if it failing would be better since I would think this would indicate a bug.","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"1827ff9822e17deed65db6ca25502e720167739e","unresolved":false,"context_lines":[{"line_number":1126,"context_line":"        Returns None if the UUID cannot be determined."},{"line_number":1127,"context_line":"        \"\"\""},{"line_number":1128,"context_line":"        if not node_name:"},{"line_number":1129,"context_line":"            return None"},{"line_number":1130,"context_line":""},{"line_number":1131,"context_line":"        node_uuid \u003d getattr(self, \u0027_node_uuid_cache\u0027, {}).get(node_name)"},{"line_number":1132,"context_line":"        if node_uuid:"}],"source_content_type":"text/x-python","patch_set":8,"id":"93489379_9be1336a","line":1129,"in_reply_to":"7cf58b3a_58895121","updated":"2026-09-01 09:12:16.000000000","message":"Unlikely on the FlexVol path (_get_nodes_for_aggregates already skips a missing home node). It can happen on ASA r2 when a name from the SVM aggregate list has no home node (for example a storage availability zone). Returning None lets stats collection fall back to default utilization (50) instead of failing the pool-stats update. Left the behavior and added a comment.","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"},{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"a919217a4dc57c8cd19046ce53e9619319a6eee6","unresolved":true,"context_lines":[{"line_number":1186,"context_line":"                LOG.warning(\u0027Node utilization metrics are not available for \u0027"},{"line_number":1187,"context_line":"                            \u0027node %s.\u0027, node_name)"},{"line_number":1188,"context_line":"            else:"},{"line_number":1189,"context_line":"                LOG.exception(\u0027Failed to get utilization metrics for node %s.\u0027,"},{"line_number":1190,"context_line":"                              node_name)"},{"line_number":1191,"context_line":"            return None"},{"line_number":1192,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"ecd72b8a_c3095f92","line":1189,"updated":"2026-08-26 22:36:19.000000000","message":"Should this also log the exception?","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"1827ff9822e17deed65db6ca25502e720167739e","unresolved":false,"context_lines":[{"line_number":1186,"context_line":"                LOG.warning(\u0027Node utilization metrics are not available for \u0027"},{"line_number":1187,"context_line":"                            \u0027node %s.\u0027, node_name)"},{"line_number":1188,"context_line":"            else:"},{"line_number":1189,"context_line":"                LOG.exception(\u0027Failed to get utilization metrics for node %s.\u0027,"},{"line_number":1190,"context_line":"                              node_name)"},{"line_number":1191,"context_line":"            return None"},{"line_number":1192,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"97d3ead1_65bf2abd","line":1189,"in_reply_to":"ecd72b8a_c3095f92","updated":"2026-09-01 09:12:16.000000000","message":"The else branch already uses LOG.exception for unexpected errors. 401 and 404 are expected (bad credentials, or metrics not present on that node/release) and would dump a traceback on every stats poll if we used LOG.exception. Left those as LOG.warning.","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"}],"cinder/volume/drivers/netapp/dataontap/nvme_library.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c3326fe758dc95cc83b13f52afea2bd36530a71b","unresolved":true,"context_lines":[{"line_number":545,"context_line":"        # ASA r2 has no counter-based fallback, so always refresh via metrics."},{"line_number":546,"context_line":"        should_update_performance \u003d True"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"        if self.using_cluster_credentials and should_update_performance:"},{"line_number":549,"context_line":"            # Get up-to-date node utilization metrics just once"},{"line_number":550,"context_line":"            self.perf_library.update_performance_cache(ssc)"},{"line_number":551,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"66f5c889_048080b1","line":548,"updated":"2026-07-17 15:56:59.000000000","message":"See my comment in block_cmode.py","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"9c4e14210b22ab02100df445f2fb76efb7c11430","unresolved":false,"context_lines":[{"line_number":545,"context_line":"        # ASA r2 has no counter-based fallback, so always refresh via metrics."},{"line_number":546,"context_line":"        should_update_performance \u003d True"},{"line_number":547,"context_line":""},{"line_number":548,"context_line":"        if self.using_cluster_credentials and should_update_performance:"},{"line_number":549,"context_line":"            # Get up-to-date node utilization metrics just once"},{"line_number":550,"context_line":"            self.perf_library.update_performance_cache(ssc)"},{"line_number":551,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"ae5dac8b_4dc5af1d","line":548,"in_reply_to":"66f5c889_048080b1","updated":"2026-08-14 04:54:46.000000000","message":"removed redundant should_update_performance","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"}],"cinder/volume/drivers/netapp/dataontap/performance/perf_cmode.py":[{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"ce2d9562f93a62cc856aa41b0860d21d3fee54c7","unresolved":true,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _update_for_failover(self, zapi_client, ssc_pools):"},{"line_number":182,"context_line":"        self.zapi_client \u003d zapi_client"},{"line_number":183,"context_line":"        self._aggr_node_cache \u003d {"},{"line_number":184,"context_line":"            \u0027node_names\u0027: set(),"},{"line_number":185,"context_line":"            \u0027aggr_node_map\u0027: {},"},{"line_number":186,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":10,"id":"9311bb62_5012e354","line":183,"updated":"2026-10-02 14:26:56.000000000","message":"The only time this cache is meant to be reset is during a failover, correct?","commit_id":"dec6701c8404ad8e0095ee16e3c960dfa7403dc9"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"467a719237b0c32a0908ef97270778e3642c5949","unresolved":false,"context_lines":[{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _update_for_failover(self, zapi_client, ssc_pools):"},{"line_number":182,"context_line":"        self.zapi_client \u003d zapi_client"},{"line_number":183,"context_line":"        self._aggr_node_cache \u003d {"},{"line_number":184,"context_line":"            \u0027node_names\u0027: set(),"},{"line_number":185,"context_line":"            \u0027aggr_node_map\u0027: {},"},{"line_number":186,"context_line":"        }"}],"source_content_type":"text/x-python","patch_set":10,"id":"c6fa2db0_afb858ac","line":183,"in_reply_to":"9311bb62_5012e354","updated":"2026-10-02 14:55:15.000000000","message":"Yes. The empty _aggr_node_cache assignment is only in _update_for_failover, and that method is only called from _update_zapi_client when the driver switches clusters.\n\nThat is failover and failback, not the periodic stats poll:\n\nfailover: DataMotionMixin._failover_host and _failover_completed\nfailback: _complete_failback and _complete_failback_active_sync. This may result in cache object not initialized and results in keyError in regular workflows","commit_id":"dec6701c8404ad8e0095ee16e3c960dfa7403dc9"}],"cinder/volume/drivers/netapp/dataontap/utils/capabilities.py":[{"author":{"_account_id":5314,"name":"Brian Rosmaita","email":"rosmaita.fossdev@gmail.com","username":"brian-rosmaita"},"change_message_id":"c3326fe758dc95cc83b13f52afea2bd36530a71b","unresolved":true,"context_lines":[{"line_number":188,"context_line":"            \u0027netapp_thin_provisioned\u0027: str(not netapp_thick).lower(),"},{"line_number":189,"context_line":"            \u0027thick_provisioning_support\u0027: thick,"},{"line_number":190,"context_line":"            \u0027thin_provisioning_support\u0027: not thick,"},{"line_number":191,"context_line":"            \u0027netapp_aggregate\u0027: aggregates if is_flexgroup else aggregates[0],"},{"line_number":192,"context_line":"            \u0027netapp_is_flexgroup\u0027: str(is_flexgroup).lower(),"},{"line_number":193,"context_line":"        }"},{"line_number":194,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"2031cfdd_980f8bf5","line":191,"range":{"start_line":191,"start_character":64,"end_line":191,"end_character":77},"updated":"2026-07-17 15:56:59.000000000","message":"from line 185, \u0027aggregates\u0027 could be \u0027[]\u0027, in which case this will raise an IndexError","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"9c4e14210b22ab02100df445f2fb76efb7c11430","unresolved":false,"context_lines":[{"line_number":188,"context_line":"            \u0027netapp_thin_provisioned\u0027: str(not netapp_thick).lower(),"},{"line_number":189,"context_line":"            \u0027thick_provisioning_support\u0027: thick,"},{"line_number":190,"context_line":"            \u0027thin_provisioning_support\u0027: not thick,"},{"line_number":191,"context_line":"            \u0027netapp_aggregate\u0027: aggregates if is_flexgroup else aggregates[0],"},{"line_number":192,"context_line":"            \u0027netapp_is_flexgroup\u0027: str(is_flexgroup).lower(),"},{"line_number":193,"context_line":"        }"},{"line_number":194,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"b6b027b4_8c607af6","line":191,"range":{"start_line":191,"start_character":64,"end_line":191,"end_character":77},"in_reply_to":"2031cfdd_980f8bf5","updated":"2026-08-14 04:54:46.000000000","message":"added additional checks to avoid index erros.","commit_id":"0bc5ce4ab8ba2016cbfb8aed4e68300e8f7f893e"}],"releasenotes/notes/netapp-metrics-based-utilization-3f1a2b6c8d9e0f12.yaml":[{"author":{"_account_id":38081,"name":"Anthony Galica","display_name":"agalica","email":"anthony.galica@hitachivantara.com","username":"agalica","status":"Hitachi Vantara"},"change_message_id":"a919217a4dc57c8cd19046ce53e9619319a6eee6","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    NetApp ONTAP driver: Added a new boolean configuration option"},{"line_number":5,"context_line":"    ``netapp_use_metrics_based_utilization`` (default ``True``). When"},{"line_number":6,"context_line":"    enabled, the driver forces use of the REST client (regardless of"},{"line_number":7,"context_line":"    ``netapp_use_legacy_client``) and derives the pool ``utilization``"},{"line_number":8,"context_line":"    value from the ONTAP REST node metrics endpoint instead of the legacy"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"c7580483_9b8d8d4e","line":5,"updated":"2026-08-26 22:36:19.000000000","message":"Will this cause problems for users if you silently force them to use the REST client instead of the legacy client?","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"},{"author":{"_account_id":36171,"name":"jayaanand borra","display_name":"jayaanand borra","email":"jayaanand.borra@netapp.com","username":"jayaanan","status":"netapp"},"change_message_id":"1827ff9822e17deed65db6ca25502e720167739e","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    NetApp ONTAP driver: Added a new boolean configuration option"},{"line_number":5,"context_line":"    ``netapp_use_metrics_based_utilization`` (default ``True``). When"},{"line_number":6,"context_line":"    enabled, the driver forces use of the REST client (regardless of"},{"line_number":7,"context_line":"    ``netapp_use_legacy_client``) and derives the pool ``utilization``"},{"line_number":8,"context_line":"    value from the ONTAP REST node metrics endpoint instead of the legacy"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"ee49d8f4_239b49b3","line":5,"in_reply_to":"c7580483_9b8d8d4e","updated":"2026-09-01 09:12:16.000000000","message":"It is a real side effect, and it is intentional. The node metrics API is REST-only, so netapp_use_metrics_based_utilization\u003dTrue cannot keep the ZAPI client.\n\nDefault True matches “use metrics.” An upgrade that still has netapp_use_legacy_client\u003dTrue (also the default) will switch to REST. Operators who must stay on ZAPI set netapp_use_metrics_based_utilization\u003dFalse; that keeps both the client chosen by netapp_use_legacy_client and the counter-based calculation.\n\nThat is now explicit in this reno and in the option help. The driver also logs at INFO when it actually ignores the legacy client, so the override is not silent.\n\nWe are not flipping the default to False: that would turn the feature off for every unset stanza, including REST, NVMe, and ASA r2.","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"},{"author":{"_account_id":38059,"name":"Anoop Kumar Shukla","display_name":"Anoop Shukla","email":"anoop.shukla@netapp.com","username":"anoop2","status":"NetApp"},"change_message_id":"93b1f5c7ffc722c3cddd42014f7328b9dc74f976","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    NetApp ONTAP driver: Added a new boolean configuration option"},{"line_number":5,"context_line":"    ``netapp_use_metrics_based_utilization`` (default ``True``). When"},{"line_number":6,"context_line":"    enabled, the driver forces use of the REST client (regardless of"},{"line_number":7,"context_line":"    ``netapp_use_legacy_client``) and derives the pool ``utilization``"},{"line_number":8,"context_line":"    value from the ONTAP REST node metrics endpoint instead of the legacy"}],"source_content_type":"text/x-yaml","patch_set":8,"id":"da63a434_70e2ad14","line":5,"in_reply_to":"ee49d8f4_239b49b3","updated":"2026-09-01 12:50:58.000000000","message":"Moreover @anthony.galica@hitachivantara.com - ONTAP does not support new features on ZAPIs (legacy client) anymore. All new features are supposed to be delivered via REST only. To avoid failing on these new features, where customers are using legacy client, we need to force rest for the workflows that require it. That is how replication and CG support work as well. So it is inline with the existing behaviour of the driver between ZAPIs and REST.","commit_id":"1ac800957efa7eead2c9a6d91fd846e5efe33b95"}]}
