Add support for physical network on flat/vlan provider networks 43/41943/14
authorTali <tali.ben-meir@hpe.com>
Sun, 17 Jul 2016 07:50:40 +0000 (10:50 +0300)
committerTali <tali.ben-meir@hpe.com>
Thu, 28 Jul 2016 19:58:42 +0000 (22:58 +0300)
Change-Id: Ia7383eeb108ae295836f1ae9da091f4a88279beb
Signed-off-by: Tali <tali.ben-meir@hpe.com>
interfacemanager/interfacemanager-api/src/main/java/org/opendaylight/genius/interfacemanager/interfaces/IInterfaceManager.java
interfacemanager/interfacemanager-api/src/main/yang/odl-interface.yang
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/InterfacemgrProvider.java
interfacemanager/interfacemanager-impl/src/main/java/org/opendaylight/genius/interfacemanager/servicebindings/flowbased/utilities/FlowBasedServicesUtils.java
mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/genius/mdsalutil/MetaDataUtil.java

index 9af66e869885271203b492ae05192e8e803b67f3..44186216886b3056f49239cb98ae83275b69cf20 100644 (file)
@@ -46,6 +46,10 @@ public interface IInterfaceManager {
 
     public void createVLANInterface(String interfaceName, String portName, BigInteger dpId,  Integer vlanId,
                              String description, IfL2vlan.L2vlanMode l2vlanMode) throws InterfaceAlreadyExistsException;
+
+    public void createVLANInterface(String interfaceName, String portName, BigInteger dpId,  Integer vlanId,
+            String description, IfL2vlan.L2vlanMode l2vlanMode, boolean isExternal) throws InterfaceAlreadyExistsException;
+
     public void bindService(String interfaceName, BoundServices serviceInfo);
     public void unbindService(String interfaceName, BoundServices serviceInfo);
     List<Interface> getVlanInterfaces();
index e741e27f0a49343ded97b4ece1c859ec37417aec..d2d6cf31b6f25d5f207ffe2b775326269d2295d1 100644 (file)
@@ -295,4 +295,17 @@ module odl-interface {
             }
         }
     }
+
+    /* Port to external network */
+    augment "/if:interfaces/if:interface" {
+        ext:augment-identifier "if-external";
+        when "if:type = 'ianaift:l2vlan'";
+
+        leaf external {
+            type boolean;
+            default "true";
+            description
+              "represents whether port belongs to external network.";
+        }
+    }
 }
index d88823372fed6e1f13b540cdc7505e3a6b759b60..5b4473cdb24a522144b4ee513595c0828dfcf551 100644 (file)
@@ -57,6 +57,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.alivenessmonitor.rev
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfExternal;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfExternalBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlan;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfL2vlanBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.ParentRefs;
@@ -363,6 +365,11 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable
     @Override
     public void createVLANInterface(String interfaceName, String portName, BigInteger dpId, Integer vlanId,
                                     String description, IfL2vlan.L2vlanMode l2vlanMode) throws InterfaceAlreadyExistsException {
+        createVLANInterface(interfaceName, portName, dpId, vlanId, description, l2vlanMode, false);
+    }
+    @Override
+    public void createVLANInterface(String interfaceName, String portName, BigInteger dpId, Integer vlanId,
+                                    String description, IfL2vlan.L2vlanMode l2vlanMode, boolean isExternal) throws InterfaceAlreadyExistsException {
 
         LOG.info("Create VLAN interface : {}", interfaceName);
         InstanceIdentifier<Interface> interfaceInstanceIdentifier = InterfaceManagerCommonUtils.getInterfaceIdentifier(new InterfaceKey(interfaceName));
@@ -372,15 +379,19 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable
             throw new InterfaceAlreadyExistsException(interfaceOptional.getName());
         }
         IfL2vlanBuilder l2vlanBuilder = new IfL2vlanBuilder().setL2vlanMode(l2vlanMode);
-        if (vlanId > 0) {
+        if (vlanId != null && vlanId > 0) {
             l2vlanBuilder.setVlanId(new VlanId(vlanId));
         }
         ParentRefs parentRefs = new ParentRefsBuilder().setParentInterface(portName).build();
-        Interface inf = new InterfaceBuilder().setEnabled(true).setName(interfaceName).setType(L2vlan.class).
+        InterfaceBuilder interfaceBuilder = new InterfaceBuilder().setEnabled(true).setName(interfaceName).setType(L2vlan.class).
                 addAugmentation(IfL2vlan.class, l2vlanBuilder.build()).addAugmentation(ParentRefs.class, parentRefs).
-                setDescription(description).build();
+                setDescription(description);
+        if (isExternal) {
+            interfaceBuilder.addAugmentation(IfExternal.class, new IfExternalBuilder().setExternal(true).build());
+        }
         WriteTransaction t = dataBroker.newWriteOnlyTransaction();
-        t.put(LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier, inf, true);
+        t.put(LogicalDatastoreType.CONFIGURATION, interfaceInstanceIdentifier, interfaceBuilder.build(), true);
+        t.submit();
     }
 
     @Override
