diff --git a/src/aks-preview/azext_aks_preview/_client_factory.py b/src/aks-preview/azext_aks_preview/_client_factory.py index 39f78303524..175a03b2d95 100644 --- a/src/aks-preview/azext_aks_preview/_client_factory.py +++ b/src/aks-preview/azext_aks_preview/_client_factory.py @@ -62,6 +62,8 @@ def get_auth_management_client(cli_ctx, scope=None, **_): matched = re.match('/subscriptions/(?P[^/]*)/', scope) if matched: subscription_id = matched.groupdict()['subscription'] + else: + raise CLIError("{} does not contain subscription Id.".format(scope)) return get_mgmt_service_client(cli_ctx, ResourceType.MGMT_AUTHORIZATION, subscription_id=subscription_id) diff --git a/src/aks-preview/azext_aks_preview/_params.py b/src/aks-preview/azext_aks_preview/_params.py index 2efb02818a3..27c3d71e92a 100644 --- a/src/aks-preview/azext_aks_preview/_params.py +++ b/src/aks-preview/azext_aks_preview/_params.py @@ -21,7 +21,8 @@ validate_nodepool_name, validate_vm_set_type, validate_load_balancer_sku, validate_load_balancer_outbound_ips, validate_load_balancer_outbound_ip_prefixes, validate_taints, validate_priority, validate_eviction_policy, validate_spot_max_price, validate_acr, validate_user, - validate_load_balancer_outbound_ports, validate_load_balancer_idle_timeout, validate_nodepool_tags, validate_nodepool_labels) + validate_load_balancer_outbound_ports, validate_load_balancer_idle_timeout, validate_nodepool_tags, + validate_nodepool_labels, validate_vnet_subnet_id) from ._consts import CONST_OUTBOUND_TYPE_LOAD_BALANCER, \ CONST_OUTBOUND_TYPE_USER_DEFINED_ROUTING, CONST_SCALE_SET_PRIORITY_REGULAR, CONST_SCALE_SET_PRIORITY_SPOT, \ CONST_SPOT_EVICTION_POLICY_DELETE, CONST_SPOT_EVICTION_POLICY_DEALLOCATE @@ -80,7 +81,7 @@ def load_arguments(self, _): c.argument('no_ssh_key', options_list=['--no-ssh-key', '-x']) c.argument('pod_cidr') c.argument('service_cidr') - c.argument('vnet_subnet_id') + c.argument('vnet_subnet_id', type=str, validator=validate_vnet_subnet_id) c.argument('workspace_resource_id') c.argument('skip_subnet_role_assignment', action='store_true') c.argument('enable_cluster_autoscaler', action='store_true') diff --git a/src/aks-preview/azext_aks_preview/_validators.py b/src/aks-preview/azext_aks_preview/_validators.py index 8776a9925e0..b8bd09757ba 100644 --- a/src/aks-preview/azext_aks_preview/_validators.py +++ b/src/aks-preview/azext_aks_preview/_validators.py @@ -239,6 +239,15 @@ def validate_user(namespace): raise CLIError("--user can only be clusterUser or clusterMonitoringUser") +def validate_vnet_subnet_id(namespace): + if namespace.vnet_subnet_id is not None: + if namespace.vnet_subnet_id == '': + return + from msrestazure.tools import is_valid_resource_id + if not is_valid_resource_id(namespace.vnet_subnet_id): + raise CLIError("--vnet-subnet-id is not a valid Azure resource ID.") + + def validate_load_balancer_outbound_ports(namespace): """validate load balancer profile outbound allocated ports""" if namespace.load_balancer_outbound_ports is not None: diff --git a/src/aks-preview/azext_aks_preview/custom.py b/src/aks-preview/azext_aks_preview/custom.py index c4e2479e04a..89dc684edf8 100644 --- a/src/aks-preview/azext_aks_preview/custom.py +++ b/src/aks-preview/azext_aks_preview/custom.py @@ -1465,9 +1465,8 @@ def aks_kollect(cmd, # pylint: disable=too-many-statements,too-many-locals if not prompt_y_n('Do you want to see analysis results now?', default="n"): print(f"You can run 'az aks kanalyze -g {resource_group_name} -n {name}' " f"anytime to check the analysis results.") - return - - display_diagnostics_report(temp_kubeconfig_path) + else: + display_diagnostics_report(temp_kubeconfig_path) return diff --git a/src/aks-preview/azext_aks_preview/tests/latest/test_validators.py b/src/aks-preview/azext_aks_preview/tests/latest/test_validators.py index 6d5004a1647..4757c4f8810 100644 --- a/src/aks-preview/azext_aks_preview/tests/latest/test_validators.py +++ b/src/aks-preview/azext_aks_preview/tests/latest/test_validators.py @@ -115,3 +115,34 @@ class Namespace: def __init__(self, api_server_authorized_ip_ranges=None, cluster_autoscaler_profile=None): self.api_server_authorized_ip_ranges = api_server_authorized_ip_ranges self.cluster_autoscaler_profile = cluster_autoscaler_profile + + +class TestVNetSubnetId(unittest.TestCase): + def test_invalid_vnet_subnet_id(self): + invalid_vnet_subnet_id = "dummy subnet id" + namespace = VnetSubnetIdNamespace(invalid_vnet_subnet_id) + err = ("--vnet-subnet-id is not a valid Azure resource ID.") + + with self.assertRaises(CLIError) as cm: + validators.validate_vnet_subnet_id(namespace) + self.assertEqual(str(cm.exception), err) + + def test_valid_vnet_subnet_id(self): + invalid_vnet_subnet_id = "/subscriptions/testid/resourceGroups/MockedResourceGroup/providers/Microsoft.Network/virtualNetworks/MockedNetworkId/subnets/MockedSubNetId" + namespace = VnetSubnetIdNamespace(invalid_vnet_subnet_id) + validators.validate_vnet_subnet_id(namespace) + + def test_none_vnet_subnet_id(self): + invalid_vnet_subnet_id = None + namespace = VnetSubnetIdNamespace(invalid_vnet_subnet_id) + validators.validate_vnet_subnet_id(namespace) + + def test_empty_vnet_subnet_id(self): + invalid_vnet_subnet_id = "" + namespace = VnetSubnetIdNamespace(invalid_vnet_subnet_id) + validators.validate_vnet_subnet_id(namespace) + + +class VnetSubnetIdNamespace: + def __init__(self, vnet_subnet_id): + self.vnet_subnet_id = vnet_subnet_id