BUG-6070 dpid changes as ports added to bridge 52/40452/1
authorJosh <jhershbe@redhat.com>
Thu, 16 Jun 2016 17:07:08 +0000 (19:07 +0200)
committerJosh <jhershbe@redhat.com>
Thu, 16 Jun 2016 17:07:08 +0000 (19:07 +0200)
Fixed by adding (default) config to auto generate a
mac address and assign it to br-int using
other_config:hwaddr

Change-Id: Ie5e7257831f8ab43b1f7904916e13e0587993555
Signed-off-by: Josh <jhershbe@redhat.com>
openstack/net-virt/src/main/config/default-config.xml
openstack/net-virt/src/main/java/org/opendaylight/netvirt/openstack/netvirt/ConfigActivator.java
openstack/net-virt/src/main/java/org/opendaylight/netvirt/openstack/netvirt/NetvirtProvider.java
openstack/net-virt/src/main/java/org/opendaylight/netvirt/openstack/netvirt/api/Southbound.java
openstack/net-virt/src/main/java/org/opendaylight/netvirt/openstack/netvirt/impl/BridgeConfigurationManagerImpl.java
openstack/net-virt/src/main/java/org/opendaylight/netvirt/openstack/netvirt/impl/SouthboundImpl.java
openstack/net-virt/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/netvirt/impl/rev150513/NetvirtImplModule.java
openstack/net-virt/src/main/yang/netvirt-impl.yang

index 819fb3ee3c1bcee458d355a145a4c064365b1292..894f41d50d736a9f9f600d098ee82b91f9957e02 100644 (file)
@@ -13,6 +13,7 @@
           <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:netvirt:impl">prefix:netvirt-impl</type>
           <name>netvirt-default</name>
           <conntrack-enabled>false</conntrack-enabled>
+          <int-bridge-gen-mac>true</int-bridge-gen-mac>
           <broker>
             <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
             <name>binding-osgi-broker</name>
