Skip to content

Commit 07be494

Browse files
adding setupPrivateGateway to new style;
removing methods from Vpc appliance; changing the way VpcElement calls the command; there is still work tob e done with the destroyPrivateGateway rule. Conflicts: server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java server/src/org/apache/cloudstack/network/topology/BasicNetworkTopology.java server/src/org/apache/cloudstack/network/topology/NetworkTopology.java
1 parent 5489130 commit 07be494

11 files changed

+286
-76
lines changed

server/src/com/cloud/network/element/VpcVirtualRouterElement.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,8 +384,11 @@ public boolean createPrivateGateway(final PrivateGateway gateway) throws Concurr
384384
}
385385

386386
VirtualRouter router = routers.get(0);
387+
388+
DataCenterVO dcVO = _dcDao.findById(gateway.getZoneId());
389+
NetworkTopology networkTopology = networkTopologyContext.retrieveNetworkTopology(dcVO);
387390

388-
if (_vpcRouterMgr.setupPrivateGateway(gateway, router)) {
391+
if (networkTopology.setupPrivateGateway(gateway, router)) {
389392
try {
390393
List<NetworkACLItemVO> rules = _networkACLItemDao.listByACL(gateway.getNetworkACLId());
391394
if (!applyACLItemsToPrivateGw(gateway, rules)) {

server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManager.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,6 @@
3030

3131
public interface VpcVirtualNetworkApplianceManager extends VirtualNetworkApplianceManager, VpcVirtualNetworkApplianceService {
3232

33-
/**
34-
* @param gateway
35-
* @param router TODO
36-
* @return
37-
* @throws ResourceUnavailableException
38-
* @throws ConcurrentOperationException
39-
*/
40-
boolean setupPrivateGateway(PrivateGateway gateway, VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException;
41-
4233
/**
4334
* @param gateway
4435
* @param router

server/src/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -649,42 +649,6 @@ protected boolean sendNetworkRulesToRouter(final long routerId, final long netwo
649649
return _nwHelper.sendCommandsToRouter(router, cmds);
650650
}
651651

652-
@Override
653-
public boolean setupPrivateGateway(final PrivateGateway gateway, final VirtualRouter router) throws ConcurrentOperationException, ResourceUnavailableException {
654-
boolean result = true;
655-
try {
656-
Network network = _networkModel.getNetwork(gateway.getNetworkId());
657-
NicProfile requested = vpcHelper.createPrivateNicProfileForGateway(gateway);
658-
659-
if (!_nwHelper.checkRouterVersion(router)) {
660-
s_logger.warn("Router requires upgrade. Unable to send command to router: " + router.getId());
661-
return false;
662-
}
663-
NicProfile guestNic = _itMgr.addVmToNetwork(router, network, requested);
664-
665-
//setup source nat
666-
if (guestNic != null) {
667-
result = setupVpcPrivateNetwork(router, true, guestNic);
668-
} else {
669-
s_logger.warn("Failed to setup gateway " + gateway + " on router " + router + " with the source nat");
670-
result = false;
671-
}
672-
} catch (Exception ex) {
673-
s_logger.warn("Failed to create private gateway " + gateway + " on router " + router + " due to ", ex);
674-
result = false;
675-
} finally {
676-
if (!result) {
677-
s_logger.debug("Removing gateway " + gateway + " from router " + router + " as a part of cleanup");
678-
if (destroyPrivateGateway(gateway, router)) {
679-
s_logger.debug("Removed the gateway " + gateway + " from router " + router + " as a part of cleanup");
680-
} else {
681-
s_logger.warn("Failed to remove the gateway " + gateway + " from router " + router + " as a part of cleanup");
682-
}
683-
}
684-
}
685-
return result;
686-
}
687-
688652
/**
689653
* @param router
690654
* @param add

server/src/com/cloud/network/rules/PrivateGatewayRules.java

Lines changed: 148 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,32 +17,172 @@
1717

1818
package com.cloud.network.rules;
1919

20+
import java.util.ArrayList;
21+
import java.util.HashMap;
2022
import java.util.List;
23+
import java.util.Map;
2124

2225
import org.apache.cloudstack.network.topology.NetworkTopologyVisitor;
26+
import org.apache.log4j.Logger;
2327

28+
import com.cloud.agent.api.routing.IpAssocVpcCommand;
29+
import com.cloud.agent.api.routing.NetworkElementCommand;
30+
import com.cloud.agent.api.to.IpAddressTO;
31+
import com.cloud.agent.manager.Commands;
32+
import com.cloud.dc.DataCenterVO;
33+
import com.cloud.exception.ConcurrentOperationException;
2434
import com.cloud.exception.ResourceUnavailableException;
2535
import com.cloud.network.Network;
2636
import com.cloud.network.router.VirtualRouter;
27-
import com.cloud.network.vpc.NetworkACLItem;
37+
import com.cloud.network.vpc.PrivateGateway;
38+
import com.cloud.network.vpc.PrivateIpAddress;
39+
import com.cloud.network.vpc.PrivateIpVO;
40+
import com.cloud.user.Account;
41+
import com.cloud.vm.NicProfile;
2842

2943
public class PrivateGatewayRules extends RuleApplier {
3044

31-
private final List<? extends NetworkACLItem> rules;
45+
private static final Logger s_logger = Logger.getLogger(PrivateGatewayRules.class);
46+
47+
private final PrivateGateway _privateGateway;
48+
49+
private boolean _isAddOperation;
50+
private NicProfile _nicProfile;
3251

33-
public PrivateGatewayRules(final Network network, final List<? extends NetworkACLItem> rules) {
34-
super(network);
35-
this.rules = rules;
52+
public PrivateGatewayRules(final PrivateGateway privateGateway) {
53+
super(null);
54+
this._privateGateway = privateGateway;
3655
}
3756

3857
@Override
3958
public boolean accept(final NetworkTopologyVisitor visitor, final VirtualRouter router) throws ResourceUnavailableException {
4059
this._router = router;
4160

42-
return visitor.visit(this);
61+
boolean result = false;
62+
try {
63+
_network = _networkModel.getNetwork(_privateGateway.getNetworkId());
64+
NicProfile requested = _vpcNetworkHelper.createPrivateNicProfileForGateway(_privateGateway);
65+
66+
if (!_networkHelper.checkRouterVersion(router)) {
67+
s_logger.warn("Router requires upgrade. Unable to send command to router: " + router.getId());
68+
return false;
69+
}
70+
_nicProfile = _itMgr.addVmToNetwork(router, _network, requested);
71+
72+
//setup source nat
73+
if (_nicProfile != null) {
74+
_isAddOperation = true;
75+
//result = setupVpcPrivateNetwork(router, true, guestNic);
76+
result = visitor.visit(this);
77+
}
78+
} catch (Exception ex) {
79+
s_logger.warn("Failed to create private gateway " + _privateGateway + " on router " + router + " due to ", ex);
80+
} finally {
81+
if (!result) {
82+
s_logger.debug("Failed to setup gateway " + _privateGateway + " on router " + router + " with the source nat. Will now remove the gateway.");
83+
_isAddOperation = false;
84+
boolean isRemoved = destroyPrivateGateway(visitor);
85+
86+
if (isRemoved) {
87+
s_logger.debug("Removed the gateway " + _privateGateway + " from router " + router + " as a part of cleanup");
88+
} else {
89+
s_logger.warn("Failed to remove the gateway " + _privateGateway + " from router " + router + " as a part of cleanup");
90+
}
91+
}
92+
}
93+
return result;
94+
}
95+
96+
public boolean isAddOperation() {
97+
return _isAddOperation;
98+
}
99+
100+
public NicProfile getNicProfile() {
101+
return _nicProfile;
102+
}
103+
104+
public PrivateIpVO retrivePrivateIP() {
105+
PrivateIpVO ipVO = _privateIpDao.findByIpAndSourceNetworkId(_nicProfile.getNetworkId(), _nicProfile.getIp4Address());
106+
return ipVO;
107+
}
108+
109+
public Network retrievePrivateNetwork() {
110+
// This network might be the same we have already as an instance in the RuleApplier super class.
111+
// Just doing this here, but will double check is remove if it's not needed.
112+
Network network = _networkDao.findById(_nicProfile.getNetworkId());
113+
return network;
43114
}
44115

45-
public List<? extends NetworkACLItem> getRules() {
46-
return rules;
116+
protected boolean destroyPrivateGateway(final NetworkTopologyVisitor visitor) throws ConcurrentOperationException, ResourceUnavailableException {
117+
118+
if (!_networkModel.isVmPartOfNetwork(_router.getId(), _privateGateway.getNetworkId())) {
119+
s_logger.debug("Router doesn't have nic for gateway " + _privateGateway + " so no need to removed it");
120+
return true;
121+
}
122+
123+
Network privateNetwork = _networkModel.getNetwork(_privateGateway.getNetworkId());
124+
125+
s_logger.debug("Releasing private ip for gateway " + _privateGateway + " from " + _router);
126+
127+
_nicProfile = _networkModel.getNicProfile(_router, privateNetwork.getId(), null);
128+
boolean result = visitor.visit(this);
129+
if (!result) {
130+
s_logger.warn("Failed to release private ip for gateway " + _privateGateway + " on router " + _router);
131+
return false;
132+
}
133+
134+
//revoke network acl on the private gateway.
135+
if (!_networkACLMgr.revokeACLItemsForPrivateGw(_privateGateway)) {
136+
s_logger.debug("Failed to delete network acl items on " + _privateGateway + " from router " + _router);
137+
return false;
138+
}
139+
140+
s_logger.debug("Removing router " + _router + " from private network " + privateNetwork + " as a part of delete private gateway");
141+
result = result && _itMgr.removeVmFromNetwork(_router, privateNetwork, null);
142+
s_logger.debug("Private gateawy " + _privateGateway + " is removed from router " + _router);
143+
return result;
144+
}
145+
146+
public void createVpcAssociatePrivateIPCommands(final VirtualRouter router, final List<PrivateIpAddress> ips, final Commands cmds, final boolean add) {
147+
148+
// Ensure that in multiple vlans case we first send all ip addresses of vlan1, then all ip addresses of vlan2, etc..
149+
Map<String, ArrayList<PrivateIpAddress>> vlanIpMap = new HashMap<String, ArrayList<PrivateIpAddress>>();
150+
for (final PrivateIpAddress ipAddress : ips) {
151+
String vlanTag = ipAddress.getBroadcastUri();
152+
ArrayList<PrivateIpAddress> ipList = vlanIpMap.get(vlanTag);
153+
if (ipList == null) {
154+
ipList = new ArrayList<PrivateIpAddress>();
155+
}
156+
157+
ipList.add(ipAddress);
158+
vlanIpMap.put(vlanTag, ipList);
159+
}
160+
161+
for (Map.Entry<String, ArrayList<PrivateIpAddress>> vlanAndIp : vlanIpMap.entrySet()) {
162+
List<PrivateIpAddress> ipAddrList = vlanAndIp.getValue();
163+
IpAddressTO[] ipsToSend = new IpAddressTO[ipAddrList.size()];
164+
int i = 0;
165+
166+
for (final PrivateIpAddress ipAddr : ipAddrList) {
167+
Network network = _networkModel.getNetwork(ipAddr.getNetworkId());
168+
IpAddressTO ip =
169+
new IpAddressTO(Account.ACCOUNT_ID_SYSTEM, ipAddr.getIpAddress(), add, false, ipAddr.getSourceNat(), ipAddr.getBroadcastUri(), ipAddr.getGateway(),
170+
ipAddr.getNetmask(), ipAddr.getMacAddress(), null, false);
171+
172+
ip.setTrafficType(network.getTrafficType());
173+
ip.setNetworkName(_networkModel.getNetworkTag(router.getHypervisorType(), network));
174+
ipsToSend[i++] = ip;
175+
176+
}
177+
178+
IpAssocVpcCommand cmd = new IpAssocVpcCommand(ipsToSend);
179+
cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId()));
180+
cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(ipAddrList.get(0).getNetworkId(), router.getId()));
181+
cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName());
182+
DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId());
183+
cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString());
184+
185+
cmds.addCommand("IPAssocVpcCommand", cmd);
186+
}
47187
}
48188
}

server/src/com/cloud/network/rules/RuleApplier.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,10 @@
4040
import com.cloud.network.router.NetworkHelper;
4141
import com.cloud.network.router.RouterControlHelper;
4242
import com.cloud.network.router.VirtualRouter;
43+
import com.cloud.network.router.VpcNetworkHelper;
44+
import com.cloud.network.vpc.NetworkACLManager;
4345
import com.cloud.network.vpc.VpcManager;
46+
import com.cloud.network.vpc.dao.PrivateIpDao;
4447
import com.cloud.network.vpc.dao.VpcDao;
4548
import com.cloud.offerings.dao.NetworkOfferingDao;
4649
import com.cloud.service.dao.ServiceOfferingDao;
@@ -95,12 +98,16 @@ public abstract class RuleApplier {
9598

9699
protected IPAddressDao _ipAddressDao;
97100

101+
protected PrivateIpDao _privateIpDao;
102+
98103
protected VpcManager _vpcMgr;
99104

100105
protected VirtualMachineManager _itMgr;
101106

102107
protected IpAddressManager _ipAddrMgr;
103108

109+
protected NetworkACLManager _networkACLMgr;
110+
104111
protected Network _network;
105112

106113
protected VirtualRouter _router;
@@ -109,6 +116,8 @@ public abstract class RuleApplier {
109116

110117
protected NetworkHelper _networkHelper;
111118

119+
protected VpcNetworkHelper _vpcNetworkHelper;
120+
112121
public RuleApplier(final Network network) {
113122
_network = network;
114123
}

server/src/com/cloud/network/rules/VirtualNetworkApplianceFactory.java

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.cloud.network.Network;
3131
import com.cloud.network.NetworkModel;
3232
import com.cloud.network.PublicIpAddress;
33+
import com.cloud.network.RemoteAccessVpn;
3334
import com.cloud.network.VpnUser;
3435
import com.cloud.network.dao.FirewallRulesDao;
3536
import com.cloud.network.dao.IPAddressDao;
@@ -41,8 +42,11 @@
4142
import com.cloud.network.router.RouterControlHelper;
4243
import com.cloud.network.router.VirtualNetworkApplianceManager;
4344
import com.cloud.network.vpc.NetworkACLItem;
45+
import com.cloud.network.vpc.NetworkACLManager;
46+
import com.cloud.network.vpc.PrivateGateway;
4447
import com.cloud.network.vpc.StaticRouteProfile;
4548
import com.cloud.network.vpc.VpcManager;
49+
import com.cloud.network.vpc.dao.PrivateIpDao;
4650
import com.cloud.network.vpc.dao.VpcDao;
4751
import com.cloud.offerings.dao.NetworkOfferingDao;
4852
import com.cloud.service.dao.ServiceOfferingDao;
@@ -121,6 +125,9 @@ public class VirtualNetworkApplianceFactory {
121125
@Inject
122126
protected IPAddressDao _ipAddressDao;
123127

128+
@Inject
129+
protected PrivateIpDao _privateIpDao;
130+
124131
@Inject
125132
protected RouterControlHelper _routerControlHelper;
126133

@@ -130,9 +137,15 @@ public class VirtualNetworkApplianceFactory {
130137
@Inject
131138
protected IpAddressManager _ipAddrMgr;
132139

140+
@Inject
141+
protected NetworkACLManager _networkACLMgr;
142+
133143
@Inject
134144
protected NetworkHelper _networkHelper;
135145

146+
@Inject
147+
protected VpcNetworkHelper _vpcNetworkHelper;
148+
136149
public LoadBalancingRules createLoadBalancingRules(final Network network, final List<LoadBalancingRule> rules) {
137150
LoadBalancingRules lbRules = new LoadBalancingRules(network, rules);
138151

@@ -305,11 +318,31 @@ public DhcpPvlanRules createDhcpPvlanRules(final boolean isAddPvlan, final NicPr
305318
return pvlanRules;
306319
}
307320

308-
public StaticRoutesRules createStaticRoutesRules(List<StaticRouteProfile> staticRoutes) {
309-
StaticRoutesRules routesRules = new StaticRoutesRules(staticRoutes);
310-
311-
initBeans(routesRules);
312-
313-
return routesRules;
314-
}
321+
public StaticRoutesRules createStaticRoutesRules(final List<StaticRouteProfile> staticRoutes) {
322+
StaticRoutesRules routesRules = new StaticRoutesRules(staticRoutes);
323+
324+
initBeans(routesRules);
325+
326+
return routesRules;
327+
}
328+
329+
public AdvancedVpnRules createAdvancedVpnRules(final RemoteAccessVpn remoteAccessVpn, final List<? extends VpnUser> users) {
330+
AdvancedVpnRules vpnRules = new AdvancedVpnRules(remoteAccessVpn, users);
331+
332+
initBeans(vpnRules);
333+
334+
return vpnRules;
335+
}
336+
337+
public PrivateGatewayRules createPrivateGatewayRules(final PrivateGateway gateway) {
338+
PrivateGatewayRules gwRules = new PrivateGatewayRules(gateway);
339+
340+
initBeans(gwRules);
341+
342+
gwRules._privateIpDao = _privateIpDao;
343+
gwRules._networkACLMgr = _networkACLMgr;
344+
gwRules._vpcNetworkHelper = _vpcNetworkHelper;
345+
346+
return gwRules;
347+
}
315348
}

0 commit comments

Comments
 (0)