Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix DeleteOptions on Public Ip Address (issue#38806) #39096

Merged
merged 12 commits into from
Mar 27, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,5 @@
"AssetsRepo": "Azure/azure-sdk-assets",
"AssetsRepoPrefixPath": "java",
"TagPrefix": "java/resourcemanager/azure-resourcemanager-network",
"Tag": "java/resourcemanager/azure-resourcemanager-network_271269e41a"
"Tag": "java/resourcemanager/azure-resourcemanager-network_3b15fe745d"
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.azure.resourcemanager.network.NetworkManager;
import com.azure.resourcemanager.network.fluent.models.ApplicationSecurityGroupInner;
import com.azure.resourcemanager.network.models.ApplicationSecurityGroup;
import com.azure.resourcemanager.network.models.DeleteOptions;
import com.azure.resourcemanager.network.models.IpAllocationMethod;
import com.azure.resourcemanager.network.models.LoadBalancer;
import com.azure.resourcemanager.network.models.Network;
Expand All @@ -29,13 +30,18 @@
import com.azure.resourcemanager.resources.fluentcore.arm.models.Resource;
import com.azure.resourcemanager.resources.fluentcore.model.Creatable;

import java.util.Arrays;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.TreeMap;
import java.util.Set;
import java.util.stream.Collectors;

import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
Expand All @@ -60,6 +66,11 @@ class NetworkInterfaceImpl
private NetworkSecurityGroup existingNetworkSecurityGroupToAssociate;
/** cached related resources. */
private NetworkSecurityGroup networkSecurityGroup;
/** the delete option of public ip address */
private DeleteOptions publicIpAddressDeleteOption;
/** the name of specified ip config name */
private Map<DeleteOptions, Set<String>> specifiedIpConfigNames;
private boolean isInUpdateIpConfigMode = false;
v-hongli1 marked this conversation as resolved.
Show resolved Hide resolved

NetworkInterfaceImpl(String name, NetworkInterfaceInner innerModel, final NetworkManager networkManager) {
super(name, innerModel, networkManager);
Expand Down Expand Up @@ -141,18 +152,21 @@ public NetworkInterfaceImpl withExistingPrimaryNetwork(Network network) {

@Override
public NetworkInterfaceImpl withNewPrimaryPublicIPAddress(Creatable<PublicIpAddress> creatable) {
this.isInUpdateIpConfigMode = true;
this.primaryIPConfiguration().withNewPublicIpAddress(creatable);
return this;
}

@Override
public NetworkInterfaceImpl withNewPrimaryPublicIPAddress() {
this.isInUpdateIpConfigMode = true;
this.primaryIPConfiguration().withNewPublicIpAddress();
return this;
}

@Override
public NetworkInterfaceImpl withNewPrimaryPublicIPAddress(String leafDnsLabel) {
this.isInUpdateIpConfigMode = true;
this.primaryIPConfiguration().withNewPublicIpAddress(leafDnsLabel);
return this;
}
Expand Down Expand Up @@ -196,6 +210,7 @@ public NetworkInterfaceImpl withoutPrimaryPublicIPAddress() {
public NetworkInterfaceImpl withExistingPrimaryPublicIPAddress(PublicIpAddress publicIPAddress) {
this.primaryIPConfiguration().withExistingPublicIpAddress(publicIPAddress);
this.primaryIPConfiguration().withPrivateIpVersion(publicIPAddress.version());
this.isInUpdateIpConfigMode = true;
return this;
}

Expand Down Expand Up @@ -252,6 +267,7 @@ public NetworkInterfaceImpl withoutApplicationSecurityGroup(String applicationSe

@Override
public NicIpConfigurationImpl defineSecondaryIPConfiguration(String name) {
this.isInUpdateIpConfigMode = true;
NicIpConfigurationImpl nicIpConfiguration = prepareNewNicIPConfiguration(name);

// copy application security group from primary to secondary,
Expand All @@ -268,6 +284,7 @@ public NicIpConfigurationImpl defineSecondaryIPConfiguration(String name) {

@Override
public NicIpConfigurationImpl updateIPConfiguration(String name) {
this.isInUpdateIpConfigMode = true;
return (NicIpConfigurationImpl) this.nicIPConfigurations.get(name);
}

Expand Down Expand Up @@ -565,7 +582,43 @@ protected void beforeCreating() {

NicIpConfigurationImpl.ensureConfigurations(this.nicIPConfigurations.values());

if (Objects.nonNull(this.specifiedIpConfigNames)) {
NicIpConfigurationImpl.deleteOptionConfigurations(this.nicIPConfigurations.values(), this.specifiedIpConfigNames);
this.isInUpdateIpConfigMode = false;
}

// Reset and update IP configs
this.innerModel().withIpConfigurations(innersFromWrappers(this.nicIPConfigurations.values()));
}

@Override
public NetworkInterfaceImpl withPublicIPAddressDeleteOptions(DeleteOptions deleteOptions, String... ipConfigNames) {
Set<String> ipConfigNameSet = Arrays.stream(ipConfigNames).map(ipConfigName -> ipConfigName.toLowerCase(Locale.ROOT)).collect(Collectors.toSet());
if (!isInCreateMode() && !isInUpdateIpConfigMode) {
this.nicIPConfigurations.values()
.stream().filter(nicIpConfiguration ->
(ipConfigNameSet.isEmpty() || ipConfigNameSet.contains(nicIpConfiguration.name().toLowerCase(Locale.ROOT)))
v-hongli1 marked this conversation as resolved.
Show resolved Hide resolved
&& Objects.nonNull(nicIpConfiguration.innerModel().publicIpAddress()))
.forEach(nicIpConfiguration -> {
nicIpConfiguration.innerModel().publicIpAddress().withDeleteOption(deleteOptions);
});
} else {
if (Objects.isNull(this.specifiedIpConfigNames)) {
this.specifiedIpConfigNames = new LinkedHashMap<>();
}
if (this.specifiedIpConfigNames.containsKey(deleteOptions)) {
this.specifiedIpConfigNames.get(deleteOptions).addAll(ipConfigNameSet);
} else {
this.specifiedIpConfigNames.put(deleteOptions, ipConfigNameSet);
}
}
return this;
}

@Override
public NetworkInterfaceImpl update() {
this.specifiedIpConfigNames = new LinkedHashMap<>();
this.isInUpdateIpConfigMode = false;
return super.update();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import com.azure.resourcemanager.network.models.ApplicationGateway;
import com.azure.resourcemanager.network.models.ApplicationGatewayBackendAddressPool;
import com.azure.resourcemanager.network.models.ApplicationSecurityGroup;
import com.azure.resourcemanager.network.models.DeleteOptions;
import com.azure.resourcemanager.network.models.IpAllocationMethod;
import com.azure.resourcemanager.network.models.IpVersion;
import com.azure.resourcemanager.network.models.LoadBalancer;
Expand All @@ -27,8 +28,11 @@

import java.util.ArrayList;
import java.util.Collection;
import java.util.Locale;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;

/** Implementation for NicIPConfiguration and its create and update interfaces. */
class NicIpConfigurationImpl extends NicIpConfigurationBaseImpl<NetworkInterfaceImpl, NetworkInterface>
Expand Down Expand Up @@ -265,6 +269,23 @@ protected static void ensureConfigurations(Collection<NicIpConfiguration> nicIPC
}
}

protected static void deleteOptionConfigurations(Collection<NicIpConfiguration> nicIPConfigurations, Map<DeleteOptions, Set<String>> specifiedIpConfigNames) {
if (!specifiedIpConfigNames.isEmpty()) {
specifiedIpConfigNames.keySet().forEach(deleteOptions -> {
Set<String> ipConfigNameSet = specifiedIpConfigNames.get(deleteOptions);
if (!ipConfigNameSet.isEmpty()) {
nicIPConfigurations
.stream().filter(nicIpConfig -> ipConfigNameSet.contains(nicIpConfig.name().toLowerCase(Locale.ROOT))
&& Objects.nonNull(nicIpConfig.innerModel().publicIpAddress()))
.forEach(nicIpConfig -> nicIpConfig.innerModel().publicIpAddress().withDeleteOption(deleteOptions));
} else {
nicIPConfigurations.stream().filter(nicIpConfig -> Objects.nonNull(nicIpConfig.innerModel().publicIpAddress()))
.forEach(nicIpConfig -> nicIpConfig.innerModel().publicIpAddress().withDeleteOption(deleteOptions));
}
});
}
}

// Creates a creatable public IP address definition with the given name and DNS label.
private Creatable<PublicIpAddress> prepareCreatablePublicIP(String name, String leafDnsLabel) {
PublicIpAddress.DefinitionStages.WithGroup definitionWithGroup =
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -256,6 +256,18 @@ interface WithAcceleratedNetworking {
WithCreate withAcceleratedNetworking();
}

/** The stage of the definition allowing to specify delete options for the public ip address. */
interface WithPublicIPAddressDeleteOptions {
/**
* Sets delete options for public ip address.
*
* @param deleteOptions the delete options for primary network interfaces
* @param ipConfigNames the names of specified ip configurations
* @return the next stage of the update
*/
WithCreate withPublicIPAddressDeleteOptions(DeleteOptions deleteOptions, String... ipConfigNames);
}

/**
* The stage of the network interface definition which contains all the minimum required inputs for the resource
* to be created, but also allows for any other optional settings to be specified.
Expand All @@ -268,7 +280,8 @@ interface WithCreate
WithSecondaryIPConfiguration,
WithAcceleratedNetworking,
WithLoadBalancer,
WithApplicationSecurityGroup {
WithApplicationSecurityGroup,
WithPublicIPAddressDeleteOptions {
/**
* Enables IP forwarding in the network interface.
*
Expand Down Expand Up @@ -576,6 +589,18 @@ interface WithLoadBalancer {
*/
Update withoutLoadBalancerInboundNatRules();
}

/** Th stage of the network interface update allowing to specify delete options for the public ip address. */
interface WithPublicIPAddressDeleteOptions {
/**
* Sets delete options for public ip address.
*
* @param deleteOptions the delete options for primary network interfaces
* @param ipConfigNames the names of specified ip configurations
* @return the next stage of the update
*/
Update withPublicIPAddressDeleteOptions(DeleteOptions deleteOptions, String... ipConfigNames);
}
}

/** The template for an update operation, containing all the settings that can be modified. */
Expand All @@ -591,6 +616,7 @@ interface Update
UpdateStages.WithIPConfiguration,
UpdateStages.WithLoadBalancer,
UpdateStages.WithAcceleratedNetworking,
UpdateStages.WithApplicationSecurityGroup {
UpdateStages.WithApplicationSecurityGroup,
UpdateStages.WithPublicIPAddressDeleteOptions {
}
}
Loading