4444import com .cloud .network .Networks ;
4545import com .cloud .network .PhysicalNetworkServiceProvider ;
4646import com .cloud .network .PublicIpAddress ;
47+ import com .cloud .network .VirtualRouterProvider ;
4748import com .cloud .network .dao .IPAddressDao ;
4849import com .cloud .network .dao .IPAddressVO ;
4950import com .cloud .network .dao .LoadBalancerVMMapDao ;
5051import com .cloud .network .dao .LoadBalancerVMMapVO ;
5152import com .cloud .network .dao .NetworkDao ;
5253import com .cloud .network .dao .NetworkVO ;
5354import com .cloud .network .dao .PhysicalNetworkDao ;
55+ import com .cloud .network .dao .PhysicalNetworkServiceProviderDao ;
5456import com .cloud .network .dao .PhysicalNetworkVO ;
57+ import com .cloud .network .dao .VirtualRouterProviderDao ;
5558import com .cloud .network .element .DhcpServiceProvider ;
5659import com .cloud .network .element .DnsServiceProvider ;
5760import com .cloud .network .element .FirewallServiceProvider ;
6063import com .cloud .network .element .NetworkACLServiceProvider ;
6164import com .cloud .network .element .PortForwardingServiceProvider ;
6265import com .cloud .network .element .StaticNatServiceProvider ;
66+ import com .cloud .network .element .VirtualRouterElement ;
67+ import com .cloud .network .element .VirtualRouterProviderVO ;
6368import com .cloud .network .element .VpcProvider ;
6469import com .cloud .network .lb .LoadBalancingRule ;
6570import com .cloud .network .rules .FirewallRule ;
71+ import com .cloud .network .rules .LoadBalancerContainer ;
6672import com .cloud .network .rules .PortForwardingRule ;
6773import com .cloud .network .rules .StaticNat ;
6874import com .cloud .network .vpc .NetworkACLItem ;
8288import com .cloud .uservm .UserVm ;
8389import com .cloud .utils .Pair ;
8490import com .cloud .utils .component .AdapterBase ;
91+ import com .cloud .utils .db .QueryBuilder ;
92+ import com .cloud .utils .db .SearchCriteria ;
8593import com .cloud .utils .exception .CloudRuntimeException ;
8694import com .cloud .vm .NicProfile ;
8795import com .cloud .vm .ReservationContext ;
9098import com .cloud .vm .dao .VMInstanceDao ;
9199import net .sf .ehcache .config .InvalidConfigurationException ;
92100import 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 ;
93105import org .apache .cloudstack .resource .NsxLoadBalancerMember ;
94106import org .apache .cloudstack .resource .NsxNetworkRule ;
95107import org .apache .cloudstack .resource .NsxOpObject ;
111123@ Component
112124public class NsxElement extends AdapterBase implements DhcpServiceProvider , DnsServiceProvider , VpcProvider ,
113125 StaticNatServiceProvider , IpDeployer , PortForwardingServiceProvider , NetworkACLServiceProvider ,
114- LoadBalancingServiceProvider , FirewallServiceProvider , ResourceStateAdapter , Listener {
126+ LoadBalancingServiceProvider , FirewallServiceProvider , InternalLoadBalancerElementService , ResourceStateAdapter , Listener {
115127
116128
117129 @ Inject
@@ -142,6 +154,10 @@ public class NsxElement extends AdapterBase implements DhcpServiceProvider, Dns
142154 VpcDao vpcDao ;
143155 @ Inject
144156 LoadBalancerVMMapDao lbVmMapDao ;
157+ @ Inject
158+ VirtualRouterProviderDao vrProviderDao ;
159+ @ Inject
160+ PhysicalNetworkServiceProviderDao pNtwkSvcProviderDao ;
145161
146162 private static final Logger LOGGER = Logger .getLogger (NsxElement .class );
147163
@@ -159,7 +175,16 @@ private static Map<Network.Service, Map<Network.Capability, String>> initCapabil
159175 capabilities .put (Network .Service .Dns , dnsCapabilities );
160176
161177 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 );
163188 capabilities .put (Network .Service .PortForwarding , null );
164189 capabilities .put (Network .Service .NetworkACL , null );
165190
@@ -633,7 +658,8 @@ public boolean applyLBRules(Network network, List<LoadBalancingRule> rules) thro
633658 .setNetworkResourceName (nsxObject .getNetworkResourceName ())
634659 .setVpcResource (nsxObject .isVpcResource ())
635660 .setMemberList (lbMembers )
636- .setPublicIp (publicIp .getAddress ().addr ())
661+ .setPublicIp (LoadBalancerContainer .Scheme .Public == loadBalancingRule .getScheme () ?
662+ publicIp .getAddress ().addr () : loadBalancingRule .getSourceIp ().addr ())
637663 .setPublicPort (String .valueOf (loadBalancingRule .getSourcePortStart ()))
638664 .setPrivatePort (String .valueOf (loadBalancingRule .getDefaultPortStart ()))
639665 .setRuleId (loadBalancingRule .getId ())
@@ -778,4 +804,74 @@ protected List<String> transformCidrListValues(List<String> sourceCidrList) {
778804 }
779805 return list ;
780806 }
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+ }
781877}
0 commit comments