You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by da...@apache.org on 2020/03/14 08:23:01 UTC
[cloudstack] branch master updated: vrouter in redundant mode acquire guest ips from first ip of th… (#3587)
This is an automated email from the ASF dual-hosted git repository.
dahn pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/master by this push:
new 3575f5e vrouter in redundant mode acquire guest ips from first ip of th… (#3587)
3575f5e is described below
commit 3575f5ed5214b95434d3f8ab795f0d33265f199f
Author: Arthur Halet <ar...@orange.com>
AuthorDate: Sat Mar 14 09:22:48 2020 +0100
vrouter in redundant mode acquire guest ips from first ip of th… (#3587)
---
.../java/com/cloud/network/IpAddressManager.java | 13 ++++++
.../main/java/com/cloud/network/IpPlacement.java | 34 +++++++++++++++
.../com/cloud/network/IpAddressManagerImpl.java | 49 +++++++++++++++++++++-
.../com/cloud/network/guru/GuestNetworkGuru.java | 13 +++---
.../cloud/network/router/NetworkHelperImpl.java | 6 ++-
.../cloud/network/router/NicProfileHelperImpl.java | 6 ++-
6 files changed, 113 insertions(+), 8 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 d4c5bf6..e9f4d9c 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<Boolean> RulesContinueOnError = new ConfigKey<Boolean>("Advanced", Boolean.class, "network.rule.delete.ignoreerror", "true",
"When true, ip address delete (ipassoc) failures are ignored", true);
+ ConfigKey<String> VrouterRedundantTiersPlacement = new ConfigKey<String>(
+ "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.
*
@@ -103,6 +110,12 @@ public interface IpAddressManager {
String acquireGuestIpAddress(Network network, String requestedIp);
+ String acquireFirstGuestIpAddress(Network network);
+
+ String acquireLastGuestIpAddress(Network network);
+
+ String acquireGuestIpAddressByPlacement(Network network, String requestedIp);
+
boolean applyStaticNats(List<? extends StaticNat> staticNats, boolean continueOnError, boolean forRevoke) throws ResourceUnavailableException;
IpAddress assignSystemIp(long networkId, Account owner, boolean forElasticLb, boolean forElasticIp) throws InsufficientAddressCapacityException;
diff --git a/engine/components-api/src/main/java/com/cloud/network/IpPlacement.java b/engine/components-api/src/main/java/com/cloud/network/IpPlacement.java
new file mode 100644
index 0000000..f5a80c9
--- /dev/null
+++ b/engine/components-api/src/main/java/com/cloud/network/IpPlacement.java
@@ -0,0 +1,34 @@
+package com.cloud.network;
+
+// 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 IpPlacement {
+ Random,
+ First,
+ Last;
+
+
+ public static IpPlacement fromString(String param) {
+ switch (param.trim().toLowerCase()) {
+ case "first":
+ return First;
+ case "last":
+ return Last;
+ }
+ return Random;
+ }
+}
diff --git a/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java b/server/src/main/java/com/cloud/network/IpAddressManagerImpl.java
index ddb596a..9ad56fc 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.Map;
import java.util.Random;
import java.util.Set;
import java.util.UUID;
+import java.util.Collections;
import javax.inject.Inject;
@@ -1884,6 +1885,52 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
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<Long> 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());
+ }
+
+ @Override
+ public String acquireLastGuestIpAddress(Network network) {
+ if (_networkModel.listNetworkOfferingServices(network.getNetworkOfferingId()).isEmpty() && network.getCidr() == null) {
+ return null;
+ }
+ Set<Long> 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<Long> availableIpsReverse = new ArrayList(availableIps);
+ Collections.sort(availableIpsReverse, Collections.reverseOrder());
+
+ return NetUtils.long2Ip(availableIpsReverse.iterator().next());
+ }
+
+ @Override
+ 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);
+ 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.
@@ -2175,7 +2222,7 @@ public class IpAddressManagerImpl extends ManagerBase implements IpAddressManage
@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 1992775..7fb482f 100644
--- a/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java
+++ b/server/src/main/java/com/cloud/network/guru/GuestNetworkGuru.java
@@ -372,12 +372,15 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur
if (isGateway) {
guestIp = network.getGateway();
+ } else if (vm.getVirtualMachine().getType() == VirtualMachine.Type.DomainRouter) {
+ guestIp = _ipAddrMgr.acquireGuestIpAddressByPlacement(network, nic.getRequestedIPv4());
} else {
guestIp = _ipAddrMgr.acquireGuestIpAddress(network, nic.getRequestedIPv4());
- if (guestIp == null && network.getGuestType() != GuestType.L2 && !_networkModel.listNetworkOfferingServices(network.getNetworkOfferingId()).isEmpty()) {
- throw new InsufficientVirtualNetworkCapacityException("Unable to acquire Guest IP" + " address for network " + network, DataCenter.class,
- dc.getId());
- }
+ }
+
+ if (!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);
@@ -464,6 +467,6 @@ public abstract class GuestNetworkGuru extends AdapterBase implements NetworkGur
@Override
public ConfigKey<?>[] getConfigKeys() {
- return new ConfigKey<?>[] {UseSystemGuestVlans};
+ 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 a549adb..39d902f 100644
--- a/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java
+++ b/server/src/main/java/com/cloud/network/router/NetworkHelperImpl.java
@@ -749,7 +749,7 @@ public class NetworkHelperImpl implements NetworkHelper {
final NicProfile gatewayNic = new NicProfile(defaultNetworkStartIp, defaultNetworkStartIpv6);
if (routerDeploymentDefinition.isPublicNetwork()) {
if (routerDeploymentDefinition.isRedundant()) {
- gatewayNic.setIPv4Address(_ipAddrMgr.acquireGuestIpAddress(guestNetwork, null));
+ gatewayNic.setIPv4Address(this.acquireGuestIpAddressForVrouterRedundant(guestNetwork));
} else {
gatewayNic.setIPv4Address(guestNetwork.getGateway());
}
@@ -885,4 +885,8 @@ public class NetworkHelperImpl implements NetworkHelper {
}
return true;
}
+
+ public String acquireGuestIpAddressForVrouterRedundant(Network network) {
+ 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 18ab4a9..588e832 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 class NicProfileHelperImpl implements NicProfileHelper {
final NicProfile guestNic = new NicProfile();
if (vpcRouterDeploymentDefinition.isRedundant()) {
- guestNic.setIPv4Address(_ipAddrMgr.acquireGuestIpAddress(guestNetwork, null));
+ guestNic.setIPv4Address(this.acquireGuestIpAddressForVrouterRedundant(guestNetwork));
} else {
guestNic.setIPv4Address(guestNetwork.getGateway());
}
@@ -133,4 +133,8 @@ public class NicProfileHelperImpl implements NicProfileHelper {
return guestNic;
}
+ public String acquireGuestIpAddressForVrouterRedundant(Network network) {
+ return _ipAddrMgr.acquireGuestIpAddressByPlacement(network, null);
+ }
+
}
\ No newline at end of file