66import inspect
77import unittest
88from types import SimpleNamespace
9- from unittest .mock import Mock , patch
9+ from unittest .mock import Mock , call , patch
1010
1111from azure .core .exceptions import HttpResponseError
1212from azure .cli .core .parser import AzCliCommandParser
2222 check_if_extension_is_installed ,
2323 get_azure_managed_lustre_extension_client ,
2424)
25- from azext_aks_preview .azuremanagedlustre ._validators import validate_azure_managed_lustre_params
25+ from azext_aks_preview .azuremanagedlustre ._validators import (
26+ validate_azure_managed_lustre_node_compatibility ,
27+ validate_azure_managed_lustre_params ,
28+ )
2629from azext_aks_preview .azuremanagedlustre .aml_ops import (
2730 perform_disable_azure_managed_lustre ,
2831 perform_enable_azure_managed_lustre ,
@@ -107,6 +110,53 @@ def test_valid_parameters(self):
107110 with self .subTest (enable = enable , disable = disable , installed = installed ):
108111 validate_azure_managed_lustre_params (enable , disable , installed )
109112
113+ def test_supported_node_pool (self ):
114+ cluster = SimpleNamespace (
115+ location = "eastus" ,
116+ agent_pool_profiles = [SimpleNamespace (os_sku = "Ubuntu2404" , vm_size = "Standard_D2s_v5" )],
117+ )
118+ validate_azure_managed_lustre_node_compatibility (Mock (), cluster )
119+
120+ def test_unsupported_node_pool_os_skus (self ):
121+ for os_sku in ["Flatcar" , "Ubuntu2604" ]:
122+ with self .subTest (os_sku = os_sku ):
123+ cluster = SimpleNamespace (
124+ location = "eastus" ,
125+ agent_pool_profiles = [SimpleNamespace (os_sku = os_sku , vm_size = "Standard_D2s_v5" )],
126+ )
127+ with self .assertRaisesRegex (InvalidArgumentValueError , "none of the cluster's node pools" ):
128+ validate_azure_managed_lustre_node_compatibility (Mock (), cluster )
129+
130+ def test_azure_linux_3_node_pool_architecture (self ):
131+ cluster = SimpleNamespace (
132+ location = "eastus" ,
133+ agent_pool_profiles = [SimpleNamespace (os_sku = "AzureLinux3" , vm_size = "Standard_D2ps_v5" )],
134+ )
135+ with patch (
136+ "azext_aks_preview.azuremanagedlustre._validators._get_vm_sku_architectures" ,
137+ return_value = {"standard_d2ps_v5" : "arm64" },
138+ ):
139+ with self .assertRaisesRegex (InvalidArgumentValueError , "ARM64" ):
140+ validate_azure_managed_lustre_node_compatibility (Mock (), cluster )
141+
142+ with patch (
143+ "azext_aks_preview.azuremanagedlustre._validators._get_vm_sku_architectures" ,
144+ return_value = {"standard_d2ps_v5" : "x64" },
145+ ):
146+ validate_azure_managed_lustre_node_compatibility (Mock (), cluster )
147+
148+ def test_unknown_azure_linux_3_node_pool_architecture (self ):
149+ cluster = SimpleNamespace (
150+ location = "eastus" ,
151+ agent_pool_profiles = [SimpleNamespace (os_sku = "AzureLinux3" , vm_size = "Standard_Unknown" )],
152+ )
153+ with patch (
154+ "azext_aks_preview.azuremanagedlustre._validators._get_vm_sku_architectures" ,
155+ return_value = {},
156+ ):
157+ with self .assertRaisesRegex (InvalidArgumentValueError , "architecture couldn't be determined" ):
158+ validate_azure_managed_lustre_node_compatibility (Mock (), cluster )
159+
110160
111161class AzureManagedLustreOperationsTestCase (unittest .TestCase ):
112162 def setUp (self ):
@@ -186,6 +236,11 @@ def make_decorator(self, create, **params):
186236 raw_params .update (params )
187237 decorator = decorator_type (self .cmd , self .client , raw_params , CUSTOM_MGMT_AKS_PREVIEW )
188238 decorator .context .attach_mc (self .models .ManagedCluster (location = "eastus" ))
239+ decorator .context .mc .agent_pool_profiles = [
240+ self .models .ManagedClusterAgentPoolProfile (
241+ name = "nodepool1" , os_sku = "Ubuntu2404" , vm_size = "Standard_D2s_v5"
242+ )
243+ ]
189244 decorator .context .set_intermediate ("subscription_id" , "test-subscription" )
190245 return decorator
191246
@@ -282,7 +337,7 @@ def test_update_propagates_lookup_errors_before_cluster_request(self):
282337 self .client .begin_create_or_update .assert_not_called ()
283338
284339 def test_update_prepares_enable_and_disable (self ):
285- for enable , installed in [(True , False ), (True , True ), ( False , True )]:
340+ for enable , installed in [(True , False ), (False , True )]:
286341 with self .subTest (enable = enable , installed = installed ):
287342 decorator = self .make_decorator (
288343 False , enable_azure_managed_lustre = enable , disable_azure_managed_lustre = not enable
@@ -296,6 +351,16 @@ def test_update_prepares_enable_and_disable(self):
296351 self .assertEqual (decorator .context .get_intermediate ("disable_azure_managed_lustre" ), not enable )
297352 self .assertTrue (decorator .check_is_postprocessing_required (mc ))
298353
354+ def test_update_preserves_existing_extension_configuration (self ):
355+ decorator = self .make_decorator (False , enable_azure_managed_lustre = True )
356+ mc = decorator .context .mc
357+ with patch (DECORATOR + ".check_if_azure_managed_lustre_is_installed" , return_value = True ), \
358+ patch (DECORATOR + ".validate_azure_managed_lustre_node_compatibility" ) as validate :
359+ self .assertIs (decorator .update_azure_managed_lustre (mc ), mc )
360+ validate .assert_not_called ()
361+ self .assertFalse (decorator .context .get_intermediate ("enable_azure_managed_lustre" ))
362+ self .assertFalse (decorator .check_is_postprocessing_required (mc ))
363+
299364 def test_postprocessing_performs_requested_operation (self ):
300365 for create , enable in [(True , True ), (False , True ), (False , False )]:
301366 with self .subTest (create = create , enable = enable ):
@@ -311,6 +376,18 @@ def test_postprocessing_performs_requested_operation(self):
311376 (install if enable else uninstall ).assert_called_once_with (self .cmd , "rg" , "cluster" )
312377 (uninstall if enable else install ).assert_not_called ()
313378
379+ def test_create_installs_lustre_before_container_storage_early_return (self ):
380+ decorator = self .make_decorator (True )
381+ decorator .context .set_intermediate ("enable_azure_managed_lustre" , True )
382+ decorator .context .set_intermediate ("enable_azure_container_storage" , "ephemeralDisk" )
383+ decorator .context .set_intermediate ("container_storage_version" , "1" )
384+ functions = decorator .context .external_functions
385+ with patch .object (functions , "perform_enable_azure_managed_lustre" ) as install , \
386+ patch ("azure.cli.command_modules.acs.managed_cluster_decorator."
387+ "AKSManagedClusterUpdateDecorator.postprocessing_after_mc_created" ):
388+ decorator .postprocessing_after_mc_created (decorator .context .mc )
389+ install .assert_called_once_with (self .cmd , "rg" , "cluster" )
390+
314391 def test_put_waits_for_cluster_before_lustre_even_with_no_wait (self ):
315392 for create in [True , False ]:
316393 with self .subTest (create = create ):
0 commit comments