Skip to content

Commit 63db726

Browse files
[AKS] az aks nodepool add/update/upgrade: Add new parameter --undrainable-node-behavior to specify whether nodes can be cordoned during upgrade (#31495)
1 parent ef48169 commit 63db726

File tree

7 files changed

+1904
-1
lines changed

7 files changed

+1904
-1
lines changed

src/azure-cli/azure/cli/command_modules/acs/_help.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1635,6 +1635,9 @@
16351635
- name: --node-soak-duration
16361636
type: int
16371637
short-summary: The amount of time (in minutes) to wait after draining a node and before reimaging it and moving on to next node.
1638+
- name: --undrainable-node-behavior
1639+
type: string
1640+
short-summary: Define the behavior for undrainable nodes during upgrade. The value should be "Cordon" or "Schedule". The default value is "Schedule".
16381641
- name: --enable-encryption-at-host
16391642
type: bool
16401643
short-summary: Enable EncryptionAtHost, default value is false.
@@ -1793,6 +1796,9 @@
17931796
- name: --node-soak-duration
17941797
type: int
17951798
short-summary: The amount of time (in minutes) to wait after draining a node and before reimaging it and moving on to next node.
1799+
- name: --undrainable-node-behavior
1800+
type: string
1801+
short-summary: Define the behavior for undrainable nodes during upgrade. The value should be "Cordon" or "Schedule". The default value is "Schedule".
17961802
- name: --node-taints
17971803
type: string
17981804
short-summary: The node taints for the node pool. You can update the existing node taint of a nodepool or create a new node taint for a nodepool. Pass the empty string `""` to remove all taints.
@@ -1865,6 +1871,9 @@
18651871
- name: --node-soak-duration
18661872
type: int
18671873
short-summary: The amount of time (in minutes) to wait after draining a node and before reimaging it and moving on to next node.
1874+
- name: --undrainable-node-behavior
1875+
type: string
1876+
short-summary: Define the behavior for undrainable nodes during upgrade. The value should be "Cordon" or "Schedule". The default value is "Schedule".
18681877
- name: --snapshot-id
18691878
type: string
18701879
short-summary: The source snapshot id used to upgrade this nodepool.

src/azure-cli/azure/cli/command_modules/acs/_params.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -833,6 +833,7 @@ def load_arguments(self, _):
833833
c.argument('max_surge', validator=validate_max_surge)
834834
c.argument('drain_timeout', type=int)
835835
c.argument('node_soak_duration', type=int)
836+
c.argument("undrainable_node_behavior", default='Schedule')
836837
c.argument('mode', get_enum_type(node_mode_types))
837838
c.argument('scale_down_mode', arg_type=get_enum_type(scale_down_modes))
838839
c.argument('max_pods', type=int, options_list=['--max-pods', '-m'])
@@ -873,6 +874,7 @@ def load_arguments(self, _):
873874
c.argument('max_surge', validator=validate_max_surge)
874875
c.argument('drain_timeout', type=int)
875876
c.argument('node_soak_duration', type=int)
877+
c.argument("undrainable_node_behavior")
876878
c.argument('mode', get_enum_type(node_mode_types))
877879
c.argument('scale_down_mode', arg_type=get_enum_type(scale_down_modes))
878880
c.argument('allowed_host_ports', nargs='+', validator=validate_allowed_host_ports)
@@ -891,6 +893,7 @@ def load_arguments(self, _):
891893
c.argument('max_surge', validator=validate_max_surge)
892894
c.argument('drain_timeout', type=int)
893895
c.argument('node_soak_duration', type=int)
896+
c.argument("undrainable_node_behavior")
894897
c.argument('snapshot_id', validator=validate_snapshot_id)
895898
c.argument('yes', options_list=['--yes', '-y'], help='Do not prompt for confirmation.', action='store_true')
896899

src/azure-cli/azure/cli/command_modules/acs/agentpool_decorator.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1143,6 +1143,26 @@ def get_node_soak_duration(self):
11431143
# this parameter does not need validation
11441144
return node_soak_duration
11451145

1146+
def get_undrainable_node_behavior(self) -> str:
1147+
"""Obtain the value of undrainable_node_behavior.
1148+
1149+
:return: string
1150+
"""
1151+
# read the original value passed by the command
1152+
undrainable_node_behavior = self.raw_param.get("undrainable_node_behavior")
1153+
# In create mode, try to read the property value corresponding to the parameter from the `agentpool` object
1154+
if self.decorator_mode == DecoratorMode.CREATE:
1155+
if (
1156+
self.agentpool and
1157+
self.agentpool.upgrade_settings and
1158+
self.agentpool.upgrade_settings.undrainable_node_behavior is not None
1159+
):
1160+
undrainable_node_behavior = self.agentpool.upgrade_settings.undrainable_node_behavior
1161+
1162+
# this parameter does not need dynamic completion
1163+
# this parameter does not need validation
1164+
return undrainable_node_behavior
1165+
11461166
def get_vm_set_type(self) -> str:
11471167
"""Obtain the value of vm_set_type, default value is CONST_VIRTUAL_MACHINE_SCALE_SETS.
11481168
@@ -1821,6 +1841,10 @@ def set_up_upgrade_settings(self, agentpool: AgentPool) -> AgentPool:
18211841
if node_soak_duration:
18221842
upgrade_settings.node_soak_duration_in_minutes = node_soak_duration
18231843

1844+
undrainable_node_behavior = self.context.get_undrainable_node_behavior()
1845+
if undrainable_node_behavior:
1846+
upgrade_settings.undrainable_node_behavior = undrainable_node_behavior
1847+
18241848
agentpool.upgrade_settings = upgrade_settings
18251849
return agentpool
18261850

@@ -2210,6 +2234,11 @@ def update_upgrade_settings(self, agentpool: AgentPool) -> AgentPool:
22102234
upgrade_settings.node_soak_duration_in_minutes = node_soak_duration
22112235
agentpool.upgrade_settings = upgrade_settings
22122236

2237+
undrainable_node_behavior = self.context.get_undrainable_node_behavior()
2238+
if undrainable_node_behavior:
2239+
upgrade_settings.undrainable_node_behavior = undrainable_node_behavior
2240+
agentpool.upgrade_settings = upgrade_settings
2241+
22132242
return agentpool
22142243

22152244
def update_vm_properties(self, agentpool: AgentPool) -> AgentPool:

src/azure-cli/azure/cli/command_modules/acs/custom.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2410,6 +2410,7 @@ def aks_agentpool_add(
24102410
max_surge=None,
24112411
drain_timeout=None,
24122412
node_soak_duration=None,
2413+
undrainable_node_behavior=None,
24132414
mode=CONST_NODEPOOL_MODE_USER,
24142415
scale_down_mode=CONST_SCALE_DOWN_MODE_DELETE,
24152416
max_pods=None,
@@ -2478,6 +2479,7 @@ def aks_agentpool_update(
24782479
max_surge=None,
24792480
drain_timeout=None,
24802481
node_soak_duration=None,
2482+
undrainable_node_behavior=None,
24812483
mode=None,
24822484
scale_down_mode=None,
24832485
no_wait=False,
@@ -2530,6 +2532,7 @@ def aks_agentpool_upgrade(cmd, client, resource_group_name, cluster_name,
25302532
max_surge=None,
25312533
drain_timeout=None,
25322534
node_soak_duration=None,
2535+
undrainable_node_behavior=None,
25332536
snapshot_id=None,
25342537
no_wait=False,
25352538
aks_custom_headers=None,
@@ -2549,7 +2552,7 @@ def aks_agentpool_upgrade(cmd, client, resource_group_name, cluster_name,
25492552
)
25502553

25512554
# Note: we exclude this option because node image upgrade can't accept nodepool put fields like max surge
2552-
if (max_surge or drain_timeout or node_soak_duration) and node_image_only:
2555+
if (max_surge or drain_timeout or node_soak_duration or undrainable_node_behavior) and node_image_only:
25532556
raise MutuallyExclusiveArgumentError(
25542557
'Conflicting flags. Unable to specify max-surge/drain-timeout/node-soak-duration with node-image-only.'
25552558
'If you want to use max-surge/drain-timeout/node-soak-duration with a node image upgrade, please first '
@@ -2604,6 +2607,8 @@ def aks_agentpool_upgrade(cmd, client, resource_group_name, cluster_name,
26042607
instance.upgrade_settings.drain_timeout_in_minutes = drain_timeout
26052608
if isinstance(node_soak_duration, int) and node_soak_duration >= 0:
26062609
instance.upgrade_settings.node_soak_duration_in_minutes = node_soak_duration
2610+
if undrainable_node_behavior:
2611+
instance.upgrade_settings.undrainable_node_behavior = undrainable_node_behavior
26072612

26082613
# custom headers
26092614
aks_custom_headers = extract_comma_separated_string(

src/azure-cli/azure/cli/command_modules/acs/linter_exclusions.yml

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,4 +200,17 @@ aks nodepool add:
200200
disable_windows_outbound_nat:
201201
rule_exclusions:
202202
- option_length_too_long
203+
undrainable_node_behavior:
204+
rule_exclusions:
205+
- option_length_too_long
206+
aks nodepool update:
207+
parameters:
208+
undrainable_node_behavior:
209+
rule_exclusions:
210+
- option_length_too_long
211+
aks nodepool upgrade:
212+
parameters:
213+
undrainable_node_behavior:
214+
rule_exclusions:
215+
- option_length_too_long
203216
...

0 commit comments

Comments
 (0)