index 7623e8cb7a8a99184333d543b5f24b8fa9219fd6..96706ac888bd2db1019e1422ea93dfdb3dbd0f86 100644 (file)
@@ -106,6 +106,7 @@ public class ConfigActivator implements BundleActivator {
     private List<Pair<Object, ServiceRegistration>> servicesAndRegistrations = new ArrayList<>();
     private ProviderContext providerContext;
     private boolean conntrackEnabled = false;
+    private boolean intBridgeGenMac = true;
 
     public ConfigActivator(ProviderContext providerContext) {
         this.providerContext = providerContext;
@@ -120,7 +121,7 @@ public class ConfigActivator implements BundleActivator {
         registerService(context, new String[] {ConfigurationService.class.getName()},
                 null, configurationService);
 
-        BridgeConfigurationManagerImpl bridgeConfigurationManager = new BridgeConfigurationManagerImpl();
+        BridgeConfigurationManagerImpl bridgeConfigurationManager = new BridgeConfigurationManagerImpl(intBridgeGenMac);
         registerService(context, new String[] {BridgeConfigurationManager.class.getName()},
                 null, bridgeConfigurationManager);
 
@@ -345,4 +346,8 @@ public class ConfigActivator implements BundleActivator {
     public void setConntrackEnabled(boolean conntrackEnabled) {
         this.conntrackEnabled = conntrackEnabled;
     }
+
+    public void setIntBridgeGenMac(boolean intBridgeGenMac) {
+        this.intBridgeGenMac = intBridgeGenMac;
+    }
 }
index 797109466fa98fd4d61a082c83532cf3cab53a52..da02d2be8b9bce8a6f490963d5992f4e266f65ca 100644 (file)
@@ -32,6 +32,7 @@ public class NetvirtProvider implements BindingAwareProvider, AutoCloseable {
     private static final Entity ownerInstanceEntity = new Entity(
             Constants.NETVIRT_OWNER_ENTITY_TYPE, Constants.NETVIRT_OWNER_ENTITY_TYPE);
     private boolean conntrackEnabled = false;
+    private boolean intBridgeGenMac;
 
     public NetvirtProvider(BundleContext bundleContext, EntityOwnershipService eos) {
         LOG.info("NetvirtProvider: bundleContext: {}", bundleContext);
@@ -68,6 +69,7 @@ public class NetvirtProvider implements BindingAwareProvider, AutoCloseable {
         LOG.info("NetvirtProvider: onSessionInitiated isConntrackEnabled: {}", this.conntrackEnabled);
         this.activator = new ConfigActivator(providerContext);
         activator.setConntrackEnabled(this.conntrackEnabled);
+        activator.setIntBridgeGenMac(this.intBridgeGenMac);
         try {
             activator.start(bundleContext);
         } catch (Exception e) {
@@ -82,4 +84,12 @@ public class NetvirtProvider implements BindingAwareProvider, AutoCloseable {
     public void setConntrackEnabled(boolean conntackEnabled) {
         this.conntrackEnabled = conntackEnabled;
     }
+
+    public boolean getIntBridgeGenMac() {
+        return intBridgeGenMac;
+    }
+
+    public void setIntBridgeGenMac(boolean intBridgeGenMac) {
+        this.intBridgeGenMac = intBridgeGenMac;
+    }
 }
index b67b4dbfa72e15a9043f00c2c673ef4f6bc148bb..3afa7243d6a92657ed65f5c093a041e629fe7c77 100644 (file)
@@ -38,7 +38,9 @@ public interface Southbound {
     String getOvsdbNodeUUID(Node node);
     String getOsdbNodeExternalIdsValue(OvsdbNodeAugmentation ovsdbNodeAugmentation, String key);
     boolean addBridge(Node ovsdbNode, String bridgeName, List<String> controllersStr,
-                      final Class<? extends DatapathTypeBase> dpType);
+                                                      final Class<? extends DatapathTypeBase> dpType);
+    boolean addBridge(Node ovsdbNode, String bridgeName, List<String> controllersStr,
+                                                      final Class<? extends DatapathTypeBase> dpType, String mac);
     boolean deleteBridge(Node ovsdbNode);
     OvsdbBridgeAugmentation readBridge(Node node, String name);
     Node readBridgeNode(Node node, String name);
index 9252a462a64bbd09c5c2c4328fa9ae45d7a67be1..297576befae7fde198ad0bac7c4540ce47479021 100644 (file)
@@ -35,6 +35,7 @@ import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Enumeration;
 import java.util.List;
+import java.util.Random;
 
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.osgi.framework.ServiceReference;
@@ -53,6 +54,17 @@ public class BridgeConfigurationManagerImpl implements BridgeConfigurationManage
     private volatile ConfigurationService configurationService;
     private volatile NetworkingProviderManager networkingProviderManager;
     private volatile Southbound southbound;
+    private boolean intBridgeGenMac;
+    private Random random;
+
+    public BridgeConfigurationManagerImpl() {
+        this(true);
+    }
+
+    public BridgeConfigurationManagerImpl(boolean intBridgeGenMac) {
+        this.intBridgeGenMac = intBridgeGenMac;
+        this.random = new Random(System.currentTimeMillis());
+    }
 
     public void setConfigurationService(ConfigurationService configurationService) {
         this.configurationService = configurationService;
@@ -301,17 +313,37 @@ public class BridgeConfigurationManagerImpl implements BridgeConfigurationManage
     private boolean createIntegrationBridge(Node ovsdbNode) {
         Preconditions.checkNotNull(configurationService);
 
-        if (!addBridge(ovsdbNode, configurationService.getIntegrationBridgeName())) {
+        if (!addBridge(ovsdbNode, configurationService.getIntegrationBridgeName(),
+                                            intBridgeGenMac ? generateRandomMac() : null)) {
             LOG.debug("Integration Bridge Creation failed");
             return false;
         }
         return true;
     }
 
+    private String generateRandomMac() {
+        byte[] macBytes = new byte[6];
+        random.nextBytes(macBytes);
+        macBytes[0] &= 0xfc; //the two low bits of the first byte need to be zero
+
+        StringBuilder stringBuilder = new StringBuilder();
+
+        int i = 0;
+        while(true) {
+            stringBuilder.append(String.format("%02x", macBytes[i++]));
+            if (i >= 6) {
+                break;
+            }
+            stringBuilder.append(':');
+        }
+
+        return stringBuilder.toString();
+    }
+
     private boolean createExternalBridge(Node ovsdbNode) {
         Preconditions.checkNotNull(configurationService);
 
-        if (!addBridge(ovsdbNode, configurationService.getExternalBridgeName())) {
+        if (!addBridge(ovsdbNode, configurationService.getExternalBridgeName(), null)) {
             LOG.debug("External Bridge Creation failed");
             return false;
         }
@@ -481,7 +513,7 @@ public class BridgeConfigurationManagerImpl implements BridgeConfigurationManage
     /**
      * Add Bridge to a Node
      */
-    private boolean addBridge(Node ovsdbNode, String bridgeName) {
+    private boolean addBridge(Node ovsdbNode, String bridgeName, String mac) {
         boolean rv = true;
         if ((!southbound.isBridgeOnOvsdbNode(ovsdbNode, bridgeName)) ||
                 (southbound.getBridgeFromConfig(ovsdbNode, bridgeName) == null)) {
@@ -489,7 +521,7 @@ public class BridgeConfigurationManagerImpl implements BridgeConfigurationManage
             if (configurationService.isUserSpaceEnabled()) {
                 dpType = DatapathTypeNetdev.class;
             }
-            rv = southbound.addBridge(ovsdbNode, bridgeName, getControllersFromOvsdbNode(ovsdbNode), dpType);
+            rv = southbound.addBridge(ovsdbNode, bridgeName, getControllersFromOvsdbNode(ovsdbNode), dpType, mac);
         }
         return rv;
     }
index 6410f79e9c1de5d33d3cbad2f23bac2df8a44865..0cfd18fa3a7de3fe5c0d50e6ad2670e0266d81c6 100644 (file)
@@ -176,6 +176,11 @@ public class SouthboundImpl implements Southbound {
 
     public boolean addBridge(Node ovsdbNode, String bridgeName, List<String> controllersStr,
                              final Class<? extends DatapathTypeBase> dpType) {
+        return addBridge(ovsdbNode, bridgeName, controllersStr, dpType, null);
+    }
+
+    public boolean addBridge(Node ovsdbNode, String bridgeName, List<String> controllersStr,
+                             final Class<? extends DatapathTypeBase> dpType, String mac) {
         boolean result;
 
         LOG.info("addBridge: node: {}, bridgeName: {}, controller(s): {}", ovsdbNode, bridgeName, controllersStr);
@@ -197,6 +202,12 @@ public class SouthboundImpl implements Southbound {
             bridgeOtherConfigsBuilder.setBridgeOtherConfigValue("true");
             List<BridgeOtherConfigs> bridgeOtherConfigsList = new ArrayList<>();
             bridgeOtherConfigsList.add(bridgeOtherConfigsBuilder.build());
+            if (mac != null) {
+                BridgeOtherConfigsBuilder macOtherConfigBuilder = new BridgeOtherConfigsBuilder();
+                macOtherConfigBuilder.setBridgeOtherConfigKey("hwaddr");
+                macOtherConfigBuilder.setBridgeOtherConfigValue(mac);
+                bridgeOtherConfigsList.add(macOtherConfigBuilder.build());
+            }
             ovsdbBridgeAugmentationBuilder.setBridgeOtherConfigs(bridgeOtherConfigsList);
             setManagedByForBridge(ovsdbBridgeAugmentationBuilder, ovsdbNode.getKey());
             if (dpType != null) {
index add390aa89a93649f09b01da9243f84d1524707c..610f6c15d1884e595cb15e871aa50330ab523701 100644 (file)
@@ -24,6 +24,7 @@ public class NetvirtImplModule extends org.opendaylight.yang.gen.v1.urn.opendayl
     public java.lang.AutoCloseable createInstance() {
         NetvirtProvider provider = new NetvirtProvider(bundleContext, getClusteringEntityOwnershipServiceDependency());
         provider.setConntrackEnabled(getConntrackEnabled());
+        provider.setIntBridgeGenMac(getIntBridgeGenMac());
         BindingAwareBroker localBroker = getBrokerDependency();
         localBroker.registerProvider(provider);
         return provider;
index 20572577205066daf3d1525ec0efeaac77e84f75..6883edce43f3b5baa05d781b6370305d25c13c1e 100644 (file)
@@ -42,6 +42,10 @@ module netvirt-impl {
             leaf conntrack-enabled {
                 type boolean;
             }
+
+            leaf int-bridge-gen-mac {
+                type boolean;
+            }
         }
     }
 }
\ No newline at end of file