Skip to content

Commit 26b892d

Browse files
author
Alena Prokharchyk
committed
CLOUDSTACK-1771: fixed VirtualRouter nics assignment in the Shared networks. Before the fix VR could get a different IP address from the network upon recreation. With the fix the IP address assigned to the first VR in the network, will remain with the network till its entire lifecycle (stored in placeholder nic) and will be assigned to the VR every time it recreates in the network.
Shared networks in both - Advance and Basic - zone types are covered by this checkin
1 parent ba81253 commit 26b892d

17 files changed

Lines changed: 357 additions & 120 deletions

api/src/com/cloud/network/NetworkModel.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,4 +259,6 @@ Map<PublicIpAddress, Set<Service>> getIpToServices(List<? extends PublicIpAddres
259259
void checkRequestedIpAddresses(long networkId, String ip4, String ip6) throws InvalidParameterValueException;
260260

261261
String getStartIpv6Address(long id);
262+
263+
Nic getPlaceholderNic(Network network, Long podId);
262264
}

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

Lines changed: 20 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,9 @@
2525
import javax.inject.Inject;
2626
import javax.naming.ConfigurationException;
2727

28+
import org.apache.cloudstack.api.ApiConstants;
29+
import org.apache.cloudstack.api.response.ExternalFirewallResponse;
30+
import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
2831
import org.apache.log4j.Logger;
2932

3033
import com.cloud.agent.AgentManager;
@@ -42,7 +45,6 @@
4245
import com.cloud.agent.api.to.IpAddressTO;
4346
import com.cloud.agent.api.to.PortForwardingRuleTO;
4447
import com.cloud.agent.api.to.StaticNatRuleTO;
45-
import org.apache.cloudstack.api.ApiConstants;
4648
import com.cloud.configuration.Config;
4749
import com.cloud.configuration.dao.ConfigurationDao;
4850
import com.cloud.dc.DataCenter;
@@ -60,7 +62,6 @@
6062
import com.cloud.host.HostVO;
6163
import com.cloud.host.dao.HostDao;
6264
import com.cloud.host.dao.HostDetailsDao;
63-
import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
6465
import com.cloud.network.Networks.TrafficType;
6566
import com.cloud.network.dao.ExternalFirewallDeviceDao;
6667
import com.cloud.network.dao.ExternalFirewallDeviceVO;
@@ -80,10 +81,10 @@
8081
import com.cloud.network.dao.PhysicalNetworkVO;
8182
import com.cloud.network.dao.VpnUserDao;
8283
import com.cloud.network.rules.FirewallRule;
84+
import com.cloud.network.rules.FirewallRule.Purpose;
8385
import com.cloud.network.rules.FirewallRuleVO;
8486
import com.cloud.network.rules.PortForwardingRule;
8587
import com.cloud.network.rules.StaticNat;
86-
import com.cloud.network.rules.FirewallRule.Purpose;
8788
import com.cloud.network.rules.dao.PortForwardingRulesDao;
8889
import com.cloud.offering.NetworkOffering;
8990
import com.cloud.offerings.dao.NetworkOfferingDao;
@@ -92,7 +93,6 @@
9293
import com.cloud.resource.ResourceStateAdapter;
9394
import com.cloud.resource.ServerResource;
9495
import com.cloud.resource.UnableDeleteHostException;
95-
import org.apache.cloudstack.api.response.ExternalFirewallResponse;
9696
import com.cloud.user.Account;
9797
import com.cloud.user.AccountManager;
9898
import com.cloud.user.dao.AccountDao;
@@ -105,9 +105,8 @@
105105
import com.cloud.utils.exception.CloudRuntimeException;
106106
import com.cloud.utils.net.NetUtils;
107107
import com.cloud.utils.net.UrlUtil;
108-
import com.cloud.vm.Nic.ReservationStrategy;
109-
import com.cloud.vm.Nic.State;
110108
import com.cloud.vm.NicVO;
109+
import com.cloud.vm.Nic.ReservationStrategy;
111110
import com.cloud.vm.dao.DomainRouterDao;
112111
import com.cloud.vm.dao.NicDao;
113112

