Skip to content

Commit f80b386

Browse files
committed
{AKS} Fix ACNS update to preserve existing advanced networking settings
The update_network_profile_advanced_networking method was creating a new AdvancedNetworking object on every update, discarding existing sub-properties (observability, security, transit encryption) that the user didn't explicitly specify. This changes the method to modify the existing object in-place, only overwriting fields the user provided. When disabling ACNS, sub-features are explicitly set to disabled to ensure a consistent payload. Signed-off-by: Quang Nguyen <nguyenquang@microsoft.com>
1 parent d443a13 commit f80b386

11 files changed

+4809
-3973
lines changed

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

Lines changed: 69 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -8358,6 +8358,24 @@ def update_network_plugin_settings(self, mc: ManagedCluster) -> ManagedCluster:
83588358

83598359
return mc
83608360

8361+
def _ensure_acns_security(self, acns):
8362+
"""Lazily initialize the ACNS security sub-object."""
8363+
if acns.security is None:
8364+
acns.security = self.models.AdvancedNetworkingSecurity()
8365+
return acns.security
8366+
8367+
def _ensure_acns_observability(self, acns):
8368+
"""Lazily initialize the ACNS observability sub-object."""
8369+
if acns.observability is None:
8370+
acns.observability = self.models.AdvancedNetworkingObservability()
8371+
return acns.observability
8372+
8373+
def _ensure_acns_performance(self, acns):
8374+
"""Lazily initialize the ACNS performance sub-object."""
8375+
if acns.performance is None:
8376+
acns.performance = self.models.AdvancedNetworkingPerformance()
8377+
return acns.performance
8378+
83618379
def update_network_profile_advanced_networking(self, mc: ManagedCluster) -> ManagedCluster:
83628380
"""Update advanced networking settings of network profile for the ManagedCluster object.
83638381
@@ -8367,58 +8385,65 @@ def update_network_profile_advanced_networking(self, mc: ManagedCluster) -> Mana
83678385
acns_advanced_networkpolicies = self.context.get_acns_advanced_networkpolicies()
83688386
(acns_enabled, acns_observability, acns_security, acns_perf_enabled) = self.context.get_acns_enablement_with_perf()
83698387
acns_transit_encryption = self.context.get_acns_transit_encryption_type()
8370-
if acns_enabled is not None:
8371-
acns = self.models.AdvancedNetworking(
8372-
enabled=acns_enabled,
8373-
)
8374-
if acns_observability is not None:
8375-
acns.observability = self.models.AdvancedNetworkingObservability(
8376-
enabled=acns_observability,
8377-
)
8378-
if acns_security is not None:
8379-
acns.security = self.models.AdvancedNetworkingSecurity(
8380-
enabled=acns_security,
8381-
)
8382-
if acns_advanced_networkpolicies is not None:
8383-
if acns.security is None:
8384-
acns.security = self.models.AdvancedNetworkingSecurity(
8385-
advanced_network_policies=acns_advanced_networkpolicies
8386-
)
8387-
else:
8388-
acns.security.advanced_network_policies = acns_advanced_networkpolicies
8389-
if acns_perf_enabled is not None:
8390-
acns.performance = self.models.AdvancedNetworkingPerformance(
8391-
acceleration_mode=self.context.get_acns_datapath_acceleration_mode(),
8392-
)
8393-
elif not acns_enabled:
8394-
acns.performance = self.models.AdvancedNetworkingPerformance(
8395-
acceleration_mode=CONST_ACNS_DATAPATH_ACCELERATION_MODE_NONE,
8396-
)
8397-
elif mc.network_profile.advanced_networking is not None:
8398-
acns.performance = mc.network_profile.advanced_networking.performance
83998388

8400-
if acns_enabled is not None:
8401-
if acns_transit_encryption is not None:
8402-
if acns.security is None:
8403-
acns.security = self.models.AdvancedNetworkingSecurity()
8404-
acns.security.transit_encryption = self.models.AdvancedNetworkingSecurityTransitEncryption(
8405-
type=acns_transit_encryption,
8406-
)
8407-
mc.network_profile.advanced_networking = acns
8408-
elif acns_transit_encryption is not None:
8389+
if acns_enabled is None and acns_transit_encryption is not None:
8390+
# Transit encryption update without --enable-acns requires ACNS already enabled
84098391
if (mc.network_profile.advanced_networking is None or
84108392
not mc.network_profile.advanced_networking.enabled):
84118393
raise MutuallyExclusiveArgumentError(
84128394
"--acns-transit-encryption-type requires ACNS to be enabled on the cluster. "
84138395
"Use --enable-acns together with --acns-transit-encryption-type."
84148396
)
8415-
if mc.network_profile.advanced_networking.security is None:
8416-
mc.network_profile.advanced_networking.security = self.models.AdvancedNetworkingSecurity()
8417-
mc.network_profile.advanced_networking.security.transit_encryption = (
8418-
self.models.AdvancedNetworkingSecurityTransitEncryption(
8419-
type=acns_transit_encryption,
8420-
)
8397+
self._ensure_acns_security(mc.network_profile.advanced_networking).transit_encryption = (
8398+
self.models.AdvancedNetworkingSecurityTransitEncryption(type=acns_transit_encryption)
8399+
)
8400+
return mc
8401+
8402+
if acns_enabled is None:
8403+
return mc
8404+
8405+
# Preserve existing advanced_networking settings, only overwrite fields the user specified
8406+
if mc.network_profile.advanced_networking is None:
8407+
mc.network_profile.advanced_networking = self.models.AdvancedNetworking()
8408+
acns = mc.network_profile.advanced_networking
8409+
8410+
acns.enabled = acns_enabled
8411+
8412+
# When disabling ACNS, explicitly disable sub-features for a consistent payload
8413+
if not acns_enabled:
8414+
if acns.observability is not None:
8415+
acns.observability.enabled = False
8416+
if acns.security is not None:
8417+
acns.security.enabled = False
8418+
if acns_perf_enabled is None:
8419+
self._ensure_acns_performance(acns).acceleration_mode = (
8420+
CONST_ACNS_DATAPATH_ACCELERATION_MODE_NONE
8421+
)
8422+
8423+
# When enabling ACNS, default observability and security to enabled
8424+
# (matching create-path behavior). The RP rejects enabling ACNS when both
8425+
# observability and security are disabled, so we must set safe defaults.
8426+
if acns_enabled:
8427+
if acns_observability is None:
8428+
self._ensure_acns_observability(acns).enabled = True
8429+
if acns_security is None:
8430+
self._ensure_acns_security(acns).enabled = True
8431+
8432+
if acns_observability is not None:
8433+
self._ensure_acns_observability(acns).enabled = acns_observability
8434+
if acns_security is not None:
8435+
self._ensure_acns_security(acns).enabled = acns_security
8436+
if acns_advanced_networkpolicies is not None:
8437+
self._ensure_acns_security(acns).advanced_network_policies = acns_advanced_networkpolicies
8438+
if acns_transit_encryption is not None:
8439+
self._ensure_acns_security(acns).transit_encryption = (
8440+
self.models.AdvancedNetworkingSecurityTransitEncryption(type=acns_transit_encryption)
84218441
)
8442+
if acns_perf_enabled is not None:
8443+
self._ensure_acns_performance(acns).acceleration_mode = (
8444+
self.context.get_acns_datapath_acceleration_mode()
8445+
)
8446+
84228447
return mc
84238448

84248449
def update_monitoring_profile_flow_logs(self, mc: ManagedCluster) -> ManagedCluster:

0 commit comments

Comments
 (0)