index 41ed7e94886772ed1a484565d58bcf7c7d9798b4..75cb03567ae880f6eab718b336b98dbe4a71ab7b 100644 (file)
@@ -49,6 +49,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rev160406.IfExternal;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -161,10 +162,10 @@ public class FlowBasedServicesUtils {
             BigInteger[] metadataValues = IfmUtil.mergeOpenflowMetadataWriteInstructions(instructions);
             short sIndex = boundServiceNew.getServicePriority();
             BigInteger metadata = MetaDataUtil.getMetaDataForLPortDispatcher(lportTag,
-                    ++sIndex, metadataValues[0]);
+                    ++sIndex, metadataValues[0], isExternal(iface));
             BigInteger metadataMask = MetaDataUtil.getMetaDataMaskForLPortDispatcher(
                     MetaDataUtil.METADATA_MASK_SERVICE_INDEX,
-                    MetaDataUtil.METADATA_MASK_LPORT_TAG, metadataValues[1]);
+                    MetaDataUtil.METADATA_MASK_LPORT_TAG_SH_FLAG, metadataValues[1]);
             instructionSet.add(MDSALUtil.buildAndGetWriteMetadaInstruction(metadata, metadataMask,
                     ++serviceInstructionsSize));
         }
@@ -217,7 +218,7 @@ public class FlowBasedServicesUtils {
     }
 
     public static void installLPortDispatcherFlow(BigInteger dpId, BoundServices boundService, String interfaceName,
-                                                  WriteTransaction t, int interfaceTag, short currentServiceIndex, short nextServiceIndex) {
+            WriteTransaction t, int interfaceTag, short currentServiceIndex, short nextServiceIndex) {
         LOG.debug("Installing LPort Dispatcher Flows {}, {}", dpId, interfaceName);
         String serviceRef = boundService.getServiceName();
         List<MatchInfo> matches = FlowBasedServicesUtils.getMatchInfoForDispatcherTable(dpId,
@@ -375,4 +376,12 @@ public class FlowBasedServicesUtils {
 
         t.delete(LogicalDatastoreType.CONFIGURATION, flowInstanceId);
     }
+
+    private static boolean isExternal(Interface iface) {
+        if (iface == null) {
+            return false;
+        }
+        IfExternal ifExternal = iface.getAugmentation(IfExternal.class);
+        return ifExternal != null && Boolean.TRUE.equals(ifExternal.isExternal());
+    }
 }
index 16bc84aa4e3e69b8d10af2cd35c6ac8009bb3d31..f295e88e381108fce4cb60c7bd5bccfe0af6883c 100644 (file)
@@ -10,7 +10,7 @@ package org.opendaylight.genius.mdsalutil;
 import java.math.BigInteger;
 
 public class MetaDataUtil {
-    public static final BigInteger METADATA_MASK_VRFID =         new BigInteger("00000000FFFFFFFF", 16);
+    public static final BigInteger METADATA_MASK_VRFID =         new BigInteger("00000000FFFFFFFE", 16);
     public static final BigInteger METADATA_MASK_LPORT_TAG =     new BigInteger("1FFFFF0000000000", 16);
     public static final BigInteger METADATA_MASK_SERVICE =       new BigInteger("000000FFFF000000", 16);
     public static final BigInteger METADATA_MASK_SERVICE_INDEX = new BigInteger("E000000000000000", 16);
@@ -21,15 +21,22 @@ public class MetaDataUtil {
     public static final BigInteger METADATA_MASK_SERVICE_SH_FLAG = new BigInteger("000000FFFF000001", 16);
     public static final BigInteger METADATA_MASK_LPORT_TAG_SH_FLAG =     new BigInteger("1FFFFF0000000001", 16);
     public static final BigInteger METADATA_MASK_ELAN_SUBNET_ROUTE =    new BigInteger("0000FFFF00000000", 16);
-    public static final BigInteger METADATA_MASK_SUBNET_ROUTE =         new BigInteger("0000FFFFFFFFFFFF", 16);
+    public static final BigInteger METADATA_MASK_SUBNET_ROUTE =         new BigInteger("0000FFFFFFFFFFFE", 16);
 
     public static BigInteger getMetaDataForLPortDispatcher(int lportTag, short serviceIndex) {
         return getServiceIndexMetaData(serviceIndex).or(getLportTagMetaData(lportTag));
     }
 
     public static BigInteger getMetaDataForLPortDispatcher(int lportTag, short serviceIndex,
-                                                           BigInteger serviceMetaData) {
-        return getServiceIndexMetaData(serviceIndex).or(getLportTagMetaData(lportTag)).or(serviceMetaData);
+            BigInteger serviceMetaData) {
+        return getMetaDataForLPortDispatcher(lportTag, serviceIndex, serviceMetaData, false);
+    }
+
+    public static BigInteger getMetaDataForLPortDispatcher(int lportTag, short serviceIndex,
+                                                           BigInteger serviceMetaData, boolean isSHFlagSet) {
+        int shBit = (isSHFlagSet) ? 1 : 0;
+        return getServiceIndexMetaData(serviceIndex).or(getLportTagMetaData(lportTag)).or(serviceMetaData)
+                .or(BigInteger.valueOf(shBit));
     }
 
     public static BigInteger getServiceIndexMetaData(int serviceIndex) {
@@ -79,6 +86,6 @@ public class MetaDataUtil {
         return (metadata.and(METADATA_MASK_VRFID)).longValue();
     }
     public static BigInteger getWriteMetaDataMaskForDispatcherTable() {
-        return new BigInteger("FFFFFFFFFFFFFFFF", 16);
+        return new BigInteger("FFFFFFFFFFFFFFFE", 16);
     }
 }