From cfe29a9c8ad22357912f8e5ad5d83c65bfef248d Mon Sep 17 00:00:00 2001 From: Deepthi V V Date: Thu, 14 May 2015 00:02:05 +0530 Subject: [PATCH] Handle first iand last prefix for vrf on a dpn. Signed-off-by: Deepthi V V Change-Id: Ibd44c679995c1633a77a0eb190f95adf455634d8 --- fibmanager/fibmanager-api/pom.xml | 6 ++- .../fibmanager/api/IFibManager.java | 6 +++ .../src/main/yang/fibmanager-api.yang | 20 ++++++++ .../src/main/config/default-config.xml | 9 ++++ .../vpnservice/fibmanager/FibManager.java | 51 +++++++++++++++++++ .../fibmanager/FibManagerProvider.java | 15 +++++- .../src/main/yang/fibmanager-impl.yang | 4 +- 7 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 fibmanager/fibmanager-api/src/main/java/org/opendaylight/fibmanager/api/IFibManager.java create mode 100644 fibmanager/fibmanager-api/src/main/yang/fibmanager-api.yang diff --git a/fibmanager/fibmanager-api/pom.xml b/fibmanager/fibmanager-api/pom.xml index d82fe10a..b5e06b92 100644 --- a/fibmanager/fibmanager-api/pom.xml +++ b/fibmanager/fibmanager-api/pom.xml @@ -9,7 +9,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html org.opendaylight.vpnservice - binding-parent + config-parent 0.1.0-SNAPSHOT ../../commons/binding-parent @@ -56,5 +56,9 @@ and is available at http://www.eclipse.org/legal/epl-v10.html model-inventory ${mdsal.version} + + org.opendaylight.controller + config-api + diff --git a/fibmanager/fibmanager-api/src/main/java/org/opendaylight/fibmanager/api/IFibManager.java b/fibmanager/fibmanager-api/src/main/java/org/opendaylight/fibmanager/api/IFibManager.java new file mode 100644 index 00000000..4c16d2fe --- /dev/null +++ b/fibmanager/fibmanager-api/src/main/java/org/opendaylight/fibmanager/api/IFibManager.java @@ -0,0 +1,6 @@ +package org.opendaylight.fibmanager.api; + +public interface IFibManager { + void populateFibOnNewDpn(long dpnId, long vpnId, String rd); + void cleanUpDpnForVpn(long dpnId, long vpnId, String rd); +} diff --git a/fibmanager/fibmanager-api/src/main/yang/fibmanager-api.yang b/fibmanager/fibmanager-api/src/main/yang/fibmanager-api.yang new file mode 100644 index 00000000..de27e902 --- /dev/null +++ b/fibmanager/fibmanager-api/src/main/yang/fibmanager-api.yang @@ -0,0 +1,20 @@ +module fibmanager-api { + yang-version 1; + namespace "urn:opendaylight:params:xml:ns:yang:fibmanager:api"; + prefix "fibmanager-api"; + + import config { prefix config; revision-date 2013-04-05; } + + description + "Service definition for vpnmanager project"; + + revision "2015-05-08" { + description + "Initial revision"; + } + + identity fibmanager-api { + base "config:service-type"; + config:java-class "org.opendaylight.fibmanager.api.IFibManager"; + } +} \ No newline at end of file diff --git a/fibmanager/fibmanager-impl/src/main/config/default-config.xml b/fibmanager/fibmanager-impl/src/main/config/default-config.xml index 166d22cb..ebf0531b 100644 --- a/fibmanager/fibmanager-impl/src/main/config/default-config.xml +++ b/fibmanager/fibmanager-impl/src/main/config/default-config.xml @@ -35,6 +35,15 @@ and is available at http://www.eclipse.org/legal/epl-v10.html + + + prefix:fibmanager-api + + fibmanager + /modules/module[type='fibmanager-impl'][name='fibmanager-default'] + + + diff --git a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManager.java b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManager.java index 70a6d209..fed6b9b0 100644 --- a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManager.java +++ b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManager.java @@ -36,6 +36,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev15 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.GetEgressPointerInputBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.GetEgressPointerOutput; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.L3nexthopService; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.RemoveLocalNextHopInputBuilder; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -251,6 +252,7 @@ public class FibManager extends AbstractDataChangeListener implements if (isLocalRoute) { makeLFibTableEntry(dpId, vrfEntry.getLabel(), groupId, vrfEntry.getNextHopAddress(), NwConstants.DEL_FLOW); + deleteLocalAdjacency(dpId, vpnId, vrfEntry); } LOG.debug("Successfully delete fib entry for "+ vrfEntry.getDestPrefix() + " vpnId "+vpnId); @@ -343,6 +345,55 @@ public class FibManager extends AbstractDataChangeListener implements LOG.debug("LFIB Entry for dpID {} : label : {} group {} modified successfully {}",dpId, label, groupId ); } + private void deleteLocalAdjacency(final long dpId, final long vpnId, final VrfEntry vrfEntry) { + LOG.trace("deleteLocalAdjacency called with dpid {}, vpnId{}, VrfEntry {}",dpId, vpnId, vrfEntry);; + try { + Future> result = + l3nexthopService.removeLocalNextHop(new RemoveLocalNextHopInputBuilder().setDpnId(dpId) + .setIpPrefix(vrfEntry.getDestPrefix()) + .setNexthopIp(vrfEntry.getNextHopAddress()) + .setVpnId(vpnId) + .build()); + RpcResult rpcResult = result.get(); + if (rpcResult.isSuccessful()) { + LOG.debug("Local Next hop for {} on dpn {} successfully deleted", vrfEntry.getDestPrefix(), dpId); + } else { + LOG.error("Local Next hop for {} on dpn {} not deleted", vrfEntry.getDestPrefix(), dpId); + } + } catch (NullPointerException | InterruptedException | ExecutionException e) { + LOG.trace("", e); + } + } + + public void populateFibOnNewDpn(long dpnId, long vpnId, String rd) { + LOG.trace("New dpn {} for vpn {} : populateFibOnNewDpn", dpnId, rd); + InstanceIdentifier id = buildVrfId(rd); + Optional vrfTable = read(LogicalDatastoreType.OPERATIONAL, id); + if(vrfTable.isPresent()) { + for(VrfEntry vrfEntry : vrfTable.get().getVrfEntry()) { + addRouteInternal(dpnId, vpnId, vrfTable.get().getKey(), vrfEntry); + } + } + } + + public void cleanUpDpnForVpn(long dpnId, long vpnId, String rd) { + LOG.trace("Remove dpn {} for vpn {} : cleanUpDpnForVpn", dpnId, rd); + InstanceIdentifier id = buildVrfId(rd); + Optional vrfTable = read(LogicalDatastoreType.OPERATIONAL, id); + if(vrfTable.isPresent()) { + for(VrfEntry vrfEntry : vrfTable.get().getVrfEntry()) { + deleteRoute(dpnId, vpnId, vrfTable.get().getKey(), vrfEntry); + } + } + } + + public static InstanceIdentifier buildVrfId(String rd) { + InstanceIdentifierBuilder idBuilder = + InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)); + InstanceIdentifier id = idBuilder.build(); + return id; + } + private String getFlowRef(long dpnId, short tableId, long label, String nextHop) { return new StringBuilder(64).append(FLOWID_PREFIX).append(dpnId).append(NwConstants.FLOWID_SEPARATOR) .append(tableId).append(NwConstants.FLOWID_SEPARATOR) diff --git a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManagerProvider.java b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManagerProvider.java index d08ec095..bb16187c 100644 --- a/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManagerProvider.java +++ b/fibmanager/fibmanager-impl/src/main/java/org/opendaylight/vpnservice/fibmanager/FibManagerProvider.java @@ -10,6 +10,7 @@ package org.opendaylight.vpnservice.fibmanager; import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext; import org.opendaylight.controller.sal.binding.api.BindingAwareProvider; +import org.opendaylight.fibmanager.api.IFibManager; import org.opendaylight.vpnmanager.api.IVpnManager; import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.l3nexthop.rev150409.L3nexthopService; @@ -17,7 +18,7 @@ import org.opendaylight.yangtools.yang.binding.RpcService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class FibManagerProvider implements BindingAwareProvider, AutoCloseable { +public class FibManagerProvider implements BindingAwareProvider, IFibManager, AutoCloseable { private static final Logger LOG = LoggerFactory.getLogger(FibManagerProvider.class); @@ -55,4 +56,14 @@ public class FibManagerProvider implements BindingAwareProvider, AutoCloseable { public void setVpnmanager(IVpnManager vpnmanager) { this.vpnmanager = vpnmanager; } -} \ No newline at end of file + + @Override + public void populateFibOnNewDpn(long dpnId, long vpnId, String rd) { + fibManager.populateFibOnNewDpn(dpnId, vpnId, rd); + } + + @Override + public void cleanUpDpnForVpn(long dpnId, long vpnId, String rd) { + fibManager.populateFibOnNewDpn(dpnId, vpnId, rd); + } +} diff --git a/fibmanager/fibmanager-impl/src/main/yang/fibmanager-impl.yang b/fibmanager/fibmanager-impl/src/main/yang/fibmanager-impl.yang index 42e0a05a..ac676b8c 100644 --- a/fibmanager/fibmanager-impl/src/main/yang/fibmanager-impl.yang +++ b/fibmanager/fibmanager-impl/src/main/yang/fibmanager-impl.yang @@ -3,7 +3,8 @@ module fibmanager-impl { namespace "urn:opendaylight:params:xml:ns:yang:fibmanager:impl"; prefix "fibmanager-impl"; - import config { prefix config; revision-date 2013-04-05; } + import config { prefix config; revision-date 2013-04-05;} + import fibmanager-api { prefix fibmgr-api; revision-date 2015-05-08;} import opendaylight-md-sal-binding { prefix md-sal-binding; revision-date 2013-10-28;} import odl-mdsalutil { prefix odl-mdsal; revision-date 2015-04-10;} import vpnmanager-api { prefix odl-vpn; revision-date 2015-05-08;} @@ -18,6 +19,7 @@ module fibmanager-impl { identity fibmanager-impl { base config:module-type; + config:provided-service fibmgr-api:fibmanager-api; config:java-name-prefix FibmanagerImpl; } -- 2.36.6