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;
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;
* @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);
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);
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));
+ }
}