@@ -116,7 +115,8 @@ public abstract class ExternalFirewallDeviceManagerImpl extends AdapterBase impl
116115
@Inject HostDao _hostDao;
117116
@Inject NetworkServiceMapDao _ntwkSrvcProviderDao;
118117
@Inject DataCenterDao _dcDao;
119-
@Inject NetworkModel _networkMgr;
118+
@Inject NetworkModel _networkModel;
119+
@Inject NetworkManager _networkMgr;
120120
@Inject InlineLoadBalancerNicMapDao _inlineLoadBalancerNicMapDao;
121121
@Inject NicDao _nicDao;
122122
@Inject AgentManager _agentMgr;
@@ -428,7 +428,7 @@ public boolean manageGuestNetworkWithExternalFirewall(boolean add, Network netwo
428428
IPAddressVO sourceNatIp = null;
429429
if (!sharedSourceNat) {
430430
// Get the source NAT IP address for this account
431-
List<? extends IpAddress> sourceNatIps = _networkMgr.listPublicIpsAssignedToAccount(network.getAccountId(),
431+
List<? extends IpAddress> sourceNatIps = _networkModel.listPublicIpsAssignedToAccount(network.getAccountId(),
432432
zoneId, true);
433433

434434
if (sourceNatIps.size() != 1) {
@@ -455,7 +455,7 @@ public boolean manageGuestNetworkWithExternalFirewall(boolean add, Network netwo
455455
}
456456

457457
// Get network rate
458-
Integer networkRate = _networkMgr.getNetworkRate(network.getId(), null);
458+
Integer networkRate = _networkModel.getNetworkRate(network.getId(), null);
459459

460460
IpAddressTO ip = new IpAddressTO(account.getAccountId(), sourceNatIpAddress, add, false, !sharedSourceNat, publicVlanTag, null, null, null, networkRate, false);
461461
IpAddressTO[] ips = new IpAddressTO[1];
@@ -483,7 +483,7 @@ public boolean manageGuestNetworkWithExternalFirewall(boolean add, Network netwo
483483

484484
if (add && (!reservedIpAddressesForGuestNetwork.contains(network.getGateway()))) {
485485
// Insert a new NIC for this guest network to reserve the gateway address
486-
savePlaceholderNic(network, network.getGateway());
486+
_networkMgr.savePlaceholderNic(network, network.getGateway());
487487
}
488488

489489
// Delete any mappings used for inline external load balancers in this network
@@ -499,14 +499,13 @@ public boolean manageGuestNetworkWithExternalFirewall(boolean add, Network netwo
499499

500500
// on network shutdown, delete placeHolder nics used for the firewall device
501501
if (!add) {
502-
List<NicVO> guestIps = _nicDao.listByNetworkId(network.getId());
503-
for (NicVO guestIp : guestIps) {
504-
// only external firewall and external load balancer will create NicVO with PlaceHolder reservation strategy
505-
if (guestIp.getReservationStrategy().equals(ReservationStrategy.PlaceHolder) && guestIp.getIp4Address().equals(network.getGateway())) {
506-
_nicDao.remove(guestIp.getId());
502+
List<NicVO> nics = _nicDao.listByNetworkId(network.getId());
503+
for (NicVO nic : nics) {
504+
if (nic.getReservationStrategy().equals(ReservationStrategy.PlaceHolder) && nic.getIp4Address().equals(network.getGateway())) {
505+
s_logger.debug("Removing placeholder nic " + nic + " for the network " + network);
506+
_nicDao.remove(nic.getId());
507507
}
508508
}
509-
510509
freeFirewallForNetwork(network);
511510
}
512511

@@ -516,6 +515,7 @@ public boolean manageGuestNetworkWithExternalFirewall(boolean add, Network netwo
516515
return true;
517516
}
518517

518+
519519
@Override
520520
public boolean applyFirewallRules(Network network, List<? extends FirewallRule> rules) throws ResourceUnavailableException {
521521
// Find the external firewall in this zone
@@ -541,7 +541,7 @@ public boolean applyFirewallRules(Network network, List<? extends FirewallRule>
541541
if (rule.getSourceCidrList() == null && (rule.getPurpose() == Purpose.Firewall || rule.getPurpose() == Purpose.NetworkACL)) {
542542
_fwRulesDao.loadSourceCidrs((FirewallRuleVO)rule);
543543
}
544-
IpAddress sourceIp = _networkMgr.getIp(rule.getSourceIpAddressId());
544+
IpAddress sourceIp = _networkModel.getIp(rule.getSourceIpAddressId());
545545
FirewallRuleTO ruleTO = new FirewallRuleTO(rule, null, sourceIp.getAddress().addr());
546546
rulesTO.add(ruleTO);
547547
}
@@ -568,7 +568,7 @@ public boolean applyStaticNatRules(Network network, List<? extends StaticNat> ru
568568
List<StaticNatRuleTO> staticNatRules = new ArrayList<StaticNatRuleTO>();
569569

570570
for (StaticNat rule : rules) {
571-
IpAddress sourceIp = _networkMgr.getIp(rule.getSourceIpAddressId());
571+
IpAddress sourceIp = _networkModel.getIp(rule.getSourceIpAddressId());
572572
Vlan vlan = _vlanDao.findById(sourceIp.getVlanId());
573573

574574
StaticNatRuleTO ruleTO = new StaticNatRuleTO(0,vlan.getVlanTag(), sourceIp.getAddress().addr(), -1, -1, rule.getDestIpAddress(), -1, -1, "any", rule.isForRevoke(), false);
@@ -632,7 +632,7 @@ public boolean manageRemoteAccessVpn(boolean create, Network network, RemoteAcce
632632
}
633633

634634
// Create/delete VPN
635-
IpAddress ip = _networkMgr.getIp(vpn.getServerAddressId());
635+
IpAddress ip = _networkModel.getIp(vpn.getServerAddressId());
636636

637637
// Mask the IP range with the network's VLAN tag
638638
String[] ipRange = vpn.getIpRange().split("-");
@@ -712,14 +712,6 @@ public int getVlanOffset(long physicalNetworkId, int vlanTag) {
712712
return vlanTag - lowestVlanTag;
713713
}
714714

715-
private NicVO savePlaceholderNic(Network network, String ipAddress) {
716-
NicVO nic = new NicVO(null, null, network.getId(), null);
717-
nic.setIp4Address(ipAddress);
718-
nic.setReservationStrategy(ReservationStrategy.PlaceHolder);
719-
nic.setState(State.Reserved);
720-
return _nicDao.persist(nic);
721-
}
722-
723715
public int getGloballyConfiguredCidrSize() {
724716
try {
725717
String globalVlanBits = _configDao.getValue(Config.GuestVlanBits.key());
@@ -771,7 +763,7 @@ public boolean applyPortForwardingRules(Network network, List<? extends PortForw
771763
List<PortForwardingRuleTO> pfRules = new ArrayList<PortForwardingRuleTO>();
772764

773765
for (PortForwardingRule rule : rules) {
774-
IpAddress sourceIp = _networkMgr.getIp(rule.getSourceIpAddressId());
766+
IpAddress sourceIp = _networkModel.getIp(rule.getSourceIpAddressId());
775767
Vlan vlan = _vlanDao.findById(sourceIp.getVlanId());
776768

777769
PortForwardingRuleTO ruleTO = new PortForwardingRuleTO(rule, vlan.getVlanTag(), sourceIp.getAddress().addr());

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

Lines changed: 11 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,9 @@
2626
import javax.inject.Inject;
2727
import javax.naming.ConfigurationException;
2828

29+
import org.apache.cloudstack.api.ApiConstants;
30+
import org.apache.cloudstack.api.response.ExternalLoadBalancerResponse;
31+
import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
2932
import org.apache.log4j.Logger;
3033

3134
import com.cloud.agent.AgentManager;
@@ -41,7 +44,6 @@
4144
import com.cloud.agent.api.routing.NetworkElementCommand;
4245
import com.cloud.agent.api.to.IpAddressTO;
4346
import com.cloud.agent.api.to.LoadBalancerTO;
44-
import org.apache.cloudstack.api.ApiConstants;
4547
import com.cloud.configuration.Config;
4648
import com.cloud.configuration.dao.ConfigurationDao;
4749
import com.cloud.dc.DataCenter;
@@ -61,14 +63,15 @@
6163
import com.cloud.host.HostVO;
6264
import com.cloud.host.dao.HostDao;
6365
import com.cloud.host.dao.HostDetailsDao;
64-
import org.apache.cloudstack.network.ExternalNetworkDeviceManager.NetworkDevice;
6566
import com.cloud.network.Network.Provider;
6667
import com.cloud.network.Network.Service;
6768
import com.cloud.network.Networks.TrafficType;
6869
import com.cloud.network.addr.PublicIp;
6970
import com.cloud.network.dao.ExternalFirewallDeviceDao;
7071
import com.cloud.network.dao.ExternalLoadBalancerDeviceDao;
7172
import com.cloud.network.dao.ExternalLoadBalancerDeviceVO;
73+
import com.cloud.network.dao.ExternalLoadBalancerDeviceVO.LBDeviceAllocationState;
74+
import com.cloud.network.dao.ExternalLoadBalancerDeviceVO.LBDeviceState;
7275
import com.cloud.network.dao.IPAddressDao;
7376
import com.cloud.network.dao.IPAddressVO;
7477
import com.cloud.network.dao.InlineLoadBalancerNicMapDao;
@@ -83,8 +86,6 @@
8386
import com.cloud.network.dao.PhysicalNetworkServiceProviderDao;
8487
import com.cloud.network.dao.PhysicalNetworkServiceProviderVO;
8588
import com.cloud.network.dao.PhysicalNetworkVO;
86-
import com.cloud.network.dao.ExternalLoadBalancerDeviceVO.LBDeviceAllocationState;
87-
import com.cloud.network.dao.ExternalLoadBalancerDeviceVO.LBDeviceState;
8889
import com.cloud.network.element.IpDeployer;
8990
import com.cloud.network.element.NetworkElement;
9091
import com.cloud.network.element.StaticNatServiceProvider;
@@ -104,7 +105,6 @@
104105
import com.cloud.resource.ResourceStateAdapter;
105106
import com.cloud.resource.ServerResource;
106107
import com.cloud.resource.UnableDeleteHostException;
107-
import org.apache.cloudstack.api.response.ExternalLoadBalancerResponse;
108108
import com.cloud.user.Account;
109109
import com.cloud.user.AccountManager;
110110
import com.cloud.user.dao.AccountDao;
@@ -118,8 +118,7 @@
118118
import com.cloud.utils.exception.CloudRuntimeException;
119119
import com.cloud.utils.net.NetUtils;
120120
import com.cloud.utils.net.UrlUtil;
121-
import com.cloud.vm.Nic.ReservationStrategy;
122-
import com.cloud.vm.Nic.State;
121+
import com.cloud.vm.Nic;
123122
import com.cloud.vm.NicVO;
124123
import com.cloud.vm.dao.DomainRouterDao;
125124
import com.cloud.vm.dao.NicDao;
@@ -698,25 +697,6 @@ protected boolean freeLoadBalancerForNetwork(Network guestConfig) {
698697
return false;
699698
}
700699

701-
private NicVO savePlaceholderNic(Network network, String ipAddress) {
702-
NicVO nic = new NicVO(null, null, network.getId(), null);
703-
nic.setIp4Address(ipAddress);
704-
nic.setReservationStrategy(ReservationStrategy.PlaceHolder);
705-
nic.setState(State.Reserved);
706-
return _nicDao.persist(nic);
707-
}
708-
709-
private NicVO getPlaceholderNic(Network network) {
710-
List<NicVO> guestIps = _nicDao.listByNetworkId(network.getId());
711-
for (NicVO guestIp : guestIps) {
712-
// only external firewall and external load balancer will create NicVO with PlaceHolder reservation strategy
713-
if (guestIp.getReservationStrategy().equals(ReservationStrategy.PlaceHolder) && guestIp.getVmType() == null
714-
&& guestIp.getReserver() == null && !guestIp.getIp4Address().equals(network.getGateway())) {
715-
return guestIp;
716-
}
717-
}
718-
return null;
719-
}
720700

721701
private void applyStaticNatRuleForInlineLBRule(DataCenterVO zone, Network network, boolean revoked, String publicIp, String privateIp) throws ResourceUnavailableException {
722702
List<StaticNat> staticNats = new ArrayList<StaticNat>();
@@ -776,7 +756,7 @@ private MappingNic getLoadBalancingIpNic(DataCenterVO zone, Network network, lon
776756
// If a NIC doesn't exist for the load balancing IP address, create one
777757
loadBalancingIpNic = _nicDao.findByIp4AddressAndNetworkId(loadBalancingIpAddress, network.getId());
778758
if (loadBalancingIpNic == null) {
779-
loadBalancingIpNic = savePlaceholderNic(network, loadBalancingIpAddress);
759+
loadBalancingIpNic = _networkMgr.savePlaceholderNic(network, loadBalancingIpAddress);
780760
}
781761

782762
// Save a mapping between the source IP address and the load balancing IP address NIC
@@ -985,7 +965,7 @@ public boolean manageGuestNetworkWithExternalLoadBalancer(boolean add, Network g
985965

986966
if (add) {
987967
// on restart network, network could have already been implemented. If already implemented then return
988-
NicVO selfipNic = getPlaceholderNic(guestConfig);
968+
Nic selfipNic = _networkModel.getPlaceholderNic(guestConfig, null);
989969
if (selfipNic != null) {
990970
return true;
991971
}
@@ -999,7 +979,7 @@ public boolean manageGuestNetworkWithExternalLoadBalancer(boolean add, Network g
999979
}
1000980
} else {
1001981
// get the self-ip used by the load balancer
1002-
NicVO selfipNic = getPlaceholderNic(guestConfig);
982+
Nic selfipNic = _networkModel.getPlaceholderNic(guestConfig, null);
1003983
if (selfipNic == null) {
1004984
s_logger.warn("Network shutdwon requested on external load balancer element, which did not implement the network." +
1005985
" Either network implement failed half way through or already network shutdown is completed. So just returning.");
@@ -1027,10 +1007,10 @@ public boolean manageGuestNetworkWithExternalLoadBalancer(boolean add, Network g
10271007

10281008
if (add) {
10291009
// Insert a new NIC for this guest network to reserve the self IP
1030-
savePlaceholderNic(guestConfig, selfIp);
1010+
_networkMgr.savePlaceholderNic(guestConfig, selfIp);
10311011
} else {
10321012
// release the self-ip obtained from guest network
1033-
NicVO selfipNic = getPlaceholderNic(guestConfig);
1013+
Nic selfipNic = _networkModel.getPlaceholderNic(guestConfig, null);
10341014
_nicDao.remove(selfipNic.getId());
10351015

10361016
// release the load balancer allocated for the network

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import com.cloud.vm.Nic;
5353
import com.cloud.vm.NicProfile;
5454
import com.cloud.vm.NicSecondaryIp;
55+
import com.cloud.vm.NicVO;
5556
import com.cloud.vm.ReservationContext;
5657
import com.cloud.vm.VMInstanceVO;
5758
import com.cloud.vm.VirtualMachine;
@@ -346,4 +347,6 @@ public String allocateGuestIP(Account ipOwner, boolean isSystem, long zoneId, Lo
346347
String allocatePublicIpForGuestNic(Long networkId, DataCenter dc, Pod pod, Account caller, String requestedIp) throws InsufficientAddressCapacityException;
347348
boolean removeVmSecondaryIpsOfNic(long nicId);
348349

350+
NicVO savePlaceholderNic(Network network, String ip4Address);
351+
349352
}

0 commit comments

Comments
 (0)