From 485583fa27099ac706dffeae850dd0f6b48714ca Mon Sep 17 00:00:00 2001 From: epgoraj Date: Thu, 28 Jan 2016 17:47:50 +0530 Subject: [PATCH] BUG:5128 Elan Multi-DPN datapath fix Change-Id: I5f3e2d333634df3a7ba974fffd3698e9e0ebcc49 Signed-off-by: epgoraj (cherry picked from commit ba3654d25ea72fc3d83a847243468dc95cdeb145) --- .../ElanForwardingEntriesHandler.java | 16 +- .../elan/internal/ElanInterfaceManager.java | 314 +++++++++++------- .../elan/internal/ElanServiceProvider.java | 27 +- .../internal/ElanSmacFlowEventListener.java | 6 +- .../vpnservice/elan/utils/ElanUtils.java | 227 +++++++++---- .../impl/rev150216/ElanServiceImplModule.java | 3 +- .../src/main/yang/odl-interface-rpc.yang | 15 + .../vpnservice/interfacemgr/IfmUtil.java | 76 ++++- .../interfacemgr/InterfacemgrProvider.java | 4 +- .../InterfaceManagerRpcService.java | 23 +- .../itm/rpc/ItmManagerRpcService.java | 81 +++-- .../vpnservice/mdsalutil/ActionInfo.java | 14 +- .../vpnservice/mdsalutil/MDSALUtil.java | 29 +- .../interfaces/IMdsalApiManager.java | 5 + .../mdsalutil/internal/MDSALManager.java | 26 ++ .../mdsalutil/internal/MDSALUtilProvider.java | 11 + 16 files changed, 597 insertions(+), 280 deletions(-) diff --git a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanForwardingEntriesHandler.java b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanForwardingEntriesHandler.java index 4acb68d1..42af1436 100644 --- a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanForwardingEntriesHandler.java +++ b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanForwardingEntriesHandler.java @@ -32,24 +32,14 @@ import org.slf4j.LoggerFactory; public class ElanForwardingEntriesHandler extends AbstractDataChangeListener implements AutoCloseable { - private DataBroker broker; - private ListenerRegistration listenerRegistration; - - private IMdsalApiManager mdsalManager; - - private IITMProvider itmManager; private static final Logger logger = LoggerFactory.getLogger(ElanForwardingEntriesHandler.class); + private DataBroker broker; + private ListenerRegistration listenerRegistration; - - public ElanForwardingEntriesHandler(DataBroker db, IMdsalApiManager mdsalManager){ + public ElanForwardingEntriesHandler(DataBroker db){ super(ElanInterface.class); this.broker = db; - this.mdsalManager = mdsalManager; - } - - public void setIITMManager(IITMProvider itmManager) { - this.itmManager = itmManager; } private InstanceIdentifier getWildCardPath() { diff --git a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceManager.java b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceManager.java index 329eed0e..c939d525 100644 --- a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceManager.java +++ b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanInterfaceManager.java @@ -8,7 +8,6 @@ package org.opendaylight.vpnservice.elan.internal; import com.google.common.base.Optional; -import com.google.common.collect.Lists; import com.google.common.collect.Maps; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.md.sal.binding.api.DataChangeListener; @@ -19,8 +18,12 @@ import org.opendaylight.vpnservice.elan.utils.ElanUtils; import org.opendaylight.vpnservice.interfacemgr.globals.InterfaceInfo; import org.opendaylight.vpnservice.interfacemgr.globals.InterfaceInfo.InterfaceType; import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager; -import org.opendaylight.vpnservice.itm.api.IITMProvider; +import org.opendaylight.vpnservice.itm.globals.ITMConstants; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.servicebinding.rev151015.service.bindings.services.info.BoundServices; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; import org.opendaylight.vpnservice.mdsalutil.*; @@ -49,8 +52,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.f import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.forwarding.entries.MacEntryBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.forwarding.entries.MacEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetEgressActionsForInterfaceInputBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetEgressActionsForInterfaceOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.OdlInterfaceRpcService; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -73,7 +74,7 @@ public class ElanInterfaceManager extends AbstractDataChangeListener> unProcessedElanInterfaces = new ConcurrentHashMap> (); @@ -108,10 +109,6 @@ public class ElanInterfaceManager extends AbstractDataChangeListener elanInterfaces = elanState.getElanInterfaces(); elanInterfaces.remove(interfaceName); - removeStaticELanFlows(elanInfo, interfaceInfo); + if(elanInterfaces.isEmpty()) { ElanUtils.delete(broker, LogicalDatastoreType.OPERATIONAL, ElanUtils.getElanInstanceOperationalDataPath(elanName)); ElanUtils.delete(broker, LogicalDatastoreType.OPERATIONAL, ElanUtils.getElanDpnOperationDataPath(elanName)); @@ -421,8 +418,9 @@ public class ElanInterfaceManager extends AbstractDataChangeListener getRemoteBCGroupBucketInfos(ElanInstance elanInfo, - InterfaceInfo interfaceInfo) { + private List getRemoteBCGroupBucketInfos(ElanInstance elanInfo, + int bucketKeyStart, InterfaceInfo interfaceInfo) { BigInteger dpnId = interfaceInfo.getDpId(); int elanTag = elanInfo.getElanTag().intValue(); - List listBucketInfo = new ArrayList(); + int bucketId = bucketKeyStart; + List listBuckets = new ArrayList(); ElanDpnInterfacesList elanDpns = ElanUtils.getElanDpnInterfacesList(elanInfo.getElanInstanceName()); if(elanDpns != null) { List dpnInterfaceses = elanDpns.getDpnInterfaces(); for(DpnInterfaces dpnInterface : dpnInterfaceses) { if(ElanUtils.isDpnPresent(dpnInterface.getDpId()) && dpnInterface.getDpId() != dpnId && dpnInterface.getInterfaces() != null && !dpnInterface.getInterfaces().isEmpty()) { try { - //FIXME [ELANBE] Removing ITM API for now, will need this for multi dpn. - //List listActionInfo = itmManager.ITMIngressGetActions(dpnId, dpnInterface.getDpId(), (int) elanTag); - //listBucketInfo.add(new BucketInfo(listActionInfo)); + List listAction = ElanUtils.getItmEgressAction(dpnId, dpnInterface.getDpId(), (int) elanTag); + listBuckets.add(MDSALUtil.buildBucket(listAction, MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); + bucketId++; } catch (Exception ex) { logger.error( "Logical Group Interface not found between source Dpn - {}, destination Dpn - {} " ,dpnId, dpnInterface.getDpId() ); } } } } - List listActionInfo = new ArrayList(); - listActionInfo.add(new ActionInfo(ActionType.group, new String[] {String.valueOf(ElanUtils.getElanLocalBCGID(elanInfo.getElanTag()))})); - listBucketInfo.add(new BucketInfo(listActionInfo)); - return listBucketInfo; + return listBuckets; } - public ActionInfo getTunnelIdActionInfo(int interfaceTag) { - return new ActionInfo(ActionType.set_field_tunnel_id, new BigInteger[]{BigInteger.valueOf(interfaceTag)}); + private List getRemoteBCGroupBuckets(ElanInstance elanInfo, + InterfaceInfo interfaceInfo, int bucketId) { + BigInteger dpnId = interfaceInfo.getDpId(); + int elanTag = elanInfo.getElanTag().intValue(); + List listBucketInfo = new ArrayList(); + ElanDpnInterfacesList elanDpns = ElanUtils.getElanDpnInterfacesList(elanInfo.getElanInstanceName()); + if(elanDpns != null) { + List dpnInterfaceses = elanDpns.getDpnInterfaces(); + for(DpnInterfaces dpnInterface : dpnInterfaceses) { + if(ElanUtils.isDpnPresent(dpnInterface.getDpId()) && dpnInterface.getDpId() != dpnId && dpnInterface.getInterfaces() != null && !dpnInterface.getInterfaces().isEmpty()) { + try { + List listActionInfo = ElanUtils.getItmEgressAction(dpnId, dpnInterface.getDpId(), (int) elanTag); + listBucketInfo.add(MDSALUtil.buildBucket(listActionInfo, 0, bucketId, 0xffffffffL, 0xffffffffL)); + bucketId++; + } catch (Exception ex) { + logger.error( "Logical Group Interface not found between source Dpn - {}, destination Dpn - {} " ,dpnId, dpnInterface.getDpId() ); + } + } + } + } + return listBucketInfo; } - private void setRemoteBCGrouponOtherDpns(ElanInstance elanInfo, - InterfaceInfo interfaceInfo) { + private void setElanBCGrouponOtherDpns(ElanInstance elanInfo, + InterfaceInfo interfaceInfo) { BigInteger dpnId = interfaceInfo.getDpId(); int elanTag = elanInfo.getElanTag().intValue(); long groupId = ElanUtils.getElanRemoteBCGID(elanTag); + List listBucket = new ArrayList(); + int bucketId = 0; ElanDpnInterfacesList elanDpns = ElanUtils.getElanDpnInterfacesList(elanInfo.getElanInstanceName()); if(elanDpns != null) { List dpnInterfaceses = elanDpns.getDpnInterfaces(); for(DpnInterfaces dpnInterface : dpnInterfaceses) { - List remoteListBucketInfo = new ArrayList(); + List remoteListBucketInfo = new ArrayList(); if(ElanUtils.isDpnPresent(dpnInterface.getDpId()) && !dpnInterface.getDpId().equals(dpnId) && dpnInterface.getInterfaces() != null && !dpnInterface.getInterfaces().isEmpty()) { + for(String ifName : dpnInterface.getInterfaces()) { + // In case if there is a InterfacePort in the cache which is not in + // operational state, skip processing it + InterfaceInfo ifInfo = interfaceManager.getInterfaceInfoFromOperationalDataStore(ifName, interfaceInfo.getInterfaceType()); + if (!isOperational(ifInfo)) { + continue; + } + + listBucket.add(MDSALUtil.buildBucket(getInterfacePortActions(ifInfo), MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); + bucketId++; + } + remoteListBucketInfo.addAll(listBucket); for(DpnInterfaces otherFes : dpnInterfaceses) { if (ElanUtils.isDpnPresent(otherFes.getDpId()) && otherFes.getDpId() != dpnInterface.getDpId() && otherFes.getInterfaces() != null && ! otherFes.getInterfaces().isEmpty()) { try { - //FIXME [ELANBE] Removing ITM API for now, will need this for multi dpn. - //List remoteListActionInfo = itmManager.ITMIngressGetActions(dpnInterface.getDpId(), otherFes.getDpId(), (int) elanTag); - //remoteListBucketInfo.add(new BucketInfo(remoteListActionInfo)); + List remoteListActionInfo = ElanUtils.getItmEgressAction(dpnInterface.getDpId(), otherFes.getDpId(), (int) elanTag); + remoteListBucketInfo.add(MDSALUtil.buildBucket(remoteListActionInfo, MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT,MDSALUtil.WATCH_GROUP)); + bucketId++; } catch (Exception ex) { logger.error( "Logical Group Interface not found between source Dpn - {}, destination Dpn - {} " ,dpnInterface.getDpId(), otherFes.getDpId() ); return; } } } - List remoteListActionInfo = new ArrayList(); - remoteListActionInfo.add(new ActionInfo(ActionType.group, new String[] {String.valueOf(ElanUtils.getElanLocalBCGID(elanTag))})); - remoteListBucketInfo.add(new BucketInfo(remoteListActionInfo)); - GroupEntity groupEntity = MDSALUtil.buildGroupEntity(dpnInterface.getDpId(), groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, remoteListBucketInfo); - mdsalManager.installGroup(groupEntity); + if(remoteListBucketInfo.size() == 0) { + logger.debug( "No ITM is present on Dpn - {} " ,dpnInterface.getDpId()); + continue; + } + Group group = MDSALUtil.buildGroup(groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, MDSALUtil.buildBucketLists(remoteListBucketInfo)); + mdsalManager.syncInstallGroup(dpnInterface.getDpId(), group, ElanConstants.DELAY_TIME_IN_MILLISECOND); } } } @@ -521,21 +564,22 @@ public class ElanInterfaceManager extends AbstractDataChangeListener elanDpns = ElanUtils.getInvolvedDpnsInElan(elanInfo.getElanInstanceName()); if(elanDpns != null) { for(DpnInterfaces dpnInterface : elanDpns) { - List remoteListBucketInfo = new ArrayList(); + int bucketId = 0; + List remoteListBucket = new ArrayList(); if(ElanUtils.isDpnPresent(dstDpId) && dpnInterface.getDpId().equals(dstDpId) && dpnInterface.getInterfaces() != null && !dpnInterface.getInterfaces().isEmpty()) { try { - //FIXME [ELANBE] Removing ITM API for now, will need this for multi dpn. - //List remoteListActionInfo = itmManager.ITMIngressGetActions(interfaceInfo.getDpId(), dstDpId, (int) elanTag); - //remoteListBucketInfo.add(new BucketInfo(remoteListActionInfo)); + List remoteListActionInfo = ElanUtils.getItmEgressAction(interfaceInfo.getDpId(), dstDpId, (int) elanTag); + remoteListBucket.add(MDSALUtil.buildBucket(remoteListActionInfo, MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); + bucketId++; } catch (Exception ex) { logger.error( "Logical Group Interface not found between source Dpn - {}, destination Dpn - {} " ,dpnInterface.getDpId(), dstDpId); return; } - List remoteListActionInfo = new ArrayList(); - remoteListActionInfo.add(new ActionInfo(ActionType.group, new String[] {String.valueOf(ElanUtils.getElanLocalBCGID(elanTag))})); - remoteListBucketInfo.add(new BucketInfo(remoteListActionInfo)); - GroupEntity groupEntity = MDSALUtil.buildGroupEntity(interfaceInfo.getDpId(), groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, remoteListBucketInfo); - mdsalManager.installGroup(groupEntity); + List remoteListActionInfo = new ArrayList(); + remoteListActionInfo.add(new ActionInfo(ActionType.group, new String[] {String.valueOf(ElanUtils.getElanLocalBCGID(elanTag))}).buildAction()); + remoteListBucket.add(MDSALUtil.buildBucket(remoteListActionInfo, MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); + Group group = MDSALUtil.buildGroup(groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, MDSALUtil.buildBucketLists(remoteListBucket)); + mdsalManager.syncInstallGroup(interfaceInfo.getDpId(), group, ElanConstants.DELAY_TIME_IN_MILLISECOND); break; } } @@ -546,8 +590,8 @@ public class ElanInterfaceManager extends AbstractDataChangeListener getLocalBCGroupBucketInfo(InterfaceInfo interfaceInfo) { - return Lists.newArrayList(new BucketInfo(getInterfacePortActionInfos(interfaceInfo))); + private Bucket getLocalBCGroupBucketInfo(InterfaceInfo interfaceInfo, int bucketIdStart) { + return MDSALUtil.buildBucket(getInterfacePortActions(interfaceInfo), MDSALUtil.GROUP_WEIGHT, bucketIdStart, MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP); } private List getMatchesForElanTag(Long elanTag) { @@ -559,12 +603,12 @@ public class ElanInterfaceManager extends AbstractDataChangeListener getInstructionsForOutGroup( + private List getInstructionsForOutGroup( long groupId) { - List mkInstructions = new ArrayList(); - List actionsInfos = new ArrayList (); - actionsInfos.add(new ActionInfo(ActionType.group, new String[]{Long.toString(groupId)})); - mkInstructions.add(new InstructionInfo(InstructionType.write_actions, actionsInfos)); + List mkInstructions = new ArrayList(); + List actions = new ArrayList (); + actions.add(new ActionInfo(ActionType.group, new String[]{Long.toString(groupId)}).buildAction()); + mkInstructions.add(ElanUtils.getWriteActionInstruction(actions)); return mkInstructions; } @@ -632,8 +676,35 @@ public class ElanInterfaceManager extends AbstractDataChangeListener listBucket = new ArrayList(); + int bucketId = 0; + BigInteger dpnId = interfaceInfo.getDpId(); + long groupId = ElanUtils.getElanRemoteBCGID(elanInfo.getElanTag()); + + DpnInterfaces dpnInterfaces = ElanUtils.getElanInterfaceInfoByElanDpn(elanInfo.getElanInstanceName(), dpnId); + for(String ifName : dpnInterfaces.getInterfaces()) { + // In case if there is a InterfacePort in the cache which is not in + // operational state, skip processing it + InterfaceInfo ifInfo = interfaceManager.getInterfaceInfoFromOperationalDataStore(ifName, interfaceInfo.getInterfaceType()); + if (!isOperational(ifInfo)) { + continue; + } + + listBucket.add(MDSALUtil.buildBucket(getInterfacePortActions(ifInfo), MDSALUtil.GROUP_WEIGHT, bucketId, MDSALUtil.WATCH_PORT, MDSALUtil.WATCH_GROUP)); + bucketId++; + } + List listBucketInfoRemote = getRemoteBCGroupBuckets(elanInfo, interfaceInfo, bucketId); + listBucket.addAll(listBucketInfoRemote); + + Group group = MDSALUtil.buildGroup(groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, MDSALUtil.buildBucketLists(listBucket)); + logger.trace("installing the localBroadCast Group:{}", group); + mdsalManager.syncInstallGroup(dpnId, group, ElanConstants.DELAY_TIME_IN_MILLISECOND); + } + public void setupLocalBroadcastGroups(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { - List listBucketInfo = new ArrayList(); + List listBucket = new ArrayList(); + int bucketId = 0; BigInteger dpnId = interfaceInfo.getDpId(); long groupId = ElanUtils.getElanLocalBCGID(elanInfo.getElanTag()); @@ -646,48 +717,56 @@ public class ElanInterfaceManager extends AbstractDataChangeListener listBuckets = new ArrayList<>(); + int bucketId = 0; + listBuckets.add(getLocalBCGroupBucketInfo(interfaceInfo, bucketId)); + //listBuckets.addAll(getRemoteBCGroupBucketInfos(elanInfo, 1, interfaceInfo)); + Group group = MDSALUtil.buildGroup(groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, MDSALUtil.buildBucketLists(listBuckets)); + logger.trace("deleted the localBroadCast Group:{}", group); + mdsalManager.syncRemoveGroup(dpnId, group); } - public void removeRemoteBroadcastGroup(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { - List listBucketInfo = getRemoteBCGroupBucketInfos(elanInfo, interfaceInfo); + public void removeElanBroadcastGroup(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { + int bucketId = 0; + List listBuckets = new ArrayList<>(); + listBuckets.add(getLocalBCGroupBucketInfo(interfaceInfo, bucketId)); + bucketId++; + listBuckets.addAll(getRemoteBCGroupBucketInfos(elanInfo, bucketId, interfaceInfo)); BigInteger dpnId = interfaceInfo.getDpId(); long groupId = ElanUtils.getElanRemoteBCGID(elanInfo.getElanTag()); - GroupEntity groupEntity = MDSALUtil.buildGroupEntity(dpnId, groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, listBucketInfo); - logger.trace("deleting the remoteBroadCast GroupEntity:{}", groupEntity); - mdsalManager.syncRemoveGroup(groupEntity); + Group group = MDSALUtil.buildGroup(groupId, elanInfo.getElanInstanceName(), GroupTypes.GroupAll, MDSALUtil.buildBucketLists(listBuckets)); + logger.trace("deleting the remoteBroadCast group:{}", group); + mdsalManager.syncRemoveGroup(dpnId, group); } public void setupTerminateServiceTable(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { long elanTag = elanInfo.getElanTag(); - //FIXME [ELANBE] Removing ITM API for now, will need this for multi dpn. -// FlowEntity flowEntity = MDSALUtil.buildFlowEntity(interfaceInfo.getDpId(), ITMConstants.TERMINATING_SERVICE_TABLE, getFlowRef(ITMConstants.TERMINATING_SERVICE_TABLE, elanTag), -// 5, elanInfo.getElanInstanceName(), 0, 0, ITMConstants.COOKIE_ITM.add(BigInteger.valueOf(elanTag)), itmManager.getTunnelMatchesForServiceId(elanTag), -// getInstructionsForOutGroup(ElanUtils.getElanLocalBCGID(elanTag))); -// -// mdsalManager.installFlow(flowEntity); + Flow flowEntity = MDSALUtil.buildFlowNew(ITMConstants.TERMINATING_SERVICE_TABLE, getFlowRef(ITMConstants.TERMINATING_SERVICE_TABLE, elanTag), + 5, String.format("%s:%d","ITM Flow Entry ",elanTag), 0, 0, ITMConstants.COOKIE_ITM.add(BigInteger.valueOf(elanTag)), ElanUtils.getTunnelMatchesForServiceId((int)elanTag), + getInstructionsForOutGroup(ElanUtils.getElanRemoteBCGID(elanTag))); + + mdsalManager.installFlow(interfaceInfo.getDpId(), flowEntity); } public void setupUnknownDMacTable(ElanInstance elanInfo, InterfaceInfo interfaceInfo) { long elanTag = elanInfo.getElanTag(); - FlowEntity flowEntity = MDSALUtil.buildFlowEntity(interfaceInfo.getDpId(), ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, getFlowRef(ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, elanTag), + Flow flowEntity = MDSALUtil.buildFlowNew(ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, getFlowRef(ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, elanTag), 5, elanInfo.getElanInstanceName(), 0, 0, ElanConstants.COOKIE_ELAN_UNKNOWN_DMAC.add(BigInteger.valueOf(elanTag)), getMatchesForElanTag(elanTag), - getInstructionsForOutGroup(ElanUtils.getElanLocalBCGID(elanTag))); + getInstructionsForOutGroup(ElanUtils.getElanRemoteBCGID(elanTag))); - mdsalManager.installFlow(flowEntity); + mdsalManager.installFlow(interfaceInfo.getDpId(), flowEntity); } private void removeStaticELanFlows(final ElanInstance elanInfo, final InterfaceInfo interfaceInfo) { @@ -707,21 +786,22 @@ public class ElanInterfaceManager extends AbstractDataChangeListener mkMatches = new ArrayList(); // Matching metadata @@ -761,38 +841,35 @@ public class ElanInterfaceManager extends AbstractDataChangeListener mkInstructions = new ArrayList(); - List actionsInfos = new ArrayList (); - actionsInfos.add(new ActionInfo(ActionType.group, new String[]{Long.toString(ElanUtils.getElanRemoteBCGID(elanTag))})); - mkInstructions.add(new InstructionInfo(InstructionType.write_actions, actionsInfos)); + List mkInstructions = new ArrayList(); + List actionsInfos = new ArrayList (); + actionsInfos.add(new ActionInfo(ActionType.group, new String[]{Long.toString(ElanUtils.getElanRemoteBCGID(elanTag))}, 0).buildAction()); + mkInstructions.add(ElanUtils.getWriteActionInstruction(actionsInfos)); - FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpId, ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, getFlowRef(ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, elanTag), + Flow flow = MDSALUtil.buildFlowNew(ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, getFlowRef(ElanConstants.ELAN_UNKNOWN_DMAC_TABLE, elanTag), 5, elanInfo.getElanInstanceName(), 0, 0, ElanConstants.COOKIE_ELAN_UNKNOWN_DMAC.add(BigInteger.valueOf(elanTag)), mkMatches, mkInstructions); - return flowEntity; + return flow; } private String getFlowRef(long tableId, long elanTag) { return new StringBuffer().append(tableId).append(elanTag).toString(); } - private List getInterfacePortActionInfos(InterfaceInfo interfaceInfo) { - List listActionInfo = new ArrayList(); - listActionInfo.add(getTunnelIdActionInfo(interfaceInfo.getInterfaceTag())); - listActionInfo.add(new ActionInfo(ActionType.nx_resubmit, new String[]{})); - return listActionInfo; + private List getInterfacePortActions(InterfaceInfo interfaceInfo) { + List listAction = new ArrayList(); + int actionKey = 0; + listAction.add((new ActionInfo(ActionType.set_field_tunnel_id, new BigInteger[] {BigInteger.valueOf(interfaceInfo.getInterfaceTag())}, actionKey)).buildAction()); + actionKey++; + listAction.add((new ActionInfo(ActionType.nx_resubmit, new BigInteger[] {BigInteger.valueOf(55)}, actionKey)).buildAction()); + return listAction; } private void updateElanDpnInterfacesList(String elanInstanceName, BigInteger dpId, List interfaceNames) { - if(!interfaceNames.isEmpty()) { - DpnInterfaces dpnInterface = new DpnInterfacesBuilder().setDpId(dpId) - .setInterfaces(interfaceNames).setKey(new DpnInterfacesKey(dpId)).build(); - MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, ElanUtils.getElanDpnInterfaceOperationalDataPath(elanInstanceName, dpId), - dpnInterface); - } else { - MDSALUtil.syncDelete(broker, LogicalDatastoreType.OPERATIONAL, ElanUtils.getElanDpnInterfaceOperationalDataPath(elanInstanceName, dpId)); - } - + DpnInterfaces dpnInterface = new DpnInterfacesBuilder().setDpId(dpId) + .setInterfaces(interfaceNames).setKey(new DpnInterfacesKey(dpId)).build(); + MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, ElanUtils.getElanDpnInterfaceOperationalDataPath(elanInstanceName, dpId), + dpnInterface); } private List createElanInterfacesList(String elanInstanceName, String interfaceName, BigInteger dpId) { @@ -977,22 +1054,11 @@ public class ElanInterfaceManager extends AbstractDataChangeListener getInstructionsInPortForOutGroup( - String ifName) { - List mkInstructions = new ArrayList(); - List actionsInfos = new ArrayList (); - actionsInfos.addAll(ElanUtils.getEgressActionsForInterface(ifName)); - mkInstructions.add(new InstructionInfo(InstructionType.apply_actions, actionsInfos)); - return mkInstructions; - } - - - - private List getInstructionsDrop() { - List mkInstructions = new ArrayList(); - List actionsInfos = new ArrayList (); - actionsInfos.add(new ActionInfo(ActionType.drop_action, new String[]{})); - mkInstructions.add(new InstructionInfo(InstructionType.write_actions, actionsInfos)); + private List getInstructionsDrop() { + List mkInstructions = new ArrayList(); + List actionsInfos = new ArrayList (); + actionsInfos.add(new ActionInfo(ActionType.drop_action, new String[]{}).buildAction()); + mkInstructions.add(ElanUtils.getWriteActionInstruction(actionsInfos)); return mkInstructions; } diff --git a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanServiceProvider.java b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanServiceProvider.java index 9b8eb446..200e645d 100644 --- a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanServiceProvider.java +++ b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanServiceProvider.java @@ -40,6 +40,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.OdlInterfaceRpcService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.ItmRpcService; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.elanmanager.exceptions.MacNotFoundException; @@ -72,7 +73,16 @@ public class ElanServiceProvider implements BindingAwareProvider, IElanService, //private ElanInterfaceEventListener elanInterfaceEventListener; private ElanItmEventListener elanItmEventListener; - private IITMProvider itmManager; + + public void setItmRpcService(ItmRpcService itmRpcService) { + this.itmRpcService = itmRpcService; + } + + public ItmRpcService getItmRpcService() { + return itmRpcService; + } + + private ItmRpcService itmRpcService; private DataBroker broker; private static final Logger logger = LoggerFactory.getLogger(ElanServiceProvider.class); @@ -82,15 +92,13 @@ public class ElanServiceProvider implements BindingAwareProvider, IElanService, createIdPool(); broker = session.getSALService(DataBroker.class); - elanForwardingEntriesHandler = new ElanForwardingEntriesHandler(broker, mdsalManager); - elanForwardingEntriesHandler.setIITMManager(itmManager); + elanForwardingEntriesHandler = new ElanForwardingEntriesHandler(broker); elanInterfaceManager = ElanInterfaceManager.getElanInterfaceManager(); elanInterfaceManager.setInterfaceManager(interfaceManager); elanInterfaceManager.setIdManager(idManager); elanInterfaceManager.setMdSalApiManager(mdsalManager); elanInterfaceManager.setDataBroker(broker); - elanInterfaceManager.setIITMManager(itmManager); elanInterfaceManager.registerListener(); elanInterfaceManager.setInterfaceManagerRpcService(interfaceManagerRpcService); elanInterfaceManager.setElanForwardingEntriesHandler(elanForwardingEntriesHandler); @@ -110,7 +118,6 @@ public class ElanServiceProvider implements BindingAwareProvider, IElanService, elanSmacFlowEventListener = new ElanSmacFlowEventListener(broker); elanSmacFlowEventListener.setMdSalApiManager(mdsalManager); elanSmacFlowEventListener.setInterfaceManager(interfaceManager); - elanSmacFlowEventListener.setIITMManager(itmManager); elanSmacFlowEventListener.setSalFlowService(session.getRpcService(SalFlowService.class)); notificationService.registerNotificationListener(elanSmacFlowEventListener); @@ -137,11 +144,7 @@ public class ElanServiceProvider implements BindingAwareProvider, IElanService, return mdsalManager; } - public IITMProvider getItmManager() { - return itmManager; - } - - public DataBroker getBroker() { + public DataBroker getBroker() { return broker; } @@ -157,10 +160,6 @@ public class ElanServiceProvider implements BindingAwareProvider, IElanService, return interfaceManagerRpcService; } - public void setItmManager(IITMProvider itmManager) { - this.itmManager = itmManager; - } - private void createIdPool() { CreateIdPoolInput createPool = new CreateIdPoolInputBuilder() .setPoolName(ElanConstants.ELAN_ID_POOL_NAME).setLow(ElanConstants.ELAN_ID_LOW_VALUE).setHigh(ElanConstants.ELAN_ID_HIGH_VALUE) diff --git a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanSmacFlowEventListener.java b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanSmacFlowEventListener.java index e2cb47b6..9ea543e3 100644 --- a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanSmacFlowEventListener.java +++ b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/internal/ElanSmacFlowEventListener.java @@ -32,7 +32,6 @@ public class ElanSmacFlowEventListener implements SalFlowListener { private final DataBroker broker; private IMdsalApiManager mdsalManager; private IInterfaceManager interfaceManager; - private IITMProvider itmManager; private static final Logger logger = LoggerFactory.getLogger(ElanSmacFlowEventListener.class); public ElanSmacFlowEventListener(DataBroker dataBroker) { @@ -52,16 +51,13 @@ public class ElanSmacFlowEventListener implements SalFlowListener { } - public void setIITMManager(IITMProvider itmManager) { - this.itmManager = itmManager; - } public void setMdSalApiManager(IMdsalApiManager mdsalManager) { this.mdsalManager = mdsalManager; } @Override public void onFlowAdded(FlowAdded arg0) { // TODO Auto-generated method stub - + } @Override diff --git a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/utils/ElanUtils.java b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/utils/ElanUtils.java index 823da3e1..96ad2c80 100644 --- a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/utils/ElanUtils.java +++ b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/vpnservice/elan/utils/ElanUtils.java @@ -19,7 +19,7 @@ import com.google.common.util.concurrent.CheckedFuture; import org.opendaylight.vpnservice.elan.internal.ElanServiceProvider; import org.opendaylight.vpnservice.interfacemgr.globals.InterfaceInfo; import org.opendaylight.vpnservice.interfacemgr.globals.InterfaceServiceUtil; -import org.opendaylight.vpnservice.itm.api.IITMProvider; +import org.opendaylight.vpnservice.itm.globals.ITMConstants; import org.opendaylight.vpnservice.mdsalutil.*; import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; @@ -27,12 +27,24 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types. import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.OutputActionCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.PushVlanActionCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCase; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.SetFieldCaseBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.action.set.field._case.SetFieldBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.ActionKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; +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.WriteActionsCaseBuilder; +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.write.actions._case.WriteActionsBuilder; 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; +import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.InstructionKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; 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.NodeKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.model.match.types.rev131026.match.TunnelBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.*; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.elan._interface.forwarding.entries.ElanInterfaceMac; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.elan._interface.forwarding.entries.ElanInterfaceMacKey; @@ -57,8 +69,21 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.e import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.forwarding.entries.MacEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.elan.rev150602.forwarding.entries.MacEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.*; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetEgressActionsForInterfaceInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetEgressActionsForInterfaceInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetEgressActionsForInterfaceOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetEgressActionsInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetEgressActionsInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.GetEgressActionsOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.OdlInterfaceRpcService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.CreateTerminatingServiceActionsInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.CreateTerminatingServiceActionsInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.GetTunnelInterfaceNameInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.GetTunnelInterfaceNameInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.GetTunnelInterfaceNameOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.ItmRpcService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.RemoveTerminatingServiceActionsInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.RemoveTerminatingServiceActionsInputBuilder; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.common.RpcResult; @@ -387,11 +412,11 @@ public class ElanUtils { String macAddress) { IMdsalApiManager mdsalApiManager = elanServiceProvider.getMdsalManager(); DataBroker broker = elanServiceProvider.getBroker(); - IITMProvider itmManager = elanServiceProvider.getItmManager(); + ItmRpcService itmRpcService = elanServiceProvider.getItmRpcService(); synchronized (macAddress) { logger.info("Acquired lock for mac : " + macAddress + "Proceeding with install operation."); setupKnownSmacFlow(elanInfo, interfaceInfo, macTimeout, macAddress, mdsalApiManager); - setupTermDmacFlows(interfaceInfo, itmManager); + setupTermDmacFlows(interfaceInfo, mdsalApiManager); setupOrigDmacFlows(elanInfo, interfaceInfo, macAddress, mdsalApiManager, broker); } } @@ -436,22 +461,52 @@ public class ElanUtils { return flowEntity; } - private static void setupTermDmacFlows(InterfaceInfo interfaceInfo, IITMProvider itmManager) { + private static void setupTermDmacFlows(InterfaceInfo interfaceInfo, IMdsalApiManager mdsalApiManager) { BigInteger dpId = interfaceInfo.getDpId(); - long lportGroupId = interfaceInfo.getGroupId(); int lportTag = interfaceInfo.getInterfaceTag(); - List actionsInfos = new ArrayList (); - actionsInfos = getEgressActionsForInterface(interfaceInfo.getInterfaceName()); - - //FIXME [ELANBE] ITM Service API to invoke Terminating Service - //itmManager.createTerminatingServiceActions(dpId, lportTag, actionsInfos); + Flow flow = MDSALUtil.buildFlowNew(NwConstants.INTERNAL_TUNNEL_TABLE, getFlowRef(NwConstants.INTERNAL_TUNNEL_TABLE,lportTag), 5, String.format("%s:%d","ITM Flow Entry ",lportTag), 0, 0, ITMConstants.COOKIE_ITM.add(BigInteger.valueOf(lportTag)), getTunnelIdMatchForFilterEqualsLPortTag(lportTag), + getInstructionsInPortForOutGroup(interfaceInfo.getInterfaceName())); + mdsalApiManager.installFlow(dpId, flow); if (logger.isDebugEnabled()) { logger.debug("Terminating service table flow entry created on dpn:{} for logical Interface port:{}", dpId, interfaceInfo.getPortName()); } } - public static List getEgressActionsForInterface(String ifName) { - List listActionInfo = new ArrayList(); + private static String getFlowRef(short tableId, int elanTag) { + return new StringBuffer().append(tableId).append(elanTag).toString(); + } + + private static List getTunnelIdMatchForFilterEqualsLPortTag(int LportTag) { + List mkMatches = new ArrayList(); + // Matching metadata + mkMatches.add(new MatchInfo(MatchFieldType.tunnel_id, new BigInteger[] { + BigInteger.valueOf(LportTag)})); + return mkMatches; + + + } + + public static List getInstructionsInPortForOutGroup( + String ifName) { + List mkInstructions = new ArrayList(); + List actionsInfos = new ArrayList (); + actionsInfos.addAll(ElanUtils.getEgressActionsForInterface(ifName)); + mkInstructions.add(new InstructionBuilder().setInstruction(new ApplyActionsCaseBuilder().setApplyActions(new ApplyActionsBuilder().setAction(actionsInfos).build()).build()) + .setKey(new InstructionKey(0)).build()); + return mkInstructions; + } + + public static Instruction getWriteActionInstruction(List actions) { + return new InstructionBuilder().setInstruction(new WriteActionsCaseBuilder().setWriteActions(new WriteActionsBuilder().setAction(actions).build()).build()).setKey(new InstructionKey(0)).build(); + } + + public static Instruction getApplyActionInstruction(List actions) { + return new InstructionBuilder().setInstruction(new ApplyActionsCaseBuilder().setApplyActions(new ApplyActionsBuilder().setAction(actions).build()).build()).setKey(new InstructionKey(0)).build(); + } + + + public static List getEgressActionsForInterface(String ifName) { + List listAction = new ArrayList(); try { Future> result = elanServiceProvider.getInterfaceManagerRpcService().getEgressActionsForInterface( @@ -462,27 +517,12 @@ public class ElanUtils { } else { List actions = rpcResult.getResult().getAction(); - for (Action action : actions) { - org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.Action actionClass = action.getAction(); - if (actionClass instanceof OutputActionCase) { - listActionInfo.add(new ActionInfo(ActionType.output, - new String[] {((OutputActionCase)actionClass).getOutputAction() - .getOutputNodeConnector().getValue()})); - } else if (actionClass instanceof PushVlanActionCase) { - listActionInfo.add(new ActionInfo(ActionType.push_vlan, new String[] {})); - } else if (actionClass instanceof SetFieldCase) { - if (((SetFieldCase)actionClass).getSetField().getVlanMatch() != null) { - int vlanVid = ((SetFieldCase)actionClass).getSetField().getVlanMatch().getVlanId().getVlanId().getValue(); - listActionInfo.add(new ActionInfo(ActionType.set_field_vlan_vid, - new String[] { Long.toString(vlanVid) })); - } - } - } + listAction = actions; } } catch (InterruptedException | ExecutionException e) { logger.warn("Exception when egress actions for interface {}", ifName, e); } - return listActionInfo; + return listAction; } private static void setupOrigDmacFlows(ElanInstance elanInfo, InterfaceInfo interfaceInfo, String macAddress, @@ -541,8 +581,8 @@ public class ElanUtils { private static void setupLocalDmacFlow(long elanTag, BigInteger dpId, String ifName, String macAddress, String displayName, IMdsalApiManager mdsalApiManager, long ifTag) { - FlowEntity flowEntity = getLocalDmacFlowEntry(elanTag, dpId, ifName, macAddress, displayName, ifTag); - mdsalApiManager.installFlow(flowEntity); + Flow flowEntity = getLocalDmacFlowEntry(elanTag, dpId, ifName, macAddress, displayName, ifTag); + mdsalApiManager.installFlow(dpId, flowEntity); } @@ -554,7 +594,7 @@ public class ElanUtils { return new StringBuffer().append(tableId).append(elanTag).append(dpId).append(remoteDpId).append(macAddress).toString(); } - public static FlowEntity getLocalDmacFlowEntry(long elanTag, BigInteger dpId, String ifName, String macAddress, + public static Flow getLocalDmacFlowEntry(long elanTag, BigInteger dpId, String ifName, String macAddress, String displayName, long ifTag) { List mkMatches = new ArrayList(); mkMatches.add(new MatchInfo(MatchFieldType.metadata, new BigInteger[] { @@ -562,49 +602,51 @@ public class ElanUtils { MetaDataUtil.METADATA_MASK_SERVICE })); mkMatches.add(new MatchInfo(MatchFieldType.eth_dst, new String[] { macAddress })); - List mkInstructions = new ArrayList(); - List actionsInfos = new ArrayList (); + List mkInstructions = new ArrayList(); + List actionsInfos = new ArrayList (); actionsInfos.addAll(getEgressActionsForInterface(ifName)); - mkInstructions.add(new InstructionInfo(InstructionType.write_actions, actionsInfos)); + mkInstructions.add(new InstructionBuilder().setInstruction(new ApplyActionsCaseBuilder().setApplyActions(new ApplyActionsBuilder().setAction(actionsInfos).build()).build()) + .setKey(new InstructionKey(0)).build()); + Flow flow = MDSALUtil.buildFlowNew(ElanConstants.ELAN_DMAC_TABLE, getKnownDynamicmacFlowRef(ElanConstants.ELAN_DMAC_TABLE, dpId, ifTag, macAddress, elanTag), + 20, displayName, 0, 0, ElanConstants.COOKIE_ELAN_KNOWN_DMAC.add(BigInteger.valueOf(elanTag)), mkMatches, mkInstructions); - FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpId, ElanConstants.ELAN_DMAC_TABLE, - getKnownDynamicmacFlowRef(ElanConstants.ELAN_DMAC_TABLE, dpId, ifTag, macAddress, elanTag), - 20, displayName, 0, 0, ElanConstants.COOKIE_ELAN_KNOWN_DMAC.add(BigInteger.valueOf(elanTag)), - mkMatches, mkInstructions); - return flowEntity; + return flow; } public static void setupRemoteDmacFlow(BigInteger srcDpId, BigInteger destDpId, int lportTag, long elanTag, String macAddress, String displayName) { IMdsalApiManager mdsalApiManager = elanServiceProvider.getMdsalManager(); - FlowEntity flowEntity = getRemoteDmacFlowEntry(srcDpId, destDpId, lportTag, elanTag, macAddress, displayName); - mdsalApiManager.installFlow(flowEntity); + Flow flowEntity = getRemoteDmacFlowEntry(srcDpId, destDpId, lportTag, elanTag, macAddress, displayName); + mdsalApiManager.installFlow(srcDpId, flowEntity); } - public static FlowEntity getRemoteDmacFlowEntry(BigInteger srcDpId, BigInteger destDpId, int lportTag, long elanTag, - String macAddress, String displayName) { - IITMProvider itmManager = elanServiceProvider.getItmManager(); + public static Flow getRemoteDmacFlowEntry(BigInteger srcDpId, BigInteger destDpId, int lportTag, long elanTag, + String macAddress, String displayName) { + ItmRpcService itmRpcService = elanServiceProvider.getItmRpcService(); List mkMatches = new ArrayList(); mkMatches.add(new MatchInfo(MatchFieldType.metadata, new BigInteger[]{ ElanUtils.getElanMetadataLabel(elanTag), MetaDataUtil.METADATA_MASK_SERVICE })); mkMatches.add(new MatchInfo(MatchFieldType.eth_dst, new String[] { macAddress })); - List mkInstructions = new ArrayList(); + List mkInstructions = new ArrayList(); + //List of ActionInfo for the provided Source and Destination DPIDs try { - //FIXME [ELANBE] Removing ITM API for now, will need this for multi dpn. - //List actionsInfos = itmManager.ITMIngressGetActions(srcDpId, destDpId, lportTag); - //mkInstructions.add(new InstructionInfo(InstructionType.write_actions, actionsInfos)); + List actionsInfos = getItmEgressAction(srcDpId, destDpId, lportTag); + Instruction instruction = new InstructionBuilder().setInstruction(new ApplyActionsCaseBuilder().setApplyActions(new ApplyActionsBuilder().setAction(actionsInfos).build()).build()) + .setKey(new InstructionKey(0)).build(); + mkInstructions.add(instruction); } catch (Exception e) { logger.error("Interface Not Found exception"); } - FlowEntity flowEntity = MDSALUtil.buildFlowEntity(srcDpId, ElanConstants.ELAN_DMAC_TABLE, - getKnownDynamicmacFlowRef(ElanConstants.ELAN_DMAC_TABLE, srcDpId, destDpId, macAddress, elanTag), - 20, displayName, 0, 0, ElanConstants.COOKIE_ELAN_KNOWN_DMAC.add(BigInteger.valueOf(elanTag)), - mkMatches, mkInstructions); - return flowEntity; + + Flow flow = MDSALUtil.buildFlowNew(ElanConstants.ELAN_DMAC_TABLE, getKnownDynamicmacFlowRef(ElanConstants.ELAN_DMAC_TABLE, srcDpId, destDpId, macAddress, elanTag), 20 + , displayName, 0, 0, ElanConstants.COOKIE_ELAN_KNOWN_DMAC.add(BigInteger.valueOf(elanTag)), mkMatches, mkInstructions); + + return flow; + } public static void deleteMacFlows(ElanInstance elanInfo, InterfaceInfo interfaceInfo, MacEntry macEntry) { @@ -624,7 +666,7 @@ public class ElanUtils { long ifTag = interfaceInfo.getInterfaceTag(); List remoteFEs = getInvolvedDpnsInElan(elanInstanceName); IMdsalApiManager mdsalApiManager = elanServiceProvider.getMdsalManager(); - IITMProvider itmManager = elanServiceProvider.getItmManager(); + ItmRpcService itmRpcService = elanServiceProvider.getItmRpcService(); BigInteger srcdpId = interfaceInfo.getDpId(); String displayName = elanInstanceName; long groupId = interfaceInfo.getGroupId(); @@ -634,15 +676,14 @@ public class ElanUtils { if(deleteSmac) { mdsalApiManager.removeFlow(getKnownSmacFlowEntity(elanInfo, interfaceInfo, 0, macAddress)); } - mdsalApiManager.removeFlow(getLocalDmacFlowEntry(elanTag, dpnInterface.getDpId(), ifName, macAddress, displayName, ifTag)); - - //FIXME [ELANBE] Removing ITM API for now, will need this for multi dpn. - //itmManager.removeTerminatingServiceAction(dpnInterface.getDpId(), interfaceInfo.getInterfaceTag()); + mdsalApiManager.removeFlow(dpnInterface.getDpId(), getLocalDmacFlowEntry(elanTag, dpnInterface.getDpId(), ifName, macAddress, displayName, ifTag)); + RemoveTerminatingServiceActionsInput removeTerminatingServiceActionsInput = new RemoveTerminatingServiceActionsInputBuilder().setServiceId(interfaceInfo.getInterfaceTag()).setDpnId(dpnInterface.getDpId()).build(); + itmRpcService.removeTerminatingServiceActions(removeTerminatingServiceActionsInput); if (logger.isDebugEnabled()) { logger.debug("All the required flows deleted for elan:{}, logical Interface port:{} and mac address:{} on dpn:{}", elanInstanceName, interfaceInfo.getPortName(), macAddress, dpnInterface.getDpId()); } } else if (isDpnPresent(dpnInterface.getDpId())) { - mdsalApiManager.removeFlow( + mdsalApiManager.removeFlow(dpnInterface.getDpId(), getRemoteDmacFlowEntry(dpnInterface.getDpId(), srcdpId, interfaceInfo.getInterfaceTag(), elanTag, macAddress, displayName)); if (logger.isDebugEnabled()) { @@ -728,4 +769,70 @@ public class ElanUtils { .child(BoundServices.class, new BoundServicesKey(serviceIndex)).build(); } + + public static List getItmEgressAction(BigInteger sourceDpnId, + BigInteger destinationDpnId, int serviceTag) { + ItmRpcService itmManager = elanServiceProvider.getItmRpcService(); + OdlInterfaceRpcService interfaceManagerRpcService = elanServiceProvider.getInterfaceManagerRpcService(); + logger.debug("In getItmIngress Action source {}, destination {}, elanTag {}", sourceDpnId, destinationDpnId, serviceTag); + List actions = new ArrayList<>(); + String tunnelInterfaceName; + GetTunnelInterfaceNameInput input = new GetTunnelInterfaceNameInputBuilder().setDestinationDpid(destinationDpnId).setSourceDpid(sourceDpnId).build(); + Future> output = itmManager.getTunnelInterfaceName(input); + try { + GetTunnelInterfaceNameOutput tunnelInterfaceNameOutput = output.get().getResult(); + tunnelInterfaceName = tunnelInterfaceNameOutput.getInterfaceName(); + logger.debug("Received tunnelInterfaceName from getTunnelInterfaceName RPC {}", tunnelInterfaceName); + } catch (InterruptedException | ExecutionException e) { + logger.error("Error in RPC call getTunnelInterfaceName {}", e); + return actions; + } + if (tunnelInterfaceName != null && !tunnelInterfaceName.isEmpty()) { + GetEgressActionsInput getEgressActionsForInterfaceInput = new GetEgressActionsInputBuilder().setServiceTag(Long.valueOf(serviceTag)).setIntfName(tunnelInterfaceName).build(); + Future> egressActionsOutputFuture = interfaceManagerRpcService.getEgressActions(getEgressActionsForInterfaceInput); + try { + GetEgressActionsOutput egressActionsOutput = egressActionsOutputFuture.get().getResult(); + List outputAction = egressActionsOutput.getAction(); + return outputAction; + } catch (InterruptedException | ExecutionException e) { + logger.error("Error in RPC call getEgressActionsForInterface {}", e); + return actions; + } + } + return actions; + } + + public static List getTunnelMatchesForServiceId(int elanTag) { + List mkMatches = new ArrayList(); + // Matching metadata + mkMatches.add(new MatchInfo(MatchFieldType.tunnel_id, new BigInteger[]{ + BigInteger.valueOf(elanTag)})); + + return mkMatches; + } + + public static void removeTerminatingServiceAction(BigInteger destDpId, int serviceId) { + ItmRpcService itmRpcService = elanServiceProvider.getItmRpcService(); + RemoveTerminatingServiceActionsInput input = new RemoveTerminatingServiceActionsInputBuilder().setDpnId(destDpId).setServiceId(serviceId).build(); + Future> futureObject = itmRpcService.removeTerminatingServiceActions(input); + try { + RpcResult result = futureObject.get(); + if (result.isSuccessful()) { + logger.debug("Successfully completed removeTerminatingServiceActions"); + } else { + logger.debug("Failure in removeTerminatingServiceAction RPC call"); + } + } catch (InterruptedException | ExecutionException e) { + logger.error("Error in RPC call removeTerminatingServiceActions {}", e); + } + } + + public static void createTerminatingServiceActions(BigInteger destDpId, int serviceId, List actions) { + ItmRpcService itmRpcService = elanServiceProvider.getItmRpcService(); + List mkInstructions = new ArrayList(); + mkInstructions.add(getApplyActionInstruction(actions)); + CreateTerminatingServiceActionsInput input = new CreateTerminatingServiceActionsInputBuilder().setDpnId(destDpId).setServiceId(serviceId).setInstruction(mkInstructions).build(); + + itmRpcService.createTerminatingServiceActions(input); + } } diff --git a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/elanservice/impl/rev150216/ElanServiceImplModule.java b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/elanservice/impl/rev150216/ElanServiceImplModule.java index ed10b25a..4df938c9 100644 --- a/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/elanservice/impl/rev150216/ElanServiceImplModule.java +++ b/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/elanservice/impl/rev150216/ElanServiceImplModule.java @@ -4,6 +4,7 @@ import org.opendaylight.vpnservice.elan.internal.ElanServiceProvider; import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rpcs.rev151003.OdlInterfaceRpcService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.itm.rpcs.rev151217.ItmRpcService; public class ElanServiceImplModule extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.elanservice.impl.rev150216.AbstractElanServiceImplModule { public ElanServiceImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { @@ -28,7 +29,7 @@ public class ElanServiceImplModule extends org.opendaylight.yang.gen.v1.urn.open provider.setMdsalManager(getMdsalutilDependency()); provider.setInterfaceManager(getOdlinterfaceDependency()); provider.setInterfaceManagerRpcService(rpcregistryDependency.getRpcService(OdlInterfaceRpcService.class)); - provider.setItmManager(getItmmanagerDependency()); + provider.setItmRpcService(rpcregistryDependency.getRpcService(ItmRpcService.class)); provider.setIdManager(idManager); getBrokerDependency().registerProvider(provider); return provider; diff --git a/interfacemgr/interfacemgr-api/src/main/yang/odl-interface-rpc.yang b/interfacemgr/interfacemgr-api/src/main/yang/odl-interface-rpc.yang index 66e79efa..281caff8 100644 --- a/interfacemgr/interfacemgr-api/src/main/yang/odl-interface-rpc.yang +++ b/interfacemgr/interfacemgr-api/src/main/yang/odl-interface-rpc.yang @@ -73,6 +73,21 @@ module odl-interface-rpc { } } + rpc get-egress-actions { + description "used to retrieve group actions to use from interface name"; + input { + leaf intf-name { + type string; + } + leaf service-tag { + type uint32; + } + } + output { + uses action:action-list; + } + } + rpc get-egress-instructions-for-interface { description "used to retrieve flow instructions to use from interface name"; input { diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmUtil.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmUtil.java index c1f2cb95..531f25b1 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmUtil.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/IfmUtil.java @@ -22,24 +22,24 @@ import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceManagerCommonUt import org.opendaylight.vpnservice.interfacemgr.globals.InterfaceInfo; import org.opendaylight.vpnservice.interfacemgr.globals.VlanInterfaceInfo; import org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.utilities.FlowBasedServicesUtils; -import org.opendaylight.vpnservice.mdsalutil.MDSALUtil; +import org.opendaylight.vpnservice.mdsalutil.ActionInfo; +import org.opendaylight.vpnservice.mdsalutil.ActionType; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.Tunnel; +import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.Interfaces; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; +import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.WriteMetadataCase; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.instruction.write.metadata._case.WriteMetadata; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeBase; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeGre; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.overlay.rev150105.TunnelTypeVxlan; import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.DatapathId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.*; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.monitor.profile.create.input.ProfileBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.AllocateIdInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.AllocateIdInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.AllocateIdOutput; @@ -49,14 +49,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.ReleaseIdInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.id.pools.IdPool; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.id.pools.IdPoolKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.InterfaceMonitorIdMap; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.MonitorIdInterfaceMap; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.monitor.id.map.InterfaceMonitorId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.monitor.id.map.InterfaceMonitorIdBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007._interface.monitor.id.map.InterfaceMonitorIdKey; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.monitor.id._interface.map.MonitorIdInterface; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.monitor.id._interface.map.MonitorIdInterfaceBuilder; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.monitor.id._interface.map.MonitorIdInterfaceKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL2vlan.L2vlanMode; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL2vlan; @@ -172,6 +164,66 @@ public class IfmUtil { return result; } + public static List getEgressActions(String interfaceName, long serviceTag, DataBroker dataBroker) { + List listActionInfo = new ArrayList<>(); + List interfaceActionList = IfmUtil.getEgressActionInfosForInterface(interfaceName, serviceTag, dataBroker); + listActionInfo.addAll(interfaceActionList); + List actionsList = new ArrayList<>(); + for (ActionInfo actionInfo : listActionInfo) { + actionsList.add(actionInfo.buildAction()); + } + return actionsList; + } + + public static List getEgressActionsForInterface(String interfaceName, DataBroker dataBroker) { + List listActionInfo = getEgressActionInfosForInterface(interfaceName, 0, dataBroker); + List actionsList = new ArrayList<>(); + for (ActionInfo actionInfo : listActionInfo) { + actionsList.add(actionInfo.buildAction()); + } + return actionsList; + } + + public static List getEgressActionInfosForInterface(String interfaceName, int actionKeyStart, DataBroker dataBroker) { + Interface interfaceInfo = InterfaceManagerCommonUtils.getInterfaceFromConfigDS(new InterfaceKey(interfaceName), + dataBroker); + List listActionInfo = new ArrayList(); + org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface ifState = + InterfaceManagerCommonUtils.getInterfaceStateFromOperDS(interfaceName, dataBroker); + + String lowerLayerIf = ifState.getLowerLayerIf().get(0); + NodeConnectorId nodeConnectorId = new NodeConnectorId(lowerLayerIf); + String portNo = IfmUtil.getPortNoFromNodeConnectorId(nodeConnectorId); + Class ifType = interfaceInfo.getType(); + if(L2vlan.class.equals(ifType)){ + IfL2vlan vlanIface = interfaceInfo.getAugmentation(IfL2vlan.class); + LOG.trace("L2Vlan: {}",vlanIface); + long vlanVid = (vlanIface == null) ? 0 : vlanIface.getVlanId().getValue(); + if (vlanVid != 0) { + listActionInfo.add(new ActionInfo(ActionType.push_vlan, new String[] {}, actionKeyStart)); + actionKeyStart++; + listActionInfo.add(new ActionInfo(ActionType.set_field_vlan_vid, + new String[] { Long.toString(vlanVid) }, actionKeyStart)); + actionKeyStart++; + } + listActionInfo.add(new ActionInfo(ActionType.output, new String[] {portNo}, actionKeyStart)); + }else if(Tunnel.class.equals(ifType)){ + listActionInfo.add(new ActionInfo(ActionType.output, new String[] { portNo}, actionKeyStart)); + } + return listActionInfo; + } + + public static List getEgressActionInfosForInterface(String interfaceName, long serviceTag, DataBroker dataBroker) { + int actionKey = 0; + ActionInfo actionSetTunnel = new ActionInfo(ActionType.set_field_tunnel_id, new BigInteger[] { + BigInteger.valueOf(serviceTag)}, actionKey) ; + List listActionInfo = new ArrayList(); + listActionInfo.add(actionSetTunnel); + actionKey++; + listActionInfo.addAll(getEgressActionInfosForInterface(interfaceName, actionKey, dataBroker)); + return listActionInfo; + } + public static NodeId getNodeIdFromNodeConnectorId(NodeConnectorId ncId) { return new NodeId(ncId.getValue().substring(0,ncId.getValue().lastIndexOf(":"))); } diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java index e77ccead..fb597cc7 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/InterfacemgrProvider.java @@ -13,7 +13,6 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import org.opendaylight.controller.md.sal.binding.api.DataBroker; -import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService; import org.opendaylight.controller.md.sal.binding.api.NotificationService; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker; @@ -38,7 +37,6 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces. import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface.OperStatus; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeConnectorId; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.alivenessmonitor.rev150629.AlivenessMonitorListener; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInput; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.CreateIdPoolInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; @@ -304,7 +302,7 @@ public class InterfacemgrProvider implements BindingAwareProvider, AutoCloseable @Override public List getInterfaceEgressActions(String ifName) { - return interfaceManagerRpcService.getEgressActionInfosForInterface(ifName); + return IfmUtil.getEgressActionInfosForInterface(ifName, 0, dataBroker); } @Override diff --git a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/rpcservice/InterfaceManagerRpcService.java b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/rpcservice/InterfaceManagerRpcService.java index c29c7ac4..a4ce8b8c 100644 --- a/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/rpcservice/InterfaceManagerRpcService.java +++ b/interfacemgr/interfacemgr-impl/src/main/java/org/opendaylight/vpnservice/interfacemgr/rpcservice/InterfaceManagerRpcService.java @@ -20,12 +20,12 @@ import org.opendaylight.vpnservice.interfacemgr.IfmConstants; import org.opendaylight.vpnservice.interfacemgr.IfmUtil; import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceManagerCommonUtils; import org.opendaylight.vpnservice.interfacemgr.commons.InterfaceMetaUtils; -import org.opendaylight.vpnservice.interfacemgr.servicebindings.flowbased.utilities.FlowBasedServicesUtils; import org.opendaylight.vpnservice.mdsalutil.*; import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.L2vlan; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.Tunnel; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfaceType; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL2vlan; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface; import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.action.types.rev131112.action.list.Action; @@ -38,7 +38,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.met import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntry; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.BridgeEntryKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.meta.rev151007.bridge._interface.info.bridge.entry.BridgeInterfaceEntry; -import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfL2vlan; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.IfTunnel; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.ParentRefs; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.interfacemgr.rev150331.TunnelTypeBase; @@ -206,7 +205,7 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService { RpcResultBuilder rpcResultBuilder; try { List instructionInfo = new ArrayList(); - List actionInfo = getEgressActionInfosForInterface(input.getIntfName()); + List actionInfo = IfmUtil.getEgressActionInfosForInterface(input.getIntfName(), 0, dataBroker); instructionInfo.add(new InstructionInfo(InstructionType.write_actions, actionInfo)); GetEgressInstructionsForInterfaceOutputBuilder output = new GetEgressInstructionsForInterfaceOutputBuilder(). setInstruction(buildInstructions(instructionInfo)); @@ -266,7 +265,7 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService { public Future> getEgressActionsForInterface(GetEgressActionsForInterfaceInput input) { RpcResultBuilder rpcResultBuilder; try { - List actionsList = getEgressActionsForInterface(input.getIntfName()); + List actionsList = IfmUtil.getEgressActionsForInterface(input.getIntfName(), dataBroker); GetEgressActionsForInterfaceOutputBuilder output = new GetEgressActionsForInterfaceOutputBuilder(). setAction(actionsList); rpcResultBuilder = RpcResultBuilder.success(); @@ -278,6 +277,22 @@ public class InterfaceManagerRpcService implements OdlInterfaceRpcService { return Futures.immediateFuture(rpcResultBuilder.build()); } + @Override + public Future> getEgressActions(GetEgressActionsInput input) { + RpcResultBuilder rpcResultBuilder; + try { + List actionsList = IfmUtil.getEgressActions(input.getIntfName(), input.getServiceTag(), dataBroker); + GetEgressActionsOutputBuilder output = new GetEgressActionsOutputBuilder(). + setAction(actionsList); + rpcResultBuilder = RpcResultBuilder.success(); + rpcResultBuilder.withResult(output.build()); + }catch(Exception e){ + LOG.error("Retrieval of egress actions for the key {} failed due to {}" ,input.getIntfName(), e); + rpcResultBuilder = RpcResultBuilder.failed(); + } + return Futures.immediateFuture(rpcResultBuilder.build()); + } + @Override public Future> getPortFromInterface(GetPortFromInterfaceInput input) { RpcResultBuilder rpcResultBuilder; diff --git a/itm/itm-impl/src/main/java/org/opendaylight/vpnservice/itm/rpc/ItmManagerRpcService.java b/itm/itm-impl/src/main/java/org/opendaylight/vpnservice/itm/rpc/ItmManagerRpcService.java index 36ad7a41..34d306c7 100644 --- a/itm/itm-impl/src/main/java/org/opendaylight/vpnservice/itm/rpc/ItmManagerRpcService.java +++ b/itm/itm-impl/src/main/java/org/opendaylight/vpnservice/itm/rpc/ItmManagerRpcService.java @@ -249,7 +249,7 @@ public class ItmManagerRpcService implements ItmRpcService { getFlowRef(NwConstants.INTERNAL_TUNNEL_TABLE,input.getServiceId()), 5, String.format("%s:%d","ITM Flow Entry ",input.getServiceId()), 0, 0, ITMConstants.COOKIE_ITM.add(BigInteger.valueOf(input.getServiceId())),getTunnelMatchesForServiceId(input.getServiceId()), null ); - ListenableFuture installFlowResult = mdsalManager.installFlow(input.getDpnId(), terminatingServiceTableFlow); + ListenableFuture installFlowResult = mdsalManager.removeFlow(input.getDpnId(), terminatingServiceTableFlow); Futures.addCallback(installFlowResult, new FutureCallback(){ @Override @@ -284,8 +284,7 @@ public class ItmManagerRpcService implements ItmRpcService { // Matching metadata mkMatches.add(new MatchInfo(MatchFieldType.tunnel_id, new BigInteger[]{ - new BigInteger(1, vxLANHeader), - MetaDataUtil.METADA_MASK_VALID_TUNNEL_ID_BIT_AND_TUNNEL_ID})); + BigInteger.valueOf(serviceId)})); return mkMatches; } @@ -297,47 +296,45 @@ public class ItmManagerRpcService implements ItmRpcService { @Override public Future> getInternalOrExternalInterfaceName( GetInternalOrExternalInterfaceNameInput input) { - RpcResultBuilder resultBld = RpcResultBuilder.failed(); + RpcResultBuilder resultBld = null; BigInteger srcDpn = input.getSourceDpid() ; IpAddress dstIp = input.getDestinationIp() ; - InstanceIdentifier path1 = InstanceIdentifier.create( - ExternalTunnelList.class) - .child(ExternalTunnel.class, new ExternalTunnelKey(dstIp, srcDpn)); - - Optional ext = ItmUtils.read(LogicalDatastoreType.CONFIGURATION, path1, dataBroker); - - if( ext != null && ext.isPresent()) - { - ExternalTunnel extTunnel = ext.get(); - GetInternalOrExternalInterfaceNameOutputBuilder output = new GetInternalOrExternalInterfaceNameOutputBuilder().setInterfaceName(extTunnel.getTunnelInterfaceName() ); - resultBld = RpcResultBuilder.success(); - resultBld.withResult(output.build()) ; - } else { - List meshedDpnList = ItmUtils.getTunnelMeshInfo(dataBroker); - // Look for external tunnels if not look for internal tunnel - for (DPNTEPsInfo teps : meshedDpnList) { - TunnelEndPoints firstEndPt = teps.getTunnelEndPoints().get(0); - if (dstIp.equals(firstEndPt.getIpAddress())) { - InstanceIdentifier path = InstanceIdentifier.create( - TunnelList.class) - .child(InternalTunnel.class, new InternalTunnelKey(srcDpn, teps.getDPNID())); - - Optional - tnl = - ItmUtils.read(LogicalDatastoreType.CONFIGURATION, path, dataBroker); - if (tnl != null && tnl.isPresent()) { - InternalTunnel tunnel = tnl.get(); - GetInternalOrExternalInterfaceNameOutputBuilder - output = - new GetInternalOrExternalInterfaceNameOutputBuilder() - .setInterfaceName(tunnel.getTunnelInterfaceName()); - resultBld = RpcResultBuilder.success(); - resultBld.withResult(output.build()); - break; - } - } - } - } + List meshedDpnList = ItmUtils.getTunnelMeshInfo(dataBroker) ; + // Look for external tunnels if not look for internal tunnel + for( DPNTEPsInfo teps : meshedDpnList) { + TunnelEndPoints firstEndPt = teps.getTunnelEndPoints().get(0) ; + if( dstIp.equals(firstEndPt.getIpAddress())) { + InstanceIdentifier path = InstanceIdentifier.create( + TunnelList.class) + .child(InternalTunnel.class, new InternalTunnelKey(srcDpn, teps.getDPNID())); + + Optional tnl = ItmUtils.read(LogicalDatastoreType.CONFIGURATION, path, dataBroker); + if( tnl != null && tnl.isPresent()) + { + InternalTunnel tunnel = tnl.get(); + GetInternalOrExternalInterfaceNameOutputBuilder output = new GetInternalOrExternalInterfaceNameOutputBuilder().setInterfaceName(tunnel.getTunnelInterfaceName() ); + resultBld = RpcResultBuilder.success(); + resultBld.withResult(output.build()) ; + }else { + //resultBld = RpcResultBuilder.failed(); + InstanceIdentifier path1 = InstanceIdentifier.create( + ExternalTunnelList.class) + .child(ExternalTunnel.class, new ExternalTunnelKey(dstIp, srcDpn)); + + Optional ext = ItmUtils.read(LogicalDatastoreType.CONFIGURATION, path1, dataBroker); + + if( ext != null && ext.isPresent()) + { + ExternalTunnel extTunnel = ext.get(); + GetInternalOrExternalInterfaceNameOutputBuilder output = new GetInternalOrExternalInterfaceNameOutputBuilder().setInterfaceName(extTunnel.getTunnelInterfaceName() ); + resultBld = RpcResultBuilder.success(); + resultBld.withResult(output.build()) ; + }else { + resultBld = RpcResultBuilder.failed(); + } + } + } + } return Futures.immediateFuture(resultBld.build()); } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/ActionInfo.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/ActionInfo.java index 084c5653..704d6c20 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/ActionInfo.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/ActionInfo.java @@ -32,7 +32,13 @@ public class ActionInfo implements Serializable{ m_actionType = actionType; m_actionKey = 0; m_asActionValues = asActionValues; - } + } + + public ActionInfo(ActionType actionType, String[] asActionValues, int actionKey) { + m_actionType = actionType; + m_actionKey = actionKey; + m_asActionValues = asActionValues; + } public ActionInfo(ActionType actionType, BigInteger[] aBigIntValues) { m_actionType = actionType; @@ -40,6 +46,12 @@ public class ActionInfo implements Serializable{ m_aBigIntValues = aBigIntValues; } + public ActionInfo(ActionType actionType, BigInteger[] aBigIntValues, int actionKey) { + m_actionType = actionType; + m_actionKey = actionKey; + m_aBigIntValues = aBigIntValues; + } + public void setActionKey(int key) { m_actionKey = key; } diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/MDSALUtil.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/MDSALUtil.java index 7d72f3a8..f31a9675 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/MDSALUtil.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/MDSALUtil.java @@ -54,6 +54,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.BucketsBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.Bucket; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.buckets.BucketKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey; @@ -90,6 +91,9 @@ import com.google.common.util.concurrent.CheckedFuture; public class MDSALUtil { public static final String NODE_PREFIX = "openflow"; + public static final int GROUP_WEIGHT = 0; + public static final long WATCH_PORT = 0xffffffffL; + public static final long WATCH_GROUP = 0xffffffffL; public static final String SEPARATOR = ":"; private static final Buckets EMPTY_Buckets = new BucketsBuilder().build(); private static final Instructions EMPTY_Instructions = new InstructionsBuilder().setInstruction( @@ -164,6 +168,12 @@ public class MDSALUtil { return groupEntity; } + public static Group buildGroup(long groupId, String groupName, GroupTypes groupType, Buckets buckets) { + GroupId groupIdentifier = new GroupId(groupId); + return new GroupBuilder().setGroupId(groupIdentifier).setKey(new GroupKey(groupIdentifier)).setGroupName(groupName) + .setGroupType(groupType).setBuckets(buckets).build(); + } + public static TransmitPacketInput getPacketOutDefault(List actionInfos, byte[] payload, BigInteger dpnId) { return new TransmitPacketInputBuilder() .setAction(buildActions(actionInfos)) @@ -185,7 +195,7 @@ public class MDSALUtil { .setIngress(ingress).setEgress(ingress).build(); } - private static List buildActions(List actions) { + public static List buildActions(List actions) { List actionsList = new ArrayList(); for (ActionInfo actionInfo : actions) { actionsList.add(actionInfo.buildAction()); @@ -204,6 +214,17 @@ public class MDSALUtil { return sb.toString(); } + + public static Bucket buildBucket(List actionsList, int weight, int bucketId, long watchPort, long watchGroup) { + return new BucketBuilder().setAction(actionsList).setWeight(weight) + .setWatchGroup(watchGroup).setWatchPort(watchPort).setBucketId(new BucketId(Long.valueOf(bucketId))).setKey(new BucketKey(new BucketId(Long.valueOf(bucketId)))).build(); + + } + + public static Buckets buildBucketLists(List bucketList) { + return new BucketsBuilder().setBucket(bucketList).build(); + } + protected static Buckets buildBuckets(List listBucketInfo) { long i = 0; if (listBucketInfo != null) { @@ -354,6 +375,12 @@ public class MDSALUtil { return instructionBuilder.build(); } + public static Action buildAction(int actionKey, int instruction) { + return new ActionBuilder().setAction( + new PopVlanActionCaseBuilder().setPopVlanAction(new PopVlanActionBuilder().build()).build()) + .setKey(new ActionKey(actionKey)).build(); + } + public static Instruction buildAndGetWriteMetadaInstruction(BigInteger metadata, BigInteger mask, int instructionKey) { return new InstructionBuilder() diff --git a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/interfaces/IMdsalApiManager.java b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/interfaces/IMdsalApiManager.java index 250a2471..6595c0d7 100644 --- a/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/interfaces/IMdsalApiManager.java +++ b/mdsalutil/mdsalutil-api/src/main/java/org/opendaylight/vpnservice/mdsalutil/interfaces/IMdsalApiManager.java @@ -16,6 +16,7 @@ import org.opendaylight.vpnservice.mdsalutil.ActionInfo; import org.opendaylight.vpnservice.mdsalutil.FlowEntity; import org.opendaylight.vpnservice.mdsalutil.GroupEntity; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group; public interface IMdsalApiManager { @@ -62,6 +63,8 @@ public interface IMdsalApiManager { */ public void syncInstallGroup(GroupEntity groupEntity, long delayTime); + public void syncInstallGroup(BigInteger dpId, Group group, long delayTime); + /** * API to remove the Group on Data Plane Node synchronously. It internally waits for * Group Change Notification to confirm group delete request is being sent. @@ -69,4 +72,6 @@ public interface IMdsalApiManager { * @param groupEntity */ public void syncRemoveGroup(GroupEntity groupEntity); + + public void syncRemoveGroup(BigInteger dpId, Group groupEntity); } diff --git a/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALManager.java b/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALManager.java index 9c2915a0..cbd11417 100644 --- a/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALManager.java +++ b/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALManager.java @@ -391,4 +391,30 @@ public class MDSALManager implements AutoCloseable { } } + public void syncSetUpGroup(BigInteger dpId, Group group, long delayTime, boolean isRemove) { + s_logger.trace("syncSetUpGroup for group {} ", group); + Node nodeDpn = buildDpnNode(dpId); + long groupId = group.getGroupId().getValue(); + GroupKey groupKey = new GroupKey(new GroupId(groupId)); + InstanceIdentifier groupInstanceId = InstanceIdentifier.builder(Nodes.class) + .child(Node.class, nodeDpn.getKey()).augmentation(FlowCapableNode.class) + .child(Group.class, groupKey).build(); + Runnable notifyTask = new NotifyTask(); + GroupInfoKey groupInfoKey = new GroupInfoKey(dpId, groupId); + synchronized (groupInfoKey.toString().intern()) { + s_logger.trace("syncsetupGroupKey groupKey {}", groupInfoKey); + groupMap.put(groupInfoKey, notifyTask); + if (isRemove) { + MDSALUtil.syncDelete(m_dataBroker, LogicalDatastoreType.CONFIGURATION, groupInstanceId); + } else { + MDSALUtil.syncWrite(m_dataBroker, LogicalDatastoreType.CONFIGURATION, groupInstanceId, group); + } + synchronized (notifyTask) { + try { + notifyTask.wait(delayTime); + } catch (InterruptedException e){} + } + } + } + } diff --git a/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALUtilProvider.java b/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALUtilProvider.java index cacb6344..3ce976d6 100644 --- a/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALUtilProvider.java +++ b/mdsalutil/mdsalutil-impl/src/main/java/org/opendaylight/vpnservice/mdsalutil/internal/MDSALUtilProvider.java @@ -22,6 +22,7 @@ import org.opendaylight.vpnservice.mdsalutil.FlowEntity; import org.opendaylight.vpnservice.mdsalutil.GroupEntity; import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow; +import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group; import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -140,9 +141,19 @@ public class MDSALUtilProvider implements BindingAwareConsumer, IMdsalApiManager mdSalMgr.syncSetUpGroup(groupEntity, delayTime, false); } + @Override + public void syncInstallGroup(BigInteger dpId, Group group, long delayTime) { + mdSalMgr.syncSetUpGroup(dpId, group, delayTime, false); + } + @Override public void syncRemoveGroup(GroupEntity groupEntity) { mdSalMgr.syncSetUpGroup(groupEntity, FIXED_DELAY_IN_MILLISECONDS, true); } + @Override + public void syncRemoveGroup(BigInteger dpId, Group group) { + mdSalMgr.syncSetUpGroup(dpId, group, FIXED_DELAY_IN_MILLISECONDS, true); + } + } -- 2.36.6