Skip to content

Commit 6de5650

Browse files
author
indusridhar
committed
feat: Add nodepool rollback commands
* Add az aks nodepool get-rollback-versions to get available rollback versions * Add az aks nodepool rollback to rollback nodepool to N-1 configuration * Add tests and recording file for nodepool rollback functionality
1 parent 2274f53 commit 6de5650

File tree

8 files changed

+3336
-0
lines changed

8 files changed

+3336
-0
lines changed

src/aks-preview/HISTORY.rst

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ To release a new version, please select a new version number (usually plus 1 to
1111

1212
Pending
1313
+++++++
14+
* `az aks nodepool get-rollback-versions`: Add new command to get available rollback versions for a nodepool.
15+
* `az aks nodepool rollback`: Add new command to rollback a nodepool to a previously used configuration (N-1).
1416

1517
19.0.0b15
1618
+++++++

src/aks-preview/azext_aks_preview/_format.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,22 @@ def aks_agentpool_list_table_format(results):
153153
return [_aks_agentpool_table_format(r) for r in results]
154154

155155

156+
def aks_agentpool_rollback_versions_table_format(results):
157+
"""Format rollback versions for display with "-o table"."""
158+
if not results:
159+
return []
160+
161+
def _format_rollback_version(result):
162+
parsed = compile_jmes("""{
163+
kubernetesVersion: orchestrator_version,
164+
nodeImageVersion: node_image_version,
165+
timestamp: timestamp
166+
}""")
167+
return parsed.search(result, Options(dict_cls=OrderedDict))
168+
169+
return [_format_rollback_version(r) for r in results]
170+
171+
156172
def aks_list_table_format(results):
157173
""""Format a list of managed clusters as summary results for display with "-o table"."""
158174
return [_aks_table_format(r) for r in results]

src/aks-preview/azext_aks_preview/_help.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2453,6 +2453,53 @@
24532453
crafted: true
24542454
"""
24552455

2456+
helps['aks nodepool get-rollback-versions'] = """
2457+
type: command
2458+
short-summary: Get the available rollback versions for an agent pool of the managed Kubernetes cluster.
2459+
long-summary: |
2460+
Get the list of historically used Kubernetes and node image versions that can be used for rollback operations.
2461+
examples:
2462+
- name: Get the available rollback versions for an agent pool.
2463+
text: az aks nodepool get-rollback-versions --resource-group MyResourceGroup --cluster-name MyManagedCluster --nodepool-name MyNodePool
2464+
crafted: true
2465+
"""
2466+
2467+
helps['aks nodepool rollback'] = """
2468+
type: command
2469+
short-summary: Rollback an agent pool to a previously used configuration.
2470+
long-summary: |
2471+
Rollback an agent pool to a previously used Kubernetes version or node image version.
2472+
If no specific versions are provided, the nodepool will be rolled back to the most recently used configuration.
2473+
parameters:
2474+
- name: --kubernetes-version
2475+
type: string
2476+
short-summary: Target Kubernetes version for rollback.
2477+
long-summary: If not specified, uses the most recent available Kubernetes version.
2478+
- name: --node-image-version
2479+
type: string
2480+
short-summary: Target node image version for rollback.
2481+
long-summary: If not specified, uses the most recent available node image version.
2482+
- name: --aks-custom-headers
2483+
type: string
2484+
short-summary: Send custom headers. When specified, format should be Key1=Value1,Key2=Value2.
2485+
- name: --if-match
2486+
type: string
2487+
short-summary: The revision of the resource being updated. This should match the current revision.
2488+
- name: --if-none-match
2489+
type: string
2490+
short-summary: Set to '*' to allow a new resource to be created, but to prevent updating an existing resource.
2491+
examples:
2492+
- name: Rollback a nodepool to the most recent configuration.
2493+
text: az aks nodepool rollback --resource-group MyResourceGroup --cluster-name MyManagedCluster --nodepool-name MyNodePool
2494+
crafted: true
2495+
- name: Rollback a nodepool to a specific Kubernetes version.
2496+
text: az aks nodepool rollback --resource-group MyResourceGroup --cluster-name MyManagedCluster --nodepool-name MyNodePool --kubernetes-version 1.28.5
2497+
crafted: true
2498+
- name: Rollback a nodepool to specific Kubernetes and node image versions.
2499+
text: az aks nodepool rollback --resource-group MyResourceGroup --cluster-name MyManagedCluster --nodepool-name MyNodePool --kubernetes-version 1.28.5 --node-image-version AKSUbuntu-1804gen2containerd-2024.01.15
2500+
crafted: true
2501+
"""
2502+
24562503
helps['aks nodepool stop'] = """
24572504
type: command
24582505
short-summary: Stop running agent pool in the managed Kubernetes cluster.

src/aks-preview/azext_aks_preview/_params.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2182,6 +2182,22 @@ def load_arguments(self, _):
21822182
with self.argument_context("aks nodepool manual-scale delete") as c:
21832183
c.argument("current_vm_sizes", is_preview=True)
21842184

2185+
with self.argument_context("aks nodepool get-rollback-versions") as c:
2186+
pass # Uses common nodepool parameters
2187+
2188+
with self.argument_context("aks nodepool rollback") as c:
2189+
c.argument(
2190+
"kubernetes_version",
2191+
help="Target Kubernetes version for rollback. If not specified, uses the most recent available version."
2192+
)
2193+
c.argument(
2194+
"node_image_version",
2195+
help="Target node image version for rollback. If not specified, uses the most recent available version."
2196+
)
2197+
c.argument("aks_custom_headers", nargs="*")
2198+
c.argument("if_match")
2199+
c.argument("if_none_match")
2200+
21852201
with self.argument_context("aks machine") as c:
21862202
c.argument("cluster_name", help="The cluster name.")
21872203
c.argument(

src/aks-preview/azext_aks_preview/commands.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
aks_addon_show_table_format,
2727
aks_agentpool_list_table_format,
2828
aks_agentpool_show_table_format,
29+
aks_agentpool_rollback_versions_table_format,
2930
aks_machine_list_table_format,
3031
aks_machine_show_table_format,
3132
aks_operation_show_table_format,
@@ -274,6 +275,12 @@ def load_command_table(self, _):
274275
g.custom_command("update", "aks_agentpool_update", supports_no_wait=True)
275276
g.custom_command("delete", "aks_agentpool_delete", supports_no_wait=True)
276277
g.custom_command("get-upgrades", "aks_agentpool_get_upgrade_profile")
278+
g.custom_command(
279+
"get-rollback-versions",
280+
"aks_agentpool_get_rollback_versions",
281+
table_transformer=aks_agentpool_rollback_versions_table_format
282+
)
283+
g.custom_command("rollback", "aks_agentpool_rollback", supports_no_wait=True)
277284
g.custom_command("stop", "aks_agentpool_stop", supports_no_wait=True)
278285
g.custom_command("start", "aks_agentpool_start", supports_no_wait=True)
279286
g.custom_command(

src/aks-preview/azext_aks_preview/custom.py

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2215,6 +2215,65 @@ def aks_agentpool_get_upgrade_profile(cmd, # pylint: disable=unused-argument
22152215
return client.get_upgrade_profile(resource_group_name, cluster_name, nodepool_name)
22162216

22172217

2218+
def aks_agentpool_get_rollback_versions(cmd, # pylint: disable=unused-argument
2219+
client,
2220+
resource_group_name,
2221+
cluster_name,
2222+
nodepool_name):
2223+
"""Get rollback versions for a nodepool."""
2224+
upgrade_profile = client.get_upgrade_profile(resource_group_name, cluster_name, nodepool_name)
2225+
return upgrade_profile.recently_used_versions
2226+
2227+
2228+
def aks_agentpool_rollback(cmd, # pylint: disable=unused-argument
2229+
client,
2230+
resource_group_name,
2231+
cluster_name,
2232+
nodepool_name,
2233+
kubernetes_version=None,
2234+
node_image_version=None,
2235+
aks_custom_headers=None,
2236+
if_match=None,
2237+
if_none_match=None,
2238+
no_wait=False):
2239+
"""Rollback a nodepool to a previously used configuration."""
2240+
2241+
# Require at least one version to be specified
2242+
if not kubernetes_version and not node_image_version:
2243+
raise RequiredArgumentMissingError(
2244+
"Please specify at least one of --kubernetes-version or --node-image-version. "
2245+
"Use 'az aks nodepool get-rollback-versions' to see available rollback versions."
2246+
)
2247+
2248+
# Get the current agent pool
2249+
current_agentpool = client.get(resource_group_name, cluster_name, nodepool_name)
2250+
2251+
# Update the agent pool configuration with rollback versions
2252+
if kubernetes_version:
2253+
current_agentpool.orchestrator_version = kubernetes_version
2254+
if node_image_version:
2255+
current_agentpool.node_image_version = node_image_version
2256+
2257+
# Set custom headers if provided
2258+
headers = get_aks_custom_headers(aks_custom_headers)
2259+
if if_match:
2260+
headers['If-Match'] = if_match
2261+
if if_none_match:
2262+
headers['If-None-Match'] = if_none_match
2263+
2264+
# Perform the rollback by updating the agent pool
2265+
# Server-side will validate the versions
2266+
return sdk_no_wait(
2267+
no_wait,
2268+
client.begin_create_or_update,
2269+
resource_group_name,
2270+
cluster_name,
2271+
nodepool_name,
2272+
current_agentpool,
2273+
headers=headers if headers else None
2274+
)
2275+
2276+
22182277
def aks_agentpool_stop(cmd, # pylint: disable=unused-argument
22192278
client,
22202279
resource_group_name,

0 commit comments

Comments
 (0)