You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cloudstack.apache.org by ga...@apache.org on 2019/07/16 14:17:20 UTC

[cloudstack] 01/09: kvm/bridge: Allow Link Local Cidr (cloud0 interface) to be configured

This is an automated email from the ASF dual-hosted git repository.

gabriel pushed a commit to branch cloud0-cidr-412
in repository https://gitbox.apache.org/repos/asf/cloudstack.git

commit f2d38daee1f4cf9820b1e939d80afdb74f50bbe3
Author: Wido den Hollander <wi...@widodh.nl>
AuthorDate: Fri Jul 12 10:54:41 2019 +0200

    kvm/bridge: Allow Link Local Cidr (cloud0 interface) to be configured
    
    There are certain scenarios where the 169.254.0.0/16 subnet is used for different
    purposes then CloudStack on a hypervisor.
    
    Once of such scenarios is a BGP+EVPN+VXLAN setup using BGP Unnumbered where the
    169.254.0.1 address is used by Frr/Zebra BGP routing to send traffic to the
    neighboring router.
    
    The following settings can be changed in the agent.properties (default values added):
    
    network.linklocal.cidr=169.254.0.0/16
    network.linklink.address=169.254.0.1/16
    network.linklocal.gateway=169.254.0.1
    network.linklocal.netmask=255.255.255.0
    
    Make sure the global setting 'control.cidr' matches the values defined in the agent.propeties!
    
    Signed-off-by: Wido den Hollander <wi...@widodh.nl>
---
 .../hypervisor/kvm/resource/BridgeVifDriver.java   | 35 ++++++++++++++++++----
 1 file changed, 30 insertions(+), 5 deletions(-)

diff --git a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java
index ebaf23f..0aef2c5 100644
--- a/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java
+++ b/plugins/hypervisors/kvm/src/main/java/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java
@@ -28,6 +28,7 @@ import java.util.regex.Pattern;
 
 import javax.naming.ConfigurationException;
 
+import com.cloud.utils.StringUtils;
 import org.apache.log4j.Logger;
 import org.libvirt.LibvirtException;
 
@@ -49,6 +50,10 @@ public class BridgeVifDriver extends VifDriverBase {
     private final Object _vnetBridgeMonitor = new Object();
     private String _modifyVlanPath;
     private String _modifyVxlanPath;
+    private String _linkLocalCidr = "169.254.0.0/16";
+    private String _linkLocalAddress = "169.254.0.1/16";
+    private String _linkLocalGateway = NetUtils.getLinkLocalGateway();
+    private String _linkLocalNetmask = NetUtils.getLinkLocalNetMask();
     private String bridgeNameSchema;
     private Long libvirtVersion;
 
@@ -69,6 +74,26 @@ public class BridgeVifDriver extends VifDriverBase {
 
         bridgeNameSchema = (String)params.get("network.bridge.name.schema");
 
+        String linkLocalCidr = (String)params.get("network.linklocal.cidr");
+        if (StringUtils.isNotBlank(linkLocalCidr)) {
+            _linkLocalCidr = linkLocalCidr;
+        }
+
+        String linkLocalAddress = (String)params.get("network.linklocal.address");
+        if (StringUtils.isNotBlank(linkLocalAddress)) {
+            _linkLocalAddress = linkLocalAddress;
+        }
+
+        String linkLocalGateway = (String)params.get("network.linklocal.gateway");
+        if (StringUtils.isNotBlank(linkLocalGateway)) {
+            _linkLocalGateway = linkLocalGateway;
+        }
+
+        String linkLocalNetmask = (String)params.get("network.linklocal.netmask");
+        if (StringUtils.isNotBlank(linkLocalNetmask)) {
+            _linkLocalNetmask = _linkLocalNetmask;
+        }
+
         String value = (String)params.get("scripts.timeout");
         _timeout = NumbersUtil.parseInt(value, 30 * 60) * 1000;
 
@@ -384,7 +409,7 @@ public class BridgeVifDriver extends VifDriverBase {
     private void deleteExistingLinkLocalRouteTable(String linkLocalBr) {
         Script command = new Script("/bin/bash", _timeout);
         command.add("-c");
-        command.add("ip route | grep " + NetUtils.getLinkLocalCIDR());
+        command.add("ip route | grep " + _linkLocalCidr);
         OutputInterpreter.AllLinesParser parser = new OutputInterpreter.AllLinesParser();
         String result = command.execute(parser);
         boolean foundLinkLocalBr = false;
@@ -397,15 +422,15 @@ public class BridgeVifDriver extends VifDriverBase {
                 }
                 final String device = tokens[2];
                 if (!Strings.isNullOrEmpty(device) && !device.equalsIgnoreCase(linkLocalBr)) {
-                    Script.runSimpleBashScript("ip route del " + NetUtils.getLinkLocalCIDR() + " dev " + tokens[2]);
+                    Script.runSimpleBashScript("ip route del " + _linkLocalCidr + " dev " + tokens[2]);
                 } else {
                     foundLinkLocalBr = true;
                 }
             }
         }
         if (!foundLinkLocalBr) {
-            Script.runSimpleBashScript("ip address add 169.254.0.1/16 dev " + linkLocalBr + ";" + "ip route add " + NetUtils.getLinkLocalCIDR() + " dev " + linkLocalBr + " src " +
-                    NetUtils.getLinkLocalGateway());
+            Script.runSimpleBashScript("ip address add " + _linkLocalAddress + " dev " + linkLocalBr + ";" + "ip route add " + _linkLocalCidr + " dev " + linkLocalBr + " src " +
+                    _linkLocalGateway;
         }
     }
 
@@ -417,7 +442,7 @@ public class BridgeVifDriver extends VifDriverBase {
     public void createControlNetwork(String privBrName)  {
         deleteExistingLinkLocalRouteTable(privBrName);
         if (!isExistingBridge(privBrName)) {
-            Script.runSimpleBashScript("brctl addbr " + privBrName + "; ip link set " + privBrName + " up; ip address add 169.254.0.1/16 dev " + privBrName, _timeout);
+            Script.runSimpleBashScript("brctl addbr " + privBrName + "; ip link set " + privBrName + " up; ip address add " + _linkLocalAddress + " dev " + privBrName, _timeout);
         }
     }