Skip to content

Commit 10482da

Browse files
committed
Merge release branch 4.13 to master
* 4.13: vr: add missing rule for port forwarding rule in vpc (#3857) vpc: set traffic type of private gateway IP to Public to fix ke… (#3851)
2 parents 33e9a50 + d88c614 commit 10482da

File tree

5 files changed

+50
-5
lines changed

5 files changed

+50
-5
lines changed

engine/schema/src/main/java/com/cloud/network/vpc/dao/VpcGatewayDao.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,6 @@ public interface VpcGatewayDao extends GenericDao<VpcGatewayVO, Long> {
3232
List<VpcGatewayVO> listByAclIdAndType(long aclId, VpcGateway.Type type);
3333

3434
List<VpcGatewayVO> listByVpcId(long vpcId);
35+
36+
VpcGatewayVO getVpcGatewayByNetworkId(long networkId);
3537
}

engine/schema/src/main/java/com/cloud/network/vpc/dao/VpcGatewayDaoImpl.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,4 +89,11 @@ public List<VpcGatewayVO> listByVpcId(long vpcId) {
8989
sc.setParameters("vpcId", vpcId);
9090
return listBy(sc);
9191
}
92+
93+
@Override
94+
public VpcGatewayVO getVpcGatewayByNetworkId(long networkId) {
95+
SearchCriteria<VpcGatewayVO> sc = AllFieldsSearch.create();
96+
sc.setParameters("networkid", networkId);
97+
return findOneBy(sc);
98+
}
9299
}

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,9 @@
9494
import com.cloud.network.rules.FirewallRule.Purpose;
9595
import com.cloud.network.rules.FirewallRuleVO;
9696
import com.cloud.network.rules.dao.PortForwardingRulesDao;
97+
import com.cloud.network.vpc.VpcGatewayVO;
9798
import com.cloud.network.vpc.dao.PrivateIpDao;
99+
import com.cloud.network.vpc.dao.VpcGatewayDao;
98100
import com.cloud.offering.NetworkOffering;
99101
import com.cloud.offering.NetworkOffering.Detail;
100102
import com.cloud.offerings.NetworkOfferingServiceMapVO;
@@ -158,6 +160,8 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel, Confi
158160
NicDao _nicDao = null;
159161
@Inject
160162
PodVlanMapDao _podVlanMapDao;
163+
@Inject
164+
VpcGatewayDao _vpcGatewayDao;
161165

162166
private List<NetworkElement> networkElements;
163167

