This is an automated email from the ASF dual-hosted git repository.
rohit pushed a commit to branch 4.14
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/4.14 by this push:
new 8dfc11a router: Save PlaceHolder nic for VR if network does not have
source nat (#3902)
8dfc11a is described below
commit 8dfc11a57ce8d210661e37897c0fc14dd26d3d73
Author: Wei Zhou <[email protected]>
AuthorDate: Fri Aug 28 11:14:00 2020 +0200
router: Save PlaceHolder nic for VR if network does not have source nat
(#3902)
This PR aims to fix the issue below
Create a network offering for isolated network, services:
Dns/Dhcp/Userdata, and enable it
create a isolated network with the new offering
create a vm
check the guest IP of virtual router,
restart network with cleanup
check the guest IP of new virtual router
The IP in step4 and step6 should be the same, but they are different
actually.
---
api/src/main/java/com/cloud/vm/NicProfile.java | 3 ++-
.../java/com/cloud/network/NetworkServiceImpl.java | 3 +++
.../network/guru/ExternalGuestNetworkGuru.java | 15 ++++++++++++
.../com/cloud/network/guru/GuestNetworkGuru.java | 27 +++++++++++++++-------
.../cloud/network/router/NetworkHelperImpl.java | 5 +++-
5 files changed, 43 insertions(+), 10 deletions(-)
diff --git a/api/src/main/java/com/cloud/vm/NicProfile.java
b/api/src/main/java/com/cloud/vm/NicProfile.java
index 6ef9cfe..47021c8 100644
--- a/api/src/main/java/com/cloud/vm/NicProfile.java
+++ b/api/src/main/java/com/cloud/vm/NicProfile.java
@@ -423,6 +423,7 @@ public class NicProfile implements InternalIdentity,
Serializable {
.append(iPv4Address)
.append("-")
.append(broadcastUri)
+ .append("]")
.toString();
}
-}
\ No newline at end of file
+}
diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
index ad13887..7661466 100644
--- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
+++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java
@@ -2438,6 +2438,9 @@ public class NetworkServiceImpl extends ManagerBase
implements NetworkService, C
// log assign usage events for new
offering
List<NicVO> nics =
_nicDao.listByNetworkId(networkId);
for (NicVO nic : nics) {
+ if (nic.getReservationStrategy()
== Nic.ReservationStrategy.PlaceHolder) {
+ continue;
+ }
long vmId = nic.getInstanceId();
VMInstanceVO vm =
_vmDao.findById(vmId);
if (vm == null) {
diff --git
a/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java
b/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java
index da5a545..5da0952 100644
--- a/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java
+++ b/server/src/main/java/com/cloud/network/guru/ExternalGuestNetworkGuru.java
@@ -30,6 +30,8 @@ import
com.cloud.exception.InsufficientVirtualNetworkCapacityException;
import com.cloud.network.IpAddressManager;
import com.cloud.network.Network;
import com.cloud.network.Network.GuestType;
+import com.cloud.network.Network.Provider;
+import com.cloud.network.Network.Service;
import com.cloud.network.Network.State;
import com.cloud.network.Networks.BroadcastDomainType;
import com.cloud.network.PhysicalNetwork;
@@ -51,10 +53,12 @@ import com.cloud.utils.db.DB;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.Ip;
import com.cloud.utils.net.NetUtils;
+import com.cloud.vm.Nic;
import com.cloud.vm.Nic.ReservationStrategy;
import com.cloud.vm.NicProfile;
import com.cloud.vm.NicVO;
import com.cloud.vm.ReservationContext;
+import com.cloud.vm.VirtualMachine;
import com.cloud.vm.VirtualMachineProfile;
import org.apache.cloudstack.context.CallContext;
import
org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService;
@@ -261,6 +265,17 @@ public class ExternalGuestNetworkGuru extends
GuestNetworkGuru {
profile.setIPv4Netmask(null);
}
+ if (config.getVpcId() == null && vm.getType() ==
VirtualMachine.Type.DomainRouter) {
+ boolean isPublicNetwork =
_networkModel.isProviderSupportServiceInNetwork(config.getId(),
Service.SourceNat, Provider.VirtualRouter);
+ if (!isPublicNetwork) {
+ Nic placeholderNic =
_networkModel.getPlaceholderNicForRouter(config, null);
+ if (placeholderNic == null) {
+ s_logger.debug("Saving placeholder nic with ip4 address "
+ profile.getIPv4Address() +
+ " and ipv6 address " + profile.getIPv6Address() +
" for the network " + config);
+ _networkMgr.savePlaceholderNic(config,
profile.getIPv4Address(), profile.getIPv6Address(),
VirtualMachine.Type.DomainRouter);
+ }
+ }
+ }
return profile;
}
diff --git a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java
b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java
index 7fb482f..0ce0031 100644
--- a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java
+++ b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java
@@ -75,6 +75,7 @@ import com.cloud.utils.db.TransactionCallbackNoReturn;
import com.cloud.utils.db.TransactionStatus;
import com.cloud.utils.exception.CloudRuntimeException;
import com.cloud.utils.net.NetUtils;
+import com.cloud.vm.Nic;
import com.cloud.vm.Nic.ReservationStrategy;
import com.cloud.vm.NicProfile;
import com.cloud.vm.ReservationContext;
@@ -372,15 +373,25 @@ public abstract class GuestNetworkGuru extends
AdapterBase implements NetworkGur
if (isGateway) {
guestIp = network.getGateway();
- } else if (vm.getVirtualMachine().getType() ==
VirtualMachine.Type.DomainRouter) {
- guestIp =
_ipAddrMgr.acquireGuestIpAddressByPlacement(network, nic.getRequestedIPv4());
} else {
- guestIp = _ipAddrMgr.acquireGuestIpAddress(network,
nic.getRequestedIPv4());
- }
-
- if (!isGateway && guestIp == null && network.getGuestType() !=
GuestType.L2 &&
!_networkModel.listNetworkOfferingServices(network.getNetworkOfferingId()).isEmpty())
{
- throw new
InsufficientVirtualNetworkCapacityException("Unable to acquire Guest IP" + "
address for network " + network, DataCenter.class,
- dc.getId());
+ if (network.getGuestType() != GuestType.L2 && vm.getType()
== VirtualMachine.Type.DomainRouter) {
+ Nic placeholderNic =
_networkModel.getPlaceholderNicForRouter(network, null);
+ if (placeholderNic != null) {
+ s_logger.debug("Nic got an ip address " +
placeholderNic.getIPv4Address() + " stored in placeholder nic for the network "
+ network);
+ guestIp = placeholderNic.getIPv4Address();
+ }
+ }
+ if (guestIp == null) {
+ if (vm.getVirtualMachine().getType() ==
VirtualMachine.Type.DomainRouter) {
+ guestIp =
_ipAddrMgr.acquireGuestIpAddressByPlacement(network, nic.getRequestedIPv4());
+ } else {
+ guestIp =
_ipAddrMgr.acquireGuestIpAddress(network, nic.getRequestedIPv4());
+ }
+ }
+ if (guestIp == null && network.getGuestType() !=
GuestType.L2 &&
!_networkModel.listNetworkOfferingServices(network.getNetworkOfferingId()).isEmpty())
{
+ throw new
InsufficientVirtualNetworkCapacityException("Unable to acquire Guest IP" + "
address for network " + network, DataCenter.class,
+ dc.getId());
+ }
}
nic.setIPv4Address(guestIp);
diff --git
a/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java
b/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java
index 39d902f..39b3f0d 100644
--- a/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java
+++ b/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java
@@ -710,8 +710,8 @@ public class NetworkHelperImpl implements NetworkHelper {
if (guestNetwork != null) {
s_logger.debug("Adding nic for Virtual Router in Guest network " +
guestNetwork);
String defaultNetworkStartIp = null, defaultNetworkStartIpv6 =
null;
+ final Nic placeholder =
_networkModel.getPlaceholderNicForRouter(guestNetwork,
routerDeploymentDefinition.getPodId());
if (!routerDeploymentDefinition.isPublicNetwork()) {
- final Nic placeholder =
_networkModel.getPlaceholderNicForRouter(guestNetwork,
routerDeploymentDefinition.getPodId());
if (guestNetwork.getCidr() != null) {
if (placeholder != null && placeholder.getIPv4Address() !=
null) {
s_logger.debug("Requesting ipv4 address " +
placeholder.getIPv4Address() + " stored in placeholder nic for the network "
@@ -744,6 +744,9 @@ public class NetworkHelperImpl implements NetworkHelper {
}
}
}
+ } else if (placeholder != null) {
+ // Remove placeholder nic if router has public network
+ _nicDao.remove(placeholder.getId());
}
final NicProfile gatewayNic = new
NicProfile(defaultNetworkStartIp, defaultNetworkStartIpv6);