Skip to content

Commit bd8bba3

Browse files
committed
Add container_network_logs flag
1 parent 7979d03 commit bd8bba3

8 files changed

Lines changed: 443 additions & 22 deletions

File tree

src/azure-cli/azure/cli/command_modules/acs/_help.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -329,7 +329,7 @@
329329
short-summary: Resource ID of Azure Monitor Private Link scope for Monitoring Addon.
330330
- name: --enable-high-log-scale-mode
331331
type: bool
332-
short-summary: Enable High Log Scale Mode for Container Logs.
332+
short-summary: Enable High Log Scale Mode for Container Logs. Auto-enabled when --enable-container-network-logs is specified.
333333
- name: --sku
334334
type: string
335335
short-summary: Specify SKU name for managed clusters. Use '--sku base' enables a base managed cluster. Use '--sku automatic' enables an automatic managed cluster.
@@ -588,6 +588,9 @@
588588
- name: --acns-advanced-networkpolicies
589589
type: string
590590
short-summary: Enable advanced network policies (None, FQDN or L7) on a cluster when enabling advanced networking features with "--enable-acns".
591+
- name: --enable-container-network-logs
592+
type: bool
593+
short-summary: Enable container network log collection functionalities on a cluster. Automatically enables --enable-high-log-scale-mode.
591594
- name: --nrg-lockdown-restriction-level
592595
type: string
593596
short-summary: Restriction level on the managed node resource group.
@@ -1089,6 +1092,12 @@
10891092
- name: --acns-advanced-networkpolicies
10901093
type: string
10911094
short-summary: Enable advanced network policies (None, FQDN or L7) on a cluster when enabling advanced networking features with "--enable-acns".
1095+
- name: --enable-container-network-logs
1096+
type: bool
1097+
short-summary: Enable container network log collection functionalities on a cluster. Automatically enables --enable-high-log-scale-mode.
1098+
- name: --disable-container-network-logs
1099+
type: bool
1100+
short-summary: Disable container network log collection functionalities on a cluster.
10921101
- name: --nrg-lockdown-restriction-level
10931102
type: string
10941103
short-summary: Restriction level on the managed node resource group.
@@ -1261,7 +1270,7 @@
12611270
short-summary: Resource ID of Azure Monitor Private Link scope for Monitoring Addon.
12621271
- name: --enable-high-log-scale-mode
12631272
type: bool
1264-
short-summary: Enable High Log Scale Mode for Container Logs.
1273+
short-summary: Enable High Log Scale Mode for Container Logs. Auto-enabled when --enable-container-network-logs is specified.
12651274
- name: --appgw-name
12661275
type: string
12671276
short-summary: Name of the application gateway to create/use in the node resource group. Use with ingress-azure addon.

src/azure-cli/azure/cli/command_modules/acs/_params.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -604,6 +604,7 @@ def load_arguments(self, _):
604604
c.argument('disable_acns_observability', action='store_true')
605605
c.argument('disable_acns_security', action='store_true')
606606
c.argument("acns_advanced_networkpolicies", arg_type=get_enum_type(advanced_networkpolicies))
607+
c.argument('enable_container_network_logs', action='store_true')
607608
c.argument("if_match")
608609
c.argument("if_none_match")
609610
# node provisioning
@@ -661,6 +662,8 @@ def load_arguments(self, _):
661662
c.argument('disable_acns_observability', action='store_true')
662663
c.argument('disable_acns_security', action='store_true')
663664
c.argument("acns_advanced_networkpolicies", arg_type=get_enum_type(advanced_networkpolicies))
665+
c.argument('enable_container_network_logs', action='store_true')
666+
c.argument('disable_container_network_logs', action='store_true')
664667
# private cluster parameters
665668
c.argument('enable_apiserver_vnet_integration', action='store_true')
666669
c.argument('apiserver_subnet_id', validator=validate_apiserver_subnet_id)

src/azure-cli/azure/cli/command_modules/acs/addonconfiguration.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,7 @@
198198
"Microsoft-ContainerInventory",
199199
"Microsoft-ContainerNodeInventory",
200200
"Microsoft-Perf",
201+
"Microsoft-ContainerNetworkLogs",
201202
]
202203

203204

