Skip to content

Commit e47815a

Browse files
committed
Add new --node-provisioning-default-pools parameter
1 parent 2ab972b commit e47815a

File tree

5 files changed

+202
-2
lines changed

5 files changed

+202
-2
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+
* Add `--node-provisioning-default-pools` to the `az aks update` command.
15+
* Add `--node-provisioning-default-pools` to the `az aks create` command.
1416

1517
18.0.0b11
1618
+++++++

src/aks-preview/azext_aks_preview/_consts.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,10 @@
315315
CONST_NODE_PROVISIONING_MODE_MANUAL = "Manual"
316316
CONST_NODE_PROVISIONING_MODE_AUTO = "Auto"
317317

318+
# Node Provisioning Default Pools Consts
319+
CONST_NODE_PROVISIONING_DEFAULT_POOLS_AUTO = "Auto"
320+
CONST_NODE_PROVISIONING_DEFAULT_POOLS_NONE = "None"
321+
318322
# Node Provisioning State Consts
319323
CONST_NODE_PROVISIONING_STATE_SUCCEEDED = "Succeeded"
320324

src/aks-preview/azext_aks_preview/_params.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,6 +126,8 @@
126126
CONST_WORKLOAD_RUNTIME_WASM_WASI,
127127
CONST_NODE_PROVISIONING_MODE_MANUAL,
128128
CONST_NODE_PROVISIONING_MODE_AUTO,
129+
CONST_NODE_PROVISIONING_DEFAULT_POOLS_AUTO,
130+
CONST_NODE_PROVISIONING_DEFAULT_POOLS_NONE,
129131
CONST_MANAGED_CLUSTER_SKU_NAME_BASE,
130132
CONST_MANAGED_CLUSTER_SKU_NAME_AUTOMATIC,
131133
CONST_SSH_ACCESS_LOCALUSER,
@@ -450,12 +452,16 @@
450452
CONST_EPHEMERAL_NVME_PERF_TIER_STANDARD,
451453
]
452454

453-
# consts for guardrails level
454455
node_provisioning_modes = [
455456
CONST_NODE_PROVISIONING_MODE_MANUAL,
456457
CONST_NODE_PROVISIONING_MODE_AUTO,
457458
]
458459

460+
node_provisioning_default_pools = [
461+
CONST_NODE_PROVISIONING_DEFAULT_POOLS_AUTO,
462+
CONST_NODE_PROVISIONING_DEFAULT_POOLS_NONE,
463+
]
464+
459465
ssh_accesses = [
460466
CONST_SSH_ACCESS_LOCALUSER,
461467
CONST_SSH_ACCESS_DISABLED,
@@ -1004,6 +1010,20 @@ def load_arguments(self, _):
10041010
'For more information on "Auto" mode see aka.ms/aks/nap.'
10051011
)
10061012
)
1013+
c.argument(
1014+
"node_provisioning_default_pools",
1015+
is_preview=True,
1016+
arg_type=get_enum_type(node_provisioning_default_pools),
1017+
help=(
1018+
'The set of default Karpenter NodePools configured for node provisioning. '
1019+
'Valid values are "Auto" and "None". Auto: A standard set of Karpenter NodePools are provisioned. '
1020+
'None: No Karpenter NodePools are provisioned. '
1021+
'WARNING: Changing this from Auto to None on an existing cluster will cause the default Karpenter '
1022+
'NodePools to be deleted, which will in turn drain and delete the nodes associated with those pools. '
1023+
'It is strongly recommended to not do this unless there are idle nodes ready to take the pods evicted '
1024+
'by that action.'
1025+
)
1026+
)
10071027
# in creation scenario, use "localuser" as default
10081028
c.argument(
10091029
'ssh_access',
@@ -1443,6 +1463,20 @@ def load_arguments(self, _):
14431463
'For more information on "Auto" mode see aka.ms/aks/nap.'
14441464
)
14451465
)
1466+
c.argument(
1467+
"node_provisioning_default_pools",
1468+
is_preview=True,
1469+
arg_type=get_enum_type(node_provisioning_default_pools),
1470+
help=(
1471+
'The set of default Karpenter NodePools configured for node provisioning. '
1472+
'Valid values are "Auto" and "None". Auto: A standard set of Karpenter NodePools are provisioned. '
1473+
'None: No Karpenter NodePools are provisioned. '
1474+
'WARNING: Changing this from Auto to None on an existing cluster will cause the default Karpenter '
1475+
'NodePools to be deleted, which will in turn drain and delete the nodes associated with those pools. '
1476+
'It is strongly recommended to not do this unless there are idle nodes ready to take the pods evicted '
1477+
'by that action.'
1478+
)
1479+
)
14461480
c.argument('enable_static_egress_gateway', is_preview=True, action='store_true')
14471481
c.argument('disable_static_egress_gateway', is_preview=True, action='store_true')
14481482
c.argument("enable_imds_restriction", action="store_true", is_preview=True)

