Skip to content

Commit a5ef7ec

Browse files
committed
Add AI Toolchain Operator (Kaito) to AKS CLI
Signed-off-by: Heba <[email protected]>
1 parent a4c9d4d commit a5ef7ec

File tree

9 files changed

+1000
-0
lines changed

9 files changed

+1000
-0
lines changed

linter_exclusions.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,9 @@ aks create:
285285
azure_keyvault_kms_key_vault_network_access:
286286
rule_exclusions:
287287
- option_length_too_long
288+
enable_ai_toolchain_operator:
289+
rule_exclusions:
290+
- option_length_too_long
288291
azure_keyvault_kms_key_vault_resource_id:
289292
rule_exclusions:
290293
- option_length_too_long
@@ -362,6 +365,12 @@ aks update:
362365
azure_keyvault_kms_key_vault_network_access:
363366
rule_exclusions:
364367
- option_length_too_long
368+
enable_ai_toolchain_operator:
369+
rule_exclusions:
370+
- option_length_too_long
371+
disable_ai_toolchain_operator:
372+
rule_exclusions:
373+
- option_length_too_long
365374
azure_keyvault_kms_key_vault_resource_id:
366375
rule_exclusions:
367376
- option_length_too_long

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,6 +581,9 @@
581581
short-summary: Configure artifact source when bootstraping the cluster.
582582
long-summary: |
583583
The artifacts include the addon image. Use "Direct" to download artifacts from MCR, "Cache" to downalod artifacts from Azure Container Registry.
584+
- name: --enable-ai-toolchain-operator
585+
type: bool
586+
short-summary: Enable AI toolchain operator to the cluster.
584587
- name: --bootstrap-container-registry-resource-id
585588
type: string
586589
short-summary: Configure container registry resource ID. Must use "Cache" as bootstrap artifact source.
@@ -1033,6 +1036,12 @@
10331036
short-summary: Configure artifact source when bootstraping the cluster.
10341037
long-summary: |
10351038
The artifacts include the addon image. Use "Direct" to download artifacts from MCR, "Cache" to downalod artifacts from Azure Container Registry.
1039+
- name: --enable-ai-toolchain-operator
1040+
type: bool
1041+
short-summary: Enable AI toolchain operator to the cluster
1042+
- name: --disable-ai-toolchain-operator
1043+
type: bool
1044+
short-summary: Disable AI toolchain operator.
10361045
- name: --bootstrap-container-registry-resource-id
10371046
type: string
10381047
short-summary: Configure container registry resource ID. Must use "Cache" as bootstrap artifact source.

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@ def load_arguments(self, _):
429429
c.argument('rotation_poll_interval')
430430
c.argument('enable_sgxquotehelper', action='store_true')
431431
c.argument('enable_app_routing', action="store_true")
432+
c.argument('enable_ai_toolchain_operator', is_preview=True, action='store_true')
432433
c.argument(
433434
"app_routing_default_nginx_controller",
434435
arg_type=get_enum_type(app_routing_nginx_configs),
@@ -623,6 +624,8 @@ def load_arguments(self, _):
623624
# addons
624625
c.argument('enable_secret_rotation', action='store_true')
625626
c.argument('disable_secret_rotation', action='store_true', validator=validate_keyvault_secrets_provider_disable_and_enable_parameters)
627+
c.argument('enable_ai_toolchain_operator', is_preview=True, action='store_true')
628+
c.argument('disable_ai_toolchain_operator', is_preview=True, action='store_true')
626629
c.argument('rotation_poll_interval')
627630
# nodepool paramerters
628631
c.argument('enable_cluster_autoscaler', options_list=[

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -601,6 +601,7 @@ def aks_create(
601601
enable_secret_rotation=False,
602602
rotation_poll_interval=None,
603603
enable_app_routing=False,
604+
enable_ai_toolchain_operator=False,
604605
app_routing_default_nginx_controller=None,
605606
# nodepool paramerters
606607
nodepool_name="nodepool1",
@@ -798,6 +799,8 @@ def aks_update(
798799
# addons
799800
enable_secret_rotation=False,
800801
disable_secret_rotation=False,
802+
enable_ai_toolchain_operator=False,
803+
disable_ai_toolchain_operator=False,
801804
rotation_poll_interval=None,
802805
# nodepool paramerters
803806
enable_cluster_autoscaler=False,

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

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5397,6 +5397,32 @@ def get_upgrade_override_until(self) -> Union[str, None]:
53975397
# this parameter does not need validation
53985398
return self.raw_param.get("upgrade_override_until")
53995399

5400+
def get_ai_toolchain_operator(self, enable_validation: bool = False) -> bool:
5401+
"""Internal function to obtain the value of enable_ai_toolchain_operator.
5402+
When enabled, if both enable_ai_toolchain_operator and
5403+
disable_ai_toolchain_operator are specified, raise
5404+
a MutuallyExclusiveArgumentError.
5405+
:return: bool
5406+
"""
5407+
enable_ai_toolchain_operator = self.raw_param.get("enable_ai_toolchain_operator")
5408+
# This parameter does not need dynamic completion.
5409+
if enable_validation:
5410+
if enable_ai_toolchain_operator and self.get_disable_ai_toolchain_operator():
5411+
raise MutuallyExclusiveArgumentError(
5412+
"Cannot specify --enable-ai-toolchain-operator and "
5413+
"--disable-ai-toolchain-operator at the same time. "
5414+
)
5415+
5416+
return enable_ai_toolchain_operator
5417+
5418+
def get_disable_ai_toolchain_operator(self) -> bool:
5419+
"""Obtain the value of disable_ai_toolchain_operator.
5420+
:return: bool
5421+
"""
5422+
# Note: No need to check for mutually exclusive parameter with enable-ai-toolchain-operator here
5423+
# because it's already checked in get_ai_toolchain_operator
5424+
return self.raw_param.get("disable_ai_toolchain_operator")
5425+
54005426
def _get_enable_cost_analysis(self, enable_validation: bool = False) -> bool:
54015427
"""Internal function to obtain the value of enable_cost_analysis.
54025428
When enabled, if both enable_cost_analysis and disable_cost_analysis are
@@ -6718,6 +6744,18 @@ def set_up_ingress_web_app_routing(self, mc: ManagedCluster) -> ManagedCluster:
67186744

67196745
return mc
67206746

6747+
def set_up_ai_toolchain_operator(self, mc: ManagedCluster) -> ManagedCluster:
6748+
self._ensure_mc(mc)
6749+
6750+
if self.context.get_ai_toolchain_operator(enable_validation=True):
6751+
if mc.ai_toolchain_operator_profile is None:
6752+
mc.ai_toolchain_operator_profile = self.models.ManagedClusterAIToolchainOperatorProfile() # pylint: disable=no-member
6753+
# set enabled
6754+
mc.ai_toolchain_operator_profile.enabled = True
6755+
6756+
# Default is disabled so no need to worry about that here
6757+
return mc
6758+
67216759
def set_up_cost_analysis(self, mc: ManagedCluster) -> ManagedCluster:
67226760
self._ensure_mc(mc)
67236761

@@ -6854,6 +6892,8 @@ def construct_mc_profile_default(self, bypass_restore_defaults: bool = False) ->
68546892
mc = self.set_up_metrics_profile(mc)
68556893
# set up node resource group profile
68566894
mc = self.set_up_node_resource_group_profile(mc)
6895+
# set up AI toolchain operator
6896+
mc = self.set_up_ai_toolchain_operator(mc)
68576897
# set up bootstrap profile
68586898
mc = self.set_up_bootstrap_profile(mc)
68596899

@@ -8631,6 +8671,23 @@ def update_azure_container_storage(self, mc: ManagedCluster) -> ManagedCluster:
86318671

86328672
return mc
86338673

8674+
def update_ai_toolchain_operator(self, mc: ManagedCluster) -> ManagedCluster:
8675+
"""Updates the aiToolchainOperatorProfile field of the managed cluster
8676+
:return: the ManagedCluster object
8677+
"""
8678+
8679+
if self.context.get_ai_toolchain_operator(enable_validation=True):
8680+
if mc.ai_toolchain_operator_profile is None:
8681+
mc.ai_toolchain_operator_profile = self.models.ManagedClusterAIToolchainOperatorProfile() # pylint: disable=no-member
8682+
mc.ai_toolchain_operator_profile.enabled = True
8683+
8684+
if self.context.get_disable_ai_toolchain_operator():
8685+
if mc.ai_toolchain_operator_profile is None:
8686+
mc.ai_toolchain_operator_profile = self.models.ManagedClusterAIToolchainOperatorProfile() # pylint: disable=no-member
8687+
mc.ai_toolchain_operator_profile.enabled = False
8688+
8689+
return mc
8690+
86348691
def update_cost_analysis(self, mc: ManagedCluster) -> ManagedCluster:
86358692
self._ensure_mc(mc)
86368693

@@ -8763,6 +8820,8 @@ def update_mc_profile_default(self) -> ManagedCluster:
87638820
mc = self.update_metrics_profile(mc)
87648821
# update node resource group profile
87658822
mc = self.update_node_resource_group_profile(mc)
8823+
# update AI toolchain operator
8824+
mc = self.update_ai_toolchain_operator(mc)
87668825
# update bootstrap profile
87678826
mc = self.update_bootstrap_profile(mc)
87688827
# update kubernetes version and orchestrator version
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
interactions:
2+
- request:
3+
body: null
4+
headers:
5+
Accept:
6+
- application/json
7+
Accept-Encoding:
8+
- gzip, deflate
9+
CommandName:
10+
- aks create
11+
Connection:
12+
- keep-alive
13+
ParameterSetName:
14+
- --resource-group --name --location --ssh-key-value --node-count --enable-managed-identity
15+
--enable-oidc-issuer --enable-ai-toolchain-operator --aks-custom-headers
16+
User-Agent:
17+
- AZURECLI/2.73.0 azsdk-python-core/1.31.0 Python/3.12.1 (Linux-6.8.0-1027-azure-x86_64-with-glibc2.31)
18+
method: GET
19+
uri: https://management.azure.com/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/clitest000001/providers/Microsoft.ContainerService/managedClusters/cliakstest000001?api-version=2025-02-01
20+
response:
21+
body:
22+
string: '{"error":{"code":"ResourceNotFound","message":"The Resource ''Microsoft.ContainerService/managedClusters/cliakstest000001''
23+
under resource group ''clitest000001'' was not found. For more details please
24+
go to https://aka.ms/ARMResourceNotFoundFix"}}'
25+
headers:
26+
cache-control:
27+
- no-cache
28+
content-length:
29+
- '244'
30+
content-type:
31+
- application/json; charset=utf-8
32+
date:
33+
- Fri, 16 May 2025 03:04:39 GMT
34+
expires:
35+
- '-1'
36+
pragma:
37+
- no-cache
38+
strict-transport-security:
39+
- max-age=31536000; includeSubDomains
40+
x-cache:
41+
- CONFIG_NOCACHE
42+
x-content-type-options:
43+
- nosniff
44+
x-ms-failure-cause:
45+
- gateway
46+
x-msedge-ref:
47+
- 'Ref A: CD7E65FD6D224333A54AF87AA670C89E Ref B: SJC211051204039 Ref C: 2025-05-16T03:04:39Z'
48+
status:
49+
code: 404
50+
message: Not Found
51+
version: 1

0 commit comments

Comments
 (0)