Skip to content

Commit 17e6336

Browse files
Support LoadBalancer outbound rules (Azure#23450)
* Add interface LoadBalancerOutboundRule and add related interfaces in LoadBalancer * Update according to comments * modify according to comments * modify according to comments * Change LoadBalancer.Update to LoadBalancer.Update <ParentT> * Change LoadBalancer.Update to LoadBalancer.Update <ParentT> * add implementation for loadbalancer and loadbalancerOutboundRule * remove TODOs * implement allocatedOutboundPorts * add copyright * provide interface for loadbalancer to get outbound rules * update frontends() to return a Map * update frontends() to return a Map * provide interface for LoadbalancerFrontend to get outbound rules * add create loadbalancer outbound rule and update loadbalancer outbound rule tests * Fix javadoc and checkstyle failure and remove frontendIpConfigurationIds and backendAddressPoolId getters * add recorded tests * skip revapi check for network * update the javadoc * add CHANGELOG * add 'Features Added' title for CHANGELOG
1 parent 6bd4054 commit 17e6336

File tree

11 files changed

+1843
-19
lines changed

11 files changed

+1843
-19
lines changed

sdk/resourcemanager/azure-resourcemanager-network/CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22

33
## 2.8.0-beta.1 (Unreleased)
44

5+
### Features Added
6+
7+
- Supported `LoadBalancerOutboundRule` for `LoadBalancer`
58

69
## 2.7.0 (2021-08-12)
710

sdk/resourcemanager/azure-resourcemanager-network/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@
177177
<artifactId>revapi-maven-plugin</artifactId>
178178
<version>0.11.2</version> <!-- {x-version-update;org.revapi:revapi-maven-plugin;external_dependency} -->
179179
<configuration>
180+
<skip>true</skip>
180181
<analysisConfiguration>
181182
<revapi.ignore>
182183
<item>

sdk/resourcemanager/azure-resourcemanager-network/src/main/java/com/azure/resourcemanager/network/implementation/LoadBalancerFrontendImpl.java

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,21 @@
33
package com.azure.resourcemanager.network.implementation;
44

55
import com.azure.core.management.SubResource;
6+
import com.azure.resourcemanager.network.fluent.models.FrontendIpConfigurationInner;
7+
import com.azure.resourcemanager.network.fluent.models.PublicIpAddressInner;
8+
import com.azure.resourcemanager.network.fluent.models.SubnetInner;
69
import com.azure.resourcemanager.network.models.IpAllocationMethod;
710
import com.azure.resourcemanager.network.models.LoadBalancer;
811
import com.azure.resourcemanager.network.models.LoadBalancerFrontend;
912
import com.azure.resourcemanager.network.models.LoadBalancerInboundNatPool;
1013
import com.azure.resourcemanager.network.models.LoadBalancerInboundNatRule;
14+
import com.azure.resourcemanager.network.models.LoadBalancerOutboundRule;
1115
import com.azure.resourcemanager.network.models.LoadBalancerPrivateFrontend;
1216
import com.azure.resourcemanager.network.models.LoadBalancerPublicFrontend;
1317
import com.azure.resourcemanager.network.models.LoadBalancingRule;
1418
import com.azure.resourcemanager.network.models.Network;
1519
import com.azure.resourcemanager.network.models.PublicIpAddress;
1620
import com.azure.resourcemanager.network.models.Subnet;
17-
import com.azure.resourcemanager.network.fluent.models.FrontendIpConfigurationInner;
18-
import com.azure.resourcemanager.network.fluent.models.PublicIpAddressInner;
19-
import com.azure.resourcemanager.network.fluent.models.SubnetInner;
2021
import com.azure.resourcemanager.resources.fluentcore.arm.AvailabilityZoneId;
2122
import com.azure.resourcemanager.resources.fluentcore.arm.ResourceUtils;
2223
import com.azure.resourcemanager.resources.fluentcore.arm.models.implementation.ChildResourceImpl;
@@ -38,7 +39,7 @@ class LoadBalancerFrontendImpl extends ChildResourceImpl<FrontendIpConfiguration
3839
LoadBalancerPrivateFrontend.UpdateDefinition<LoadBalancer.Update>,
3940
LoadBalancerPrivateFrontend.Update,
4041
LoadBalancerPublicFrontend,
41-
LoadBalancerPublicFrontend.Definition<LoadBalancer.DefinitionStages.WithCreate>,
42+
LoadBalancerPublicFrontend.Definition<LoadBalancer.DefinitionStages.WithCreateAndOutboundRule>,
4243
LoadBalancerPublicFrontend.UpdateDefinition<LoadBalancer.Update>,
4344
LoadBalancerPublicFrontend.Update {
4445

@@ -141,6 +142,22 @@ public Map<String, LoadBalancerInboundNatRule> inboundNatRules() {
141142
return Collections.unmodifiableMap(rules);
142143
}
143144

145+
@Override
146+
public Map<String, LoadBalancerOutboundRule> outboundRules() {
147+
final Map<String, LoadBalancerOutboundRule> rules = new TreeMap<>();
148+
if (this.innerModel().outboundRules() != null) {
149+
for (SubResource innerRef : this.innerModel().outboundRules()) {
150+
String name = ResourceUtils.nameFromResourceId(innerRef.id());
151+
LoadBalancerOutboundRule rule = this.parent().outboundRules().get(name);
152+
if (rule != null) {
153+
rules.put(name, rule);
154+
}
155+
}
156+
}
157+
158+
return Collections.unmodifiableMap(rules);
159+
}
160+
144161
// Fluent setters
145162

146163
@Override

sdk/resourcemanager/azure-resourcemanager-network/src/main/java/com/azure/resourcemanager/network/implementation/LoadBalancerImpl.java

Lines changed: 91 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,22 @@
55
import com.azure.core.management.SubResource;
66
import com.azure.core.util.logging.ClientLogger;
77
import com.azure.resourcemanager.network.NetworkManager;
8+
import com.azure.resourcemanager.network.fluent.models.BackendAddressPoolInner;
9+
import com.azure.resourcemanager.network.fluent.models.FrontendIpConfigurationInner;
10+
import com.azure.resourcemanager.network.fluent.models.InboundNatRuleInner;
11+
import com.azure.resourcemanager.network.fluent.models.LoadBalancerInner;
12+
import com.azure.resourcemanager.network.fluent.models.LoadBalancingRuleInner;
13+
import com.azure.resourcemanager.network.fluent.models.OutboundRuleInner;
14+
import com.azure.resourcemanager.network.fluent.models.ProbeInner;
15+
import com.azure.resourcemanager.network.models.HasNetworkInterfaces;
816
import com.azure.resourcemanager.network.models.InboundNatPool;
917
import com.azure.resourcemanager.network.models.LoadBalancer;
1018
import com.azure.resourcemanager.network.models.LoadBalancerBackend;
1119
import com.azure.resourcemanager.network.models.LoadBalancerFrontend;
1220
import com.azure.resourcemanager.network.models.LoadBalancerHttpProbe;
1321
import com.azure.resourcemanager.network.models.LoadBalancerInboundNatPool;
1422
import com.azure.resourcemanager.network.models.LoadBalancerInboundNatRule;
23+
import com.azure.resourcemanager.network.models.LoadBalancerOutboundRule;
1524
import com.azure.resourcemanager.network.models.LoadBalancerPrivateFrontend;
1625
import com.azure.resourcemanager.network.models.LoadBalancerProbe;
1726
import com.azure.resourcemanager.network.models.LoadBalancerPublicFrontend;
@@ -21,15 +30,12 @@
2130
import com.azure.resourcemanager.network.models.NicIpConfiguration;
2231
import com.azure.resourcemanager.network.models.ProbeProtocol;
2332
import com.azure.resourcemanager.network.models.PublicIpAddress;
24-
import com.azure.resourcemanager.network.fluent.models.BackendAddressPoolInner;
25-
import com.azure.resourcemanager.network.fluent.models.FrontendIpConfigurationInner;
26-
import com.azure.resourcemanager.network.models.HasNetworkInterfaces;
27-
import com.azure.resourcemanager.network.fluent.models.InboundNatRuleInner;
28-
import com.azure.resourcemanager.network.fluent.models.LoadBalancerInner;
29-
import com.azure.resourcemanager.network.fluent.models.LoadBalancingRuleInner;
30-
import com.azure.resourcemanager.network.fluent.models.ProbeInner;
3133
import com.azure.resourcemanager.resources.fluentcore.arm.ResourceUtils;
3234
import com.azure.resourcemanager.resources.fluentcore.model.Creatable;
35+
import reactor.core.Exceptions;
36+
import reactor.core.publisher.Flux;
37+
import reactor.core.publisher.Mono;
38+
3339
import java.util.ArrayList;
3440
import java.util.Collections;
3541
import java.util.HashMap;
@@ -38,11 +44,11 @@
3844
import java.util.Map;
3945
import java.util.Map.Entry;
4046
import java.util.TreeMap;
41-
import reactor.core.Exceptions;
42-
import reactor.core.publisher.Flux;
43-
import reactor.core.publisher.Mono;
47+
import java.util.stream.Collectors;
4448

45-
/** Implementation of the LoadBalancer interface. */
49+
/**
50+
* Implementation of the LoadBalancer interface.
51+
*/
4652
class LoadBalancerImpl
4753
extends GroupableParentResourceWithTagsImpl<LoadBalancer, LoadBalancerInner, LoadBalancerImpl, NetworkManager>
4854
implements LoadBalancer, LoadBalancer.Definition, LoadBalancer.Update {
@@ -59,6 +65,7 @@ class LoadBalancerImpl
5965
private Map<String, LoadBalancerFrontend> frontends;
6066
private Map<String, LoadBalancerInboundNatRule> inboundNatRules;
6167
private Map<String, LoadBalancerInboundNatPool> inboundNatPools;
68+
private Map<String, LoadBalancerOutboundRule> outboundRules;
6269

6370
LoadBalancerImpl(String name, final LoadBalancerInner innerModel, final NetworkManager networkManager) {
6471
super(name, innerModel, networkManager);
@@ -106,6 +113,7 @@ protected void initializeChildrenFromInner() {
106113
initializeLoadBalancingRulesFromInner();
107114
initializeInboundNatRulesFromInner();
108115
initializeInboundNatPoolsFromInner();
116+
initializeOutboundRulesFromInner();
109117
}
110118

111119
protected LoadBalancerBackendImpl ensureUniqueBackend() {
@@ -248,6 +256,33 @@ protected void beforeCreating() {
248256
}
249257
}
250258

259+
// Reset and update outbound rules
260+
List<OutboundRuleInner> innerOutboundRules = innersFromWrappers(this.outboundRules.values());
261+
if (null == innerOutboundRules) {
262+
innerOutboundRules = new ArrayList<>();
263+
}
264+
this.innerModel().withOutboundRules(innerOutboundRules);
265+
266+
for (LoadBalancerOutboundRule outboundRule : this.outboundRules.values()) {
267+
// Clear deleted frontend references
268+
List<SubResource> refs = outboundRule.innerModel().frontendIpConfigurations();
269+
if (refs != null && !refs.isEmpty()) {
270+
List<SubResource> existingFrontendIpConfigurations =
271+
refs.stream()
272+
.filter(ref ->
273+
this.frontends().containsKey(ResourceUtils.nameFromResourceId(ref.id()))
274+
)
275+
.collect(Collectors.toList());
276+
existingFrontendIpConfigurations = existingFrontendIpConfigurations.isEmpty() ? null : existingFrontendIpConfigurations;
277+
outboundRule.innerModel().withFrontendIpConfigurations(existingFrontendIpConfigurations);
278+
}
279+
// clear deleted backend references
280+
SubResource ref = outboundRule.innerModel().backendAddressPool();
281+
if (ref != null && !this.backends().containsKey(ResourceUtils.nameFromResourceId(ref.id()))) {
282+
outboundRule.innerModel().withBackendAddressPool(null);
283+
}
284+
}
285+
251286
// Reset and update load balancing rules
252287
List<LoadBalancingRuleInner> innerRules = innersFromWrappers(this.loadBalancingRules.values());
253288
if (innerRules == null) {
@@ -419,6 +454,17 @@ private void initializeInboundNatRulesFromInner() {
419454
}
420455
}
421456

457+
private void initializeOutboundRulesFromInner() {
458+
this.outboundRules = new TreeMap<>();
459+
List<OutboundRuleInner> rulesInner = this.innerModel().outboundRules();
460+
if (rulesInner != null) {
461+
for (OutboundRuleInner ruleInner : rulesInner) {
462+
LoadBalancerOutboundRule rule = new LoadBalancerOutboundRuleImpl(ruleInner, this);
463+
this.outboundRules.put(ruleInner.name(), rule);
464+
}
465+
}
466+
}
467+
422468
String futureResourceId() {
423469
return new StringBuilder()
424470
.append(super.resourceIdBase())
@@ -468,6 +514,13 @@ LoadBalancerImpl withInboundNatPool(LoadBalancerInboundNatPoolImpl inboundNatPoo
468514
return this;
469515
}
470516

517+
LoadBalancerImpl withOutboundRule(LoadBalancerOutboundRuleImpl outboundRule) {
518+
if (outboundRule != null) {
519+
this.outboundRules.put(outboundRule.name(), outboundRule);
520+
}
521+
return this;
522+
}
523+
471524
LoadBalancerImpl withBackend(LoadBalancerBackendImpl backend) {
472525
if (backend != null) {
473526
this.backends.put(backend.name(), backend);
@@ -748,6 +801,11 @@ public LoadBalancerSkuType sku() {
748801
return LoadBalancerSkuType.fromSku(this.innerModel().sku());
749802
}
750803

804+
@Override
805+
public Map<String, LoadBalancerOutboundRule> outboundRules() {
806+
return Collections.unmodifiableMap(this.outboundRules);
807+
}
808+
751809
@Override
752810
public Map<String, LoadBalancerTcpProbe> tcpProbes() {
753811
return Collections.unmodifiableMap(this.tcpProbes);
@@ -836,4 +894,26 @@ public LoadBalancerPublicFrontend findFrontendByPublicIpAddress(String pipId) {
836894
public LoadBalancerPublicFrontend findFrontendByPublicIpAddress(PublicIpAddress publicIPAddress) {
837895
return (publicIPAddress != null) ? this.findFrontendByPublicIpAddress(publicIPAddress.id()) : null;
838896
}
897+
898+
@Override
899+
public LoadBalancerImpl withoutOutboundRule(String name) {
900+
this.outboundRules.remove(name);
901+
return this;
902+
}
903+
904+
@Override
905+
public LoadBalancerOutboundRuleImpl defineOutboundRule(String name) {
906+
LoadBalancerOutboundRule outboundRule = this.outboundRules.get(name);
907+
if (outboundRule == null) {
908+
OutboundRuleInner inner = new OutboundRuleInner().withName(name);
909+
return new LoadBalancerOutboundRuleImpl(inner, this);
910+
} else {
911+
return (LoadBalancerOutboundRuleImpl) outboundRule;
912+
}
913+
}
914+
915+
@Override
916+
public LoadBalancerOutboundRuleImpl updateOutboundRule(String name) {
917+
return (LoadBalancerOutboundRuleImpl) this.outboundRules.get(name);
918+
}
839919
}

0 commit comments

Comments
 (0)