src/aks-preview/azext_aks_preview/managed_cluster_decorator.py

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2734,6 +2734,11 @@ def get_node_provisioning_mode(self) -> Union[str, None]:
27342734
"""
27352735
return self.raw_param.get("node_provisioning_mode")
27362736

2737+
def get_node_provisioning_default_pools(self) -> Union[str, None]:
2738+
"""Obtain the value of node_provisioning_default_pools.
2739+
"""
2740+
return self.raw_param.get("node_provisioning_default_pools")
2741+
27372742
def get_ai_toolchain_operator(self, enable_validation: bool = False) -> bool:
27382743
"""Internal function to obtain the value of enable_ai_toolchain_operator.
27392744
@@ -3507,10 +3512,26 @@ def set_up_node_provisioning_mode(self, mc: ManagedCluster) -> ManagedCluster:
35073512

35083513
return mc
35093514

3515+
def set_up_node_provisioning_default_pools(self, mc: ManagedCluster) -> ManagedCluster:
3516+
self._ensure_mc(mc)
3517+
3518+
default_pools = self.context.get_node_provisioning_default_pools()
3519+
if default_pools is not None:
3520+
if mc.node_provisioning_profile is None:
3521+
mc.node_provisioning_profile = (
3522+
self.models.ManagedClusterNodeProvisioningProfile() # pylint: disable=no-member
3523+
)
3524+
3525+
# set default_node_pools
3526+
mc.node_provisioning_profile.default_node_pools = default_pools
3527+
3528+
return mc
3529+
35103530
def set_up_node_provisioning_profile(self, mc: ManagedCluster) -> ManagedCluster:
35113531
self._ensure_mc(mc)
35123532

35133533
mc = self.set_up_node_provisioning_mode(mc)
3534+
mc = self.set_up_node_provisioning_default_pools(mc)
35143535

35153536
return mc
35163537

@@ -5015,6 +5036,21 @@ def update_node_provisioning_mode(self, mc: ManagedCluster) -> ManagedCluster:
50155036

50165037
return mc
50175038

