From 8dfc11a57ce8d210661e37897c0fc14dd26d3d73 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Fri, 28 Aug 2020 11:14:00 +0200 Subject: [PATCH 1/2] 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. --- .../main/java/com/cloud/vm/NicProfile.java | 3 ++- .../com/cloud/network/NetworkServiceImpl.java | 3 +++ .../guru/ExternalGuestNetworkGuru.java | 15 +++++++++++ .../cloud/network/guru/GuestNetworkGuru.java | 27 +++++++++++++------ .../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 6ef9cfe5db1..47021c85108 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 ad13887c4fc..766146639bd 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 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 da5a545c916..5da0952b0d1 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 7fb482f74d8..0ce00315ba2 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 39d902ffdf4..39b3f0da0e7 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); From ba4b04ff37ebd063a9c4ed73d3555c8f499ceb1a Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Fri, 28 Aug 2020 11:14:51 +0200 Subject: [PATCH 2/2] ui: Hide cpuspeed for custom constrained offering (#3996) For customer constrained offering, the cpu speed is fixed. Therefore the 'CpuSpeed' field should be hidden for customer constrained offering when change vm offering on UI. It is visible only for unconstrained offering. This is regression issue of #3245 --- ui/scripts/instances.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ui/scripts/instances.js b/ui/scripts/instances.js index 6d7e26fd9d1..71e629c7e97 100644 --- a/ui/scripts/instances.js +++ b/ui/scripts/instances.js @@ -2196,7 +2196,11 @@ return; if (selectedServiceofferingObj.iscustomized == true) { - $form.find('.form-item[rel=cpuSpeed]').css('display', 'inline-block'); + if (selectedServiceofferingObj.cpuspeed) { + $form.find('.form-item[rel=cpuSpeed]').hide(); + } else { + $form.find('.form-item[rel=cpuSpeed]').css('display', 'inline-block'); + } $form.find('.form-item[rel=cpuNumber]').css('display', 'inline-block'); $form.find('.form-item[rel=memory]').css('display', 'inline-block'); } else {