55import com .azure .core .management .SubResource ;
66import com .azure .core .util .logging .ClientLogger ;
77import 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 ;
816import com .azure .resourcemanager .network .models .InboundNatPool ;
917import com .azure .resourcemanager .network .models .LoadBalancer ;
1018import com .azure .resourcemanager .network .models .LoadBalancerBackend ;
1119import com .azure .resourcemanager .network .models .LoadBalancerFrontend ;
1220import com .azure .resourcemanager .network .models .LoadBalancerHttpProbe ;
1321import com .azure .resourcemanager .network .models .LoadBalancerInboundNatPool ;
1422import com .azure .resourcemanager .network .models .LoadBalancerInboundNatRule ;
23+ import com .azure .resourcemanager .network .models .LoadBalancerOutboundRule ;
1524import com .azure .resourcemanager .network .models .LoadBalancerPrivateFrontend ;
1625import com .azure .resourcemanager .network .models .LoadBalancerProbe ;
1726import com .azure .resourcemanager .network .models .LoadBalancerPublicFrontend ;
2130import com .azure .resourcemanager .network .models .NicIpConfiguration ;
2231import com .azure .resourcemanager .network .models .ProbeProtocol ;
2332import 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 ;
3133import com .azure .resourcemanager .resources .fluentcore .arm .ResourceUtils ;
3234import 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+
3339import java .util .ArrayList ;
3440import java .util .Collections ;
3541import java .util .HashMap ;
3844import java .util .Map ;
3945import java .util .Map .Entry ;
4046import 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+ */
4652class 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