From dc719c7ee23c6738dfc1ac6134c9e0cbd2fb12a9 Mon Sep 17 00:00:00 2001 From: Indu Sridhar Date: Wed, 5 Aug 2026 16:17:42 -0700 Subject: [PATCH 1/2] {AKS} Fix node OS-only rollback warning --- .../azure/cli/command_modules/acs/custom.py | 11 ++++++- .../acs/tests/latest/test_custom.py | 30 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/azure-cli/azure/cli/command_modules/acs/custom.py b/src/azure-cli/azure/cli/command_modules/acs/custom.py index 798c8bc7a65..56ed06556eb 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/custom.py +++ b/src/azure-cli/azure/cli/command_modules/acs/custom.py @@ -3178,7 +3178,7 @@ def aks_agentpool_rollback( node_os_upgrade_channel_value and str(node_os_upgrade_channel_value).lower() not in ["none", "unmanaged"] ) - if upgrade_channel_enabled or node_os_channel_enabled: + if upgrade_channel_enabled: logger.warning( "Auto-upgrade is enabled on cluster '%s' (upgradeChannel=%s, nodeOSUpgradeChannel=%s). " "Rollback will not succeed until auto-upgrade is disabled. Please disable auto-upgrade to roll back the node pool.", @@ -3187,6 +3187,15 @@ def aks_agentpool_rollback( node_os_upgrade_channel_value or "Unmanaged", ) + if node_os_channel_enabled: + logger.warning( + "nodeOSUpgradeChannel is enabled on cluster '%s' (nodeOSUpgradeChannel=%s). " + "The orchestrator version rollback will proceed, but the node image rollback " + "will not succeed. Please disable nodeOSUpgradeChannel if you want to roll back the node image.", + cluster_name, + node_os_upgrade_channel_value, + ) + logger.info("Fetching the most recent rollback version...") upgrade_profile = client.get_upgrade_profile(resource_group_name, cluster_name, nodepool_name) diff --git a/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_custom.py b/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_custom.py index c01d2108fd4..a36be18da15 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_custom.py +++ b/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_custom.py @@ -1788,6 +1788,36 @@ def test_aks_agentpool_rollback_raises_when_no_recent_versions(self, mock_sdk_no mock_sdk_no_wait.assert_not_called() + @mock.patch("azure.cli.command_modules.acs._client_factory.cf_managed_clusters") + @mock.patch("azure.cli.command_modules.acs.custom.sdk_no_wait") + def test_aks_agentpool_rollback_warns_node_image_only_for_node_os_channel( + self, mock_sdk_no_wait, mock_cf_managed_clusters + ): + rollback_version = mock.Mock( + orchestrator_version="1.34.8", + node_image_version="AKSUbuntu-2204gen2containerd-202607.20.0", + timestamp=datetime.datetime(2026, 8, 5), + ) + client = mock.Mock() + client.get_upgrade_profile.return_value = mock.Mock(recently_used_versions=[rollback_version]) + client.get.return_value = mock.Mock() + mock_cf_managed_clusters.return_value.get.return_value = mock.Mock( + auto_upgrade_profile=mock.Mock( + upgrade_channel=mock.Mock(value="none"), + node_os_upgrade_channel=mock.Mock(value="NodeImage"), + ) + ) + + with mock.patch("azure.cli.command_modules.acs.custom.logger.warning") as mock_warning: + aks_agentpool_rollback(self.cmd, client, "rg", "cluster", "nodepool1") + + mock_warning.assert_called_once() + warning = mock_warning.call_args.args[0] + self.assertIn("The orchestrator version rollback will proceed", warning) + self.assertIn("the node image rollback will not succeed", warning) + self.assertNotIn("Rollback will not succeed until auto-upgrade is disabled", warning) + mock_sdk_no_wait.assert_called_once() + if __name__ == "__main__": unittest.main() From 00f61da2e110a6018d59c1fc7e3e8fe8654cf104 Mon Sep 17 00:00:00 2001 From: Indu Sridhar Date: Wed, 5 Aug 2026 20:56:44 -0700 Subject: [PATCH 2/2] {AKS} Prioritize cluster upgrade rollback warning --- .../azure/cli/command_modules/acs/custom.py | 6 ++-- .../acs/tests/latest/test_custom.py | 30 +++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/src/azure-cli/azure/cli/command_modules/acs/custom.py b/src/azure-cli/azure/cli/command_modules/acs/custom.py index 56ed06556eb..d169f67c593 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/custom.py +++ b/src/azure-cli/azure/cli/command_modules/acs/custom.py @@ -3180,14 +3180,12 @@ def aks_agentpool_rollback( if upgrade_channel_enabled: logger.warning( - "Auto-upgrade is enabled on cluster '%s' (upgradeChannel=%s, nodeOSUpgradeChannel=%s). " + "Auto-upgrade is enabled on cluster '%s' (upgradeChannel=%s). " "Rollback will not succeed until auto-upgrade is disabled. Please disable auto-upgrade to roll back the node pool.", cluster_name, upgrade_channel_value or "none", - node_os_upgrade_channel_value or "Unmanaged", ) - - if node_os_channel_enabled: + elif node_os_channel_enabled: logger.warning( "nodeOSUpgradeChannel is enabled on cluster '%s' (nodeOSUpgradeChannel=%s). " "The orchestrator version rollback will proceed, but the node image rollback " diff --git a/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_custom.py b/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_custom.py index a36be18da15..32124f89caf 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_custom.py +++ b/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_custom.py @@ -1818,6 +1818,36 @@ def test_aks_agentpool_rollback_warns_node_image_only_for_node_os_channel( self.assertNotIn("Rollback will not succeed until auto-upgrade is disabled", warning) mock_sdk_no_wait.assert_called_once() + @mock.patch("azure.cli.command_modules.acs._client_factory.cf_managed_clusters") + @mock.patch("azure.cli.command_modules.acs.custom.sdk_no_wait") + def test_aks_agentpool_rollback_prioritizes_upgrade_channel_warning( + self, mock_sdk_no_wait, mock_cf_managed_clusters + ): + rollback_version = mock.Mock( + orchestrator_version="1.34.8", + node_image_version="AKSUbuntu-2204gen2containerd-202607.20.0", + timestamp=datetime.datetime(2026, 8, 5), + ) + client = mock.Mock() + client.get_upgrade_profile.return_value = mock.Mock(recently_used_versions=[rollback_version]) + client.get.return_value = mock.Mock() + mock_cf_managed_clusters.return_value.get.return_value = mock.Mock( + auto_upgrade_profile=mock.Mock( + upgrade_channel=mock.Mock(value="stable"), + node_os_upgrade_channel=mock.Mock(value="NodeImage"), + ) + ) + + with mock.patch("azure.cli.command_modules.acs.custom.logger.warning") as mock_warning: + aks_agentpool_rollback(self.cmd, client, "rg", "cluster", "nodepool1") + + mock_warning.assert_called_once() + warning = mock_warning.call_args.args[0] + self.assertIn("Rollback will not succeed until auto-upgrade is disabled", warning) + self.assertNotIn("nodeOSUpgradeChannel", warning) + self.assertNotIn("The orchestrator version rollback will proceed", warning) + mock_sdk_no_wait.assert_called_once() + if __name__ == "__main__": unittest.main()