Merge dev/fluorine work across to master
[unimgr.git] / ovs-driver / src / main / java / org / opendaylight / unimgr / mef / nrp / ovs / activator / OvsActivator.java
index 83f9eeb5518937accc05a5f9c4eaed9c18083f27..31b7699f3b30bd4a0bbff662eef5a8f3b93319eb 100644 (file)
@@ -22,6 +22,7 @@ import org.opendaylight.unimgr.mef.nrp.ovs.transaction.TableTransaction;
 import org.opendaylight.unimgr.mef.nrp.ovs.transaction.TopologyTransaction;
 import org.opendaylight.unimgr.mef.nrp.ovs.util.OpenFlowUtils;
 import org.opendaylight.unimgr.mef.nrp.ovs.util.OvsdbUtils;
+import org.opendaylight.unimgr.mef.nrp.ovs.util.VlanUtils;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
@@ -30,15 +31,16 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
+ * Ovs driver activator.
  * @author marek.ryznar@amartus.com
  */
 public class OvsActivator implements ResourceActivator {
 
-    private final DataBroker dataBroker;
     private static final Logger LOG = LoggerFactory.getLogger(OvsActivator.class);
-
     //TODO introduce poll synced with ovsdb config
-    private static final AtomicInteger queueNumberGenerator = new AtomicInteger(200);
+    private static final AtomicInteger QUEUE_NUMBER_GENERATOR = new AtomicInteger(200);
+
+    private final DataBroker dataBroker;
 
     public OvsActivator(DataBroker dataBroker) {
         this.dataBroker = dataBroker;
@@ -49,17 +51,23 @@ public class OvsActivator implements ResourceActivator {
      * @param endPoints list of endpoint to interconnect
      */
     @Override
-    public void activate(List<EndPoint> endPoints, String serviceName) throws ResourceNotAvailableException, TransactionCommitFailedException {
+    public void activate(List<EndPoint> endPoints, String serviceName)
+            throws ResourceNotAvailableException, TransactionCommitFailedException {
+        OvsActivatorHelper.validateExternalVLANs(endPoints);
+
+        VlanUtils vlanUtils = new VlanUtils(dataBroker, endPoints.iterator().next().getNepRef().getNodeId().getValue());
+
         for (EndPoint endPoint:endPoints) {
-            activateEndpoint(endPoint, serviceName);
+            activateEndpoint(endPoint, serviceName, vlanUtils);
         }
 
     }
 
-
-    private void activateEndpoint(EndPoint endPoint, String serviceName) throws ResourceNotAvailableException, TransactionCommitFailedException {
+    private void activateEndpoint(EndPoint endPoint, String serviceName, VlanUtils vlanUtils)
+            throws ResourceNotAvailableException, TransactionCommitFailedException {
         // Transaction - Get Open vSwitch node and its flow table
-        String portName = OvsActivatorHelper.getPortName(endPoint.getEndpoint().getServiceInterfacePoint().getValue());
+        String portName = OvsActivatorHelper.getPortName(endPoint.getEndpoint().getServiceInterfacePoint()
+                .getServiceInterfacePointId().getValue());
         TopologyTransaction topologyTransaction = new TopologyTransaction(dataBroker);
         Node node = topologyTransaction.readNode(portName);
         Table table = OpenFlowUtils.getTable(node);
@@ -71,43 +79,47 @@ public class OvsActivator implements ResourceActivator {
         if (!OpenFlowUtils.isTablePreconfigured(table)) {
             LOG.debug("Table is not preconfigured. Adding base flows.");
             flowsToWrite.addAll(OpenFlowUtils.getBaseFlows(interswitchLinks));
-            flowsToDelete.addAll(OpenFlowUtils.getExistingFlows(table));
+            flowsToDelete.addAll(OpenFlowUtils.getExistingFlowsWithoutLLDP(table));
         }
 
         OvsActivatorHelper ovsActivatorHelper = new OvsActivatorHelper(topologyTransaction, endPoint);
         String openFlowPortName = ovsActivatorHelper.getOpenFlowPortName();
-        long queueNumber = queueNumberGenerator.getAndIncrement();
-        int internalVlanId = ovsActivatorHelper.getInternalVlanId();
-        flowsToWrite.addAll(OpenFlowUtils.getVlanFlows(openFlowPortName, internalVlanId, interswitchLinks, serviceName, queueNumber));
+        long queueNumber = QUEUE_NUMBER_GENERATOR.getAndIncrement();
+        flowsToWrite.addAll(OpenFlowUtils
+                .getVlanFlows(openFlowPortName, vlanUtils.getVlanID(serviceName),
+                        ovsActivatorHelper.getCeVlanId(),interswitchLinks, serviceName, queueNumber));
 
         // Transaction - Add flows related to service to table and remove unnecessary flows
         TableTransaction tableTransaction = new TableTransaction(dataBroker, node, table);
         tableTransaction.deleteFlows(flowsToDelete, true);
         tableTransaction.writeFlows(flowsToWrite);
 
-               List<String> outputPortNames = interswitchLinks.stream()
-                               .map(link -> ovsActivatorHelper.getTpNameFromOpenFlowPortName(link.getLinkId().getValue()))
-                               .collect(Collectors.toList());
+        List<String> outputPortNames = interswitchLinks.stream()
+                .map(link -> ovsActivatorHelper.getTpNameFromOpenFlowPortName(link.getLinkId().getValue()))
+                .collect(Collectors.toList());
 
-               if(ovsActivatorHelper.isIBwpConfigured()) {
+        if (ovsActivatorHelper.isIBwpConfigured()) {
             //Create egress qos
             OvsdbUtils.createEgressQos(dataBroker, portName, outputPortNames, ovsActivatorHelper.getQosMinRate(),
                     ovsActivatorHelper.getQosMaxRate(), serviceName, queueNumber);
         }
 
-
-
     }
 
-       @Override
-    public void deactivate(List<EndPoint> endPoints, String serviceName) throws TransactionCommitFailedException, ResourceNotAvailableException {
+    @Override
+    public void deactivate(List<EndPoint> endPoints, String serviceName)
+            throws TransactionCommitFailedException, ResourceNotAvailableException {
 
         for (EndPoint endPoint:endPoints) {
-               deactivateEndpoint(endPoint, serviceName);
+            deactivateEndpoint(endPoint, serviceName);
         }
+        new VlanUtils(dataBroker, endPoints.iterator().next()
+                .getNepRef().getNodeId().getValue()).releaseServiceVlan(serviceName);
+
     }
 
-    private void deactivateEndpoint(EndPoint endPoint, String serviceName) throws ResourceNotAvailableException, TransactionCommitFailedException {
+    private void deactivateEndpoint(EndPoint endPoint, String serviceName)
+            throws ResourceNotAvailableException, TransactionCommitFailedException {
 
         // Transaction - Get Open vSwitch node and its flow table
         TopologyTransaction topologyTransaction = new TopologyTransaction(dataBroker);
@@ -122,54 +134,63 @@ public class OvsActivator implements ResourceActivator {
         TableTransaction tableTransaction = new TableTransaction(dataBroker, openFlowNode, table);
         tableTransaction.deleteFlows(flowsToDelete, false);
 
-        String portName = OvsActivatorHelper.getPortName(endPoint.getEndpoint().getServiceInterfacePoint().getValue());
+        String portName = OvsActivatorHelper.getPortName(endPoint
+                .getEndpoint().getServiceInterfacePoint().getServiceInterfacePointId().getValue());
         Node node = topologyTransaction.readNode(portName);
 
         //list with endpoint + all interswitch ports
-       List<String> tpsWithQos = topologyTransaction.readInterswitchLinks(node).stream()
-                               .map(link -> ovsActivatorHelper.getTpNameFromOpenFlowPortName(link.getLinkId().getValue()))
-                               .collect(Collectors.toList());
-       tpsWithQos.add(portName);
+        List<String> tpsWithQos = topologyTransaction.readInterswitchLinks(node).stream()
+                .map(link -> ovsActivatorHelper.getTpNameFromOpenFlowPortName(link.getLinkId().getValue()))
+                .collect(Collectors.toList());
+        tpsWithQos.add(portName);
 
         OvsdbUtils.removeQosEntryFromTerminationPoints(dataBroker, serviceName, tpsWithQos);
     }
 
-       public void update(List<EndPoint> endPoints, String serviceName) throws ResourceNotAvailableException, TransactionCommitFailedException {
+    public void update(List<EndPoint> endPoints, String serviceName)
+            throws ResourceNotAvailableException, TransactionCommitFailedException {
+        OvsActivatorHelper.validateExternalVLANs(endPoints);
         for (EndPoint endPoint:endPoints) {
             updateEndpoint(endPoint, serviceName);
         }
-       }
+    }
 
-       private void updateEndpoint(EndPoint endPoint, String serviceName) throws ResourceNotAvailableException, TransactionCommitFailedException{
+    private void updateEndpoint(EndPoint endPoint, String serviceName)
+            throws ResourceNotAvailableException, TransactionCommitFailedException {
 
-               TopologyTransaction topologyTransaction = new TopologyTransaction(dataBroker);
-           OvsActivatorHelper ovsActivatorHelper = new OvsActivatorHelper(topologyTransaction, endPoint);
+        TopologyTransaction topologyTransaction = new TopologyTransaction(dataBroker);
+        OvsActivatorHelper ovsActivatorHelper = new OvsActivatorHelper(topologyTransaction, endPoint);
 
-               String portName = OvsActivatorHelper.getPortName(endPoint.getEndpoint().getServiceInterfacePoint().getValue());
-               Node node = topologyTransaction.readNode(portName);
+        String portName = OvsActivatorHelper.getPortName(endPoint
+                .getEndpoint().getServiceInterfacePoint().getServiceInterfacePointId().getValue());
+        Node node = topologyTransaction.readNode(portName);
 
-               //list with endpoint + all interswitch ports
-               List<String> interswitchPorts = topologyTransaction.readInterswitchLinks(node).stream()
-                               .map(link -> ovsActivatorHelper.getTpNameFromOpenFlowPortName(link.getLinkId().getValue()))
-                               .collect(Collectors.toList());
+        //list with endpoint + all interswitch ports
+        List<String> interswitchPorts = topologyTransaction.readInterswitchLinks(node).stream()
+                .map(link -> ovsActivatorHelper.getTpNameFromOpenFlowPortName(link.getLinkId().getValue()))
+                .collect(Collectors.toList());
 
-               List<String> tpsWithQos = new LinkedList<>(interswitchPorts);
-               tpsWithQos.add(portName);
+        List<String> tpsWithQos = new LinkedList<>(interswitchPorts);
+        tpsWithQos.add(portName);
 
-               //remove old egress qos
-               OvsdbUtils.removeQosEntryFromTerminationPoints(dataBroker, serviceName, tpsWithQos);
+        //remove old egress qos
+        OvsdbUtils.removeQosEntryFromTerminationPoints(dataBroker, serviceName, tpsWithQos);
 
 
-               long queueNumber = queueNumberGenerator.getAndIncrement();
-        //Create egress qos
-               OvsdbUtils.createEgressQos(dataBroker, portName, interswitchPorts, ovsActivatorHelper.getQosMinRate(),
-                               ovsActivatorHelper.getQosMaxRate(), serviceName, queueNumber);
+        long queueNumber = QUEUE_NUMBER_GENERATOR.getAndIncrement();
+        if (ovsActivatorHelper.isIBwpConfigured()) {
+                //Create egress qos
+            OvsdbUtils.createEgressQos(dataBroker, portName, interswitchPorts, ovsActivatorHelper.getQosMinRate(),
+                ovsActivatorHelper.getQosMaxRate(), serviceName, queueNumber);
+        }
 
-               //modify flow with new queue number
-                Table table = OpenFlowUtils.getTable(node);
+        //modify flow with new queue number
+        Table table = OpenFlowUtils.getTable(node);
         TableTransaction tableTransaction = new TableTransaction(dataBroker, node, table);
-               tableTransaction.writeFlow(OpenFlowUtils.createVlanIngressFlow(ovsActivatorHelper.getOpenFlowPortName(), ovsActivatorHelper.getInternalVlanId(),
-                               serviceName, topologyTransaction.readInterswitchLinks(node), queueNumber));
-       }
+        tableTransaction.writeFlow(OpenFlowUtils.createVlanIngressFlow(ovsActivatorHelper.getOpenFlowPortName(),
+                new VlanUtils(dataBroker, endPoint.getNepRef().getNodeId().getValue())
+                        .getVlanID(serviceName) , ovsActivatorHelper.getCeVlanId(),
+                serviceName, topologyTransaction.readInterswitchLinks(node), queueNumber));
+    }
 
 }