diff --git a/src/azure-cli/azure/cli/command_modules/acs/_consts.py b/src/azure-cli/azure/cli/command_modules/acs/_consts.py index 87fbc03b09e..a156f309a0b 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/_consts.py +++ b/src/azure-cli/azure/cli/command_modules/acs/_consts.py @@ -102,12 +102,21 @@ # consts for decorator pattern -# decorator mode class DecoratorMode(Enum): + """Enumerations used to distinguish whether to handle creation or update. + """ CREATE = 1 UPDATE = 2 +class AgentPoolDecoratorMode(Enum): + """Enumerations used to distinguish whether to deal with the default system agentpool in the context of the cluster + or any specific agentpool. + """ + MANAGED_CLUSTER = 1 + STANDALONE = 2 + + # custom exception for decorator pattern, used for gracefully exit class DecoratorEarlyExitException(Exception): pass diff --git a/src/azure-cli/azure/cli/command_modules/acs/agentpool_decorator.py b/src/azure-cli/azure/cli/command_modules/acs/agentpool_decorator.py index 8352b87f59f..136b84c4646 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/agentpool_decorator.py +++ b/src/azure-cli/azure/cli/command_modules/acs/agentpool_decorator.py @@ -6,9 +6,10 @@ from typing import Dict, Tuple, TypeVar, Union from azure.cli.command_modules.acs._client_factory import cf_agent_pools -from azure.cli.command_modules.acs._consts import DecoratorMode +from azure.cli.command_modules.acs._consts import DecoratorMode, AgentPoolDecoratorMode from azure.cli.command_modules.acs._validators import extract_comma_separated_string from azure.cli.command_modules.acs.base_decorator import BaseAKSContext, BaseAKSModels, BaseAKSParamDict +from azure.cli.core import AzCommandsLoader from azure.cli.core.azclierror import CLIInternalError, InvalidArgumentValueError, RequiredArgumentMissingError from azure.cli.core.commands import AzCliCommand from azure.cli.core.profiles import ResourceType @@ -29,6 +30,23 @@ class AKSAgentPoolModels(BaseAKSModels): The api version of the class corresponding to a model is determined by resource_type. """ + def __init__( + self, + cmd: AzCommandsLoader, + resource_type: ResourceType, + agentpool_decorator_mode: AgentPoolDecoratorMode, + ): + super().__init__(cmd, resource_type) + self.agentpool_decorator_mode = agentpool_decorator_mode + self.UnifiedAgentPoolModel = self.__choose_agentpool_model_by_agentpool_decorator_mode() + + def __choose_agentpool_model_by_agentpool_decorator_mode(self): + """Choose the model reference for agentpool based on agentpool_decorator_mode. + """ + if self.agentpool_decorator_mode == AgentPoolDecoratorMode.MANAGED_CLUSTER: + return self.ManagedClusterAgentPoolProfile + return self.AgentPool + # pylint: disable=too-few-public-methods class AKSAgentPoolParamDict(BaseAKSParamDict): @@ -48,8 +66,10 @@ def __init__( raw_parameters: AKSAgentPoolParamDict, models: AKSAgentPoolModels, decorator_mode: DecoratorMode, + agentpool_decorator_mode: AgentPoolDecoratorMode, ): super().__init__(cmd, raw_parameters, models, decorator_mode) + self.agentpool_decorator_mode = agentpool_decorator_mode self.agentpool = None # pylint: disable=no-self-use @@ -350,6 +370,7 @@ def __init__( client: AgentPoolsOperations, raw_parameters: Dict, resource_type: ResourceType, + agentpool_decorator_mode: AgentPoolDecoratorMode, ): """Internal controller of aks_agentpool_add. @@ -361,10 +382,11 @@ def __init__( """ self.cmd = cmd self.client = client - self.models = AKSAgentPoolModels(cmd, resource_type) + self.agentpool_decorator_mode = agentpool_decorator_mode + self.models = AKSAgentPoolModels(cmd, resource_type, agentpool_decorator_mode) # store the context in the process of assemble the AgentPool object self.context = AKSAgentPoolContext( - cmd, AKSAgentPoolParamDict(raw_parameters), self.models, decorator_mode=DecoratorMode.CREATE + cmd, AKSAgentPoolParamDict(raw_parameters), self.models, DecoratorMode.CREATE, agentpool_decorator_mode ) def _ensure_agentpool(self, agentpool: AgentPool) -> None: @@ -376,7 +398,7 @@ def _ensure_agentpool(self, agentpool: AgentPool) -> None: :return: None """ - if not isinstance(agentpool, self.models.AgentPool): + if not isinstance(agentpool, self.models.UnifiedAgentPoolModel): raise CLIInternalError( "Unexpected agentpool object with type '{}'.".format(type(agentpool)) ) @@ -390,17 +412,18 @@ def _ensure_agentpool(self, agentpool: AgentPool) -> None: def init_agentpool(self) -> AgentPool: """Initialize an AgentPool object with name and attach it to internal context. - Note: As a read only property, name would be ignored when serialized. - :return: the AgentPool object """ - # Initialize a AgentPool object with name. - agentpool = self.models.AgentPool() - # Note: As a read only property, name would be ignored when serialized. - # Set the name property by explicit assignment, otherwise it will be ignored by initialization. - agentpool.name = self.context.get_nodepool_name() + if self.agentpool_decorator_mode == AgentPoolDecoratorMode.MANAGED_CLUSTER: + # Note: As a required property, name must be provided during initialization. + agentpool = self.models.UnifiedAgentPoolModel(name=self.context.get_nodepool_name()) + else: + # Note: As a read only property, name would be ignored when serialized. + # Set the name property by explicit assignment, otherwise it will be ignored by initialization. + agentpool = self.models.UnifiedAgentPoolModel() + agentpool.name = self.context.get_nodepool_name() - # attach mc to AKSContext + # attach agentpool to AKSAgentPoolContext self.context.attach_agentpool(agentpool) return agentpool diff --git a/src/azure-cli/azure/cli/command_modules/acs/base_decorator.py b/src/azure-cli/azure/cli/command_modules/acs/base_decorator.py index 37d936cb81f..b4eaeb87ef7 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/base_decorator.py +++ b/src/azure-cli/azure/cli/command_modules/acs/base_decorator.py @@ -30,6 +30,7 @@ def validate_decorator_mode(decorator_mode) -> bool: return is_valid_decorator_mode +# pylint: disable=too-few-public-methods class BaseAKSModels: """A base class for storing the models used by aks commands. @@ -43,10 +44,12 @@ def __init__( self.__cmd = cmd self.__raw_models = None self.resource_type = resource_type - self.set_up_models() + self.__set_up_base_aks_models() @property def raw_models(self): + """Load the module that stores all aks models. + """ if self.__raw_models is None: self.__raw_models = self.__cmd.get_models( resource_type=self.resource_type, @@ -54,7 +57,9 @@ def raw_models(self): ).models return self.__raw_models - def set_up_models(self): + def __set_up_base_aks_models(self): + """Expose all aks models as properties of the class. + """ for model_name, model_class in vars(self.raw_models).items(): if not model_name.startswith('_'): setattr(self, model_name, model_class) @@ -78,9 +83,9 @@ def __init__(self, param_dict): def __increase(self, key): self.__count[key] = self.__count.get(key, 0) + 1 - def get(self, key): + def get(self, key, default=None): self.__increase(key) - return self.__store.get(key) + return self.__store.get(key, default) def keys(self): return self.__store.keys() diff --git a/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_agentpool_decorator.py b/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_agentpool_decorator.py index e447f0e9711..fdc627a4e98 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_agentpool_decorator.py +++ b/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_agentpool_decorator.py @@ -5,8 +5,9 @@ import unittest from unittest.mock import Mock, patch +import importlib -from azure.cli.command_modules.acs._consts import DecoratorEarlyExitException, DecoratorMode +from azure.cli.command_modules.acs._consts import DecoratorEarlyExitException, DecoratorMode, AgentPoolDecoratorMode from azure.cli.command_modules.acs.agentpool_decorator import ( AKSAgentPoolModels, AKSAgentPoolParamDict, @@ -28,31 +29,62 @@ from azure.cli.core.profiles import ResourceType -class AKSAgentPoolContextTestCase(unittest.TestCase): +class AKSAgentPoolModelsTestCase(unittest.TestCase): def setUp(self): self.cli_ctx = MockCLI() self.cmd = MockCmd(self.cli_ctx) - self.models = AKSAgentPoolModels(self.cmd, ResourceType.MGMT_CONTAINERSERVICE) + self.resource_type = ResourceType.MGMT_CONTAINERSERVICE def test__init__(self): + # load models directly (instead of through the `get_sdk` method provided by the cli component) + from azure.cli.core.profiles._shared import AZURE_API_PROFILES + + sdk_profile = AZURE_API_PROFILES["latest"][self.resource_type] + api_version = sdk_profile.default_api_version + module_name = "azure.mgmt.containerservice.v{}.models".format(api_version.replace("-", "_")) + module = importlib.import_module(module_name) + + standalone_models = AKSAgentPoolModels(self.cmd, self.resource_type, AgentPoolDecoratorMode.STANDALONE) + self.assertEqual(standalone_models.UnifiedAgentPoolModel, getattr(module, "AgentPool")) + managedcluster_models = AKSAgentPoolModels(self.cmd, self.resource_type, AgentPoolDecoratorMode.MANAGED_CLUSTER) + self.assertEqual(managedcluster_models.UnifiedAgentPoolModel, getattr(module, "ManagedClusterAgentPoolProfile")) + + +class AKSAgentPoolContextCommonTestCase(unittest.TestCase): + def create_initialized_agentpool_instance(self, nodepool_name="nodepool1", **kwargs): + # helper function to create a properly initialized agentpool instance + if self.agentpool_decorator_mode == AgentPoolDecoratorMode.MANAGED_CLUSTER: + agentpool = self.models.UnifiedAgentPoolModel(name=nodepool_name) + else: + agentpool = self.models.UnifiedAgentPoolModel() + agentpool.name = nodepool_name + for key, value in kwargs.items(): + setattr(agentpool, key, value) + return agentpool + + def common__init__(self): # fail on not passing dictionary-like parameters with self.assertRaises(CLIInternalError): - AKSAgentPoolContext(self.cmd, [], self.models, decorator_mode=DecoratorMode.CREATE) + AKSAgentPoolContext(self.cmd, [], self.models, DecoratorMode.CREATE, self.agentpool_decorator_mode) # fail on not passing decorator_mode with Enum type DecoratorMode with self.assertRaises(CLIInternalError): - AKSAgentPoolContext(self.cmd, AKSAgentPoolParamDict({}), self.models, decorator_mode=1) + AKSAgentPoolContext(self.cmd, AKSAgentPoolParamDict({}), self.models, 1, self.agentpool_decorator_mode) - def test_attach_agentpool(self): - ctx_1 = AKSAgentPoolContext(self.cmd, AKSAgentPoolParamDict({}), self.models, decorator_mode=DecoratorMode.CREATE) - agentpool = self.models.AgentPool() + def common_attach_agentpool(self): + ctx_1 = AKSAgentPoolContext( + self.cmd, AKSAgentPoolParamDict({}), self.models, DecoratorMode.CREATE, self.agentpool_decorator_mode + ) + agentpool = self.create_initialized_agentpool_instance() ctx_1.attach_agentpool(agentpool) self.assertEqual(ctx_1.agentpool, agentpool) # fail on attach again with self.assertRaises(CLIInternalError): ctx_1.attach_agentpool(agentpool) - def test_validate_counts_in_autoscaler(self): - ctx = AKSAgentPoolContext(self.cmd, AKSAgentPoolParamDict({}), self.models, decorator_mode=DecoratorMode.CREATE) + def common_validate_counts_in_autoscaler(self): + ctx = AKSAgentPoolContext( + self.cmd, AKSAgentPoolParamDict({}), self.models, DecoratorMode.CREATE, self.agentpool_decorator_mode + ) # default ctx._AKSAgentPoolContext__validate_counts_in_autoscaler(3, False, None, None, DecoratorMode.CREATE) @@ -79,33 +111,36 @@ def test_validate_counts_in_autoscaler(self): with self.assertRaises(RequiredArgumentMissingError): ctx._AKSAgentPoolContext__validate_counts_in_autoscaler(5, False, 3, None, DecoratorMode.UPDATE) - def test_get_resource_group_name(self): + def common_get_resource_group_name(self): # default ctx_1 = AKSAgentPoolContext( self.cmd, AKSAgentPoolParamDict({"resource_group_name": "test_rg_name"}), self.models, - decorator_mode=DecoratorMode.CREATE, + DecoratorMode.CREATE, + self.agentpool_decorator_mode, ) self.assertEqual(ctx_1.get_resource_group_name(), "test_rg_name") - def test_get_cluster_name(self): + def common_get_cluster_name(self): # default ctx_1 = AKSAgentPoolContext( self.cmd, AKSAgentPoolParamDict({"cluster_name": "test_cluster_name"}), self.models, - decorator_mode=DecoratorMode.CREATE, + DecoratorMode.CREATE, + self.agentpool_decorator_mode, ) self.assertEqual(ctx_1.get_cluster_name(), "test_cluster_name") - def test_get_nodepool_name(self): + def common_get_nodepool_name(self): # default ctx_1 = AKSAgentPoolContext( self.cmd, AKSAgentPoolParamDict({"nodepool_name": "test_nodepool_name"}), self.models, - decorator_mode=DecoratorMode.CREATE, + DecoratorMode.CREATE, + self.agentpool_decorator_mode, ) with patch( "azure.cli.command_modules.acs.agentpool_decorator.cf_agent_pools", @@ -113,8 +148,7 @@ def test_get_nodepool_name(self): ): self.assertEqual(ctx_1.get_nodepool_name(), "test_nodepool_name") - agentpool_1 = self.models.AgentPool() - agentpool_1.name = "test_ap_name" + agentpool_1 = self.create_initialized_agentpool_instance("test_ap_name") ctx_1.attach_agentpool(agentpool_1) with patch( "azure.cli.command_modules.acs.agentpool_decorator.cf_agent_pools", @@ -127,7 +161,8 @@ def test_get_nodepool_name(self): self.cmd, AKSAgentPoolParamDict({"nodepool_name": "test_nodepool_name"}), self.models, - decorator_mode=DecoratorMode.CREATE, + DecoratorMode.CREATE, + self.agentpool_decorator_mode, ) mock_agentpool_instance_1 = Mock() mock_agentpool_instance_1.name = "test_nodepool_name" @@ -139,43 +174,49 @@ def test_get_nodepool_name(self): ), self.assertRaises(InvalidArgumentValueError): ctx_2.get_nodepool_name() - def test_get_max_surge(self): + def common_get_max_surge(self): # default ctx_1 = AKSAgentPoolContext( self.cmd, - AKSAgentPoolParamDict({ - "max_surge": None, - }), + AKSAgentPoolParamDict( + { + "max_surge": None, + } + ), self.models, - decorator_mode=DecoratorMode.CREATE, + DecoratorMode.CREATE, + self.agentpool_decorator_mode, ) self.assertEqual(ctx_1.get_max_surge(), None) upgrade_settings_1 = self.models.AgentPoolUpgradeSettings(max_surge="test_max_surge") - agentpool_1 = self.models.AgentPool(upgrade_settings=upgrade_settings_1) + agentpool_1 = self.create_initialized_agentpool_instance(upgrade_settings=upgrade_settings_1) ctx_1.attach_agentpool(agentpool_1) self.assertEqual(ctx_1.get_max_surge(), "test_max_surge") - def test_get_node_count_and_enable_cluster_autoscaler_min_max_count( + def common_get_node_count_and_enable_cluster_autoscaler_min_max_count( self, ): # default ctx_1 = AKSAgentPoolContext( self.cmd, - AKSAgentPoolParamDict({ - "node_count": 3, - "enable_cluster_autoscaler": False, - "min_count": None, - "max_count": None, - }), + AKSAgentPoolParamDict( + { + "node_count": 3, + "enable_cluster_autoscaler": False, + "min_count": None, + "max_count": None, + } + ), self.models, - decorator_mode=DecoratorMode.CREATE, + DecoratorMode.CREATE, + self.agentpool_decorator_mode, ) self.assertEqual( ctx_1.get_node_count_and_enable_cluster_autoscaler_min_max_count(), (3, False, None, None), ) - agentpool = self.models.AgentPool( + agentpool = self.create_initialized_agentpool_instance( count=5, enable_auto_scaling=True, min_count=1, @@ -187,123 +228,235 @@ def test_get_node_count_and_enable_cluster_autoscaler_min_max_count( (5, True, 1, 10), ) - def test_get_node_osdisk_size(self): + def common_get_node_osdisk_size(self): # default ctx_1 = AKSAgentPoolContext( self.cmd, AKSAgentPoolParamDict({"node_osdisk_size": 0}), self.models, - decorator_mode=DecoratorMode.CREATE, + DecoratorMode.CREATE, + self.agentpool_decorator_mode, ) self.assertEqual(ctx_1.get_node_osdisk_size(), 0) - agentpool = self.models.AgentPool(os_disk_size_gb=10) + agentpool = self.create_initialized_agentpool_instance(os_disk_size_gb=10) ctx_1.attach_agentpool(agentpool) self.assertEqual(ctx_1.get_node_osdisk_size(), 10) - def test_get_node_osdisk_type(self): + def common_get_node_osdisk_type(self): # default ctx_1 = AKSAgentPoolContext( self.cmd, AKSAgentPoolParamDict({"node_osdisk_type": None}), self.models, - decorator_mode=DecoratorMode.CREATE, + DecoratorMode.CREATE, + self.agentpool_decorator_mode, ) self.assertEqual(ctx_1.get_node_osdisk_type(), None) - agentpool = self.models.AgentPool(os_disk_type="test_mc_node_osdisk_type") + agentpool = self.create_initialized_agentpool_instance(os_disk_type="test_mc_node_osdisk_type") ctx_1.attach_agentpool(agentpool) self.assertEqual(ctx_1.get_node_osdisk_type(), "test_mc_node_osdisk_type") - def test_get_aks_custom_headers(self): + def common_get_aks_custom_headers(self): # default ctx_1 = AKSAgentPoolContext( self.cmd, - AKSAgentPoolParamDict({ - "aks_custom_headers": None, - }), + AKSAgentPoolParamDict( + { + "aks_custom_headers": None, + } + ), self.models, - decorator_mode=DecoratorMode.CREATE, + DecoratorMode.CREATE, + self.agentpool_decorator_mode, ) self.assertEqual(ctx_1.get_aks_custom_headers(), {}) # custom value ctx_2 = AKSAgentPoolContext( self.cmd, - AKSAgentPoolParamDict({ - "aks_custom_headers": "abc=def,xyz=123", - }), + AKSAgentPoolParamDict( + { + "aks_custom_headers": "abc=def,xyz=123", + } + ), self.models, - decorator_mode=DecoratorMode.UPDATE, + DecoratorMode.UPDATE, + self.agentpool_decorator_mode, ) self.assertEqual(ctx_2.get_aks_custom_headers(), {"abc": "def", "xyz": "123"}) - def test_get_no_wait(self): + def common_get_no_wait(self): # default ctx_1 = AKSAgentPoolContext( self.cmd, AKSAgentPoolParamDict({"no_wait": False}), self.models, - decorator_mode=DecoratorMode.CREATE, + DecoratorMode.CREATE, + self.agentpool_decorator_mode, ) self.assertEqual(ctx_1.get_no_wait(), False) -class AKSAgentPoolAddDecoratorTestCase(unittest.TestCase): +class AKSAgentPoolContextStandaloneModeTestCase(AKSAgentPoolContextCommonTestCase): def setUp(self): self.cli_ctx = MockCLI() self.cmd = MockCmd(self.cli_ctx) - self.models = AKSAgentPoolModels(self.cmd, ResourceType.MGMT_CONTAINERSERVICE) - self.client = MockClient() + self.resource_type = ResourceType.MGMT_CONTAINERSERVICE + self.agentpool_decorator_mode = AgentPoolDecoratorMode.STANDALONE + self.models = AKSAgentPoolModels(self.cmd, self.resource_type, self.agentpool_decorator_mode) - def test_ensure_agentpool(self): + def test__init__(self): + self.common__init__() + + def test_attach_agentpool(self): + self.common_attach_agentpool() + + def test_validate_counts_in_autoscaler(self): + self.common_validate_counts_in_autoscaler() + + def test_get_resource_group_name(self): + self.common_get_resource_group_name() + + def test_get_cluster_name(self): + self.common_get_cluster_name() + + def test_get_nodepool_name(self): + self.common_get_nodepool_name() + + def test_get_max_surge(self): + self.common_get_max_surge() + + def test_get_node_count_and_enable_cluster_autoscaler_min_max_count( + self, + ): + self.common_get_node_count_and_enable_cluster_autoscaler_min_max_count() + + def test_get_node_osdisk_size(self): + self.common_get_node_osdisk_size() + + def test_get_node_osdisk_type(self): + self.common_get_node_osdisk_type() + + def test_get_aks_custom_headers(self): + self.common_get_aks_custom_headers() + + def test_get_no_wait(self): + self.common_get_no_wait() + + +class AKSAgentPoolContextManagedClusterModeTestCase(AKSAgentPoolContextCommonTestCase): + def setUp(self): + self.cli_ctx = MockCLI() + self.cmd = MockCmd(self.cli_ctx) + self.resource_type = ResourceType.MGMT_CONTAINERSERVICE + self.agentpool_decorator_mode = AgentPoolDecoratorMode.MANAGED_CLUSTER + self.models = AKSAgentPoolModels(self.cmd, self.resource_type, self.agentpool_decorator_mode) + + def test__init__(self): + self.common__init__() + + def test_attach_agentpool(self): + self.common_attach_agentpool() + + def test_validate_counts_in_autoscaler(self): + self.common_validate_counts_in_autoscaler() + + def test_get_resource_group_name(self): + self.common_get_resource_group_name() + + def test_get_cluster_name(self): + self.common_get_cluster_name() + + def test_get_nodepool_name(self): + self.common_get_nodepool_name() + + def test_get_max_surge(self): + self.common_get_max_surge() + + def test_get_node_count_and_enable_cluster_autoscaler_min_max_count( + self, + ): + self.common_get_node_count_and_enable_cluster_autoscaler_min_max_count() + + def test_get_node_osdisk_size(self): + self.common_get_node_osdisk_size() + + def test_get_node_osdisk_type(self): + self.common_get_node_osdisk_type() + + def test_get_aks_custom_headers(self): + self.common_get_aks_custom_headers() + + def test_get_no_wait(self): + self.common_get_no_wait() + + +class AKSAgentPoolAddDecoratorCommonTestCase(unittest.TestCase): + def create_initialized_agentpool_instance(self, nodepool_name="nodepool1", **kwargs): + # helper function to create a properly initialized agentpool instance + if self.agentpool_decorator_mode == AgentPoolDecoratorMode.MANAGED_CLUSTER: + agentpool = self.models.UnifiedAgentPoolModel(name=nodepool_name) + else: + agentpool = self.models.UnifiedAgentPoolModel() + agentpool.name = nodepool_name + for key, value in kwargs.items(): + setattr(agentpool, key, value) + return agentpool + + def common_ensure_agentpool(self): dec_1 = AKSAgentPoolAddDecorator( self.cmd, self.client, {}, - ResourceType.MGMT_CONTAINERSERVICE, + self.resource_type, + self.agentpool_decorator_mode, ) # fail on passing the wrong mc object with self.assertRaises(CLIInternalError): dec_1._ensure_agentpool(None) - mc_1 = self.models.AgentPool() + agentpool_1 = self.create_initialized_agentpool_instance() # fail on inconsistent mc with internal context with self.assertRaises(CLIInternalError): - dec_1._ensure_agentpool(mc_1) + dec_1._ensure_agentpool(agentpool_1) - def test_init_agentpool(self): + def common_init_agentpool(self): dec_1 = AKSAgentPoolAddDecorator( self.cmd, self.client, {"nodepool_name": "test_nodepool_name"}, - ResourceType.MGMT_CONTAINERSERVICE, + self.resource_type, + self.agentpool_decorator_mode, ) with patch( "azure.cli.command_modules.acs.agentpool_decorator.cf_agent_pools", return_value=Mock(), ): dec_agentpool_1 = dec_1.init_agentpool() - ground_truth_agentpool_1 = self.models.AgentPool() - ground_truth_agentpool_1.name = "test_nodepool_name" + ground_truth_agentpool_1 = self.create_initialized_agentpool_instance("test_nodepool_name") self.assertEqual(dec_agentpool_1, ground_truth_agentpool_1) self.assertEqual(dec_agentpool_1, dec_1.context.agentpool) - def test_set_up_upgrade_settings(self): + def common_set_up_upgrade_settings(self): dec_1 = AKSAgentPoolAddDecorator( self.cmd, self.client, {"max_surge": "test_max_surge"}, - ResourceType.MGMT_CONTAINERSERVICE, + self.resource_type, + self.agentpool_decorator_mode, ) - agentpool_1 = self.models.AgentPool() # fail on passing the wrong agentpool object with self.assertRaises(CLIInternalError): dec_1.set_up_upgrade_settings(None) + agentpool_1 = self.create_initialized_agentpool_instance() dec_1.context.attach_agentpool(agentpool_1) dec_agentpool_1 = dec_1.set_up_upgrade_settings(agentpool_1) ground_truth_upgrade_settings_1 = self.models.AgentPoolUpgradeSettings(max_surge="test_max_surge") - ground_truth_agentpool_1 = self.models.AgentPool(upgrade_settings=ground_truth_upgrade_settings_1) + ground_truth_agentpool_1 = self.create_initialized_agentpool_instance( + upgrade_settings=ground_truth_upgrade_settings_1 + ) self.assertEqual(dec_agentpool_1, ground_truth_agentpool_1) - def test_construct_default_agentpool(self): + def common_construct_default_agentpool(self): import inspect from azure.cli.command_modules.acs.custom import aks_agentpool_add @@ -337,7 +490,8 @@ def test_construct_default_agentpool(self): self.cmd, self.client, raw_param_dict, - ResourceType.MGMT_CONTAINERSERVICE, + self.resource_type, + self.agentpool_decorator_mode, ) with patch( @@ -347,7 +501,7 @@ def test_construct_default_agentpool(self): dec_agentpool_1 = dec_1.construct_default_agentpool_profile() upgrade_settings_1 = self.models.AgentPoolUpgradeSettings() - agentpool_1 = self.models.AgentPool( + agentpool_1 = self.create_initialized_agentpool_instance( upgrade_settings=upgrade_settings_1, count=3, enable_auto_scaling=False, os_disk_size_gb=0 ) agentpool_1.name = "test_nodepool_name" @@ -355,6 +509,50 @@ def test_construct_default_agentpool(self): dec_1.context.raw_param.print_usage_statistics() +class AKSAgentPoolAddDecoratorStandaloneModeTestCase(AKSAgentPoolAddDecoratorCommonTestCase): + def setUp(self): + self.cli_ctx = MockCLI() + self.cmd = MockCmd(self.cli_ctx) + self.resource_type = ResourceType.MGMT_CONTAINERSERVICE + self.agentpool_decorator_mode = AgentPoolDecoratorMode.STANDALONE + self.models = AKSAgentPoolModels(self.cmd, self.resource_type, self.agentpool_decorator_mode) + self.client = MockClient() + + def test_ensure_agentpool(self): + self.common_ensure_agentpool() + + def test_init_agentpool(self): + self.common_init_agentpool() + + def test_set_up_upgrade_settings(self): + self.common_set_up_upgrade_settings() + + def test_construct_default_agentpool(self): + self.common_construct_default_agentpool() + + +class AKSAgentPoolAddDecoratorManagedClusterModeTestCase(AKSAgentPoolAddDecoratorCommonTestCase): + def setUp(self): + self.cli_ctx = MockCLI() + self.cmd = MockCmd(self.cli_ctx) + self.resource_type = ResourceType.MGMT_CONTAINERSERVICE + self.agentpool_decorator_mode = AgentPoolDecoratorMode.MANAGED_CLUSTER + self.models = AKSAgentPoolModels(self.cmd, self.resource_type, self.agentpool_decorator_mode) + self.client = MockClient() + + def test_ensure_agentpool(self): + self.common_ensure_agentpool() + + def test_init_agentpool(self): + self.common_init_agentpool() + + def test_set_up_upgrade_settings(self): + self.common_set_up_upgrade_settings() + + def test_construct_default_agentpool(self): + self.common_construct_default_agentpool() + + class AKSAgentPoolUpdateDecoratorTestCase(unittest.TestCase): def test(self): pass diff --git a/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_base_decorator.py b/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_base_decorator.py index ae1921b691b..2828095127b 100644 --- a/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_base_decorator.py +++ b/src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_base_decorator.py @@ -42,6 +42,7 @@ def test_models(self): api_version = sdk_profile.default_api_version module_name = "azure.mgmt.containerservice.v{}.models".format(api_version.replace("-", "_")) module = importlib.import_module(module_name) + models = BaseAKSModels(self.cmd, ResourceType.MGMT_CONTAINERSERVICE) self.assertEqual(models.raw_models, module) @@ -56,6 +57,9 @@ def test_get(self): param_dict = BaseAKSParamDict({"abc": "xyz"}) self.assertEqual(param_dict.get("abc"), "xyz") + param_dict_2 = BaseAKSParamDict({}) + self.assertEqual(param_dict_2.get("abc", True), True) + def test_keys(self): param_dict = BaseAKSParamDict({"abc": "xyz"}) self.assertEqual(list(param_dict.keys()), ["abc"])