From f434f5cce9dc048d2d69dba054f4e9c78d505005 Mon Sep 17 00:00:00 2001 From: Sasidharan Sambasivam Date: Fri, 8 May 2015 13:20:50 +0530 Subject: [PATCH] Integrated with Idmanager and interfacemgr Change-Id: I2b57fd9ff350dc7264ab9e8fde2100565f779835 Signed-off-by: Sasidharan Sambasivam --- features/src/main/features/features.xml | 2 +- vpnmanager/vpnmanager-impl/pom.xml | 5 + .../src/main/config/default-config.xml | 4 + .../opendaylight/vpnservice/VpnConstants.java | 10 ++ .../vpnservice/VpnInterfaceManager.java | 127 +++++++++++++----- .../opendaylight/vpnservice/VpnManager.java | 91 +++++++++++-- .../org/opendaylight/vpnservice/VpnUtil.java | 14 ++ .../vpnservice/VpnserviceProvider.java | 32 +++++ .../impl/rev150216/VpnserviceImplModule.java | 3 + .../src/main/yang/vpnservice-impl.yang | 8 ++ 10 files changed, 250 insertions(+), 46 deletions(-) create mode 100644 vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnConstants.java diff --git a/features/src/main/features/features.xml b/features/src/main/features/features.xml index a44ea70979..bf8e1b3b0e 100644 --- a/features/src/main/features/features.xml +++ b/features/src/main/features/features.xml @@ -43,12 +43,12 @@ and is available at http://www.eclipse.org/legal/epl-v10.html wrap:mvn:org.apache.thrift/libthrift/0.9.1$overwrite=merge&Bundle-Version=0.9.1&Export-Package=*;-noimport:=true;version="0.9.1" + mvn:org.opendaylight.vpnservice/idmanager-impl/${idmanager.version}/xml/config mvn:org.opendaylight.vpnservice/bgpmanager-impl/${vpnservices.version}/xml/config mvn:org.opendaylight.vpnservice/mdsalutil-impl/${interfacemgr.version}/xml/config mvn:org.opendaylight.vpnservice/interfacemgr-impl/${interfacemgr.version}/xml/config mvn:org.opendaylight.vpnservice/vpnmanager-impl/${vpnmanager.version}/xml/config mvn:org.opendaylight.vpnservice/nexthopmgr-impl/${nexthopmgr.version}/xml/config - mvn:org.opendaylight.vpnservice/idmanager-impl/${idmanager.version}/xml/config mvn:org.opendaylight.vpnservice/fibmanager-impl/${fibmanager.version}/xml/config diff --git a/vpnmanager/vpnmanager-impl/pom.xml b/vpnmanager/vpnmanager-impl/pom.xml index 7846979c78..31e1239943 100644 --- a/vpnmanager/vpnmanager-impl/pom.xml +++ b/vpnmanager/vpnmanager-impl/pom.xml @@ -46,6 +46,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html interfacemgr-api ${vpnservices.version} + + org.opendaylight.vpnservice + idmanager-api + ${vpnservices.version} + diff --git a/vpnmanager/vpnmanager-impl/src/main/config/default-config.xml b/vpnmanager/vpnmanager-impl/src/main/config/default-config.xml index 3d718ff744..ac872246db 100644 --- a/vpnmanager/vpnmanager-impl/src/main/config/default-config.xml +++ b/vpnmanager/vpnmanager-impl/src/main/config/default-config.xml @@ -26,6 +26,10 @@ and is available at http://www.eclipse.org/legal/epl-v10.html binding:binding-broker-osgi-registry binding-osgi-broker + + binding:binding-rpc-registry + binding-rpc-broker + bgpmanager:bgpmanager-api bgpmanager diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnConstants.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnConstants.java new file mode 100644 index 0000000000..69c190ff8b --- /dev/null +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnConstants.java @@ -0,0 +1,10 @@ +package org.opendaylight.vpnservice; + +public class VpnConstants { + public static final String VPN_IDPOOL_NAME = "vpnservices"; + public static final long VPN_IDPOOL_START = 1L; + public static final String VPN_IDPOOL_SIZE = "65535"; + public static final short LPORT_INGRESS_TABLE = 0; + public static final short FIB_TABLE = 21; + public static final short DEFAULT_FLOW_PRIORITY = 10; +} diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java index 48926683c7..f8e04be665 100644 --- a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnInterfaceManager.java @@ -10,6 +10,8 @@ package org.opendaylight.vpnservice; import java.math.BigInteger; import java.util.List; import java.util.ArrayList; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; import com.google.common.base.Optional; import com.google.common.util.concurrent.Futures; @@ -31,6 +33,7 @@ import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder; +import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; @@ -42,6 +45,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.AdjacencyLi import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.AdjacencyBuilder; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.VpnInstance1; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies; import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnAfConfig; @@ -62,6 +69,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener DEFAULT_CALLBACK = new FutureCallback() { @@ -91,6 +99,14 @@ public class VpnInterfaceManager extends AbstractDataChangeListener> result = idManager.getUniqueId(getIdInput); + RpcResult rpcResult = result.get(); + if(rpcResult.isSuccessful()) { + return rpcResult.getResult().getIdValue().intValue(); + } else { + LOG.warn("RPC Call to Get Unique Id returned with Errors {}", rpcResult.getErrors()); + } + } catch (NullPointerException | InterruptedException | ExecutionException e) { + LOG.warn("Exception when getting Unique Id",e); + } + return 0; + } + private long getVpnId(String vpnName) { InstanceIdentifier id = InstanceIdentifier.builder(VpnInstances.class) .child(VpnInstance.class, new VpnInstanceKey(vpnName)).augmentation(VpnInstance1.class).build(); @@ -195,19 +230,21 @@ public class VpnInterfaceManager extends AbstractDataChangeListener mkInstructions = new ArrayList(); mkInstructions.add(new InstructionInfo(InstructionType.write_metadata, new BigInteger[] { @@ -219,23 +256,20 @@ public class VpnInterfaceManager extends AbstractDataChangeListener port = read(LogicalDatastoreType.CONFIGURATION, id); if (port.isPresent()) { Interface interf = port.get(); - unbindServiceOnInterface(interf); + unbindServiceOnInterface(interf, getVpnId(vpnInterface.getVpnInstanceName())); removeNextHops(identifier, vpnInterface); } else { LOG.info("No nexthops were available to handle remove event {}", interfaceName); @@ -283,21 +317,19 @@ public class VpnInterfaceManager extends AbstractDataChangeListener path = identifier.augmentation(Adjacencies.class); Optional adjacencies = read(LogicalDatastoreType.OPERATIONAL, path); String intfName = intf.getName(); - + String rd = getRouteDistinguisher(intf.getVpnInstanceName()); if (adjacencies.isPresent()) { List nextHops = adjacencies.get().getAdjacency(); if (!nextHops.isEmpty()) { LOG.trace("NextHops are " + nextHops); for (Adjacency nextHop : nextHops) { - //TODO: Update BGP - removePrefixFromBGP(nextHop); + removePrefixFromBGP(rd, nextHop); } } - - InstanceIdentifier interfaceId = VpnUtil.getVpnInterfaceIdentifier(intfName); - delete(LogicalDatastoreType.OPERATIONAL, interfaceId); } + InstanceIdentifier interfaceId = VpnUtil.getVpnInterfaceIdentifier(intfName); + delete(LogicalDatastoreType.OPERATIONAL, interfaceId); } private void delete(LogicalDatastoreType datastoreType, InstanceIdentifier path) { @@ -306,12 +338,39 @@ public class VpnInterfaceManager extends AbstractDataChangeListener matches = new ArrayList(); + matches.add(new MatchInfo(MatchFieldType.in_port, new long[] { + dpId, portNo })); + + FlowEntity flowEntity = MDSALUtil.buildFlowEntity(dpId, VpnConstants.LPORT_INGRESS_TABLE, flowRef, + priority, flowName, 0, 0, null, matches, null); + + mdsalManager.removeFlow(flowEntity); } - private void removePrefixFromBGP(Adjacency nextHop) { - //TODO: Update the Prefix to BGP + private void removePrefixFromBGP(String rd, Adjacency nextHop) { + //public void deletePrefix(String rd, String prefix) throws Exception; + try { + bgpManager.deletePrefix(rd, nextHop.getIpAddress()); + } catch(Exception e) { + LOG.error("Delete prefix failed", e); + } } @Override diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java index c05506bb73..0e60710092 100644 --- a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnManager.java @@ -11,6 +11,8 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; import org.opendaylight.bgpmanager.api.IBgpManager; import org.opendaylight.controller.md.sal.binding.api.DataBroker; @@ -20,6 +22,7 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataCh import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.RpcResult; import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.binding.api.WriteTransaction; import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnAfConfig; @@ -32,6 +35,10 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev15 import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTables; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.fibentries.VrfTablesKey; import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.fibmanager.rev150330.vrfentries.VrfEntry; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdInputBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.GetUniqueIdOutput; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -44,6 +51,7 @@ public class VpnManager extends AbstractDataChangeListener implemen private ListenerRegistration listenerRegistration, fibListenerRegistration; private final DataBroker broker; private final IBgpManager bgpManager; + private IdManagerService idManager; private final FibEntriesListener fibListener; private static final FutureCallback DEFAULT_CALLBACK = @@ -83,24 +91,37 @@ public class VpnManager extends AbstractDataChangeListener implemen } } + public void setIdManager(IdManagerService idManager) { + this.idManager = idManager; + } + @Override - protected void remove(InstanceIdentifier identifier, - VpnInstance del) { - // TODO Auto-generated method stub + protected void remove(InstanceIdentifier identifier, VpnInstance del) { + LOG.info("Remove event - Key: {}, value: {}", identifier, del); + String vpnName = del.getVpnInstanceName(); + InstanceIdentifier vpnIdentifier = VpnUtil.getVpnInstanceIdentifier(vpnName); + delete(LogicalDatastoreType.OPERATIONAL, vpnIdentifier); + + String rd = del.getIpv4Family().getRouteDistinguisher(); + try { + bgpManager.deleteVrf(rd); + } catch(Exception e) { + LOG.error("Exception when removing VRF from BGP", e); + } } @Override protected void update(InstanceIdentifier identifier, VpnInstance original, VpnInstance update) { - // TODO Auto-generated method stub + LOG.info("Update event - Key: {}, value: {}", identifier, update); } @Override protected void add(InstanceIdentifier identifier, VpnInstance value) { LOG.info("key: {}, value: {}" +identifier, value); - //TODO: Generate VPN ID for this instance, where to store in model ... ? - long vpnId = 1000; + + long vpnId = getUniqueId(value.getVpnInstanceName()); InstanceIdentifier augId = identifier.augmentation(VpnInstance1.class); Optional vpnAugmenation = read(LogicalDatastoreType.CONFIGURATION, augId); if(vpnAugmenation.isPresent()) { @@ -114,7 +135,6 @@ public class VpnManager extends AbstractDataChangeListener implemen asyncWrite(LogicalDatastoreType.OPERATIONAL, identifier, opValue, DEFAULT_CALLBACK); - //TODO: Add VRF to BGP //public void addVrf(String rd, Collection importRts, Collection exportRts) VpnAfConfig config = value.getIpv4Family(); String rd = config.getRouteDistinguisher(); @@ -193,6 +213,31 @@ public class VpnManager extends AbstractDataChangeListener implemen return null; } + private Integer getUniqueId(String idKey) { + GetUniqueIdInput getIdInput = new GetUniqueIdInputBuilder() + .setPoolName(VpnConstants.VPN_IDPOOL_NAME) + .setIdKey(idKey).build(); + + try { + Future> result = idManager.getUniqueId(getIdInput); + RpcResult rpcResult = result.get(); + if(rpcResult.isSuccessful()) { + return rpcResult.getResult().getIdValue().intValue(); + } else { + LOG.warn("RPC Call to Get Unique Id returned with Errors {}", rpcResult.getErrors()); + } + } catch (NullPointerException | InterruptedException | ExecutionException e) { + LOG.warn("Exception when getting Unique Id",e); + } + return 0; + } + + private void delete(LogicalDatastoreType datastoreType, InstanceIdentifier path) { + WriteTransaction tx = broker.newWriteOnlyTransaction(); + tx.delete(datastoreType, path); + Futures.addCallback(tx.submit(), DEFAULT_CALLBACK); + } + private class FibEntriesListener extends AbstractDataChangeListener { public FibEntriesListener() { @@ -202,8 +247,32 @@ public class VpnManager extends AbstractDataChangeListener implemen @Override protected void remove(InstanceIdentifier identifier, VrfEntry del) { - // TODO Auto-generated method stub - + LOG.info("Remove Fib event - Key : {}, value : {} ",identifier, del); + final VrfTablesKey key = identifier.firstKeyOf(VrfTables.class, VrfTablesKey.class); + String rd = key.getRouteDistinguisher(); + Long label = del.getLabel(); + VpnInstance vpn = getVpnForRD(rd); + if(vpn != null) { + InstanceIdentifier id = VpnUtil.getVpnInstanceIdentifier(vpn.getVpnInstanceName()); + InstanceIdentifier augId = id.augmentation(VpnInstance1.class); + Optional vpnAugmenation = read(LogicalDatastoreType.OPERATIONAL, augId); + if(vpnAugmenation.isPresent()) { + VpnInstance1 vpnAug = vpnAugmenation.get(); + List routeIds = vpnAug.getRouteEntryId(); + if(routeIds == null) { + LOG.debug("Fib Route entry is empty."); + return; + } + LOG.info("Removing label from vpn info - {}", label); + routeIds.remove(label); + asyncWrite(LogicalDatastoreType.OPERATIONAL, augId, + new VpnInstance1Builder(vpnAug).setRouteEntryId(routeIds).build(), DEFAULT_CALLBACK); + } else { + LOG.info("VPN Augmentation not found"); + } + } else { + LOG.warn("No VPN Instance found for RD: {}", rd); + } } @Override @@ -216,7 +285,7 @@ public class VpnManager extends AbstractDataChangeListener implemen @Override protected void add(InstanceIdentifier identifier, VrfEntry add) { - LOG.info("Key : " + identifier + " value : " + add); + LOG.info("Add Vrf Entry event - Key : {}, value : {}",identifier, add); final VrfTablesKey key = identifier.firstKeyOf(VrfTables.class, VrfTablesKey.class); String rd = key.getRouteDistinguisher(); Long label = add.getLabel(); @@ -231,7 +300,7 @@ public class VpnManager extends AbstractDataChangeListener implemen if(routeIds == null) { routeIds = new ArrayList<>(); } - LOG.info("Adding label to vpn info " + label); + LOG.info("Adding label to vpn info - {}", label); routeIds.add(label); asyncWrite(LogicalDatastoreType.OPERATIONAL, augId, new VpnInstance1Builder(vpnAug).setRouteEntryId(routeIds).build(), DEFAULT_CALLBACK); diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java index b7c9721e25..fc70f055b0 100644 --- a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnUtil.java @@ -1,6 +1,9 @@ package org.opendaylight.vpnservice; import java.util.List; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInterfaces; import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstance; import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInstances; @@ -11,7 +14,11 @@ import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev14081 import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.adjacency.list.Adjacency; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.Adjacencies; import org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.AdjacenciesBuilder; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.Pools; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.pools.IdPool; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.pools.IdPoolKey; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.RpcResult; public class VpnUtil { static InstanceIdentifier getVpnInterfaceIdentifier(String vpnInterfaceName) { @@ -32,4 +39,11 @@ public class VpnUtil { static Adjacencies getVpnInterfaceAugmentation(List nextHops) { return new AdjacenciesBuilder().setAdjacency(nextHops).build(); } + + public static InstanceIdentifier getPoolId(String poolName){ + InstanceIdentifier.InstanceIdentifierBuilder idBuilder = + InstanceIdentifier.builder(Pools.class).child(IdPool.class, new IdPoolKey(poolName)); + InstanceIdentifier id = idBuilder.build(); + return id; + } } diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java index a93dc1c261..4417332177 100644 --- a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/vpnservice/VpnserviceProvider.java @@ -7,7 +7,10 @@ */ package org.opendaylight.vpnservice; +import java.math.BigInteger; import java.util.Collections; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; import org.opendaylight.bgpmanager.api.IBgpManager; import org.opendaylight.controller.md.sal.binding.api.DataBroker; @@ -15,6 +18,10 @@ import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderCo import org.opendaylight.controller.sal.binding.api.BindingAwareProvider; import org.opendaylight.vpnservice.interfacemgr.interfaces.IInterfaceManager; import org.opendaylight.vpnservice.mdsalutil.interfaces.IMdsalApiManager; +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; +import org.opendaylight.yangtools.yang.common.RpcResult; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -27,6 +34,7 @@ public class VpnserviceProvider implements BindingAwareProvider, private IBgpManager bgpManager; private IMdsalApiManager mdsalManager; private IInterfaceManager interfaceManager; + private IdManagerService idManager; @Override public void onSessionInitiated(ProviderContext session) { @@ -34,8 +42,12 @@ public class VpnserviceProvider implements BindingAwareProvider, try { final DataBroker dataBroker = session.getSALService(DataBroker.class); vpnManager = new VpnManager(dataBroker, bgpManager); + vpnManager.setIdManager(idManager); vpnInterfaceManager = new VpnInterfaceManager(dataBroker, bgpManager); vpnInterfaceManager.setMdsalManager(mdsalManager); + vpnInterfaceManager.setInterfaceManager(interfaceManager); + vpnInterfaceManager.setIdManager(idManager); + createIdPool(); } catch (Exception e) { LOG.error("Error initializing services", e); } @@ -54,6 +66,26 @@ public class VpnserviceProvider implements BindingAwareProvider, this.interfaceManager = interfaceManager; } + public void setIdManager(IdManagerService idManager) { + this.idManager = idManager; + } + + private void createIdPool() { + CreateIdPoolInput createPool = new CreateIdPoolInputBuilder() + .setPoolName(VpnConstants.VPN_IDPOOL_NAME) + .setIdStart(VpnConstants.VPN_IDPOOL_START) + .setPoolSize(new BigInteger(VpnConstants.VPN_IDPOOL_SIZE)) + .build(); + try { + Future> result = idManager.createIdPool(createPool); + if ((result != null) && (result.get().isSuccessful())) { + LOG.info("Created IdPool for VPN Service"); + } + } catch (InterruptedException | ExecutionException e) { + LOG.error("Failed to create idPool for VPN Service",e); + } + } + @Override public void close() throws Exception { vpnManager.close(); diff --git a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/vpnservice/impl/rev150216/VpnserviceImplModule.java b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/vpnservice/impl/rev150216/VpnserviceImplModule.java index cbab6e84ac..14e2539d15 100644 --- a/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/vpnservice/impl/rev150216/VpnserviceImplModule.java +++ b/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/vpnservice/impl/rev150216/VpnserviceImplModule.java @@ -8,6 +8,7 @@ package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpnservice.impl.rev150216; import org.opendaylight.vpnservice.VpnserviceProvider; +import org.opendaylight.yang.gen.v1.urn.opendaylight.vpnservice.idmanager.rev150403.IdManagerService; public class VpnserviceImplModule extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpnservice.impl.rev150216.AbstractVpnserviceImplModule { public VpnserviceImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) { @@ -25,10 +26,12 @@ public class VpnserviceImplModule extends org.opendaylight.yang.gen.v1.urn.opend @Override public java.lang.AutoCloseable createInstance() { + IdManagerService idManager = getRpcregistryDependency().getRpcService(IdManagerService.class); VpnserviceProvider provider = new VpnserviceProvider(); provider.setBgpManager(getBgpmanagerDependency()); provider.setMdsalManager(getMdsalutilDependency()); provider.setInterfaceManager(getOdlinterfaceDependency()); + provider.setIdManager(idManager); getBrokerDependency().registerProvider(provider); return provider; } diff --git a/vpnmanager/vpnmanager-impl/src/main/yang/vpnservice-impl.yang b/vpnmanager/vpnmanager-impl/src/main/yang/vpnservice-impl.yang index b1703e2227..d73c9d621d 100644 --- a/vpnmanager/vpnmanager-impl/src/main/yang/vpnservice-impl.yang +++ b/vpnmanager/vpnmanager-impl/src/main/yang/vpnservice-impl.yang @@ -33,6 +33,14 @@ module vpnservice-impl { } } } + container rpcregistry { + uses config:service-ref { + refine type { + mandatory true; + config:required-identity md-sal-binding:binding-rpc-registry; + } + } + } container bgpmanager { uses config:service-ref { refine type { -- 2.36.6