@@ -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(
@@ -5609,6 +5764,65 @@ def test_set_up_addon_profiles_auto_enables_high_log_scale_mode_with_cnl(self):
56095764 # Verify high log scale mode is auto-enabled
56105765 self.assertTrue(dec.context.get_enable_high_log_scale_mode())
56115766
5767+ def test_set_up_addon_profiles_cnl_and_hlsm_flag_without_value(self):
5768+ """Regression test: CREATE with --enable-container-network-logs --enable-acns
5769+ --enable-addons monitoring --enable-high-log-scale-mode (flag without boolean value).
5770+
5771+ When --enable-high-log-scale-mode is passed without a value, get_three_state_flag()
5772+ sets it to True via nargs='?'. This must NOT trigger the 'Container network logs
5773+ requires --enable-acns...' error when ACNS and monitoring are both provided.
5774+ """
5775+ dec = AKSPreviewManagedClusterCreateDecorator(
5776+ self.cmd,
5777+ self.client,
5778+ {
5779+ "enable_addons": "monitoring",
5780+ "enable_container_network_logs": True,
5781+ "enable_high_log_scale_mode": True, # simulates --enable-high-log-scale-mode without value
5782+ "enable_acns": True,
5783+ "workspace_resource_id": "test_workspace_resource_id",
5784+ "enable_msi_auth_for_monitoring": True,
5785+ "enable_syslog": False,
5786+ "data_collection_settings": None,
5787+ },
5788+ CUSTOM_MGMT_AKS_PREVIEW,
5789+ )
5790+ network_profile = self.models.ContainerServiceNetworkProfile(
5791+ advanced_networking=self.models.AdvancedNetworking(enabled=True),
5792+ )
5793+ mc = self.models.ManagedCluster(location="test_location", network_profile=network_profile)
5794+ dec.context.attach_mc(mc)
5795+ dec.context.set_intermediate("subscription_id", "test_subscription_id")
5796+ external_functions = dec.context.external_functions
5797+ with patch.object(external_functions, 'ensure_container_insights_for_monitoring', return_value=None):
5798+ # Should NOT raise InvalidArgumentValueError
5799+ dec_mc = dec.set_up_addon_profiles(mc)
5800+ self.assertTrue(dec.context.get_enable_high_log_scale_mode())
5801+
5802+ def test_set_up_addon_profiles_hlsm_only_no_cnl(self):
5803+ """Test that enabling HLSM without CNL does not set enableRetinaNetworkFlags in config."""
5804+ dec = AKSPreviewManagedClusterCreateDecorator(
5805+ self.cmd,
5806+ self.client,
5807+ {
5808+ "enable_addons": "monitoring",
5809+ "enable_high_log_scale_mode": True,
5810+ "workspace_resource_id": "test_workspace_resource_id",
5811+ "enable_msi_auth_for_monitoring": True,
5812+ "enable_syslog": False,
5813+ "data_collection_settings": None,
5814+ },
5815+ CUSTOM_MGMT_AKS_PREVIEW,
5816+ )
5817+ mc = self.models.ManagedCluster(location="test_location")
5818+ dec.context.attach_mc(mc)
5819+ dec.context.set_intermediate("subscription_id", "test_subscription_id")
5820+ external_functions = dec.context.external_functions
5821+ with patch.object(external_functions, 'ensure_container_insights_for_monitoring', return_value=None):
5822+ dec_mc = dec.set_up_addon_profiles(mc)
5823+ # enableRetinaNetworkFlags should NOT be set when CNL is not enabled
5824+ omsagent_config = dec_mc.addon_profiles[CONST_MONITORING_ADDON_NAME].config
5825+ self.assertNotIn("enableRetinaNetworkFlags", omsagent_config)
56125826
56135827 def test_set_up_http_proxy_config(self):
56145828 dec_1 = AKSPreviewManagedClusterCreateDecorator(
@@ -13309,6 +13523,129 @@ def test_update_standalone_high_log_scale_mode(self):
1330913523 dec_8.update_monitoring_profile_flow_logs(mc_8)
1331013524 self.assertTrue(dec_8.context.get_intermediate("monitoring_addon_postprocessing_required"))
1331113525
13526+ def test_update_monitoring_profile_flow_logs_no_flags_noop(self):
13527+ """Test that update_monitoring_profile_flow_logs is a no-op when no CNL/HLSM flags are specified."""
13528+ dec = AKSPreviewManagedClusterUpdateDecorator(
13529+ self.cmd,
13530+ self.client,
13531+ {},
13532+ CUSTOM_MGMT_AKS_PREVIEW,
13533+ )
13534+ mc = self.models.ManagedCluster(
13535+ location="test_location",
13536+ addon_profiles={
13537+ "omsagent": self.models.ManagedClusterAddonProfile(
13538+ enabled=True,
13539+ config={"enableRetinaNetworkFlags": "True"},
13540+ )
13541+ },
13542+ )
13543+ dec.context.attach_mc(mc)
13544+ dec_mc = dec.update_monitoring_profile_flow_logs(mc)
13545+ # Existing config should remain unchanged
13546+ self.assertEqual(
13547+ dec_mc.addon_profiles["omsagent"].config["enableRetinaNetworkFlags"],
13548+ "True",
13549+ )
13550+ self.assertFalse(
13551+ dec.context.get_intermediate("monitoring_addon_postprocessing_required", default_value=False)
13552+ )
13553+
13554+ def test_update_enable_cnl_with_azure_monitor_logs_on_cluster(self):
13555+ """Test enabling CNL on update when monitoring was enabled via enable_azure_monitor_logs on existing cluster."""
13556+ dec = AKSPreviewManagedClusterUpdateDecorator(
13557+ self.cmd,
13558+ self.client,
13559+ {
13560+ "enable_container_network_logs": True,
13561+ "enable_azure_monitor_logs": True,
13562+ },
13563+ CUSTOM_MGMT_AKS_PREVIEW,
13564+ )
13565+ mc = self.models.ManagedCluster(
13566+ location="test_location",
13567+ network_profile=self.models.ContainerServiceNetworkProfile(
13568+ advanced_networking=self.models.AdvancedNetworking(
13569+ enabled=True,
13570+ ),
13571+ ),
13572+ addon_profiles={
13573+ "omsagent": self.models.ManagedClusterAddonProfile(
13574+ enabled=True,
13575+ )
13576+ },
13577+ )
13578+ dec.context.attach_mc(mc)
13579+ dec_mc = dec.update_monitoring_profile_flow_logs(mc)
13580+ self.assertEqual(
13581+ dec_mc.addon_profiles["omsagent"].config["enableRetinaNetworkFlags"],
13582+ "True",
13583+ )
13584+ self.assertTrue(dec.context.get_intermediate("monitoring_addon_postprocessing_required"))
13585+
13586+ def test_update_cnl_explicit_true_hlsm_with_prerequisites(self):
13587+ """Test enabling CNL + HLSM=True explicitly on update with all prerequisites met."""
13588+ dec = AKSPreviewManagedClusterUpdateDecorator(
13589+ self.cmd,
13590+ self.client,
13591+ {
13592+ "enable_container_network_logs": True,
13593+ "enable_high_log_scale_mode": True,
13594+ },
13595+ CUSTOM_MGMT_AKS_PREVIEW,
13596+ )
13597+ mc = self.models.ManagedCluster(
13598+ location="test_location",
13599+ network_profile=self.models.ContainerServiceNetworkProfile(
13600+ advanced_networking=self.models.AdvancedNetworking(
13601+ enabled=True,
13602+ ),
13603+ ),
13604+ addon_profiles={
13605+ "omsagent": self.models.ManagedClusterAddonProfile(
13606+ enabled=True,
13607+ config={
13608+ CONST_MONITORING_USING_AAD_MSI_AUTH: "true",
13609+ }
13610+ )
13611+ },
13612+ )
13613+ dec.context.attach_mc(mc)
13614+ dec_mc = dec.update_monitoring_profile_flow_logs(mc)
13615+ self.assertEqual(
13616+ dec_mc.addon_profiles["omsagent"].config["enableRetinaNetworkFlags"],
13617+ "True",
13618+ )
13619+ self.assertTrue(dec.context.get_enable_high_log_scale_mode())
13620+ self.assertTrue(dec.context.get_intermediate("monitoring_addon_postprocessing_required"))
13621+
13622+ def test_update_disable_hlsm_standalone_no_postprocessing(self):
13623+ """Test that disabling HLSM standalone (no CNL flag) does not trigger postprocessing."""
13624+ dec = AKSPreviewManagedClusterUpdateDecorator(
13625+ self.cmd,
13626+ self.client,
13627+ {
13628+ "enable_high_log_scale_mode": False,
13629+ },
13630+ CUSTOM_MGMT_AKS_PREVIEW,
13631+ )
13632+ mc = self.models.ManagedCluster(
13633+ location="test_location",
13634+ addon_profiles={
13635+ "omsagent": self.models.ManagedClusterAddonProfile(
13636+ enabled=True,
13637+ config={
13638+ CONST_MONITORING_USING_AAD_MSI_AUTH: "true",
13639+ }
13640+ )
13641+ },
13642+ )
13643+ dec.context.attach_mc(mc)
13644+ dec.update_monitoring_profile_flow_logs(mc)
13645+ self.assertFalse(
13646+ dec.context.get_intermediate("monitoring_addon_postprocessing_required", default_value=False)
13647+ )
13648+
1331213649 def test_update_node_provisioning_profile(self):
1331313650 dec_0 = AKSPreviewManagedClusterUpdateDecorator(
1331413651 self.cmd,
0 commit comments