Skip to content

Commit 628f86a

Browse files
authored
[AKS] az aks create and az aks nodepool add: Add --pod-subnet-id to support dynamically assigne pod ip (Azure#21651)
* add podsubnetid * linter exclusion * fixing lint issues * some cleanup/lint * add vnet_subnet_id and pod_subnet_id to aks nodepool add
1 parent 88209a3 commit 628f86a

File tree

7 files changed

+64
-8
lines changed

7 files changed

+64
-8
lines changed

linter_exclusions.yml

+3
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,9 @@ acs create:
173173
master_vnet_subnet_id:
174174
rule_exclusions:
175175
- option_length_too_long
176+
master_pod_subnet_id:
177+
rule_exclusions:
178+
- option_length_too_long
176179
acs kubernetes install-cli:
177180
parameters:
178181
kubelogin_install_location:

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

+6
Original file line numberDiff line numberDiff line change
@@ -385,6 +385,9 @@
385385
- name: --vnet-subnet-id
386386
type: string
387387
short-summary: The ID of a subnet in an existing VNet into which to deploy the cluster.
388+
- name: --pod-subnet-id
389+
type: string
390+
short-summary: The ID of a subnet in an existing VNet into which to assign pods in the cluster (requires azure network-plugin).
388391
- name: --ppg
389392
type: string
390393
short-summary: The ID of a PPG.
@@ -937,6 +940,9 @@
937940
- name: --vnet-subnet-id
938941
type: string
939942
short-summary: The ID of a subnet in an existing VNet into which to deploy the cluster.
943+
- name: --pod-subnet-id
944+
type: string
945+
short-summary: The ID of a subnet in an existing VNet into which to assign pods in the cluster (requires azure network-plugin).
940946
- name: --ppg
941947
type: string
942948
short-summary: The ID of a PPG.

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

+7-2
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@
2323
validate_nodepool_name, validate_vm_set_type, validate_load_balancer_sku, validate_nodepool_id, validate_snapshot_id,
2424
validate_load_balancer_outbound_ips, validate_priority, validate_eviction_policy, validate_spot_max_price,
2525
validate_load_balancer_outbound_ip_prefixes, validate_taints, validate_ip_ranges, validate_acr, validate_nodepool_tags,
26-
validate_load_balancer_outbound_ports, validate_load_balancer_idle_timeout, validate_vnet_subnet_id, validate_nodepool_labels,
27-
validate_ppg, validate_assign_identity, validate_max_surge, validate_assign_kubelet_identity, validate_credential_format)
26+
validate_load_balancer_outbound_ports, validate_load_balancer_idle_timeout, validate_vnet_subnet_id, validate_pod_subnet_id,
27+
validate_nodepool_labels, validate_ppg, validate_assign_identity, validate_max_surge, validate_assign_kubelet_identity,
28+
validate_credential_format)
2829
from ._consts import (
2930
CONST_OUTBOUND_TYPE_LOAD_BALANCER,
3031
CONST_OUTBOUND_TYPE_USER_DEFINED_ROUTING,
@@ -259,6 +260,8 @@ def load_arguments(self, _):
259260
c.argument('node_osdisk_size', type=int)
260261
c.argument('vnet_subnet_id', type=str,
261262
validator=validate_vnet_subnet_id)
263+
c.argument('pod_subnet_id', type=str,
264+
validator=validate_pod_subnet_id)
262265
c.argument('workspace_resource_id')
263266
c.argument('enable_msi_auth_for_monitoring', arg_type=get_three_state_flag(), is_preview=True)
264267
c.argument('skip_subnet_role_assignment', action='store_true')
@@ -446,6 +449,8 @@ def load_arguments(self, _):
446449
c.argument('zones', zones_type, options_list=['--zones', '-z'], help='Space-separated list of availability zones where agent nodes will be placed.')
447450
c.argument('node_vm_size', options_list=['--node-vm-size', '-s'], completer=get_vm_size_completion_list)
448451
c.argument('max_pods', type=int, options_list=['--max-pods', '-m'])
452+
c.argument('vnet_subnet_id', type=str, validator=validate_vnet_subnet_id)
453+
c.argument('pod_subnet_id', type=str, validator=validate_pod_subnet_id)
449454
c.argument('os_type', type=str)
450455
c.argument('os_sku', completer=get_ossku_completion_list)
451456
c.argument('enable_cluster_autoscaler', options_list=["--enable-cluster-autoscaler", "-e"], action='store_true')

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

+13-6
Original file line numberDiff line numberDiff line change
@@ -283,12 +283,19 @@ def validate_nodepool_tags(ns):
283283

284284

285285
def validate_vnet_subnet_id(namespace):
286-
if namespace.vnet_subnet_id is not None:
287-
if namespace.vnet_subnet_id == '':
288-
return
289-
from msrestazure.tools import is_valid_resource_id
290-
if not is_valid_resource_id(namespace.vnet_subnet_id):
291-
raise CLIError("--vnet-subnet-id is not a valid Azure resource ID.")
286+
_validate_subnet_id(namespace.vnet_subnet_id, "--vnet-subnet-id")
287+
288+
289+
def validate_pod_subnet_id(namespace):
290+
_validate_subnet_id(namespace.pod_subnet_id, "--pod-subnet-id")
291+
292+
293+
def _validate_subnet_id(subnet_id, name):
294+
if subnet_id is None or subnet_id == '':
295+
return
296+
from msrestazure.tools import is_valid_resource_id
297+
if not is_valid_resource_id(subnet_id):
298+
raise InvalidArgumentValueError(name + " is not a valid Azure resource ID.")
292299

293300

294301
def validate_ppg(namespace):

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

+4
Original file line numberDiff line numberDiff line change
@@ -1961,6 +1961,7 @@ def aks_create(cmd, client, resource_group_name, name, ssh_key_value, # pylint:
19611961
workspace_resource_id=None,
19621962
enable_msi_auth_for_monitoring=False,
19631963
vnet_subnet_id=None,
1964+
pod_subnet_id=None,
19641965
ppg=None,
19651966
max_pods=0,
19661967
min_count=None,
@@ -2808,6 +2809,7 @@ def _handle_addons_args(cmd, addons_str, subscription_id, resource_group_name, a
28082809
enable_msi_auth_for_monitoring=False,
28092810
aci_subnet_name=None,
28102811
vnet_subnet_id=None,
2812+
pod_subnet_id=None,
28112813
appgw_name=None,
28122814
appgw_subnet_cidr=None,
28132815
appgw_id=None,
@@ -3123,6 +3125,7 @@ def aks_agentpool_add(cmd, client, resource_group_name, cluster_name, nodepool_n
31233125
node_osdisk_size=0,
31243126
node_count=3,
31253127
vnet_subnet_id=None,
3128+
pod_subnet_id=None,
31263129
ppg=None,
31273130
max_pods=0,
31283131
os_type=None,
@@ -3208,6 +3211,7 @@ def aks_agentpool_add(cmd, client, resource_group_name, cluster_name, nodepool_n
32083211
os_type=os_type,
32093212
os_sku=os_sku,
32103213
vnet_subnet_id=vnet_subnet_id,
3214+
pod_subnet_id=pod_subnet_id,
32113215
proximity_placement_group_id=ppg,
32123216
agent_pool_type="VirtualMachineScaleSets",
32133217
max_pods=int(max_pods) if max_pods else None,

src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_decorator.py

+1
Original file line numberDiff line numberDiff line change
@@ -4819,6 +4819,7 @@ def test_set_up_agent_pool_profiles(self):
48194819
os_type="Linux",
48204820
os_sku=None,
48214821
vnet_subnet_id=None,
4822+
pod_subnet_id=None,
48224823
proximity_placement_group_id=None,
48234824
availability_zones=None,
48244825
enable_node_public_ip=False,

src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_validators.py

+30
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,36 @@ class VnetSubnetIdNamespace:
133133
def __init__(self, vnet_subnet_id):
134134
self.vnet_subnet_id = vnet_subnet_id
135135

136+
class TestPodSubnetId(unittest.TestCase):
137+
def test_invalid_pod_subnet_id(self):
138+
invalid_pod_subnet_id = "dummy subnet id"
139+
namespace = PodSubnetIdNamespace(invalid_pod_subnet_id)
140+
err = ("--pod-subnet-id is not a valid Azure resource ID.")
141+
142+
with self.assertRaises(CLIError) as cm:
143+
validators.validate_pod_subnet_id(namespace)
144+
self.assertEqual(str(cm.exception), err)
145+
146+
def test_valid_pod_subnet_id(self):
147+
invalid_pod_subnet_id = "/subscriptions/testid/resourceGroups/MockedResourceGroup/providers/Microsoft.Network/virtualNetworks/MockedNetworkId/subnets/MockedSubNetId"
148+
namespace = PodSubnetIdNamespace(invalid_pod_subnet_id)
149+
validators.validate_pod_subnet_id(namespace)
150+
151+
def test_none_pod_subnet_id(self):
152+
invalid_pod_subnet_id = None
153+
namespace = PodSubnetIdNamespace(invalid_pod_subnet_id)
154+
validators.validate_pod_subnet_id(namespace)
155+
156+
def test_empty_pod_subnet_id(self):
157+
invalid_pod_subnet_id = ""
158+
namespace = PodSubnetIdNamespace(invalid_pod_subnet_id)
159+
validators.validate_pod_subnet_id(namespace)
160+
161+
162+
class PodSubnetIdNamespace:
163+
def __init__(self, pod_subnet_id):
164+
self.pod_subnet_id = pod_subnet_id
165+
136166

137167
class MaxSurgeNamespace:
138168
def __init__(self, max_surge):

0 commit comments

Comments
 (0)