@@ -4982,6 +4982,161 @@ def test_get_container_network_logs_legacy_retina_flow_logs_param(self):
49824982 result = ctx.get_container_network_logs(mc)
49834983 self.assertTrue(result)
49844984
4985+ def test_get_container_network_logs_with_azure_monitor_logs(self):
4986+ """Test get_container_network_logs succeeds when monitoring is enabled via enable_azure_monitor_logs param."""
4987+ ctx = AKSPreviewManagedClusterContext(
4988+ self.cmd,
4989+ AKSManagedClusterParamDict({
4990+ "enable_container_network_logs": True,
4991+ "enable_acns": True,
4992+ "enable_azure_monitor_logs": True,
4993+ }),
4994+ self.models,
4995+ decorator_mode=DecoratorMode.CREATE,
4996+ )
4997+ mc = self.models.ManagedCluster(
4998+ location="test_location",
4999+ network_profile=self.models.ContainerServiceNetworkProfile(
5000+ advanced_networking=self.models.AdvancedNetworking(
5001+ enabled=True,
5002+ ),
5003+ ),
5004+ )
5005+ ctx.attach_mc(mc)
5006+ result = ctx.get_container_network_logs(mc)
5007+ self.assertTrue(result)
5008+
5009+ def test_get_container_network_logs_legacy_disable_retina_flow_logs(self):
5010+ """Test get_container_network_logs returns False when legacy disable_retina_flow_logs is specified."""
5011+ ctx = AKSPreviewManagedClusterContext(
5012+ self.cmd,
5013+ AKSManagedClusterParamDict({
5014+ "disable_retina_flow_logs": True,
5015+ }),
5016+ self.models,
5017+ decorator_mode=DecoratorMode.UPDATE,
5018+ )
5019+ mc = self.models.ManagedCluster(location="test_location")
5020+ ctx.attach_mc(mc)
5021+ result = ctx.get_container_network_logs(mc)
5022+ self.assertFalse(result)
5023+
5024+ def test_get_container_network_logs_with_acns_already_on_mc(self):
5025+ """Test get_container_network_logs succeeds when ACNS is already enabled on mc (not via raw param)."""
5026+ ctx = AKSPreviewManagedClusterContext(
5027+ self.cmd,
5028+ AKSManagedClusterParamDict({
5029+ "enable_container_network_logs": True,
5030+ "enable_addons": "monitoring",
5031+ }),
5032+ self.models,
5033+ decorator_mode=DecoratorMode.UPDATE,
5034+ )
5035+ mc = self.models.ManagedCluster(
5036+ location="test_location",
5037+ network_profile=self.models.ContainerServiceNetworkProfile(
5038+ advanced_networking=self.models.AdvancedNetworking(
5039+ enabled=True,
5040+ ),
5041+ ),
5042+ )
5043+ ctx.attach_mc(mc)
5044+ result = ctx.get_container_network_logs(mc)
5045+ self.assertTrue(result)
5046+
5047+ def test_get_enable_high_log_scale_mode_cnl_with_explicit_true(self):
5048+ """Test when user enables both CNL and HLSM=True explicitly. Should succeed and return True."""
5049+ ctx = AKSPreviewManagedClusterContext(
5050+ self.cmd,
5051+ AKSManagedClusterParamDict({
5052+ "enable_container_network_logs": True,
5053+ "enable_high_log_scale_mode": True,
5054+ "enable_acns": True,
5055+ "enable_addons": "monitoring",
5056+ }),
5057+ self.models,
5058+ decorator_mode=DecoratorMode.CREATE,
5059+ )
5060+ result = ctx.get_enable_high_log_scale_mode()
5061+ self.assertTrue(result)
5062+
5063+ def test_get_enable_high_log_scale_mode_update_explicit_false_without_cnl(self):
5064+ """Test that HLSM=False without CNL returns False in update mode without error."""
5065+ ctx = AKSPreviewManagedClusterContext(
5066+ self.cmd,
5067+ AKSManagedClusterParamDict({
5068+ "enable_high_log_scale_mode": False,
5069+ }),
5070+ self.models,
5071+ decorator_mode=DecoratorMode.UPDATE,
5072+ )
5073+ mc = self.models.ManagedCluster(
5074+ location="test_location",
5075+ addon_profiles={
5076+ "omsagent": self.models.ManagedClusterAddonProfile(
5077+ enabled=True,
5078+ )
5079+ },
5080+ )
5081+ ctx.attach_mc(mc)
5082+ result = ctx.get_enable_high_log_scale_mode()
5083+ self.assertFalse(result)
5084+
5085+ def test_get_enable_high_log_scale_mode_update_error_explicit_false_with_cnl(self):
5086+ """Test error when user explicitly disables HLSM with CNL enabled in update mode."""
5087+ ctx = AKSPreviewManagedClusterContext(
5088+ self.cmd,
5089+ AKSManagedClusterParamDict({
5090+ "enable_container_network_logs": True,
5091+ "enable_high_log_scale_mode": False,
5092+ }),
5093+ self.models,
5094+ decorator_mode=DecoratorMode.UPDATE,
5095+ )
5096+ mc = self.models.ManagedCluster(
5097+ location="test_location",
5098+ network_profile=self.models.ContainerServiceNetworkProfile(
5099+ advanced_networking=self.models.AdvancedNetworking(
5100+ enabled=True,
5101+ ),
5102+ ),
5103+ addon_profiles={
5104+ "omsagent": self.models.ManagedClusterAddonProfile(
5105+ enabled=True,
5106+ )
5107+ },
5108+ )
5109+ ctx.attach_mc(mc)
5110+ with self.assertRaises(MutuallyExclusiveArgumentError):
5111+ ctx.get_enable_high_log_scale_mode()
5112+
5113+ def test_get_enable_high_log_scale_mode_update_monitoring_camelcase_key(self):
5114+ """Test auto-enable HLSM in update mode when monitoring uses camelCase 'omsAgent' key."""
5115+ ctx = AKSPreviewManagedClusterContext(
5116+ self.cmd,
5117+ AKSManagedClusterParamDict({
5118+ "enable_container_network_logs": True,
5119+ }),
5120+ self.models,
5121+ decorator_mode=DecoratorMode.UPDATE,
5122+ )
5123+ mc = self.models.ManagedCluster(
5124+ location="test_location",
5125+ network_profile=self.models.ContainerServiceNetworkProfile(
5126+ advanced_networking=self.models.AdvancedNetworking(
5127+ enabled=True,
5128+ ),
5129+ ),
5130+ addon_profiles={
5131+ "omsAgent": self.models.ManagedClusterAddonProfile(
5132+ enabled=True,
5133+ )
5134+ },
5135+ )
5136+ ctx.attach_mc(mc)
5137+ result = ctx.get_enable_high_log_scale_mode()
5138+ self.assertTrue(result)
5139+
49855140 def test_get_enable_default_domain(self):
49865141 # default value
49875142 ctx_1 = AKSPreviewManagedClusterContext(
@@ -5666,6 +5821,65 @@ def test_set_up_addon_profiles_auto_enables_high_log_scale_mode_with_cnl(self):
56665821 # Verify high log scale mode is auto-enabled
56675822 self.assertTrue(dec.context.get_enable_high_log_scale_mode())
56685823
5824+ def test_set_up_addon_profiles_cnl_and_hlsm_flag_without_value(self):
5825+ """Regression test: CREATE with --enable-container-network-logs --enable-acns
5826+ --enable-addons monitoring --enable-high-log-scale-mode (flag without boolean value).
5827+
5828+ When --enable-high-log-scale-mode is passed without a value, get_three_state_flag()
5829+ sets it to True via nargs='?'. This must NOT trigger the 'Container network logs
5830+ requires --enable-acns...' error when ACNS and monitoring are both provided.
5831+ """
5832+ dec = AKSPreviewManagedClusterCreateDecorator(
5833+ self.cmd,
5834+ self.client,
5835+ {
5836+ "enable_addons": "monitoring",
5837+ "enable_container_network_logs": True,
5838+ "enable_high_log_scale_mode": True, # simulates --enable-high-log-scale-mode without value
5839+ "enable_acns": True,
5840+ "workspace_resource_id": "test_workspace_resource_id",
5841+ "enable_msi_auth_for_monitoring": True,
5842+ "enable_syslog": False,
5843+ "data_collection_settings": None,
5844+ },
5845+ CUSTOM_MGMT_AKS_PREVIEW,
5846+ )
5847+ network_profile = self.models.ContainerServiceNetworkProfile(
5848+ advanced_networking=self.models.AdvancedNetworking(enabled=True),
5849+ )
5850+ mc = self.models.ManagedCluster(location="test_location", network_profile=network_profile)
5851+ dec.context.attach_mc(mc)
5852+ dec.context.set_intermediate("subscription_id", "test_subscription_id")
5853+ external_functions = dec.context.external_functions
5854+ with patch.object(external_functions, 'ensure_container_insights_for_monitoring', return_value=None):
5855+ # Should NOT raise InvalidArgumentValueError
5856+ dec_mc = dec.set_up_addon_profiles(mc)
5857+ self.assertTrue(dec.context.get_enable_high_log_scale_mode())
5858+
5859+ def test_set_up_addon_profiles_hlsm_only_no_cnl(self):
5860+ """Test that enabling HLSM without CNL does not set enableRetinaNetworkFlags in config."""
5861+ dec = AKSPreviewManagedClusterCreateDecorator(
5862+ self.cmd,
5863+ self.client,
5864+ {
5865+ "enable_addons": "monitoring",
5866+ "enable_high_log_scale_mode": True,
5867+ "workspace_resource_id": "test_workspace_resource_id",
5868+ "enable_msi_auth_for_monitoring": True,
5869+ "enable_syslog": False,
5870+ "data_collection_settings": None,
5871+ },
5872+ CUSTOM_MGMT_AKS_PREVIEW,
5873+ )
5874+ mc = self.models.ManagedCluster(location="test_location")
5875+ dec.context.attach_mc(mc)
5876+ dec.context.set_intermediate("subscription_id", "test_subscription_id")
5877+ external_functions = dec.context.external_functions
5878+ with patch.object(external_functions, 'ensure_container_insights_for_monitoring', return_value=None):
5879+ dec_mc = dec.set_up_addon_profiles(mc)
5880+ # enableRetinaNetworkFlags should NOT be set when CNL is not enabled
5881+ omsagent_config = dec_mc.addon_profiles[CONST_MONITORING_ADDON_NAME].config
5882+ self.assertNotIn("enableRetinaNetworkFlags", omsagent_config)
56695883
56705884 def test_set_up_http_proxy_config(self):
56715885 dec_1 = AKSPreviewManagedClusterCreateDecorator(
@@ -13401,6 +13615,129 @@ def test_update_standalone_high_log_scale_mode(self):
1340113615 dec_8.update_monitoring_profile_flow_logs(mc_8)
1340213616 self.assertTrue(dec_8.context.get_intermediate("monitoring_addon_postprocessing_required"))
1340313617
13618+ def test_update_monitoring_profile_flow_logs_no_flags_noop(self):
13619+ """Test that update_monitoring_profile_flow_logs is a no-op when no CNL/HLSM flags are specified."""
13620+ dec = AKSPreviewManagedClusterUpdateDecorator(
13621+ self.cmd,
13622+ self.client,
13623+ {},
13624+ CUSTOM_MGMT_AKS_PREVIEW,
13625+ )
13626+ mc = self.models.ManagedCluster(
13627+ location="test_location",
13628+ addon_profiles={
13629+ "omsagent": self.models.ManagedClusterAddonProfile(
13630+ enabled=True,
13631+ config={"enableRetinaNetworkFlags": "True"},
13632+ )
13633+ },
13634+ )
13635+ dec.context.attach_mc(mc)
13636+ dec_mc = dec.update_monitoring_profile_flow_logs(mc)
13637+ # Existing config should remain unchanged
13638+ self.assertEqual(
13639+ dec_mc.addon_profiles["omsagent"].config["enableRetinaNetworkFlags"],
13640+ "True",
13641+ )
13642+ self.assertFalse(
13643+ dec.context.get_intermediate("monitoring_addon_postprocessing_required", default_value=False)
13644+ )
13645+
13646+ def test_update_enable_cnl_with_azure_monitor_logs_on_cluster(self):
13647+ """Test enabling CNL on update when monitoring was enabled via enable_azure_monitor_logs on existing cluster."""
13648+ dec = AKSPreviewManagedClusterUpdateDecorator(
13649+ self.cmd,
13650+ self.client,
13651+ {
13652+ "enable_container_network_logs": True,
13653+ "enable_azure_monitor_logs": True,
13654+ },
13655+ CUSTOM_MGMT_AKS_PREVIEW,
13656+ )
13657+ mc = self.models.ManagedCluster(
13658+ location="test_location",
13659+ network_profile=self.models.ContainerServiceNetworkProfile(
13660+ advanced_networking=self.models.AdvancedNetworking(
13661+ enabled=True,
13662+ ),
13663+ ),
13664+ addon_profiles={
13665+ "omsagent": self.models.ManagedClusterAddonProfile(
13666+ enabled=True,
13667+ )
13668+ },
13669+ )
13670+ dec.context.attach_mc(mc)
13671+ dec_mc = dec.update_monitoring_profile_flow_logs(mc)
13672+ self.assertEqual(
13673+ dec_mc.addon_profiles["omsagent"].config["enableRetinaNetworkFlags"],
13674+ "True",
13675+ )
13676+ self.assertTrue(dec.context.get_intermediate("monitoring_addon_postprocessing_required"))
13677+
13678+ def test_update_cnl_explicit_true_hlsm_with_prerequisites(self):
13679+ """Test enabling CNL + HLSM=True explicitly on update with all prerequisites met."""
13680+ dec = AKSPreviewManagedClusterUpdateDecorator(
13681+ self.cmd,
13682+ self.client,
13683+ {
13684+ "enable_container_network_logs": True,
13685+ "enable_high_log_scale_mode": True,
13686+ },
13687+ CUSTOM_MGMT_AKS_PREVIEW,
13688+ )
13689+ mc = self.models.ManagedCluster(
13690+ location="test_location",
13691+ network_profile=self.models.ContainerServiceNetworkProfile(
13692+ advanced_networking=self.models.AdvancedNetworking(
13693+ enabled=True,
13694+ ),
13695+ ),
13696+ addon_profiles={
13697+ "omsagent": self.models.ManagedClusterAddonProfile(
13698+ enabled=True,
13699+ config={
13700+ CONST_MONITORING_USING_AAD_MSI_AUTH: "true",
13701+ }
13702+ )
13703+ },
13704+ )
13705+ dec.context.attach_mc(mc)
13706+ dec_mc = dec.update_monitoring_profile_flow_logs(mc)
13707+ self.assertEqual(
13708+ dec_mc.addon_profiles["omsagent"].config["enableRetinaNetworkFlags"],
13709+ "True",
13710+ )
13711+ self.assertTrue(dec.context.get_enable_high_log_scale_mode())
13712+ self.assertTrue(dec.context.get_intermediate("monitoring_addon_postprocessing_required"))
13713+
13714+ def test_update_disable_hlsm_standalone_no_postprocessing(self):
13715+ """Test that disabling HLSM standalone (no CNL flag) does not trigger postprocessing."""
13716+ dec = AKSPreviewManagedClusterUpdateDecorator(
13717+ self.cmd,
13718+ self.client,
13719+ {
13720+ "enable_high_log_scale_mode": False,
13721+ },
13722+ CUSTOM_MGMT_AKS_PREVIEW,
13723+ )
13724+ mc = self.models.ManagedCluster(
13725+ location="test_location",
13726+ addon_profiles={
13727+ "omsagent": self.models.ManagedClusterAddonProfile(
13728+ enabled=True,
13729+ config={
13730+ CONST_MONITORING_USING_AAD_MSI_AUTH: "true",
13731+ }
13732+ )
13733+ },
13734+ )
13735+ dec.context.attach_mc(mc)
13736+ dec.update_monitoring_profile_flow_logs(mc)
13737+ self.assertFalse(
13738+ dec.context.get_intermediate("monitoring_addon_postprocessing_required", default_value=False)
13739+ )
13740+
1340413741 def test_update_node_provisioning_profile(self):
1340513742 dec_0 = AKSPreviewManagedClusterUpdateDecorator(
1340613743 self.cmd,
0 commit comments