src/azure-cli/azure/cli/command_modules/acs/custom.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -934,17 +934,18 @@ def aks_create(
934934
disable_acns_observability=None,
935935
disable_acns_security=None,
936936
acns_advanced_networkpolicies=None,
937+
enable_container_network_logs=None,
937938
# network isoalted cluster
938939
bootstrap_artifact_source=CONST_ARTIFACT_SOURCE_DIRECT,
939940
bootstrap_container_registry_resource_id=None,
940941
# addons
941942
enable_addons=None,
942943
workspace_resource_id=None,
943944
enable_msi_auth_for_monitoring=True,
944-
enable_syslog=False,
945+
enable_syslog=None,
945946
data_collection_settings=None,
946947
ampls_resource_id=None,
947-
enable_high_log_scale_mode=False,
948+
enable_high_log_scale_mode=None,
948949
aci_subnet_name=None,
949950
appgw_name=None,
950951
appgw_subnet_cidr=None,
@@ -1161,6 +1162,8 @@ def aks_update(
11611162
disable_acns_observability=None,
11621163
disable_acns_security=None,
11631164
acns_advanced_networkpolicies=None,
1165+
enable_container_network_logs=None,
1166+
disable_container_network_logs=None,
11641167
# network isoalted cluster
11651168
bootstrap_artifact_source=None,
11661169
bootstrap_container_registry_resource_id=None,
@@ -1557,10 +1560,10 @@ def aks_enable_addons(cmd, client, resource_group_name, name, addons,
15571560
enable_secret_rotation=False,
15581561
rotation_poll_interval=None,
15591562
enable_msi_auth_for_monitoring=True,
1560-
enable_syslog=False,
1563+
enable_syslog=None,
15611564
data_collection_settings=None,
15621565
ampls_resource_id=None,
1563-
enable_high_log_scale_mode=False,
1566+
enable_high_log_scale_mode=None,
15641567
no_wait=False,):
15651568
instance = client.get(resource_group_name, name)
15661569
msi_auth = False

src/azure-cli/azure/cli/command_modules/acs/linter_exclusions.yml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,9 @@ aks create:
9191
enable_static_egress_gateway:
9292
rule_exclusions:
9393
- option_length_too_long
94+
enable_container_network_logs:
95+
rule_exclusions:
96+
- option_length_too_long
9497
aks enable-addons:
9598
parameters:
9699
appgw_watch_namespace:
@@ -209,6 +212,12 @@ aks update:
209212
disable_static_egress_gateway:
210213
rule_exclusions:
211214
- option_length_too_long
215+
enable_container_network_logs:
216+
rule_exclusions:
217+
- option_length_too_long
218+
disable_container_network_logs:
219+
rule_exclusions:
220+
- option_length_too_long
212221
aks nodepool add:
213222
parameters:
214223
disable_windows_outbound_nat:

src/azure-cli/azure/cli/command_modules/acs/managed_cluster_decorator.py

Lines changed: 118 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2593,6 +2593,81 @@ def get_acns_advanced_networkpolicies(self) -> Union[str, None]:
25932593
)
25942594
return self.raw_param.get("acns_advanced_networkpolicies")
25952595

2596+
def get_container_network_logs(self, mc: ManagedCluster) -> Union[bool, None]:
2597+
"""Get the enablement of container network logs
2598+
2599+
:return: bool or None"""
2600+
enable_cnl = (
2601+
self.raw_param.get("enable_container_network_logs")
2602+
)
2603+
disable_cnl = (
2604+
self.raw_param.get("disable_container_network_logs")
2605+
)
2606+
if enable_cnl is None and disable_cnl is None:
2607+
return None
2608+
if enable_cnl and disable_cnl:
2609+
raise MutuallyExclusiveArgumentError(
2610+
"Cannot specify --enable-container-network-logs and "
2611+
"--disable-container-network-logs at the same time."
2612+
)
2613+
if enable_cnl:
2614+
# Check if ACNS is enabled (either via parameter or already on the cluster)
2615+
acns_enabled = (
2616+
self.raw_param.get("enable_acns", False) or
2617+
(mc.network_profile and mc.network_profile.advanced_networking and
2618+
mc.network_profile.advanced_networking.enabled)
2619+
)
2620+
# Check if monitoring is enabled (either via parameter or already on the cluster)
2621+
enable_addons = self.raw_param.get("enable_addons", "")
2622+
monitoring_being_enabled = "monitoring" in enable_addons if enable_addons else False
2623+
monitoring_already_enabled = (
2624+
mc.addon_profiles and
2625+
mc.addon_profiles.get("omsagent") and
2626+
mc.addon_profiles["omsagent"].enabled
2627+
)
2628+
monitoring_enabled = monitoring_being_enabled or monitoring_already_enabled
2629+
2630+
if not acns_enabled or not monitoring_enabled:
2631+
raise InvalidArgumentValueError(
2632+
"Container network logs requires '--enable-acns', advanced networking "
2633+
"to be enabled, and the monitoring addon to be enabled."
2634+
)
2635+
enable_cnl = bool(enable_cnl) if enable_cnl is not None else False
2636+
disable_cnl = bool(disable_cnl) if disable_cnl is not None else False
2637+
return enable_cnl or not disable_cnl
2638+
2639+
def get_enable_high_log_scale_mode(self) -> Union[bool, None]:
2640+
"""Obtain the value of enable_high_log_scale_mode.
2641+
2642+
This method automatically enables high log scale mode when container network logs are enabled.
2643+
It validates that the user has not explicitly disabled high log scale mode when CNL is enabled.
2644+
2645+
Note: ACNS and monitoring addon validation is handled in get_container_network_logs().
2646+
2647+
:return: bool or None
2648+
"""
2649+
# Read the original value passed by the command
2650+
enable_high_log_scale_mode = self.raw_param.get("enable_high_log_scale_mode")
2651+
2652+
# Check if container network logs are being enabled
2653+
enable_container_network_logs = self.raw_param.get("enable_container_network_logs")
2654+
2655+
# If container network logs are being enabled, auto-enable high log scale mode
2656+
if enable_container_network_logs:
2657+
# If user explicitly set enable_high_log_scale_mode to False, raise an error
2658+
if enable_high_log_scale_mode is False:
2659+
raise MutuallyExclusiveArgumentError(
2660+
"Cannot explicitly disable --enable-high-log-scale-mode when "
2661+
"--enable-container-network-logs is specified. Container network logs "
2662+
"requires high log scale mode to be enabled."
2663+
)
2664+
2665+
# Auto-enable high log scale mode
2666+
return True
2667+
2668+
# If container network logs are not being enabled, return the original value
2669+
return enable_high_log_scale_mode
2670+
25962671
def _get_pod_cidr_and_service_cidr_and_dns_service_ip_and_docker_bridge_address_and_network_policy(
25972672
self, enable_validation: bool = False
25982673
) -> Tuple[
@@ -3025,21 +3100,6 @@ def get_enable_syslog(self) -> Union[bool, None]:
30253100
# this parameter does not need validation
30263101
return enable_syslog
30273102

3028-
def get_enable_high_log_scale_mode(self) -> Union[bool, None]:
3029-
"""Obtain the value of enable_high_log_scale_mode.
3030-
3031-
Note: The arg type of this parameter supports three states (True, False or None), but the corresponding default
3032-
value in entry function is not None.
3033-
3034-
:return: bool or None
3035-
"""
3036-
# read the original value passed by the command
3037-
enable_high_log_scale_mode = self.raw_param.get("enable_high_log_scale_mode")
3038-
3039-
# this parameter does not need dynamic completion
3040-
# this parameter does not need validation
3041-
return enable_high_log_scale_mode
3042-
30433103
def get_data_collection_settings(self) -> Union[str, None]:
30443104
"""Obtain the value of data_collection_settings.
30453105
@@ -6657,6 +6717,22 @@ def set_up_addon_profiles(self, mc: ManagedCluster) -> ManagedCluster:
66576717
addon_profiles[
66586718
CONST_AZURE_KEYVAULT_SECRETS_PROVIDER_ADDON_NAME
66596719
] = self.build_azure_keyvault_secrets_provider_addon_profile()
6720+
6721+
# Set up container network logs if enabled
6722+
container_network_logs_enabled = self.context.get_container_network_logs(mc)
6723+
if container_network_logs_enabled is not None:
6724+
monitoring_addon_profile = addon_profiles.get(CONST_MONITORING_ADDON_NAME)
6725+
if monitoring_addon_profile:
6726+
config = monitoring_addon_profile.config or {}
6727+
config["enableRetinaNetworkFlags"] = str(container_network_logs_enabled)
6728+
monitoring_addon_profile.config = config
6729+
6730+
# Trigger validation for high log scale mode when container network logs are enabled.
6731+
# This ensures proper error messages are raised before cluster creation if the user
6732+
# explicitly disables high log scale mode while enabling container network logs.
6733+
if self.context.raw_param.get("enable_container_network_logs"):
6734+
self.context.get_enable_high_log_scale_mode()
6735+
66606736
mc.addon_profiles = addon_profiles
66616737
return mc
66626738

@@ -8233,6 +8309,31 @@ def update_network_profile_advanced_networking(self, mc: ManagedCluster) -> Mana
82338309
mc.network_profile.advanced_networking = acns
82348310
return mc
82358311

8312+
def update_monitoring_profile_flow_logs(self, mc: ManagedCluster) -> ManagedCluster:
8313+
"""Update monitor profile for the ManagedCluster object for flow logs.
8314+
8315+
:return: the ManagedCluster object
8316+
"""
8317+
self._ensure_mc(mc)
8318+
8319+
# Trigger validation for high log scale mode when container network logs are enabled.
8320+
# This ensures proper error messages are raised before cluster update if the user
8321+
# explicitly disables high log scale mode while enabling container network logs.
8322+
if self.context.raw_param.get("enable_container_network_logs"):
8323+
self.context.get_enable_high_log_scale_mode()
8324+
8325+
container_network_logs_enabled = self.context.get_container_network_logs(mc)
8326+
if container_network_logs_enabled is not None:
8327+
if mc.addon_profiles:
8328+
addon_consts = self.context.get_addon_consts()
8329+
CONST_MONITORING_ADDON_NAME = addon_consts.get("CONST_MONITORING_ADDON_NAME")
8330+
monitoring_addon_profile = mc.addon_profiles.get(CONST_MONITORING_ADDON_NAME)
8331+
if monitoring_addon_profile:
8332+
config = monitoring_addon_profile.config or {}
8333+
config["enableRetinaNetworkFlags"] = str(container_network_logs_enabled)
8334+
mc.addon_profiles[CONST_MONITORING_ADDON_NAME].config = config
8335+
return mc
8336+
82368337
def update_http_proxy_config(self, mc: ManagedCluster) -> ManagedCluster:
82378338
"""Set up http proxy config for the ManagedCluster object.
82388339
@@ -9518,6 +9619,8 @@ def update_mc_profile_default(self) -> ManagedCluster:
95189619
mc = self.update_network_profile(mc)
95199620
# update network profile with acns
95209621
mc = self.update_network_profile_advanced_networking(mc)
9622+
# update monitoring profile flow logs
9623+
mc = self.update_monitoring_profile_flow_logs(mc)
95219624
# update aad profile
95229625
mc = self.update_aad_profile(mc)
95239626
# update oidc issuer profile

src/azure-cli/azure/cli/command_modules/acs/tests/latest/test_aks_commands.py

Lines changed: 50 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13162,7 +13162,56 @@ def test_aks_create_with_enable_acns_complex(
1316213162
"aks delete -g {resource_group} -n {name} --yes --no-wait",
1316313163
checks=[self.is_empty()],
1316413164
)
13165-
13165+
13166+
@live_only()
13167+
@AllowLargeResponse()
13168+
@AKSCustomResourceGroupPreparer(
13169+
random_name_length=17,
13170+
name_prefix="clitest",
13171+
location="eastus2euap",
13172+
)
13173+
def test_aks_create_acns_with_flow_logs(
13174+
self, resource_group, resource_group_location
13175+
):
13176+
# reset the count so in replay mode the random names will start with 0
13177+
self.test_resources_count = 0
13178+
# kwargs for string formatting
13179+
aks_name = self.create_random_name("cliakstest", 16)
13180+
self.kwargs.update(
13181+
{
13182+
"resource_group": resource_group,
13183+
"name": aks_name,
13184+
"location": resource_group_location,
13185+
"resource_type": "Microsoft.ContainerService/ManagedClusters",
13186+
"ssh_key_value": self.generate_ssh_keys(),
13187+
}
13188+
)
13189+
13190+
# create: enable acns with enable container network logs and enable high log scale mode
13191+
create_cmd = (
13192+
"aks create --resource-group={resource_group} --name={name} --location={location} "
13193+
"--ssh-key-value={ssh_key_value} --node-count=1 --tier standard "
13194+
"--network-plugin azure --network-dataplane=cilium --network-plugin-mode overlay "
13195+
"--enable-acns "
13196+
"--enable-container-network-logs "
13197+
"--enable-addons monitoring "
13198+
"--enable-high-log-scale-mode "
13199+
"--aks-custom-headers AKSHTTPCustomFeatures=Microsoft.ContainerService/AdvancedNetworkingPreview "
13200+
)
13201+
self.cmd(
13202+
create_cmd,
13203+
checks=[
13204+
self.check("provisioningState", "Succeeded"),
13205+
self.check("networkProfile.advancedNetworking.observability.enabled", True),
13206+
],
13207+
)
13208+
13209+
# delete
13210+
self.cmd(
13211+
"aks delete -g {resource_group} -n {name} --yes --no-wait",
13212+
checks=[self.is_empty()],
13213+
)
13214+
1316613215
@AllowLargeResponse()
1316713216
@AKSCustomResourceGroupPreparer(
1316813217
random_name_length=17,

0 commit comments

Comments
 (0)