Skip to content

Commit b6fbdc3

Browse files
committed
Fix LB rule creation on different tier in not on VPC with conserve mode enabled
1 parent 9cf2747 commit b6fbdc3

File tree

5 files changed

+58
-17
lines changed

5 files changed

+58
-17
lines changed

engine/components-api/src/main/java/com/cloud/network/vpc/VpcManager.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,4 +211,9 @@ public interface VpcManager {
211211
void reconfigStaticNatForVpcVr(Long vpcId);
212212

213213
boolean applyStaticRouteForVpcVpnIfNeeded(Long vpcId, boolean updateAllVpn) throws ResourceUnavailableException;
214+
215+
/**
216+
* Returns true if the network is part of a VPC, and the VPC is created from conserve mode enabled VPC offering
217+
*/
218+
boolean isNetworkOnVpcEnabledConserveMode(Network network);
214219
}

server/src/main/java/com/cloud/network/firewall/FirewallManagerImpl.java

Lines changed: 2 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
import javax.naming.ConfigurationException;
3232

3333
import com.cloud.network.vpc.Vpc;
34-
import com.cloud.network.vpc.VpcOfferingVO;
3534
import com.cloud.network.vpc.dao.VpcOfferingDao;
3635
import org.apache.commons.lang3.ObjectUtils;
3736
import org.springframework.stereotype.Component;
@@ -401,8 +400,8 @@ public void detectRulesConflict(FirewallRule newRule) throws NetworkRuleConflict
401400
}
402401

403402
NetworkVO newRuleNetwork = getNewRuleNetwork(newRule);
404-
boolean newRuleIsOnVpcNetwork = isNewRuleOnVpcNetwork(newRuleNetwork);
405-
boolean vpcConserveModeEnabled = isVpcConserveModeEnabled(newRuleNetwork);
403+
boolean newRuleIsOnVpcNetwork = newRuleNetwork.getVpcId() != null;
404+
boolean vpcConserveModeEnabled = _vpcMgr.isNetworkOnVpcEnabledConserveMode(newRuleNetwork);
406405

407406
for (FirewallRuleVO rule : rules) {
408407
if (rule.getId() == newRule.getId()) {
@@ -509,19 +508,6 @@ public void detectRulesConflict(FirewallRule newRule) throws NetworkRuleConflict
509508
}
510509
}
511510

