From 74e9599f332aa4522dc20c2f39e124ae6a3a23d7 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Mon, 30 May 2022 11:57:02 +0530 Subject: [PATCH 01/49] VR: Support configurable MTU --- .../com/cloud/agent/api/to/IpAddressTO.java | 12 ++- .../java/com/cloud/agent/api/to/NicTO.java | 9 ++ .../main/java/com/cloud/network/Network.java | 4 + .../com/cloud/network/NetworkProfile.java | 12 +++ api/src/main/java/com/cloud/vm/Nic.java | 5 + .../main/java/com/cloud/vm/NicProfile.java | 32 ++++++ .../apache/cloudstack/alert/AlertService.java | 2 + .../apache/cloudstack/api/ApiConstants.java | 3 + .../user/network/CreateNetworkCmd.java | 24 +++++ .../user/network/UpdateNetworkCmd.java | 25 +++++ .../facade/IpAssociationConfigItem.java | 1 + .../virtualnetwork/model/IpAddress.java | 5 + .../service/NetworkOrchestrationService.java | 2 +- .../com/cloud/network/vpc/VpcManager.java | 5 +- .../cloud/vm/VirtualMachineManagerImpl.java | 1 + .../orchestration/NetworkOrchestrator.java | 98 ++++++++++++++++--- .../java/com/cloud/network/dao/NetworkVO.java | 26 +++++ .../upgrade/dao/Upgrade41700to41800.java | 87 ++++++++++++++++ .../src/main/java/com/cloud/vm/NicVO.java | 35 +++++++ .../META-INF/db/schema-41610to41700.sql | 7 ++ .../cluster/KubernetesClusterManagerImpl.java | 2 +- .../api/query/dao/DomainRouterJoinDao.java | 3 + .../query/dao/DomainRouterJoinDaoImpl.java | 14 +++ .../cloud/network/IpAddressManagerImpl.java | 8 +- .../com/cloud/network/NetworkServiceImpl.java | 47 +++++++-- .../cloud/network/guru/GuestNetworkGuru.java | 2 + .../network/router/CommandSetupHelper.java | 10 +- .../VirtualNetworkApplianceManagerImpl.java | 6 ++ .../com/cloud/network/vpc/VpcManagerImpl.java | 4 +- .../java/com/cloud/vm/UserVmManagerImpl.java | 4 +- .../network/CreatePrivateNetworkTest.java | 3 +- .../com/cloud/vpc/MockNetworkManagerImpl.java | 3 +- systemvm/debian/opt/cloud/bin/setup/common.sh | 14 +++ tools/appliance/build.sh | 8 +- 34 files changed, 486 insertions(+), 37 deletions(-) create mode 100644 engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41700to41800.java diff --git a/api/src/main/java/com/cloud/agent/api/to/IpAddressTO.java b/api/src/main/java/com/cloud/agent/api/to/IpAddressTO.java index c6baf7c34e4b..3d3186e648d6 100644 --- a/api/src/main/java/com/cloud/agent/api/to/IpAddressTO.java +++ b/api/src/main/java/com/cloud/agent/api/to/IpAddressTO.java @@ -39,10 +39,12 @@ public class IpAddressTO { private boolean newNic; private boolean isPrivateGateway; private NicTO nicTO; + + private Integer mtu; Map details; public IpAddressTO(long accountId, String ipAddress, boolean add, boolean firstIP, boolean sourceNat, String broadcastUri, String vlanGateway, String vlanNetmask, - String vifMacAddress, Integer networkRate, boolean isOneToOneNat) { + String vifMacAddress, Integer networkRate, boolean isOneToOneNat) { this.accountId = accountId; this.publicIp = ipAddress; this.add = add; @@ -155,6 +157,14 @@ public void setNicTO(NicTO nicTO) { this.nicTO = nicTO; } + public Integer getMtu() { + return mtu; + } + + public void setMtu(Integer mtu) { + this.mtu = mtu; + } + public Map getDetails() { return details; diff --git a/api/src/main/java/com/cloud/agent/api/to/NicTO.java b/api/src/main/java/com/cloud/agent/api/to/NicTO.java index 6a77f62cb07d..3a616170d7e0 100644 --- a/api/src/main/java/com/cloud/agent/api/to/NicTO.java +++ b/api/src/main/java/com/cloud/agent/api/to/NicTO.java @@ -31,6 +31,7 @@ public class NicTO extends NetworkTO { List nicSecIps; Map details; boolean dpdkEnabled; + Integer mtu; public NicTO() { super(); @@ -118,4 +119,12 @@ public boolean isDpdkEnabled() { public void setDpdkEnabled(boolean dpdkEnabled) { this.dpdkEnabled = dpdkEnabled; } + + public Integer getMtu() { + return mtu; + } + + public void setMtu(Integer mtu) { + this.mtu = mtu; + } } diff --git a/api/src/main/java/com/cloud/network/Network.java b/api/src/main/java/com/cloud/network/Network.java index 49408b9110da..72885430bb17 100644 --- a/api/src/main/java/com/cloud/network/Network.java +++ b/api/src/main/java/com/cloud/network/Network.java @@ -484,4 +484,8 @@ public void setIp6Address(String ip6Address) { String getRouterIpv6(); Date getCreated(); + + Integer getPublicIfaceMtu(); + + Integer getPrivateIfaceMtu(); } diff --git a/api/src/main/java/com/cloud/network/NetworkProfile.java b/api/src/main/java/com/cloud/network/NetworkProfile.java index f3c178767e85..99b9d256729c 100644 --- a/api/src/main/java/com/cloud/network/NetworkProfile.java +++ b/api/src/main/java/com/cloud/network/NetworkProfile.java @@ -22,8 +22,10 @@ import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.Mode; import com.cloud.network.Networks.TrafficType; +import org.apache.log4j.Logger; public class NetworkProfile implements Network { + static final Logger s_logger = Logger.getLogger(NetworkProfile.class); private final long id; private final String uuid; private final long dataCenterId; @@ -335,4 +337,14 @@ public Date getCreated() { return null; } + @Override + public Integer getPublicIfaceMtu() { + return null; + } + + @Override + public Integer getPrivateIfaceMtu() { + return null; + } + } diff --git a/api/src/main/java/com/cloud/vm/Nic.java b/api/src/main/java/com/cloud/vm/Nic.java index 7b8e27fd6560..8cc9a6878282 100644 --- a/api/src/main/java/com/cloud/vm/Nic.java +++ b/api/src/main/java/com/cloud/vm/Nic.java @@ -160,4 +160,9 @@ public enum ReservationStrategy { String getIPv6Cidr(); String getIPv6Address(); + +// Integer getVrPublicIfaceMtu(); +// +// Integer getVrPrivateIfaceMtu(); + Integer getMtu(); } diff --git a/api/src/main/java/com/cloud/vm/NicProfile.java b/api/src/main/java/com/cloud/vm/NicProfile.java index 7781d710d3c2..b2def5532cc6 100644 --- a/api/src/main/java/com/cloud/vm/NicProfile.java +++ b/api/src/main/java/com/cloud/vm/NicProfile.java @@ -70,6 +70,9 @@ public class NicProfile implements InternalIdentity, Serializable { String iPv6Dns1; String iPv6Dns2; String requestedIPv6; + Integer mtu; +// Integer vrPublicIfaceMtu; +// Integer vrPrivateIfaceMtu; // // CONSTRUCTORS @@ -396,6 +399,31 @@ public void setOrderIndex(Integer orderIndex) { this.orderIndex = orderIndex; } +// public Integer getVrPublicIfaceMtu() { +// return vrPublicIfaceMtu; +// } +// +// public void setVrPublicIfaceMtu(Integer vrPublicIfaceMtu) { +// this.vrPublicIfaceMtu = vrPublicIfaceMtu; +// } +// +// public Integer getVrPrivateIfaceMtu() { +// return vrPrivateIfaceMtu; +// } +// +// public void setVrPrivateIfaceMtu(Integer vrPrivateIfaceMtu) { +// this.vrPrivateIfaceMtu = vrPrivateIfaceMtu; +// } + + public Integer getMtu() { + return mtu; + } + + public void setMtu(Integer mtu) { + this.mtu = mtu; + } + + // // OTHER METHODS // @@ -426,6 +454,10 @@ public void deallocate() { isolationUri = null; orderIndex = null; + mtu = null; + +// vrPrivateIfaceMtu = null; +// vrPublicIfaceMtu = null; } diff --git a/api/src/main/java/org/apache/cloudstack/alert/AlertService.java b/api/src/main/java/org/apache/cloudstack/alert/AlertService.java index ff176d8a82ea..5b29426e6eb9 100644 --- a/api/src/main/java/org/apache/cloudstack/alert/AlertService.java +++ b/api/src/main/java/org/apache/cloudstack/alert/AlertService.java @@ -71,6 +71,8 @@ private AlertType(short type, String name, boolean isDefault) { public static final AlertType ALERT_TYPE_HA_ACTION = new AlertType((short)30, "ALERT.HA.ACTION", true); public static final AlertType ALERT_TYPE_CA_CERT = new AlertType((short)31, "ALERT.CA.CERT", true); public static final AlertType ALERT_TYPE_VM_SNAPSHOT = new AlertType((short)32, "ALERT.VM.SNAPSHOT", true); + public static final AlertType ALERT_TYPE_VR_PUBLIC_IFACE_MTU = new AlertType((short)32, "ALERT.VR.PUBLIC.IFACE.MTU", true); + public static final AlertType ALERT_TYPE_VR_PRIVATE_IFACE_MTU = new AlertType((short)32, "ALERT.VR.PRIVATE.IFACE.MTU", true); public short getType() { return type; diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java index 55002f70b1b2..1bd38025c7ba 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -909,6 +909,9 @@ public class ApiConstants { public static final String LOGOUT = "logout"; public static final String LIST_IDPS = "listIdps"; + public static final String PUBLIC_MTU = "publicmtu"; + public static final String PRIVATE_MTU = "privatemtu"; + public enum BootType { UEFI, BIOS; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java index 10aadee40e60..88de76bd9dc2 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java @@ -157,6 +157,14 @@ public class CreateNetworkCmd extends BaseCmd implements UserCmd { description = "The network this network is associated to. only available if create a Shared network") private Long associatedNetworkId; + @Parameter(name = ApiConstants.PUBLIC_MTU, type = CommandType.INTEGER, + description = "MTU to be configured on the network VR's public facing interfaces", since = "4.18.0") + private Integer publicMtu; + + @Parameter(name = ApiConstants.PRIVATE_MTU, type = CommandType.INTEGER, + description = "MTU to be configured on the network VR's public facing interfaces", since = "4.18.0") + private Integer privateMtu; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -326,6 +334,22 @@ public Long getAclId() { return aclId; } + public Integer getPublicMtu() { + return publicMtu != null ? publicMtu : 0; + } + + public void setPublicMtu(Integer publicMtu) { + this.publicMtu = publicMtu; + } + + public Integer getPrivateMtu() { + return privateMtu != null ? privateMtu : 0; + } + + public void setPrivateMtu(Integer privateMtu) { + this.privateMtu = privateMtu; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java index bb27579992fe..b5be5ea51e31 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java @@ -84,6 +84,14 @@ public class UpdateNetworkCmd extends BaseAsyncCustomIdCmd implements UserCmd { @Parameter(name= ApiConstants.FORCED, type = CommandType.BOOLEAN, description = "Setting this to true will cause a forced network update,", authorized = {RoleType.Admin}) private Boolean forced; + @Parameter(name = ApiConstants.PUBLIC_MTU, type = CommandType.INTEGER, + description = "MTU to be configured on the network VR's public facing interfaces") + private Integer publicMtu; + + @Parameter(name = ApiConstants.PRIVATE_MTU, type = CommandType.INTEGER, + description = "MTU to be configured on the network VR's public facing interfaces") + private Integer privateMtu; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -136,6 +144,23 @@ public boolean getForced(){ } return forced; } + + public Integer getPublicMtu() { + return publicMtu; + } + + public void setPublicMtu(Integer publicMtu) { + this.publicMtu = publicMtu; + } + + public Integer getPrivateMtu() { + return privateMtu; + } + + public void setPrivateMtu(Integer privateMtu) { + this.privateMtu = privateMtu; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/IpAssociationConfigItem.java b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/IpAssociationConfigItem.java index 36908536659e..e326f5cf18ab 100644 --- a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/IpAssociationConfigItem.java +++ b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/IpAssociationConfigItem.java @@ -43,6 +43,7 @@ public List generateConfig(final NetworkElementCommand cmd) { final IpAddress ipAddress = new IpAddress(ip.getPublicIp(), ip.isSourceNat(), ip.isAdd(), ip.isOneToOneNat(), ip.isFirstIP(), ip.getVlanGateway(), ip.getVlanNetmask(), ip.getVifMacAddress(), ip.getNicDevId(), ip.isNewNic(), ip.getTrafficType().toString()); ipAddress.setPrivateGateway(ip.isPrivateGateway()); + ipAddress.setMtu(ip.getMtu()); ips.add(ipAddress); } diff --git a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/IpAddress.java b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/IpAddress.java index 627bcf0daceb..d1b98f9c2162 100644 --- a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/IpAddress.java +++ b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/IpAddress.java @@ -34,6 +34,8 @@ public class IpAddress { private String nwType; private boolean isPrivateGateway; + private Integer mtu; + public IpAddress() { // Empty constructor for (de)serialization } @@ -142,4 +144,7 @@ public void setPrivateGateway(boolean isPrivateGateway) { this.isPrivateGateway = isPrivateGateway; } + public void setMtu(Integer mtu) { + this.mtu = mtu; + } } diff --git a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java index b79cce5f604e..56c6ea5f18cc 100644 --- a/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java +++ b/engine/api/src/main/java/org/apache/cloudstack/engine/orchestration/service/NetworkOrchestrationService.java @@ -187,7 +187,7 @@ void prepare(VirtualMachineProfile profile, DeployDestination dest, ReservationC Network createGuestNetwork(long networkOfferingId, String name, String displayText, String gateway, String cidr, String vlanId, boolean bypassVlanOverlapCheck, String networkDomain, Account owner, Long domainId, PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId, String ip6Gateway, String ip6Cidr, - Boolean displayNetworkEnabled, String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, String routerIp, String routerIpv6) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException; + Boolean displayNetworkEnabled, String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, String routerIp, String routerIpv6, Pair vrIfaceMTUs) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException; UserDataServiceProvider getPasswordResetProvider(Network network); diff --git a/engine/components-api/src/main/java/com/cloud/network/vpc/VpcManager.java b/engine/components-api/src/main/java/com/cloud/network/vpc/VpcManager.java index 56e70ca56f1f..a6f666dd45e6 100644 --- a/engine/components-api/src/main/java/com/cloud/network/vpc/VpcManager.java +++ b/engine/components-api/src/main/java/com/cloud/network/vpc/VpcManager.java @@ -20,6 +20,7 @@ import java.util.Map; import java.util.Set; +import com.cloud.utils.Pair; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import com.cloud.exception.ConcurrentOperationException; @@ -108,8 +109,8 @@ public interface VpcManager { */ Network createVpcGuestNetwork(long ntwkOffId, String name, String displayText, String gateway, String cidr, String vlanId, String networkDomain, Account owner, - Long domainId, PhysicalNetwork pNtwk, long zoneId, ACLType aclType, Boolean subdomainAccess, long vpcId, Long aclId, Account caller, - Boolean displayNetworkEnabled, String externalId, String ip6Gateway, String ip6Cidr) + Long domainId, PhysicalNetwork pNtwk, long zoneId, ACLType aclType, Boolean subdomainAccess, long vpcId, Long aclId, Account caller, + Boolean displayNetworkEnabled, String externalId, String ip6Gateway, String ip6Cidr, Pair vrIfaceMTUs) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException; diff --git a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java index 64e4ad891544..c68e6a646413 100755 --- a/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/main/java/com/cloud/vm/VirtualMachineManagerImpl.java @@ -3490,6 +3490,7 @@ public int compare(NicVO nic1, NicVO nic2) { return nicId1.compareTo(nicId2); } }); + for (final NicVO nic : nics) { final Network network = _networkModel.getNetwork(nic.getNetworkId()); final NicProfile nicProfile = diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index 3284511e01a5..8236f424db57 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -38,6 +38,11 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; +import com.cloud.api.query.dao.DomainRouterJoinDao; +import com.cloud.api.query.vo.DomainRouterJoinVO; +import com.cloud.network.NetworkServiceImpl; +import com.cloud.network.guru.GuestNetworkGuru; +import com.cloud.network.guru.PublicNetworkGuru; import com.cloud.server.ManagementServer; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.annotation.AnnotationService; @@ -312,6 +317,8 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @Inject DomainRouterDao routerDao; @Inject + DomainRouterJoinDao routerJoinDao; + @Inject RemoteAccessVpnDao _remoteAccessVpnDao; @Inject VpcVirtualNetworkApplianceService _routerService; @@ -358,6 +365,8 @@ public void setNetworkElements(final List networkElements) { List ipDeployers; + private static final String s_publicNetworkReserver = PublicNetworkGuru.class.getSimpleName(); + private static final String s_guestNetworkReserver = GuestNetworkGuru.class.getSimpleName(); public List getIpDeployers() { return ipDeployers; } @@ -736,7 +745,6 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { final NetworkVO networkPersisted = _networksDao.persist(vo, vo.getGuestType() == Network.GuestType.Isolated, finalizeServicesAndProvidersForNetwork(offering, plan.getPhysicalNetworkId())); networks.add(networkPersisted); - if (network.getPvlanType() != null) { NetworkDetailVO detailVO = new NetworkDetailVO(networkPersisted.getId(), ApiConstants.ISOLATED_PVLAN_TYPE, network.getPvlanType().toString(), true); networkDetailsDao.persist(detailVO); @@ -993,16 +1001,56 @@ public Pair allocateNic(final NicProfile requested, final N } deviceId = applyProfileToNic(vo, profile, deviceId); - + s_logger.info("PEARL - vpc id: " + network.getVpcId()); + if (vm.getType() == Type.DomainRouter) { + setMtuDetailsInVRNic(vm.getId(), network, vo); + } vo = _nicDao.persist(vo); final Integer networkRate = _networkModel.getNetworkRate(network.getId(), vm.getId()); final NicProfile vmNic = new NicProfile(vo, network, vo.getBroadcastUri(), vo.getIsolationUri(), networkRate, _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag(vm.getHypervisorType(), network)); - + if (vm.getType() == Type.DomainRouter) { + setMtuInVRNicProfile(vm.getId(), network.getTrafficType(), vmNic); + } return new Pair(vmNic, Integer.valueOf(deviceId)); } + private void setMtuDetailsInVRNic(final long vmId, Network network, NicVO vo) { + if (TrafficType.Public == network.getTrafficType()) { + NetworkVO networkVO = getGuestNetworkRouter(vmId); + if (networkVO != null) { + vo.setMtu(networkVO.getPublicIfaceMtu()); + } + } else if (TrafficType.Guest == network.getTrafficType()) { + vo.setMtu(network.getPrivateIfaceMtu()); + } + } + + private void setMtuInVRNicProfile(final long vmId, TrafficType trafficType, NicProfile vmNic) { + NetworkVO networkVO = getGuestNetworkRouter(vmId); + if (TrafficType.Public == trafficType) { + if (networkVO != null) { + vmNic.setMtu(networkVO.getPublicIfaceMtu()); + } + } else if (TrafficType.Guest == trafficType) { + if (networkVO != null) { + vmNic.setMtu(networkVO.getPrivateIfaceMtu()); + } + } + } + + private NetworkVO getGuestNetworkRouter(long routerId) { + List routerVo = routerJoinDao.getRouterByIdAndTrafficType(routerId, TrafficType.Guest); + if (routerVo.isEmpty()) { + return null; + } + DomainRouterJoinVO guestRouterDetails = routerVo.get(0); + long networkId = guestRouterDetails.getNetworkId(); + NetworkVO networkVO = _networksDao.findById(networkId); + return networkVO; + } + /** * If the requested IPv4 address from the NicProfile was configured then it configures the IPv4 address, Netmask and Gateway to deploy the VM with the requested IP. */ @@ -1854,7 +1902,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { public void prepare(final VirtualMachineProfile vmProfile, final DeployDestination dest, final ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { final List nics = _nicDao.listByVmId(vmProfile.getId()); - + List guestNics = nics.stream().filter(nic -> s_guestNetworkReserver.equals(nic.getReserver())).collect(Collectors.toList()); // we have to implement default nics first - to ensure that default network elements start up first in multiple //nics case // (need for setting DNS on Dhcp to domR's Ip4 address) @@ -1878,6 +1926,9 @@ public int compare(final NicVO nic1, final NicVO nic2) { final NetworkVO network = implemented.second(); final NicProfile profile = prepareNic(vmProfile, dest, context, nic.getId(), network); + if (vmProfile.getType() == Type.DomainRouter) { + setMtuInVRNicProfile(vmProfile.getId(), network.getTrafficType(), profile); + } vmProfile.addNic(profile); } } @@ -1923,16 +1974,18 @@ public NicProfile prepareNic(final VirtualMachineProfile vmProfile, final Deploy if (profile.getReservationStrategy() != null) { nic.setReservationStrategy(profile.getReservationStrategy()); } - - updateNic(nic, network.getId(), 1); } else { profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), networkRate, _networkModel.isSecurityGroupSupportedInNetwork(network), _networkModel.getNetworkTag(vmProfile.getHypervisorType(), network)); guru.updateNicProfile(profile, network); nic.setState(Nic.State.Reserved); - updateNic(nic, network.getId(), 1); } + if (vmProfile.getType() == Type.DomainRouter) { + setMtuDetailsInVRNic(vmProfile.getId(), network, nic); + } + updateNic(nic, network.getId(), 1); + final List providersToImplement = getNetworkProviders(network.getId()); for (final NetworkElement element : networkElements) { if (providersToImplement.contains(element.getProvider())) { @@ -2430,7 +2483,7 @@ public Network createPrivateNetwork(final long networkOfferingId, final String n // create network for private gateway return createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, bypassVlanOverlapCheck, null, owner, null, pNtwk, pNtwk.getDataCenterId(), ACLType.Account, null, - vpcId, null, null, true, null, null, null, true, null, null); + vpcId, null, null, true, null, null, null, true, null, null, null); } @Override @@ -2438,18 +2491,21 @@ public Network createPrivateNetwork(final long networkOfferingId, final String n public Network createGuestNetwork(final long networkOfferingId, final String name, final String displayText, final String gateway, final String cidr, String vlanId, boolean bypassVlanOverlapCheck, String networkDomain, final Account owner, final Long domainId, final PhysicalNetwork pNtwk, final long zoneId, final ACLType aclType, Boolean subdomainAccess, final Long vpcId, final String ip6Gateway, final String ip6Cidr, - final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, String routerIp, String routerIpv6) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { + final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, Network.PVlanType isolatedPvlanType, + String externalId, String routerIp, String routerIpv6, Pair vrIfaceMTUs) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { // create Isolated/Shared/L2 network return createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, bypassVlanOverlapCheck, networkDomain, owner, domainId, pNtwk, zoneId, aclType, subdomainAccess, vpcId, ip6Gateway, ip6Cidr, - isDisplayNetworkEnabled, isolatedPvlan, isolatedPvlanType, externalId, false, routerIp, routerIpv6); + isDisplayNetworkEnabled, isolatedPvlan, isolatedPvlanType, externalId, false, + routerIp, routerIpv6, vrIfaceMTUs); } @DB private Network createGuestNetwork(final long networkOfferingId, final String name, final String displayText, final String gateway, final String cidr, String vlanId, boolean bypassVlanOverlapCheck, String networkDomain, final Account owner, final Long domainId, final PhysicalNetwork pNtwk, final long zoneId, final ACLType aclType, Boolean subdomainAccess, final Long vpcId, final String ip6Gateway, final String ip6Cidr, - final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, final Boolean isPrivateNetwork, String routerIp, String routerIpv6) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { + final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, + final Boolean isPrivateNetwork, String routerIp, String routerIpv6, Pair vrIfaceMTUs) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { final NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId); final DataCenterVO zone = _dcDao.findById(zoneId); @@ -2724,6 +2780,23 @@ public Network doInTransaction(final TransactionStatus status) { userNetwork.setRouterIpv6(routerIpv6); } + if (vrIfaceMTUs != null) { + if (vrIfaceMTUs.first() != null & vrIfaceMTUs.first() > 0) { + userNetwork.setPublicIfaceMtu(vrIfaceMTUs.first()); + } else { + userNetwork.setPublicIfaceMtu(Integer.valueOf(NetworkServiceImpl.VRPublicInterfaceMtu.defaultValue())); + } + + if (vrIfaceMTUs.second() != null & vrIfaceMTUs.second() > 0) { + userNetwork.setPrivateIfaceMtu(vrIfaceMTUs.second()); + } else { + userNetwork.setPrivateIfaceMtu(Integer.valueOf(NetworkServiceImpl.VRPrivateInterfaceMtu.defaultValue())); + } + } else { + userNetwork.setPublicIfaceMtu(Integer.valueOf(NetworkServiceImpl.VRPublicInterfaceMtu.defaultValue())); + userNetwork.setPrivateIfaceMtu(Integer.valueOf(NetworkServiceImpl.VRPrivateInterfaceMtu.defaultValue())); + } + if (vlanIdFinal != null) { if (isolatedPvlan == null) { URI uri = null; @@ -4446,6 +4519,9 @@ public NicVO doInTransaction(TransactionStatus status) { || vo.getVmType() == VirtualMachine.Type.DomainRouter && _networksDao.findById(network.getId()).getTrafficType() == TrafficType.Guest) { _networksDao.setCheckForGc(network.getId()); } + if (vm.getType() == Type.DomainRouter) { + setMtuDetailsInVRNic(vm.getId(), network, vo); + } return vo; } diff --git a/engine/schema/src/main/java/com/cloud/network/dao/NetworkVO.java b/engine/schema/src/main/java/com/cloud/network/dao/NetworkVO.java index 4dbcda670a7a..8030b8d1d014 100644 --- a/engine/schema/src/main/java/com/cloud/network/dao/NetworkVO.java +++ b/engine/schema/src/main/java/com/cloud/network/dao/NetworkVO.java @@ -38,6 +38,7 @@ import com.cloud.utils.NumbersUtil; import com.cloud.utils.db.GenericDao; import com.cloud.utils.net.NetUtils; +import org.apache.log4j.Logger; /** * NetworkConfigurationVO contains information about a specific network. @@ -46,6 +47,7 @@ @Entity @Table(name = "networks") public class NetworkVO implements Network { + static final Logger s_logger = Logger.getLogger(NetworkVO.class); @Id @TableGenerator(name = "networks_sq", table = "sequence", pkColumnName = "name", valueColumnName = "value", pkColumnValue = "networks_seq", allocationSize = 1) @Column(name = "id") @@ -190,6 +192,12 @@ public class NetworkVO implements Network { @Transient PVlanType pVlanType; + @Column(name = "public_iface_mtu") + Integer publicIfaceMtu; + + @Column(name = "private_iface_mtu") + Integer privateIfaceMtu; + public NetworkVO() { uuid = UUID.randomUUID().toString(); } @@ -256,6 +264,8 @@ public NetworkVO(long id, Network that, long offeringId, String guruName, long d ip6Gateway = that.getIp6Gateway(); ip6Cidr = that.getIp6Cidr(); this.externalId = externalId; + this.publicIfaceMtu = that.getPublicIfaceMtu(); + this.privateIfaceMtu = that.getPrivateIfaceMtu(); } /** @@ -692,4 +702,20 @@ public String getRouterIpv6() { public void setRouterIpv6(String routerIpv6) { this.routerIpv6 = routerIpv6; } + + public Integer getPublicIfaceMtu() { + return publicIfaceMtu; + } + + public void setPublicIfaceMtu(Integer publicIfaceMtu) { + this.publicIfaceMtu = publicIfaceMtu; + } + + public Integer getPrivateIfaceMtu() { + return privateIfaceMtu; + } + + public void setPrivateIfaceMtu(Integer privateIfaceMtu) { + this.privateIfaceMtu = privateIfaceMtu; + } } diff --git a/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41700to41800.java b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41700to41800.java new file mode 100644 index 000000000000..eb9cf9c3bfb0 --- /dev/null +++ b/engine/schema/src/main/java/com/cloud/upgrade/dao/Upgrade41700to41800.java @@ -0,0 +1,87 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.upgrade.dao; + +import com.cloud.upgrade.SystemVmTemplateRegistration; +import com.cloud.utils.exception.CloudRuntimeException; +import org.apache.log4j.Logger; + +import java.io.InputStream; +import java.sql.Connection; + +public class Upgrade41700to41800 implements DbUpgrade, DbUpgradeSystemVmTemplate { + + final static Logger LOG = Logger.getLogger(Upgrade41700to41800.class); + private SystemVmTemplateRegistration systemVmTemplateRegistration; + + @Override + public String[] getUpgradableVersionRange() { + return new String[] {"4.17.0.0", "4.18.0.0"}; + } + + @Override + public String getUpgradedVersion() { + return "4.18.0.0"; + } + + @Override + public boolean supportsRollingUpgrade() { + return false; + } + + @Override + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-41700to41800.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); + } + + return new InputStream[] {script}; + } + + @Override + public void performDataMigration(Connection conn) { + + } + + @Override + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-41700to41800-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); + } + + return new InputStream[] {script}; + } + + private void initSystemVmTemplateRegistration() { + systemVmTemplateRegistration = new SystemVmTemplateRegistration(); + } + + @Override + public void updateSystemVmTemplates(Connection conn) { + LOG.debug("Updating System Vm template IDs"); + initSystemVmTemplateRegistration(); + try { + systemVmTemplateRegistration.updateSystemVmTemplates(conn); + } catch (Exception e) { + throw new CloudRuntimeException("Failed to find / register SystemVM template(s)"); + } + } +} diff --git a/engine/schema/src/main/java/com/cloud/vm/NicVO.java b/engine/schema/src/main/java/com/cloud/vm/NicVO.java index 2a7c6962cbd4..b624370096c7 100644 --- a/engine/schema/src/main/java/com/cloud/vm/NicVO.java +++ b/engine/schema/src/main/java/com/cloud/vm/NicVO.java @@ -124,6 +124,15 @@ protected NicVO() { @Column(name = "secondary_ip") boolean secondaryIp; + @Column(name = "mtu") + Integer mtu; + +// @Column(name = "vr_public_iface_mtu") +// Integer vrPublicIfaceMtu; +// +// @Column(name = "vr_private_iface_mtu") +// Integer vrPrivateIfaceMtu; + @Transient transient String nsxLogicalSwitchUuid; @@ -394,4 +403,30 @@ public String getNsxLogicalSwitchPortUuid() { public void setNsxLogicalSwitchPortUuid(String nsxLogicalSwitchPortUuid) { this.nsxLogicalSwitchPortUuid = nsxLogicalSwitchPortUuid; } + +// public Integer getVrPublicIfaceMtu() { +// return vrPublicIfaceMtu; +// } +// +// public void setVrPublicIfaceMtu(Integer vrPublicIfaceMtu) { +// this.vrPublicIfaceMtu = vrPublicIfaceMtu; +// } +// +// public Integer getVrPrivateIfaceMtu() { +// return vrPrivateIfaceMtu; +// } +// +// public void setVrPrivateIfaceMtu(Integer vrPrivateIfaceMtu) { +// this.vrPrivateIfaceMtu = vrPrivateIfaceMtu; +// } + + + @Override + public Integer getMtu() { + return mtu; + } + + public void setMtu(Integer mtu) { + this.mtu = mtu; + } } diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql index 6885e4992226..3030683fef97 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql @@ -972,3 +972,10 @@ WHERE not exists( SELECT 1 CALL ADD_GUEST_OS_AND_HYPERVISOR_MAPPING (2, 'Debian GNU/Linux 11 (64-bit)', 'XenServer', '8.2.1', 'Debian Bullseye 11'); CALL ADD_GUEST_OS_AND_HYPERVISOR_MAPPING (2, 'Debian GNU/Linux 11 (32-bit)', 'XenServer', '8.2.1', 'Debian Bullseye 11'); + + +-- TODO: Need to move to 4.17.0 -> 4.18.0 upgrade path + +ALTER TABLE `cloud`.`networks` ADD COLUMN `public_iface_mtu` bigint unsigned comment "MTU for VR public interface" ; +ALTER TABLE `cloud`.`networks` ADD COLUMN `private_iface_mtu` bigint unsigned comment "MTU for VR private interfaces" ; +ALTER TABLE `cloud`.`nics` ADD COLUMN `mtu` bigint unsigned comment "MTU for the VR interface" ; \ No newline at end of file diff --git a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java index 894ea4c49378..6ff0a8a4eb98 100644 --- a/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java +++ b/plugins/integrations/kubernetes-service/src/main/java/com/cloud/kubernetes/cluster/KubernetesClusterManagerImpl.java @@ -760,7 +760,7 @@ private Network getKubernetesClusterNetworkIfMissing(final String clusterName, f try { network = networkMgr.createGuestNetwork(networkOffering.getId(), clusterName + "-network", owner.getAccountName() + "-network", - null, null, null, false, null, owner, null, physicalNetwork, zone.getId(), ControlledEntity.ACLType.Account, null, null, null, null, true, null, null, null, null, null); + null, null, null, false, null, owner, null, physicalNetwork, zone.getId(), ControlledEntity.ACLType.Account, null, null, null, null, true, null, null, null, null, null, null); } catch (ConcurrentOperationException | InsufficientCapacityException | ResourceAllocationException e) { logAndThrow(Level.ERROR, String.format("Unable to create network for the Kubernetes cluster: %s", clusterName)); } diff --git a/server/src/main/java/com/cloud/api/query/dao/DomainRouterJoinDao.java b/server/src/main/java/com/cloud/api/query/dao/DomainRouterJoinDao.java index 961ab40a88df..e750c4872f1d 100644 --- a/server/src/main/java/com/cloud/api/query/dao/DomainRouterJoinDao.java +++ b/server/src/main/java/com/cloud/api/query/dao/DomainRouterJoinDao.java @@ -18,6 +18,7 @@ import java.util.List; +import com.cloud.network.Networks; import org.apache.cloudstack.api.response.DomainRouterResponse; import com.cloud.api.query.vo.DomainRouterJoinVO; @@ -34,4 +35,6 @@ public interface DomainRouterJoinDao extends GenericDao newDomainRouterView(VirtualRouter vr); List searchByIds(Long... ids); + + List getRouterByIdAndTrafficType(Long id, Networks.TrafficType trafficType); } diff --git a/server/src/main/java/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java b/server/src/main/java/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java index 70a20c647419..127a7700fff2 100644 --- a/server/src/main/java/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java +++ b/server/src/main/java/com/cloud/api/query/dao/DomainRouterJoinDaoImpl.java @@ -62,6 +62,7 @@ public class DomainRouterJoinDaoImpl extends GenericDaoBase vrSearch; private final SearchBuilder vrIdSearch; + private final SearchBuilder vrIdTrafficSearch; protected DomainRouterJoinDaoImpl() { @@ -73,6 +74,11 @@ protected DomainRouterJoinDaoImpl() { vrIdSearch.and("id", vrIdSearch.entity().getId(), SearchCriteria.Op.EQ); vrIdSearch.done(); + vrIdTrafficSearch = createSearchBuilder(); + vrIdTrafficSearch.and("id", vrIdTrafficSearch.entity().getId(), SearchCriteria.Op.EQ); + vrIdTrafficSearch.and("trafficType", vrIdTrafficSearch.entity().getTrafficType(), SearchCriteria.Op.EQ); + vrIdTrafficSearch.done(); + _count = "select count(distinct id) from domain_router_view WHERE "; } @@ -327,6 +333,14 @@ public List searchByIds(Long... vrIds) { return uvList; } + @Override + public List getRouterByIdAndTrafficType(Long id, TrafficType trafficType) { + SearchCriteria sc = vrIdTrafficSearch.create(); + sc.setParameters("id", id); + sc.setParameters("trafficType", trafficType); + return searchIncludingRemoved(sc, null, null, false); + } + @Override public List newDomainRouterView(VirtualRouter vr) { diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java index 7ec4d0fd37ef..33a3c2b744a1 100644 --- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java +++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java @@ -1801,8 +1801,12 @@ public Ternary, Network> doInTransaction(Transa s_logger.debug("Creating network for account " + owner + " from the network offering id=" + requiredOfferings.get(0).getId() + " as a part of createVlanIpRange process"); - guestNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), owner.getAccountName() + "-network", owner.getAccountName() - + "-network", null, null, null, false, null, owner, null, physicalNetwork, zoneId, ACLType.Account, null, null, null, null, true, null, null, null, null, null); + guestNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), + owner.getAccountName() + "-network", owner.getAccountName() + + "-network", null, null, null, false, null, + owner, null, physicalNetwork, zoneId, ACLType.Account, null, null, + null, null, true, null, null, + null, null, null, null); if (guestNetwork == null) { s_logger.warn("Failed to create default Virtual network for the account " + accountId + "in zone " + zoneId); throw new CloudRuntimeException("Failed to create a Guest Isolated Networks with SourceNAT " diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index cb6e2a526d65..034a7a868806 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -41,6 +41,7 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; +import com.cloud.alert.AlertManager; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ApiConstants; @@ -240,6 +241,12 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C private static final ConfigKey AllowEmptyStartEndIpAddress = new ConfigKey("Advanced", Boolean.class, "allow.empty.start.end.ipaddress", "true", "Allow creating network without mentioning start and end IP address", true, ConfigKey.Scope.Account); + public static final ConfigKey VRPublicInterfaceMtu = new ConfigKey("VirtualRouter", Integer.class, + "vr.public.interface.mtu", "1500", "MTU set on the VR's public facing interfaces", + true, ConfigKey.Scope.Zone); + public static final ConfigKey VRPrivateInterfaceMtu = new ConfigKey("VirtualRouter", Integer.class, + "vr.private.interface.mtu", "1500", "MTU set on the VR's private interfaces", + true, ConfigKey.Scope.Zone); private static final long MIN_VLAN_ID = 0L; private static final long MAX_VLAN_ID = 4095L; // 2^12 - 1 private static final long MIN_GRE_KEY = 0L; @@ -364,6 +371,8 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C Ipv6Service ipv6Service; @Inject Ipv6GuestPrefixSubnetNetworkMapDao ipv6GuestPrefixSubnetNetworkMapDao; + @Inject + private AlertManager alertManager; int _cidrLimit; boolean _allowSubdomainNetworkAccess; @@ -1254,7 +1263,8 @@ public Network createGuestNetwork(CreateNetworkCmd cmd) throws InsufficientCapac String externalId = cmd.getExternalId(); String isolatedPvlanType = cmd.getIsolatedPvlanType(); Long associatedNetworkId = cmd.getAssociatedNetworkId(); - + Integer publicMtu = cmd.getPublicMtu(); + Integer privateMtu = cmd.getPrivateMtu(); // Validate network offering NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId); if (ntwkOff == null || ntwkOff.isSystemOnly()) { @@ -1576,6 +1586,7 @@ public Network createGuestNetwork(CreateNetworkCmd cmd) throws InsufficientCapac throwInvalidIdException("Network offering with specified id doesn't support adding multiple ip ranges", ntwkOff.getUuid(), "networkOfferingId"); } + Pair interfaceMTUs = validateMtuConfig(publicMtu, privateMtu, zoneId); Network associatedNetwork = null; if (associatedNetworkId != null) { if (vlanId != null) { @@ -1592,7 +1603,7 @@ public Network createGuestNetwork(CreateNetworkCmd cmd) throws InsufficientCapac Network network = commitNetwork(networkOfferingId, gateway, startIP, endIP, netmask, networkDomain, vlanId, bypassVlanOverlapCheck, name, displayText, caller, physicalNetworkId, zoneId, domainId, isDomainSpecific, subdomainAccess, vpcId, startIPv6, endIPv6, ip6Gateway, ip6Cidr, displayNetwork, aclId, secondaryVlanId, privateVlanType, ntwkOff, pNtwk, aclType, owner, cidr, createVlan, - externalId, routerIp, routerIpv6, associatedNetwork); + externalId, routerIp, routerIpv6, associatedNetwork, interfaceMTUs); if (hideIpAddressUsage) { _networkDetailsDao.persist(new NetworkDetailVO(network.getId(), Network.hideIpAddressUsage, String.valueOf(hideIpAddressUsage), false)); @@ -1609,6 +1620,29 @@ public Network createGuestNetwork(CreateNetworkCmd cmd) throws InsufficientCapac return network; } + private Pair validateMtuConfig(Integer publicMtu, Integer privateMtu, Long zoneId) { + Integer vrMaxMtuForPublicIfaces = VRPublicInterfaceMtu.valueIn(zoneId); + Integer vrMaxMtuForPrivateIfaces = VRPrivateInterfaceMtu.valueIn(zoneId); + if (publicMtu > vrMaxMtuForPublicIfaces) { + String subject = "Incorrect MTU configured on network for public interfaces of the VR"; + String message = String.format("Configured MTU for network VR's public interfaces exceeds the upper limit " + + "enforced by zone level setting: %s. VR's public interfaces can be configured with a maximum MTU of %s", VRPublicInterfaceMtu.key(), VRPublicInterfaceMtu.valueIn(zoneId)); + s_logger.warn(message); + alertManager.sendAlert(AlertManager.AlertType.ALERT_TYPE_VR_PUBLIC_IFACE_MTU, zoneId, null, subject, message); + publicMtu = vrMaxMtuForPublicIfaces; + } + + if (privateMtu > vrMaxMtuForPrivateIfaces) { + String subject = "Incorrect MTU configured on network for private interface of the VR"; + String message = String.format("Configured MTU for network VR's public interfaces exceeds the upper limit " + + "enforced by zone level setting: %s. VR's public interfaces can be configured with a maximum MTU of %s", VRPublicInterfaceMtu.key(), VRPublicInterfaceMtu.valueIn(zoneId)); + s_logger.warn(message); + alertManager.sendAlert(AlertManager.AlertType.ALERT_TYPE_VR_PUBLIC_IFACE_MTU, zoneId, null, subject, message); + privateMtu = vrMaxMtuForPrivateIfaces; + } + return new Pair<>(publicMtu, privateMtu); + } + private Network implementAssociatedNetwork(Long associatedNetworkId, Account caller, Account owner, DataCenter zone, Long domainId, Long accountId, String cidr, String startIp, String endIp) throws InsufficientCapacityException { Network associatedNetwork = _networksDao.findById(associatedNetworkId); @@ -1734,7 +1768,7 @@ private Network commitNetwork(final Long networkOfferingId, final String gateway final boolean isDomainSpecific, final Boolean subdomainAccessFinal, final Long vpcId, final String startIPv6, final String endIPv6, final String ip6Gateway, final String ip6Cidr, final Boolean displayNetwork, final Long aclId, final String isolatedPvlan, final PVlanType isolatedPvlanType, final NetworkOfferingVO ntwkOff, final PhysicalNetwork pNtwk, final ACLType aclType, final Account ownerFinal, final String cidr, final boolean createVlan, final String externalId, String routerIp, String routerIpv6, - final Network associatedNetwork) throws InsufficientCapacityException, ResourceAllocationException { + final Network associatedNetwork, Pair vrIfaceMTUs) throws InsufficientCapacityException, ResourceAllocationException { try { Network network = Transaction.execute(new TransactionCallbackWithException() { @Override @@ -1793,7 +1827,7 @@ public Network doInTransaction(TransactionStatus status) throws InsufficientCapa } } network = _vpcMgr.createVpcGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, networkDomain, owner, sharedDomainId, pNtwk, zoneId, aclType, - subdomainAccess, vpcId, aclId, caller, displayNetwork, externalId, ip6Gateway, ip6Cidr); + subdomainAccess, vpcId, aclId, caller, displayNetwork, externalId, ip6Gateway, ip6Cidr, vrIfaceMTUs); } else { if (_configMgr.isOfferingForVpc(ntwkOff)) { throw new InvalidParameterValueException("Network offering can be used for VPC networks only"); @@ -1801,9 +1835,8 @@ public Network doInTransaction(TransactionStatus status) throws InsufficientCapa if (ntwkOff.isInternalLb()) { throw new InvalidParameterValueException("Internal Lb can be enabled on vpc networks only"); } - network = _networkMgr.createGuestNetwork(networkOfferingId, name, displayText, gateway, cidr, vlanId, bypassVlanOverlapCheck, networkDomain, owner, sharedDomainId, pNtwk, - zoneId, aclType, subdomainAccess, vpcId, ip6Gateway, ip6Cidr, displayNetwork, isolatedPvlan, isolatedPvlanType, externalId, routerIp, routerIpv6); + zoneId, aclType, subdomainAccess, vpcId, ip6Gateway, ip6Cidr, displayNetwork, isolatedPvlan, isolatedPvlanType, externalId, routerIp, routerIpv6, vrIfaceMTUs); } if (createVlan && network != null) { @@ -5384,6 +5417,6 @@ public String getConfigComponentName() { @Override public ConfigKey[] getConfigKeys() { - return new ConfigKey[] {AllowDuplicateNetworkName, AllowEmptyStartEndIpAddress}; + return new ConfigKey[] {AllowDuplicateNetworkName, AllowEmptyStartEndIpAddress, VRPrivateInterfaceMtu, VRPublicInterfaceMtu}; } } 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 be3d57eb48d4..6910d688e046 100644 --- a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java @@ -258,6 +258,8 @@ public Network design(final NetworkOffering offering, final DeploymentPlan plan, network.setPvlanType(userSpecified.getPvlanType()); } } + network.setPublicIfaceMtu(userSpecified.getPublicIfaceMtu()); + network.setPrivateIfaceMtu(userSpecified.getPrivateIfaceMtu()); } else { final String guestNetworkCidr = dc.getGuestNetworkCidr(); if (guestNetworkCidr == null && dc.getNetworkType() == NetworkType.Advanced) { diff --git a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java index 8a4e0b85f662..e1a2f09a3fe8 100644 --- a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java +++ b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java @@ -822,6 +822,7 @@ public int compare(final PublicIpAddress o1, final PublicIpAddress o2) { final IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, firstIP, ipAddr.isSourceNat(), BroadcastDomainType.fromString(ipAddr.getVlanTag()).toString(), ipAddr.getGateway(), ipAddr.getNetmask(), macAddress, networkRate, ipAddr.isOneToOneNat()); + s_logger.info("PEARL - ip address assoc network id : " + ipAddr.getAssociatedWithNetworkId() + " network id: " + ipAddr.getNetworkId() + " ip range : " + ipAddr.getIpRange() + " vmIp: " + ipAddr.getVmIp() ); setIpAddressNetworkParams(ip, network, router); ipsToSend[i++] = ip; @@ -946,7 +947,12 @@ public int compare(final PublicIpAddress o1, final PublicIpAddress o2) { final IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, firstIP, sourceNat, vlanId, vlanGateway, vlanNetmask, vifMacAddress, networkRate, ipAddr.isOneToOneNat()); - + NetworkVO networkVO = _networkDao.findById(ipAddr.getAssociatedWithNetworkId()); + if (networkVO.getPublicIfaceMtu() != null) { + ip.setMtu(networkVO.getPublicIfaceMtu()); + } + s_logger.info("PEARL - mtu: " + networkVO.getPublicIfaceMtu()); + s_logger.info("PEARL - ip address assoc network id : " + ipAddr.getAssociatedWithNetworkId() + " network id: " + ipAddr.getNetworkId() + " ip range : " + ipAddr.getIpRange() + " vmIp: " + ipAddr.getVmIp() + " pub ip:" + ip.getPublicIp()); setIpAddressNetworkParams(ip, network, router); if (router.getHypervisorType() == Hypervisor.HypervisorType.VMware) { Map details = new HashMap<>(); @@ -1282,7 +1288,7 @@ private void setIpAddressNetworkParams(IpAddressTO ipAddress, final Network netw ipAddress.setPrivateGateway(false); } ipAddress.setNetworkName(_networkModel.getNetworkTag(router.getHypervisorType(), network)); - + s_logger.info("PEARL - network name: " + network.getName() + " ip net name: " + ipAddress.getNetworkName()); final NetworkOfferingVO networkOfferingVO = _networkOfferingDao.findById(network.getNetworkOfferingId()); NicTO nicTO = new NicTO(); nicTO.setMac(ipAddress.getVifMacAddress()); diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 5ce43629087d..2cafb36bc3a1 100644 --- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -2028,13 +2028,19 @@ public boolean finalizeVirtualMachineProfile(final VirtualMachineProfile profile } } else if (nic.getTrafficType() == TrafficType.Guest) { + s_logger.info("Guest IP : " + nic.getIPv4Address()); dnsProvided = _networkModel.isProviderSupportServiceInNetwork(nic.getNetworkId(), Service.Dns, Provider.VirtualRouter); dhcpProvided = _networkModel.isProviderSupportServiceInNetwork(nic.getNetworkId(), Service.Dhcp, Provider.VirtualRouter); + buf.append(" privateMtu=").append(nic.getMtu()); // build bootloader parameter for the guest buf.append(createGuestBootLoadArgs(nic, defaultDns1, defaultDns2, router)); } else if (nic.getTrafficType() == TrafficType.Public) { + s_logger.info("Public IP : " + nic.getIPv4Address()); publicNetwork = true; + buf.append(" publicMtu=").append(nic.getMtu()); } + // todo: check all implementations of addnic (NicProfile) - and add the mtu details to the profile + } if (controlNic == null) { diff --git a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java index 781ee38c8a40..913eef1eb414 100644 --- a/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java +++ b/server/src/main/java/com/cloud/network/vpc/VpcManagerImpl.java @@ -2687,7 +2687,7 @@ public boolean isIpAllocatedToVpc(final IpAddress ip) { @Override public Network createVpcGuestNetwork(final long ntwkOffId, final String name, final String displayText, final String gateway, final String cidr, final String vlanId, String networkDomain, final Account owner, final Long domainId, final PhysicalNetwork pNtwk, final long zoneId, final ACLType aclType, final Boolean subdomainAccess, - final long vpcId, final Long aclId, final Account caller, final Boolean isDisplayNetworkEnabled, String externalId, String ip6Gateway, String ip6Cidr) throws ConcurrentOperationException, InsufficientCapacityException, + final long vpcId, final Long aclId, final Account caller, final Boolean isDisplayNetworkEnabled, String externalId, String ip6Gateway, String ip6Cidr, Pair vrIfaceMTUs) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { final Vpc vpc = getActiveVpc(vpcId); @@ -2712,7 +2712,7 @@ public Network createVpcGuestNetwork(final long ntwkOffId, final String name, fi // 2) Create network final Network guestNetwork = _ntwkMgr.createGuestNetwork(ntwkOffId, name, displayText, gateway, cidr, vlanId, false, networkDomain, owner, domainId, pNtwk, zoneId, aclType, - subdomainAccess, vpcId, ip6Gateway, ip6Cidr, isDisplayNetworkEnabled, null, null, externalId, null, null); + subdomainAccess, vpcId, ip6Gateway, ip6Cidr, isDisplayNetworkEnabled, null, null, externalId, null, null, vrIfaceMTUs); if (guestNetwork != null) { guestNetwork.setNetworkACLId(aclId); diff --git a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java index 384a3a03a0f0..21303e10e0fc 100644 --- a/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/main/java/com/cloud/vm/UserVmManagerImpl.java @@ -3730,7 +3730,7 @@ private NetworkVO createDefaultNetworkForAccount(DataCenter zone, Account owner, s_logger.debug("Creating network for account " + owner + " from the network offering id=" + requiredOfferings.get(0).getId() + " as a part of deployVM process"); Network newNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), owner.getAccountName() + "-network", owner.getAccountName() + "-network", null, null, null, false, null, owner, null, physicalNetwork, zone.getId(), ACLType.Account, null, null, null, null, true, null, null, - null, null, null); + null, null, null, null); if (newNetwork != null) { defaultNetwork = _networkDao.findById(newNetwork.getId()); } @@ -7237,7 +7237,7 @@ public void doInTransactionWithoutResult(TransactionStatus status) { Network newNetwork = _networkMgr.createGuestNetwork(requiredOfferings.get(0).getId(), newAccount.getAccountName() + "-network", newAccount.getAccountName() + "-network", null, null, null, false, null, newAccount, null, physicalNetwork, zone.getId(), ACLType.Account, null, null, - null, null, true, null, null, null, null, null); + null, null, true, null, null, null, null, null, null); // if the network offering has persistent set to true, implement the network if (requiredOfferings.get(0).isPersistent()) { DeployDestination dest = new DeployDestination(zone, null, null, null); diff --git a/server/src/test/java/com/cloud/network/CreatePrivateNetworkTest.java b/server/src/test/java/com/cloud/network/CreatePrivateNetworkTest.java index 7a0ea2e97218..812d619bb881 100644 --- a/server/src/test/java/com/cloud/network/CreatePrivateNetworkTest.java +++ b/server/src/test/java/com/cloud/network/CreatePrivateNetworkTest.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.UUID; +import com.cloud.utils.Pair; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; @@ -129,7 +130,7 @@ public void setup() throws Exception { ACLType.Account, false, 1L, false); when(networkService._networkMgr.createGuestNetwork(eq(ntwkOff.getId()), eq("bla"), eq("fake"), eq("10.1.1.1"), eq("10.1.1.0/24"), nullable(String.class), nullable(Boolean.class), nullable(String.class), eq(account), nullable(Long.class), eq(physicalNetwork), eq(physicalNetwork.getDataCenterId()), eq(ACLType.Account), nullable(Boolean.class), eq(1L), nullable(String.class), nullable(String.class), - nullable(Boolean.class), nullable(String.class), nullable(Network.PVlanType.class), nullable(String.class), nullable(String.class), nullable(String.class))).thenReturn(net); + nullable(Boolean.class), nullable(String.class), nullable(Network.PVlanType.class), nullable(String.class), nullable(String.class), nullable(String.class), nullable(Pair.class))).thenReturn(net); when( networkService._networkMgr.createPrivateNetwork(eq(ntwkOff.getId()), eq("bla"), eq("fake"), eq("10.1.1.1"), eq("10.1.1.0/24"), anyString(), anyBoolean(), eq(account), eq(physicalNetwork), eq(1L))).thenReturn(net); diff --git a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java index 09f00b7925fd..2287becb1362 100644 --- a/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java +++ b/server/src/test/java/com/cloud/vpc/MockNetworkManagerImpl.java @@ -663,7 +663,8 @@ public Network createPrivateNetwork(final long networkOfferingId, final String n @Override public Network createGuestNetwork(long networkOfferingId, String name, String displayText, String gateway, String cidr, String vlanId, boolean bypassVlanOverlapCheck, String networkDomain, Account owner, Long domainId, PhysicalNetwork physicalNetwork, long zoneId, ACLType aclType, Boolean subdomainAccess, Long vpcId, String gatewayv6, - String cidrv6, Boolean displayNetworkEnabled, String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, String routerIp, String routerIpv6) throws ConcurrentOperationException, InsufficientCapacityException, + String cidrv6, Boolean displayNetworkEnabled, String isolatedPvlan, Network.PVlanType isolatedPvlanType, + String externalId, String routerIp, String routerIpv6, Pair vrIfaceMTUs) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { // TODO Auto-generated method stub return null; diff --git a/systemvm/debian/opt/cloud/bin/setup/common.sh b/systemvm/debian/opt/cloud/bin/setup/common.sh index 18a78311aeec..e3ed5ebd7152 100755 --- a/systemvm/debian/opt/cloud/bin/setup/common.sh +++ b/systemvm/debian/opt/cloud/bin/setup/common.sh @@ -93,6 +93,14 @@ setup_interface() { echo " address $ip " >> /etc/network/interfaces echo " netmask $mask" >> /etc/network/interfaces fi + + if [ ! -z "$PUBLICMTU" ] && [ $intf == "eth0" ]; then + echo " mtu $PUBLICMTU" >> /etc/network/interfaces + fi + + if [ ! -z "$PRIVATEMTU" ] && [ $intf == "eth2" ]; then + echo " mtu $PRIVATEMTU" >> /etc/network/interfaces + fi fi if [ "$ip" == "0.0.0.0" -o "$ip" == "" ] @@ -882,6 +890,12 @@ parse_cmd_line() { privatekey) export PRIVATEKEY=$VALUE ;; + publicMtu) + export PUBLICMTU=$VALUE + ;; + privateMtu) + export PRIVATEMTU=$VALUE + ;; esac done echo -e "\n\t}\n}" >> ${CHEF_TMP_FILE} diff --git a/tools/appliance/build.sh b/tools/appliance/build.sh index 1c83f9aba510..79de31a9adeb 100755 --- a/tools/appliance/build.sh +++ b/tools/appliance/build.sh @@ -349,10 +349,10 @@ function main() { # process the disk at dist kvm_export - ovm_export - xen_server_export - vmware_export - hyperv_export +# ovm_export +# xen_server_export +# vmware_export +# hyperv_export rm -f "dist/${appliance}" cd dist && chmod +r * && cd .. cd dist && md5sum * > md5sum.txt && cd .. From 95fa5f5d07692af10cb02ff9d444401f0a37c1c5 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Tue, 31 May 2022 13:08:17 +0530 Subject: [PATCH 02/49] add support for vpc networks --- api/src/main/java/com/cloud/vm/Nic.java | 3 --- .../main/java/com/cloud/vm/NicProfile.java | 21 ----------------- .../facade/SetGuestNetworkConfigItem.java | 2 +- .../virtualnetwork/model/GuestNetwork.java | 6 +++++ .../orchestration/NetworkOrchestrator.java | 1 - .../src/main/java/com/cloud/vm/NicVO.java | 23 ------------------- .../network/router/CommandSetupHelper.java | 5 ---- systemvm/debian/opt/cloud/bin/cs/CsAddress.py | 9 ++++++++ systemvm/debian/opt/cloud/bin/cs_ip.py | 2 ++ tools/appliance/build.sh | 8 +++---- 10 files changed, 22 insertions(+), 58 deletions(-) diff --git a/api/src/main/java/com/cloud/vm/Nic.java b/api/src/main/java/com/cloud/vm/Nic.java index 8cc9a6878282..afc44b8d39fa 100644 --- a/api/src/main/java/com/cloud/vm/Nic.java +++ b/api/src/main/java/com/cloud/vm/Nic.java @@ -161,8 +161,5 @@ public enum ReservationStrategy { String getIPv6Address(); -// Integer getVrPublicIfaceMtu(); -// -// Integer getVrPrivateIfaceMtu(); Integer getMtu(); } diff --git a/api/src/main/java/com/cloud/vm/NicProfile.java b/api/src/main/java/com/cloud/vm/NicProfile.java index b2def5532cc6..3f37331b1e44 100644 --- a/api/src/main/java/com/cloud/vm/NicProfile.java +++ b/api/src/main/java/com/cloud/vm/NicProfile.java @@ -71,8 +71,6 @@ public class NicProfile implements InternalIdentity, Serializable { String iPv6Dns2; String requestedIPv6; Integer mtu; -// Integer vrPublicIfaceMtu; -// Integer vrPrivateIfaceMtu; // // CONSTRUCTORS @@ -399,22 +397,6 @@ public void setOrderIndex(Integer orderIndex) { this.orderIndex = orderIndex; } -// public Integer getVrPublicIfaceMtu() { -// return vrPublicIfaceMtu; -// } -// -// public void setVrPublicIfaceMtu(Integer vrPublicIfaceMtu) { -// this.vrPublicIfaceMtu = vrPublicIfaceMtu; -// } -// -// public Integer getVrPrivateIfaceMtu() { -// return vrPrivateIfaceMtu; -// } -// -// public void setVrPrivateIfaceMtu(Integer vrPrivateIfaceMtu) { -// this.vrPrivateIfaceMtu = vrPrivateIfaceMtu; -// } - public Integer getMtu() { return mtu; } @@ -456,9 +438,6 @@ public void deallocate() { orderIndex = null; mtu = null; -// vrPrivateIfaceMtu = null; -// vrPublicIfaceMtu = null; - } @Override diff --git a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetGuestNetworkConfigItem.java b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetGuestNetworkConfigItem.java index cb5dc4586c10..b9d4f52cccb5 100644 --- a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetGuestNetworkConfigItem.java +++ b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetGuestNetworkConfigItem.java @@ -73,7 +73,7 @@ public List generateConfig(final NetworkElementCommand cmd) { if (nic.getIp6Cidr() != null) { guestNetwork.setCidr6(String.valueOf(NetUtils.getIp6CidrSize(nic.getIp6Cidr()))); } - + guestNetwork.setMtu(nic.getMtu()); guestNetwork.setRouterIp6(command.getRouterIpv6()); guestNetwork.setRouterIp6Gateway(command.getRouterIpv6Gateway()); guestNetwork.setRouterIp6Cidr(command.getRouterIpv6Cidr()); diff --git a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/GuestNetwork.java b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/GuestNetwork.java index 6589c7806df0..9577bca3293c 100644 --- a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/GuestNetwork.java +++ b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/GuestNetwork.java @@ -38,6 +38,8 @@ public class GuestNetwork extends ConfigBase { private String routerIp6Gateway; private String routerIp6Cidr; + private Integer mtu; + public GuestNetwork() { super(ConfigBase.GUEST_NETWORK); } @@ -192,4 +194,8 @@ public String getRouterIp6Cidr() { public void setRouterIp6Cidr(String routerIp6Cidr) { this.routerIp6Cidr = routerIp6Cidr; } + + public void setMtu(Integer mtu) { + this.mtu = mtu; + } } \ No newline at end of file diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index 8236f424db57..71b15d40b94a 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -1001,7 +1001,6 @@ public Pair allocateNic(final NicProfile requested, final N } deviceId = applyProfileToNic(vo, profile, deviceId); - s_logger.info("PEARL - vpc id: " + network.getVpcId()); if (vm.getType() == Type.DomainRouter) { setMtuDetailsInVRNic(vm.getId(), network, vo); } diff --git a/engine/schema/src/main/java/com/cloud/vm/NicVO.java b/engine/schema/src/main/java/com/cloud/vm/NicVO.java index b624370096c7..8905ebf732b1 100644 --- a/engine/schema/src/main/java/com/cloud/vm/NicVO.java +++ b/engine/schema/src/main/java/com/cloud/vm/NicVO.java @@ -127,12 +127,6 @@ protected NicVO() { @Column(name = "mtu") Integer mtu; -// @Column(name = "vr_public_iface_mtu") -// Integer vrPublicIfaceMtu; -// -// @Column(name = "vr_private_iface_mtu") -// Integer vrPrivateIfaceMtu; - @Transient transient String nsxLogicalSwitchUuid; @@ -404,23 +398,6 @@ public void setNsxLogicalSwitchPortUuid(String nsxLogicalSwitchPortUuid) { this.nsxLogicalSwitchPortUuid = nsxLogicalSwitchPortUuid; } -// public Integer getVrPublicIfaceMtu() { -// return vrPublicIfaceMtu; -// } -// -// public void setVrPublicIfaceMtu(Integer vrPublicIfaceMtu) { -// this.vrPublicIfaceMtu = vrPublicIfaceMtu; -// } -// -// public Integer getVrPrivateIfaceMtu() { -// return vrPrivateIfaceMtu; -// } -// -// public void setVrPrivateIfaceMtu(Integer vrPrivateIfaceMtu) { -// this.vrPrivateIfaceMtu = vrPrivateIfaceMtu; -// } - - @Override public Integer getMtu() { return mtu; diff --git a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java index e1a2f09a3fe8..87455d2161c6 100644 --- a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java +++ b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java @@ -822,8 +822,6 @@ public int compare(final PublicIpAddress o1, final PublicIpAddress o2) { final IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, firstIP, ipAddr.isSourceNat(), BroadcastDomainType.fromString(ipAddr.getVlanTag()).toString(), ipAddr.getGateway(), ipAddr.getNetmask(), macAddress, networkRate, ipAddr.isOneToOneNat()); - s_logger.info("PEARL - ip address assoc network id : " + ipAddr.getAssociatedWithNetworkId() + " network id: " + ipAddr.getNetworkId() + " ip range : " + ipAddr.getIpRange() + " vmIp: " + ipAddr.getVmIp() ); - setIpAddressNetworkParams(ip, network, router); ipsToSend[i++] = ip; if (ipAddr.isSourceNat()) { @@ -951,8 +949,6 @@ public int compare(final PublicIpAddress o1, final PublicIpAddress o2) { if (networkVO.getPublicIfaceMtu() != null) { ip.setMtu(networkVO.getPublicIfaceMtu()); } - s_logger.info("PEARL - mtu: " + networkVO.getPublicIfaceMtu()); - s_logger.info("PEARL - ip address assoc network id : " + ipAddr.getAssociatedWithNetworkId() + " network id: " + ipAddr.getNetworkId() + " ip range : " + ipAddr.getIpRange() + " vmIp: " + ipAddr.getVmIp() + " pub ip:" + ip.getPublicIp()); setIpAddressNetworkParams(ip, network, router); if (router.getHypervisorType() == Hypervisor.HypervisorType.VMware) { Map details = new HashMap<>(); @@ -1288,7 +1284,6 @@ private void setIpAddressNetworkParams(IpAddressTO ipAddress, final Network netw ipAddress.setPrivateGateway(false); } ipAddress.setNetworkName(_networkModel.getNetworkTag(router.getHypervisorType(), network)); - s_logger.info("PEARL - network name: " + network.getName() + " ip net name: " + ipAddress.getNetworkName()); final NetworkOfferingVO networkOfferingVO = _networkOfferingDao.findById(network.getNetworkOfferingId()); NicTO nicTO = new NicTO(); nicTO.setMac(ipAddress.getVifMacAddress()); diff --git a/systemvm/debian/opt/cloud/bin/cs/CsAddress.py b/systemvm/debian/opt/cloud/bin/cs/CsAddress.py index e676bb5aedd6..a7a02d279c2b 100755 --- a/systemvm/debian/opt/cloud/bin/cs/CsAddress.py +++ b/systemvm/debian/opt/cloud/bin/cs/CsAddress.py @@ -296,6 +296,7 @@ def list(self): class CsIP: + DEFAULT_MTU = '1500' def __init__(self, dev, config): self.dev = dev @@ -320,6 +321,8 @@ def configure(self, address): logging.info("Configuring address %s on device %s", self.ip(), self.dev) cmd = "ip addr add dev %s %s brd +" % (self.dev, self.ip()) CsHelper.execute(cmd) + cmd = "ifconfig %s mtu %s up" % (self.dev, self.mtu()) + CsHelper.execute(cmd) except Exception as e: logging.info("Exception occurred ==> %s" % e) @@ -390,6 +393,12 @@ def get_ip_address(self): return self.address['public_ip'] return "unknown" + def mtu(self): + logging.info(self.address) + if "mtu" in self.address: + return self.address['mtu'] + return CsIP.DEFAULT_MTU + def setup_router_control(self): if self.config.is_vpc(): return diff --git a/systemvm/debian/opt/cloud/bin/cs_ip.py b/systemvm/debian/opt/cloud/bin/cs_ip.py index a4e0c33e798b..fbe7629970a9 100755 --- a/systemvm/debian/opt/cloud/bin/cs_ip.py +++ b/systemvm/debian/opt/cloud/bin/cs_ip.py @@ -55,6 +55,8 @@ def merge(dbag, ip): ip['cidr'] = str(ipo.ip) + '/' + str(ipo.prefixlen) ip['size'] = str(ipo.prefixlen) ip['network'] = str(ipo.network) + '/' + str(ipo.prefixlen) + if 'mtu' in ip: + ip['mtu'] = str(ip['mtu']) if 'nw_type' not in ip.keys(): ip['nw_type'] = 'public' else: diff --git a/tools/appliance/build.sh b/tools/appliance/build.sh index 79de31a9adeb..1c83f9aba510 100755 --- a/tools/appliance/build.sh +++ b/tools/appliance/build.sh @@ -349,10 +349,10 @@ function main() { # process the disk at dist kvm_export -# ovm_export -# xen_server_export -# vmware_export -# hyperv_export + ovm_export + xen_server_export + vmware_export + hyperv_export rm -f "dist/${appliance}" cd dist && chmod +r * && cd .. cd dist && md5sum * > md5sum.txt && cd .. From a43c40a4121818b73095f7703d5db01aef51ead0 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Wed, 1 Jun 2022 17:51:04 +0530 Subject: [PATCH 03/49] pass mtu for vpc tier network --- .../com/cloud/agent/api/SetupGuestNetworkCommand.java | 10 ++++++++++ .../facade/SetGuestNetworkConfigItem.java | 4 ++-- .../resource/virtualnetwork/model/GuestNetwork.java | 4 ++++ .../com/cloud/network/router/CommandSetupHelper.java | 11 ++++++++++- systemvm/debian/opt/cloud/bin/setup/common.sh | 8 ++++---- 5 files changed, 30 insertions(+), 7 deletions(-) diff --git a/core/src/main/java/com/cloud/agent/api/SetupGuestNetworkCommand.java b/core/src/main/java/com/cloud/agent/api/SetupGuestNetworkCommand.java index e9781993239b..4fe4e9e09d15 100644 --- a/core/src/main/java/com/cloud/agent/api/SetupGuestNetworkCommand.java +++ b/core/src/main/java/com/cloud/agent/api/SetupGuestNetworkCommand.java @@ -36,6 +36,8 @@ public class SetupGuestNetworkCommand extends NetworkElementCommand { String routerIpv6Gateway = null; String routerIpv6Cidr = null; + Integer mtu = null; + public NicTO getNic() { return nic; } @@ -114,4 +116,12 @@ public void setDefaultIp6Dns1(String defaultIp6Dns1) { public void setDefaultIp6Dns2(String defaultIp6Dns2) { this.defaultIp6Dns2 = defaultIp6Dns2; } + + public Integer getMtu() { + return mtu; + } + + public void setMtu(Integer mtu) { + this.mtu = mtu; + } } diff --git a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetGuestNetworkConfigItem.java b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetGuestNetworkConfigItem.java index b9d4f52cccb5..dda77495cc5a 100644 --- a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetGuestNetworkConfigItem.java +++ b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetGuestNetworkConfigItem.java @@ -31,13 +31,13 @@ import com.cloud.agent.resource.virtualnetwork.model.ConfigBase; import com.cloud.agent.resource.virtualnetwork.model.GuestNetwork; import com.cloud.utils.net.NetUtils; +import org.apache.log4j.Logger; public class SetGuestNetworkConfigItem extends AbstractConfigItemFacade { - + private static final Logger LOG = Logger.getLogger(SetGuestNetworkConfigItem.class); @Override public List generateConfig(final NetworkElementCommand cmd) { final SetupGuestNetworkCommand command = (SetupGuestNetworkCommand) cmd; - final NicTO nic = command.getNic(); final String routerGIP = command.getAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP); final String gateway = command.getAccessDetail(NetworkElementCommand.GUEST_NETWORK_GATEWAY); diff --git a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/GuestNetwork.java b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/GuestNetwork.java index 9577bca3293c..d8f341239c6d 100644 --- a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/GuestNetwork.java +++ b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/GuestNetwork.java @@ -198,4 +198,8 @@ public void setRouterIp6Cidr(String routerIp6Cidr) { public void setMtu(Integer mtu) { this.mtu = mtu; } + + public Integer getMtu() { + return mtu; + } } \ No newline at end of file diff --git a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java index 87455d2161c6..cb528504c43e 100644 --- a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java +++ b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java @@ -823,6 +823,9 @@ public int compare(final PublicIpAddress o1, final PublicIpAddress o2) { final IpAddressTO ip = new IpAddressTO(ipAddr.getAccountId(), ipAddr.getAddress().addr(), add, firstIP, ipAddr.isSourceNat(), BroadcastDomainType.fromString(ipAddr.getVlanTag()).toString(), ipAddr.getGateway(), ipAddr.getNetmask(), macAddress, networkRate, ipAddr.isOneToOneNat()); setIpAddressNetworkParams(ip, network, router); + if (network.getPublicIfaceMtu() != null) { + ip.setMtu(network.getPublicIfaceMtu()); + } ipsToSend[i++] = ip; if (ipAddr.isSourceNat()) { sourceNatIpAdd = new Pair(ip, ipAddr.getNetworkId()); @@ -1086,7 +1089,9 @@ public void createVpcAssociatePrivateIPCommands(final VirtualRouter router, fina final Network network = _networkModel.getNetwork(ipAddr.getNetworkId()); final IpAddressTO ip = new IpAddressTO(Account.ACCOUNT_ID_SYSTEM, ipAddr.getIpAddress(), add, false, ipAddr.getSourceNat(), ipAddr.getBroadcastUri(), ipAddr.getGateway(), ipAddr.getNetmask(), ipAddr.getMacAddress(), null, false); - + if (network.getPrivateIfaceMtu() != null) { + ip.setMtu(network.getPublicIfaceMtu()); + } setIpAddressNetworkParams(ip, network, router); ipsToSend[i++] = ip; @@ -1145,6 +1150,10 @@ public SetupGuestNetworkCommand createSetupGuestNetworkCommand(final DomainRoute updateSetupGuestNetworkCommandIpv6(setupCmd, network, publicNic, defaultIp6Dns1, defaultIp6Dns2); } + if (nic.getMtu() != null) { + setupCmd.setMtu(nic.getMtu()); + } + final String brd = NetUtils.long2Ip(NetUtils.ip2Long(guestNic.getIPv4Address()) | ~NetUtils.ip2Long(guestNic.getIPv4Netmask())); setupCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); setupCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(network.getId(), router.getId())); diff --git a/systemvm/debian/opt/cloud/bin/setup/common.sh b/systemvm/debian/opt/cloud/bin/setup/common.sh index e3ed5ebd7152..0b36da490f7d 100755 --- a/systemvm/debian/opt/cloud/bin/setup/common.sh +++ b/systemvm/debian/opt/cloud/bin/setup/common.sh @@ -94,12 +94,12 @@ setup_interface() { echo " netmask $mask" >> /etc/network/interfaces fi - if [ ! -z "$PUBLICMTU" ] && [ $intf == "eth0" ]; then - echo " mtu $PUBLICMTU" >> /etc/network/interfaces + if [ ! -z "$PRIVATEMTU" ] && [ $intf == "eth0" ]; then + echo " mtu $PRIVATEMTU" >> /etc/network/interfaces fi - if [ ! -z "$PRIVATEMTU" ] && [ $intf == "eth2" ]; then - echo " mtu $PRIVATEMTU" >> /etc/network/interfaces + if [ ! -z "$PUBLICMTU" ] && [ $intf == "eth2" ]; then + echo " mtu $PUBLICMTU" >> /etc/network/interfaces fi fi From 633a84dad29875010d3901f7ff537ed6f609af2b Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Thu, 9 Jun 2022 16:22:07 +0530 Subject: [PATCH 04/49] add support to update interface mtu --- .../com/cloud/agent/api/to/IpAddressTO.java | 6 + .../cloud/network/element/NetworkElement.java | 4 + .../apache/cloudstack/api/ApiConstants.java | 1 + .../user/network/CreateNetworkCmd.java | 4 +- .../agent/api/SetupGuestNetworkCommand.java | 10 -- .../api/routing/UpdateNetworkCommand.java | 52 ++++++++ .../resource/virtualnetwork/VRScripts.java | 2 + .../VirtualRoutingResource.java | 44 +++++++ .../virtualnetwork/model/IpAddress.java | 1 - .../com/cloud/network/dao/IPAddressDao.java | 2 + .../cloud/network/dao/IPAddressDaoImpl.java | 7 ++ .../resource/LibvirtComputingResource.java | 51 ++++++++ .../cloud/hypervisor/HypervisorGuruBase.java | 1 + .../com/cloud/network/NetworkModelImpl.java | 6 + .../com/cloud/network/NetworkServiceImpl.java | 112 +++++++++++++++++- .../cloud/network/guru/DirectNetworkGuru.java | 8 ++ .../network/router/CommandSetupHelper.java | 27 +++-- .../VirtualNetworkApplianceManagerImpl.java | 21 ++-- systemvm/debian/opt/cloud/bin/cs/CsAddress.py | 3 + systemvm/debian/opt/cloud/bin/merge.py | 1 + .../debian/opt/cloud/bin/update_config.py | 2 - .../opt/cloud/bin/update_interface_config.sh | 50 ++++++++ 22 files changed, 384 insertions(+), 31 deletions(-) create mode 100644 core/src/main/java/com/cloud/agent/api/routing/UpdateNetworkCommand.java create mode 100644 systemvm/debian/opt/cloud/bin/update_interface_config.sh diff --git a/api/src/main/java/com/cloud/agent/api/to/IpAddressTO.java b/api/src/main/java/com/cloud/agent/api/to/IpAddressTO.java index 3d3186e648d6..f63aab38842e 100644 --- a/api/src/main/java/com/cloud/agent/api/to/IpAddressTO.java +++ b/api/src/main/java/com/cloud/agent/api/to/IpAddressTO.java @@ -58,6 +58,12 @@ public IpAddressTO(long accountId, String ipAddress, boolean add, boolean firstI this.oneToOneNat = isOneToOneNat; } + public IpAddressTO(String ipAddress, Integer mtu, String vlanNetmask ) { + this.publicIp = ipAddress; + this.mtu = mtu; + this.vlanNetmask = vlanNetmask; + } + protected IpAddressTO() { } diff --git a/api/src/main/java/com/cloud/network/element/NetworkElement.java b/api/src/main/java/com/cloud/network/element/NetworkElement.java index fa67575edd35..ad661f58352d 100644 --- a/api/src/main/java/com/cloud/network/element/NetworkElement.java +++ b/api/src/main/java/com/cloud/network/element/NetworkElement.java @@ -137,4 +137,8 @@ boolean shutdownProviderInstances(PhysicalNetworkServiceProvider provider, Reser * @return true/false */ boolean verifyServicesCombination(Set services); + +// default boolean update(Network network) throws ResourceUnavailableException { +// return true; +// } } diff --git a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java index 1bd38025c7ba..09b6451fec1f 100644 --- a/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/main/java/org/apache/cloudstack/api/ApiConstants.java @@ -912,6 +912,7 @@ public class ApiConstants { public static final String PUBLIC_MTU = "publicmtu"; public static final String PRIVATE_MTU = "privatemtu"; + public static final Integer DEFAULT_MTU = 1500; public enum BootType { UEFI, BIOS; diff --git a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java index 88de76bd9dc2..e1cc89ec5614 100644 --- a/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java +++ b/api/src/main/java/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java @@ -335,7 +335,7 @@ public Long getAclId() { } public Integer getPublicMtu() { - return publicMtu != null ? publicMtu : 0; + return publicMtu != null ? publicMtu : ApiConstants.DEFAULT_MTU; } public void setPublicMtu(Integer publicMtu) { @@ -343,7 +343,7 @@ public void setPublicMtu(Integer publicMtu) { } public Integer getPrivateMtu() { - return privateMtu != null ? privateMtu : 0; + return privateMtu != null ? privateMtu : ApiConstants.DEFAULT_MTU; } public void setPrivateMtu(Integer privateMtu) { diff --git a/core/src/main/java/com/cloud/agent/api/SetupGuestNetworkCommand.java b/core/src/main/java/com/cloud/agent/api/SetupGuestNetworkCommand.java index 4fe4e9e09d15..e9781993239b 100644 --- a/core/src/main/java/com/cloud/agent/api/SetupGuestNetworkCommand.java +++ b/core/src/main/java/com/cloud/agent/api/SetupGuestNetworkCommand.java @@ -36,8 +36,6 @@ public class SetupGuestNetworkCommand extends NetworkElementCommand { String routerIpv6Gateway = null; String routerIpv6Cidr = null; - Integer mtu = null; - public NicTO getNic() { return nic; } @@ -116,12 +114,4 @@ public void setDefaultIp6Dns1(String defaultIp6Dns1) { public void setDefaultIp6Dns2(String defaultIp6Dns2) { this.defaultIp6Dns2 = defaultIp6Dns2; } - - public Integer getMtu() { - return mtu; - } - - public void setMtu(Integer mtu) { - this.mtu = mtu; - } } diff --git a/core/src/main/java/com/cloud/agent/api/routing/UpdateNetworkCommand.java b/core/src/main/java/com/cloud/agent/api/routing/UpdateNetworkCommand.java new file mode 100644 index 000000000000..bd8ca42b5914 --- /dev/null +++ b/core/src/main/java/com/cloud/agent/api/routing/UpdateNetworkCommand.java @@ -0,0 +1,52 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.agent.api.routing; + +import com.cloud.agent.api.to.IpAddressTO; +import com.cloud.hypervisor.Hypervisor; + +public class UpdateNetworkCommand extends NetworkElementCommand{ + IpAddressTO[] ipAddresses; + + Hypervisor.HypervisorType hypervisorType; + + public UpdateNetworkCommand(IpAddressTO[] ips) { + this.ipAddresses = ips; + } + + @Override + public boolean executeInSequence() { + return false; + } + + public IpAddressTO[] getIpAddresses() { + return ipAddresses; + } + + @Override + public int getAnswersCount() { + return ipAddresses.length; + } + + public Hypervisor.HypervisorType getHypervisorType() { + return hypervisorType; + } + + public void setHypervisorType(Hypervisor.HypervisorType hypervisorType) { + this.hypervisorType = hypervisorType; + } +} diff --git a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VRScripts.java b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VRScripts.java index 4450dfe66f23..39d36eecdf68 100644 --- a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VRScripts.java +++ b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VRScripts.java @@ -78,5 +78,7 @@ public class VRScripts { public static final String RETRIEVE_DIAGNOSTICS = "get_diagnostics_files.py"; public static final String VR_FILE_CLEANUP = "cleanup.sh"; + public static final String VR_UPDATE_MTU = "update_interface_config.sh"; + public static final String ROUTER_FILESYSTEM_WRITABLE_CHECK = "filesystem_writable_check.py"; } \ No newline at end of file diff --git a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java index 8a265a78123b..c19826003611 100644 --- a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java +++ b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java @@ -34,6 +34,8 @@ import javax.naming.ConfigurationException; +import com.cloud.agent.api.routing.UpdateNetworkCommand; +import com.cloud.agent.api.to.IpAddressTO; import com.cloud.utils.PasswordGenerator; import org.apache.cloudstack.ca.SetupCertificateAnswer; import org.apache.cloudstack.ca.SetupCertificateCommand; @@ -134,6 +136,10 @@ public Answer executeRequest(final NetworkElementCommand cmd) { return execute((AggregationControlCommand)cmd); } + if (cmd instanceof UpdateNetworkCommand) { + return execute((UpdateNetworkCommand) cmd); + } + if (_vrAggregateCommandsSet.containsKey(routerName)) { _vrAggregateCommandsSet.get(routerName).add(cmd); aggregated = true; @@ -216,6 +222,44 @@ private Answer executeQueryCommand(NetworkElementCommand cmd) { } } + private static String getRouterSshControlIp(NetworkElementCommand cmd) { + String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); + if (s_logger.isDebugEnabled()) + s_logger.debug("Use router's private IP for SSH control. IP : " + routerIp); + return routerIp; + } + + private Answer execute(UpdateNetworkCommand cmd) { + IpAddressTO[] ipAddresses = cmd.getIpAddresses(); + String routerIp = getRouterSshControlIp(cmd); + boolean finalResult = true; + for (IpAddressTO ipAddressTO : ipAddresses) { + try { + ExecutionResult result = _vrDeployer.executeInVR(routerIp, VRScripts.VR_UPDATE_MTU, + ipAddressTO.getPublicIp() + " " + ipAddressTO.getVlanNetmask() + " " + ipAddressTO.getMtu() + " " + 15); + if (s_logger.isDebugEnabled()) + s_logger.debug("result: " + result.isSuccess() + ", output: " + result.getDetails()); + if (!result.isSuccess()) { + s_logger.warn(String.format("Failed to update interface mtu to %s on interface with ip: %s", + ipAddressTO.getMtu(), ipAddressTO.getPublicIp())); + finalResult = false; + continue; + } + s_logger.info(String.format("Successfully updated mtu to %s on interface with ip: %s", + ipAddressTO.getMtu(), ipAddressTO.getPublicIp())); + finalResult &= true; + } catch (Exception e) { + String msg = "Prepare UpdateNetwork failed due to " + e.toString(); + s_logger.error(msg, e); + return new Answer(cmd, e); + } + } + if (finalResult) { + return new Answer(cmd, true, null); + } + return new Answer(cmd, new CloudRuntimeException("Failed to update interface mtu")); + } + private ExecutionResult applyConfigToVR(String routerAccessIp, ConfigItem c) { return applyConfigToVR(routerAccessIp, c, VRScripts.VR_SCRIPT_EXEC_TIMEOUT); } diff --git a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/IpAddress.java b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/IpAddress.java index d1b98f9c2162..d4fab41245b0 100644 --- a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/IpAddress.java +++ b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/IpAddress.java @@ -35,7 +35,6 @@ public class IpAddress { private boolean isPrivateGateway; private Integer mtu; - public IpAddress() { // Empty constructor for (de)serialization } diff --git a/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDao.java b/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDao.java index 5e71d543333b..eea6c3581102 100644 --- a/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDao.java +++ b/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDao.java @@ -94,4 +94,6 @@ public interface IPAddressDao extends GenericDao { IPAddressVO findByVmIdAndNetworkId(long networkId, long vmId); IPAddressVO findByAccountIdAndZoneIdAndStateAndIpAddress(long accountId, long dcId, State state, String ipAddress); + + List listByNetworkId(long networkId); } diff --git a/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDaoImpl.java b/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDaoImpl.java index 42359d06047a..c3a6a8a75c64 100644 --- a/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDaoImpl.java +++ b/engine/schema/src/main/java/com/cloud/network/dao/IPAddressDaoImpl.java @@ -500,4 +500,11 @@ public IPAddressVO findByAccountIdAndZoneIdAndStateAndIpAddress(long accountId, sc.setParameters("ipAddress", ipAddress); return findOneBy(sc); } + + @Override + public List listByNetworkId(long networkId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("network", networkId); + return listBy(sc); + } } diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index ba175c445731..9e02dde44ab1 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -507,6 +507,57 @@ public ExecutionResult prepareCommand(final NetworkElementCommand cmd) { return new ExecutionResult(true, null); } +// private String findRouterEthDeviceIndexGivenIpAndNetmask(String routerIp, String ip, String netmask) throws Exception { +// File keyFile = new File(LibvirtComputingResource.SSHPRVKEYPATH); +// // when we dynamically plug in a new NIC into virtual router, it may take time to show up in guest OS +// // we use a waiting loop here as a workaround to synchronize activities in systems +// long startTick = System.currentTimeMillis(); +// long waitTimeoutMillis = 15000; +// while (System.currentTimeMillis() - startTick < waitTimeoutMillis) { +// SubnetUtils util = new SubnetUtils(ip, netmask); +// String address = util.getInfo().getCidrSignature(); +// String subnet = address.split("/")[1]; +// String cmd = String.format("ip route list %s/%s | awk '{print $3}'", ip, subnet); +// if (s_logger.isDebugEnabled()) +// s_logger.debug("Run domr script " + cmd); +// Pair result2 = SshHelper.sshExecute(routerIp, Integer.parseInt(LibvirtComputingResource.DEFAULTDOMRSSHPORT), "root", keyFile, null, cmd); +// if (s_logger.isDebugEnabled()) +// s_logger.debug("result: " + result2.first() + ", output: " + result2.second()); +// if (result2.first() && StringUtils.isNotEmpty(result2.second())) { +// return result2.second().trim(); +// } +// s_logger.warn("can not find interface associated with ip : " + ip + ", guest OS may still at loading state, retry..."); +// try { +// Thread.currentThread(); +// Thread.sleep(1000); +// } catch (InterruptedException e) { +// s_logger.debug("[ignored] interrupted while trying to get mac."); +// } +// } +// return null; +// } +// +// private ExecutionResult prepareNetworkElementCommand(UpdateNetworkCommand cmd) { +// IpAddressTO[] ipAddresses = cmd.getIpAddresses(); +// String routerName = cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME); +// String routerIp =cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); +// +// for (IpAddressTO ipAddressTO : ipAddresses) { +// try { +// String ethDeviceNum = findRouterEthDeviceIndexGivenIpAndNetmask(routerIp, ipAddressTO.getPublicIp(), ipAddressTO.getVlanNetmask()); +// if (ethDeviceNum != null) { +// String numberOnly = ethDeviceNum.replaceAll("[^0-9]", ""); +// ipAddressTO.setNicDevId(Integer.valueOf(numberOnly)); +// } +// } catch (Exception e) { +// String msg = "Prepare UpdateNetwork failed due to " + e.toString(); +// s_logger.error(msg, e); +// return new ExecutionResult(false, msg); +// } +// } +// return new ExecutionResult(true, null); +// } + @Override public ExecutionResult cleanupCommand(final NetworkElementCommand cmd) { if (cmd instanceof IpAssocCommand && !(cmd instanceof IpAssocVpcCommand)) { diff --git a/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java b/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java index fe37e670306f..092a0c152328 100644 --- a/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java +++ b/server/src/main/java/com/cloud/hypervisor/HypervisorGuruBase.java @@ -139,6 +139,7 @@ public NicTO toNicTO(NicProfile profile) { to.setIp6Address(profile.getIPv6Address()); to.setIp6Gateway(profile.getIPv6Gateway()); to.setIp6Cidr(profile.getIPv6Cidr()); + to.setMtu(profile.getMtu()); NetworkVO network = _networkDao.findById(profile.getNetworkId()); to.setNetworkUuid(network.getUuid()); diff --git a/server/src/main/java/com/cloud/network/NetworkModelImpl.java b/server/src/main/java/com/cloud/network/NetworkModelImpl.java index 66d79cc35047..c8278b203164 100644 --- a/server/src/main/java/com/cloud/network/NetworkModelImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkModelImpl.java @@ -2162,6 +2162,12 @@ public NicProfile getNicProfile(VirtualMachine vm, long networkId, String broadc NicProfile profile = new NicProfile(nic, network, nic.getBroadcastUri(), nic.getIsolationUri(), networkRate, isSecurityGroupSupportedInNetwork(network), getNetworkTag( vm.getHypervisorType(), network)); + if (network.getTrafficType() == TrafficType.Public && network.getPublicIfaceMtu() != null) { + profile.setMtu(network.getPublicIfaceMtu()); + } + if (network.getTrafficType() == TrafficType.Guest && network.getPrivateIfaceMtu() != null) { + profile.setMtu(network.getPrivateIfaceMtu()); + } // guru.updateNicProfile(profile, network); return profile; } diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index 034a7a868806..9d0342b3c84a 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -41,7 +41,18 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.Command; +import com.cloud.agent.api.to.IpAddressTO; +import com.cloud.agent.manager.Commands; import com.cloud.alert.AlertManager; +import com.cloud.network.dao.VirtualRouterProviderDao; +import com.cloud.network.router.CommandSetupHelper; +import com.cloud.network.router.NetworkHelper; +import com.cloud.utils.net.Ip; +import com.cloud.vm.DomainRouterVO; +import com.cloud.vm.dao.DomainRouterDao; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ApiConstants; @@ -229,6 +240,8 @@ import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; import com.googlecode.ipv6.IPv6Address; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; /** * NetworkServiceImpl implements NetworkService. @@ -373,6 +386,18 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, C Ipv6GuestPrefixSubnetNetworkMapDao ipv6GuestPrefixSubnetNetworkMapDao; @Inject private AlertManager alertManager; + @Inject + VirtualRouterProviderDao vrProviderDao; + @Inject + DomainRouterDao routerDao; + @Inject + CommandSetupHelper commandSetupHelper; + @Inject + AgentManager agentManager; + + @Autowired + @Qualifier("networkHelper") + protected NetworkHelper networkHelper; int _cidrLimit; boolean _allowSubdomainNetworkAccess; @@ -2600,6 +2625,8 @@ public Network updateGuestNetwork(final UpdateNetworkCmd cmd) { Boolean displayNetwork = cmd.getDisplayNetwork(); String customId = cmd.getCustomId(); boolean updateInSequence = cmd.getUpdateInSequence(); + Integer publicMtu = cmd.getPublicMtu(); + Integer privateMtu = cmd.getPrivateMtu(); boolean forced = cmd.getForced(); boolean restartNetwork = false; @@ -2731,7 +2758,7 @@ public Network updateGuestNetwork(final UpdateNetworkCmd cmd) { final Map newSvcProviders = networkOfferingChanged ? _networkMgr.finalizeServicesAndProvidersForNetwork(_entityMgr.findById(NetworkOffering.class, networkOfferingId), network.getPhysicalNetworkId()) - : new HashMap(); + : new HashMap(); // don't allow to modify network domain if the service is not supported if (domainSuffix != null) { @@ -2852,6 +2879,89 @@ public Network updateGuestNetwork(final UpdateNetworkCmd cmd) { s_logger.info("IP Reservation has been applied. The new CIDR for Guests Vms is " + guestVmCidr); } + if (publicMtu != null && publicMtu > VRPublicInterfaceMtu.valueIn(dc.getId())) { + publicMtu = VRPublicInterfaceMtu.valueIn(dc.getId()); + } + + if (privateMtu != null && privateMtu > VRPrivateInterfaceMtu.valueIn(dc.getId())) { + privateMtu = VRPrivateInterfaceMtu.valueIn(dc.getId()); + } + + List ips = new ArrayList<>(); + + if (publicMtu != null) { + if (!publicMtu.equals(network.getPublicIfaceMtu())) { + List ipAddresses = _ipAddressDao.listByNetworkId(networkId); + for (IPAddressVO ip : ipAddresses) { + VlanVO vlan = _vlanDao.findById(ip.getVlanId()); + s_logger.info("PEARL - vlan id = : " + vlan.getUuid() + " " + vlan.getVlanNetmask()); + String vlanNetmask = vlan.getVlanNetmask(); + IpAddressTO to = new IpAddressTO(ip.getAddress().addr(), publicMtu, vlanNetmask); + ips.add(to); + } + } else { + s_logger.info(String.format("Network's public Interfaces MTU is already set to %s ", publicMtu)); + } + } + + if (privateMtu != null) { + if (!privateMtu.equals(network.getPrivateIfaceMtu())) { + network.setPrivateIfaceMtu(privateMtu); + List ipAddresses = new ArrayList<>(); + if (network.getGuestType() == GuestType.Isolated) { + NicVO nic = _nicDao.findByNetworkIdAndType(networkId, VirtualMachine.Type.DomainRouter); + IPAddressVO ipAddressVO = new IPAddressVO(new Ip(nic.getIPv4Address()), network.getDataCenterId(), 0, 0, false); + ipAddressVO.setSourceNetworkId(networkId); + ipAddresses.add(ipAddressVO); + } else { + ipAddresses.addAll(_ipAddressDao.listByNetworkId(networkId)); + } + + for (IPAddressVO ip : ipAddresses) { + NicVO vo = _nicDao.findByIp4AddressAndNetworkId(ip.getAddress().addr(), networkId); + if (vo != null) { + IpAddressTO to = new IpAddressTO(ip.getAddress().addr(), privateMtu, vo.getIPv4Netmask()); + ips.add(to); + } + } + } else { + s_logger.info(String.format("Network's private Interfaces MTU is already set to %s ", privateMtu)); + } + } + + boolean success = false; + if (!ips.isEmpty() && !restartNetwork) { + List routers = routerDao.findByNetwork(networkId); + for (DomainRouterVO router : routers) { + Commands cmds = new Commands(Command.OnError.Stop); + commandSetupHelper.setupUpdateNetworkCommands(router, ips, cmds); + try { + networkHelper.sendCommandsToRouter(router, cmds); + final Answer updateNetworkAnswer = cmds.getAnswer("updateNetwork"); + if (!(updateNetworkAnswer != null && updateNetworkAnswer.getResult())) { + s_logger.warn("Unable to update guest network on router " + router); + throw new CloudRuntimeException("Failed to update guest network with new mtu: " + privateMtu); + } + success = true; + } catch (ResourceUnavailableException e) { + s_logger.error(String.format("Failed to update network MTU for router %s due to %s", router, e.getMessage())); + } + } + } + + if (success) { + for (IpAddressTO ipAddress : ips) { + NicVO nicVO = _nicDao.findByIp4AddressAndNetworkId(ipAddress.getPublicIp(), networkId); + if (nicVO != null) { + nicVO.setMtu(privateMtu); + _nicDao.update(nicVO.getId(), nicVO); + } + } + network.setPublicIfaceMtu(publicMtu); + network.setPrivateIfaceMtu(privateMtu); + _networksDao.update(networkId, network); + } + ReservationContext context = new ReservationContextImpl(null, null, callerUser, callerAccount); // 1) Shutdown all the elements and cleanup all the rules. Don't allow to shutdown network in intermediate // states - Shutdown and Implementing diff --git a/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java b/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java index 5629eb2d1c17..aa8fedf967a6 100644 --- a/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/DirectNetworkGuru.java @@ -217,6 +217,14 @@ public Network design(NetworkOffering offering, DeploymentPlan plan, Network use if (userSpecified.getRouterIpv6() != null) { config.setRouterIpv6(userSpecified.getRouterIpv6()); } + + if (userSpecified.getPublicIfaceMtu() != null) { + config.setPublicIfaceMtu(userSpecified.getPublicIfaceMtu()); + } + + if (userSpecified.getPrivateIfaceMtu() != null) { + config.setPrivateIfaceMtu(userSpecified.getPrivateIfaceMtu()); + } } boolean isSecurityGroupEnabled = _networkModel.areServicesSupportedByNetworkOffering(offering.getId(), Service.SecurityGroup); diff --git a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java index cb528504c43e..acb934fcb3b3 100644 --- a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java +++ b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java @@ -26,6 +26,8 @@ import javax.inject.Inject; +import com.cloud.agent.api.routing.UpdateNetworkCommand; +import com.cloud.network.dao.VirtualRouterProviderDao; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; @@ -197,6 +199,8 @@ public class CommandSetupHelper { private NetworkDetailsDao networkDetailsDao; @Inject Ipv6Service ipv6Service; + @Inject + VirtualRouterProviderDao vrProviderDao; @Autowired @Qualifier("networkHelper") @@ -1141,7 +1145,6 @@ public SetupGuestNetworkCommand createSetupGuestNetworkCommand(final DomainRoute final String dhcpRange = getGuestDhcpRange(guestNic, network, _entityMgr.findById(DataCenter.class, network.getDataCenterId())); final NicProfile nicProfile = _networkModel.getNicProfile(router, nic.getNetworkId(), null); - final SetupGuestNetworkCommand setupCmd = new SetupGuestNetworkCommand(dhcpRange, networkDomain, router.getIsRedundantRouter(), defaultDns1, defaultDns2, add, _itMgr.toNicTO(nicProfile, router.getHypervisorType())); @@ -1150,10 +1153,6 @@ public SetupGuestNetworkCommand createSetupGuestNetworkCommand(final DomainRoute updateSetupGuestNetworkCommandIpv6(setupCmd, network, publicNic, defaultIp6Dns1, defaultIp6Dns2); } - if (nic.getMtu() != null) { - setupCmd.setMtu(nic.getMtu()); - } - final String brd = NetUtils.long2Ip(NetUtils.ip2Long(guestNic.getIPv4Address()) | ~NetUtils.ip2Long(guestNic.getIPv4Netmask())); setupCmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); setupCmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP, _routerControlHelper.getRouterIpInNetwork(network.getId(), router.getId())); @@ -1163,8 +1162,10 @@ public SetupGuestNetworkCommand createSetupGuestNetworkCommand(final DomainRoute setupCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); if (network.getBroadcastDomainType() == BroadcastDomainType.Vlan) { - final long guestVlanTag = Long.parseLong(BroadcastDomainType.Vlan.getValueFrom(network.getBroadcastUri())); - setupCmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG, String.valueOf(guestVlanTag)); + if (network.getBroadcastUri() != null) { + final long guestVlanTag = Long.parseLong(BroadcastDomainType.Vlan.getValueFrom(network.getBroadcastUri())); + setupCmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG, String.valueOf(guestVlanTag)); + } } return setupCmd; @@ -1329,4 +1330,16 @@ private Map getNicDetails(Network network) { return details; } + public void setupUpdateNetworkCommands(final VirtualRouter router, final List ips, Commands cmds) { + IpAddressTO[] ipsToSend = ips.toArray(new IpAddressTO[0]); + if (!ips.isEmpty()) { + UpdateNetworkCommand cmd = new UpdateNetworkCommand(ipsToSend); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP, _routerControlHelper.getRouterControlIp(router.getId())); + cmd.setHypervisorType(router.getHypervisorType()); + cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); + final DataCenterVO dcVo = _dcDao.findById(router.getDataCenterId()); + cmd.setAccessDetail(NetworkElementCommand.ZONE_NETWORK_TYPE, dcVo.getNetworkType().toString()); + cmds.addCommand("updateNetwork", cmd); + } + } } diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 2cafb36bc3a1..3305141f4cfd 100644 --- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -2282,6 +2282,18 @@ public boolean finalizeDeployment(final Commands cmds, final VirtualMachineProfi return true; } + private Provider getVrProvider(DomainRouterVO router) { + final VirtualRouterProvider vrProvider = _vrProviderDao.findById(router.getElementId()); + if (vrProvider == null) { + throw new CloudRuntimeException("Cannot find related virtual router provider of router: " + router.getHostName()); + } + final Provider provider = Network.Provider.getProvider(vrProvider.getType().toString()); + if (provider == null) { + throw new CloudRuntimeException("Cannot find related provider of virtual router provider: " + vrProvider.getType().toString()); + } + return provider; + } + @Override public boolean finalizeCommandsOnStart(final Commands cmds, final VirtualMachineProfile profile) { final DomainRouterVO router = _routerDao.findById(profile.getId()); @@ -2301,14 +2313,7 @@ public boolean finalizeCommandsOnStart(final Commands cmds, final VirtualMachine reprogramGuestNtwks = false; } - final VirtualRouterProvider vrProvider = _vrProviderDao.findById(router.getElementId()); - if (vrProvider == null) { - throw new CloudRuntimeException("Cannot find related virtual router provider of router: " + router.getHostName()); - } - final Provider provider = Network.Provider.getProvider(vrProvider.getType().toString()); - if (provider == null) { - throw new CloudRuntimeException("Cannot find related provider of virtual router provider: " + vrProvider.getType().toString()); - } + final Provider provider = getVrProvider(router); final List routerGuestNtwkIds = _routerDao.getRouterNetworks(router.getId()); for (final Long guestNetworkId : routerGuestNtwkIds) { diff --git a/systemvm/debian/opt/cloud/bin/cs/CsAddress.py b/systemvm/debian/opt/cloud/bin/cs/CsAddress.py index a7a02d279c2b..c71ecadd915f 100755 --- a/systemvm/debian/opt/cloud/bin/cs/CsAddress.py +++ b/systemvm/debian/opt/cloud/bin/cs/CsAddress.py @@ -115,6 +115,9 @@ def process(self): logging.info( "Address %s on device %s already configured", ip.ip(), dev) + # re-apply mtu: + cmd = "ifconfig %s mtu %s up" % (ip.dev, ip.mtu()) + CsHelper.execute(cmd) ip.post_configure(address) else: logging.info( diff --git a/systemvm/debian/opt/cloud/bin/merge.py b/systemvm/debian/opt/cloud/bin/merge.py index caa3c6bff84b..2409df0e7e2b 100755 --- a/systemvm/debian/opt/cloud/bin/merge.py +++ b/systemvm/debian/opt/cloud/bin/merge.py @@ -155,6 +155,7 @@ def processGuestNetwork(self, dbag): dp['gateway'] = d['router_guest_gateway'] dp['nic_dev_id'] = d['device'][3:] dp['nw_type'] = 'guest' + dp['mtu'] = str(d['mtu']) qf = QueueFile() qf.load({'ip_address': [dp], 'type': 'ips'}) if 'domain_name' not in d.keys() or d['domain_name'] == '': diff --git a/systemvm/debian/opt/cloud/bin/update_config.py b/systemvm/debian/opt/cloud/bin/update_config.py index 518a31ca5eda..8efe2ce664a9 100755 --- a/systemvm/debian/opt/cloud/bin/update_config.py +++ b/systemvm/debian/opt/cloud/bin/update_config.py @@ -19,8 +19,6 @@ import sys from merge import QueueFile import logging -import subprocess -from subprocess import PIPE, STDOUT import os import os.path import configure diff --git a/systemvm/debian/opt/cloud/bin/update_interface_config.sh b/systemvm/debian/opt/cloud/bin/update_interface_config.sh new file mode 100644 index 000000000000..69918579148f --- /dev/null +++ b/systemvm/debian/opt/cloud/bin/update_interface_config.sh @@ -0,0 +1,50 @@ +#!/bin/bash +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# used as a proxy to call script inside virtual router + +#set -x + +ip=$1 +netmask=$2 +mtu=$3 +timeout=$4 + +i=0 + +get_interface() { + for i in `seq 1 $(($timeout))` + do + inf=$(ip route list ${1}/${2} | awk '{print $3}') + if [ ! -z $inf ]; then + echo $inf + break + fi + sleep 0.1 + done +} + + +interfaceName=$(get_interface $ip $netmask) +echo $interfaceName +if [ ! -z $interfaceName ]; then + ifconfig $interfaceName mtu $mtu + exit $? +fi + +exit 1 \ No newline at end of file From d0965499a361ce009ff027edebfe34bffbdd2641 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Thu, 9 Jun 2022 16:24:59 +0530 Subject: [PATCH 05/49] update upgrade path --- .../main/resources/META-INF/db/schema-41610to41700.sql | 9 +-------- .../main/resources/META-INF/db/schema-41710to41800.sql | 7 ++++++- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql index 3030683fef97..611499327bcc 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41610to41700.sql @@ -971,11 +971,4 @@ WHERE not exists( SELECT 1 ;END; CALL ADD_GUEST_OS_AND_HYPERVISOR_MAPPING (2, 'Debian GNU/Linux 11 (64-bit)', 'XenServer', '8.2.1', 'Debian Bullseye 11'); -CALL ADD_GUEST_OS_AND_HYPERVISOR_MAPPING (2, 'Debian GNU/Linux 11 (32-bit)', 'XenServer', '8.2.1', 'Debian Bullseye 11'); - - --- TODO: Need to move to 4.17.0 -> 4.18.0 upgrade path - -ALTER TABLE `cloud`.`networks` ADD COLUMN `public_iface_mtu` bigint unsigned comment "MTU for VR public interface" ; -ALTER TABLE `cloud`.`networks` ADD COLUMN `private_iface_mtu` bigint unsigned comment "MTU for VR private interfaces" ; -ALTER TABLE `cloud`.`nics` ADD COLUMN `mtu` bigint unsigned comment "MTU for the VR interface" ; \ No newline at end of file +CALL ADD_GUEST_OS_AND_HYPERVISOR_MAPPING (2, 'Debian GNU/Linux 11 (32-bit)', 'XenServer', '8.2.1', 'Debian Bullseye 11'); \ No newline at end of file diff --git a/engine/schema/src/main/resources/META-INF/db/schema-41710to41800.sql b/engine/schema/src/main/resources/META-INF/db/schema-41710to41800.sql index 7acb3e7c1adf..b4bbc4781dba 100644 --- a/engine/schema/src/main/resources/META-INF/db/schema-41710to41800.sql +++ b/engine/schema/src/main/resources/META-INF/db/schema-41710to41800.sql @@ -17,4 +17,9 @@ --; -- Schema upgrade from 4.17.1.0 to 4.18.0.0 ---; \ No newline at end of file +--; + + +ALTER TABLE `cloud`.`networks` ADD COLUMN `public_iface_mtu` bigint unsigned comment "MTU for VR public interface" ; +ALTER TABLE `cloud`.`networks` ADD COLUMN `private_iface_mtu` bigint unsigned comment "MTU for VR private interfaces" ; +ALTER TABLE `cloud`.`nics` ADD COLUMN `mtu` bigint unsigned comment "MTU for the VR interface" ; \ No newline at end of file From 50adfb845c875e646bf35d696da2035f6ba23fae Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Thu, 9 Jun 2022 17:43:58 +0530 Subject: [PATCH 06/49] code cleanup based on sonarcloud report --- .../cloud/network/element/NetworkElement.java | 4 -- .../VirtualRoutingResource.java | 2 +- .../facade/SetGuestNetworkConfigItem.java | 2 - .../virtualnetwork/model/IpAddress.java | 1 - .../orchestration/NetworkOrchestrator.java | 22 +++----- .../resource/LibvirtComputingResource.java | 51 ------------------- .../com/cloud/network/NetworkServiceImpl.java | 13 ++--- .../network/router/CommandSetupHelper.java | 8 ++- .../VirtualNetworkApplianceManagerImpl.java | 2 - 9 files changed, 19 insertions(+), 86 deletions(-) diff --git a/api/src/main/java/com/cloud/network/element/NetworkElement.java b/api/src/main/java/com/cloud/network/element/NetworkElement.java index ad661f58352d..fa67575edd35 100644 --- a/api/src/main/java/com/cloud/network/element/NetworkElement.java +++ b/api/src/main/java/com/cloud/network/element/NetworkElement.java @@ -137,8 +137,4 @@ boolean shutdownProviderInstances(PhysicalNetworkServiceProvider provider, Reser * @return true/false */ boolean verifyServicesCombination(Set services); - -// default boolean update(Network network) throws ResourceUnavailableException { -// return true; -// } } diff --git a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java index c19826003611..d7aefad3afa9 100644 --- a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java +++ b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/VirtualRoutingResource.java @@ -239,7 +239,7 @@ private Answer execute(UpdateNetworkCommand cmd) { ipAddressTO.getPublicIp() + " " + ipAddressTO.getVlanNetmask() + " " + ipAddressTO.getMtu() + " " + 15); if (s_logger.isDebugEnabled()) s_logger.debug("result: " + result.isSuccess() + ", output: " + result.getDetails()); - if (!result.isSuccess()) { + if (!Boolean.TRUE.equals(result.isSuccess())) { s_logger.warn(String.format("Failed to update interface mtu to %s on interface with ip: %s", ipAddressTO.getMtu(), ipAddressTO.getPublicIp())); finalResult = false; diff --git a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetGuestNetworkConfigItem.java b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetGuestNetworkConfigItem.java index dda77495cc5a..021d47b068e3 100644 --- a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetGuestNetworkConfigItem.java +++ b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetGuestNetworkConfigItem.java @@ -31,10 +31,8 @@ import com.cloud.agent.resource.virtualnetwork.model.ConfigBase; import com.cloud.agent.resource.virtualnetwork.model.GuestNetwork; import com.cloud.utils.net.NetUtils; -import org.apache.log4j.Logger; public class SetGuestNetworkConfigItem extends AbstractConfigItemFacade { - private static final Logger LOG = Logger.getLogger(SetGuestNetworkConfigItem.class); @Override public List generateConfig(final NetworkElementCommand cmd) { final SetupGuestNetworkCommand command = (SetupGuestNetworkCommand) cmd; diff --git a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/IpAddress.java b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/IpAddress.java index d4fab41245b0..19af6a56b426 100644 --- a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/IpAddress.java +++ b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/IpAddress.java @@ -33,7 +33,6 @@ public class IpAddress { private boolean newNic; private String nwType; private boolean isPrivateGateway; - private Integer mtu; public IpAddress() { // Empty constructor for (de)serialization diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index 71b15d40b94a..d5c75a470727 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -42,7 +42,6 @@ import com.cloud.api.query.vo.DomainRouterJoinVO; import com.cloud.network.NetworkServiceImpl; import com.cloud.network.guru.GuestNetworkGuru; -import com.cloud.network.guru.PublicNetworkGuru; import com.cloud.server.ManagementServer; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.annotation.AnnotationService; @@ -365,8 +364,7 @@ public void setNetworkElements(final List networkElements) { List ipDeployers; - private static final String s_publicNetworkReserver = PublicNetworkGuru.class.getSimpleName(); - private static final String s_guestNetworkReserver = GuestNetworkGuru.class.getSimpleName(); + private static final String guestNetworkReserver = GuestNetworkGuru.class.getSimpleName(); public List getIpDeployers() { return ipDeployers; } @@ -1028,12 +1026,10 @@ private void setMtuDetailsInVRNic(final long vmId, Network network, NicVO vo) { private void setMtuInVRNicProfile(final long vmId, TrafficType trafficType, NicProfile vmNic) { NetworkVO networkVO = getGuestNetworkRouter(vmId); - if (TrafficType.Public == trafficType) { - if (networkVO != null) { + if (networkVO != null) { + if (TrafficType.Public == trafficType) { vmNic.setMtu(networkVO.getPublicIfaceMtu()); - } - } else if (TrafficType.Guest == trafficType) { - if (networkVO != null) { + } else if (TrafficType.Guest == trafficType) { vmNic.setMtu(networkVO.getPrivateIfaceMtu()); } } @@ -1046,8 +1042,7 @@ private NetworkVO getGuestNetworkRouter(long routerId) { } DomainRouterJoinVO guestRouterDetails = routerVo.get(0); long networkId = guestRouterDetails.getNetworkId(); - NetworkVO networkVO = _networksDao.findById(networkId); - return networkVO; + return _networksDao.findById(networkId); } /** @@ -1901,7 +1896,6 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { public void prepare(final VirtualMachineProfile vmProfile, final DeployDestination dest, final ReservationContext context) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { final List nics = _nicDao.listByVmId(vmProfile.getId()); - List guestNics = nics.stream().filter(nic -> s_guestNetworkReserver.equals(nic.getReserver())).collect(Collectors.toList()); // we have to implement default nics first - to ensure that default network elements start up first in multiple //nics case // (need for setting DNS on Dhcp to domR's Ip4 address) @@ -2504,7 +2498,7 @@ private Network createGuestNetwork(final long networkOfferingId, final String na boolean bypassVlanOverlapCheck, String networkDomain, final Account owner, final Long domainId, final PhysicalNetwork pNtwk, final long zoneId, final ACLType aclType, Boolean subdomainAccess, final Long vpcId, final String ip6Gateway, final String ip6Cidr, final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, Network.PVlanType isolatedPvlanType, String externalId, - final Boolean isPrivateNetwork, String routerIp, String routerIpv6, Pair vrIfaceMTUs) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { + final Boolean isPrivateNetwork, String routerIp, String routerIpv6, Pair vrIfaceMTUs) throws ConcurrentOperationException, ResourceAllocationException { final NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId); final DataCenterVO zone = _dcDao.findById(zoneId); @@ -2780,13 +2774,13 @@ public Network doInTransaction(final TransactionStatus status) { } if (vrIfaceMTUs != null) { - if (vrIfaceMTUs.first() != null & vrIfaceMTUs.first() > 0) { + if (vrIfaceMTUs.first() != null && vrIfaceMTUs.first() > 0) { userNetwork.setPublicIfaceMtu(vrIfaceMTUs.first()); } else { userNetwork.setPublicIfaceMtu(Integer.valueOf(NetworkServiceImpl.VRPublicInterfaceMtu.defaultValue())); } - if (vrIfaceMTUs.second() != null & vrIfaceMTUs.second() > 0) { + if (vrIfaceMTUs.second() != null && vrIfaceMTUs.second() > 0) { userNetwork.setPrivateIfaceMtu(vrIfaceMTUs.second()); } else { userNetwork.setPrivateIfaceMtu(Integer.valueOf(NetworkServiceImpl.VRPrivateInterfaceMtu.defaultValue())); diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index 9e02dde44ab1..ba175c445731 100644 --- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -507,57 +507,6 @@ public ExecutionResult prepareCommand(final NetworkElementCommand cmd) { return new ExecutionResult(true, null); } -// private String findRouterEthDeviceIndexGivenIpAndNetmask(String routerIp, String ip, String netmask) throws Exception { -// File keyFile = new File(LibvirtComputingResource.SSHPRVKEYPATH); -// // when we dynamically plug in a new NIC into virtual router, it may take time to show up in guest OS -// // we use a waiting loop here as a workaround to synchronize activities in systems -// long startTick = System.currentTimeMillis(); -// long waitTimeoutMillis = 15000; -// while (System.currentTimeMillis() - startTick < waitTimeoutMillis) { -// SubnetUtils util = new SubnetUtils(ip, netmask); -// String address = util.getInfo().getCidrSignature(); -// String subnet = address.split("/")[1]; -// String cmd = String.format("ip route list %s/%s | awk '{print $3}'", ip, subnet); -// if (s_logger.isDebugEnabled()) -// s_logger.debug("Run domr script " + cmd); -// Pair result2 = SshHelper.sshExecute(routerIp, Integer.parseInt(LibvirtComputingResource.DEFAULTDOMRSSHPORT), "root", keyFile, null, cmd); -// if (s_logger.isDebugEnabled()) -// s_logger.debug("result: " + result2.first() + ", output: " + result2.second()); -// if (result2.first() && StringUtils.isNotEmpty(result2.second())) { -// return result2.second().trim(); -// } -// s_logger.warn("can not find interface associated with ip : " + ip + ", guest OS may still at loading state, retry..."); -// try { -// Thread.currentThread(); -// Thread.sleep(1000); -// } catch (InterruptedException e) { -// s_logger.debug("[ignored] interrupted while trying to get mac."); -// } -// } -// return null; -// } -// -// private ExecutionResult prepareNetworkElementCommand(UpdateNetworkCommand cmd) { -// IpAddressTO[] ipAddresses = cmd.getIpAddresses(); -// String routerName = cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME); -// String routerIp =cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); -// -// for (IpAddressTO ipAddressTO : ipAddresses) { -// try { -// String ethDeviceNum = findRouterEthDeviceIndexGivenIpAndNetmask(routerIp, ipAddressTO.getPublicIp(), ipAddressTO.getVlanNetmask()); -// if (ethDeviceNum != null) { -// String numberOnly = ethDeviceNum.replaceAll("[^0-9]", ""); -// ipAddressTO.setNicDevId(Integer.valueOf(numberOnly)); -// } -// } catch (Exception e) { -// String msg = "Prepare UpdateNetwork failed due to " + e.toString(); -// s_logger.error(msg, e); -// return new ExecutionResult(false, msg); -// } -// } -// return new ExecutionResult(true, null); -// } - @Override public ExecutionResult cleanupCommand(final NetworkElementCommand cmd) { if (cmd instanceof IpAssocCommand && !(cmd instanceof IpAssocVpcCommand)) { diff --git a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java index 9d0342b3c84a..be36e2881e53 100644 --- a/server/src/main/java/com/cloud/network/NetworkServiceImpl.java +++ b/server/src/main/java/com/cloud/network/NetworkServiceImpl.java @@ -55,6 +55,7 @@ import com.cloud.vm.dao.DomainRouterDao; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; +import org.apache.cloudstack.alert.AlertService; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.command.admin.address.ReleasePodIpCmdByAdmin; import org.apache.cloudstack.api.command.admin.network.CreateNetworkCmdByAdmin; @@ -249,15 +250,15 @@ public class NetworkServiceImpl extends ManagerBase implements NetworkService, Configurable { private static final Logger s_logger = Logger.getLogger(NetworkServiceImpl.class); - private static final ConfigKey AllowDuplicateNetworkName = new ConfigKey("Advanced", Boolean.class, + private static final ConfigKey AllowDuplicateNetworkName = new ConfigKey<>("Advanced", Boolean.class, "allow.duplicate.networkname", "true", "Allow creating networks with same name in account", true, ConfigKey.Scope.Account); - private static final ConfigKey AllowEmptyStartEndIpAddress = new ConfigKey("Advanced", Boolean.class, + private static final ConfigKey AllowEmptyStartEndIpAddress = new ConfigKey<>("Advanced", Boolean.class, "allow.empty.start.end.ipaddress", "true", "Allow creating network without mentioning start and end IP address", true, ConfigKey.Scope.Account); - public static final ConfigKey VRPublicInterfaceMtu = new ConfigKey("VirtualRouter", Integer.class, + public static final ConfigKey VRPublicInterfaceMtu = new ConfigKey<>("VirtualRouter", Integer.class, "vr.public.interface.mtu", "1500", "MTU set on the VR's public facing interfaces", true, ConfigKey.Scope.Zone); - public static final ConfigKey VRPrivateInterfaceMtu = new ConfigKey("VirtualRouter", Integer.class, + public static final ConfigKey VRPrivateInterfaceMtu = new ConfigKey<>("VirtualRouter", Integer.class, "vr.private.interface.mtu", "1500", "MTU set on the VR's private interfaces", true, ConfigKey.Scope.Zone); private static final long MIN_VLAN_ID = 0L; @@ -1653,7 +1654,7 @@ private Pair validateMtuConfig(Integer publicMtu, Integer priv String message = String.format("Configured MTU for network VR's public interfaces exceeds the upper limit " + "enforced by zone level setting: %s. VR's public interfaces can be configured with a maximum MTU of %s", VRPublicInterfaceMtu.key(), VRPublicInterfaceMtu.valueIn(zoneId)); s_logger.warn(message); - alertManager.sendAlert(AlertManager.AlertType.ALERT_TYPE_VR_PUBLIC_IFACE_MTU, zoneId, null, subject, message); + alertManager.sendAlert(AlertService.AlertType.ALERT_TYPE_VR_PUBLIC_IFACE_MTU, zoneId, null, subject, message); publicMtu = vrMaxMtuForPublicIfaces; } @@ -1662,7 +1663,7 @@ private Pair validateMtuConfig(Integer publicMtu, Integer priv String message = String.format("Configured MTU for network VR's public interfaces exceeds the upper limit " + "enforced by zone level setting: %s. VR's public interfaces can be configured with a maximum MTU of %s", VRPublicInterfaceMtu.key(), VRPublicInterfaceMtu.valueIn(zoneId)); s_logger.warn(message); - alertManager.sendAlert(AlertManager.AlertType.ALERT_TYPE_VR_PUBLIC_IFACE_MTU, zoneId, null, subject, message); + alertManager.sendAlert(AlertService.AlertType.ALERT_TYPE_VR_PUBLIC_IFACE_MTU, zoneId, null, subject, message); privateMtu = vrMaxMtuForPrivateIfaces; } return new Pair<>(publicMtu, privateMtu); diff --git a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java index acb934fcb3b3..766e061d3b81 100644 --- a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java +++ b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java @@ -1161,11 +1161,9 @@ public SetupGuestNetworkCommand createSetupGuestNetworkCommand(final DomainRoute setupCmd.setAccessDetail(NetworkElementCommand.GUEST_BRIDGE, brd); setupCmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME, router.getInstanceName()); - if (network.getBroadcastDomainType() == BroadcastDomainType.Vlan) { - if (network.getBroadcastUri() != null) { - final long guestVlanTag = Long.parseLong(BroadcastDomainType.Vlan.getValueFrom(network.getBroadcastUri())); - setupCmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG, String.valueOf(guestVlanTag)); - } + if (network.getBroadcastDomainType() == BroadcastDomainType.Vlan && network.getBroadcastUri() != null) { + final long guestVlanTag = Long.parseLong(BroadcastDomainType.Vlan.getValueFrom(network.getBroadcastUri())); + setupCmd.setAccessDetail(NetworkElementCommand.GUEST_VLAN_TAG, String.valueOf(guestVlanTag)); } return setupCmd; diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 3305141f4cfd..ffcd8adbe96a 100644 --- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -2039,8 +2039,6 @@ public boolean finalizeVirtualMachineProfile(final VirtualMachineProfile profile publicNetwork = true; buf.append(" publicMtu=").append(nic.getMtu()); } - // todo: check all implementations of addnic (NicProfile) - and add the mtu details to the profile - } if (controlNic == null) { From d82962edb8ef4739b7349d3d8a6e15488d0818b2 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Thu, 9 Jun 2022 18:37:10 +0530 Subject: [PATCH 07/49] add ui support --- .../api/routing/UpdateNetworkCommand.java | 10 ------ .../orchestration/NetworkOrchestrator.java | 2 -- .../network/router/CommandSetupHelper.java | 1 - ui/public/locales/en.json | 2 ++ .../network/CreateIsolatedNetworkForm.vue | 32 +++++++++++++++++++ .../views/network/CreateSharedNetworkForm.vue | 32 +++++++++++++++++++ 6 files changed, 66 insertions(+), 13 deletions(-) diff --git a/core/src/main/java/com/cloud/agent/api/routing/UpdateNetworkCommand.java b/core/src/main/java/com/cloud/agent/api/routing/UpdateNetworkCommand.java index bd8ca42b5914..c7a975e9f856 100644 --- a/core/src/main/java/com/cloud/agent/api/routing/UpdateNetworkCommand.java +++ b/core/src/main/java/com/cloud/agent/api/routing/UpdateNetworkCommand.java @@ -17,13 +17,10 @@ package com.cloud.agent.api.routing; import com.cloud.agent.api.to.IpAddressTO; -import com.cloud.hypervisor.Hypervisor; public class UpdateNetworkCommand extends NetworkElementCommand{ IpAddressTO[] ipAddresses; - Hypervisor.HypervisorType hypervisorType; - public UpdateNetworkCommand(IpAddressTO[] ips) { this.ipAddresses = ips; } @@ -42,11 +39,4 @@ public int getAnswersCount() { return ipAddresses.length; } - public Hypervisor.HypervisorType getHypervisorType() { - return hypervisorType; - } - - public void setHypervisorType(Hypervisor.HypervisorType hypervisorType) { - this.hypervisorType = hypervisorType; - } } diff --git a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index d5c75a470727..a40595aadfca 100644 --- a/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/main/java/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -41,7 +41,6 @@ import com.cloud.api.query.dao.DomainRouterJoinDao; import com.cloud.api.query.vo.DomainRouterJoinVO; import com.cloud.network.NetworkServiceImpl; -import com.cloud.network.guru.GuestNetworkGuru; import com.cloud.server.ManagementServer; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.annotation.AnnotationService; @@ -364,7 +363,6 @@ public void setNetworkElements(final List networkElements) { List ipDeployers; - private static final String guestNetworkReserver = GuestNetworkGuru.class.getSimpleName(); public List getIpDeployers() { return ipDeployers; } diff --git a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java index 766e061d3b81..154b1df91e93 100644 --- a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java +++ b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java @@ -1333,7 +1333,6 @@ public void setupUpdateNetworkCommands(final VirtualRouter router, final List + + + + + + + + + + + + + + 0) { params.domainid = this.selectedDomain.id if (this.isValidTextValueForKey(values, 'account')) { diff --git a/ui/src/views/network/CreateSharedNetworkForm.vue b/ui/src/views/network/CreateSharedNetworkForm.vue index fdcb890fd07b..bfa135d926ec 100644 --- a/ui/src/views/network/CreateSharedNetworkForm.vue +++ b/ui/src/views/network/CreateSharedNetworkForm.vue @@ -243,6 +243,32 @@ + + + + + + + + + + + + + + @@ -180,7 +182,9 @@ export default { networkOfferingLoading: false, networkOffering: {}, cidrChanged: false, - loading: false + loading: false, + privateMtuMax: 1500, + publicMtuMax: 1500 } }, beforeCreate () { @@ -213,15 +217,19 @@ export default { initForm () { this.formRef = ref() this.form = reactive({ - displaynetwork: this.resource.displaynetwork + displaynetwork: this.resource.displaynetwork, + privatemtu: this.resource.privatemtu, + publicmtu: this.resource.publicmtu }) this.rules = reactive({ name: [{ required: true, message: this.$t('message.error.required.input') }], displaytext: [{ required: true, message: this.$t('message.error.required.input') }] }) }, - fetchData () { + async fetchData () { this.fetchNetworkOfferingData() + await this.fetchPrivateMtuForZone() + await this.fetchPublicMtuForZone() }, isAdmin () { return isAdmin() @@ -229,6 +237,22 @@ export default { arrayHasItems (array) { return array !== null && array !== undefined && Array.isArray(array) && array.length > 0 }, + fetchPrivateMtuForZone () { + api('listConfigurations', { + name: 'vr.private.interface.mtu', + zoneid: this.resource.zoneid + }).then(json => { + this.privateMtuMax = json?.listconfigurationsresponse?.configuration[0]?.value || 1500 + }) + }, + fetchPublicMtuForZone () { + api('listConfigurations', { + name: 'vr.public.interface.mtu', + zoneid: this.resource.zoneid + }).then(json => { + this.publicMtuMax = json?.listconfigurationsresponse?.configuration[0]?.value || 1500 + }) + }, fetchNetworkOfferingData () { this.networkOfferings = [] if (!this.isUpdatingIsolatedNetwork) return diff --git a/ui/src/views/network/VpcTiersTab.vue b/ui/src/views/network/VpcTiersTab.vue index 302aa9664950..0310f761a943 100644 --- a/ui/src/views/network/VpcTiersTab.vue +++ b/ui/src/views/network/VpcTiersTab.vue @@ -203,6 +203,7 @@ @@ -372,6 +373,7 @@ export default { staticNats: {}, vms: {}, selectedNetworkOffering: {}, + privateMtuMax: 1500, algorithms: { Source: 'source', 'Round-robin': 'roundrobin', @@ -500,6 +502,15 @@ export default { this.fetchVMs(network.id) } this.publicLBNetworkExists() + this.fetchPrivateMtuForZone() + }, + fetchPrivateMtuForZone () { + api('listConfigurations', { + name: 'vr.private.interface.mtu', + zoneid: this.resource.zoneid + }).then(json => { + this.privateMtuMax = json?.listconfigurationsresponse?.configuration[0]?.value || 1500 + }) }, fetchNetworkAclList () { this.fetchLoading = true From 04a1a9563bb4d612fb377d5e8f6cce3a74bc97f1 Mon Sep 17 00:00:00 2001 From: Pearl Dsilva Date: Wed, 6 Jul 2022 11:37:39 +0530 Subject: [PATCH 29/49] update UI to alert value exceeding defined threshold before resetting --- ui/public/locales/en.json | 2 ++ .../network/CreateIsolatedNetworkForm.vue | 31 ++++++++++++++++--- .../views/network/CreateSharedNetworkForm.vue | 31 ++++++++++++++++--- ui/src/views/network/CreateVpc.vue | 16 ++++++++-- ui/src/views/network/UpdateNetwork.vue | 31 ++++++++++++++++--- ui/src/views/network/VpcTiersTab.vue | 14 +++++++-- 6 files changed, 105 insertions(+), 20 deletions(-) diff --git a/ui/public/locales/en.json b/ui/public/locales/en.json index 45151fde98c6..c7ba61a66531 100644 --- a/ui/public/locales/en.json +++ b/ui/public/locales/en.json @@ -2216,6 +2216,8 @@ "message.error.loading.setting": "There was an error loading these settings.", "message.error.lun": "Please enter LUN #.", "message.error.macaddress": "Please enter a valid MAC Address.", +"message.error.mtu.public.max.exceed": "MTU exceeds configured maximum in the zone-level setting: vr.public.interface.mtu (%x).This value will be reset to the maximum value configured for the zone", +"message.error.mtu.private.max.exceed": "MTU exceeds configured maximum in the zone-level setting: vr.private.interface.mtu (%x). This value will be reset to the maximum value configured for the zone", "message.error.name": "Please enter name.", "message.error.netmask": "Please enter Netmask.", "message.error.network.offering": "Please select network offering.", diff --git a/ui/src/views/network/CreateIsolatedNetworkForm.vue b/ui/src/views/network/CreateIsolatedNetworkForm.vue index 7a3b19f778bd..969651243dc2 100644 --- a/ui/src/views/network/CreateIsolatedNetworkForm.vue +++ b/ui/src/views/network/CreateIsolatedNetworkForm.vue @@ -113,10 +113,11 @@ + :placeholder="apiParams.publicmtu.description" + @change="updateMtu(true)"/> +
@@ -127,10 +128,11 @@ + :placeholder="apiParams.privatemtu.description" + @change="updateMtu(false)"/> +
@@ -302,7 +304,9 @@ export default { selectedVpc: {}, accountVisible: isAdminOrDomainAdmin(), privateMtuMax: 1500, - publicMtuMax: 1500 + publicMtuMax: 1500, + errorPublicMtu: '', + errorPrivateMtu: '' } }, watch: { @@ -562,6 +566,23 @@ export default { this.formRef.value.scrollToField(error.errorFields[0].name) }) }, + updateMtu (isPublic) { + if (isPublic) { + if (this.form.publicmtu > this.publicMtuMax) { + this.errorPublicMtu = `${this.$t('message.error.mtu.public.max.exceed')}` + this.form.publicmtu = this.publicMtuMax + } else { + this.errorPublicMtu = '' + } + } else { + if (this.form.privatemtu > this.privateMtuMax) { + this.errorPrivateMtu = `${this.$t('message.error.mtu.private.max.exceed')}` + this.form.privatemtu = this.privateMtuMax + } else { + this.errorPrivateMtu = '' + } + } + }, showInput () { this.inputVisible = true this.$nextTick(function () { diff --git a/ui/src/views/network/CreateSharedNetworkForm.vue b/ui/src/views/network/CreateSharedNetworkForm.vue index d12573b43b5a..004345709777 100644 --- a/ui/src/views/network/CreateSharedNetworkForm.vue +++ b/ui/src/views/network/CreateSharedNetworkForm.vue @@ -253,9 +253,10 @@ + :placeholder="apiParams.publicmtu.description" + @change="updateMtu(true)"/> +
@@ -267,9 +268,10 @@ + :placeholder="apiParams.privatemtu.description" + @change="updateMtu(false)"/> +
@@ -468,7 +470,9 @@ export default { isVirtualRouterForAtLeastOneService: false, selectedServiceProviderMap: {}, privateMtuMax: 1500, - publicMtuMax: 1500 + publicMtuMax: 1500, + errorPublicMtu: '', + errorPrivateMtu: '' } }, watch: { @@ -1058,6 +1062,23 @@ export default { }, closeAction () { this.$emit('close-action') + }, + updateMtu (isPublic) { + if (isPublic) { + if (this.form.publicmtu > this.publicMtuMax) { + this.errorPublicMtu = `${this.$t('message.error.mtu.public.max.exceed')}` + this.form.publicmtu = this.publicMtuMax + } else { + this.errorPublicMtu = '' + } + } else { + if (this.form.privatemtu > this.privateMtuMax) { + this.errorPrivateMtu = `${this.$t('message.error.mtu.private.max.exceed')}` + this.form.privatemtu = this.privateMtuMax + } else { + this.errorPrivateMtu = '' + } + } } } } diff --git a/ui/src/views/network/CreateVpc.vue b/ui/src/views/network/CreateVpc.vue index da5ba9e2bfcf..6db29222e9ad 100644 --- a/ui/src/views/network/CreateVpc.vue +++ b/ui/src/views/network/CreateVpc.vue @@ -103,9 +103,10 @@ + :placeholder="apiParams.publicmtu.description" + @change="updateMtu()"/> +
+ :placeholder="apiParams.publicmtu.description" + @change="updateMtu(true)"/> +
@@ -184,7 +186,9 @@ export default { cidrChanged: false, loading: false, privateMtuMax: 1500, - publicMtuMax: 1500 + publicMtuMax: 1500, + errorPrivateMtu: '', + errorPublicMtu: '' } }, beforeCreate () { @@ -278,6 +282,23 @@ export default { } }) }, + updateMtu (isPublic) { + if (isPublic) { + if (this.form.publicmtu > this.publicMtuMax) { + this.errorPublicMtu = `${this.$t('message.error.mtu.public.max.exceed')}` + this.form.publicmtu = this.publicMtuMax + } else { + this.errorPublicMtu = '' + } + } else { + if (this.form.privatemtu > this.privateMtuMax) { + this.errorPrivateMtu = `${this.$t('message.error.mtu.private.max.exceed')}` + this.form.privatemtu = this.privateMtuMax + } else { + this.errorPrivateMtu = '' + } + } + }, handleSubmit (e) { e.preventDefault() if (this.loading) return diff --git a/ui/src/views/network/VpcTiersTab.vue b/ui/src/views/network/VpcTiersTab.vue index 0310f761a943..1b2c08cd5109 100644 --- a/ui/src/views/network/VpcTiersTab.vue +++ b/ui/src/views/network/VpcTiersTab.vue @@ -203,9 +203,10 @@ + :placeholder="$t('label.privatemtu')" + @change="updateMtu()"/> +