From 171aa269cd76f66a5f3d68666c5670c37af5bffd Mon Sep 17 00:00:00 2001 From: ArthurHlt Date: Thu, 8 Nov 2018 17:34:05 +0100 Subject: [PATCH 1/7] remove random chose of ip in guest network for vrouter add patch to stop random attribution of ip in a guest network for vrouter --- .../java/com/cloud/network/IpAddressManager.java | 2 ++ .../com/cloud/network/IpAddressManagerImpl.java | 13 +++++++++++++ .../com/cloud/network/guru/GuestNetworkGuru.java | 6 +++++- .../com/cloud/network/router/NetworkHelperImpl.java | 2 +- .../cloud/network/router/NicProfileHelperImpl.java | 2 +- 5 files changed, 22 insertions(+), 3 deletions(-) diff --git a/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java b/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java index a5512786bcd7..418275a57a0e 100644 --- a/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java +++ b/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java @@ -103,6 +103,8 @@ boolean applyIpAssociations(Network network, boolean rulesRevoked, boolean conti String acquireGuestIpAddress(Network network, String requestedIp); + String acquireFirstGuestIpAddress(Network network); + boolean applyStaticNats(List staticNats, boolean continueOnError, boolean forRevoke) throws ResourceUnavailableException; IpAddress assignSystemIp(long networkId, Account owner, boolean forElasticLb, boolean forElasticIp) throws InsufficientAddressCapacityException; diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java index cb7210d33acf..3a0c05207239 100644 --- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java +++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java @@ -1845,6 +1845,19 @@ public String acquireGuestIpAddress(Network network, String requestedIp) { return NetUtils.long2Ip(array[rand.nextInt(array.length)]); } + @Override + public String acquireFirstGuestIpAddress(Network network) { + if (_networkModel.listNetworkOfferingServices(network.getNetworkOfferingId()).isEmpty() && network.getCidr() == null) { + return null; + } + Set availableIps = _networkModel.getAvailableIps(network, null); + if (availableIps == null || availableIps.isEmpty()) { + s_logger.debug("There are no free ips in the network " + network); + return null; + } + return NetUtils.long2Ip(availableIps.iterator().next()); + } + /** * Get the list of public IPs that need to be applied for a static NAT enable/disable operation. * Manipulating only these ips prevents concurrency issues when disabling static nat at the same time. 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 9cd337447f9a..ce7722ebd3f8 100644 --- a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java @@ -369,7 +369,11 @@ public NicProfile allocate(final Network network, NicProfile nic, final VirtualM if (isGateway) { guestIp = network.getGateway(); } else { - guestIp = _ipAddrMgr.acquireGuestIpAddress(network, nic.getRequestedIPv4()); + if (nic.getRequestedIPv4() == null && vm.getVirtualMachine().getType() == VirtualMachine.Type.DomainRouter) { + guestIp = _ipAddrMgr.acquireFirstGuestIpAddress(network); + }else { + guestIp = _ipAddrMgr.acquireGuestIpAddress(network, nic.getRequestedIPv4()); + } if (guestIp == null && network.getGuestType() != GuestType.L2 && !_networkModel.listNetworkOfferingServices(network.getNetworkOfferingId()).isEmpty()) { throw new InsufficientVirtualNetworkCapacityException("Unable to acquire Guest IP" + " address for network " + network, DataCenter.class, dc.getId()); diff --git a/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java b/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java index 25e2793cc42e..b461f55bc527 100644 --- a/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java +++ b/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java @@ -742,7 +742,7 @@ public LinkedHashMap> configureGuestNic(fina final NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp, defaultNetworkStartIpv6); if (routerDeploymentDefinition.isPublicNetwork()) { if (routerDeploymentDefinition.isRedundant()) { - gatewayNic.setIPv4Address(_ipAddrMgr.acquireGuestIpAddress(guestNetwork, null)); + gatewayNic.setIPv4Address(_ipAddrMgr.acquireFirstGuestIpAddress(guestNetwork)); } else { gatewayNic.setIPv4Address(guestNetwork.getGateway()); } diff --git a/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java b/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java index 18ab4a932978..7f35f34acedc 100644 --- a/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java +++ b/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java @@ -118,7 +118,7 @@ public NicProfile createGuestNicProfileForVpcRouter(final RouterDeploymentDefini final NicProfile guestNic = new NicProfile(); if (vpcRouterDeploymentDefinition.isRedundant()) { - guestNic.setIPv4Address(_ipAddrMgr.acquireGuestIpAddress(guestNetwork, null)); + guestNic.setIPv4Address(_ipAddrMgr.acquireFirstGuestIpAddress(guestNetwork)); } else { guestNic.setIPv4Address(guestNetwork.getGateway()); } From 1e6f9270b60faf33e114e1234cbd96abf9156cd1 Mon Sep 17 00:00:00 2001 From: ArthurHlt Date: Fri, 6 Mar 2020 15:27:24 +0100 Subject: [PATCH 2/7] add config key params for letting user chose vrouter placement in tiers --- .../com/cloud/network/IpAddressManager.java | 2 ++ .../cloud/network/IpAddressManagerImpl.java | 20 ++++++++++- .../cloud/network/guru/GuestNetworkGuru.java | 27 +++++++++++++-- .../cloud/network/guru/VrouterPlacement.java | 34 +++++++++++++++++++ 4 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 server/src/main/java/com/cloud/network/guru/VrouterPlacement.java diff --git a/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java b/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java index 418275a57a0e..15761a6c0396 100644 --- a/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java +++ b/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java @@ -105,6 +105,8 @@ boolean applyIpAssociations(Network network, boolean rulesRevoked, boolean conti String acquireFirstGuestIpAddress(Network network); + String acquireLastGuestIpAddress(Network network); + boolean applyStaticNats(List staticNats, boolean continueOnError, boolean forRevoke) throws ResourceUnavailableException; IpAddress assignSystemIp(long networkId, Account owner, boolean forElasticLb, boolean forElasticIp) throws InsufficientAddressCapacityException; diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java index 6b091e0f22e1..09091364acc1 100644 --- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java +++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java @@ -26,6 +26,7 @@ import java.util.Random; import java.util.Set; import java.util.UUID; +import java.util.Collections; import javax.inject.Inject; @@ -1862,12 +1863,29 @@ public String acquireFirstGuestIpAddress(Network network) { } Set availableIps = _networkModel.getAvailableIps(network, null); if (availableIps == null || availableIps.isEmpty()) { - s_logger.debug("There are no free ips in the network " + network); + s_logger.debug("There are no free ips in the network " + network); return null; } return NetUtils.long2Ip(availableIps.iterator().next()); } + @Override + public String acquireLastGuestIpAddress(Network network) { + if (_networkModel.listNetworkOfferingServices(network.getNetworkOfferingId()).isEmpty() && network.getCidr() == null) { + return null; + } + Set availableIps = _networkModel.getAvailableIps(network, null); + if (availableIps == null || availableIps.isEmpty()) { + s_logger.debug("There are no free ips in the network " + network); + return null; + } + + List availableIpsReverse = new ArrayList(availableIps); + Collections.sort(availableIpsReverse, Collections.reverseOrder()); + + return NetUtils.long2Ip(availableIpsReverse.iterator().next()); + } + /** * Get the list of public IPs that need to be applied for a static NAT enable/disable operation. * Manipulating only these ips prevents concurrency issues when disabling static nat at the same time. 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 ce7722ebd3f8..a9033a4eef24 100644 --- a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java @@ -120,6 +120,14 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur "If true, when account has dedicated guest vlan range(s), once the vlans dedicated to the account have been consumed vlans will be allocated from the system pool", false, ConfigKey.Scope.Account); + static final ConfigKey VrouterRedundantTiersPlacement = new ConfigKey( + "Advanced", + String.class, + "vrouter.redundant.tiers.placement", + "random", + "Set placement of vrouter ips in redundant mode in vpc tiers, this can be 3 value: `first` to use first ips in tiers, `last` to use last ips in tiers and `random` to take random ips in tiers.", + true, ConfigKey.Scope.Account); + private static final TrafficType[] TrafficTypes = {TrafficType.Guest}; // Currently set to anything except STT for the Nicira integration. @@ -370,8 +378,11 @@ public NicProfile allocate(final Network network, NicProfile nic, final VirtualM guestIp = network.getGateway(); } else { if (nic.getRequestedIPv4() == null && vm.getVirtualMachine().getType() == VirtualMachine.Type.DomainRouter) { - guestIp = _ipAddrMgr.acquireFirstGuestIpAddress(network); - }else { + guestIp = this.acquireGuestIpAddressForVrouterRedundant( + VrouterPlacement.fromString(VrouterRedundantTiersPlacement.valueIn(network.getAccountId())), + network, nic.getRequestedIPv4() + ); + } else { guestIp = _ipAddrMgr.acquireGuestIpAddress(network, nic.getRequestedIPv4()); } if (guestIp == null && network.getGuestType() != GuestType.L2 && !_networkModel.listNetworkOfferingServices(network.getNetworkOfferingId()).isEmpty()) { @@ -403,6 +414,16 @@ public NicProfile allocate(final Network network, NicProfile nic, final VirtualM return nic; } + public String acquireGuestIpAddressForVrouterRedundant(VrouterPlacement placement, Network network, String requestedIp) { + switch (placement) { + case Last: + return _ipAddrMgr.acquireLastGuestIpAddress(network); + case First: + return _ipAddrMgr.acquireFirstGuestIpAddress(network); + } + return _ipAddrMgr.acquireGuestIpAddress(network, requestedIp); + } + @Override public void updateNicProfile(final NicProfile profile, final Network network) { final DataCenter dc = _dcDao.findById(network.getDataCenterId()); @@ -464,6 +485,6 @@ public String getConfigComponentName() { @Override public ConfigKey[] getConfigKeys() { - return new ConfigKey[] {UseSystemGuestVlans}; + return new ConfigKey[]{UseSystemGuestVlans, VrouterRedundantTiersPlacement}; } } diff --git a/server/src/main/java/com/cloud/network/guru/VrouterPlacement.java b/server/src/main/java/com/cloud/network/guru/VrouterPlacement.java new file mode 100644 index 000000000000..1945c9e25842 --- /dev/null +++ b/server/src/main/java/com/cloud/network/guru/VrouterPlacement.java @@ -0,0 +1,34 @@ +package com.cloud.network.guru; + +// 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. +public enum VrouterPlacement { + Random, + First, + Last; + + + public static VrouterPlacement fromString(String param) { + switch (param.trim().toLowerCase()) { + case "first": + return First; + case "last": + return Last; + } + return Random; + } +} From b5c7e5e7547cce38160b7aa773646ca64245c3fd Mon Sep 17 00:00:00 2001 From: ArthurHlt Date: Sat, 7 Mar 2020 23:35:36 +0100 Subject: [PATCH 3/7] rework style code --- .../cloud/network/guru/GuestNetworkGuru.java | 28 +++++++++---------- 1 file changed, 14 insertions(+), 14 deletions(-) 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 a9033a4eef24..d864379a1080 100644 --- a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java @@ -376,21 +376,17 @@ public NicProfile allocate(final Network network, NicProfile nic, final VirtualM if (isGateway) { guestIp = network.getGateway(); + } else if (vm.getVirtualMachine().getType() == VirtualMachine.Type.DomainRouter) { + guestIp = this.acquireGuestIpAddressForVrouterRedundant(network, nic.getRequestedIPv4()); } else { - if (nic.getRequestedIPv4() == null && vm.getVirtualMachine().getType() == VirtualMachine.Type.DomainRouter) { - guestIp = this.acquireGuestIpAddressForVrouterRedundant( - VrouterPlacement.fromString(VrouterRedundantTiersPlacement.valueIn(network.getAccountId())), - network, nic.getRequestedIPv4() - ); - } else { - guestIp = _ipAddrMgr.acquireGuestIpAddress(network, nic.getRequestedIPv4()); - } - if (guestIp == null && network.getGuestType() != GuestType.L2 && !_networkModel.listNetworkOfferingServices(network.getNetworkOfferingId()).isEmpty()) { - throw new InsufficientVirtualNetworkCapacityException("Unable to acquire Guest IP" + " address for network " + network, DataCenter.class, - dc.getId()); - } + guestIp = _ipAddrMgr.acquireGuestIpAddress(network, nic.getRequestedIPv4()); } + if (!isGateway && guestIp == null && network.getGuestType() != GuestType.L2 && !_networkModel.listNetworkOfferingServices(network.getNetworkOfferingId()).isEmpty()) { + throw new InsufficientVirtualNetworkCapacityException("Unable to acquire Guest IP" + " address for network " + network, DataCenter.class, + dc.getId()); + } + nic.setIPv4Address(guestIp); if (network.getCidr() != null) { nic.setIPv4Netmask(NetUtils.cidr2Netmask(_networkModel.getValidNetworkCidr(network))); @@ -414,14 +410,18 @@ public NicProfile allocate(final Network network, NicProfile nic, final VirtualM return nic; } - public String acquireGuestIpAddressForVrouterRedundant(VrouterPlacement placement, Network network, String requestedIp) { + public String acquireGuestIpAddressForVrouterRedundant(Network network, String requestedIp) { + if (requestedIp != null) { + return _ipAddrMgr.acquireGuestIpAddress(network, requestedIp); + } + VrouterPlacement placement = VrouterPlacement.fromString(VrouterRedundantTiersPlacement.valueIn(network.getAccountId())); switch (placement) { case Last: return _ipAddrMgr.acquireLastGuestIpAddress(network); case First: return _ipAddrMgr.acquireFirstGuestIpAddress(network); } - return _ipAddrMgr.acquireGuestIpAddress(network, requestedIp); + return _ipAddrMgr.acquireGuestIpAddress(network, null); } @Override From 5489539f97e3851d3c2624d9dfb58d581e5e3363 Mon Sep 17 00:00:00 2001 From: ArthurHlt Date: Sun, 8 Mar 2020 01:00:44 +0100 Subject: [PATCH 4/7] fix mvn check style ? --- .../src/main/java/com/cloud/network/guru/GuestNetworkGuru.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d864379a1080..99f05e3523f0 100644 --- a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java @@ -386,7 +386,7 @@ public NicProfile allocate(final Network network, NicProfile nic, final VirtualM throw new InsufficientVirtualNetworkCapacityException("Unable to acquire Guest IP" + " address for network " + network, DataCenter.class, dc.getId()); } - + nic.setIPv4Address(guestIp); if (network.getCidr() != null) { nic.setIPv4Netmask(NetUtils.cidr2Netmask(_networkModel.getValidNetworkCidr(network))); From eb54d74c461000ac9cb866763480760e935f0c45 Mon Sep 17 00:00:00 2001 From: ArthurHlt Date: Sun, 8 Mar 2020 17:33:44 +0100 Subject: [PATCH 5/7] refactor placement and rework acquiring ip in router --- .../com/cloud/network/IpAddressManager.java | 2 ++ .../java/com/cloud/network/IpPlacement.java | 6 +++--- .../cloud/network/IpAddressManagerImpl.java | 14 ++++++++++++++ .../cloud/network/guru/GuestNetworkGuru.java | 18 +++++++----------- .../network/router/NetworkHelperImpl.java | 9 ++++++++- .../network/router/NicProfileHelperImpl.java | 9 ++++++++- 6 files changed, 42 insertions(+), 16 deletions(-) rename server/src/main/java/com/cloud/network/guru/VrouterPlacement.java => engine/components-api/src/main/java/com/cloud/network/IpPlacement.java (89%) diff --git a/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java b/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java index 15761a6c0396..5050740fc8ea 100644 --- a/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java +++ b/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java @@ -107,6 +107,8 @@ boolean applyIpAssociations(Network network, boolean rulesRevoked, boolean conti String acquireLastGuestIpAddress(Network network); + String acquireGuestIpAddressByPlacement(IpPlacement ipPlacement, Network network, String requestedIp); + boolean applyStaticNats(List staticNats, boolean continueOnError, boolean forRevoke) throws ResourceUnavailableException; IpAddress assignSystemIp(long networkId, Account owner, boolean forElasticLb, boolean forElasticIp) throws InsufficientAddressCapacityException; diff --git a/server/src/main/java/com/cloud/network/guru/VrouterPlacement.java b/engine/components-api/src/main/java/com/cloud/network/IpPlacement.java similarity index 89% rename from server/src/main/java/com/cloud/network/guru/VrouterPlacement.java rename to engine/components-api/src/main/java/com/cloud/network/IpPlacement.java index 1945c9e25842..f5a80c9ab37b 100644 --- a/server/src/main/java/com/cloud/network/guru/VrouterPlacement.java +++ b/engine/components-api/src/main/java/com/cloud/network/IpPlacement.java @@ -1,4 +1,4 @@ -package com.cloud.network.guru; +package com.cloud.network; // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file @@ -16,13 +16,13 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -public enum VrouterPlacement { +public enum IpPlacement { Random, First, Last; - public static VrouterPlacement fromString(String param) { + public static IpPlacement fromString(String param) { switch (param.trim().toLowerCase()) { case "first": return First; diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java index 09091364acc1..b366fcddd8e2 100644 --- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java +++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java @@ -1886,6 +1886,20 @@ public String acquireLastGuestIpAddress(Network network) { return NetUtils.long2Ip(availableIpsReverse.iterator().next()); } + @Override + public String acquireGuestIpAddressByPlacement(IpPlacement ipPlacement, Network network, String requestedIp) { + if (requestedIp != null) { + return this.acquireGuestIpAddress(network, requestedIp); + } + switch (ipPlacement) { + case Last: + return this.acquireLastGuestIpAddress(network); + case First: + return this.acquireFirstGuestIpAddress(network); + } + return this.acquireGuestIpAddress(network, null); + } + /** * Get the list of public IPs that need to be applied for a static NAT enable/disable operation. * Manipulating only these ips prevents concurrency issues when disabling static nat at the same time. 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 99f05e3523f0..514ecb862261 100644 --- a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java @@ -22,6 +22,7 @@ import javax.inject.Inject; +import com.cloud.network.IpPlacement; import com.cloud.network.Network.GuestType; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; @@ -411,17 +412,12 @@ public NicProfile allocate(final Network network, NicProfile nic, final VirtualM } public String acquireGuestIpAddressForVrouterRedundant(Network network, String requestedIp) { - if (requestedIp != null) { - return _ipAddrMgr.acquireGuestIpAddress(network, requestedIp); - } - VrouterPlacement placement = VrouterPlacement.fromString(VrouterRedundantTiersPlacement.valueIn(network.getAccountId())); - switch (placement) { - case Last: - return _ipAddrMgr.acquireLastGuestIpAddress(network); - case First: - return _ipAddrMgr.acquireFirstGuestIpAddress(network); - } - return _ipAddrMgr.acquireGuestIpAddress(network, null); + return _ipAddrMgr.acquireGuestIpAddressByPlacement(ipPlacementFromConfig(network), network, requestedIp); + } + + public static IpPlacement ipPlacementFromConfig(Network network) { + String placementConfig = VrouterRedundantTiersPlacement.valueIn(network.getAccountId()); + return IpPlacement.fromString(placementConfig); } @Override diff --git a/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java b/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java index 1ba4e819c24f..977f8794d09e 100644 --- a/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java +++ b/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java @@ -27,6 +27,7 @@ import javax.annotation.PostConstruct; import javax.inject.Inject; +import com.cloud.network.guru.GuestNetworkGuru; import org.apache.log4j.Logger; import org.cloud.network.router.deployment.RouterDeploymentDefinition; @@ -747,7 +748,7 @@ public LinkedHashMap> configureGuestNic(fina final NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp, defaultNetworkStartIpv6); if (routerDeploymentDefinition.isPublicNetwork()) { if (routerDeploymentDefinition.isRedundant()) { - gatewayNic.setIPv4Address(_ipAddrMgr.acquireFirstGuestIpAddress(guestNetwork)); + gatewayNic.setIPv4Address(this.acquireGuestIpAddressForVrouterRedundant(guestNetwork)); } else { gatewayNic.setIPv4Address(guestNetwork.getGateway()); } @@ -883,4 +884,10 @@ private static boolean containsOnlyNumbers(final String str, final String endCha } return true; } + + public String acquireGuestIpAddressForVrouterRedundant(Network network) { + return _ipAddrMgr.acquireGuestIpAddressByPlacement( + GuestNetworkGuru.ipPlacementFromConfig(network), network, null + ); + } } diff --git a/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java b/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java index 7f35f34acedc..26990f5a1a65 100644 --- a/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java +++ b/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java @@ -21,6 +21,7 @@ import javax.inject.Inject; +import com.cloud.network.guru.GuestNetworkGuru; import com.cloud.utils.exception.CloudRuntimeException; import org.cloud.network.router.deployment.RouterDeploymentDefinition; @@ -118,7 +119,7 @@ public NicProfile createGuestNicProfileForVpcRouter(final RouterDeploymentDefini final NicProfile guestNic = new NicProfile(); if (vpcRouterDeploymentDefinition.isRedundant()) { - guestNic.setIPv4Address(_ipAddrMgr.acquireFirstGuestIpAddress(guestNetwork)); + guestNic.setIPv4Address(this.acquireGuestIpAddressForVrouterRedundant(guestNetwork)); } else { guestNic.setIPv4Address(guestNetwork.getGateway()); } @@ -133,4 +134,10 @@ public NicProfile createGuestNicProfileForVpcRouter(final RouterDeploymentDefini return guestNic; } + public String acquireGuestIpAddressForVrouterRedundant(Network network) { + return _ipAddrMgr.acquireGuestIpAddressByPlacement( + GuestNetworkGuru.ipPlacementFromConfig(network), network, null + ); + } + } \ No newline at end of file From f89a564d5059b06ef96a8b0576d3e71dc73e4547 Mon Sep 17 00:00:00 2001 From: ArthurHlt Date: Thu, 12 Mar 2020 02:42:26 +0100 Subject: [PATCH 6/7] place vrouter placement concept in addr manager --- .../com/cloud/network/IpAddressManager.java | 9 +++++++- .../cloud/network/IpAddressManagerImpl.java | 6 ++++-- .../cloud/network/guru/GuestNetworkGuru.java | 21 ++----------------- .../network/router/NetworkHelperImpl.java | 4 +--- .../network/router/NicProfileHelperImpl.java | 4 +--- 5 files changed, 16 insertions(+), 28 deletions(-) diff --git a/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java b/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java index 5050740fc8ea..47b0e7610e01 100644 --- a/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java +++ b/engine/components-api/src/main/java/com/cloud/network/IpAddressManager.java @@ -48,6 +48,13 @@ public interface IpAddressManager { ConfigKey RulesContinueOnError = new ConfigKey("Advanced", Boolean.class, "network.rule.delete.ignoreerror", "true", "When true, ip address delete (ipassoc) failures are ignored", true); + ConfigKey VrouterRedundantTiersPlacement = new ConfigKey( + "Advanced", String.class, + "vrouter.redundant.tiers.placement", + "random", + "Set placement of vrouter ips in redundant mode in vpc tiers, this can be 3 value: `first` to use first ips in tiers, `last` to use last ips in tiers and `random` to take random ips in tiers.", + true, ConfigKey.Scope.Account); + /** * Assigns a new public ip address. * @@ -107,7 +114,7 @@ boolean applyIpAssociations(Network network, boolean rulesRevoked, boolean conti String acquireLastGuestIpAddress(Network network); - String acquireGuestIpAddressByPlacement(IpPlacement ipPlacement, Network network, String requestedIp); + String acquireGuestIpAddressByPlacement(Network network, String requestedIp); boolean applyStaticNats(List staticNats, boolean continueOnError, boolean forRevoke) throws ResourceUnavailableException; diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java index b366fcddd8e2..5e496053974c 100644 --- a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java +++ b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java @@ -1887,10 +1887,12 @@ public String acquireLastGuestIpAddress(Network network) { } @Override - public String acquireGuestIpAddressByPlacement(IpPlacement ipPlacement, Network network, String requestedIp) { + public String acquireGuestIpAddressByPlacement(Network network, String requestedIp) { if (requestedIp != null) { return this.acquireGuestIpAddress(network, requestedIp); } + String placementConfig = VrouterRedundantTiersPlacement.valueIn(network.getAccountId()); + IpPlacement ipPlacement = IpPlacement.fromString(placementConfig); switch (ipPlacement) { case Last: return this.acquireLastGuestIpAddress(network); @@ -2191,7 +2193,7 @@ public String getConfigComponentName() { @Override public ConfigKey[] getConfigKeys() { - return new ConfigKey[] {UseSystemPublicIps, RulesContinueOnError, SystemVmPublicIpReservationModeStrictness}; + return new ConfigKey[] {UseSystemPublicIps, RulesContinueOnError, SystemVmPublicIpReservationModeStrictness, VrouterRedundantTiersPlacement}; } /** 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 514ecb862261..00586afd1f74 100644 --- a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java @@ -121,14 +121,6 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur "If true, when account has dedicated guest vlan range(s), once the vlans dedicated to the account have been consumed vlans will be allocated from the system pool", false, ConfigKey.Scope.Account); - static final ConfigKey VrouterRedundantTiersPlacement = new ConfigKey( - "Advanced", - String.class, - "vrouter.redundant.tiers.placement", - "random", - "Set placement of vrouter ips in redundant mode in vpc tiers, this can be 3 value: `first` to use first ips in tiers, `last` to use last ips in tiers and `random` to take random ips in tiers.", - true, ConfigKey.Scope.Account); - private static final TrafficType[] TrafficTypes = {TrafficType.Guest}; // Currently set to anything except STT for the Nicira integration. @@ -378,7 +370,7 @@ public NicProfile allocate(final Network network, NicProfile nic, final VirtualM if (isGateway) { guestIp = network.getGateway(); } else if (vm.getVirtualMachine().getType() == VirtualMachine.Type.DomainRouter) { - guestIp = this.acquireGuestIpAddressForVrouterRedundant(network, nic.getRequestedIPv4()); + guestIp = _ipAddrMgr.acquireGuestIpAddressByPlacement(network, nic.getRequestedIPv4()); } else { guestIp = _ipAddrMgr.acquireGuestIpAddress(network, nic.getRequestedIPv4()); } @@ -411,15 +403,6 @@ public NicProfile allocate(final Network network, NicProfile nic, final VirtualM return nic; } - public String acquireGuestIpAddressForVrouterRedundant(Network network, String requestedIp) { - return _ipAddrMgr.acquireGuestIpAddressByPlacement(ipPlacementFromConfig(network), network, requestedIp); - } - - public static IpPlacement ipPlacementFromConfig(Network network) { - String placementConfig = VrouterRedundantTiersPlacement.valueIn(network.getAccountId()); - return IpPlacement.fromString(placementConfig); - } - @Override public void updateNicProfile(final NicProfile profile, final Network network) { final DataCenter dc = _dcDao.findById(network.getDataCenterId()); @@ -481,6 +464,6 @@ public String getConfigComponentName() { @Override public ConfigKey[] getConfigKeys() { - return new ConfigKey[]{UseSystemGuestVlans, VrouterRedundantTiersPlacement}; + return new ConfigKey[]{UseSystemGuestVlans}; } } diff --git a/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java b/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java index 977f8794d09e..5b360edb3240 100644 --- a/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java +++ b/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java @@ -886,8 +886,6 @@ private static boolean containsOnlyNumbers(final String str, final String endCha } public String acquireGuestIpAddressForVrouterRedundant(Network network) { - return _ipAddrMgr.acquireGuestIpAddressByPlacement( - GuestNetworkGuru.ipPlacementFromConfig(network), network, null - ); + return _ipAddrMgr.acquireGuestIpAddressByPlacement(network, null); } } diff --git a/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java b/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java index 26990f5a1a65..ff54bcbfe965 100644 --- a/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java +++ b/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java @@ -135,9 +135,7 @@ public NicProfile createGuestNicProfileForVpcRouter(final RouterDeploymentDefini } public String acquireGuestIpAddressForVrouterRedundant(Network network) { - return _ipAddrMgr.acquireGuestIpAddressByPlacement( - GuestNetworkGuru.ipPlacementFromConfig(network), network, null - ); + return _ipAddrMgr.acquireGuestIpAddressByPlacement(network, null); } } \ No newline at end of file From c6e315f4b9fd25b73789ec01b729309c6b7a2ebe Mon Sep 17 00:00:00 2001 From: ArthurHlt Date: Fri, 13 Mar 2020 14:33:00 +0100 Subject: [PATCH 7/7] rm unused imports --- .../src/main/java/com/cloud/network/guru/GuestNetworkGuru.java | 1 - .../main/java/com/cloud/network/router/NetworkHelperImpl.java | 1 - .../main/java/com/cloud/network/router/NicProfileHelperImpl.java | 1 - 3 files changed, 3 deletions(-) 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 00586afd1f74..fc4a45a49114 100644 --- a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java +++ b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java @@ -22,7 +22,6 @@ import javax.inject.Inject; -import com.cloud.network.IpPlacement; import com.cloud.network.Network.GuestType; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; diff --git a/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java b/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java index 5b360edb3240..d130b4f9c8f0 100644 --- a/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java +++ b/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java @@ -27,7 +27,6 @@ import javax.annotation.PostConstruct; import javax.inject.Inject; -import com.cloud.network.guru.GuestNetworkGuru; import org.apache.log4j.Logger; import org.cloud.network.router.deployment.RouterDeploymentDefinition; diff --git a/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java b/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java index ff54bcbfe965..588e83271e98 100644 --- a/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java +++ b/server/src/main/java/com/cloud/network/router/NicProfileHelperImpl.java @@ -21,7 +21,6 @@ import javax.inject.Inject; -import com.cloud.network.guru.GuestNetworkGuru; import com.cloud.utils.exception.CloudRuntimeException; import org.cloud.network.router.deployment.RouterDeploymentDefinition;