@@ -21592,5 +21592,215 @@ def test_aks_create_and_update_with_gateway_api_and_azureservicemesh(
2159221592 # TODO (indusridhar): Add tests for `test_aks_nodepool_get_rollback_versions` and `test_aks_nodepool_rollback`
2159321593 # after AKS RP Jan 2026 release is complete and recently_used_versions field is populated in upgrade profile API
2159421594
21595+ @AllowLargeResponse()
21596+ @AKSCustomResourceGroupPreparer(
21597+ random_name_length=17, name_prefix="clitest", location="westus2"
21598+ )
21599+ def test_aks_nodepool_get_rollback_versions(self, resource_group, resource_group_location):
21600+ """Test az aks nodepool get-rollback-versions command"""
21601+ aks_name = self.create_random_name("cliakstest", 16)
21602+ node_pool_name = self.create_random_name("c", 6)
21603+
21604+ self.kwargs.update(
21605+ {
21606+ "resource_group": resource_group,
21607+ "name": aks_name,
21608+ "node_pool_name": node_pool_name,
21609+ "ssh_key_value": self.generate_ssh_keys(),
21610+ }
21611+ )
21612+
21613+ # Create cluster with default Kubernetes version
21614+ create_cmd = (
21615+ "aks create --resource-group={resource_group} --name={name} "
21616+ "--nodepool-name {node_pool_name} -c 1 "
21617+ "--ssh-key-value={ssh_key_value}"
21618+ )
21619+ self.cmd(
21620+ create_cmd,
21621+ checks=[
21622+ self.check("provisioningState", "Succeeded"),
21623+ ],
21624+ )
21625+
21626+ # Get the nodepool details before upgrade to capture the current versions
21627+ get_nodepool_cmd = (
21628+ "aks nodepool show "
21629+ "--resource-group={resource_group} "
21630+ "--cluster-name={name} "
21631+ "--name={node_pool_name}"
21632+ )
21633+ nodepool_before_upgrade = self.cmd(get_nodepool_cmd).get_output_in_json()
21634+ original_k8s_version = nodepool_before_upgrade["currentOrchestratorVersion"]
21635+ original_node_image_version = nodepool_before_upgrade["nodeImageVersion"]
21636+
21637+ # Get valid upgrade versions from the API
21638+ get_upgrades_cmd = (
21639+ "aks nodepool get-upgrades "
21640+ "--resource-group={resource_group} "
21641+ "--cluster-name={name} "
21642+ "--name={node_pool_name} "
21643+ "-o json"
21644+ )
21645+ upgrades = self.cmd(get_upgrades_cmd).get_output_in_json()
21646+
21647+ # Find a valid upgrade version from the available upgrades
21648+ upgrade_version = None
21649+ if upgrades and 'componentsByReleases' in upgrades and len(upgrades['componentsByReleases']) > 0:
21650+ # Get the first available kubernetes version from upgrades
21651+ first_release = upgrades['componentsByReleases'][0]
21652+ if 'kubernetesVersion' in first_release:
21653+ upgrade_version = first_release['kubernetesVersion']
21654+
21655+ # Skip test if no upgrade version is available
21656+ if not upgrade_version:
21657+ self.skipTest("No upgrade version available for testing")
21658+
21659+ self.kwargs.update({"upgrade_version": upgrade_version})
21660+
21661+ # Upgrade the nodepool to populate recently used versions
21662+ upgrade_cmd = (
21663+ "aks nodepool upgrade "
21664+ "--resource-group={resource_group} "
21665+ "--cluster-name={name} "
21666+ "--name={node_pool_name} "
21667+ "--kubernetes-version={upgrade_version} "
21668+ "--yes"
21669+ )
21670+ self.cmd(
21671+ upgrade_cmd,
21672+ checks=[
21673+ self.check("provisioningState", "Succeeded"),
21674+ ],
21675+ )
21676+
21677+ # Get rollback versions - should now have entries after the upgrade
21678+ get_rollback_cmd = (
21679+ "aks nodepool get-rollback-versions "
21680+ "--resource-group={resource_group} "
21681+ "--cluster-name={name} "
21682+ "--nodepool-name={node_pool_name}"
21683+ )
21684+ rollback_versions = self.cmd(get_rollback_cmd).get_output_in_json()
21685+
21686+ # Verify that we have at least one rollback version available
21687+ assert len(rollback_versions) > 0, "Expected rollback versions after upgrade but found none"
21688+
21689+ # Verify that the rollback versions contain the original versions from before the upgrade
21690+ assert rollback_versions[0]["kubernetesVersion"] == original_k8s_version
21691+ assert rollback_versions[0]["nodeImageVersion"] == original_node_image_version
21692+
21693+ # Cleanup
21694+ self.cmd(
21695+ "aks delete -g {resource_group} -n {name} --yes --no-wait",
21696+ checks=[self.is_empty()],
21697+ )
21698+
21699+ @AllowLargeResponse()
21700+ @AKSCustomResourceGroupPreparer(
21701+ random_name_length=17, name_prefix="clitest", location="westus2"
21702+ )
21703+ def test_aks_nodepool_rollback(self, resource_group, resource_group_location):
21704+ """Test az aks nodepool rollback command with various scenarios"""
21705+ aks_name = self.create_random_name("cliakstest", 16)
21706+ node_pool_name = self.create_random_name("c", 6)
21707+
21708+ self.kwargs.update(
21709+ {
21710+ "resource_group": resource_group,
21711+ "name": aks_name,
21712+ "node_pool_name": node_pool_name,
21713+ "ssh_key_value": self.generate_ssh_keys(),
21714+ }
21715+ )
21716+
21717+ # Create cluster with default Kubernetes version
21718+ create_cmd = (
21719+ "aks create --resource-group={resource_group} --name={name} "
21720+ "--nodepool-name {node_pool_name} -c 1 "
21721+ "--ssh-key-value={ssh_key_value}"
21722+ )
21723+ self.cmd(
21724+ create_cmd,
21725+ checks=[
21726+ self.check("provisioningState", "Succeeded"),
21727+ ],
21728+ )
21729+
21730+ # Get the nodepool details before upgrade to capture the current versions
21731+ get_nodepool_cmd = (
21732+ "aks nodepool show "
21733+ "--resource-group={resource_group} "
21734+ "--cluster-name={name} "
21735+ "--name={node_pool_name}"
21736+ )
21737+ nodepool_before_upgrade = self.cmd(get_nodepool_cmd).get_output_in_json()
21738+ original_k8s_version = nodepool_before_upgrade["currentOrchestratorVersion"]
21739+ original_node_image_version = nodepool_before_upgrade["nodeImageVersion"]
21740+
21741+ # Get valid upgrade versions from the API
21742+ get_upgrades_cmd = (
21743+ "aks nodepool get-upgrades "
21744+ "--resource-group={resource_group} "
21745+ "--cluster-name={name} "
21746+ "--name={node_pool_name} "
21747+ "-o json"
21748+ )
21749+ upgrades = self.cmd(get_upgrades_cmd).get_output_in_json()
21750+
21751+ # Find a valid upgrade version from the available upgrades
21752+ upgrade_version = None
21753+ if upgrades and 'componentsByReleases' in upgrades and len(upgrades['componentsByReleases']) > 0:
21754+ # Get the first available kubernetes version from upgrades
21755+ first_release = upgrades['componentsByReleases'][0]
21756+ if 'kubernetesVersion' in first_release:
21757+ upgrade_version = first_release['kubernetesVersion']
21758+
21759+ # Skip test if no upgrade version is available
21760+ if not upgrade_version:
21761+ self.skipTest("No upgrade version available for testing")
21762+
21763+ self.kwargs.update({"upgrade_version": upgrade_version})
21764+
21765+ # Upgrade the nodepool to create rollback history
21766+ upgrade_cmd = (
21767+ "aks nodepool upgrade "
21768+ "--resource-group={resource_group} "
21769+ "--cluster-name={name} "
21770+ "--name={node_pool_name} "
21771+ "--kubernetes-version={upgrade_version} "
21772+ "--yes"
21773+ )
21774+ self.cmd(
21775+ upgrade_cmd,
21776+ checks=[
21777+ self.check("provisioningState", "Succeeded"),
21778+ ],
21779+ )
21780+
21781+ # Rollback to most recent version (N-1)
21782+ rollback_cmd = (
21783+ "aks nodepool rollback "
21784+ "--resource-group={resource_group} "
21785+ "--cluster-name={name} "
21786+ "--name={node_pool_name}"
21787+ )
21788+ rollback_result = self.cmd(
21789+ rollback_cmd,
21790+ checks=[
21791+ self.check("provisioningState", "Succeeded"),
21792+ ],
21793+ ).get_output_in_json()
21794+
21795+ # Verify that both versions were rolled back to the most recent (original) versions
21796+ assert rollback_result["currentOrchestratorVersion"] == original_k8s_version
21797+ assert rollback_result["nodeImageVersion"] == original_node_image_version
21798+
21799+ # Cleanup
21800+ self.cmd(
21801+ "aks delete -g {resource_group} -n {name} --yes --no-wait",
21802+ checks=[self.is_empty()],
21803+ )
21804+
2159521805 # TODO (zheweihu): add test `test_aks_create_and_update_with_gateway_api_without_azureservicemesh`
2159621806 # once https://msazure.visualstudio.com/CloudNativeCompute/_git/aks-rp/pullrequest/14404771 is rolled out
0 commit comments