@@ -1780,8 +1784,8 @@ public List<? extends PhysicalNetwork> getPhysicalNtwksSupportingTrafficType(lon
17801784

17811785
@Override
17821786
public boolean isPrivateGateway(long ntwkId) {
1783-
Network network = getNetwork(ntwkId);
1784-
if (network.getTrafficType() != TrafficType.Guest || network.getNetworkOfferingId() != s_privateOfferingId.longValue()) {
1787+
final VpcGatewayVO gateway = _vpcGatewayDao.getVpcGatewayByNetworkId(ntwkId);
1788+
if (gateway == null) {
17851789
return false;
17861790
}
17871791
return true;

server/src/main/java/com/cloud/network/router/CommandSetupHelper.java

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,9 @@
104104
import com.cloud.network.vpc.StaticRouteProfile;
105105
import com.cloud.network.vpc.Vpc;
106106
import com.cloud.network.vpc.VpcGateway;
107+
import com.cloud.network.vpc.VpcGatewayVO;
107108
import com.cloud.network.vpc.dao.VpcDao;
109+
import com.cloud.network.vpc.dao.VpcGatewayDao;
108110
import com.cloud.offering.NetworkOffering;
109111
import com.cloud.offerings.NetworkOfferingVO;
110112
import com.cloud.offerings.dao.NetworkOfferingDao;
@@ -170,6 +172,8 @@ public class CommandSetupHelper {
170172
@Inject
171173
private VpcDao _vpcDao;
172174
@Inject
175+
private VpcGatewayDao _vpcGatewayDao;
176+
@Inject
173177
private VlanDao _vlanDao;
174178
@Inject
175179
private IPAddressDao _ipAddressDao;
@@ -707,7 +711,7 @@ public int compare(final PublicIpAddress o1, final PublicIpAddress o2) {
707711
final IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, firstIP, sourceNat, BroadcastDomainType.fromString(ipAddr.getVlanTag()).toString(), ipAddr.getGateway(),
708712
ipAddr.getNetmask(), macAddress, networkRate, ipAddr.isOneToOneNat());
709713

710-
ip.setTrafficType(network.getTrafficType());
714+
ip.setTrafficType(getNetworkTrafficType(network));
711715
ip.setNetworkName(_networkModel.getNetworkTag(router.getHypervisorType(), network));
712716
ipsToSend[i++] = ip;
713717
if (ipAddr.isSourceNat()) {
@@ -823,7 +827,7 @@ public int compare(final PublicIpAddress o1, final PublicIpAddress o2) {
823827
final IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, firstIP, sourceNat, vlanId, vlanGateway, vlanNetmask,
824828
vifMacAddress, networkRate, ipAddr.isOneToOneNat());
825829

826-
ip.setTrafficType(network.getTrafficType());
830+
ip.setTrafficType(getNetworkTrafficType(network));
827831
ip.setNetworkName(_networkModel.getNetworkTag(router.getHypervisorType(), network));
828832
ipsToSend[i++] = ip;
829833
/*
@@ -948,7 +952,7 @@ public void createVpcAssociatePrivateIPCommands(final VirtualRouter router, fina
948952
final IpAddressTO ip = new IpAddressTO(Account.ACCOUNT_ID_SYSTEM, ipAddr.getIpAddress(), add, false, ipAddr.getSourceNat(), ipAddr.getBroadcastUri(),
949953
ipAddr.getGateway(), ipAddr.getNetmask(), ipAddr.getMacAddress(), null, false);
950954

951-
ip.setTrafficType(network.getTrafficType());
955+
ip.setTrafficType(getNetworkTrafficType(network));
952956
ip.setNetworkName(_networkModel.getNetworkTag(router.getHypervisorType(), network));
953957
ipsToSend[i++] = ip;
954958

@@ -1101,4 +1105,14 @@ protected String getGuestDhcpRange(final NicProfile guestNic, final Network gues
11011105
}
11021106
return dhcpRange;
11031107
}
1108+
1109+
private TrafficType getNetworkTrafficType(Network network) {
1110+
final VpcGatewayVO gateway = _vpcGatewayDao.getVpcGatewayByNetworkId(network.getId());
1111+
if (gateway != null) {
1112+
s_logger.debug("network " + network.getId() + " (name: " + network.getName() + " ) is a vpc private gateway, set traffic type to Public");
1113+
return TrafficType.Public;
1114+
} else {
1115+
return network.getTrafficType();
1116+
}
1117+
}
11041118
}

systemvm/debian/opt/cloud/bin/configure.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,12 @@ def getGuestIp(self):
793793

794794
return None
795795

796+
def getGuestIpByIp(self, ipa):
797+
for interface in self.config.address().get_interfaces():
798+
if interface.ip_in_subnet(ipa):
799+
return interface.get_ip()
800+
return None
801+
796802
def getDeviceByIp(self, ipa):
797803
for interface in self.config.address().get_interfaces():
798804
if interface.ip_in_subnet(ipa):
@@ -930,8 +936,20 @@ def forward_vpc(self, rule):
930936
if not rule["internal_ports"] == "any":
931937
fw_output_rule += ":" + self.portsToString(rule["internal_ports"], "-")
932938

939+
fw_postrout_rule2 = "-j SNAT --to-source %s -A POSTROUTING -s %s -d %s/32 -o %s -p %s -m %s --dport %s" % \
940+
(
941+
self.getGuestIpByIp(rule['internal_ip']),
942+
self.getNetworkByIp(rule['internal_ip']),
943+
rule['internal_ip'],
944+
self.getDeviceByIp(rule['internal_ip']),
945+
rule['protocol'],
946+
rule['protocol'],
947+
self.portsToString(rule['internal_ports'], ':')
948+
)
949+
933950
self.fw.append(["nat", "", fw_prerout_rule])
934951
self.fw.append(["nat", "", fw_postrout_rule])
952+
self.fw.append(["nat", "", fw_postrout_rule2])
935953
self.fw.append(["nat", "", fw_output_rule])
936954

937955
def processStaticNatRule(self, rule):

0 commit comments

Comments
 (0)