Skip to content

Commit 2776ad1

Browse files
author
Sheng Yang
committed
CLOUDSTACK-1242: Fix inline mode
Network refactor dropped many inline mode codes. I've added at least part of them back. Now I can create LB rule for inline mode.
1 parent 06a733a commit 2776ad1

3 files changed

Lines changed: 32 additions & 6 deletions

File tree

server/src/com/cloud/network/NetworkManagerImpl.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@
9898
import com.cloud.network.dao.UserIpv6AddressDao;
9999
import com.cloud.network.element.DhcpServiceProvider;
100100
import com.cloud.network.element.IpDeployer;
101+
import com.cloud.network.element.IpDeployingRequester;
101102
import com.cloud.network.element.LoadBalancingServiceProvider;
102103
import com.cloud.network.element.NetworkElement;
103104
import com.cloud.network.element.StaticNatServiceProvider;
@@ -536,9 +537,11 @@ public boolean applyIpAssociations(Network network, boolean rulesRevoked, boolea
536537
}
537538
IpDeployer deployer = null;
538539
NetworkElement element = _networkModel.getElementImplementingProvider(provider.getName());
539-
if (element instanceof IpDeployer) {
540-
deployer = (IpDeployer) element;
541-
} else {
540+
if (!(element instanceof IpDeployingRequester)) {
541+
throw new CloudRuntimeException("Element " + element + " is not a IpDeployingRequester!");
542+
}
543+
deployer = ((IpDeployingRequester)element).getIpDeployer(network);
544+
if (deployer == null) {
542545
throw new CloudRuntimeException("Fail to get ip deployer for element: " + element);
543546
}
544547
Set<Service> services = new HashSet<Service>();

server/src/com/cloud/network/NetworkModelImpl.java

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,8 @@
7575
import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO;
7676
import com.cloud.network.dao.PhysicalNetworkVO;
7777
import com.cloud.network.dao.UserIpv6AddressDao;
78+
import com.cloud.network.element.IpDeployer;
79+
import com.cloud.network.element.IpDeployingRequester;
7880
import com.cloud.network.element.NetworkElement;
7981
import com.cloud.network.element.UserDataServiceProvider;
8082
import com.cloud.network.rules.FirewallRule.Purpose;
@@ -390,9 +392,18 @@ public boolean canIpUsedForService(PublicIp publicIp, Service service, Long netw
390392
throw new InvalidParameterException("There is no new provider for IP " + publicIp.getAddress() + " of service " + service.getName() + "!");
391393
}
392394
Provider newProvider = (Provider) newProviders.toArray()[0];
393-
if (!oldProvider.equals(newProvider)) {
394-
throw new InvalidParameterException("There would be multiple providers for IP " + publicIp.getAddress() + "!");
395-
}
395+
Network network = _networksDao.findById(networkId);
396+
NetworkElement oldElement = getElementImplementingProvider(oldProvider.getName());
397+
NetworkElement newElement = getElementImplementingProvider(newProvider.getName());
398+
if (oldElement instanceof IpDeployingRequester && newElement instanceof IpDeployingRequester) {
399+
IpDeployer oldIpDeployer = ((IpDeployingRequester)oldElement).getIpDeployer(network);
400+
IpDeployer newIpDeployer = ((IpDeployingRequester)newElement).getIpDeployer(network);
401+
if (!oldIpDeployer.getProvider().getName().equals(newIpDeployer.getProvider().getName())) {
402+
throw new InvalidParameterException("There would be multiple providers for IP " + publicIp.getAddress() + "!");
403+
}
404+
} else {
405+
throw new InvalidParameterException("Ip cannot be applied for new provider!");
406+
}
396407
return true;
397408
}
398409

server/src/com/cloud/network/NetworkServiceImpl.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,18 @@ protected boolean canIpsUsedForNonConserve(List<PublicIp> publicIps) {
333333
private boolean canIpsUseOffering(List<PublicIp> publicIps, long offeringId) {
334334
Map<PublicIp, Set<Service>> ipToServices = getIpToServices(publicIps, false, true);
335335
Map<Service, Set<Provider>> serviceToProviders = _networkModel.getNetworkOfferingServiceProvidersMap(offeringId);
336+
NetworkOfferingVO offering = _networkOfferingDao.findById(offeringId);
337+
//For inline mode checking, using firewall provider for LB instead, because public ip would apply on firewall provider
338+
if (offering.isInline()) {
339+
Provider firewallProvider = null;
340+
if (serviceToProviders.containsKey(Service.Firewall)) {
341+
firewallProvider = (Provider)serviceToProviders.get(Service.Firewall).toArray()[0];
342+
}
343+
Set<Provider> p = new HashSet<Provider>();
344+
p.add(firewallProvider);
345+
serviceToProviders.remove(Service.Lb);
346+
serviceToProviders.put(Service.Lb, p);
347+
}
336348
for (PublicIp ip : ipToServices.keySet()) {
337349
Set<Service> services = ipToServices.get(ip);
338350
Provider provider = null;

0 commit comments

Comments
 (0)