5
5
import com .azure .core .management .SubResource ;
6
6
import com .azure .core .util .logging .ClientLogger ;
7
7
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 ;
8
16
import com .azure .resourcemanager .network .models .InboundNatPool ;
9
17
import com .azure .resourcemanager .network .models .LoadBalancer ;
10
18
import com .azure .resourcemanager .network .models .LoadBalancerBackend ;
11
19
import com .azure .resourcemanager .network .models .LoadBalancerFrontend ;
12
20
import com .azure .resourcemanager .network .models .LoadBalancerHttpProbe ;
13
21
import com .azure .resourcemanager .network .models .LoadBalancerInboundNatPool ;
14
22
import com .azure .resourcemanager .network .models .LoadBalancerInboundNatRule ;
23
+ import com .azure .resourcemanager .network .models .LoadBalancerOutboundRule ;
15
24
import com .azure .resourcemanager .network .models .LoadBalancerPrivateFrontend ;
16
25
import com .azure .resourcemanager .network .models .LoadBalancerProbe ;
17
26
import com .azure .resourcemanager .network .models .LoadBalancerPublicFrontend ;
21
30
import com .azure .resourcemanager .network .models .NicIpConfiguration ;
22
31
import com .azure .resourcemanager .network .models .ProbeProtocol ;
23
32
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 ;
31
33
import com .azure .resourcemanager .resources .fluentcore .arm .ResourceUtils ;
32
34
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
+
33
39
import java .util .ArrayList ;
34
40
import java .util .Collections ;
35
41
import java .util .HashMap ;
38
44
import java .util .Map ;
39
45
import java .util .Map .Entry ;
40
46
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 ;
44
48
45
- /** Implementation of the LoadBalancer interface. */
49
+ /**
50
+ * Implementation of the LoadBalancer interface.
51
+ */
46
52
class LoadBalancerImpl
47
53
extends GroupableParentResourceWithTagsImpl <LoadBalancer , LoadBalancerInner , LoadBalancerImpl , NetworkManager >
48
54
implements LoadBalancer , LoadBalancer .Definition , LoadBalancer .Update {
@@ -59,6 +65,7 @@ class LoadBalancerImpl
59
65
private Map <String , LoadBalancerFrontend > frontends ;
60
66
private Map <String , LoadBalancerInboundNatRule > inboundNatRules ;
61
67
private Map <String , LoadBalancerInboundNatPool > inboundNatPools ;
68
+ private Map <String , LoadBalancerOutboundRule > outboundRules ;
62
69
63
70
LoadBalancerImpl (String name , final LoadBalancerInner innerModel , final NetworkManager networkManager ) {
64
71
super (name , innerModel , networkManager );
@@ -106,6 +113,7 @@ protected void initializeChildrenFromInner() {
106
113
initializeLoadBalancingRulesFromInner ();
107
114
initializeInboundNatRulesFromInner ();
108
115
initializeInboundNatPoolsFromInner ();
116
+ initializeOutboundRulesFromInner ();
109
117
}
110
118
111
119
protected LoadBalancerBackendImpl ensureUniqueBackend () {
@@ -248,6 +256,33 @@ protected void beforeCreating() {
248
256
}
249
257
}
250
258
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
+
251
286
// Reset and update load balancing rules
252
287
List <LoadBalancingRuleInner > innerRules = innersFromWrappers (this .loadBalancingRules .values ());
253
288
if (innerRules == null ) {
@@ -419,6 +454,17 @@ private void initializeInboundNatRulesFromInner() {
419
454
}
420
455
}
421
456
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
+
422
468
String futureResourceId () {
423
469
return new StringBuilder ()
424
470
.append (super .resourceIdBase ())
@@ -468,6 +514,13 @@ LoadBalancerImpl withInboundNatPool(LoadBalancerInboundNatPoolImpl inboundNatPoo
468
514
return this ;
469
515
}
470
516
517
+ LoadBalancerImpl withOutboundRule (LoadBalancerOutboundRuleImpl outboundRule ) {
518
+ if (outboundRule != null ) {
519
+ this .outboundRules .put (outboundRule .name (), outboundRule );
520
+ }
521
+ return this ;
522
+ }
523
+
471
524
LoadBalancerImpl withBackend (LoadBalancerBackendImpl backend ) {
472
525
if (backend != null ) {
473
526
this .backends .put (backend .name (), backend );
@@ -748,6 +801,11 @@ public LoadBalancerSkuType sku() {
748
801
return LoadBalancerSkuType .fromSku (this .innerModel ().sku ());
749
802
}
750
803
804
+ @ Override
805
+ public Map <String , LoadBalancerOutboundRule > outboundRules () {
806
+ return Collections .unmodifiableMap (this .outboundRules );
807
+ }
808
+
751
809
@ Override
752
810
public Map <String , LoadBalancerTcpProbe > tcpProbes () {
753
811
return Collections .unmodifiableMap (this .tcpProbes );
@@ -836,4 +894,26 @@ public LoadBalancerPublicFrontend findFrontendByPublicIpAddress(String pipId) {
836
894
public LoadBalancerPublicFrontend findFrontendByPublicIpAddress (PublicIpAddress publicIPAddress ) {
837
895
return (publicIPAddress != null ) ? this .findFrontendByPublicIpAddress (publicIPAddress .id ()) : null ;
838
896
}
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
+ }
839
919
}
0 commit comments