5039+
def update_node_provisioning_default_pools(self, mc: ManagedCluster) -> ManagedCluster:
5040+
self._ensure_mc(mc)
5041+
5042+
default_pools = self.context.get_node_provisioning_default_pools()
5043+
if default_pools is not None:
5044+
if mc.node_provisioning_profile is None:
5045+
mc.node_provisioning_profile = (
5046+
self.models.ManagedClusterNodeProvisioningProfile() # pylint: disable=no-member
5047+
)
5048+
5049+
# set default_node_pools
5050+
mc.node_provisioning_profile.default_node_pools = default_pools
5051+
5052+
return mc
5053+
50185054
# pylint: disable=too-many-branches
50195055
def update_app_routing_profile(self, mc: ManagedCluster) -> ManagedCluster:
50205056
"""Update app routing profile for the ManagedCluster object.
@@ -5177,6 +5213,7 @@ def update_node_provisioning_profile(self, mc: ManagedCluster) -> ManagedCluster
51775213
self._ensure_mc(mc)
51785214

51795215
mc = self.update_node_provisioning_mode(mc)
5216+
mc = self.update_node_provisioning_default_pools(mc)
51805217

51815218
return mc
51825219

src/aks-preview/azext_aks_preview/tests/latest/test_managed_cluster_decorator.py

Lines changed: 124 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5424,6 +5424,68 @@ def test_set_up_sku(self):
54245424
)
54255425
self.assertEqual(dec_mc_2, expect_mc_2)
54265426

5427+
def test_set_up_node_provisioning_profile(self):
5428+
dec_0 = AKSPreviewManagedClusterCreateDecorator(
5429+
self.cmd,
5430+
self.client,
5431+
{},
5432+
CUSTOM_MGMT_AKS_PREVIEW,
5433+
)
5434+
# Not specified case
5435+
mc_0 = self.models.ManagedCluster(location="test_location")
5436+
dec_0.context.attach_mc(mc_0)
5437+
dec_mc_0 = dec_0.set_up_node_provisioning_profile(mc_0)
5438+
ground_truth_mc_0 = self.models.ManagedCluster(location="test_location")
5439+
self.assertEqual(dec_mc_0, ground_truth_mc_0)
5440+
5441+
# Set Mode to Auto
5442+
dec_1 = AKSPreviewManagedClusterCreateDecorator(
5443+
self.cmd,
5444+
self.client,
5445+
{
5446+
"node_provisioning_mode": "Auto",
5447+
},
5448+
CUSTOM_MGMT_AKS_PREVIEW,
5449+
)
5450+
mc_1 = self.models.ManagedCluster(
5451+
location="test_location",
5452+
)
5453+
dec_1.context.attach_mc(mc_1)
5454+
dec_mc_1 = dec_1.set_up_node_provisioning_profile(mc_1)
5455+
ground_truth_mc_1 = self.models.ManagedCluster(
5456+
location="test_location",
5457+
node_provisioning_profile=self.models.ManagedClusterNodeProvisioningProfile(
5458+
mode="Auto",
5459+
),
5460+
)
5461+
self.assertEqual(dec_mc_1, ground_truth_mc_1)
5462+
5463+
# Set Mode to Auto and DefaultPools to None
5464+
dec_2 = AKSPreviewManagedClusterCreateDecorator(
5465+
self.cmd,
5466+
self.client,
5467+
{
5468+
"node_provisioning_mode": "Auto",
5469+
"node_provisioning_default_pools": "None",
5470+
5471+
},
5472+
CUSTOM_MGMT_AKS_PREVIEW,
5473+
)
5474+
mc_2 = self.models.ManagedCluster(
5475+
location="test_location",
5476+
)
5477+
dec_2.context.attach_mc(mc_2)
5478+
dec_mc_2 = dec_2.set_up_node_provisioning_profile(mc_2)
5479+
ground_truth_mc_2 = self.models.ManagedCluster(
5480+
location="test_location",
5481+
node_provisioning_profile=self.models.ManagedClusterNodeProvisioningProfile(
5482+
mode="Auto",
5483+
default_node_pools="None",
5484+
),
5485+
)
5486+
self.assertEqual(dec_mc_2, ground_truth_mc_2)
5487+
5488+
54275489
class AKSPreviewManagedClusterUpdateDecoratorTestCase(unittest.TestCase):
54285490
def setUp(self):
54295491
# manually register CUSTOM_MGMT_AKS_PREVIEW
@@ -9213,5 +9275,66 @@ def test_enable_retina_network_flow_logs(self):
92139275
):
92149276
dec_6.set_up_addon_profiles(mc_6)
92159277

9278+
def test_update_node_provisioning_profile(self):
9279+
dec_0 = AKSPreviewManagedClusterUpdateDecorator(
9280+
self.cmd,
9281+
self.client,
9282+
{},
9283+
CUSTOM_MGMT_AKS_PREVIEW,
9284+
)
9285+
# Not specified case
9286+
mc_0 = self.models.ManagedCluster(location="test_location")
9287+
dec_0.context.attach_mc(mc_0)
9288+
dec_mc_0 = dec_0.update_node_provisioning_profile(mc_0)
9289+
ground_truth_mc_0 = self.models.ManagedCluster(location="test_location")
9290+
self.assertEqual(dec_mc_0, ground_truth_mc_0)
9291+
9292+
# Set Mode to Auto
9293+
dec_1 = AKSPreviewManagedClusterUpdateDecorator(
9294+
self.cmd,
9295+
self.client,
9296+
{
9297+
"node_provisioning_mode": "Auto",
9298+
},
9299+
CUSTOM_MGMT_AKS_PREVIEW,
9300+
)
9301+
mc_1 = self.models.ManagedCluster(
9302+
location="test_location",
9303+
)
9304+
dec_1.context.attach_mc(mc_1)
9305+
dec_mc_1 = dec_1.update_node_provisioning_profile(mc_1)
9306+
ground_truth_mc_1 = self.models.ManagedCluster(
9307+
location="test_location",
9308+
node_provisioning_profile=self.models.ManagedClusterNodeProvisioningProfile(
9309+
mode="Auto",
9310+
),
9311+
)
9312+
self.assertEqual(dec_mc_1, ground_truth_mc_1)
9313+
9314+
# Set Mode to Auto and DefaultPools to None
9315+
dec_2 = AKSPreviewManagedClusterUpdateDecorator(
9316+
self.cmd,
9317+
self.client,
9318+
{
9319+
"node_provisioning_mode": "Auto",
9320+
"node_provisioning_default_pools": "None",
9321+
9322+
},
9323+
CUSTOM_MGMT_AKS_PREVIEW,
9324+
)
9325+
mc_2 = self.models.ManagedCluster(
9326+
location="test_location",
9327+
)
9328+
dec_2.context.attach_mc(mc_2)
9329+
dec_mc_2 = dec_2.update_node_provisioning_profile(mc_2)
9330+
ground_truth_mc_2 = self.models.ManagedCluster(
9331+
location="test_location",
9332+
node_provisioning_profile=self.models.ManagedClusterNodeProvisioningProfile(
9333+
mode="Auto",
9334+
default_node_pools="None",
9335+
),
9336+
)
9337+
self.assertEqual(dec_mc_2, ground_truth_mc_2)
9338+
92169339
if __name__ == "__main__":
9217-
unittest.main()
9340+
unittest.main()

0 commit comments

Comments
 (0)