512-
protected boolean isVpcConserveModeEnabled(NetworkVO newRuleNetwork) {
513-
if (isNewRuleOnVpcNetwork(newRuleNetwork)) {
514-
Vpc vpc = _vpcMgr.getActiveVpc(newRuleNetwork.getVpcId());
515-
VpcOfferingVO vpcOffering = vpc != null ? vpcOfferingDao.findById(vpc.getVpcOfferingId()) : null;
516-
return vpcOffering != null && vpcOffering.isConserveMode();
517-
}
518-
return false;
519-
}
520-
521-
protected boolean isNewRuleOnVpcNetwork(NetworkVO newRuleNetwork) {
522-
return newRuleNetwork.getVpcId() != null;
523-
}
524-
525511
protected NetworkVO getNewRuleNetwork(FirewallRule newRule) {
526512
NetworkVO newRuleNetwork = _networkDao.findById(newRule.getNetworkId());
527513
if (newRuleNetwork == null) {

server/src/main/java/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1738,6 +1738,8 @@ public LoadBalancer createPublicLoadBalancerRule(String xId, String name, String
17381738
throw new NetworkRuleConflictException("Can't do load balance on IP address: " + ipVO.getAddress());
17391739
}
17401740

1741+
verifyLoadBalancerRuleNetwork(name, network, ipVO);
1742+
17411743
String cidrString = generateCidrString(cidrList);
17421744

17431745
boolean performedIpAssoc = false;
@@ -1790,7 +1792,18 @@ public LoadBalancer createPublicLoadBalancerRule(String xId, String name, String
17901792

17911793
return result;
17921794
}
1793-
/**
1795+
1796+
protected void verifyLoadBalancerRuleNetwork(String lbName, Network network, IPAddressVO ipVO) {
1797+
boolean isVpcConserveModeEnabled = _vpcMgr.isNetworkOnVpcEnabledConserveMode(network);
1798+
if (!isVpcConserveModeEnabled && ipVO.getAssociatedWithNetworkId() != null && network.getId() != ipVO.getAssociatedWithNetworkId()) {
1799+
String msg = String.format("Cannot create Load Balancer rule %s as the IP address %s is not associated " +
1800+
"with the network %s (ID=%s)", lbName, ipVO.getAddress(), network.getName(), network.getUuid());
1801+
logger.error(msg);
1802+
throw new InvalidParameterValueException(msg);
1803+
}
1804+
}
1805+
1806+
/**
17941807
* Transforms the cidrList from a List of Strings to a String which contains all the CIDRs from cidrList separated by whitespaces. This is used to facilitate both the persistence
17951808
* in the DB and also later when building the configuration String in the getRulesForPool method of the HAProxyConfigurator class.
17961809
*/

server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2956,6 +2956,20 @@ public boolean applyStaticRouteForVpcVpnIfNeeded(final Long vpcId, boolean updat
29562956
return true;
29572957
}
29582958

2959+
protected boolean isNetworkOnVpc(Network network) {
2960+
return network.getVpcId() != null;
2961+
}
2962+
2963+
@Override
2964+
public boolean isNetworkOnVpcEnabledConserveMode(Network newRuleNetwork) {
2965+
if (isNetworkOnVpc(newRuleNetwork)) {
2966+
Vpc vpc = getActiveVpc(newRuleNetwork.getVpcId());
2967+
VpcOfferingVO vpcOffering = vpc != null ? _vpcOffDao.findById(vpc.getVpcOfferingId()) : null;
2968+
return vpcOffering != null && vpcOffering.isConserveMode();
2969+
}
2970+
return false;
2971+
}
2972+
29592973
protected boolean applyStaticRoutes(final List<StaticRouteVO> routes, final Account caller, final boolean updateRoutesInDB) throws ResourceUnavailableException {
29602974
final boolean success = true;
29612975
final List<StaticRouteProfile> staticRouteProfiles = getVpcStaticRoutes(routes);

server/src/test/java/com/cloud/network/vpc/VpcManagerImplTest.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -581,4 +581,27 @@ public void validateVpcPrivateGatewayTestAclFromDifferentVpcThrowsInvalidParamet
581581
Assert.assertThrows(InvalidParameterValueException.class, () -> manager.validateVpcPrivateGatewayAclId(vpcId, differentVpcAclId));
582582
}
583583

584+
@Test
585+
public void testIsNetworkOnVpcEnabledConserveModeIsolatedNetwork() {
586+
Network network = mock(Network.class);
587+
Mockito.when(network.getVpcId()).thenReturn(null);
588+
Assert.assertFalse(manager.isNetworkOnVpcEnabledConserveMode(network));
589+
}
590+
591+
@Test
592+
public void testIsNetworkOnVpcEnabledConserveModeVpcNetworkConserveMode() {
593+
Network network = mock(Network.class);
594+
Vpc vpc = mock(Vpc.class);
595+
VpcOfferingVO vpcOffering = mock(VpcOfferingVO.class);
596+
long vpcId = 10L;
597+
long vpcOfferingId = 11L;
598+
599+
Mockito.when(network.getVpcId()).thenReturn(vpcId);
600+
Mockito.when(vpcDao.getActiveVpcById(Mockito.eq(vpcId))).thenReturn(vpc);
601+
Mockito.when(vpc.getVpcOfferingId()).thenReturn(vpcOfferingId);
602+
Mockito.when(vpcOfferingDao.findById(Mockito.eq(vpcOfferingId))).thenReturn(vpcOffering);
603+
Mockito.when(vpcOffering.isConserveMode()).thenReturn(true);
604+
Assert.assertTrue(manager.isNetworkOnVpcEnabledConserveMode(network));
605+
}
606+
584607
}

0 commit comments

Comments
 (0)