ELAN FT Support for BE
[vpnservice.git] / mdsalutil / mdsalutil-api / src / main / java / org / opendaylight / vpnservice / mdsalutil / MDSALUtil.java
index 5ccaa576347f55f0a1952fa9c74d26c75f5fe63d..27afd5c35c72ff6987db65c35aa625dd207fa231 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
@@ -17,6 +17,10 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.LinkedBlockingQueue;
 
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev100924.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PopVlanActionCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.pop.vlan.action._case.PopVlanActionBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder;
@@ -34,9 +38,11 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.M
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.flow.MatchBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCase;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.ApplyActionsCaseBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.GoToTableCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCaseBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActions;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.apply.actions._case.ApplyActionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.go.to.table._case.GoToTableBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadataBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionBuilder;
@@ -62,6 +68,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.N
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
+import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
 import org.opendaylight.yangtools.yang.binding.DataObject;
@@ -72,7 +79,8 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
+import org.opendaylight.controller.liblldp.HexEncode;
 import com.google.common.base.Joiner;
 import com.google.common.base.Optional;
 import com.google.common.primitives.Bytes;
@@ -238,7 +246,7 @@ public class MDSALUtil {
         return EMPTY_Instructions;
     }
 
-    protected static Match buildMatches(List<MatchInfo> listMatchInfo) {
+    public static Match buildMatches(List<MatchInfo> listMatchInfo) {
         if (listMatchInfo != null) {
             MatchBuilder matchBuilder = new MatchBuilder();
             Map<Class<?>, Object> mapMatchBuilder = new HashMap<Class<?>, Object>();
@@ -314,6 +322,12 @@ public class MDSALUtil {
         return getOfPortNumberFromPortName(nodeConnectorId.getValue());
     }
 
+    public static long getDpnIdFromPortName(NodeConnectorId nodeConnectorId) {
+        String ofPortName = nodeConnectorId.getValue();
+        return Long.parseLong(ofPortName.substring(ofPortName.indexOf(":")+1, 
+                ofPortName.lastIndexOf(":")));
+    }
+
     public static long getOfPortNumberFromPortName(String sMdsalPortName) {
         String sPortNumber = sMdsalPortName.substring(sMdsalPortName.lastIndexOf(":") + 1);
         return Long.parseLong(sPortNumber);
@@ -349,6 +363,14 @@ public class MDSALUtil {
                                 .build()).setKey(new InstructionKey(instructionKey)).build();
     }
 
+    public static Instruction buildAndGetGotoTableInstruction(short tableId, int instructionKey) {
+        return new InstructionBuilder()
+            .setInstruction(
+                new GoToTableCaseBuilder().setGoToTable(
+                    new GoToTableBuilder().setTableId(tableId).build()).build())
+            .setKey(new InstructionKey(instructionKey)).build();
+    }
+
     public static <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
                                                           InstanceIdentifier<T> path, DataBroker broker) {
 
@@ -374,7 +396,6 @@ public class MDSALUtil {
         } catch (Exception e) {
             throw new RuntimeException(e);
         }
-
         return result;
     }
 
@@ -418,4 +439,55 @@ public class MDSALUtil {
             throw new RuntimeException(e.getMessage());
         }
     }
+
+    public static byte[] getMacAddressForNodeConnector(DataBroker broker,
+            InstanceIdentifier<NodeConnector> nodeConnectorId)  {
+        Optional<NodeConnector> optNc = MDSALDataStoreUtils.read(broker,
+                LogicalDatastoreType.OPERATIONAL, nodeConnectorId);
+        if(optNc.isPresent()) {
+            NodeConnector nc = optNc.get();
+            FlowCapableNodeConnector fcnc = nc.getAugmentation(FlowCapableNodeConnector.class);
+            MacAddress macAddress = fcnc.getHardwareAddress();
+            return HexEncode.bytesFromHexString(macAddress.getValue());
+        }
+        return null;
+    }
+
+    public static NodeId getNodeIdFromNodeConnectorId(NodeConnectorId ncId) {
+        return new NodeId(ncId.getValue().substring(0,
+                ncId.getValue().lastIndexOf(":")));
+    }
+
+    public static String getInterfaceName(NodeConnectorRef ref, DataBroker dataBroker) {
+        NodeConnectorId nodeConnectorId = getNodeConnectorId(dataBroker, ref);
+        NodeId nodeId = getNodeIdFromNodeConnectorId(nodeConnectorId);
+        InstanceIdentifier<NodeConnector> ncIdentifier = InstanceIdentifier
+                .builder(Nodes.class)
+                .child(Node.class, new NodeKey(nodeId))
+                .child(NodeConnector.class,
+                        new NodeConnectorKey(nodeConnectorId)).build();
+
+        Optional<NodeConnector> nodeConnectorOptional = read(
+                dataBroker,
+                LogicalDatastoreType.OPERATIONAL, ncIdentifier);
+        if (!nodeConnectorOptional.isPresent()) {
+            return null;
+        }
+        NodeConnector nc = nodeConnectorOptional.get();
+        FlowCapableNodeConnector fc = nc
+                .getAugmentation(FlowCapableNodeConnector.class);
+        return fc.getName();
+    }
+
+    public static NodeConnectorId getNodeConnectorId(DataBroker dataBroker,
+            NodeConnectorRef ref) {
+        Optional<NodeConnector> nc = (Optional<NodeConnector>) read(
+                dataBroker,
+                LogicalDatastoreType.OPERATIONAL, ref.getValue());
+        if(nc.isPresent()){
+            return nc.get().getId();
+        }
+        return null;
+    }
+
 }