44
44
import com .cloud .network .Networks ;
45
45
import com .cloud .network .PhysicalNetworkServiceProvider ;
46
46
import com .cloud .network .PublicIpAddress ;
47
+ import com .cloud .network .VirtualRouterProvider ;
47
48
import com .cloud .network .dao .IPAddressDao ;
48
49
import com .cloud .network .dao .IPAddressVO ;
49
50
import com .cloud .network .dao .LoadBalancerVMMapDao ;
50
51
import com .cloud .network .dao .LoadBalancerVMMapVO ;
51
52
import com .cloud .network .dao .NetworkDao ;
52
53
import com .cloud .network .dao .NetworkVO ;
53
54
import com .cloud .network .dao .PhysicalNetworkDao ;
55
+ import com .cloud .network .dao .PhysicalNetworkServiceProviderDao ;
54
56
import com .cloud .network .dao .PhysicalNetworkVO ;
57
+ import com .cloud .network .dao .VirtualRouterProviderDao ;
55
58
import com .cloud .network .element .DhcpServiceProvider ;
56
59
import com .cloud .network .element .DnsServiceProvider ;
57
60
import com .cloud .network .element .FirewallServiceProvider ;
60
63
import com .cloud .network .element .NetworkACLServiceProvider ;
61
64
import com .cloud .network .element .PortForwardingServiceProvider ;
62
65
import com .cloud .network .element .StaticNatServiceProvider ;
66
+ import com .cloud .network .element .VirtualRouterElement ;
67
+ import com .cloud .network .element .VirtualRouterProviderVO ;
63
68
import com .cloud .network .element .VpcProvider ;
64
69
import com .cloud .network .lb .LoadBalancingRule ;
65
70
import com .cloud .network .rules .FirewallRule ;
71
+ import com .cloud .network .rules .LoadBalancerContainer ;
66
72
import com .cloud .network .rules .PortForwardingRule ;
67
73
import com .cloud .network .rules .StaticNat ;
68
74
import com .cloud .network .vpc .NetworkACLItem ;
82
88
import com .cloud .uservm .UserVm ;
83
89
import com .cloud .utils .Pair ;
84
90
import com .cloud .utils .component .AdapterBase ;
91
+ import com .cloud .utils .db .QueryBuilder ;
92
+ import com .cloud .utils .db .SearchCriteria ;
85
93
import com .cloud .utils .exception .CloudRuntimeException ;
86
94
import com .cloud .vm .NicProfile ;
87
95
import com .cloud .vm .ReservationContext ;
90
98
import com .cloud .vm .dao .VMInstanceDao ;
91
99
import net .sf .ehcache .config .InvalidConfigurationException ;
92
100
import org .apache .cloudstack .StartupNsxCommand ;
101
+ import org .apache .cloudstack .api .command .admin .internallb .ConfigureInternalLoadBalancerElementCmd ;
102
+ import org .apache .cloudstack .api .command .admin .internallb .CreateInternalLoadBalancerElementCmd ;
103
+ import org .apache .cloudstack .api .command .admin .internallb .ListInternalLoadBalancerElementsCmd ;
104
+ import org .apache .cloudstack .network .element .InternalLoadBalancerElementService ;
93
105
import org .apache .cloudstack .resource .NsxLoadBalancerMember ;
94
106
import org .apache .cloudstack .resource .NsxNetworkRule ;
95
107
import org .apache .cloudstack .resource .NsxOpObject ;
111
123
@ Component
112
124
public class NsxElement extends AdapterBase implements DhcpServiceProvider , DnsServiceProvider , VpcProvider ,
113
125
StaticNatServiceProvider , IpDeployer , PortForwardingServiceProvider , NetworkACLServiceProvider ,
114
- LoadBalancingServiceProvider , FirewallServiceProvider , ResourceStateAdapter , Listener {
126
+ LoadBalancingServiceProvider , FirewallServiceProvider , InternalLoadBalancerElementService , ResourceStateAdapter , Listener {
115
127
116
128
117
129
@ Inject
@@ -142,6 +154,10 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, Dns
142
154
VpcDao vpcDao ;
143
155
@ Inject
144
156
LoadBalancerVMMapDao lbVmMapDao ;
157
+ @ Inject
158
+ VirtualRouterProviderDao vrProviderDao ;
159
+ @ Inject
160
+ PhysicalNetworkServiceProviderDao pNtwkSvcProviderDao ;
145
161
146
162
private static final Logger LOGGER = Logger .getLogger (NsxElement .class );
147
163
@@ -159,7 +175,16 @@ private static Map<Network.Service, Map<Network.Capability, String>> initCapabil
159
175
capabilities .put (Network .Service .Dns , dnsCapabilities );
160
176
161
177
capabilities .put (Network .Service .StaticNat , null );
162
- capabilities .put (Network .Service .Lb , null );
178
+
179
+ // Set capabilities for LB service
180
+ Map <Network .Capability , String > lbCapabilities = new HashMap <Network .Capability , String >();
181
+ lbCapabilities .put (Network .Capability .SupportedLBAlgorithms , "roundrobin,leastconn" );
182
+ lbCapabilities .put (Network .Capability .SupportedLBIsolation , "dedicated" );
183
+ lbCapabilities .put (Network .Capability .SupportedProtocols , "tcp, udp" );
184
+ lbCapabilities .put (Network .Capability .SupportedStickinessMethods , VirtualRouterElement .getHAProxyStickinessCapability ());
185
+ lbCapabilities .put (Network .Capability .LbSchemes , String .join ("," , LoadBalancerContainer .Scheme .Internal .name (), LoadBalancerContainer .Scheme .Public .name ()));
186
+
187
+ capabilities .put (Network .Service .Lb , lbCapabilities );
163
188
capabilities .put (Network .Service .PortForwarding , null );
164
189
capabilities .put (Network .Service .NetworkACL , null );
165
190
@@ -633,7 +658,8 @@ public boolean applyLBRules(Network network, List<LoadBalancingRule> rules) thro
633
658
.setNetworkResourceName (nsxObject .getNetworkResourceName ())
634
659
.setVpcResource (nsxObject .isVpcResource ())
635
660
.setMemberList (lbMembers )
636
- .setPublicIp (publicIp .getAddress ().addr ())
661
+ .setPublicIp (LoadBalancerContainer .Scheme .Public == loadBalancingRule .getScheme () ?
662
+ publicIp .getAddress ().addr () : loadBalancingRule .getSourceIp ().addr ())
637
663
.setPublicPort (String .valueOf (loadBalancingRule .getSourcePortStart ()))
638
664
.setPrivatePort (String .valueOf (loadBalancingRule .getDefaultPortStart ()))
639
665
.setRuleId (loadBalancingRule .getId ())
@@ -778,4 +804,74 @@ protected List<String> transformCidrListValues(List<String> sourceCidrList) {
778
804
}
779
805
return list ;
780
806
}
807
+
808
+ @ Override
809
+ public VirtualRouterProvider configureInternalLoadBalancerElement (long id , boolean enable ) {
810
+ VirtualRouterProviderVO element = vrProviderDao .findById (id );
811
+ if (element == null || element .getType () != VirtualRouterProvider .Type .Nsx ) {
812
+ throw new InvalidParameterValueException ("Can't find " + getName () + " " +
813
+ "element with network service provider id " + id + " to be used as a provider for " +
814
+ getName ());
815
+ }
816
+
817
+ element .setEnabled (enable );
818
+ element = vrProviderDao .persist (element );
819
+
820
+ return element ;
821
+ }
822
+
823
+ @ Override
824
+ public VirtualRouterProvider addInternalLoadBalancerElement (long ntwkSvcProviderId ) {
825
+ VirtualRouterProviderVO element = vrProviderDao .findByNspIdAndType (ntwkSvcProviderId , VirtualRouterProvider .Type .Nsx );
826
+ if (element != null ) {
827
+ LOGGER .debug ("There is already an " + getName () + " with service provider id " + ntwkSvcProviderId );
828
+ return null ;
829
+ }
830
+
831
+ PhysicalNetworkServiceProvider provider = pNtwkSvcProviderDao .findById (ntwkSvcProviderId );
832
+ if (provider == null || !provider .getProviderName ().equalsIgnoreCase (getName ())) {
833
+ throw new InvalidParameterValueException ("Invalid network service provider is specified" );
834
+ }
835
+
836
+ element = new VirtualRouterProviderVO (ntwkSvcProviderId , VirtualRouterProvider .Type .Nsx );
837
+ element = vrProviderDao .persist (element );
838
+ return element ;
839
+ }
840
+
841
+ @ Override
842
+ public VirtualRouterProvider getInternalLoadBalancerElement (long id ) {
843
+ VirtualRouterProvider provider = vrProviderDao .findById (id );
844
+ if (provider == null || provider .getType () != VirtualRouterProvider .Type .Nsx ) {
845
+ throw new InvalidParameterValueException ("Unable to find " + getName () + " by id" );
846
+ }
847
+ return provider ;
848
+ }
849
+
850
+ @ Override
851
+ public List <? extends VirtualRouterProvider > searchForInternalLoadBalancerElements (Long id , Long ntwkSvsProviderId , Boolean enabled ) {
852
+ QueryBuilder <VirtualRouterProviderVO > sc = QueryBuilder .create (VirtualRouterProviderVO .class );
853
+ if (id != null ) {
854
+ sc .and (sc .entity ().getId (), SearchCriteria .Op .EQ , id );
855
+ }
856
+ if (ntwkSvsProviderId != null ) {
857
+ sc .and (sc .entity ().getNspId (), SearchCriteria .Op .EQ , ntwkSvsProviderId );
858
+ }
859
+ if (enabled != null ) {
860
+ sc .and (sc .entity ().isEnabled (), SearchCriteria .Op .EQ , enabled );
861
+ }
862
+
863
+ //return only Internal LB elements
864
+ sc .and (sc .entity ().getType (), SearchCriteria .Op .EQ , VirtualRouterProvider .Type .Nsx );
865
+
866
+ return sc .list ();
867
+ }
868
+
869
+ @ Override
870
+ public List <Class <?>> getCommands () {
871
+ List <Class <?>> cmdList = new ArrayList <Class <?>>();
872
+ cmdList .add (CreateInternalLoadBalancerElementCmd .class );
873
+ cmdList .add (ConfigureInternalLoadBalancerElementCmd .class );
874
+ cmdList .add (ListInternalLoadBalancerElementsCmd .class );
875
+ return cmdList ;
876
+ }
781
877
}
0 commit comments