Merge "Add ovsdb/netvirt ui to vpnservice netvirt code."
authorSam Hague <shague@redhat.com>
Mon, 8 Aug 2016 18:24:07 +0000 (18:24 +0000)
committerGerrit Code Review <gerrit@opendaylight.org>
Mon, 8 Aug 2016 18:24:07 +0000 (18:24 +0000)
73 files changed:
openstack/sfc-translator/features/pom.xml
openstack/sfc-translator/features/src/main/features/features.xml
openstack/sfc-translator/impl/pom.xml
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/DelegatingDataTreeListener.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/NeutronMdsalHelper.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/OpenStackSFCTranslatorProvider.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/OvsdbMdsalHelper.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/SfcMdsalHelper.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/flowclassifier/FlowClassifierTranslator.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/flowclassifier/NeutronFlowClassifierListener.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/portchain/NeutronPortChainListener.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/portchain/NeutronPortPairGroupListener.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/portchain/NeutronPortPairListener.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/portchain/PortChainTranslator.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/portchain/PortPairGroupTranslator.java
openstack/sfc-translator/impl/src/main/java/org/opendaylight/netvirt/openstack/sfc/translator/portchain/PortPairTranslator.java
openstack/sfc-translator/impl/src/main/resources/org/opendaylight/blueprint/openstack-sfc-translator.xml
openstack/sfc-translator/karaf/pom.xml
vpnservice/bgpmanager/bgpmanager-api/src/main/java/org.opendaylight.netvirt.bgpmanager.api/IBgpManager.java
vpnservice/bgpmanager/bgpmanager-api/src/main/yang/bgpmanager-api.yang [deleted file]
vpnservice/bgpmanager/bgpmanager-impl/src/main/config/default-config.xml [deleted file]
vpnservice/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/netvirt/bgpmanager/AbstractDataChangeListener.java [deleted file]
vpnservice/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpConfigurationManager.java
vpnservice/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpManager.java
vpnservice/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/netvirt/bgpmanager/BgpUtil.java
vpnservice/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/netvirt/bgpmanager/FibDSWriter.java
vpnservice/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/netvirt/bgpmanager/oam/BgpAlarmBroadcaster.java
vpnservice/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/netvirt/bgpmanager/thrift/server/BgpThriftService.java
vpnservice/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/bgpmanager/impl/rev150326/BgpManagerImplModule.java [deleted file]
vpnservice/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/bgpmanager/impl/rev150326/BgpManagerImplModuleFactory.java [deleted file]
vpnservice/bgpmanager/bgpmanager-impl/src/main/resources/org/opendaylight/blueprint/bgpmanager-impl.xml [new file with mode: 0644]
vpnservice/bgpmanager/bgpmanager-impl/src/main/resources/org/opendaylight/blueprint/commands.xml [moved from vpnservice/bgpmanager/bgpmanager-impl/src/main/resources/OSGI-INF/blueprint/commands.xml with 100% similarity]
vpnservice/bgpmanager/bgpmanager-impl/src/main/yang/bgpmanager-impl.yang [deleted file]
vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanServiceProvider.java
vpnservice/features/pom.xml
vpnservice/features/src/main/features/features.xml
vpnservice/it/src/test/java/org/opendaylight/netvirt/it/NetvirtIT.java
vpnservice/natservice/natservice-impl/src/main/config/default-config.xml
vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatServiceProvider.java
vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/netvirt/natservice/internal/VpnFloatingIpHandler.java
vpnservice/natservice/natservice-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/natservice/impl/rev160111/NATServiceModule.java
vpnservice/natservice/natservice-impl/src/main/yang/natservice-impl.yang
vpnservice/statemanager/impl/src/main/java/org/opendaylight/netvirt/statemanager/ConfigStateManager.java
vpnservice/vpnmanager/vpnmanager-api/src/main/yang/vpnmanager-api.yang [deleted file]
vpnservice/vpnmanager/vpnmanager-impl/src/main/config/default-config.xml [deleted file]
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/ArpNotificationHandler.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/ArpScheduler.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/DpnInVpnChangeListener.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/FibEntriesListener.java [new file with mode: 0644]
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/FloatingIpGarpHandler.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/InterfaceStateChangeListener.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/RouterInterfaceListener.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetRouteInterfaceStateChangeListener.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/SubnetRoutePacketInHandler.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TransactionUtil.java [new file with mode: 0644]
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TunnelInterfaceStateListener.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInstanceListener.java [moved from vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnManager.java with 66% similarity]
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceOpListener.java [new file with mode: 0644]
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnManagerImpl.java [new file with mode: 0644]
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnRpcServiceImpl.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnmanagerServiceAccessor.java [deleted file]
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnserviceProvider.java [deleted file]
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkListener.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkNodeListener.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/vpnservice/impl/rev150216/VpnserviceImplModule.java [deleted file]
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/vpnservice/impl/rev150216/VpnserviceImplModuleFactory.java [deleted file]
vpnservice/vpnmanager/vpnmanager-impl/src/main/resources/OSGI-INF/blueprint/blueprint.xml [deleted file]
vpnservice/vpnmanager/vpnmanager-impl/src/main/resources/org/opendaylight/blueprint/vpnmanager.xml [new file with mode: 0644]
vpnservice/vpnmanager/vpnmanager-impl/src/main/yang/vpnservice-impl.yang [deleted file]
vpnservice/vpnmanager/vpnmanager-impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnServiceTest.java
vpnservice/vpnmanager/vpnmanager-impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnSubnetRouteHandlerTest.java

index d5e954129c787a192cc7223d82143527f1875ecf..766dee6a3206b2c3dd9aaa1188d607166c14d049 100644 (file)
       <classifier>features</classifier>
       <type>xml</type>
     </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>openstack.net-virt-sfc-features</artifactId>
+      <version>${project.version}</version>
+      <classifier>features</classifier>
+      <type>xml</type>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.sfc</groupId>
       <artifactId>features-sfc</artifactId>
index 8b76ad1ee30f1dd3d3bfd1ee1d96088a351c5310..5b3e519d0901ea98e8efdfa608c4e12ab86bedc6 100644 (file)
   <repository>mvn:org.opendaylight.neutron/features-neutron/{{VERSION}}/xml/features</repository>
   <repository>mvn:org.opendaylight.sfc/features-sfc/{{VERSION}}/xml/features</repository>
   <repository>mvn:org.opendaylight.netvirt/features-netvirt/{{VERSION}}/xml/features</repository>
+  <repository>mvn:org.opendaylight.netvirt/openstack.net-virt-sfc-features/{{VERSION}}/xml/features</repository>
   <feature name='odl-netvirt-openstack-sfc-translator' version='${project.version}'
            description='OpenStack SFC to OpenDaylight SFC API data translator'>
     <feature version='${controller.mdsal.version}'>odl-mdsal-broker</feature>
     <feature version="${neutron.version}">odl-neutron-service</feature>
     <feature version='${sfc.version}'>odl-sfc-model</feature>
+    <feature version='${project.version}'>odl-ovsdb-sfc-api</feature>
   <bundle>mvn:org.opendaylight.netvirt/utils.mdsal-utils/{{VERSION}}</bundle>
   <bundle>mvn:org.opendaylight.netvirt/openstack.sfc-translator-impl/{{VERSION}}</bundle>
   </feature>
     <feature version="${project.version}">odl-netvirt-openstack-sfc-translator</feature>
     <feature version="${restconf.version}">odl-restconf</feature>
   </feature>
-  <feature name='odl-netvirt-openstack-sfc-translator-ui' version='${project.version}'
-           description='OpenStack SFC to OpenDaylight SFC API data translator with dlux UI'>
-    <feature version="${project.version}">odl-netvirt-openstack-sfc-translator-rest</feature>
-    <feature version="${restconf.version}">odl-mdsal-apidocs</feature>
-    <feature version="${controller.mdsal.version}">odl-mdsal-xsql</feature>
-    <feature version="${dlux.version}">odl-dlux-yangui</feature>
-  </feature>
 </features>
index b7b821a9f7c8b28f0e1e5b37ab68ce1689ca10cc..a1645b288b3d4b903f5d31c4010c9ed25652eca1 100644 (file)
       <artifactId>slf4j-simple</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>${project.groupId}</groupId>
+      <artifactId>openstack.net-virt-sfc-api</artifactId>
+      <version>${project.version}</version>
+    </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>utils.mdsal-utils</artifactId>
index f960c984154f591ce869f34c63170417cabe70ac..9c2292f917fcc2eb1bf248c05d71fb0cb2f2dd1c 100644 (file)
@@ -30,7 +30,9 @@ import java.util.concurrent.ThreadFactory;
 /**
  * Data-tree listener which delegates data processing to a {@link INeutronSfcDataProcessor}.
  */
-public class DelegatingDataTreeListener<T extends DataObject> implements AutoCloseable, DataTreeChangeListener<T> {
+public abstract class DelegatingDataTreeListener<T extends DataObject> implements AutoCloseable,
+        DataTreeChangeListener<T>,
+        INeutronSfcDataProcessor<T> {
     private static final Logger LOG = LoggerFactory.getLogger(DelegatingDataTreeListener.class);
     private static final ThreadFactory threadFactory = new ThreadFactoryBuilder()
         .setNameFormat("NeutronSfcListener-%d").build();
@@ -38,9 +40,8 @@ public class DelegatingDataTreeListener<T extends DataObject> implements AutoClo
     private final INeutronSfcDataProcessor<T> dataProcessor;
     private ListenerRegistration<DelegatingDataTreeListener<T>> listenerRegistration;
 
-    public DelegatingDataTreeListener(INeutronSfcDataProcessor<T> dataProcessor,
-                                      DataBroker db, DataTreeIdentifier<T> treeId) {
-        this.dataProcessor = Preconditions.checkNotNull(dataProcessor, "Data processor can not be null!");
+    public DelegatingDataTreeListener(DataBroker db, DataTreeIdentifier<T> treeId) {
+        this.dataProcessor = Preconditions.checkNotNull(this, "Data processor can not be null!");
         registerListener(Preconditions.checkNotNull(db, "Data broker can not be null!"),
                 Preconditions.checkNotNull(treeId, "Tree identifier can not be null!"));
     }
index 6773c116e5b908e295b0985dc96827d6c5bb8706..916dbf03749d45fe52edc2b2ba9ddc189c33d4c5 100644 (file)
@@ -15,6 +15,15 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.por
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.PortKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.flow.classifier.rev160511.sfc.flow.classifiers.attributes.SfcFlowClassifiers;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.flow.classifier.rev160511.sfc.flow.classifiers.attributes.sfc.flow.classifiers.SfcFlowClassifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.flow.classifier.rev160511.sfc.flow.classifiers.attributes.sfc.flow.classifiers.SfcFlowClassifierKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.PortPairGroups;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.PortPairs;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pair.groups.PortPairGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pair.groups.PortPairGroupKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pairs.PortPair;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pairs.PortPairKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -25,9 +34,14 @@ import org.slf4j.LoggerFactory;
  */
 public class NeutronMdsalHelper {
     private static final Logger LOG = LoggerFactory.getLogger(NeutronMdsalHelper.class);
-    private static final InstanceIdentifier<Ports> portsPairIid =
+    private static final InstanceIdentifier<SfcFlowClassifiers> fcIid =
+            InstanceIdentifier.create(Neutron.class).child(SfcFlowClassifiers.class);
+    private static final InstanceIdentifier<Ports> portsIid =
             InstanceIdentifier.create(Neutron.class).child(Ports.class);
-
+    private static final InstanceIdentifier<PortPairs> portPairsIid =
+            InstanceIdentifier.create(Neutron.class).child(PortPairs.class);
+    private static final InstanceIdentifier<PortPairGroups> portPairGroupsIid =
+            InstanceIdentifier.create(Neutron.class).child(PortPairGroups.class);
 
     private final DataBroker dataBroker;
     private final MdsalUtils mdsalUtils;
@@ -42,7 +56,37 @@ public class NeutronMdsalHelper {
         return neutronPort;
     }
 
+    public PortPair getNeutronPortPair(Uuid portPairId) {
+        PortPair neutronPortPair
+                = mdsalUtils.read(LogicalDatastoreType.CONFIGURATION , getNeutronPortPairPath(portPairId));
+        return neutronPortPair;
+    }
+
+    public PortPairGroup getNeutronPortPairGroup(Uuid portPairGroupId) {
+        PortPairGroup neutronPortPairGroup
+                = mdsalUtils.read(LogicalDatastoreType.CONFIGURATION , getNeutronPortPairGroupPath(portPairGroupId));
+        return neutronPortPairGroup;
+    }
+
+    public SfcFlowClassifier getNeutronFlowClassifier(Uuid flowClassifierId) {
+        SfcFlowClassifier sfcFlowClassifier
+                = mdsalUtils.read(LogicalDatastoreType.CONFIGURATION , getNeutronSfcFlowClassifierPath(flowClassifierId));
+        return sfcFlowClassifier;
+    }
+
     private InstanceIdentifier<Port> getNeutronPortPath(Uuid portId) {
-        return portsPairIid.builder().child(Port.class, new PortKey(portId)).build();
+        return portsIid.builder().child(Port.class, new PortKey(portId)).build();
+    }
+
+    private InstanceIdentifier<PortPair> getNeutronPortPairPath(Uuid portPairId) {
+        return portPairsIid.builder().child(PortPair.class, new PortPairKey(portPairId)).build();
+    }
+
+    private InstanceIdentifier<PortPairGroup> getNeutronPortPairGroupPath(Uuid portPairGroupId) {
+        return portPairGroupsIid.builder().child(PortPairGroup.class, new PortPairGroupKey(portPairGroupId)).build();
+    }
+
+    private InstanceIdentifier<SfcFlowClassifier> getNeutronSfcFlowClassifierPath(Uuid portId) {
+        return fcIid.builder().child(SfcFlowClassifier.class, new SfcFlowClassifierKey(portId)).build();
     }
 }
index ce2c543db5ce74f44114f5c8180da76aa2021142..907cc284be19ab362f3c5a038b65eeeca4d7c972 100644 (file)
@@ -9,10 +9,11 @@
 package org.opendaylight.netvirt.openstack.sfc.translator;
 
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.netvirt.openstack.sfc.translator.flowclassifier.FlowClassifierTranslator;
-import org.opendaylight.netvirt.openstack.sfc.translator.portchain.PortChainTranslator;
-import org.opendaylight.netvirt.openstack.sfc.translator.portchain.PortPairGroupTranslator;
-import org.opendaylight.netvirt.openstack.sfc.translator.portchain.PortPairTranslator;
+import org.opendaylight.netvirt.openstack.sfc.translator.flowclassifier.NeutronFlowClassifierListener;
+import org.opendaylight.netvirt.openstack.sfc.translator.portchain.NeutronPortChainListener;
+import org.opendaylight.netvirt.openstack.sfc.translator.portchain.NeutronPortPairGroupListener;
+import org.opendaylight.netvirt.openstack.sfc.translator.portchain.NeutronPortPairListener;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.RenderedServicePathService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.openstack.sfc.translator.config.rev160720.OpenstackSfcTranslatorConfig;
 import org.osgi.framework.BundleContext;
 import org.slf4j.Logger;
@@ -22,30 +23,24 @@ public class OpenStackSFCTranslatorProvider implements AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(OpenStackSFCTranslatorProvider.class);
 
     private final DataBroker dataBroker;
-    private final BundleContext bundleContext;
-    private final FlowClassifierTranslator flowClassifierTranslator;
-    private final PortPairTranslator portPairTranslator;
-    private final PortPairGroupTranslator portPairGroupTranslator;
-    private final PortChainTranslator portChainTranslator;
+    private final RenderedServicePathService rspService;
+
     public OpenStackSFCTranslatorProvider(
             final DataBroker dataBroker,
+            final RenderedServicePathService rspService,
             final OpenstackSfcTranslatorConfig openstackSfcTranslatorConfig,
             final BundleContext bundleContext) {
         this.dataBroker = dataBroker;
-        this.bundleContext = bundleContext;
-        flowClassifierTranslator = new FlowClassifierTranslator(dataBroker);
-        portPairTranslator = new PortPairTranslator(dataBroker);
-        portPairGroupTranslator = new PortPairGroupTranslator(dataBroker);
-        portChainTranslator = new PortChainTranslator(dataBroker);
+        this.rspService = rspService;
     }
 
     //This method will be called by blueprint, during bundle initialization.
     public void start() {
         LOG.info("OpenStack SFC Translator Session started");
-        flowClassifierTranslator.start();
-        portPairTranslator.start();
-        portPairGroupTranslator.start();
-        portChainTranslator.start();
+        new NeutronFlowClassifierListener(dataBroker);
+        new NeutronPortPairListener(dataBroker);
+        new NeutronPortPairGroupListener(dataBroker);
+        new NeutronPortChainListener(dataBroker, rspService);
     }
 
     @Override
index a96a11ef5f9d184d77ae0f55322b42b3daee7940..433f2e94207224dc6a94a4ac69afb7b440d0a4bd 100644 (file)
@@ -47,9 +47,18 @@ public class OvsdbMdsalHelper {
         mdsalUtils = new MdsalUtils(this.dataBroker);
     }
 
-    public OvsdbPortMetadata getOvsdbPortMetadata(Uuid ingress) {
-        LOG.info("Extract ovsdb port details for neutron port {}", ingress.getValue());
+    public Topology getOvsdbTopologyTree() {
+        LOG.info("Reading OVSDB Topolog Tree (ovsdb:1)");
+        return mdsalUtils.read(LogicalDatastoreType.OPERATIONAL, topologyPath);
+    }
+
+    public OvsdbPortMetadata getOvsdbPortMetadata(Uuid ingressPort) {
+        LOG.info("Extract ovsdb port details for neutron port {}", ingressPort.getValue());
         Topology ovsdbTopology = mdsalUtils.read(LogicalDatastoreType.OPERATIONAL, topologyPath);
+        return getOvsdbPortMetadata(ingressPort, ovsdbTopology);
+    }
+    public OvsdbPortMetadata getOvsdbPortMetadata(Uuid ingressPort, Topology ovsdbTopology) {
+        LOG.info("Extract ovsdb port details for neutron port {}", ingressPort.getValue());
         OvsdbPortMetadata ovsdbPortMetadata = new OvsdbPortMetadata();
         OvsdbBridgeAugmentation bridgeAugmentation = null;
         if (ovsdbTopology != null) {
@@ -61,7 +70,7 @@ public class OvsdbMdsalHelper {
                                 = tp.getAugmentation(OvsdbTerminationPointAugmentation.class);
                         List<InterfaceExternalIds> externalIds = tpAugmentation.getInterfaceExternalIds();
                         for (InterfaceExternalIds externalId : externalIds) {
-                            if(externalId.getExternalIdValue().equals(ingress.getValue())) {
+                            if(externalId.getExternalIdValue().equals(ingressPort.getValue())) {
                                 ovsdbPortMetadata.setOvsdbPort(tpAugmentation);
                                 break;
                             }
@@ -104,12 +113,16 @@ public class OvsdbMdsalHelper {
         return ovsdbPortMetadata;
     }
 
-    public String getOvsdbPortName(OvsdbTerminationPointAugmentation ovsdbPort) {
+    public static String getOvsdbPortName(OvsdbTerminationPointAugmentation ovsdbPort) {
         return ovsdbPort.getName();
     }
 
-    public String getNodeIpAddress(OvsdbNodeAugmentation ovsdbNode) {
+    public static String getNodeIpAddress(OvsdbNodeAugmentation ovsdbNode) {
         //Currently we support only ipv4
         return ovsdbNode.getConnectionInfo().getRemoteIp().getIpv4Address().getValue();
     }
+
+    public static String getNodeKey(InstanceIdentifier<?> node) {
+        return node.firstKeyOf(Node.class).getNodeId().getValue();
+    }
 }
index 0e84a696f8a8fd974f638550480b4c1b860a9aaa..fa7e41f3822617ed39d1855cfaaf15f0a3ee16d4 100644 (file)
@@ -10,14 +10,18 @@ package org.opendaylight.netvirt.openstack.sfc.translator;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.netvirt.utils.mdsal.utils.MdsalUtils;
-import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SffName;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.ServiceFunctions;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunction;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunctionKey;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.ServiceFunctionChains;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChain;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChainKey;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.ServiceFunctionForwarders;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderKey;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.ServiceFunctionPaths;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPathKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.AccessLists;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.Acl;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.AclKey;
@@ -50,6 +54,7 @@ public class SfcMdsalHelper {
         mdsalUtils = new MdsalUtils(this.dataBroker);
     }
 
+    //ACL Flow Classifier data store utility methods
     public void addAclFlowClassifier(Acl aclFlowClassifier) {
         InstanceIdentifier<Acl> aclIid = getAclPath(aclFlowClassifier.getKey());
         LOG.info("Write ACL FlowClassifier {} to config data store at {}",aclFlowClassifier, aclIid);
@@ -68,6 +73,7 @@ public class SfcMdsalHelper {
         mdsalUtils.delete(LogicalDatastoreType.CONFIGURATION, aclIid);
     }
 
+    //Service Function
     public void addServiceFunction(ServiceFunction sf) {
         InstanceIdentifier<ServiceFunction> sfIid = getSFPath(sf.getKey());
         LOG.info("Write Service Function {} to config data store at {}",sf, sfIid);
@@ -93,7 +99,19 @@ public class SfcMdsalHelper {
         return sfIid.builder().child(ServiceFunction.class, key).build();
     }
 
-    public SffName getExistingSFF(String ipAddress) {
+    private InstanceIdentifier<ServiceFunctionForwarder> getSFFPath(ServiceFunctionForwarderKey key) {
+        return sffIid.builder().child(ServiceFunctionForwarder.class, key).build();
+    }
+
+    private InstanceIdentifier<ServiceFunctionChain> getSFCPath(ServiceFunctionChainKey key) {
+        return sfcIid.builder().child(ServiceFunctionChain.class, key).build();
+    }
+
+    private InstanceIdentifier<ServiceFunctionPath> getSFPPath(ServiceFunctionPathKey key) {
+        return sfpIid.builder().child(ServiceFunctionPath.class, key).build();
+    }
+
+    public ServiceFunctionForwarder getExistingSFF(String ipAddress) {
         ServiceFunctionForwarders existingSffs = mdsalUtils.read(LogicalDatastoreType.CONFIGURATION, sffIid);
         if (existingSffs != null
                 && existingSffs.getServiceFunctionForwarder() != null
@@ -102,10 +120,34 @@ public class SfcMdsalHelper {
             List<ServiceFunctionForwarder> existingSffList = existingSffs.getServiceFunctionForwarder();
             for (ServiceFunctionForwarder sff : existingSffList) {
                 if (sff.getIpMgmtAddress().getIpv4Address().equals(new Ipv4Address(ipAddress))) {
-                    return sff.getName();
+                    return sff;
                 }
             }
         }
         return null;
     }
+
+    public void addServiceFunctionForwarder(ServiceFunctionForwarder sff) {
+        InstanceIdentifier<ServiceFunctionForwarder> sffIid = getSFFPath(sff.getKey());
+        LOG.info("Write Service Function Forwarder {} to config data store at {}",sff, sffIid);
+        mdsalUtils.put(LogicalDatastoreType.CONFIGURATION, sffIid, sff);
+    }
+
+    public void addServiceFunctionChain(ServiceFunctionChain sfc) {
+        InstanceIdentifier<ServiceFunctionChain> sfcIid = getSFCPath(sfc.getKey());
+        LOG.info("Write Service Function Chain {} to config data store at {}",sfc, sfcIid);
+        mdsalUtils.put(LogicalDatastoreType.CONFIGURATION, sfcIid, sfc);
+    }
+
+    public void removeServiceFunctionChain(ServiceFunctionChainKey sfcKey) {
+        InstanceIdentifier<ServiceFunctionChain> sfcIid = getSFCPath(sfcKey);
+        LOG.info("Remove Service Function Chain {} from config data store at {}",sfcKey, sfcIid);
+        mdsalUtils.delete(LogicalDatastoreType.CONFIGURATION, sfcIid);
+    }
+
+    public void addServiceFunctionPath(ServiceFunctionPath sfp) {
+        InstanceIdentifier<ServiceFunctionPath> sfpIid = getSFPPath(sfp.getKey());
+        LOG.info("Write Service Function Path {} to config data store at {}",sfp, sfpIid);
+        mdsalUtils.put(LogicalDatastoreType.CONFIGURATION, sfpIid, sfp);
+    }
 }
index a0ae0e1a5dfb825310b3b3c28bd58640799d24c7..4a970c116e2d51cd1bd44e09c4be25d30946e98b 100644 (file)
@@ -7,31 +7,22 @@
  */
 package org.opendaylight.netvirt.openstack.sfc.translator.flowclassifier;
 
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.netvirt.openstack.sfc.translator.INeutronSfcDataProcessor;
-import org.opendaylight.netvirt.openstack.sfc.translator.NeutronMdsalHelper;
-import org.opendaylight.netvirt.openstack.sfc.translator.SfcMdsalHelper;
-import org.opendaylight.netvirt.utils.mdsal.utils.MdsalUtils;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.AccessLists;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.Ipv4Acl;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.Ipv6Acl;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.Acl;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.AclBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.AclKey;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.AccessListEntries;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.AccessListEntriesBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.Ace;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.AceBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.AceKey;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.ActionsBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.MatchesBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.matches.ace.type.AceIpBuilder;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.AceIpVersion;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.ace.ip.version.AceIpv4Builder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.acl.access.list.entries.ace.matches.ace.type.ace.ip.ace.ip.version.AceIpv6Builder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpPrefix;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160218.acl.transport.header.fields.DestinationPortRange;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160218.acl.transport.header.fields.DestinationPortRangeBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.packet.fields.rev160218.acl.transport.header.fields.SourcePortRangeBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.EthertypeV4;
@@ -39,89 +30,36 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolTcp;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.constants.rev150712.ProtocolUdp;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.flow.classifier.rev160511.sfc.flow.classifiers.attributes.sfc.flow.classifiers.SfcFlowClassifier;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.acl.rev150105.RedirectToSfc;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.sfc.acl.rev150105.RedirectToSfcBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.Closeable;
 import java.util.ArrayList;
 
 /**
  * Class will convert OpenStack Flow Classifier API yang models to
  * OpenDaylight ACL yang models.
  */
-public class FlowClassifierTranslator implements INeutronSfcDataProcessor<SfcFlowClassifier>{
+public class FlowClassifierTranslator {
     private static final Logger LOG = LoggerFactory.getLogger(FlowClassifierTranslator.class);
     private static final Short PROTO_TCP = 6;
     private static final Short PROTO_UDP = 17;
     private static final String RULE = "_rule";
 
-    private final DataBroker db;
-    private NeutronFlowClassifierListener neutronFlowClassifierListener;
-    private final SfcMdsalHelper sfcMdsalHelper;
-    private final NeutronMdsalHelper neutronMdsalHelper;
-
-    public FlowClassifierTranslator(DataBroker db) {
-        this.db = db;
-        sfcMdsalHelper = new SfcMdsalHelper(db);
-        neutronMdsalHelper = new NeutronMdsalHelper(db);
-    }
-
-    public void start() {
-        LOG.info("Flow Classifier Translator Initialized.");
-        if(neutronFlowClassifierListener == null) {
-            neutronFlowClassifierListener = new NeutronFlowClassifierListener(db, this);
-        }
-    }
-
-    /**
-     * Method removes Acl respective to SfcFlowClassifier which is identified by InstanceIdentifier.
-     *
-     * @param path - the whole path to SfcFlowClassifier
-     * @param deletedSfcFlowClassifier        - SfcFlowClassifier for removing
-     */
-    @Override
-    public void remove(InstanceIdentifier<SfcFlowClassifier> path, SfcFlowClassifier deletedSfcFlowClassifier) {
-        Acl aclFlowClassifier = buildAcl(deletedSfcFlowClassifier);
-        sfcMdsalHelper.removeAclFlowClassifier(aclFlowClassifier);
-    }
-
-    /**
-     * Method updates the original SfcFlowClassifier to the update SfcFlowClassifier.
-     * Both are identified by same InstanceIdentifier.
-     *
-     * @param path - the whole path to SfcFlowClassifier
-     * @param originalSfcFlowClassifier   - original SfcFlowClassifier (for update)
-     * @param updatedSfcFlowClassifier     - changed SfcFlowClassifier (contain updates)
-     */
-    @Override
-    public void update(InstanceIdentifier<SfcFlowClassifier> path,
-                       SfcFlowClassifier originalSfcFlowClassifier,
-                       SfcFlowClassifier updatedSfcFlowClassifier) {
-
-        Acl aclFlowClassifier = buildAcl(updatedSfcFlowClassifier);
-        sfcMdsalHelper.updateAclFlowClassifier(aclFlowClassifier);
-    }
-
-    /**
-     * Method adds the SfcFlowClassifier which is identified by InstanceIdentifier
-     * to device.
-     *
-     * @param path - the whole path to new SfcFlowClassifier
-     * @param sfcFlowClassifier        - new SfcFlowClassifier
-     */
-    @Override
-    public void add(InstanceIdentifier<SfcFlowClassifier> path, SfcFlowClassifier sfcFlowClassifier) {
-        Acl aclFlowClassifier = buildAcl(sfcFlowClassifier);
-        sfcMdsalHelper.addAclFlowClassifier(aclFlowClassifier);
+    public static Acl buildAcl(SfcFlowClassifier flowClassifier) {
+        return buildAcl(flowClassifier, null);
     }
-
-    private Acl buildAcl(SfcFlowClassifier flowClassifier) {
+    public static Acl buildAcl(SfcFlowClassifier flowClassifier, String rspName) {
         LOG.info("OpenStack Networkgin SFC pushed Flow classfier : {}", flowClassifier);
         AclBuilder aclBuilder = new AclBuilder();
         AccessListEntriesBuilder accessListEntriesBuilder = new AccessListEntriesBuilder();
         AceBuilder aceBuilder = new AceBuilder();
         MatchesBuilder matchesBuilder = new MatchesBuilder();
+
+        ActionsBuilder actionsBuilder = new ActionsBuilder();
+        RedirectToSfcBuilder redirectToSfcBuilder = new RedirectToSfcBuilder();
+
         AceIpBuilder aceIpBuilder = new AceIpBuilder();
         DestinationPortRangeBuilder destinationPortRange = new DestinationPortRangeBuilder();
         SourcePortRangeBuilder sourcePortRangeBuilder = new SourcePortRangeBuilder();
@@ -201,6 +139,12 @@ public class FlowClassifierTranslator implements INeutronSfcDataProcessor<SfcFlo
 
         matchesBuilder.setAceType(aceIpBuilder.build());
 
+        //Set redirect-to-rsp action if rsp name is provided
+        if (rspName != null) {
+            redirectToSfcBuilder.setRspName(rspName);
+            actionsBuilder.addAugmentation(RedirectToSfc.class, redirectToSfcBuilder.build());
+            aceBuilder.setActions(actionsBuilder.build());
+        }
         aceBuilder.setMatches(matchesBuilder.build());
 
         //OpenStack networking-sfc don't pass action information
index 09854e1c490d66b23d80f8e0711267fb94af6a19..b2446053fa5c626cdd11fe869729af66f6827cc7 100644 (file)
@@ -11,6 +11,8 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.netvirt.openstack.sfc.translator.DelegatingDataTreeListener;
+import org.opendaylight.netvirt.openstack.sfc.translator.SfcMdsalHelper;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.Acl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.flow.classifier.rev160511.sfc.flow.classifiers.attributes.SfcFlowClassifiers;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.flow.classifier.rev160511.sfc.flow.classifiers.attributes.sfc.flow.classifiers.SfcFlowClassifier;
@@ -24,8 +26,54 @@ public class NeutronFlowClassifierListener extends DelegatingDataTreeListener<Sf
     private static final InstanceIdentifier<SfcFlowClassifier> flowClassifiersIid =
             InstanceIdentifier.create(Neutron.class).child(SfcFlowClassifiers.class).child(SfcFlowClassifier.class);
 
-    public NeutronFlowClassifierListener(DataBroker db, FlowClassifierTranslator flowClassifierTranslator) {
-        super(flowClassifierTranslator, db,
-                new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,flowClassifiersIid));
+    private final SfcMdsalHelper sfcMdsalHelper;
+
+    public NeutronFlowClassifierListener(DataBroker db) {
+        super(db, new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION,flowClassifiersIid));
+        sfcMdsalHelper = new SfcMdsalHelper(db);
+
+    }
+
+    /**
+     * Method removes Acl respective to SfcFlowClassifier which is identified by InstanceIdentifier.
+     *
+     * @param path - the whole path to SfcFlowClassifier
+     * @param deletedSfcFlowClassifier        - SfcFlowClassifier for removing
+     */
+    @Override
+    public void remove(InstanceIdentifier<SfcFlowClassifier> path, SfcFlowClassifier deletedSfcFlowClassifier) {
+        Acl aclFlowClassifier = FlowClassifierTranslator.buildAcl(deletedSfcFlowClassifier);
+        sfcMdsalHelper.removeAclFlowClassifier(aclFlowClassifier);
+    }
+
+    /**
+     * Method updates the original SfcFlowClassifier to the update SfcFlowClassifier.
+     * Both are identified by same InstanceIdentifier.
+     *
+     * @param path - the whole path to SfcFlowClassifier
+     * @param originalSfcFlowClassifier   - original SfcFlowClassifier (for update)
+     * @param updatedSfcFlowClassifier     - changed SfcFlowClassifier (contain updates)
+     */
+    @Override
+    public void update(InstanceIdentifier<SfcFlowClassifier> path,
+                       SfcFlowClassifier originalSfcFlowClassifier,
+                       SfcFlowClassifier updatedSfcFlowClassifier) {
+
+        Acl aclFlowClassifier = FlowClassifierTranslator.buildAcl(updatedSfcFlowClassifier);
+        sfcMdsalHelper.updateAclFlowClassifier(aclFlowClassifier);
     }
+
+    /**
+     * Method adds the SfcFlowClassifier which is identified by InstanceIdentifier
+     * to device.
+     *
+     * @param path - the whole path to new SfcFlowClassifier
+     * @param sfcFlowClassifier        - new SfcFlowClassifier
+     */
+    @Override
+    public void add(InstanceIdentifier<SfcFlowClassifier> path, SfcFlowClassifier sfcFlowClassifier) {
+        Acl aclFlowClassifier = FlowClassifierTranslator.buildAcl(sfcFlowClassifier);
+        sfcMdsalHelper.addAclFlowClassifier(aclFlowClassifier);
+    }
+
 }
index 5609da87e6c361dce860a173f0fd9376914400f5..49ca299c6aa2e115015389ffab986c992ac61ef5 100644 (file)
@@ -11,20 +11,268 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.netvirt.openstack.sfc.translator.DelegatingDataTreeListener;
+import org.opendaylight.netvirt.openstack.sfc.translator.NeutronMdsalHelper;
+import org.opendaylight.netvirt.openstack.sfc.translator.OvsdbMdsalHelper;
+import org.opendaylight.netvirt.openstack.sfc.translator.OvsdbPortMetadata;
+import org.opendaylight.netvirt.openstack.sfc.translator.SfcMdsalHelper;
+import org.opendaylight.netvirt.openstack.sfc.translator.flowclassifier.FlowClassifierTranslator;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.CreateRenderedPathInput;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.CreateRenderedPathOutput;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.RenderedServicePathService;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunction;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunctionBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChain;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.access.control.list.rev160218.access.lists.Acl;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.flow.classifier.rev160511.sfc.flow.classifiers.attributes.sfc.flow.classifiers.SfcFlowClassifier;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.PortChains;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.chains.PortChain;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pair.groups.PortPairGroup;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pairs.PortPair;
+import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
 
 /**
  * OpenDaylight Neutron Port Chain yang models data change listener
  */
 public class NeutronPortChainListener extends DelegatingDataTreeListener<PortChain> {
+
+    private static final Logger LOG = LoggerFactory.getLogger(NeutronPortChainListener.class);
+
     private static final InstanceIdentifier<PortChain> portChainIid =
             InstanceIdentifier.create(Neutron.class).child(PortChains.class).child(PortChain.class);
+    private final SfcMdsalHelper sfcMdsalHelper;
+    private final NeutronMdsalHelper neutronMdsalHelper;
+    private final OvsdbMdsalHelper ovsdbMdsalHelper;
+    private final RenderedServicePathService rspService;
+
+    public NeutronPortChainListener(DataBroker db, RenderedServicePathService rspService) {
+        super(db,new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, portChainIid));
+        sfcMdsalHelper = new SfcMdsalHelper(db);
+        neutronMdsalHelper = new NeutronMdsalHelper(db);
+        ovsdbMdsalHelper = new OvsdbMdsalHelper(db);
+        this.rspService = rspService;
+    }
+
+    /**
+     * Method removes PortChain which is identified by InstanceIdentifier.
+     *
+     * @param path - the whole path to PortChain
+     * @param deletedPortChain        - PortChain for removing
+     */
+    @Override
+    public void remove(InstanceIdentifier<PortChain> path, PortChain deletedPortChain) {
+        sfcMdsalHelper.removeServiceFunctionChain(PortChainTranslator.getSFCKey(deletedPortChain));
+    }
+
+    /**
+     * Method updates the original PortChain to the update PortChain.
+     * Both are identified by same InstanceIdentifier.
+     *
+     * @param path - the whole path to PortChain
+     * @param originalPortChain   - original PortChain (for update)
+     * @param updatePortChain     - changed PortChain (contain updates)
+     */
+    @Override
+    public void update(InstanceIdentifier<PortChain> path, PortChain originalPortChain, PortChain updatePortChain) {
+        //TODO: Add support for chain update
+    }
+
+    /**
+     * Method adds the PortChain which is identified by InstanceIdentifier
+     * to device.
+     *
+     * @param path - the whole path to new PortChain
+     * @param newPortChain        - new PortChain
+     */
+    @Override
+    public void add(InstanceIdentifier<PortChain> path, PortChain newPortChain) {
+        processPortChain(newPortChain);
+    }
+
+    private void processPortChain(PortChain newPortChain) {
+        //List of Port Pair Group attached to the Port Chain
+        List<PortPairGroup> portPairGroupList = new ArrayList<>();
+        //Port Pair Group and associated Port Pair
+        Map<Uuid, List<PortPair>> groupPortPairsList = new HashMap<>();
+        //Map of Port Pair uuid and Port pair ingress port related Neutron Port
+        Map<Uuid, Port> portPairToNeutronPortMap = new HashMap<>();
+
+        //Mapping of Port Pair UUID and OvsdbPortMetadata of the port pair ingress port
+        Map<Uuid, OvsdbPortMetadata> portPairOvsdbMetadata = new HashMap<>();
+
+        Map<Uuid, ServiceFunctionForwarderBuilder> portPairGroupToSFFMap = new HashMap<>();
+        List<ServiceFunction> portChainServiceFunctionList = new ArrayList<>();
+
+        //Read chain related port pair group, port pair and neutron port from neutron data store
+        for (Uuid ppgUuid : newPortChain.getPortPairGroups()) {
+            PortPairGroup ppg = neutronMdsalHelper.getNeutronPortPairGroup(ppgUuid);
+            if (ppg != null) {
+                List<PortPair> portPairList = new ArrayList<>();
+                portPairGroupList.add(ppg);
+                for(Uuid ppUuid : ppg.getPortPairs()) {
+                    PortPair pp = neutronMdsalHelper.getNeutronPortPair(ppgUuid);
+                    if (pp != null) {
+                        portPairList.add(pp);
+                        //NOTE:Assuming that ingress and egress port is same.
+                        Port neutronPort = neutronMdsalHelper.getNeutronPort(pp.getIngress());
+                        if (neutronPort != null) {
+                            portPairToNeutronPortMap.put(ppgUuid, neutronPort);
+                        }
+                    }
+                }
+                groupPortPairsList.put(ppgUuid, portPairList);
+            }
+        }
+
+        Topology ovsdbTopology = ovsdbMdsalHelper.getOvsdbTopologyTree();
+
+        //Read ovsdb port details related to neutron port. Each Port pair has two neutron port
+        //With the current implementation, i am assuming that we support SF only with single port
+        //that act as a ingress as well as egress.
+        for(Map.Entry<Uuid, Port> neutronPortEntry : portPairToNeutronPortMap.entrySet()) {
+            OvsdbPortMetadata ovsdbPortMetadata =
+                    ovsdbMdsalHelper.getOvsdbPortMetadata(
+                            neutronPortEntry.getValue().getKey().getUuid(),
+                            ovsdbTopology);
+
+            if(ovsdbPortMetadata != null) {
+                portPairOvsdbMetadata.put(neutronPortEntry.getKey(), ovsdbPortMetadata);
+            }
+        }
+
+        //For each port pair group
+        for (PortPairGroup ppg : portPairGroupList) {
+            List<ServiceFunctionBuilder> portPairSFList = new ArrayList<>();
+
+            List<PortPair> portPairList =  groupPortPairsList.get(ppg.getUuid());
+            Map<Uuid, OvsdbPortMetadata> metadataList = new HashMap<>();
+            //Generate OvsdbPortMetadata for list of all the port pair
+            for (PortPair portPair : portPairList) {
+                OvsdbPortMetadata metadata = portPairOvsdbMetadata.get(portPair.getIngress());
+
+                if (metadata != null) {
+                    metadataList.put(portPair.getIngress(), metadata);
+                }
+            }
+
+            //Build the SFF Builder from port pair group
+            ServiceFunctionForwarderBuilder sffBuilder =
+                    PortPairGroupTranslator.buildServiceFunctionForwarder(ppg,portPairList, metadataList);
+
+            //Check if SFF already exist
+            ServiceFunctionForwarder existingSff =
+                    sfcMdsalHelper.getExistingSFF(sffBuilder.getIpMgmtAddress().getIpv4Address().getValue());
+            if(existingSff != null) {
+                LOG.info("SFF already exist for Port Pair Group {}. Existing SFF is {}",ppg, existingSff);
+                sffBuilder = new ServiceFunctionForwarderBuilder(existingSff);
+            }
+            //Add SFF builder to the map for later reference
+            portPairGroupToSFFMap.put(ppg.getUuid(), sffBuilder);
+
+            //Generate all the SF and write it to SFC data store
+            for (PortPair portPair : portPairList) {
+                OvsdbPortMetadata metadata = portPairOvsdbMetadata.get(portPair.getIngress());
+                //Build the service function for the given port pair.
+                ServiceFunctionBuilder sfBuilder = PortPairTranslator.buildServiceFunction(portPair,
+                        ppg,
+                        portPairToNeutronPortMap.get(portPair.getIngress()),
+                        metadata,
+                        sffBuilder.build());
+
+                if (sfBuilder != null) {
+                    //Write the Service Function to SFC data store.
+                    sfcMdsalHelper.addServiceFunction(sfBuilder.build());
+
+                    //Add to the list, to populated SFF Service Function Dictionary
+                    portPairSFList.add(sfBuilder);
+
+                    //Add the SF to Port Chain related SF list
+                    portChainServiceFunctionList.add(sfBuilder.build());
+                } else {
+                    LOG.warn("Service Function building failed for Port Pair {}", portPair);
+                }
+            }
+
+            //Update the Service Function Dictionary of SFF
+            for (ServiceFunctionBuilder sf : portPairSFList) {
+                PortPairGroupTranslator.buildServiceFunctionDictonary(sffBuilder, sf.build());
+            }
+            // Send SFF create request
+            LOG.info("Add Service Function Forwarder {} for Port Pair Group {}", sffBuilder.build(), ppg);
+            sfcMdsalHelper.addServiceFunctionForwarder(sffBuilder.build());
+        }
+        //Build Service Function Chain Builder
+        ServiceFunctionChain sfc =
+                PortChainTranslator.buildServiceFunctionChain(newPortChain, portChainServiceFunctionList);
+
+        //Write SFC to data store
+        if (sfc != null) {
+            sfcMdsalHelper.addServiceFunctionChain(sfc);
+        } else {
+            LOG.warn("Service Function Chain building failed for Port Chain {}", newPortChain);
+        }
+
+        // Build Service Function Path Builder
+        ServiceFunctionPath sfp = PortChainTranslator.buildServiceFunctionPath(sfc);
+        //Write SFP to data store
+        if (sfp != null) {
+           sfcMdsalHelper.addServiceFunctionPath(sfp);
+        } else {
+            LOG.warn("Service Function Path building failed for Service Chain {}", sfc);
+        }
+
+        //TODO:Generate Flow Classifiers and augment RSP on it.
+
+        if (this.rspService != null) {
+            // Build Create Rendered Service Path input
+            CreateRenderedPathInput rpInput = PortChainTranslator.buildRenderedServicePathInput(sfp);
+
+            //Call Create Rendered Service Path RPC call
+            if (rpInput != null) {
+                Future<RpcResult<CreateRenderedPathOutput>> result =  this.rspService.createRenderedPath(rpInput);
+                try {
+                    result.get();
+                    processFlowClassifiers(newPortChain, newPortChain.getFlowClassifiers(), rpInput.getName());
+                } catch (InterruptedException | ExecutionException e) {
+                    LOG.error("Error occurred during creating Rendered Service Path using RPC call", e);
+                }
+            }
+        } else {
+            LOG.error("Rendered Path Service is not available, can't create Rendered Path for Port Chain", newPortChain);
+        }
+    }
+
+    private void processFlowClassifiers(PortChain pc, List<Uuid> flowClassifiers, String rspName) {
+        for (Uuid uuid : flowClassifiers) {
+            SfcFlowClassifier fc = neutronMdsalHelper.getNeutronFlowClassifier(uuid);
+            if (fc != null) {
+                Acl acl = FlowClassifierTranslator.buildAcl(fc, rspName);
+                if (acl != null ) {
+                    sfcMdsalHelper.addAclFlowClassifier(acl);
+                } else {
+                    LOG.warn("Acl building failed for flow classifier {}. Traffic might not be redirected to RSP", fc);
+                }
 
-    public NeutronPortChainListener(DataBroker db, PortChainTranslator portChainTranslator) {
-        super(portChainTranslator, db,
-                new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, portChainIid));
+            } else {
+                LOG.error("Neutron Flow Classifier {} attached to Port Chain {} is not present in the neutron data " +
+                        "store", uuid, pc);
+            }
+        }
     }
 }
index 26f4a8f21973aa36d2fcdd94078410fdf93fe7f8..d39b10a8bd85404720def33bae4eaa93f9b4dacb 100644 (file)
@@ -17,14 +17,51 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.a
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 
 /**
- * OpenDaylight Neutron Port Group yang models data change listener
+ * OpenDaylight Neutron Port Pair Group yang models data change listener
  */
 public class NeutronPortPairGroupListener extends DelegatingDataTreeListener<PortPairGroup> {
     private static final InstanceIdentifier<PortPairGroup> portPairGroupIid =
             InstanceIdentifier.create(Neutron.class).child(PortPairGroups.class).child(PortPairGroup.class);
 
-    public NeutronPortPairGroupListener(DataBroker db, PortPairGroupTranslator portPairGroupTranslator) {
-        super(portPairGroupTranslator, db,
-                new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, portPairGroupIid));
+    public NeutronPortPairGroupListener(DataBroker db) {
+        super(db,new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, portPairGroupIid));
+    }
+
+    /**
+     * Method removes PortPairGroup which is identified by InstanceIdentifier.
+     *
+     * @param path - the whole path to PortPairGroup
+     * @param deletedPortPairGroup        - PortPairGroup for removing
+     */
+    @Override
+    public void remove(InstanceIdentifier<PortPairGroup> path, PortPairGroup deletedPortPairGroup) {
+        //NO-OP
+    }
+
+    /**
+     * Method updates the original PortPairGroup to the update PortPairGroup.
+     * Both are identified by same InstanceIdentifier.
+     *
+     * @param path - the whole path to PortPairGroup
+     * @param originalPortPairGroup   - original PortPairGroup (for update)
+     * @param updatePortPairGroup     - changed PortPairGroup (contain updates)
+     */
+    @Override
+    public void update(InstanceIdentifier<PortPairGroup> path,
+                       PortPairGroup originalPortPairGroup,
+                       PortPairGroup updatePortPairGroup) {
+        //NO-OP
+    }
+
+    /**
+     * Method adds the PortPairGroup which is identified by InstanceIdentifier
+     * to device.
+     *
+     * @param path - the whole path to new PortPairGroup
+     * @param newPortPairGroup        - new PortPairGroup
+     */
+    @Override
+    public void add(InstanceIdentifier<PortPairGroup> path, PortPairGroup newPortPairGroup) {
+        //NO-OP
     }
 }
index f917d12085efe650477c90e8ee0fbd62ec8b8a9d..aab654518931a02eb362ccdb22ea918c91d7a2de 100644 (file)
@@ -11,6 +11,9 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.netvirt.openstack.sfc.translator.DelegatingDataTreeListener;
+import org.opendaylight.netvirt.openstack.sfc.translator.NeutronMdsalHelper;
+import org.opendaylight.netvirt.openstack.sfc.translator.OvsdbMdsalHelper;
+import org.opendaylight.netvirt.openstack.sfc.translator.SfcMdsalHelper;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.PortPairs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pairs.PortPair;
@@ -23,8 +26,54 @@ public class NeutronPortPairListener extends DelegatingDataTreeListener<PortPair
     private static final InstanceIdentifier<PortPair> portPairIid =
             InstanceIdentifier.create(Neutron.class).child(PortPairs.class).child(PortPair.class);
 
-    public NeutronPortPairListener(DataBroker db, PortPairTranslator portPairTranslator) {
-        super(portPairTranslator, db,
-                new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, portPairIid));
+    private final DataBroker db;
+    private final SfcMdsalHelper sfcMdsalHelper;
+    private final NeutronMdsalHelper neutronMdsalHelper;
+    private final OvsdbMdsalHelper ovsdbMdsalHelper;
+
+    public NeutronPortPairListener(DataBroker db) {
+        super(db,new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, portPairIid));
+        this.db = db;
+        sfcMdsalHelper = new SfcMdsalHelper(db);
+        neutronMdsalHelper = new NeutronMdsalHelper(db);
+        ovsdbMdsalHelper = new OvsdbMdsalHelper(db);
+    }
+
+    /**
+     * Method removes PortPair which is identified by InstanceIdentifier.
+     *
+     * @param path - the whole path to PortPair
+     * @param deletedPortPair        - PortPair for removing
+     */
+    @Override
+    public void remove(InstanceIdentifier<PortPair> path, PortPair deletedPortPair) {
+        sfcMdsalHelper.removeServiceFunction(PortPairTranslator.getSFKey(deletedPortPair));
+    }
+
+    /**
+     * Method updates the original PortPair to the update PortPair.
+     * Both are identified by same InstanceIdentifier.
+     *
+     * @param path - the whole path to PortPair
+     * @param originalPortPair   - original PortPair (for update)
+     * @param updatePortPair     - changed PortPair (contain updates)
+     */
+    @Override
+    public void update(InstanceIdentifier<PortPair> path, PortPair originalPortPair, PortPair updatePortPair) {
+        //NO-OP
+    }
+
+    /**
+     * Method adds the PortPair which is identified by InstanceIdentifier
+     * to device.
+     *
+     * @param path - the whole path to new PortPair
+     * @param newPortPair        - new PortPair
+     */
+    @Override
+    public void add(InstanceIdentifier<PortPair> path, PortPair newPortPair) {
+        //NO-OP
+        // Port Pair data written in neutron data store will be used
+        // When user will create port chain.
     }
 }
index a61a0c6d1f29c3575453ee43ef4159d0e0e7ed1e..c20572df38ed94d7e325f22e572bce11a890ceb2 100644 (file)
@@ -7,73 +7,94 @@
  */
 package org.opendaylight.netvirt.openstack.sfc.translator.portchain;
 
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.netvirt.openstack.sfc.translator.INeutronSfcDataProcessor;
-import org.opendaylight.netvirt.openstack.sfc.translator.NeutronMdsalHelper;
-import org.opendaylight.netvirt.openstack.sfc.translator.SfcMdsalHelper;
+import com.google.common.base.Preconditions;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfcName;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfpName;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.CreateRenderedPathInput;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.CreateRenderedPathInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunction;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChain;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChainBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.ServiceFunctionChainKey;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.service.function.chain.SfcServiceFunction;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.service.function.chain.SfcServiceFunctionBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfc.rev140701.service.function.chain.grouping.service.function.chain.SfcServiceFunctionKey;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPath;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sfp.rev140701.service.function.paths.ServiceFunctionPathBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.port.chain.attributes.ChainParameters;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.chains.PortChain;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * Class will convert OpenStack Port Chain API yang models present in
  * neutron northbound project to OpenDaylight SFC yang models.
  */
-public class PortChainTranslator implements INeutronSfcDataProcessor<PortChain> {
+public class PortChainTranslator {
     private static final Logger LOG = LoggerFactory.getLogger(PortChainTranslator.class);
+    private static final String SYMMETRIC_PARAM = "symmetric";
+    private static final String SFP_NAME_PREFIX = "Path-";
 
-    private final DataBroker db;
-    private NeutronPortChainListener neutronPortChainListener;
-    private final SfcMdsalHelper sfcMdsalHelper;
-    private final NeutronMdsalHelper neutronMdsalHelper;
+    public static ServiceFunctionChain buildServiceFunctionChain(
+            PortChain portChain, List<ServiceFunction> sfList) {
+        ServiceFunctionChainBuilder sfcBuilder = new ServiceFunctionChainBuilder();
+        sfcBuilder.setName(new SfcName(portChain.getName()));
+        sfcBuilder.setKey(new ServiceFunctionChainKey(sfcBuilder.getName()));
 
-    public PortChainTranslator(DataBroker db) {
-        this.db = db;
-        sfcMdsalHelper = new SfcMdsalHelper(db);
-        neutronMdsalHelper = new NeutronMdsalHelper(db);
-    }
+        //By default set it to false. If user specify it in chain parameters, it
+        //will be overridden.
+        sfcBuilder.setSymmetric(false);
 
-    public void start() {
-        LOG.info("Port Chain Translator Initialized.");
-        if(neutronPortChainListener == null) {
-            neutronPortChainListener = new NeutronPortChainListener(db, this);
+        //Set service functions
+        List<SfcServiceFunction> sfcSfList = new ArrayList<>();
+        for(ServiceFunction sf : sfList) {
+            SfcServiceFunctionBuilder sfcSfBuilder = new SfcServiceFunctionBuilder();
+            sfcSfBuilder.setName(sf.getName().getValue());
+            sfcSfBuilder.setType(sf.getType());
+            sfcSfBuilder.setKey(new SfcServiceFunctionKey(sfcSfBuilder.getName()));
+
+            //NOTE: no explicit order is set.
+            sfcSfList.add(sfcSfBuilder.build());
+        }
+        List<ChainParameters> cpList = portChain.getChainParameters();
+        if (cpList != null && !cpList.isEmpty()) {
+            for (ChainParameters cp : cpList) {
+                if(cp.getChainParameter().equals(SYMMETRIC_PARAM)) {
+                    //Override the symmetric default value.
+                    sfcBuilder.setSymmetric(new Boolean(cp.getChainParameterValue()));
+                    break;
+                }
+            }
         }
+        sfcBuilder.setSfcServiceFunction(sfcSfList);
+        return sfcBuilder.build();
     }
 
-    /**
-     * Method removes PortChain which is identified by InstanceIdentifier.
-     *
-     * @param path - the whole path to PortChain
-     * @param deletedPortChain        - PortChain for removing
-     */
-    @Override
-    public void remove(InstanceIdentifier<PortChain> path, PortChain deletedPortChain) {
+    public static ServiceFunctionPath buildServiceFunctionPath(ServiceFunctionChain sfc) {
+        Preconditions.checkNotNull(sfc, "Service Function Chain must not be null");
+        ServiceFunctionPathBuilder sfpBuilder = new ServiceFunctionPathBuilder();
 
-    }
-
-    /**
-     * Method updates the original PortChain to the update PortChain.
-     * Both are identified by same InstanceIdentifier.
-     *
-     * @param path - the whole path to PortChain
-     * @param originalPortChain   - original PortChain (for update)
-     * @param updatePortChain     - changed PortChain (contain updates)
-     */
-    @Override
-    public void update(InstanceIdentifier<PortChain> path, PortChain originalPortChain, PortChain updatePortChain) {
+        //Set the name
+        sfpBuilder.setName(new SfpName(SFP_NAME_PREFIX + sfc.getName().getValue()));
 
+        sfpBuilder.setSymmetric(sfc.isSymmetric());
+        //Set related SFC name
+        sfpBuilder.setServiceChainName(sfc.getName());
+        return sfpBuilder.build();
     }
 
-    /**
-     * Method adds the PortChain which is identified by InstanceIdentifier
-     * to device.
-     *
-     * @param path - the whole path to new PortChain
-     * @param newPortChain        - new PortChain
-     */
-    @Override
-    public void add(InstanceIdentifier<PortChain> path, PortChain newPortChain) {
+    public static CreateRenderedPathInput buildRenderedServicePathInput(ServiceFunctionPath sfp) {
+        CreateRenderedPathInputBuilder rpInputBuilder = new CreateRenderedPathInputBuilder();
+        rpInputBuilder.setName(sfp.getName().getValue());
+        rpInputBuilder.setSymmetric(sfp.isSymmetric());
+        rpInputBuilder.setParentServiceFunctionPath(sfp.getName().getValue());
+        return rpInputBuilder.build();
+    }
 
+    public static ServiceFunctionChainKey getSFCKey(PortChain portChain) {
+        return new ServiceFunctionChainKey(new SfcName(portChain.getName()));
     }
 }
index 0185493b6e3f6e654380133d318fe9b19e1a5081..25a1b94f330cd116e2219f7e0cdc7e6ece774b81 100644 (file)
  */
 package org.opendaylight.netvirt.openstack.sfc.translator.portchain;
 
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.netvirt.openstack.sfc.translator.INeutronSfcDataProcessor;
-import org.opendaylight.netvirt.openstack.sfc.translator.NeutronMdsalHelper;
-import org.opendaylight.netvirt.openstack.sfc.translator.SfcMdsalHelper;
+import com.google.common.base.Preconditions;
+import org.opendaylight.netvirt.openstack.sfc.translator.OvsdbMdsalHelper;
+import org.opendaylight.netvirt.openstack.sfc.translator.OvsdbPortMetadata;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SffName;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SnName;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunction;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.SffOvsBridgeAugmentation;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.SffOvsBridgeAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.SffOvsLocatorOptionsAugmentation;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.SffOvsLocatorOptionsAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.SffOvsNodeAugmentation;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.SffOvsNodeAugmentationBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.bridge.OvsBridgeBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.node.OvsNodeBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.ovs.rev140701.options.OvsOptionsBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.Open;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.SffDataPlaneLocator;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.SffDataPlaneLocatorBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.sff.data.plane.locator.DataPlaneLocatorBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarderKey;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.ServiceFunctionDictionary;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.ServiceFunctionDictionaryBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.ServiceFunctionDictionaryKey;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.service.function.forwarder.service.function.dictionary.SffSfDataPlaneLocatorBuilder;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.VxlanGpe;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.data.plane.locator.locator.type.IpBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pair.groups.PortPairGroup;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pairs.PortPair;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicInteger;
+
 /**
  * Class will convert OpenStack Port Pair API yang models present in
  * neutron northbound project to OpenDaylight SFC yang models.
  */
-public class PortPairGroupTranslator implements INeutronSfcDataProcessor<PortPairGroup> {
+public class PortPairGroupTranslator {
     private static final Logger LOG = LoggerFactory.getLogger(PortPairGroupTranslator.class);
+    private static final String OPT_FLOW_STR = "flow";
+    private static final String OPT_DST_PORT = "6633";
 
-    private final DataBroker db;
-    private NeutronPortPairGroupListener neutronPortPairGroupListener;
-    private final SfcMdsalHelper sfcMdsalHelper;
-    private final NeutronMdsalHelper neutronMdsalHelper;
+    private static final AtomicInteger counter = new AtomicInteger(0);
+    private static final String SFF_DEFAULT_NAME = "sff";
 
-    public PortPairGroupTranslator(DataBroker db) {
-        this.db = db;
-        sfcMdsalHelper = new SfcMdsalHelper(db);
-        neutronMdsalHelper = new NeutronMdsalHelper(db);
-    }
+    public static ServiceFunctionForwarderBuilder buildServiceFunctionForwarder(
+            PortPairGroup portPairGroup,
+            List<PortPair> portPairs,
+            Map<Uuid, OvsdbPortMetadata> ovsdbPortsMetadata) {
+        Preconditions.checkNotNull(portPairGroup, "Port pair group must not be null");
+
+        ServiceFunctionForwarderBuilder sffBuilder = new ServiceFunctionForwarderBuilder();
+        SffOvsBridgeAugmentationBuilder sffOvsBridgeAugBuilder = new SffOvsBridgeAugmentationBuilder();
+        SffOvsNodeAugmentationBuilder sffOvsNodeAugBuilder = new SffOvsNodeAugmentationBuilder();
+
+        List<SffDataPlaneLocator> sffDataPlaneLocator = new ArrayList<>();
+        SffDataPlaneLocatorBuilder sffDplBuilder = new SffDataPlaneLocatorBuilder();
+        DataPlaneLocatorBuilder dplBuilder = new DataPlaneLocatorBuilder();
 
-    public void start() {
-        LOG.info("Port Pair Group Translator Initialized.");
-        if(neutronPortPairGroupListener == null) {
-            neutronPortPairGroupListener = new NeutronPortPairGroupListener(db, this);
+        IpBuilder sffLocator = new IpBuilder();
+
+        //Currently we only support one SF per type. Mean, one port-pair per port-pair-group.
+        //Get port pair from neutron data store.
+        PortPair portPair = portPairs.get(0);
+        if (portPair == null) {
+           LOG.error("Port pair {} does not exist in the neutron data store. Port Pair Group {} request can't be " +
+                   "processed.", portPairGroup.getPortPairs().get(0), portPairGroup);
+            return null;
         }
-    }
+        //Get metadata of neutron port related to port pair ingress port from ovsdb data store.
+        OvsdbPortMetadata ovsdbPortMetadata = ovsdbPortsMetadata.get(portPair.getIngress());
 
-    /**
-     * Method removes PortPairGroup which is identified by InstanceIdentifier.
-     *
-     * @param path - the whole path to PortPairGroup
-     * @param deletedPortPairGroup        - PortPairGroup for removing
-     */
-    @Override
-    public void remove(InstanceIdentifier<PortPairGroup> path, PortPairGroup deletedPortPairGroup) {
+        //Convert the port pair to service function
 
-    }
+        //Set SFF DPL transport type
+        dplBuilder.setTransport(VxlanGpe.class);
 
-    /**
-     * Method updates the original PortPairGroup to the update PortPairGroup.
-     * Both are identified by same InstanceIdentifier.
-     *
-     * @param path - the whole path to PortPairGroup
-     * @param originalPortPairGroup   - original PortPairGroup (for update)
-     * @param updatePortPairGroup     - changed PortPairGroup (contain updates)
-     */
-    @Override
-    public void update(InstanceIdentifier<PortPairGroup> path,
-                       PortPairGroup originalPortPairGroup,
-                       PortPairGroup updatePortPairGroup) {
+        //Set SFF Locator Type
+        OvsdbNodeAugmentation ovsdbNodeAug = ovsdbPortMetadata.getOvsdbNode();
+        if (ovsdbNodeAug != null ) {
+            sffLocator.setIp(ovsdbNodeAug.getConnectionInfo().getRemoteIp());
+            sffLocator.setPort(ovsdbNodeAug.getConnectionInfo().getRemotePort());
+        }
+        dplBuilder.setLocatorType(sffLocator.build());
+        //set data-path-locator for sff-data-path-locator
+        sffDplBuilder.setDataPlaneLocator(dplBuilder.build());
+
+        //Set location options for sff-dp-locator
+        sffDplBuilder.addAugmentation(SffOvsLocatorOptionsAugmentation.class, buildOvsOptions().build());
+
+        //Set ovsdb bridge name for sff
+        OvsBridgeBuilder ovsBridgeBuilder = new OvsBridgeBuilder();
+        OvsdbBridgeAugmentation ovsdbBridgeAugmentation = ovsdbPortMetadata.getOvsdbBridgeNode();
+        if (ovsdbBridgeAugmentation != null) {
+            ovsBridgeBuilder.setBridgeName(ovsdbBridgeAugmentation.getBridgeName().getValue());
 
+            //Set SFF name
+            String serviceNode = OvsdbMdsalHelper.getNodeKey(ovsdbBridgeAugmentation.getManagedBy().getValue());
+            if(serviceNode.isEmpty()) {
+                serviceNode += SFF_DEFAULT_NAME + counter.incrementAndGet();
+                sffBuilder.setName(new SffName(serviceNode));
+                sffBuilder.setServiceNode(new SnName(serviceNode));
+            } else {
+                //Set service node to ovsdbNode
+                sffBuilder.setServiceNode(new SnName(serviceNode));
+
+                //Set SFF name to ovsdbBridgeNode
+                serviceNode += "/" + ovsdbBridgeAugmentation.getBridgeName().getValue();
+                sffBuilder.setName(new SffName(serviceNode));
+            }
+
+            //Set ovsdb-node iid reference for SFF
+            OvsNodeBuilder ovsNodeBuilder = new OvsNodeBuilder();
+            ovsNodeBuilder.setNodeId(ovsdbBridgeAugmentation.getManagedBy());
+            sffOvsNodeAugBuilder.setOvsNode(ovsNodeBuilder.build());
+            sffBuilder.addAugmentation(SffOvsNodeAugmentation.class, sffOvsNodeAugBuilder.build());
+        }
+        sffOvsBridgeAugBuilder.setOvsBridge(ovsBridgeBuilder.build());
+        sffBuilder.addAugmentation(SffOvsBridgeAugmentation.class, sffOvsBridgeAugBuilder.build());
+
+        //Set management ip, same to the ovsdb  node ip
+        sffBuilder.setIpMgmtAddress(sffLocator.getIp());
+
+        sffDataPlaneLocator.add(sffDplBuilder.build());
+        //set SFF key
+        sffBuilder.setKey(new ServiceFunctionForwarderKey(sffBuilder.getName()));
+        sffBuilder.setSffDataPlaneLocator(sffDataPlaneLocator);
+
+        return sffBuilder;
     }
 
-    /**
-     * Method adds the PortPairGroup which is identified by InstanceIdentifier
-     * to device.
-     *
-     * @param path - the whole path to new PortPairGroup
-     * @param newPortPairGroup        - new PortPairGroup
-     */
-    @Override
-    public void add(InstanceIdentifier<PortPairGroup> path, PortPairGroup newPortPairGroup) {
+    public static void buildServiceFunctionDictonary(ServiceFunctionForwarderBuilder sffBuilder,
+                                                                           ServiceFunction sf) {
+        List<ServiceFunctionDictionary> sfdList = new ArrayList<>();
+        ServiceFunctionDictionaryBuilder sfdBuilder = new ServiceFunctionDictionaryBuilder();
+
+        //Build Sff-sf-data-plane-locator
+        SffSfDataPlaneLocatorBuilder sffSfDplBuilder = new SffSfDataPlaneLocatorBuilder();
+        sffSfDplBuilder.setSfDplName(sf.getSfDataPlaneLocator().get(0).getName());
+        sffSfDplBuilder.setSffDplName(sffBuilder.getSffDataPlaneLocator().get(0).getName());
+        sfdBuilder.setSffSfDataPlaneLocator(sffSfDplBuilder.build());
+
+        sfdBuilder.setName(sf.getName());
+        sfdBuilder.setKey(new ServiceFunctionDictionaryKey(sfdBuilder.getName()));
+
+        //NOTE: fail mode is set to Open by default
+        sfdBuilder.setFailmode(Open.class);
+
+        //TODO: set interface name list
+
+        for (Iterator<ServiceFunctionDictionary> sfdItr = sffBuilder.getServiceFunctionDictionary().iterator();sfdItr
+                .hasNext();) {
+            ServiceFunctionDictionary sfd = sfdItr.next();
+            if (sfd.getName().equals(sfdBuilder.getName())) {
+                LOG.info("Existing SF dictionary {} found in SFF {}, removing the SF dictionary", sfd.getName(),
+                        sffBuilder.getName());
+                sfdItr.remove();
+                break;
+            }
+        }
+        sfdList.add(sfdBuilder.build());
+
+        if (sffBuilder.getServiceFunctionDictionary() != null) {
+            sffBuilder.getServiceFunctionDictionary().addAll(sfdList);
+        } else {
+            sffBuilder.setServiceFunctionDictionary(sfdList);
+        }
+        LOG.info("Final Service Function Dictionary {}", sffBuilder.getServiceFunctionDictionary());
+    }
 
+    private static SffOvsLocatorOptionsAugmentationBuilder buildOvsOptions() {
+        SffOvsLocatorOptionsAugmentationBuilder ovsOptions = new SffOvsLocatorOptionsAugmentationBuilder();
+        OvsOptionsBuilder ovsOptionsBuilder = new OvsOptionsBuilder();
+        ovsOptionsBuilder.setRemoteIp(OPT_FLOW_STR);
+        ovsOptionsBuilder.setDstPort(OPT_DST_PORT);
+        ovsOptionsBuilder.setKey(OPT_FLOW_STR);
+        ovsOptionsBuilder.setNsp(OPT_FLOW_STR);
+        ovsOptionsBuilder.setNsi(OPT_FLOW_STR);
+        ovsOptionsBuilder.setNshc1(OPT_FLOW_STR);
+        ovsOptionsBuilder.setNshc2(OPT_FLOW_STR);
+        ovsOptionsBuilder.setNshc3(OPT_FLOW_STR);
+        ovsOptionsBuilder.setNshc4(OPT_FLOW_STR);
+        ovsOptions.setOvsOptions(ovsOptionsBuilder.build());
+        return ovsOptions;
     }
 }
index dbb48f01460143dd6bf74f6d58cfdb372af7c25a..e16ca14372a4a08c757cd3ab2b4f602a4c4888cb 100644 (file)
@@ -7,13 +7,10 @@
  */
 package org.opendaylight.netvirt.openstack.sfc.translator.portchain;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableBiMap;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.netvirt.openstack.sfc.translator.INeutronSfcDataProcessor;
-import org.opendaylight.netvirt.openstack.sfc.translator.NeutronMdsalHelper;
 import org.opendaylight.netvirt.openstack.sfc.translator.OvsdbMdsalHelper;
 import org.opendaylight.netvirt.openstack.sfc.translator.OvsdbPortMetadata;
-import org.opendaylight.netvirt.openstack.sfc.translator.SfcMdsalHelper;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfDataPlaneLocatorName;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SfName;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev151017.SffName;
@@ -22,9 +19,9 @@ import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.common.rev1
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.function.base.SfDataPlaneLocator;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.function.base.SfDataPlaneLocatorBuilder;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.function.base.SfDataPlaneLocatorKey;
-import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunction;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunctionBuilder;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sf.rev140701.service.functions.ServiceFunctionKey;
+import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarders.ServiceFunctionForwarder;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.SlTransportType;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.VxlanGpe;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.data.plane.locator.locator.type.IpBuilder;
@@ -37,8 +34,8 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.port.attributes.AllowedAddressPairs;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.port.pair.attributes.ServiceFunctionParameters;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pair.groups.PortPairGroup;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.sfc.rev160511.sfc.attributes.port.pairs.PortPair;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -50,7 +47,7 @@ import java.util.concurrent.atomic.AtomicInteger;
  * Class will convert OpenStack Port Pair API yang models present in
  * neutron northbound project to OpenDaylight SFC Service Function yang models.
  */
-public class PortPairTranslator implements INeutronSfcDataProcessor<PortPair> {
+public class PortPairTranslator {
     private static final Logger LOG = LoggerFactory.getLogger(PortPairTranslator.class);
     private static final String NSH_AWARE_PARAM = "nsh-aware";
     private static final String SF_TYPE_PARAM = "type";
@@ -67,65 +64,15 @@ public class PortPairTranslator implements INeutronSfcDataProcessor<PortPair> {
     private static final AtomicInteger counter = new AtomicInteger(0);
     private static final String SFF_NAME_PARAM = "sff-name";
 
-    private final DataBroker db;
-    private NeutronPortPairListener neutronPortPairListener;
-    private final SfcMdsalHelper sfcMdsalHelper;
-    private final NeutronMdsalHelper neutronMdsalHelper;
-    private final OvsdbMdsalHelper ovsdbMdsalHelper;
-
-    public PortPairTranslator(DataBroker db) {
-        this.db = db;
-        sfcMdsalHelper = new SfcMdsalHelper(db);
-        neutronMdsalHelper = new NeutronMdsalHelper(db);
-        ovsdbMdsalHelper = new OvsdbMdsalHelper(db);
-    }
-
-    public void start() {
-        LOG.info("Port Pair Translator Initialized.");
-        if(neutronPortPairListener == null) {
-            neutronPortPairListener = new NeutronPortPairListener(db, this);
-        }
-    }
-
-    /**
-     * Method removes PortPair which is identified by InstanceIdentifier.
-     *
-     * @param path - the whole path to PortPair
-     * @param deletedPortPair        - PortPair for removing
-     */
-    @Override
-    public void remove(InstanceIdentifier<PortPair> path, PortPair deletedPortPair) {
-        sfcMdsalHelper.removeServiceFunction(getSFKey(deletedPortPair));
-    }
-
-    /**
-     * Method updates the original PortPair to the update PortPair.
-     * Both are identified by same InstanceIdentifier.
-     *
-     * @param path - the whole path to PortPair
-     * @param originalPortPair   - original PortPair (for update)
-     * @param updatePortPair     - changed PortPair (contain updates)
-     */
-    @Override
-    public void update(InstanceIdentifier<PortPair> path, PortPair originalPortPair, PortPair updatePortPair) {
-        ServiceFunction sf = buildServiceFunction(updatePortPair);
-        sfcMdsalHelper.updateServiceFunction(sf);
-    }
-
-    /**
-     * Method adds the PortPair which is identified by InstanceIdentifier
-     * to device.
-     *
-     * @param path - the whole path to new PortPair
-     * @param newPortPair        - new PortPair
-     */
-    @Override
-    public void add(InstanceIdentifier<PortPair> path, PortPair newPortPair) {
-        ServiceFunction sf = buildServiceFunction(newPortPair);
-        sfcMdsalHelper.addServiceFunction(sf);
-    }
-
-    private ServiceFunction buildServiceFunction(PortPair portPair) {
+    public static ServiceFunctionBuilder buildServiceFunction(
+            PortPair portPair,
+            PortPairGroup portPairGroup,
+            Port neutronPort,
+            OvsdbPortMetadata ovsdbPortMetadata,
+            ServiceFunctionForwarder sff) {
+        Preconditions.checkNotNull(portPair, "Port pair must not be null");
+        Preconditions.checkNotNull(portPairGroup, "Port pair group must not be null");
+        Preconditions.checkNotNull(neutronPort, "Neutron Port related to port pair must not be null");
         LOG.info("Port pair received : {}", portPair);
 
         ServiceFunctionBuilder serviceFunctionBuilder = new ServiceFunctionBuilder();
@@ -134,29 +81,28 @@ public class PortPairTranslator implements INeutronSfcDataProcessor<PortPair> {
         IpBuilder sfLocator = new IpBuilder();
 
         List<ServiceFunctionParameters> sfParams = portPair.getServiceFunctionParameters();
-
+        //Set SF name, key and tenant-id
         serviceFunctionBuilder.setName(new SfName(portPair.getName()));
         serviceFunctionBuilder.setKey(new ServiceFunctionKey(serviceFunctionBuilder.getName()));
-
         serviceFunctionBuilder.setTenantId(new TenantId(portPair.getTenantId().getValue()));
-        //By default set it to true
+
+        //Set SF Type. Setting it to PortPairGroup Type, this will be overridden if user pass
+        //it through service_function_params
+        serviceFunctionBuilder.setType(SftTypeName.getDefaultInstance(portPairGroup.getName()));
+
+        //Set NSH Aware to true, later it will be overridden if user specified otherwise
+        //in service_function_parameters
         serviceFunctionBuilder.setNshAware(true);
 
-        //Set data path locator
+        //Set data path locator name and key
         sfDataPlaneLocatorBuilder.setName(new SfDataPlaneLocatorName(portPair.getName() + DPL_SUFFIX_PARAM));
         sfDataPlaneLocatorBuilder.setKey(new SfDataPlaneLocatorKey(sfDataPlaneLocatorBuilder.getName()));
 
         //Set vxlan-gpe as a default transport type, unless user pass specific transport in
-        //service_function_params
+        //service_function_parameters
         sfDataPlaneLocatorBuilder.setTransport(VxlanGpe.class);
 
         //Set locator type
-        Port neutronPort = neutronMdsalHelper.getNeutronPort(portPair.getIngress());
-        if (neutronPort == null) {
-            //Try to get the neutron port for egress node. Currently assuming that
-            //ingress port and egress port will be same.
-            neutronPort = neutronMdsalHelper.getNeutronPort(portPair.getEgress());
-        }
         if (neutronPort != null) {
             List<AllowedAddressPairs> attachedIpAddresses = neutronPort.getAllowedAddressPairs();
             //Pick up the first ip address
@@ -176,25 +122,24 @@ public class PortPairTranslator implements INeutronSfcDataProcessor<PortPair> {
             LOG.warn("Neutron port mapped to Port pair ingress/egress port is not found : {}", portPair);
         }
 
-        //Set OVS_Port
-        //This call is very costly call, as it reads ovsdb:1 topology from the operational data store.
-        // Need to think of caching to optimize it further.
-        OvsdbPortMetadata ovsdbPortMetadata = ovsdbMdsalHelper.getOvsdbPortMetadata(portPair.getIngress());
         if (ovsdbPortMetadata.getOvsdbPort() != null ) {
-            String ovsdbPortName = ovsdbMdsalHelper.getOvsdbPortName(ovsdbPortMetadata.getOvsdbPort());
+            String ovsdbPortName = OvsdbMdsalHelper.getOvsdbPortName(ovsdbPortMetadata.getOvsdbPort());
             SfDplOvsAugmentationBuilder sfDplOvsAugmentationBuilder = new SfDplOvsAugmentationBuilder();
             OvsPortBuilder ovsPortBuilder = new OvsPortBuilder();
             ovsPortBuilder.setPortId(ovsdbPortName);
             sfDplOvsAugmentationBuilder.setOvsPort(ovsPortBuilder.build());
             sfDataPlaneLocatorBuilder.addAugmentation(SfDplOvsAugmentation.class, sfDplOvsAugmentationBuilder.build());
+        } else {
+            LOG.warn("No OVSDB Port found for the port pair {}. Lack of ovs-port information might not configure SF " +
+                    "properly", portPair);
         }
 
-        //But if user pass specific param using service_function_parameters, set it accordingly
+        //But if user pass specific param using service_function_parameters, set/override it accordingly
         for(ServiceFunctionParameters sfParam : sfParams) {
             if (sfParam.getServiceFunctionParameter().equals(NSH_AWARE_PARAM)) {
                 serviceFunctionBuilder.setNshAware(new Boolean(sfParam.getServiceFunctionParameterValue()));
             }
-            //There is not default type set, user MUST pass it through service_function_parameters
+            //There is by default type set to port pair group name, override it if user pass it specific type
             if (sfParam.getServiceFunctionParameter().equals(SF_TYPE_PARAM)) {
                 serviceFunctionBuilder.setType(new SftTypeName(sfParam.getServiceFunctionParameterValue()));
             }
@@ -219,8 +164,7 @@ public class PortPairTranslator implements INeutronSfcDataProcessor<PortPair> {
         //Set service_function_forwarder
         if (sfDataPlaneLocatorBuilder.getServiceFunctionForwarder() == null
                 && ovsdbPortMetadata.getOvsdbNode() != null) {
-            String ipAddress = ovsdbMdsalHelper.getNodeIpAddress(ovsdbPortMetadata.getOvsdbNode());
-            SffName sffName = sfcMdsalHelper.getExistingSFF(ipAddress);
+            SffName sffName = sff.getName();
             if(sffName != null ) {
                 sfDataPlaneLocatorBuilder.setServiceFunctionForwarder(sffName);
             } else {
@@ -237,11 +181,10 @@ public class PortPairTranslator implements INeutronSfcDataProcessor<PortPair> {
         //Set all data plane locator
         serviceFunctionBuilder.setSfDataPlaneLocator(sfDataPlaneLocatorList);
         LOG.info("Port Pair translated to Service Function: {}", serviceFunctionBuilder);
-        return serviceFunctionBuilder.build();
+        return serviceFunctionBuilder;
     }
 
-    private ServiceFunctionKey getSFKey(PortPair portPair) {
+    public static ServiceFunctionKey getSFKey(PortPair portPair) {
         return new ServiceFunctionKey(new SfName(portPair.getName()));
     }
-
 }
index 267e5147fd68fdc9fd312ba150123bc29c47bc39..abfde8529e6dd7bbc2de084ed4235d914fd82e7f 100644 (file)
@@ -12,6 +12,9 @@
 
   <reference id="dataBroker"
     interface="org.opendaylight.controller.md.sal.binding.api.DataBroker" />
+  <reference id="rspService"
+             interface="org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.rsp.rev140701.RenderedServicePathService"
+             availability="optional"/>
 
   <odl:clustered-app-config id="openstackSfcTranslatorConfig"
     binding-class="org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.openstack.sfc.translator.config.rev160720.OpenstackSfcTranslatorConfig">
@@ -21,6 +24,7 @@
     class="org.opendaylight.netvirt.openstack.sfc.translator.OpenStackSFCTranslatorProvider"
     init-method="start" destroy-method="close">
     <argument ref="dataBroker" />
+    <argument ref="rspService" />
     <argument ref="openstackSfcTranslatorConfig" />
     <argument ref="blueprintBundleContext" />
   </bean>
index d33b469b394498d82d0c6c1d4d3420a95b74fcf1..949a42bfb6ef49c41a9f5319317e6812ef00e5b8 100644 (file)
@@ -10,7 +10,7 @@
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <parent>
-    <groupId>org.opendaylight.controller</groupId>
+    <groupId>org.opendaylight.odlparent</groupId>
     <artifactId>karaf-parent</artifactId>
     <version>1.7.0-SNAPSHOT</version>
     <relativePath/>
index 78ed830ae02fde5599155df38fc5e37142b47bd2..1273b2353eb58e55f44c413ac0f7fe30684a6961 100644 (file)
@@ -96,4 +96,7 @@ public interface IBgpManager {
 
     public String getDCGwIP();
 
+    void sendNotificationEvent(String pfx, int code, int subcode);
+    void setqBGPrestartTS(long qBGPrestartTS);
+    void bgpRestarted();
 }
diff --git a/vpnservice/bgpmanager/bgpmanager-api/src/main/yang/bgpmanager-api.yang b/vpnservice/bgpmanager/bgpmanager-api/src/main/yang/bgpmanager-api.yang
deleted file mode 100644 (file)
index c986a9d..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-module bgpmanager-api {
-       yang-version 1;
-    namespace "urn:opendaylight:params:xml:ns:yang:bgpmanager:api";
-    prefix "bgpmgr-api";
-
-    import config { prefix config; revision-date 2013-04-05; }
-
-    description
-        "Service definition for bgpmanager project";
-
-    revision "2015-04-20" {
-        description
-            "Initial revision";
-    }
-
-    identity bgpmanager-api {
-        base "config:service-type";
-        config:java-class "org.opendaylight.netvirt.bgpmanager.api.IBgpManager";
-    }
-}
\ No newline at end of file
diff --git a/vpnservice/bgpmanager/bgpmanager-impl/src/main/config/default-config.xml b/vpnservice/bgpmanager/bgpmanager-impl/src/main/config/default-config.xml
deleted file mode 100644 (file)
index 20848a1..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!--
-Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<snapshot>
-  <required-capabilities>
-    <capability>urn:opendaylight:params:xml:ns:yang:bgpmanager:impl?module=bgpmanager-impl&amp;revision=2015-03-26</capability>
-    <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&amp;revision=2013-10-28</capability>
-    <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl?module=opendaylight-sal-binding-broker-impl&amp;revision=2013-10-28</capability>
-    <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:core:spi:entity-ownership-service?module=opendaylight-entity-ownership-service&amp;revision=2015-08-10</capability>
-  </required-capabilities>
-  <configuration>
-
-    <data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
-      <modules xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
-        <module>
-          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:bgpmanager:impl">prefix:bgpmanager-impl</type>
-          <name>bgpmanager-default</name>
-          <broker>
-            <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
-            <name>binding-osgi-broker</name>
-          </broker>
-          <rpcregistry>
-            <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-rpc-registry</type>
-            <name>binding-rpc-broker</name>
-          </rpcregistry>
-          <notification-service>
-            <type xmlns:bindingimpl="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">bindingimpl:binding-new-notification-service</type>
-            <name>binding-notification-adapter</name>
-          </notification-service>
-          <entity-ownership-service>
-            <type xmlns:entity-ownership="urn:opendaylight:params:xml:ns:yang:controller:md:sal:core:spi:entity-ownership-service">entity-ownership:entity-ownership-service</type>
-            <name>entity-ownership-service</name>
-          </entity-ownership-service>
-          <binding-normalized-node-serializer>
-            <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-normalized-node-serializer</type>
-            <name>runtime-mapping-singleton</name>
-          </binding-normalized-node-serializer>
-          <!--
-                      <broker>
-                      <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
-                      <name>binding-osgi-broker</name>
-                    </broker>
-                    <entity-ownership-service>
-                      <type xmlns:entity-ownership="urn:opendaylight:params:xml:ns:yang:controller:md:sal:core:spi:entity-ownership-service">entity-ownership:entity-ownership-service</type>
-                      <name>entity-ownership-service</name>
-                    </entity-ownership-service>
-
-                      <itm>
-                        <type xmlns:itm="urn:opendaylight:vpnservice:itm">itm:itm</type>
-                        <name>itm</name>
-                      </itm> -->
-        </module>
-      </modules>
-      <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
-        <service>
-          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:bgpmanager:api">prefix:bgpmanager-api</type>
-          <instance>
-            <name>bgpmanager</name>
-            <provider>/modules/module[type='bgpmanager-impl'][name='bgpmanager-default']</provider>
-          </instance>
-        </service>
-      </services>
-    </data>
-  </configuration>
-</snapshot>
diff --git a/vpnservice/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/netvirt/bgpmanager/AbstractDataChangeListener.java b/vpnservice/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/netvirt/bgpmanager/AbstractDataChangeListener.java
deleted file mode 100644 (file)
index 3bdb0df..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.netvirt.bgpmanager;
-
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * AbstractDataChangeListener implemented basic {@link DataChangeListener} processing for
- * VPN related Data Objects.
- */
-public abstract class AbstractDataChangeListener <T extends DataObject> implements DataChangeListener {
-
-    protected final Class<T> clazz;
-
-    public AbstractDataChangeListener(Class<T> clazz) {
-        this.clazz = Preconditions.checkNotNull(clazz, "Class can not be null!");
-    }
-
-    @Override
-    public void onDataChanged(final AsyncDataChangeEvent<InstanceIdentifier<?>, DataObject> changeEvent) {
-        Preconditions.checkNotNull(changeEvent,"Async ChangeEvent can not be null!");
-
-        /* All DataObjects for create */
-        final Map<InstanceIdentifier<?>, DataObject> createdData = changeEvent.getCreatedData() != null
-                ? changeEvent.getCreatedData() : Collections.<InstanceIdentifier<?>, DataObject> emptyMap();
-        /* All DataObjects for remove */
-        final Set<InstanceIdentifier<?>> removeData = changeEvent.getRemovedPaths() != null
-                ? changeEvent.getRemovedPaths() : Collections.<InstanceIdentifier<?>> emptySet();
-        /* All DataObjects for updates */
-        final Map<InstanceIdentifier<?>, DataObject> updateData = changeEvent.getUpdatedData() != null
-                ? changeEvent.getUpdatedData() : Collections.<InstanceIdentifier<?>, DataObject> emptyMap();
-        /* All Original DataObjects */
-        final Map<InstanceIdentifier<?>, DataObject> originalData = changeEvent.getOriginalData() != null
-                ? changeEvent.getOriginalData() : Collections.<InstanceIdentifier<?>, DataObject> emptyMap();
-
-        this.createData(createdData);
-        this.updateData(updateData, originalData);
-        this.removeData(removeData, originalData);
-    }
-
-    @SuppressWarnings("unchecked")
-    private void createData(final Map<InstanceIdentifier<?>, DataObject> createdData) {
-        final Set<InstanceIdentifier<?>> keys = createdData.keySet() != null
-                ? createdData.keySet() : Collections.<InstanceIdentifier<?>> emptySet();
-        for (InstanceIdentifier<?> key : keys) {
-            if (clazz.equals(key.getTargetType())) {
-                 InstanceIdentifier<T> createKeyIdent = key.firstIdentifierOf(clazz);
-                 final Optional<DataObject> value = Optional.of(createdData.get(key));
-                 if (value.isPresent()) {
-                     this.add(createKeyIdent, (T)value.get());
-                 }
-            }
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private void updateData(final Map<InstanceIdentifier<?>, DataObject> updateData,
-            final Map<InstanceIdentifier<?>, DataObject> originalData) {
-
-        final Set<InstanceIdentifier<?>> keys = updateData.keySet() != null
-                ? updateData.keySet() : Collections.<InstanceIdentifier<?>> emptySet();
-        for (InstanceIdentifier<?> key : keys) {
-          if (clazz.equals(key.getTargetType())) {
-              InstanceIdentifier<T> updateKeyIdent = key.firstIdentifierOf(clazz);
-              final Optional<DataObject> value = Optional.of(updateData.get(key));
-              final Optional<DataObject> original = Optional.of(originalData.get(key));
-              if (value.isPresent() && original.isPresent()) {
-                this.update(updateKeyIdent, (T)original.get(), (T)value.get());
-              }
-          }
-        }
-    }
-
-    @SuppressWarnings("unchecked")
-    private void removeData(final Set<InstanceIdentifier<?>> removeData,
-            final Map<InstanceIdentifier<?>, DataObject> originalData) {
-
-        for (InstanceIdentifier<?> key : removeData) {
-            if (clazz.equals(key.getTargetType())) {
-                   final InstanceIdentifier<T> ident = key.firstIdentifierOf(clazz);
-                    final DataObject removeValue = originalData.get(key);
-                    this.remove(ident, (T)removeValue);
-            }
-        }
-    }
-
-    protected abstract void remove(InstanceIdentifier<T> identifier, T del);
-
-    protected abstract void update(InstanceIdentifier<T> identifier, T original, T update);
-
-    protected abstract void add(InstanceIdentifier<T> identifier, T add);
-
-}
-
-
index 570adaa7eb9dd50c94403e76954645b26e4270ab..dabe84d8fe7e3a787bdebc1e532fc5e7b6afb64a 100644 (file)
@@ -5,23 +5,36 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.netvirt.bgpmanager;
 
 import com.google.common.base.Optional;
-
-import java.io.*;
-import java.util.*;
-import java.lang.reflect.*;
+import io.netty.util.concurrent.GlobalEventExecutor;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.lang.reflect.Constructor;
 import java.net.InetAddress;
 import java.net.NetworkInterface;
-import java.util.concurrent.*;
+import java.util.Arrays;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
-
-import org.opendaylight.netvirt.bgpmanager.commands.ClearBgpCli;
-import org.opendaylight.netvirt.bgpmanager.thrift.gen.*;
-import org.opendaylight.netvirt.bgpmanager.thrift.client.*;
-import org.opendaylight.netvirt.bgpmanager.thrift.server.*;
+import org.opendaylight.controller.config.api.osgi.WaitingServiceTracker;
 import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
@@ -31,32 +44,67 @@ import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipS
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.utils.clustering.EntityOwnerUtils;
+import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
+import org.opendaylight.netvirt.bgpmanager.commands.ClearBgpCli;
+import org.opendaylight.netvirt.bgpmanager.oam.BgpConstants;
+import org.opendaylight.netvirt.bgpmanager.oam.BgpCounters;
+import org.opendaylight.netvirt.bgpmanager.thrift.client.BgpRouter;
+import org.opendaylight.netvirt.bgpmanager.thrift.client.BgpRouterException;
+import org.opendaylight.netvirt.bgpmanager.thrift.client.BgpSyncHandle;
+import org.opendaylight.netvirt.bgpmanager.thrift.gen.Routes;
+import org.opendaylight.netvirt.bgpmanager.thrift.gen.Update;
+import org.opendaylight.netvirt.bgpmanager.thrift.gen.af_afi;
+import org.opendaylight.netvirt.bgpmanager.thrift.gen.af_safi;
+import org.opendaylight.netvirt.bgpmanager.thrift.gen.qbgpConstants;
+import org.opendaylight.netvirt.bgpmanager.thrift.server.BgpThriftService;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
-import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.*;
-import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.*;
-import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighbors.*;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.*;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.Bgp;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.AsId;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.AsIdBuilder;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.ConfigServer;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.ConfigServerBuilder;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.GracefulRestart;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.GracefulRestartBuilder;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Logging;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.LoggingBuilder;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Neighbors;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NeighborsBuilder;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NeighborsKey;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Networks;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NetworksBuilder;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.NetworksKey;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Vrfs;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.VrfsBuilder;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.VrfsKey;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighbors.AddressFamilies;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighbors.AddressFamiliesBuilder;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighbors.AddressFamiliesKey;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighbors.EbgpMultihop;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighbors.EbgpMultihopBuilder;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighbors.UpdateSource;
+import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.neighbors.UpdateSourceBuilder;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.Ipv4Address;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.osgi.framework.Bundle;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.FrameworkUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class BgpConfigurationManager {
-    private static final Logger LOG =
-            LoggerFactory.getLogger(BgpConfigurationManager.class);
-    private static DataBroker broker;
-    private static FibDSWriter fib;
+    private static final Logger LOG = LoggerFactory.getLogger(BgpConfigurationManager.class);
+    private static DataBroker dataBroker;
+    private static FibDSWriter fibDSWriter;
+    public static IBgpManager bgpManager;
+    private final BundleContext bundleContext;
     private static Bgp config;
     private static BgpRouter bgpRouter;
     private static BgpThriftService updateServer;
-
+    private BgpCounters bgpCounters;
+    private Timer bgpCountersTimer;
     private static final String DEF_LOGFILE = "/var/log/bgp_debug.log";
     private static final String DEF_LOGLEVEL = "errors";
     private static final String UPDATE_PORT = "bgp.thrift.service.port";
@@ -126,7 +174,6 @@ public class BgpConfigurationManager {
     private static String cPortStartup;
     private static CountDownLatch initer = new CountDownLatch(1);
     //static IITMProvider itmProvider;
-    public static BgpManager bgpManager;
     //map<rd, map<prefix/len, nexthop/label>>
     private static Map<String, Map<String, String>> staledFibEntriesMap = new ConcurrentHashMap<>();
 
@@ -136,17 +183,64 @@ public class BgpConfigurationManager {
     static int totalStaledCount = 0;
     static int totalCleared = 0;
 
-    private static final Class[] reactors =
-            {
-                    ConfigServerReactor.class, AsIdReactor.class,
-                    GracefulRestartReactor.class, LoggingReactor.class,
-                    NeighborsReactor.class, UpdateSourceReactor.class,
-                    EbgpMultihopReactor.class, AddressFamiliesReactor.class,
-                    NetworksReactor.class, VrfsReactor.class, BgpReactor.class
-            };
+    private static final Class[] reactors = {
+            ConfigServerReactor.class, AsIdReactor.class,
+            GracefulRestartReactor.class, LoggingReactor.class,
+            NeighborsReactor.class, UpdateSourceReactor.class,
+            EbgpMultihopReactor.class, AddressFamiliesReactor.class,
+            NetworksReactor.class, VrfsReactor.class, BgpReactor.class
+    };
 
     private ListenerRegistration<DataChangeListener>[] registrations;
-    EntityOwnershipService entityOwnershipService;
+
+    final BgpConfigurationManager bgpConfigurationManager;
+
+    public BgpConfigurationManager(final DataBroker dataBroker,
+                                   final EntityOwnershipService entityOwnershipService,
+                                   final FibDSWriter fibDSWriter,
+                                   final BundleContext bundleContext)
+            throws InterruptedException, ExecutionException, TimeoutException {
+        BgpConfigurationManager.dataBroker = dataBroker;
+        BgpConfigurationManager.fibDSWriter = fibDSWriter;
+        setEntityOwnershipService(entityOwnershipService);
+        this.bundleContext = bundleContext;
+        bgpRouter = BgpRouter.getInstance();
+        String uPort = getProperty(UPDATE_PORT, DEF_UPORT);
+        cHostStartup = getProperty(CONFIG_HOST, DEF_CHOST);
+        cPortStartup = getProperty(CONFIG_PORT, DEF_CPORT);
+        VtyshCli.setHostAddr(cHostStartup);
+        ClearBgpCli.setHostAddr(cHostStartup);
+        LOG.info("UpdateServer at localhost:" + uPort + " ConfigServer at "
+                + cHostStartup + ":" + cPortStartup);
+        readOdlThriftIpForBgpCommunication();
+        registerCallbacks();
+
+        LOG.info("BGP Configuration manager initialized");
+        initer.countDown();
+
+        bgpConfigurationManager = this;
+        BgpUtil.batchSize = BgpUtil.BATCH_SIZE;
+        if (Integer.getInteger("batch.size") != null) {
+            BgpUtil.batchSize = Integer.getInteger("batch.size");
+        }
+        BgpUtil.batchInterval = BgpUtil.PERIODICITY;
+        if (Integer.getInteger("batch.wait.time") != null) {
+            BgpUtil.batchInterval = Integer.getInteger("batch.wait.time");
+        }
+        BgpUtil.registerWithBatchManager(new BgpVrfBatchHandler());
+
+        GlobalEventExecutor.INSTANCE.execute(new Runnable() {
+            @Override
+            public void run() {
+                final WaitingServiceTracker<IBgpManager> tracker = WaitingServiceTracker.create(
+                        IBgpManager.class, bundleContext);
+                bgpManager = tracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
+                updateServer = new BgpThriftService(Integer.parseInt(uPort), bgpManager, fibDSWriter);
+                updateServer.start();
+                LOG.info("BgpConfigurationManager initialized. IBgpManager={}", bgpManager);
+            }
+        });
+    }
 
     private Object createListener(Class<?> cls) {
         Constructor<?> ctor;
@@ -170,7 +264,7 @@ public class BgpConfigurationManager {
             String dclName = obj.getClass().getName();
             try {
                 AsyncDataTreeChangeListenerBase dcl = (AsyncDataTreeChangeListenerBase) obj;
-                dcl.registerListener(LogicalDatastoreType.CONFIGURATION, broker);
+                dcl.registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
             } catch (Exception e) {
                 LOG.error(emsg, e);
                 throw new IllegalStateException(emsg + " " + dclName, e);
@@ -182,76 +276,33 @@ public class BgpConfigurationManager {
         if (updateServer != null) {
             updateServer.stop();
         }
+        LOG.info("{} close", getClass().getSimpleName());
     }
 
     private boolean configExists() throws InterruptedException, ExecutionException, TimeoutException {
         InstanceIdentifier.InstanceIdentifierBuilder<Bgp> iib =
                 InstanceIdentifier.builder(Bgp.class);
         InstanceIdentifier<Bgp> iid = iib.build();
-        Optional<Bgp> b = BgpUtil.read(broker,
+        Optional<Bgp> b = BgpUtil.read(dataBroker,
                 LogicalDatastoreType.CONFIGURATION, iid);
         return b.isPresent();
     }
 
     private String getProperty(String var, String def) {
-        Bundle b = FrameworkUtil.getBundle(BgpManager.class);
-        if (b == null) {
-            return def;
-        }
-        BundleContext context = b.getBundleContext();
-        if (context == null) {
-            return def;
-        }
-        String s = context.getProperty(var);
+        String s = bundleContext.getProperty(var);
         return (s == null ? def : s);
     }
 
-    static BgpConfigurationManager bgpConfigurationManager;
-
-    public BgpConfigurationManager(BgpManager bgpMgr) throws InterruptedException, ExecutionException, TimeoutException {
-        broker = bgpMgr.getBroker();
-        fib = bgpMgr.getFibWriter();
-
-        bgpManager = bgpMgr;
-        bgpRouter = BgpRouter.getInstance();
-        String uPort = getProperty(UPDATE_PORT, DEF_UPORT);
-        cHostStartup = getProperty(CONFIG_HOST, DEF_CHOST);
-        cPortStartup = getProperty(CONFIG_PORT, DEF_CPORT);
-        VtyshCli.setHostAddr(cHostStartup);
-        ClearBgpCli.setHostAddr(cHostStartup);
-        LOG.info("UpdateServer at localhost:" + uPort + " ConfigServer at "
-                + cHostStartup + ":" + cPortStartup);
-        updateServer = new BgpThriftService(Integer.parseInt(uPort), bgpMgr);
-        updateServer.start();
-        readOdlThriftIpForBgpCommunication();
-        registerCallbacks();
-
-        LOG.info("BGP Configuration manager initialized");
-        initer.countDown();
-
-        bgpConfigurationManager = this;
-        BgpUtil.batchSize = BgpUtil.BATCH_SIZE;
-        if (Integer.getInteger("batch.size") != null) {
-            BgpUtil.batchSize = Integer.getInteger("batch.size");
-        }
-        BgpUtil.batchInterval = BgpUtil.PERIODICITY;
-        if (Integer.getInteger("batch.wait.time") != null) {
-            BgpUtil.batchInterval = Integer.getInteger("batch.wait.time");
-        }
-        BgpUtil.registerWithBatchManager(new BgpVrfBatchHandler());
-    }
-
     boolean ignoreClusterDcnEventForFollower() {
         return !EntityOwnerUtils.amIEntityOwner(BGP_ENTITY_TYPE_FOR_OWNERSHIP, BGP_ENTITY_NAME);
     }
 
     public Bgp get() {
-        config = bgpManager.getConfig();
+        config = getConfig();
         return config;
     }
 
-    public void setEntityOwnershipService(EntityOwnershipService entityOwnershipService) {
-        this.entityOwnershipService = entityOwnershipService;
+    public void setEntityOwnershipService(final EntityOwnershipService entityOwnershipService) {
         try {
             EntityOwnerUtils.registerEntityCandidateForOwnerShip(entityOwnershipService,
                     BGP_ENTITY_TYPE_FOR_OWNERSHIP, BGP_ENTITY_NAME, new EntityOwnershipListener() {
@@ -273,10 +324,6 @@ public class BgpConfigurationManager {
         }
     }
 
-    public EntityOwnershipService getEntityOwnershipService() {
-        return entityOwnershipService;
-    }
-
     private static final String addWarn =
             "Config store updated; undo with Delete if needed.";
     private static final String delWarn =
@@ -350,7 +397,7 @@ public class BgpConfigurationManager {
             try {
                 super.close();
             } catch (Exception e) {
-                e.printStackTrace();
+                LOG.error("ConfigServerReactor failed to close: ", e);
             }
         }
     }
@@ -393,8 +440,8 @@ public class BgpConfigurationManager {
                 boolean announceFbit = (afb == null) ? false : afb.booleanValue();
                 try {
                     br.startBgp(asNum, rid, stalepathTime, announceFbit);
-                    if (bgpManager.getBgpCounters() == null) {
-                        bgpManager.startBgpCountersTask();
+                    if (getBgpCounters() == null) {
+                        startBgpCountersTask();
                     }
                 } catch (BgpRouterException bre) {
                     if (bre.getErrorCode() == BgpRouterException.BGP_ERR_ACTIVE) {
@@ -436,8 +483,8 @@ public class BgpConfigurationManager {
                 } catch (Exception e) {
                     LOG.error(yangObj + " Delete received exception:  \"" + e + "\"; " + delWarn);
                 }
-                if (bgpManager.getBgpCounters() != null) {
-                    bgpManager.stopBgpCountersTask();
+                if (getBgpCounters() != null) {
+                    stopBgpCountersTask();
                 }
             }
         }
@@ -1300,7 +1347,7 @@ public class BgpConfigurationManager {
     public static long getStalePathtime(int defValue, AsId as_num) {
         long spt = 0;
         try {
-            spt = bgpManager.getConfig().getGracefulRestart().getStalepathTime();
+            spt = getConfig().getGracefulRestart().getStalepathTime();
         } catch (Exception e) {
             try {
                 spt = as_num.getStalepathTime();
@@ -1340,10 +1387,10 @@ public class BgpConfigurationManager {
                         return;
                     }
                     setStaleStartTime(System.currentTimeMillis());
-                    LOG.error("started creating stale fib  map ");
+                    LOG.error("started creating stale fibDSWriter  map ");
                     createStaleFibMap();
                     setStaleEndTime(System.currentTimeMillis());
-                    LOG.error("took {} msecs for stale fib map creation ", getStaleEndTime()- getStaleStartTime());
+                    LOG.error("took {} msecs for stale fibDSWriter map creation ", getStaleEndTime()- getStaleStartTime());
                     LOG.error("started bgp config replay ");
                     setCfgReplayStartTime(System.currentTimeMillis());
                     replay();
@@ -1413,7 +1460,7 @@ public class BgpConfigurationManager {
     }
 
     /* onUpdatePushRoute
-     * Get Stale fib map, and compare current route/fib entry.
+     * Get Stale fibDSWriter map, and compare current route/fibDSWriter entry.
      *  - Entry compare shall include NextHop, Label.
      *  - If entry matches: delete from STALE Map. NO Change to FIB Config DS.
      *  - If entry not found, add to FIB Config DS.
@@ -1447,7 +1494,7 @@ public class BgpConfigurationManager {
         }
         if (addroute) {
             LOG.info("ADD: Adding Fib entry rd {} prefix {} nexthop {} label {}", rd, prefix, nextHop, label);
-            fib.addFibEntryToDS(rd, prefix + "/" + plen, Arrays.asList(nextHop), label, RouteOrigin.BGP);
+            fibDSWriter.addFibEntryToDS(rd, prefix + "/" + plen, Arrays.asList(nextHop), label, RouteOrigin.BGP);
             LOG.info("ADD: Added Fib entry rd {} prefix {} nexthop {} label {}", rd, prefix, nextHop, label);
         }
     }
@@ -1516,7 +1563,19 @@ public class BgpConfigurationManager {
                 ts.getPort().intValue());
     }
 
-    public static synchronized void replay() {
+    public static Bgp getConfig() {
+        //TODO cleanup this cache code
+        try {
+            Optional<Bgp> optional = BgpUtil.read(dataBroker,
+                    LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Bgp.class));
+            return optional.get();
+        } catch (Exception e) {
+            //LOG.error("failed to get bgp config",e);
+        }
+        return null;
+    }
+
+    public synchronized void replay() {
         synchronized (bgpConfigurationManager) {
             String host = getConfigHost();
             int port = getConfigPort();
@@ -1531,7 +1590,7 @@ public class BgpConfigurationManager {
                 LOG.error(msg);
                 return;
             }
-            config = bgpManager.getConfig();
+            config = getConfig();
             if (config == null) {
                 LOG.error("bgp config is empty nothing to push to bgp");
                 return;
@@ -1562,8 +1621,8 @@ public class BgpConfigurationManager {
                 LOG.error("Replay:startBgp() received exception: \"" + e + "\"");
             }
 
-            if (bgpManager.getBgpCounters() == null) {
-                bgpManager.startBgpCountersTask();
+            if (getBgpCounters() == null) {
+                startBgpCountersTask();
             }
 
             Logging l = config.getLogging();
@@ -1627,15 +1686,15 @@ public class BgpConfigurationManager {
     }
 
     private <T extends DataObject> void update(InstanceIdentifier<T> iid, T dto) {
-        BgpUtil.update(broker, LogicalDatastoreType.CONFIGURATION, iid, dto);
+        BgpUtil.update(dataBroker, LogicalDatastoreType.CONFIGURATION, iid, dto);
     }
 
     private <T extends DataObject> void asyncWrite(InstanceIdentifier<T> iid, T dto) {
-        BgpUtil.write(broker, LogicalDatastoreType.CONFIGURATION, iid, dto);
+        BgpUtil.write(dataBroker, LogicalDatastoreType.CONFIGURATION, iid, dto);
     }
 
     private <T extends DataObject> void delete(InstanceIdentifier<T> iid) {
-        BgpUtil.delete(broker, LogicalDatastoreType.CONFIGURATION, iid);
+        BgpUtil.delete(dataBroker, LogicalDatastoreType.CONFIGURATION, iid);
     }
 
     public synchronized void
@@ -1880,7 +1939,7 @@ public class BgpConfigurationManager {
                                 try {
                                     totalCleared++;
                                     LOG.error("BGP: RouteCleanup deletePrefix called but not executed rd:{}, prefix{}" + rd.toString() + prefix);
-                                    // fib.removeFibEntryFromDS(rd, prefix);
+                                    // fibDSWriter.removeFibEntryFromDS(rd, prefix);
                                 } catch (Exception e) {
                                     LOG.error("BGP: RouteCleanup deletePrefix failed rd:{}, prefix{}" + rd.toString() + prefix);
                                 }
@@ -1914,14 +1973,14 @@ public class BgpConfigurationManager {
                 Thread.sleep(1000);
                 retry--;
                 if (retry == 0) {
-                    LOG.error("TimeOut occured {} seconds, in waiting stale fib create", STALE_FIB_WAIT);
+                    LOG.error("TimeOut occured {} seconds, in waiting stale fibDSWriter create", STALE_FIB_WAIT);
                 }
             }
             staledFibEntriesMap.clear();
             InstanceIdentifier<FibEntries> id = InstanceIdentifier.create(FibEntries.class);
             DataBroker db = BgpUtil.getBroker();
             if (db == null) {
-                LOG.error("Couldn't find BgpUtil broker while creating createStaleFibMap");
+                LOG.error("Couldn't find BgpUtil dataBroker while creating createStaleFibMap");
                 return;
             }
 
@@ -1961,7 +2020,7 @@ public class BgpConfigurationManager {
     public static void onUpdateWithdrawRoute(String rd, String prefix, int plen) {
         LOG.debug("Route del ** {} ** {}/{} ", rd, prefix, plen);
         try {
-            fib.removeFibEntryFromDS(rd, prefix + "/" + plen);
+            fibDSWriter.removeFibEntryFromDS(rd, prefix + "/" + plen);
         } catch (Throwable e) {
             LOG.error("failed to handle withdraw route ", e);
         }
@@ -1980,4 +2039,48 @@ public class BgpConfigurationManager {
     }
     public static int getTotalStaledCount() {return totalStaledCount;}
     public static int getTotalCleared() { return totalCleared;}
+
+    public Timer getBgpCountersTimer() {
+        return bgpCountersTimer;
+    }
+
+    public BgpCounters getBgpCounters() {
+        return bgpCounters;
+    }
+
+    public  void setBgpCountersTimer (Timer t) {
+        bgpCountersTimer = t;
+    }
+
+    public void startBgpCountersTask() {
+        if (getBgpCounters() == null) {
+
+            try {
+                bgpCounters = new BgpCounters();
+                setBgpCountersTimer(new Timer(true));
+                getBgpCountersTimer().scheduleAtFixedRate(bgpCounters, 0, 120 * 1000);
+
+
+                LOG.info("Bgp Counters task scheduled for every two minutes.");
+            } catch (Exception e) {
+                System.out.println("Could not start the timertask for Bgp Counters.");
+                e.printStackTrace();
+            }
+
+            try {
+                bgpManager.setQbgpLog(BgpConstants.BGP_DEF_LOG_FILE, BgpConstants.BGP_DEF_LOG_LEVEL);
+            } catch (Exception e) {
+                System.out.println("Could not set the default options for logging");
+            }
+        }
+    }
+
+    public void stopBgpCountersTask() {
+        Timer t = getBgpCountersTimer();
+        if (getBgpCounters() != null) {
+            t.cancel();
+            setBgpCountersTimer(null);
+            bgpCounters = null;
+        }
+    }
 }
index a14155edff10bd423d569bbcd8c548e9f668b934..59664a9ddc906f6c868c969dd1217304073d4a94 100644 (file)
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.netvirt.bgpmanager;
 
-import java.lang.management.ManagementFactory;
-import java.util.*;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeoutException;
-import javax.management.*;
-
-import com.google.common.base.*;
-import com.google.common.base.Optional;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
 import org.apache.thrift.TException;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
-import org.opendaylight.netvirt.bgpmanager.commands.Commands;
-import org.opendaylight.netvirt.bgpmanager.oam.*;
+import org.opendaylight.netvirt.bgpmanager.oam.BgpAlarmBroadcaster;
+import org.opendaylight.netvirt.bgpmanager.oam.BgpAlarmErrorCodes;
+import org.opendaylight.netvirt.bgpmanager.oam.BgpConstants;
 import org.opendaylight.netvirt.bgpmanager.thrift.gen.af_afi;
 import org.opendaylight.netvirt.bgpmanager.thrift.gen.af_safi;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
-import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.Bgp;
 import org.opendaylight.yang.gen.v1.urn.ericsson.params.xml.ns.yang.ebgp.rev150901.bgp.Neighbors;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpManager {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(BgpManager.class);
-    private BgpConfigurationManager bcm;
-    private FibDSWriter fibDSWriter;
-    //private IITMProvider        itmProvider;
-    private DataBroker dataBroker;
-    private BgpAlarmBroadcaster     qbgpAlarmProducer = null;
-    private MBeanServer qbgpAlarmServer = null;
-    private NotificationFilter  qbgpAlarmFilter = null;
-    final static int DEFAULT_STALEPATH_TIME = 210;
-    final static boolean DEFAULT_FBIT = true;
-
+public class BgpManager implements AutoCloseable, IBgpManager {
+    private static final Logger LOG = LoggerFactory.getLogger(BgpManager.class);
+    private final DataBroker dataBroker;
+    private final BgpConfigurationManager bcm;
+    private final BgpAlarmBroadcaster qbgpAlarmProducer;
+    private final FibDSWriter fibDSWriter;
     private long qBGPrestartTS = 0;
 
-    EntityOwnershipService entityOwnershipService;
-    public BgpCounters bgpCounters;
-    public Timer bgpCountersTimer;
+    public BgpManager(final DataBroker dataBroker,
+                      final BgpConfigurationManager bcm,
+                      final BgpAlarmBroadcaster bgpAlarmProducer,
+                      final FibDSWriter fibDSWriter) {
+        this.dataBroker = dataBroker;
+        this.bcm = bcm;
+        this.qbgpAlarmProducer = bgpAlarmProducer;
+        this.fibDSWriter = fibDSWriter;
+    }
 
-    @Override
-    public void onSessionInitiated(ProviderContext session) {
+    public void init() {
         try {
-            dataBroker = session.getSALService(DataBroker.class);
-            fibDSWriter = new FibDSWriter(dataBroker);
             BgpUtil.setBroker(dataBroker);
-            bcm = new BgpConfigurationManager(this);
-            bcm.setEntityOwnershipService(entityOwnershipService);
-            Commands commands = new Commands(this);
             ConfigureBgpCli.setBgpManager(this);
-            LOGGER.info("BgpManager started");
+            LOG.info("{} start", getClass().getSimpleName());
         } catch (Exception e) {
-            LOGGER.error("Failed to start BgpManager: "+e);
-        }
-
-        // Set up the Infra for Posting BGP Alarms as JMX notifications.
-        try {
-            qbgpAlarmProducer = new BgpAlarmBroadcaster();
-            MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
-            ObjectName alarmObj = new ObjectName("SDNC.FM:name=BgpAlarmObj");
-            mbs.registerMBean(qbgpAlarmProducer, alarmObj);
-        } catch (JMException e) {
-            LOGGER.error("Adding a NotificationBroadcaster failed." + e.toString());
-            e.printStackTrace();
+            LOG.error("Failed to start BgpManager: ", e);
         }
     }
 
-    public void setEntityOwnershipService(EntityOwnershipService entityOwnershipService) {
-        this.entityOwnershipService = entityOwnershipService;
-    }
-
     @Override
     public void close() throws Exception {
-        bcm.close();
-        LOGGER.info("BgpManager Closed");
-    }
-
-    /*public void setITMProvider(IITMProvider itmProvider) {
-        this.itmProvider = itmProvider;
-    }
-
-    public IITMProvider getItmProvider() { return this.itmProvider; } */
-
-    public Bgp getConfig() {
-        //TODO cleanup this cache code
-        try {
-            Optional<Bgp> optional = BgpUtil.read(dataBroker,
-                    LogicalDatastoreType.CONFIGURATION, InstanceIdentifier.create(Bgp.class));
-            return optional.get();
-        } catch (Exception e) {
-            //LOGGER.error("failed to get bgp config",e);
-        }
-        return null;
+        LOG.info("{} close", getClass().getSimpleName());
     }
 
     public void configureGR(int stalepathTime) throws TException {
@@ -139,7 +88,7 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
 
     @Override
     public void addVrf(String rd, Collection<String> importRts, Collection<String> exportRts) throws Exception {
-        bcm.addVrf(rd, new ArrayList<String>(importRts), new ArrayList<String>(exportRts));
+        bcm.addVrf(rd, new ArrayList<>(importRts), new ArrayList<>(exportRts));
     }
 
     @Override
@@ -151,13 +100,15 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
     }
 
     @Override
-    public void addPrefix(String rd, String prefix, List<String> nextHopList, int vpnLabel, RouteOrigin origin) throws Exception {
+    public void addPrefix(String rd, String prefix, List<String> nextHopList, int vpnLabel, RouteOrigin origin)
+            throws Exception {
         fibDSWriter.addFibEntryToDS(rd, prefix, nextHopList, vpnLabel, origin);
         bcm.addPrefix(rd, prefix, nextHopList, vpnLabel);
     }
 
     @Override
-    public void addPrefix(String rd, String prefix, String nextHop, int vpnLabel, RouteOrigin origin) throws Exception {
+    public void addPrefix(String rd, String prefix, String nextHop, int vpnLabel, RouteOrigin origin)
+            throws Exception {
         addPrefix(rd, prefix, Arrays.asList(nextHop), vpnLabel, origin);
     }
 
@@ -174,16 +125,16 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
 
     @Override
     public void advertisePrefix(String rd, String prefix, String nextHop, int vpnLabel) throws Exception {
-        LOGGER.info("ADVERTISE: Adding Prefix rd {} prefix {} nexthop {} label {}", rd, prefix, nextHop, vpnLabel);
+        LOG.info("ADVERTISE: Adding Prefix rd {} prefix {} nexthop {} label {}", rd, prefix, nextHop, vpnLabel);
         bcm.addPrefix(rd, prefix, Arrays.asList(nextHop), vpnLabel);
-        LOGGER.info("ADVERTISE: Added Prefix rd {} prefix {} nexthop {} label {}", rd, prefix, nextHop, vpnLabel);
+        LOG.info("ADVERTISE: Added Prefix rd {} prefix {} nexthop {} label {}", rd, prefix, nextHop, vpnLabel);
     }
 
     @Override
     public void withdrawPrefix(String rd, String prefix) throws Exception {
-        LOGGER.info("WITHDRAW: Removing Prefix rd {} prefix {}", rd, prefix);
+        LOG.info("WITHDRAW: Removing Prefix rd {} prefix {}", rd, prefix);
         bcm.delPrefix(rd, prefix);
-        LOGGER.info("WITHDRAW: Removed Prefix rd {} prefix {}", rd, prefix);
+        LOG.info("WITHDRAW: Removed Prefix rd {} prefix {}", rd, prefix);
     }
 
     public void setQbgpLog(String fileName, String debugLevel) throws Exception {
@@ -210,9 +161,13 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
         bcm.stopConfig();
     }
 
+    public Bgp getConfig() {
+        return bcm.getConfig();
+    }
+
     @Override
     public String getDCGwIP() {
-        Bgp conf = getConfig();
+        Bgp conf = bcm.getConfig();
         if (conf == null) {
             return null;
         }
@@ -223,10 +178,6 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
         return nbrs.get(0).getAddress().getValue();
     }
 
-    public MBeanServer getBgpAlarmServer() {
-        return qbgpAlarmServer;
-    }
-
     public synchronized void sendNotificationEvent(String pfx, int code, int subcode) {
         BgpAlarmErrorCodes errorSubCode;
         if (code != BgpConstants.BGP_NOTIFY_CEASE_CODE) {
@@ -241,69 +192,19 @@ public class BgpManager implements BindingAwareProvider, AutoCloseable, IBgpMana
             // BgpAlarmErrorCodes enum class.
             return;
         }
-        String alarmString = "";
-        alarmString = "Alarm (" + code + "," + subcode + ") from neighbor " + pfx;
         qbgpAlarmProducer.sendBgpAlarmInfo(pfx, code, subcode);
     }
 
-    public Timer getBgpCountersTimer() {
-        return bgpCountersTimer;
-    }
-
-    public BgpCounters getBgpCounters() {
-        return bgpCounters;
-    }
-
-    public  void setBgpCountersTimer (Timer t) {
-        bgpCountersTimer = t;
-    }
-
-    public void startBgpCountersTask() {
-        if (getBgpCounters() == null) {
-
-            try {
-                bgpCounters = new BgpCounters();
-                setBgpCountersTimer(new Timer(true));
-                getBgpCountersTimer().scheduleAtFixedRate(bgpCounters, 0, 120 * 1000);
-
-
-                LOGGER.info("Bgp Counters task scheduled for every two minutes.");
-            } catch (Exception e) {
-                System.out.println("Could not start the timertask for Bgp Counters.");
-                e.printStackTrace();
-            }
-
-            try {
-                setQbgpLog(BgpConstants.BGP_DEF_LOG_FILE, BgpConstants.BGP_DEF_LOG_LEVEL);
-            } catch (Exception e) {
-                System.out.println("Could not set the default options for logging");
-            }
-        }
-    }
-
-    public void stopBgpCountersTask() {
-        Timer t = getBgpCountersTimer();
-        if (getBgpCounters() != null) {
-            t.cancel();
-            setBgpCountersTimer(null);
-            bgpCounters = null;
-        }
-    }
-
     public FibDSWriter getFibWriter() {
         return fibDSWriter;
     }
 
-    public DataBroker getBroker() {
-        return dataBroker;
-    }
-
     public String getConfigHost() {
-        return bcm.getConfigHost();
+        return BgpConfigurationManager.getConfigHost();
     }
 
     public int getConfigPort() {
-        return bcm.getConfigPort();
+        return BgpConfigurationManager.getConfigPort();
     }
 
     public void bgpRestarted() {
index e1612b54afacd2e80939b693f8e2398d4019c5e8..8040e83da1fba5f3409ae81459d3b16ebf12b0d0 100644 (file)
@@ -5,7 +5,6 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.netvirt.bgpmanager;
 
 import com.google.common.base.Optional;
@@ -28,13 +27,7 @@ import org.slf4j.LoggerFactory;
 import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicInteger;
 
-/**
- * Created by emhamla on 8/31/2015.
- */
-
 public class BgpUtil {
-
-    private static final long FIB_READ_TIMEOUT = 1;
     private static final Logger LOG = LoggerFactory.getLogger(BgpUtil.class);
     private static DataBroker  dataBroker;
     private static BindingTransactionChain fibTransact;
index 6d072106661927ceb494c4dcbf6fda054f3a0797..62e15131d9d5497582caadcc2a1bf86004f82c38 100644 (file)
@@ -5,36 +5,31 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.netvirt.bgpmanager;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import java.util.List;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTablesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntryKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
-
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-
-import java.util.*;
-
-
 public class FibDSWriter {
     private static final Logger logger = LoggerFactory.getLogger(FibDSWriter.class);
-    private final DataBroker broker;
+    private final DataBroker dataBroker;
 
-    public FibDSWriter(final DataBroker db) {
-        broker = db;
+    public FibDSWriter(final DataBroker dataBroker) {
+        this.dataBroker = dataBroker;
     }
 
     public synchronized void addFibEntryToDS(String rd, String prefix, List<String> nextHopList,
@@ -63,12 +58,12 @@ public class FibDSWriter {
                     InstanceIdentifier.builder(FibEntries.class)
                             .child(VrfTables.class, new VrfTablesKey(rd))
                             .child(VrfEntry.class, new VrfEntryKey(prefix)).build();
-            Optional<VrfEntry> entry = BgpUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+            Optional<VrfEntry> entry = BgpUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
 
             VrfEntry vrfEntry = new VrfEntryBuilder().setDestPrefix(prefix).setNextHopAddressList(nextHopList)
                                                      .setLabel((long)label).setOrigin(origin.getValue()).build();
 
-            BgpUtil.write(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId, vrfEntry);
+            BgpUtil.write(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfEntryId, vrfEntry);
         } catch (Exception e) {
             logger.error("addFibEntryToDS: error ", e);
         }
@@ -86,7 +81,7 @@ public class FibDSWriter {
         InstanceIdentifierBuilder<VrfEntry> idBuilder =
             InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd)).child(VrfEntry.class, new VrfEntryKey(prefix));
         InstanceIdentifier<VrfEntry> vrfEntryId = idBuilder.build();
-        BgpUtil.delete(broker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+        BgpUtil.delete(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
 
     }
 
@@ -97,10 +92,7 @@ public class FibDSWriter {
                 InstanceIdentifier.builder(FibEntries.class).child(VrfTables.class, new VrfTablesKey(rd));
         InstanceIdentifier<VrfTables> vrfTableId = idBuilder.build();
 
-        BgpUtil.delete(broker, LogicalDatastoreType.CONFIGURATION, vrfTableId);
+        BgpUtil.delete(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfTableId);
 
     }
-
-
-
 }
index a74ea07a1acab6084874860586a0c93f456d5c38..41b8b006d763b678c80317dde167fccbd9487fe2 100644 (file)
@@ -5,27 +5,39 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.netvirt.bgpmanager.oam;
 
-/**
- * Created by echiapt on 7/27/2015.
- */
-
- import javax.management.*;
-
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
-
- import java.util.ArrayList;
+import java.lang.management.ManagementFactory;
+import java.util.ArrayList;
+import javax.management.AttributeChangeNotification;
+import javax.management.JMException;
+import javax.management.MBeanServer;
+import javax.management.Notification;
+import javax.management.NotificationBroadcasterSupport;
+import javax.management.ObjectName;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class BgpAlarmBroadcaster extends NotificationBroadcasterSupport implements BgpAlarmBroadcasterMBean {
-    private static final Logger LOGGER = LoggerFactory.getLogger(BgpAlarmBroadcaster.class);
+    private static final Logger LOG = LoggerFactory.getLogger(BgpAlarmBroadcaster.class);
     private long sequenceNumber;
+
     public BgpAlarmBroadcaster () {
         this.sequenceNumber = 1;
     }
 
+    public void init() {
+        // Set up the Infra for Posting BGP Alarms as JMX notifications.
+        try {
+            MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
+            ObjectName alarmObj = new ObjectName("SDNC.FM:name=BgpAlarmObj");
+            mbs.registerMBean(this, alarmObj);
+        } catch (JMException e) {
+            LOG.error("Adding a NotificationBroadcaster failed.", e);
+        }
+        LOG.info("{} start", getClass().getSimpleName());
+    }
+
     public void sendBgpAlarmInfo(String pfx, int code , int subcode) {
         Notification n;
         String alarmAddText, alarmSrc = "BGP";
@@ -42,7 +54,6 @@ public class BgpAlarmBroadcaster extends NotificationBroadcasterSupport implemen
                                             "raise Alarm Object notified", "raiseAlarmObject",
                                             "ArrayList", "", arrayList);
         sendNotification(n);
-        LOGGER.info("BGP: Alarm :"+ userAlarm.getAlarmType() + " has been posted.");
-        return;
+        LOG.info("BGP: Alarm :"+ userAlarm.getAlarmType() + " has been posted.");
     }
 }
index 1d16d2dde9eac5357524453732a9f9e38a46494a..b25bb05eea1a06e0e90bee308bf9a72c783fef0c 100644 (file)
@@ -8,15 +8,20 @@
 
 package org.opendaylight.netvirt.bgpmanager.thrift.server;
 
-import java.util.*;
-
+import java.util.List;
 import org.apache.thrift.protocol.TBinaryProtocol;
 import org.apache.thrift.protocol.TProtocol;
-import org.apache.thrift.server.*;
-import org.apache.thrift.transport.*;
-import org.opendaylight.netvirt.bgpmanager.BgpManager;
+import org.apache.thrift.server.ServerContext;
+import org.apache.thrift.server.TServer;
+import org.apache.thrift.server.TServerEventHandler;
+import org.apache.thrift.server.TThreadedSelectorServer;
+import org.apache.thrift.transport.TFramedTransport;
+import org.apache.thrift.transport.TNonblockingServerSocket;
+import org.apache.thrift.transport.TNonblockingServerTransport;
+import org.apache.thrift.transport.TTransport;
 import org.opendaylight.netvirt.bgpmanager.BgpConfigurationManager;
 import org.opendaylight.netvirt.bgpmanager.FibDSWriter;
+import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.bgpmanager.thrift.gen.BgpUpdater;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
 import org.slf4j.Logger;
@@ -24,7 +29,7 @@ import org.slf4j.LoggerFactory;
 
 public class BgpThriftService {
     int ourPort;
-    BgpManager bgpManager;
+    IBgpManager bgpManager;
     FibDSWriter fibDSWriter;
     TServer server;
 
@@ -33,10 +38,10 @@ public class BgpThriftService {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(BgpThriftService.class);
 
-    public BgpThriftService(int ourPort, BgpManager bm) {
+    public BgpThriftService(int ourPort, IBgpManager bm, FibDSWriter fibDSWriter) {
         this.ourPort = ourPort;
         bgpManager = bm;
-        fibDSWriter = bm.getFibWriter();
+        this.fibDSWriter = fibDSWriter;
     }
 
     public static class ThriftClientContext implements  ServerContext {
diff --git a/vpnservice/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/bgpmanager/impl/rev150326/BgpManagerImplModule.java b/vpnservice/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/bgpmanager/impl/rev150326/BgpManagerImplModule.java
deleted file mode 100644 (file)
index 80e6e35..0000000
+++ /dev/null
@@ -1,30 +0,0 @@
-package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgpmanager.impl.rev150326;
-
-import org.opendaylight.netvirt.bgpmanager.BgpManager;
-
-public class BgpManagerImplModule extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgpmanager.impl.rev150326.AbstractBgpManagerImplModule {
-    public BgpManagerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
-        super(identifier, dependencyResolver);
-    }
-
-    public BgpManagerImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgpmanager.impl.rev150326.BgpManagerImplModule oldModule, java.lang.AutoCloseable oldInstance) {
-        super(identifier, dependencyResolver, oldModule, oldInstance);
-    }
-
-    @Override
-    public void customValidation() {
-        // add custom validation form module attributes here.
-    }
-
-    @Override
-    public java.lang.AutoCloseable createInstance() {
-        // TODO:implement
-        //throw new java.lang.UnsupportedOperationException();
-        BgpManager provider = new BgpManager();
-        provider.setEntityOwnershipService(getEntityOwnershipServiceDependency());
-        //provider.setITMProvider(getItmDependency());
-        getBrokerDependency().registerProvider(provider);
-        return provider;
-    }
-
-}
diff --git a/vpnservice/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/bgpmanager/impl/rev150326/BgpManagerImplModuleFactory.java b/vpnservice/bgpmanager/bgpmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/bgpmanager/impl/rev150326/BgpManagerImplModuleFactory.java
deleted file mode 100644 (file)
index 03be3d0..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
-* Generated file
-*
-* Generated from: yang module name: bgpmanager-impl yang module local name: bgpmanager-impl
-* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
-* Generated at: Wed Mar 25 12:33:33 IST 2015
-*
-* Do not modify this file unless it is present under src/main directory
-*/
-package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgpmanager.impl.rev150326;
-public class BgpManagerImplModuleFactory extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgpmanager.impl.rev150326.AbstractBgpManagerImplModuleFactory {
-
-}
diff --git a/vpnservice/bgpmanager/bgpmanager-impl/src/main/resources/org/opendaylight/blueprint/bgpmanager-impl.xml b/vpnservice/bgpmanager/bgpmanager-impl/src/main/resources/org/opendaylight/blueprint/bgpmanager-impl.xml
new file mode 100644 (file)
index 0000000..0bfbfa5
--- /dev/null
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
+           odl:use-default-for-reference-types="true">
+
+  <reference id="dataBroker"
+             interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+             odl:type="default" />
+  <reference id="entityOwnershipService"
+             interface="org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService" />
+
+  <bean id="bgpAlarmBroadcaster"
+        class="org.opendaylight.netvirt.bgpmanager.oam.BgpAlarmBroadcaster"
+        init-method="init" >
+  </bean>
+
+  <bean id="fibDSWriter" class="org.opendaylight.netvirt.bgpmanager.FibDSWriter">
+    <argument ref="dataBroker" />
+  </bean>
+
+  <bean id="bgpManager" class="org.opendaylight.netvirt.bgpmanager.BgpManager"
+        init-method="init" destroy-method="close">
+    <argument ref="dataBroker" />
+    <argument ref="bgpConfigurationManager" />
+    <argument ref="bgpAlarmBroadcaster" />
+    <argument ref="fibDSWriter" />
+  </bean>
+  <service ref="bgpManager" odl:type="default"
+           interface="org.opendaylight.netvirt.bgpmanager.api.IBgpManager" />
+
+  <bean id="bgpConfigurationManager"
+        class="org.opendaylight.netvirt.bgpmanager.BgpConfigurationManager"
+        destroy-method="close">
+    <argument ref="dataBroker" />
+    <argument ref="entityOwnershipService" />
+    <argument ref="fibDSWriter" />
+    <argument ref="blueprintBundleContext" />
+  </bean>
+</blueprint>
diff --git a/vpnservice/bgpmanager/bgpmanager-impl/src/main/yang/bgpmanager-impl.yang b/vpnservice/bgpmanager/bgpmanager-impl/src/main/yang/bgpmanager-impl.yang
deleted file mode 100644 (file)
index 5409d07..0000000
+++ /dev/null
@@ -1,71 +0,0 @@
-module bgpmanager-impl {
-    yang-version 1;
-    namespace "urn:opendaylight:params:xml:ns:yang:bgpmanager:impl";
-    prefix "bgpmanager-impl";
-
-    import config { prefix config; revision-date 2013-04-05; }
-    import opendaylight-md-sal-binding { prefix md-sal-binding; revision-date 2013-10-28;}
-    import opendaylight-sal-binding-broker-impl { prefix md-sal-binding-impl; revision-date 2013-10-28;}
-    import opendaylight-entity-ownership-service { prefix eos; revision-date 2015-08-10;}
-    import bgpmanager-api { prefix bgpmgr-api; revision-date 2015-04-20;}
-
-    description
-        "Service definition for bgpmanager project";
-
-    revision "2015-03-26" {
-        description
-            "Initial revision";
-    }
-
-    identity bgpmanager-impl {
-        base config:module-type;
-        config:provided-service bgpmgr-api:bgpmanager-api;
-        config:java-name-prefix BgpManagerImpl;
-    }
-
-    augment "/config:modules/config:module/config:configuration" {
-        case bgpmanager-impl {
-            when "/config:modules/config:module/config:type = 'bgpmanager-impl'";
-            container broker {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity md-sal-binding:binding-broker-osgi-registry;
-                    }
-                }
-            }
-            container rpcregistry {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity md-sal-binding:binding-rpc-registry;
-                    }
-                }
-            }
-            container notification-service {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity md-sal-binding-impl:binding-new-notification-service;
-                    }
-                }
-            }
-            container entity-ownership-service {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity eos:entity-ownership-service;
-                    }
-                }
-            }
-            container binding-normalized-node-serializer {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity md-sal-binding:binding-normalized-node-serializer;
-                    }
-                }
-            }
-        }
-    }
-}
index 887b0381ab3b5fe01391292130c086b04f3c4275..6bd3fdf242afe7eb2980ee3e758ffaeddb406ede 100644 (file)
@@ -828,11 +828,12 @@ public class ElanServiceProvider implements BindingAwareProvider, IElanService,
                 interfaceManager.createVLANInterface(interfaceName, parentRef, null, null, null,
                         IfL2vlan.L2vlanMode.Transparent, true);
             } else if (ElanUtils.isVlan(elanInstance)) {
-                String trunkName = parentRef + IfmConstants.OF_URI_SEPARATOR + "trunk";
-                interfaceManager.createVLANInterface(interfaceName, parentRef, null, null, null,
-                        IfL2vlan.L2vlanMode.Trunk, true);
                 Long segmentationId = elanInstance.getSegmentationId();
                 interfaceName = parentRef + IfmConstants.OF_URI_SEPARATOR + segmentationId;
+                String trunkName = parentRef + IfmConstants.OF_URI_SEPARATOR + "trunk";
+                interfaceManager.createVLANInterface(trunkName, parentRef, null, null, null,
+                        IfL2vlan.L2vlanMode.Trunk, true);
+
                 interfaceManager.createVLANInterface(interfaceName, trunkName, null, segmentationId.intValue(), null,
                         IfL2vlan.L2vlanMode.TrunkMember, true);
             }
index c5b33074ce8301f0ab3fdfcbc1fc0b3342966519..cfb489f8de89d477083c423ef9e70198e5c80904 100644 (file)
@@ -164,13 +164,6 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
       <artifactId>vpnmanager-impl</artifactId>
       <version>${vpnmanager.version}</version>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>vpnmanager-impl</artifactId>
-      <version>${vpnmanager.version}</version>
-      <classifier>config</classifier>
-      <type>xml</type>
-    </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>elanmanager-impl</artifactId>
@@ -220,13 +213,6 @@ and is available at http://www.eclipse.org/legal/epl-v10.html INTERNAL
       <artifactId>bgpmanager-impl</artifactId>
       <version>${vpnservices.version}</version>
     </dependency>
-    <dependency>
-      <groupId>${project.groupId}</groupId>
-      <artifactId>bgpmanager-impl</artifactId>
-      <version>${vpnservices.version}</version>
-      <classifier>config</classifier>
-      <type>xml</type>
-    </dependency>
     <dependency>
       <groupId>${project.groupId}</groupId>
       <artifactId>bgpmanager-api</artifactId>
index 48c2812556b540430045871ad9e01d4819573fc3..24a14b4331b707d84251fc5f4a7325cfdcda2f16 100644 (file)
@@ -74,11 +74,7 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
     <bundle>mvn:org.opendaylight.ovsdb/utils.southbound-utils/{{VERSION}}</bundle>
     <bundle>mvn:org.opendaylight.ovsdb/utils.mdsal-utils/{{VERSION}}</bundle>
     <bundle>mvn:org.opendaylight.ovsdb/utils.southbound-utils/{{VERSION}}</bundle>
-    <!--<bundle>mvn:org.opendaylight.vpnservice.third-party/org.apache.thriftlib/1.1.0-SNAPSHOT</bundle>-->
     <bundle>wrap:mvn:org.apache.thrift/libthrift/0.9.1$overwrite=merge&amp;Bundle-Version=0.9.1&amp;Export-Package=*;-noimport:=true;version="0.9.1"</bundle>
-    <!--<bundle>wrap:mvn:javax.servlet/servlet-api/2.5</bundle>-->
-    <configfile finalname="${configfile.directory}/bgpmanager-impl-default-config.xml">mvn:org.opendaylight.netvirt/bgpmanager-impl/{{VERSION}}/xml/config</configfile>
-    <configfile finalname="${configfile.directory}/vpnmanager-impl-default-config.xml">mvn:org.opendaylight.netvirt/vpnmanager-impl/{{VERSION}}/xml/config</configfile>
     <configfile finalname="${configfile.directory}/elanmanager-impl-default-config.xml">mvn:org.opendaylight.netvirt/elanmanager-impl/{{VERSION}}/xml/config</configfile>
     <configfile finalname="${configfile.directory}/natservice-impl-default-config.xml">mvn:org.opendaylight.netvirt/natservice-impl/{{VERSION}}/xml/config</configfile>
     <!--<configfile finalname="${configfile.directory}/cloud-servicechain-impl-default-config.xml">mvn:org.opendaylight.netvirt/cloud-servicechain-impl/{{VERSION}}/xml/config</configfile>-->
index ddb02d013c5adaee7568d959ea720d043fd42010..66cd0cc560bc46e95559610ca450ad5553078d38 100644 (file)
@@ -22,6 +22,7 @@ import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.keepRunti
 
 import java.util.Properties;
 import java.util.concurrent.atomic.AtomicBoolean;
+import javax.inject.Inject;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -31,7 +32,6 @@ import org.opendaylight.controller.mdsal.it.base.AbstractMdsalTestBase;
 import org.opendaylight.netvirt.it.NetvirtITConstants.DefaultFlow;
 import org.opendaylight.netvirt.utils.netvirt.it.utils.FlowITUtil;
 import org.opendaylight.netvirt.utils.netvirt.it.utils.NetITUtil;
-import org.opendaylight.netvirt.vpnmanager.VpnserviceProvider;
 import org.opendaylight.ovsdb.utils.mdsal.utils.MdsalUtils;
 import org.opendaylight.ovsdb.utils.ovsdb.it.utils.DockerOvs;
 import org.opendaylight.ovsdb.utils.ovsdb.it.utils.NodeInfo;
@@ -51,6 +51,7 @@ import org.ops4j.pax.exam.karaf.options.LogLevelOption.LogLevel;
 import org.ops4j.pax.exam.options.MavenUrlReference;
 import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
 import org.ops4j.pax.exam.spi.reactors.PerClass;
+import org.ops4j.pax.exam.util.Filter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -74,8 +75,9 @@ public class NetvirtIT extends AbstractMdsalTestBase {
     private static String connectionType;
     private static String controllerStr;
     private static AtomicBoolean setup = new AtomicBoolean(false);
-    private static DataBroker dataBroker = null;
     private static final String NETVIRT_TOPOLOGY_ID = "netvirt:1";
+    @Inject @Filter(timeout=60000)
+    private static DataBroker dataBroker = null;
 
     @Override
     public String getModuleName() {
@@ -170,8 +172,6 @@ public class NetvirtIT extends AbstractMdsalTestBase {
         Thread.sleep(10*1000);
         getProperties();
 
-        // get the dataBroker
-        dataBroker = VpnserviceProvider.getDataBroker();
         assertNotNull("dataBroker should not be null", dataBroker);
         itUtils = new OvsdbItUtils(dataBroker);
         mdsalUtils = new MdsalUtils(dataBroker);
index 3aaf1c23c30067cff333d7a2438de8206660f178..e4e7a45772ba55a201e66dc5f9801837cb754613 100644 (file)
@@ -13,7 +13,6 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <capability>urn:opendaylight:genius:mdsalutil?module=odl-mdsalutil&amp;revision=2016-04-06</capability>
       <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&amp;revision=2013-10-28</capability>
       <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl?module=opendaylight-sal-binding-broker-impl&amp;revision=2013-10-28</capability>
-      <capability>urn:opendaylight:params:xml:ns:yang:bgpmanager:api?module=bgpmanager-api&amp;revision=2015-04-20</capability>
       <capability>urn:opendaylight:genius:interfacemanager?module=odl-interface&amp;revision=2016-04-06</capability>
   </required-capabilities>
   <configuration>
@@ -31,10 +30,6 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
             <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-rpc-registry</type>
             <name>binding-rpc-broker</name>
           </rpc-registry>
-          <bgpmanager>
-            <type xmlns:bgpmanager="urn:opendaylight:params:xml:ns:yang:bgpmanager:api">bgpmanager:bgpmanager-api</type>
-            <name>bgpmanager</name>
-          </bgpmanager>
           <notification-service>
             <type xmlns:bindingimpl="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">bindingimpl:binding-new-notification-service</type>
             <name>binding-notification-adapter</name>
index d50a58fb95bdca62e04f8140ea4a8ac49d53643b..a67dba343bdff122bf5aa8d2a1d3ea9f64fd3341 100644 (file)
@@ -59,6 +59,7 @@ public class NatServiceProvider implements BindingAwareProvider, AutoCloseable {
     private IInterfaceManager interfaceManager;
     private IFibManager fibManager;
     private VpnFloatingIpHandler handler;
+    private NaptSwitchHA naptSwitchHA;
 
     public NatServiceProvider(RpcProviderRegistry rpcProviderRegistry) {
         this.rpcProviderRegistry = rpcProviderRegistry;
@@ -72,11 +73,6 @@ public class NatServiceProvider implements BindingAwareProvider, AutoCloseable {
         this.mdsalManager = mdsalManager;
     }
 
-    public void setBgpManager(IBgpManager bgpManager) {
-        LOG.debug("BGP Manager reference initialized");
-        this.bgpManager = bgpManager;
-    }
-
     public void setInterfaceManager(IInterfaceManager interfaceManager) {
         this.interfaceManager = interfaceManager;
     }
@@ -151,7 +147,6 @@ public class NatServiceProvider implements BindingAwareProvider, AutoCloseable {
             externalRouterListener.setInterfaceManager(interfaceService);
             externalRouterListener.setIdManager(idManager);
             externalRouterListener.setNaptManager(naptManager);
-            externalRouterListener.setBgpManager(bgpManager);
             externalRouterListener.setFibService(fibService);
             externalRouterListener.setVpnService(vpnService);
             externalRouterListener.setNaptSwitchSelector(naptSwitchSelector);
@@ -186,12 +181,11 @@ public class NatServiceProvider implements BindingAwareProvider, AutoCloseable {
 
             externalRouterListener.setDefaultProgrammer(defaultRouteProgrammer);
 
-            NaptSwitchHA naptSwitchHA = new NaptSwitchHA(dataBroker,naptSwitchSelector);
+            naptSwitchHA = new NaptSwitchHA(dataBroker,naptSwitchSelector);
             naptSwitchHA.setIdManager(idManager);
             naptSwitchHA.setInterfaceManager(interfaceService);
             naptSwitchHA.setMdsalManager(mdsalManager);
             naptSwitchHA.setItmManager(itmManager);
-            naptSwitchHA.setBgpManager(bgpManager);
             naptSwitchHA.setFibService(fibService);
             naptSwitchHA.setVpnService(vpnService);
             naptSwitchHA.setExternalRoutersListener(externalRouterListener);
@@ -236,5 +230,29 @@ public class NatServiceProvider implements BindingAwareProvider, AutoCloseable {
                 externalRouterListener.setFibManager(fibManager);
             }
         });
+
+        // TODO: Remove as part of blueprint fix.
+        // This is simply here to get the IBgpmanager service which is already
+        // moved to blueprint.
+        GlobalEventExecutor.INSTANCE.execute(new Runnable() {
+            @Override
+            public void run() {
+                Bundle b = FrameworkUtil.getBundle(this.getClass());
+                if (b == null) {
+                    return;
+                }
+                BundleContext bundleContext = b.getBundleContext();
+                if (bundleContext == null) {
+                    return;
+                }
+                final WaitingServiceTracker<IBgpManager> tracker = WaitingServiceTracker.create(
+                        IBgpManager.class, bundleContext);
+                IBgpManager bgpManager = tracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
+                LOG.info("NatServiceProvider initialized. IBgpManager={}", bgpManager);
+                handler.setBgpManager(bgpManager);
+                externalRouterListener.setBgpManager(bgpManager);
+                naptSwitchHA.setBgpManager(bgpManager);
+            }
+        });
     }
 }
index d594078ad3a892f0f86f2448b5b90a756feb5704..73b247cac647c6e72a8bfec63c818a631d87b8c4 100644 (file)
@@ -85,6 +85,10 @@ public class VpnFloatingIpHandler implements FloatingIPHandler {
         this.fibManager = fibManager;
     }
 
+    void setBgpManager(IBgpManager bgpManager) {
+        this.bgpManager = bgpManager;
+    }
+
     @Override
     public void onAddFloatingIp(final BigInteger dpnId, final String routerId,
                                 Uuid networkId, final String interfaceName, final String externalIp, final String internalIp) {
index a405894721582b426d43b9dcd1c0d2c156892985..281bcf6e094dcba8a1b163e3e653e8ed01901f0c 100644 (file)
@@ -29,7 +29,6 @@ public class NATServiceModule extends org.opendaylight.yang.gen.v1.urn.opendayli
         provider.setNotificationService(getNotificationServiceDependency());
         provider.setMdsalManager(getMdsalutilDependency());
         provider.setInterfaceManager(getOdlinterfaceDependency());
-        provider.setBgpManager(getBgpmanagerDependency());
         getBrokerDependency().registerProvider(provider);
         return provider;
     }
index b7c4d90eea932c64df3c1d67b3eb0b58a506971c..b95c01a2b7b2e7770e9f9082243ca1d654066163 100644 (file)
@@ -7,7 +7,6 @@ module natservice-impl {
     import opendaylight-md-sal-binding { prefix md-sal-binding; revision-date 2013-10-28;}
     import opendaylight-sal-binding-broker-impl { prefix md-sal-binding-impl; revision-date 2013-10-28; }
     import odl-mdsalutil { prefix odl-mdsal; revision-date 2016-04-06;}
-    import bgpmanager-api { prefix bgpmgr-api; revision-date 2015-04-20;}
     import odl-interface {prefix odlif; revision-date 2016-04-06;}
 
     description
@@ -42,14 +41,6 @@ module natservice-impl {
                       }
                  }
             }
-            container bgpmanager {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity bgpmgr-api:bgpmanager-api;
-                    }
-                }
-            }
             container notification-service {
                 uses config:service-ref {
                     refine type {
index 9493cf2a5e0287fd7315521de0fe8f5ec1a95af1..e83490ac4288cf071dcd32add65ade01a5928f32 100644 (file)
@@ -38,11 +38,9 @@ public class ConfigStateManager {
     }
 
     private void initReady() {
-        readyMap.put("bgpmanager-impl", Pair.of("bgpmanager-default", false));
         readyMap.put("dhcpservice-impl", Pair.of("dhcpservice-default", false)); // no service
         readyMap.put("elanservice-impl", Pair.of("elanservice-default", false));
         readyMap.put("natservice-impl", Pair.of("natservice-default", false)); // no service
-        readyMap.put("vpnservice-impl", Pair.of("vpnservice-default", false));
     }
 
     private void getServices() {
diff --git a/vpnservice/vpnmanager/vpnmanager-api/src/main/yang/vpnmanager-api.yang b/vpnservice/vpnmanager/vpnmanager-api/src/main/yang/vpnmanager-api.yang
deleted file mode 100644 (file)
index ab56e6f..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-module vpnmanager-api {
-    yang-version 1;
-    namespace "urn:opendaylight:params:xml:ns:yang:vpnmanager:api";
-    prefix "vpnmanager-api";
-
-    import config { prefix config; revision-date 2013-04-05; }
-
-    description
-        "Service definition for vpnmanager project";
-
-    revision "2015-05-08" {
-        description
-            "Initial revision";
-    }
-
-    identity vpnmanager-api {
-        base "config:service-type";
-        config:java-class "org.opendaylight.netvirt.vpnmanager.api.IVpnManager";
-    }
-}
\ No newline at end of file
diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/main/config/default-config.xml b/vpnservice/vpnmanager/vpnmanager-impl/src/main/config/default-config.xml
deleted file mode 100644 (file)
index 7d8255d..0000000
+++ /dev/null
@@ -1,61 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- vi: set et smarttab sw=4 tabstop=4: -->
-<!--
-Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
-
-This program and the accompanying materials are made available under the
-terms of the Eclipse Public License v1.0 which accompanies this distribution,
-and is available at http://www.eclipse.org/legal/epl-v10.html
--->
-<snapshot>
-  <required-capabilities>
-      <capability>urn:opendaylight:params:xml:ns:yang:vpnservice:impl?module=vpnservice-impl&amp;revision=2015-02-16</capability>
-      <capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding?module=opendaylight-md-sal-binding&amp;revision=2013-10-28</capability>
-      <capability>urn:opendaylight:params:xml:ns:yang:bgpmanager:api?module=bgpmanager-api&amp;revision=2015-04-20</capability>
-      <capability>urn:opendaylight:genius:mdsalutil?module=odl-mdsalutil&amp;revision=2016-04-06</capability>
-  </required-capabilities>
-  <configuration>
-
-    <data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
-      <modules xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
-        <module>
-          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:vpnservice:impl">prefix:vpnservice-impl</type>
-          <name>vpnservice-default</name>
-          <broker>
-            <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-broker-osgi-registry</type>
-            <name>binding-osgi-broker</name>
-          </broker>
-          <rpcregistry>
-            <type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">binding:binding-rpc-registry</type>
-            <name>binding-rpc-broker</name>
-          </rpcregistry>
-          <bgpmanager>
-            <type xmlns:bgpmanager="urn:opendaylight:params:xml:ns:yang:bgpmanager:api">bgpmanager:bgpmanager-api</type>
-            <name>bgpmanager</name>
-          </bgpmanager>
-          <mdsalutil>
-            <type xmlns:mdsalutil="urn:opendaylight:genius:mdsalutil">mdsalutil:odl-mdsalutil</type>
-            <name>mdsalutil-service</name>
-          </mdsalutil>
-          <notification-service>
-            <type xmlns:bindingimpl="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">bindingimpl:binding-new-notification-service</type>
-            <name>binding-notification-adapter</name>
-          </notification-service>
-          <notification-publish-service>
-            <type xmlns:bindingimpl="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">bindingimpl:binding-new-notification-publish-service</type>
-            <name>binding-notification-publish-adapter</name>
-          </notification-publish-service>
-        </module>
-      </modules>
-      <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
-        <service>
-          <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:vpnmanager:api">prefix:vpnmanager-api</type>
-          <instance>
-            <name>vpnmanager</name>
-            <provider>/modules/module[type='vpnservice-impl'][name='vpnservice-default']</provider>
-          </instance>
-        </service>
-      </services>
-    </data>
-  </configuration>
-</snapshot>
index 669fb325443348f8c0fb9b666595a514941fbf4c..82caaf24213d745403a6418491382b2e5e1be183 100644 (file)
@@ -11,6 +11,7 @@ import com.google.common.base.Optional;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.mdsalutil.MetaDataUtil;
+import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
@@ -35,15 +36,16 @@ import org.slf4j.LoggerFactory;
 import java.math.BigInteger;
 
 public class ArpNotificationHandler implements OdlArputilListener {
-
-    VpnInterfaceManager vpnIfManager;
-    DataBroker broker;
-
     private static final Logger LOG = LoggerFactory.getLogger(ArpNotificationHandler.class);
+    DataBroker dataBroker;
+    VpnInterfaceManager vpnIfManager;
+    final IElanService elanService;
 
-    public ArpNotificationHandler(VpnInterfaceManager vpnIfMgr, DataBroker dataBroker) {
+    public ArpNotificationHandler(DataBroker dataBroker, VpnInterfaceManager vpnIfMgr,
+                                  final IElanService elanService) {
+        this.dataBroker = dataBroker;
         vpnIfManager = vpnIfMgr;
-        broker = dataBroker;
+        this.elanService = elanService;
     }
 
     @Override
@@ -64,12 +66,12 @@ public class ArpNotificationHandler implements OdlArputilListener {
         if (metadata != null && metadata != BigInteger.ZERO) {
             long vpnId = MetaDataUtil.getVpnIdFromMetadata(metadata);
             // Respond to ARP request only if vpnservice is configured on the interface
-            if (VpnUtil.isVpnInterfaceConfigured(broker, srcInterface)) {
+            if (VpnUtil.isVpnInterfaceConfigured(dataBroker, srcInterface)) {
                 LOG.info("Received ARP Request for interface {} ", srcInterface);
                 InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.id.to.vpn.instance.VpnIds>
                         vpnIdsInstanceIdentifier = VpnUtil.getVpnIdToVpnInstanceIdentifier(vpnId);
                 Optional<VpnIds> vpnIdsOptional
-                        = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vpnIdsInstanceIdentifier);
+                        = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vpnIdsInstanceIdentifier);
                 if (!vpnIdsOptional.isPresent()) {
                     // Donot respond to ARP requests on unknown VPNs
                     LOG.trace("ARP NO_RESOLVE: VPN {} not configured. Ignoring responding to ARP requests on this VPN", vpnId);
@@ -79,7 +81,7 @@ public class ArpNotificationHandler implements OdlArputilListener {
                 String ipToQuery = notification.getSrcIpaddress().getIpv4Address().getValue();
                 LOG.trace("ArpRequest being processed for Source IP {}", ipToQuery);
                 VpnIds vpnIds = vpnIdsOptional.get();
-                VpnPortipToPort vpnPortipToPort = VpnUtil.getNeutronPortFromVpnPortFixedIp(broker, vpnIds.getVpnInstanceName(), ipToQuery);
+                VpnPortipToPort vpnPortipToPort = VpnUtil.getNeutronPortFromVpnPortFixedIp(dataBroker, vpnIds.getVpnInstanceName(), ipToQuery);
                 if (vpnPortipToPort != null) {
                     String oldPortName = vpnPortipToPort.getPortName();
                     String oldMac = vpnPortipToPort.getMacAddress();
@@ -90,7 +92,7 @@ public class ArpNotificationHandler implements OdlArputilListener {
                         if (!vpnPortipToPort.isConfig()) {
                                 synchronized ((vpnName + ipToQuery).intern()) {
                                     vpnIfManager.removeMIPAdjacency(vpnName, oldPortName, srcIP);
-                                    VpnUtil.removeVpnPortFixedIpToPort(broker, vpnName, ipToQuery);
+                                    VpnUtil.removeVpnPortFixedIpToPort(dataBroker, vpnName, ipToQuery);
                                 }
                                 try {
                                     Thread.sleep(2000);
@@ -105,12 +107,12 @@ public class ArpNotificationHandler implements OdlArputilListener {
                         }
                     } else {
                         synchronized ((vpnName + ipToQuery).intern()) {
-                            VpnUtil.createVpnPortFixedIpToPort(broker, vpnName, ipToQuery, srcInterface, srcMac.getValue(), false, false, true);
+                            VpnUtil.createVpnPortFixedIpToPort(dataBroker, vpnName, ipToQuery, srcInterface, srcMac.getValue(), false, false, true);
                             vpnIfManager.addMIPAdjacency(vpnName, srcInterface, srcIP);
                         }
                     }
                     String targetIpToQuery = notification.getDstIpaddress().getIpv4Address().getValue();
-                    VpnPortipToPort vpnTargetIpToPort = VpnUtil.getNeutronPortFromVpnPortFixedIp(broker,
+                    VpnPortipToPort vpnTargetIpToPort = VpnUtil.getNeutronPortFromVpnPortFixedIp(dataBroker,
                             vpnIds.getVpnInstanceName(), targetIpToQuery);
                     //Process and respond from Controller only for GatewayIp ARP request
                     if (vpnTargetIpToPort != null) {
@@ -128,7 +130,7 @@ public class ArpNotificationHandler implements OdlArputilListener {
                             InstanceIdentifier<Port> inst = InstanceIdentifier.create(Neutron.class)
                                     .child(Ports.class)
                                     .child(Port.class, new PortKey(portUuid));
-                            Optional<Port> port = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, inst);
+                            Optional<Port> port = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, inst);
                             if (port.isPresent()) {
                                 prt = port.get();
                                 Uuid subnetUUID = prt.getFixedIps().get(0).getSubnetId();
@@ -137,7 +139,7 @@ public class ArpNotificationHandler implements OdlArputilListener {
                                 InstanceIdentifier<Subnet> subnetidentifier = InstanceIdentifier.create(Neutron.class)
                                         .child(Subnets.class)
                                         .child(Subnet.class, subnetkey);
-                                Optional<Subnet> subnet = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, subnetidentifier);
+                                Optional<Subnet> subnet = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, subnetidentifier);
                                 if (subnet.isPresent()) {
                                     gw = subnet.get().getGatewayIp().getIpv4Address().getValue();
                                     if (targetIpToQuery.equalsIgnoreCase(gw)) {
@@ -146,7 +148,7 @@ public class ArpNotificationHandler implements OdlArputilListener {
                                     }
                                 }
                             }
-                    } else if (VpnmanagerServiceAccessor.getElanProvider().isExternalInterface(srcInterface)) {
+                    } else if (elanService.isExternalInterface(srcInterface)) {
                         handleArpRequestFromExternalInterface(srcInterface, srcIP, srcMac, targetIP);
                     } else {
                         LOG.trace("ARP request is not on an External VPN/Interface, so ignoring the request.");
@@ -169,17 +171,17 @@ public class ArpNotificationHandler implements OdlArputilListener {
             InstanceIdentifier<VpnIds>
                     vpnIdsInstanceIdentifier = VpnUtil.getVpnIdToVpnInstanceIdentifier(vpnId);
             Optional<VpnIds> vpnIdsOptional
-                    = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vpnIdsInstanceIdentifier);
+                    = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vpnIdsInstanceIdentifier);
             if (!vpnIdsOptional.isPresent()) {
                 // Donot respond to ARP requests on unknown VPNs
                 LOG.trace("ARP NO_RESOLVE: VPN {} not configured. Ignoring responding to ARP requests on this VPN", vpnId);
                 return;
             }
-            if (VpnUtil.isVpnInterfaceConfigured(broker, srcInterface)) {
+            if (VpnUtil.isVpnInterfaceConfigured(dataBroker, srcInterface)) {
                 String vpnName = vpnIdsOptional.get().getVpnInstanceName();
                 String ipToQuery = notification.getIpaddress().getIpv4Address().getValue();
                 VpnIds vpnIds = vpnIdsOptional.get();
-                VpnPortipToPort vpnPortipToPort = VpnUtil.getNeutronPortFromVpnPortFixedIp(broker, vpnIds.getVpnInstanceName(), ipToQuery);
+                VpnPortipToPort vpnPortipToPort = VpnUtil.getNeutronPortFromVpnPortFixedIp(dataBroker, vpnIds.getVpnInstanceName(), ipToQuery);
                 if (vpnPortipToPort != null) {
                     String oldMac = vpnPortipToPort.getMacAddress();
                     String oldPortName = vpnPortipToPort.getPortName();
@@ -190,7 +192,7 @@ public class ArpNotificationHandler implements OdlArputilListener {
                         if (!vpnPortipToPort.isConfig()) {
                                 synchronized ((vpnName + ipToQuery).intern()) {
                                     vpnIfManager.removeMIPAdjacency(vpnName, oldPortName, srcIP);
-                                    VpnUtil.removeVpnPortFixedIpToPort(broker, vpnName, ipToQuery);
+                                    VpnUtil.removeVpnPortFixedIpToPort(dataBroker, vpnName, ipToQuery);
                                 }
                                 try {
                                     Thread.sleep(2000);
@@ -204,7 +206,7 @@ public class ArpNotificationHandler implements OdlArputilListener {
                         }
                     } else {
                         synchronized ((vpnName + ipToQuery).intern()) {
-                            VpnUtil.createVpnPortFixedIpToPort(broker, vpnName, ipToQuery, srcInterface, srcMac.getValue(), false, false, true);
+                            VpnUtil.createVpnPortFixedIpToPort(dataBroker, vpnName, ipToQuery, srcInterface, srcMac.getValue(), false, false, true);
                             vpnIfManager.addMIPAdjacency(vpnName, srcInterface, srcIP);
                         }
                     }
@@ -214,7 +216,7 @@ public class ArpNotificationHandler implements OdlArputilListener {
 
     private void handleArpRequestFromExternalInterface(String srcInterface, IpAddress srcIP, PhysAddress srcMac,
             IpAddress targetIP) {
-        Port port = VpnUtil.getNeutronPortForFloatingIp(broker, targetIP);
+        Port port = VpnUtil.getNeutronPortForFloatingIp(dataBroker, targetIP);
         String targetIpValue = targetIP.getIpv4Address().getValue();
         if (port == null) {
             LOG.trace("No neutron port found for with floating ip {}", targetIpValue);
index c2096b6d49f0e3e7e7c43d84c30e96285a2266aa..7e80744ddfd1e4a031f883db681438ec071f7413 100644 (file)
@@ -51,29 +51,35 @@ import java.util.List;
 import java.util.concurrent.*;
 
 public class ArpScheduler extends AsyncDataTreeChangeListenerBase<VpnPortipToPort,ArpScheduler> {
-
+    private static final Logger LOG = LoggerFactory.getLogger(ArpScheduler.class);
+    private final DataBroker dataBroker;
+    private final OdlInterfaceRpcService intfRpc;
     private ScheduledExecutorService executorService;
-    private OdlInterfaceRpcService interfaceRpc;
-    private DataBroker dataBroker;
     private ScheduledFuture<?> scheduledResult;
-    private static final Logger LOG = LoggerFactory.getLogger(ArpScheduler.class);
     private DelayQueue<MacEntry> macEntryQueue = new DelayQueue<MacEntry>();
-    private ListenerRegistration<ArpScheduler> listenerRegistration;
 
-    public ArpScheduler(OdlInterfaceRpcService interfaceRpc, DataBroker dataBroker) {
+    public ArpScheduler(final DataBroker dataBroker, final OdlInterfaceRpcService interfaceRpc) {
         super(VpnPortipToPort.class, ArpScheduler.class);
         this.dataBroker = dataBroker;
-        this.interfaceRpc = interfaceRpc;
+        this.intfRpc = interfaceRpc;
+    }
+
+    public void start() {
+        LOG.info("{} start", getClass().getSimpleName());
+        registerListener(LogicalDatastoreType.CONFIGURATION, dataBroker);
         Long timeout = Long.getLong("arp.cache.timeout");
         if (timeout == null) {
             timeout = ArpConstants.DEFAULT_ARP_LEARNED_CACHE_TIMEOUT;
         }
         ArpConstants.arpCacheTimeout = timeout;
-        registerListener();
         executorService = Executors.newScheduledThreadPool(ArpConstants.THREAD_POOL_SIZE, getThreadFactory("Arp Cache Timer Tasks"));
         scheduleExpiredEntryDrainerTask();
     }
 
+    @Override
+    protected InstanceIdentifier<VpnPortipToPort> getWildCardPath() {
+        return InstanceIdentifier.create(NeutronVpnPortipPortData.class).child(VpnPortipToPort.class);
+    }
 
     private void scheduleExpiredEntryDrainerTask() {
         LOG.info("Scheduling expired entry drainer task");
@@ -137,16 +143,6 @@ public class ArpScheduler extends AsyncDataTreeChangeListenerBase<VpnPortipToPor
            .child(VpnPortipToPort.class, new VpnPortipToPortKey(ip,vpnName)).build();
     }
 
-    private void registerListener() {
-        try {
-           final DataTreeIdentifier<VpnPortipToPort> treeId = new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, getWildCardPath());
-           listenerRegistration = dataBroker.registerDataTreeChangeListener(treeId, this);
-        } catch (final Exception e) {
-            LOG.error("VPN Service DataChange listener registration fail !", e);
-            throw new IllegalStateException("VPN Service registration Listener failed.", e);
-        }
-     }
-
     @Override
     protected ArpScheduler getDataTreeChangeListener() {
         return this;
@@ -192,11 +188,6 @@ public class ArpScheduler extends AsyncDataTreeChangeListenerBase<VpnPortipToPor
         }
     }
 
-    @Override
-    protected InstanceIdentifier<VpnPortipToPort> getWildCardPath() {
-       return InstanceIdentifier.create(NeutronVpnPortipPortData.class).child(VpnPortipToPort.class);
-    }
-
     @Override
     protected void remove(InstanceIdentifier<VpnPortipToPort> key, VpnPortipToPort dataObjectModification) {
     }
index 19391d55dea83f37998943f7ef81d7d9027410c8..a9bb443a96438edc452e7aa2f34efd8b128c31e9 100644 (file)
@@ -9,38 +9,27 @@ package org.opendaylight.netvirt.vpnmanager;
 
 import com.google.common.base.Optional;
 import com.google.common.util.concurrent.CheckedFuture;
-import com.google.common.util.concurrent.ListenableFuture;
+import java.math.BigInteger;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
-import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
-import org.opendaylight.genius.mdsalutil.*;
-import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.AddDpnEvent;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.OdlL3vpnListener;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.RemoveDpnEvent;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.remove.dpn.event.RemoveEventData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry
-        .VpnToDpnList;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-
 public class DpnInVpnChangeListener implements OdlL3vpnListener {
     private static final Logger LOG = LoggerFactory.getLogger(DpnInVpnChangeListener.class);
-    private DataBroker dataBroker;
-    private IMdsalApiManager mdsalManager;
-    private IdManagerService idManager;
+    private final DataBroker dataBroker;
 
     public DpnInVpnChangeListener(DataBroker dataBroker) {
         this.dataBroker = dataBroker;
@@ -82,7 +71,7 @@ public class DpnInVpnChangeListener implements OdlL3vpnListener {
                     } catch (InterruptedException | ExecutionException e) {
                         LOG.error("Error removing dpnToVpnList for vpn {} ", vpnName);
                         throw new RuntimeException(e.getMessage());
-                    }                          
+                    }
                 }
             }
         }
diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/FibEntriesListener.java b/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/FibEntriesListener.java
new file mode 100644 (file)
index 0000000..0fbefa4
--- /dev/null
@@ -0,0 +1,113 @@
+/*
+ * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.netvirt.vpnmanager;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTablesKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntryBuilder;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class FibEntriesListener extends AbstractDataChangeListener<VrfEntry> implements AutoCloseable {
+    private static final Logger LOG = LoggerFactory.getLogger(FibEntriesListener.class);
+    private ListenerRegistration<DataChangeListener> listenerRegistration;
+    private final DataBroker dataBroker;
+    private final VpnInstanceListener vpnInstanceListener;
+
+    public FibEntriesListener(final DataBroker dataBroker, final VpnInstanceListener vpnInstanceListener) {
+        super(VrfEntry.class);
+        this.dataBroker = dataBroker;
+        this.vpnInstanceListener = vpnInstanceListener;
+    }
+
+    public void start() {
+        LOG.info("{} start", getClass().getSimpleName());
+        listenerRegistration = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
+                getWildCardPath(), this, AsyncDataBroker.DataChangeScope.BASE);
+    }
+
+    private InstanceIdentifier<VrfEntry> getWildCardPath() {
+        return InstanceIdentifier.create(FibEntries.class).child(VrfTables.class).child(VrfEntry.class);
+    }
+
+    @Override
+    public void close() throws Exception {
+        if (listenerRegistration != null) {
+            listenerRegistration.close();
+            listenerRegistration = null;
+        }
+        LOG.info("{} close", getClass().getSimpleName());
+    }
+
+    @Override
+    protected void remove(InstanceIdentifier<VrfEntry> identifier,
+                          VrfEntry del) {
+        LOG.trace("Remove Fib event - Key : {}, value : {} ", identifier, del);
+        final VrfTablesKey key = identifier.firstKeyOf(VrfTables.class, VrfTablesKey.class);
+        String rd = key.getRouteDistinguisher();
+        Long label = del.getLabel();
+        VpnInstanceOpDataEntry vpnInstanceOpData = vpnInstanceListener.getVpnInstanceOpData(rd);
+        if(vpnInstanceOpData != null) {
+            List<Long> routeIds = vpnInstanceOpData.getRouteEntryId();
+            if(routeIds == null) {
+                LOG.debug("Fib Route entry is empty.");
+                return;
+            }
+            LOG.debug("Removing label from vpn info - {}", label);
+            routeIds.remove(label);
+            TransactionUtil.asyncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                    VpnUtil.getVpnInstanceOpDataIdentifier(rd),
+                    new VpnInstanceOpDataEntryBuilder(vpnInstanceOpData).setRouteEntryId(routeIds).build(),
+                    TransactionUtil.DEFAULT_CALLBACK);
+        } else {
+            LOG.warn("No VPN Instance found for RD: {}", rd);
+        }
+    }
+
+    @Override
+    protected void update(InstanceIdentifier<VrfEntry> identifier,
+                          VrfEntry original, VrfEntry update) {
+        // TODO Auto-generated method stub
+
+    }
+
+    @Override
+    protected void add(InstanceIdentifier<VrfEntry> identifier,
+                       VrfEntry add) {
+        LOG.trace("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();
+        VpnInstanceOpDataEntry vpn = vpnInstanceListener.getVpnInstanceOpData(rd);
+        if(vpn != null) {
+            List<Long> routeIds = vpn.getRouteEntryId();
+            if(routeIds == null) {
+                routeIds = new ArrayList<>();
+            }
+            LOG.debug("Adding label to vpn info - {}", label);
+            routeIds.add(label);
+            TransactionUtil.asyncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                    VpnUtil.getVpnInstanceOpDataIdentifier(rd),
+                    new VpnInstanceOpDataEntryBuilder(vpn).setRouteEntryId(routeIds).build(),
+                    TransactionUtil.DEFAULT_CALLBACK);
+        } else {
+            LOG.warn("No VPN Instance found for RD: {}", rd);
+        }
+    }
+}
index b459a04c29d1eeb66ab0cc8afa7cb3f7695c2b7e..71f4872b88ffdc738e192d1e5f107a7ece7234ac 100644 (file)
@@ -7,14 +7,16 @@
  */
 package org.opendaylight.netvirt.vpnmanager;
 
+import com.google.common.net.InetAddresses;
 import java.math.BigInteger;
 import java.util.Collection;
 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.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.datastoreutils.AsyncDataTreeChangeListenerBase;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.netvirt.elanmanager.api.IElanService;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddressBuilder;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.MacAddress;
@@ -35,23 +37,26 @@ import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.net.InetAddresses;
-
 public class FloatingIpGarpHandler extends AsyncDataTreeChangeListenerBase<RouterPorts, FloatingIpGarpHandler>
         implements AutoCloseable {
-
-    private DataBroker broker;
-    private PacketProcessingService packetService;
-    OdlInterfaceRpcService intfRpc;
-    private static final Logger s_logger = LoggerFactory.getLogger(FloatingIpGarpHandler.class);
-
-    public FloatingIpGarpHandler(DataBroker broker) {
+    private static final Logger LOG = LoggerFactory.getLogger(FloatingIpGarpHandler.class);
+    private final DataBroker dataBroker;
+    private final PacketProcessingService packetService;
+    private final IElanService elanService;
+    private final OdlInterfaceRpcService intfRpc;
+
+    public FloatingIpGarpHandler(final DataBroker dataBroker, final PacketProcessingService packetService,
+                                 final IElanService elanService, final OdlInterfaceRpcService interfaceManager) {
         super(RouterPorts.class, FloatingIpGarpHandler.class);
-        this.broker = broker;
+        this.dataBroker = dataBroker;
+        this.packetService = packetService;
+        this.elanService = elanService;
+        this.intfRpc = interfaceManager;
     }
 
-    public void setPacketService(PacketProcessingService packetService) {
-        this.packetService = packetService;
+    public void start() {
+        LOG.info("{} start", getClass().getSimpleName());
+        registerListener(LogicalDatastoreType.OPERATIONAL, dataBroker);
     }
 
     @Override
@@ -80,13 +85,13 @@ public class FloatingIpGarpHandler extends AsyncDataTreeChangeListenerBase<Route
 
     private void sendGarpForIp(RouterPorts dataObjectModificationAfter, IpAddress ip) {
         if (ip.getIpv4Address() == null) {
-            s_logger.warn("Faild to send GARP for IP. recieved IPv6.");
+            LOG.warn("Faild to send GARP for IP. recieved IPv6.");
             return;
         }
-        Port floatingIpPort = VpnUtil.getNeutronPortForFloatingIp(broker, ip);
+        Port floatingIpPort = VpnUtil.getNeutronPortForFloatingIp(dataBroker, ip);
         MacAddress floatingIpMac = floatingIpPort.getMacAddress();
-        String extNet = VpnUtil.getAssociatedExternalNetwork(broker, dataObjectModificationAfter.getRouterId());
-        Collection<String> interfaces = VpnmanagerServiceAccessor. getElanProvider().getExternalElanInterfaces(extNet);
+        String extNet = VpnUtil.getAssociatedExternalNetwork(dataBroker, dataObjectModificationAfter.getRouterId());
+        Collection<String> interfaces = elanService.getExternalElanInterfaces(extNet);
         for (String externalInterface:interfaces) {
             sendGarpOnInterface(ip, floatingIpMac, externalInterface);
             
@@ -104,9 +109,9 @@ public class FloatingIpGarpHandler extends AsyncDataTreeChangeListenerBase<Route
             TransmitPacketInput arpRequestInput = ArpUtils.createArpRequestInput(dpId, ArpUtils.getMacInBytes(floatingIpMac.getValue()), ipBytes, ipBytes, ingress);
             packetService.transmitPacket(arpRequestInput);
         } catch (InterruptedException e) {
-            s_logger.warn("Faild to send GARP. rpc call getPortFromInterface did not return with a value.");
+            LOG.warn("Faild to send GARP. rpc call getPortFromInterface did not return with a value.");
         } catch (ExecutionException e) {
-            s_logger.warn("Faild to send GARP. rpc call getPortFromInterface did not return with a value.");
+            LOG.warn("Faild to send GARP. rpc call getPortFromInterface did not return with a value.");
         }
     }
 
index d805d3692fffcd3f6c164b1917102741779cd478..820cffd24a2f0980fb5d0af3377aadcb257ad71c 100644 (file)
@@ -25,59 +25,48 @@ 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.state.Interface;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.router.interfaces.RouterInterface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.math.BigInteger;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 
 public class InterfaceStateChangeListener extends AbstractDataChangeListener<Interface> implements AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(InterfaceStateChangeListener.class);
-
     private ListenerRegistration<DataChangeListener> listenerRegistration;
-    private final DataBroker broker;
-    private VpnInterfaceManager vpnInterfaceManager;
-    private OdlInterfaceRpcService interfaceManager;
-
+    private final DataBroker dataBroker;
+    private final VpnInterfaceManager vpnInterfaceManager;
 
-    public InterfaceStateChangeListener(final DataBroker db, VpnInterfaceManager vpnInterfaceManager) {
+    public InterfaceStateChangeListener(final DataBroker dataBroker, VpnInterfaceManager vpnInterfaceManager) {
         super(Interface.class);
-        broker = db;
+        this.dataBroker = dataBroker;
         this.vpnInterfaceManager = vpnInterfaceManager;
-        registerListener(db);
     }
 
-    public void setIfaceMgrRpcService(OdlInterfaceRpcService interfaceManager) {
-        this.interfaceManager = interfaceManager;
+    public void start() {
+        LOG.info("{} start", getClass().getSimpleName());
+        listenerRegistration = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
+                getWildCardPath(), this, DataChangeScope.SUBTREE);
+    }
+
+    private InstanceIdentifier<Interface> getWildCardPath() {
+        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
     }
 
     @Override
     public void close() throws Exception {
         if (listenerRegistration != null) {
-            try {
-                listenerRegistration.close();
-            } catch (final Exception e) {
-                LOG.error("Error when cleaning up DataChangeListener.", e);
-            }
+            listenerRegistration.close();
             listenerRegistration = null;
         }
-        LOG.info("Interface listener Closed");
-    }
-
-
-    private void registerListener(final DataBroker db) {
-        try {
-            listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
-                    getWildCardPath(), InterfaceStateChangeListener.this, DataChangeScope.SUBTREE);
-        } catch (final Exception e) {
-            LOG.error("Interface DataChange listener registration failed", e);
-            throw new IllegalStateException("Nexthop Manager registration Listener failed.", e);
-        }
+        LOG.info("{} close", getClass().getSimpleName());
     }
 
     @Override
@@ -87,7 +76,7 @@ public class InterfaceStateChangeListener extends AbstractDataChangeListener<Int
             final String interfaceName = intrf.getName();
             LOG.info("Received interface add event for interface {} ", interfaceName);
             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface
-                    configInterface = InterfaceUtils.getInterface(broker, interfaceName);
+                    configInterface = InterfaceUtils.getInterface(dataBroker, interfaceName);
             if (configInterface != null) {
                 if (!configInterface.getType().equals(Tunnel.class)) {
                     // We service only VM interfaces and Router interfaces here.
@@ -95,7 +84,7 @@ public class InterfaceStateChangeListener extends AbstractDataChangeListener<Int
                     // Tunnel events are directly serviced
                     // by TunnelInterfacesStateListener present as part of VpnInterfaceManager
                     LOG.debug("Config Interface Name {}", configInterface.getName());
-                    final VpnInterface vpnInterface = VpnUtil.getConfiguredVpnInterface(broker, interfaceName);
+                    final VpnInterface vpnInterface = VpnUtil.getConfiguredVpnInterface(dataBroker, interfaceName);
                     if (vpnInterface != null) {
                         LOG.debug("VPN Interface Name {}", vpnInterface);
                         final BigInteger dpnId = InterfaceUtils.getDpIdFromInterface(intrf);
@@ -105,12 +94,12 @@ public class InterfaceStateChangeListener extends AbstractDataChangeListener<Int
                                 new Callable<List<ListenableFuture<Void>>>() {
                                     @Override
                                     public List<ListenableFuture<Void>> call() throws Exception {
-                                        WriteTransaction writeConfigTxn = broker.newWriteOnlyTransaction();
-                                        WriteTransaction writeOperTxn = broker.newWriteOnlyTransaction();
-                                                                               WriteTransaction writeInvTxn = broker.newWriteOnlyTransaction();
+                                        WriteTransaction writeConfigTxn = dataBroker.newWriteOnlyTransaction();
+                                        WriteTransaction writeOperTxn = dataBroker.newWriteOnlyTransaction();
+                                        WriteTransaction writeInvTxn = dataBroker.newWriteOnlyTransaction();
                                         vpnInterfaceManager.processVpnInterfaceUp(dpnId, vpnInterface, ifIndex, false,
                                                 writeConfigTxn, writeOperTxn, writeInvTxn);
-                                        String routerName = VpnUtil.getNeutronRouterFromInterface(broker, interfaceName);
+                                        String routerName = VpnUtil.getNeutronRouterFromInterface(dataBroker, interfaceName);
                                         if (routerName != null) {
                                             LOG.debug("Router Name {} ", routerName);
                                             handleRouterInterfacesUpEvent(routerName, interfaceName, writeOperTxn);
@@ -157,11 +146,6 @@ public class InterfaceStateChangeListener extends AbstractDataChangeListener<Int
         }
     }
 
-
-    private InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
-    }
-
     @Override
     protected void remove(InstanceIdentifier<Interface> identifier, Interface intrf) {
         LOG.trace("Received interface {} down event", intrf);
@@ -175,7 +159,7 @@ public class InterfaceStateChangeListener extends AbstractDataChangeListener<Int
             } else {
                 BigInteger dpId = BigInteger.ZERO;
                 InstanceIdentifier<VpnInterface> id = VpnUtil.getVpnInterfaceIdentifier(interfaceName);
-                Optional<VpnInterface> optVpnInterface = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, id);
+                Optional<VpnInterface> optVpnInterface = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
                 if (!optVpnInterface.isPresent()) {
                     LOG.debug("Interface {} is not a vpninterface, ignoring.", intrf.getName());
                     return;
@@ -194,12 +178,12 @@ public class InterfaceStateChangeListener extends AbstractDataChangeListener<Int
                         new Callable<List<ListenableFuture<Void>>>() {
                             @Override
                             public List<ListenableFuture<Void>> call() throws Exception {
-                                WriteTransaction writeOperTxn = broker.newWriteOnlyTransaction();
-                                WriteTransaction writeConfigTxn = broker.newWriteOnlyTransaction();
-                                WriteTransaction writeInvTxn = broker.newWriteOnlyTransaction();
+                                WriteTransaction writeOperTxn = dataBroker.newWriteOnlyTransaction();
+                                WriteTransaction writeConfigTxn = dataBroker.newWriteOnlyTransaction();
+                                WriteTransaction writeInvTxn = dataBroker.newWriteOnlyTransaction();
                                 vpnInterfaceManager.processVpnInterfaceDown(dpnId, interfaceName, ifIndex, false, false,
                                         writeConfigTxn, writeOperTxn, writeInvTxn);
-                                RouterInterface routerInterface = VpnUtil.getConfiguredRouterInterface(broker, interfaceName);
+                                RouterInterface routerInterface = VpnUtil.getConfiguredRouterInterface(dataBroker, interfaceName);
                                 if (routerInterface != null) {
                                     handleRouterInterfacesDownEvent(routerInterface.getRouterName(), interfaceName, dpnId, writeOperTxn);
                                 }
@@ -215,7 +199,7 @@ public class InterfaceStateChangeListener extends AbstractDataChangeListener<Int
                                 try {
                                     futures.get();
                                 } catch (InterruptedException | ExecutionException e) {
-                                                                       LOG.error("Error removing Config data for interface {} from vpn {} on dpn {}", interfaceName,
+                                    LOG.error("Error removing Config data for interface {} from vpn {} on dpn {}", interfaceName,
                                             vpnInterface.getVpnInstanceName(), dpnId);
                                     throw new RuntimeException(e.getMessage());
                                 }
@@ -226,7 +210,7 @@ public class InterfaceStateChangeListener extends AbstractDataChangeListener<Int
                                     LOG.error("Error removing Inventory/Flow data for interface {} from vpn {} on dpn {}", interfaceName,
                                             vpnInterface.getVpnInstanceName(), dpnId);
                                     throw new RuntimeException(e.getMessage());
-                                                               }
+                                }
                                 return null;
                             }
                         });
@@ -250,7 +234,7 @@ public class InterfaceStateChangeListener extends AbstractDataChangeListener<Int
         final int ifIndex = update.getIfIndex();
         if (update != null) {
             if (!update.getType().equals(Tunnel.class)) {
-                final VpnInterface vpnInterface = VpnUtil.getConfiguredVpnInterface(broker, interfaceName);
+                final VpnInterface vpnInterface = VpnUtil.getConfiguredVpnInterface(dataBroker, interfaceName);
                 if (vpnInterface != null) {
                     if (update.getOperStatus().equals(Interface.OperStatus.Up)) {
                         DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
@@ -258,9 +242,9 @@ public class InterfaceStateChangeListener extends AbstractDataChangeListener<Int
                                 new Callable<List<ListenableFuture<Void>>>() {
                                     @Override
                                     public List<ListenableFuture<Void>> call() throws Exception {
-                                        WriteTransaction writeConfigTxn = broker.newWriteOnlyTransaction();
-                                        WriteTransaction writeOperTxn = broker.newWriteOnlyTransaction();
-                                                                               WriteTransaction writeInvTxn = broker.newWriteOnlyTransaction();
+                                        WriteTransaction writeConfigTxn = dataBroker.newWriteOnlyTransaction();
+                                        WriteTransaction writeOperTxn = dataBroker.newWriteOnlyTransaction();
+                                        WriteTransaction writeInvTxn = dataBroker.newWriteOnlyTransaction();
                                         vpnInterfaceManager.processVpnInterfaceUp(dpnId, vpnInterface, ifIndex, 
                                                 true, writeConfigTxn, writeOperTxn, writeInvTxn);
                                         CheckedFuture<Void, TransactionCommitFailedException> futures = writeOperTxn.submit();
@@ -286,7 +270,7 @@ public class InterfaceStateChangeListener extends AbstractDataChangeListener<Int
                                             LOG.error("Error adding inventory/flow data for interface {} to vpn {} on dpn {}", interfaceName,
                                                     vpnInterface.getVpnInstanceName(), dpnId);
                                             throw new RuntimeException(e.getMessage());
-                                                                               }
+                                        }
                                         return null;
                                     }
                                 });
@@ -296,9 +280,9 @@ public class InterfaceStateChangeListener extends AbstractDataChangeListener<Int
                                 new Callable<List<ListenableFuture<Void>>>() {
                                     @Override
                                     public List<ListenableFuture<Void>> call() throws Exception {
-                                        WriteTransaction writeConfigTxn = broker.newWriteOnlyTransaction();
-                                        WriteTransaction writeOperTxn = broker.newWriteOnlyTransaction();
-                                                                               WriteTransaction writeInvTxn = broker.newWriteOnlyTransaction();
+                                        WriteTransaction writeConfigTxn = dataBroker.newWriteOnlyTransaction();
+                                        WriteTransaction writeOperTxn = dataBroker.newWriteOnlyTransaction();
+                                        WriteTransaction writeInvTxn = dataBroker.newWriteOnlyTransaction();
                                         vpnInterfaceManager.processVpnInterfaceDown(dpnId, interfaceName, ifIndex, true, false,
                                                 writeConfigTxn, writeOperTxn, writeInvTxn);
                                         CheckedFuture<Void, TransactionCommitFailedException> futures = writeOperTxn.submit();
@@ -324,7 +308,7 @@ public class InterfaceStateChangeListener extends AbstractDataChangeListener<Int
                                             LOG.error("Error updating inventory/flow for interface {} from vpn {} on dpn {}", interfaceName,
                                                     vpnInterface.getVpnInstanceName(), dpnId);
                                             throw new RuntimeException(e.getMessage());
-                                                                               }
+                                        }
                                         return null;
                                     }
                                 });
index 4683941bd0fbcad2231ff8abb7125f29b5d6be71..db83f34cdfbe3ad9b55709ec013fa48444620c92 100644 (file)
-/*\r
- * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.\r
- *\r
- * This program and the accompanying materials are made available under the\r
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,\r
- * and is available at http://www.eclipse.org/legal/epl-v10.html\r
- */\r
-package org.opendaylight.netvirt.vpnmanager;\r
-\r
-import com.google.common.util.concurrent.ListenableFuture;\r
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;\r
-import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;\r
-import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;\r
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;\r
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;\r
-import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;\r
-import org.opendaylight.genius.mdsalutil.MDSALUtil;\r
-import org.opendaylight.netvirt.vpnmanager.utilities.InterfaceUtils;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.RouterInterfacesMap;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.router.interfaces.map.RouterInterfaces;\r
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.router.interfaces.map.router.interfaces.Interfaces;\r
-import org.opendaylight.yangtools.concepts.ListenerRegistration;\r
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;\r
-import org.slf4j.Logger;\r
-import org.slf4j.LoggerFactory;\r
-\r
-import java.util.ArrayList;\r
-import java.util.List;\r
-import java.util.concurrent.Callable;\r
-\r
-public class RouterInterfaceListener extends AbstractDataChangeListener<Interfaces> {\r
-    private static final Logger LOG = LoggerFactory.getLogger(RouterInterfaceListener.class);\r
-    private ListenerRegistration<DataChangeListener> listenerRegistration;\r
-    private DataBroker broker;\r
-    private VpnInterfaceManager vpnInterfaceManager;\r
-\r
-    public RouterInterfaceListener(final DataBroker db) {\r
-        super(Interfaces.class);\r
-        broker = db;\r
-        registerListener(db);\r
-    }\r
-\r
-    void setVpnInterfaceManager(VpnInterfaceManager vpnInterfaceManager) {\r
-        this.vpnInterfaceManager = vpnInterfaceManager;\r
-    }\r
-\r
-    private void registerListener(final DataBroker db) {\r
-        try {\r
-            listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,\r
-                    getWildCardPath(), RouterInterfaceListener.this, DataChangeScope.SUBTREE);\r
-        } catch (final Exception e) {\r
-            LOG.error("Router interface DataChange listener registration fail !", e);\r
-        }\r
-    }\r
-\r
-    private InstanceIdentifier<?> getWildCardPath() {\r
-        return InstanceIdentifier.create(RouterInterfacesMap.class).child(RouterInterfaces.class).child(Interfaces.class);\r
-    }\r
-\r
-    @Override\r
-    protected void add(InstanceIdentifier<Interfaces> identifier, Interfaces interfaceInfo) {\r
-        LOG.trace("Add event - key: {}, value: {}", identifier, interfaceInfo);\r
-        final String routerId = identifier.firstKeyOf(RouterInterfaces.class).getRouterId().getValue();\r
-        final String interfaceName = interfaceInfo.getInterfaceId();\r
-        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface interfaceState =\r
-                InterfaceUtils.getInterfaceStateFromOperDS(broker, interfaceName);\r
-        DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();\r
-        dataStoreCoordinator.enqueueJob(interfaceName,\r
-                new Callable<List<ListenableFuture<Void>>>() {\r
-                    @Override\r
-                    public List<ListenableFuture<Void>> call() throws Exception {\r
-                        WriteTransaction writeTxn = broker.newWriteOnlyTransaction();\r
-                        LOG.debug("Handling interface {} in router {} add scenario", interfaceName, routerId);\r
-                        writeTxn.put(LogicalDatastoreType.CONFIGURATION,\r
-                                VpnUtil.getRouterInterfaceId(interfaceName),\r
-                                VpnUtil.getRouterInterface(interfaceName, routerId), true);\r
-                        LOG.debug("Added the Router {} and interface {} in the ODL-L3VPN RouterInterface map",\r
-                                routerId, interfaceName);\r
-                        vpnInterfaceManager.addToNeutronRouterDpnsMap(routerId, interfaceName, writeTxn);\r
-                        List<ListenableFuture<Void>> futures = new ArrayList<>();\r
-                        futures.add(writeTxn.submit());\r
-                        return futures;\r
-                    }\r
-                });\r
-    }\r
-\r
-    @Override\r
-    protected void remove(InstanceIdentifier<Interfaces> identifier, Interfaces interfaceInfo) {\r
-        LOG.trace("Remove event - key: {}, value: {}", identifier, interfaceInfo);\r
-        final String routerId = identifier.firstKeyOf(RouterInterfaces.class).getRouterId().getValue();\r
-        final String interfaceName = interfaceInfo.getInterfaceId();\r
-        DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();\r
-        dataStoreCoordinator.enqueueJob(interfaceName,\r
-                new Callable<List<ListenableFuture<Void>>>() {\r
-                    @Override\r
-                    public List<ListenableFuture<Void>> call() throws Exception {\r
-                        WriteTransaction writeTxn = broker.newWriteOnlyTransaction();\r
-                        vpnInterfaceManager.removeFromNeutronRouterDpnsMap(routerId, interfaceName, writeTxn);\r
-                        List<ListenableFuture<Void>> futures = new ArrayList<>();\r
-                        futures.add(writeTxn.submit());\r
-                        return futures;\r
-                    }\r
-                });\r
-    }\r
-\r
-    @Override\r
-    protected void update(InstanceIdentifier<Interfaces> identifier, Interfaces original, Interfaces update) {\r
-        LOG.trace("Update event - key: {}, original: {}, update: {}", identifier, original, update);\r
-    }\r
-\r
-}\r
+/*
+ * Copyright (c) 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.netvirt.vpnmanager;
+
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
+import org.opendaylight.netvirt.vpnmanager.utilities.InterfaceUtils;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.RouterInterfacesMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.router.interfaces.map.RouterInterfaces;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.router.interfaces.map.router.interfaces.Interfaces;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class RouterInterfaceListener extends AbstractDataChangeListener<Interfaces> implements AutoCloseable {
+    private static final Logger LOG = LoggerFactory.getLogger(RouterInterfaceListener.class);
+    private ListenerRegistration<DataChangeListener> listenerRegistration;
+    private final DataBroker dataBroker;
+    private final VpnInterfaceManager vpnInterfaceManager;
+
+    public RouterInterfaceListener(final DataBroker dataBroker, final VpnInterfaceManager vpnInterfaceManager) {
+        super(Interfaces.class);
+        this.dataBroker = dataBroker;
+        this.vpnInterfaceManager = vpnInterfaceManager;
+    }
+
+    public void start() {
+        LOG.info("{} start", getClass().getSimpleName());
+        listenerRegistration = dataBroker.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
+                getWildCardPath(), this, DataChangeScope.SUBTREE);
+    }
+
+    private InstanceIdentifier<?> getWildCardPath() {
+        return InstanceIdentifier.create(RouterInterfacesMap.class).child(RouterInterfaces.class).
+                child(Interfaces.class);
+    }
+
+    @Override
+    public void close() throws Exception {
+        if (listenerRegistration != null) {
+            listenerRegistration.close();
+            listenerRegistration = null;
+        }
+        LOG.info("{} close", getClass().getSimpleName());
+    }
+
+    @Override
+    protected void add(InstanceIdentifier<Interfaces> identifier, Interfaces interfaceInfo) {
+        LOG.trace("Add event - key: {}, value: {}", identifier, interfaceInfo);
+        final String routerId = identifier.firstKeyOf(RouterInterfaces.class).getRouterId().getValue();
+        final String interfaceName = interfaceInfo.getInterfaceId();
+        org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface interfaceState =
+                InterfaceUtils.getInterfaceStateFromOperDS(dataBroker, interfaceName);
+        DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
+        dataStoreCoordinator.enqueueJob(interfaceName,
+                new Callable<List<ListenableFuture<Void>>>() {
+                    @Override
+                    public List<ListenableFuture<Void>> call() throws Exception {
+                        WriteTransaction writeTxn = dataBroker.newWriteOnlyTransaction();
+                        LOG.debug("Handling interface {} in router {} add scenario", interfaceName, routerId);
+                        writeTxn.put(LogicalDatastoreType.CONFIGURATION,
+                                VpnUtil.getRouterInterfaceId(interfaceName),
+                                VpnUtil.getRouterInterface(interfaceName, routerId), true);
+                        LOG.debug("Added the Router {} and interface {} in the ODL-L3VPN RouterInterface map",
+                                routerId, interfaceName);
+                        vpnInterfaceManager.addToNeutronRouterDpnsMap(routerId, interfaceName, writeTxn);
+                        List<ListenableFuture<Void>> futures = new ArrayList<>();
+                        futures.add(writeTxn.submit());
+                        return futures;
+                    }
+                });
+    }
+
+    @Override
+    protected void remove(InstanceIdentifier<Interfaces> identifier, Interfaces interfaceInfo) {
+        LOG.trace("Remove event - key: {}, value: {}", identifier, interfaceInfo);
+        final String routerId = identifier.firstKeyOf(RouterInterfaces.class).getRouterId().getValue();
+        final String interfaceName = interfaceInfo.getInterfaceId();
+        DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
+        dataStoreCoordinator.enqueueJob(interfaceName,
+                new Callable<List<ListenableFuture<Void>>>() {
+                    @Override
+                    public List<ListenableFuture<Void>> call() throws Exception {
+                        WriteTransaction writeTxn = dataBroker.newWriteOnlyTransaction();
+                        vpnInterfaceManager.removeFromNeutronRouterDpnsMap(routerId, interfaceName, writeTxn);
+                        List<ListenableFuture<Void>> futures = new ArrayList<>();
+                        futures.add(writeTxn.submit());
+                        return futures;
+                    }
+                });
+    }
+
+    @Override
+    protected void update(InstanceIdentifier<Interfaces> identifier, Interfaces original, Interfaces update) {
+        LOG.trace("Update event - key: {}, original: {}, update: {}", identifier, original, update);
+    }
+}
index 0429a87504c9ab285e08e2b8c4f87b399158f486..884ef7a8e4c47affb47632a0a88e210e370ee7f7 100644 (file)
@@ -7,9 +7,10 @@
  */
 package org.opendaylight.netvirt.vpnmanager;
 
+import java.math.BigInteger;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.netvirt.vpnmanager.utilities.InterfaceUtils;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.iana._if.type.rev140508.Tunnel;
@@ -20,44 +21,40 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.math.BigInteger;
-
-public class SubnetRouteInterfaceStateChangeListener extends AbstractDataChangeListener<Interface> implements AutoCloseable {
+public class SubnetRouteInterfaceStateChangeListener extends AbstractDataChangeListener<Interface>
+        implements AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(InterfaceStateChangeListener.class);
-
     private ListenerRegistration<DataChangeListener> listenerRegistration;
-    private final DataBroker broker;
-    private VpnInterfaceManager vpnInterfaceManager;
+    private final DataBroker dataBroker;
+    private final VpnInterfaceManager vpnInterfaceManager;
+    private final VpnSubnetRouteHandler vpnSubnetRouteHandler;
 
-    public SubnetRouteInterfaceStateChangeListener(final DataBroker db, VpnInterfaceManager vpnInterfaceManager) {
+    public SubnetRouteInterfaceStateChangeListener(final DataBroker dataBroker,
+                                                   final VpnInterfaceManager vpnInterfaceManager,
+                                                   final VpnSubnetRouteHandler vpnSubnetRouteHandler) {
         super(Interface.class);
-        broker = db;
+        this.dataBroker = dataBroker;
         this.vpnInterfaceManager = vpnInterfaceManager;
-        registerListener(db);
+        this.vpnSubnetRouteHandler = vpnSubnetRouteHandler;
+    }
+
+    public void start() {
+        LOG.info("{} start", getClass().getSimpleName());
+        listenerRegistration = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
+                getWildCardPath(), this, AsyncDataBroker.DataChangeScope.SUBTREE);
+    }
+
+    private InstanceIdentifier<Interface> getWildCardPath() {
+        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
     }
 
     @Override
     public void close() throws Exception {
         if (listenerRegistration != null) {
-            try {
-                listenerRegistration.close();
-            } catch (final Exception e) {
-                LOG.error("Error when cleaning up DataChangeListener.", e);
-            }
+            listenerRegistration.close();
             listenerRegistration = null;
         }
-        LOG.info("Interface listener Closed");
-    }
-
-
-    private void registerListener(final DataBroker db) {
-        try {
-            listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
-                    getWildCardPath(), SubnetRouteInterfaceStateChangeListener.this, DataChangeScope.SUBTREE);
-        } catch (final Exception e) {
-            LOG.error("Interface DataChange listener registration failed", e);
-            throw new IllegalStateException("Nexthop Manager registration Listener failed.", e);
-        }
+        LOG.info("{} close", getClass().getSimpleName());
     }
 
     @Override
@@ -67,11 +64,11 @@ public class SubnetRouteInterfaceStateChangeListener extends AbstractDataChangeL
             String interfaceName = intrf.getName();
             LOG.info("Received port UP event for interface {} ", interfaceName);
             org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface
-                    configInterface = InterfaceUtils.getInterface(broker, interfaceName);
+                    configInterface = InterfaceUtils.getInterface(dataBroker, interfaceName);
             if (configInterface != null) {
                 if (!configInterface.getType().equals(Tunnel.class)) {
                     BigInteger dpnId = InterfaceUtils.getDpIdFromInterface(intrf);
-                    vpnInterfaceManager.getVpnSubnetRouteHandler().onInterfaceUp(dpnId, intrf.getName());
+                    vpnSubnetRouteHandler.onInterfaceUp(dpnId, intrf.getName());
                 }
             }
         } catch (Exception e) {
@@ -79,11 +76,6 @@ public class SubnetRouteInterfaceStateChangeListener extends AbstractDataChangeL
         }
     }
 
-
-    private InstanceIdentifier<Interface> getWildCardPath() {
-        return InstanceIdentifier.create(InterfacesState.class).child(Interface.class);
-    }
-
     @Override
     protected void remove(InstanceIdentifier<Interface> identifier, Interface intrf) {
         LOG.trace("Received interface {} down event", intrf);
@@ -101,7 +93,7 @@ public class SubnetRouteInterfaceStateChangeListener extends AbstractDataChangeL
                 } catch (Exception e){
                     LOG.error("Unable to retrieve dpnId from interface operational data store for interface {}. Fetching from vpn interface op data store. ", intrf.getName(), e);
                 }
-                vpnInterfaceManager.getVpnSubnetRouteHandler().onInterfaceDown(dpnId, intrf.getName());
+                vpnSubnetRouteHandler.onInterfaceDown(dpnId, intrf.getName());
             }
         } catch (Exception e) {
             LOG.error("Exception observed in handling deletion of VPN Interface {}. ", intrf.getName(), e);
@@ -117,10 +109,10 @@ public class SubnetRouteInterfaceStateChangeListener extends AbstractDataChangeL
         if (update != null) {
             if (!update.getType().equals(Tunnel.class)) {
                 if (update.getOperStatus().equals(Interface.OperStatus.Up)) {
-                    vpnInterfaceManager.getVpnSubnetRouteHandler().onInterfaceUp(dpId, update.getName());
+                    vpnSubnetRouteHandler.onInterfaceUp(dpId, update.getName());
                 } else if (update.getOperStatus().equals(Interface.OperStatus.Down)) {
-                    if (VpnUtil.isVpnInterfaceConfigured(broker, interfaceName)) {
-                        vpnInterfaceManager.getVpnSubnetRouteHandler().onInterfaceDown(dpId, update.getName());
+                    if (VpnUtil.isVpnInterfaceConfigured(dataBroker, interfaceName)) {
+                        vpnSubnetRouteHandler.onInterfaceDown(dpId, update.getName());
                     }
                 }
             }
index c24719b1cd1ca37963dc3c0738eb7870f61da38b..afe297006bed4a914f794421ae3c66a92a4aec87 100644 (file)
@@ -5,20 +5,24 @@
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.netvirt.vpnmanager;
 
 import com.google.common.base.Optional;
 import com.google.common.primitives.Ints;
-
-import org.opendaylight.controller.liblldp.EtherTypes;
+import java.math.BigInteger;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.List;
 import org.opendaylight.controller.liblldp.NetUtils;
+import org.opendaylight.controller.liblldp.Packet;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.genius.mdsalutil.MetaDataUtil;
+import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.genius.mdsalutil.packet.Ethernet;
+import org.opendaylight.genius.mdsalutil.packet.IPv4;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
-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.netvirt.elan.rev150602.elan.tag.name.map.ElanTagName;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.SubnetOpData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnIdToVpnInstance;
@@ -29,46 +33,27 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.NetworkMaps;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.networkmaps.NetworkMap;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.networkmaps.NetworkMapKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.*;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingListener;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketReceived;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInput;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.genius.mdsalutil.packet.ARP;
-import org.opendaylight.genius.mdsalutil.packet.IPv4;
-import org.opendaylight.genius.mdsalutil.packet.Ethernet;
-import org.opendaylight.genius.mdsalutil.MDSALUtil;
-import org.opendaylight.controller.liblldp.Packet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.math.BigInteger;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.opendaylight.genius.mdsalutil.ActionInfo;
-import org.opendaylight.genius.mdsalutil.ActionType;
-import org.opendaylight.genius.mdsalutil.MetaDataUtil;
-import org.opendaylight.genius.mdsalutil.NwConstants;
-
 public class SubnetRoutePacketInHandler implements PacketProcessingListener {
+    private static final Logger LOG = LoggerFactory.getLogger(SubnetRoutePacketInHandler.class);
+    private final DataBroker dataBroker;
+    private final PacketProcessingService packetService;
 
-    private static final Logger s_logger = LoggerFactory.getLogger(SubnetRoutePacketInHandler.class);
-    private final DataBroker broker;
-    private PacketProcessingService packetService;
-    private VpnInterfaceManager ifManager;
-    private IdManagerService idManager;
-    //List maintains info about the arp request sent - id src+dst ip
-    private ArrayList<String> arpList = new ArrayList();
-
-    public SubnetRoutePacketInHandler(DataBroker dataBroker, IdManagerService idManager) {
-        broker = dataBroker;
-        this.idManager = idManager;
+    public SubnetRoutePacketInHandler(final DataBroker dataBroker,
+                                      final PacketProcessingService packetService) {
+        this.dataBroker = dataBroker;
+        this.packetService =packetService;
     }
 
     public void onPacketReceived(PacketReceived notification) {
-
-        s_logger.trace("SubnetRoutePacketInHandler: PacketReceived invoked...");
+        LOG.trace("SubnetRoutePacketInHandler: PacketReceived invoked...");
 
         short tableId = notification.getTableId().getValue();
         byte[] data = notification.getPayload();
@@ -76,11 +61,11 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
         Ethernet res = new Ethernet();
 
         if (tableId == NwConstants.L3_SUBNET_ROUTE_TABLE) {
-            s_logger.trace("SubnetRoutePacketInHandler: Some packet received as {}", notification);
+            LOG.trace("SubnetRoutePacketInHandler: Some packet received as {}", notification);
             try {
                 res.deserialize(data, 0, data.length * NetUtils.NumBitsInAByte);
             } catch (Exception e) {
-                s_logger.warn("SubnetRoutePacketInHandler: Failed to decode Packet ", e);
+                LOG.warn("SubnetRoutePacketInHandler: Failed to decode Packet ", e);
                 return;
             }
             try {
@@ -93,39 +78,39 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
                     byte[] dstIp = Ints.toByteArray(ipv4.getDestinationAddress());
                     String dstIpStr = toStringIpAddress(dstIp);
                     String srcIpStr = toStringIpAddress(srcIp);
-                    /*if (VpnUtil.getNeutronPortNamefromPortFixedIp(broker, dstIpStr) != null) {
-                        s_logger.debug("SubnetRoutePacketInHandler: IPv4 Packet received with "
+                    /*if (VpnUtil.getNeutronPortNamefromPortFixedIp(dataBroker, dstIpStr) != null) {
+                        LOG.debug("SubnetRoutePacketInHandler: IPv4 Packet received with "
                                 + "Target IP {} is a valid Neutron port, ignoring subnet route processing", dstIpStr);
                         return;
                     }*/
                     long vpnId = MetaDataUtil.getVpnIdFromMetadata(metadata);
-                    s_logger.info("SubnetRoutePacketInHandler: Processing IPv4 Packet received with Source IP {} "
+                    LOG.info("SubnetRoutePacketInHandler: Processing IPv4 Packet received with Source IP {} "
                             + "and Target IP {} and vpnId {}", srcIpStr, dstIpStr, vpnId);
 
                     InstanceIdentifier<VpnIds> vpnIdsInstanceIdentifier = getVpnIdToVpnInstanceIdentifier(vpnId);
-                    Optional<VpnIds> vpnIdsOptional = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vpnIdsInstanceIdentifier);
+                    Optional<VpnIds> vpnIdsOptional = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vpnIdsInstanceIdentifier);
                     if(!vpnIdsOptional.isPresent()) {
                         // Donot trigger subnetroute logic for packets from unknown VPNs
-                        s_logger.info("Ignoring IPv4 packet with destination Ip {} and source Ip {} as it came on unknown VPN with ID {}", dstIpStr, srcIpStr, vpnId);
+                        LOG.info("Ignoring IPv4 packet with destination Ip {} and source Ip {} as it came on unknown VPN with ID {}", dstIpStr, srcIpStr, vpnId);
                         return;
                     }
                     // It is an ARP request on a configured VPN.  So we must attempt to respond.
                     VpnIds vpnIds = vpnIdsOptional.get();
-                    if (VpnUtil.getNeutronPortFromVpnPortFixedIp(broker, vpnIds.getVpnInstanceName(), dstIpStr) !=
+                    if (VpnUtil.getNeutronPortFromVpnPortFixedIp(dataBroker, vpnIds.getVpnInstanceName(), dstIpStr) !=
                             null) {
-                        s_logger.debug("SubnetRoutePacketInHandler: IPv4 Packet received with "
+                        LOG.debug("SubnetRoutePacketInHandler: IPv4 Packet received with "
                                 + "Target IP {} is a valid Neutron port, ignoring subnet route processing", dstIpStr);
                         return;
                     }
                     long elanTag = getElanTagFromSubnetRouteMetadata(metadata);
                     if (elanTag == 0) {
-                        s_logger.error("SubnetRoutePacketInHandler: elanTag value from metadata found to be 0, for IPv4 " +
+                        LOG.error("SubnetRoutePacketInHandler: elanTag value from metadata found to be 0, for IPv4 " +
                                 " Packet received with Target IP {}", dstIpStr);
                         return;
                     }
-                    s_logger.info("SubnetRoutePacketInHandler: Processing IPv4 Packet received with Source IP {} "
+                    LOG.info("SubnetRoutePacketInHandler: Processing IPv4 Packet received with Source IP {} "
                             + "and Target IP {} and elan Tag {}", srcIpStr, dstIpStr, elanTag);
-                    BigInteger dpnId = getTargetDpnForPacketOut(broker, elanTag, ipv4.getDestinationAddress());
+                    BigInteger dpnId = getTargetDpnForPacketOut(dataBroker, elanTag, ipv4.getDestinationAddress());
                     //Handle subnet routes ip requests
                     if (dpnId != BigInteger.ZERO) {
                         long groupid = VpnUtil.getRemoteBCGroup(elanTag);
@@ -137,36 +122,36 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
                 }
             } catch (Exception ex) {
                 //Failed to handle packet
-                s_logger.error("SubnetRoutePacketInHandler: Failed to handle subnetroute packets ", ex);
+                LOG.error("SubnetRoutePacketInHandler: Failed to handle subnetroute packets ", ex);
             }
             return;
         }
         //All Arp responses learning for invisble IPs will now be handled by VpnManager
 
         /*if (tableId == NwConstants.L3_INTERFACE_TABLE) {
-            s_logger.trace("SubnetRoutePacketInHandler: Packet from Table {} received as {}",
+            LOG.trace("SubnetRoutePacketInHandler: Packet from Table {} received as {}",
                     NwConstants.L3_INTERFACE_TABLE, notification);
             try {
                 res.deserialize(data, 0, data.length * NetUtils.NumBitsInAByte);
             } catch (Exception e) {
-                s_logger.warn("SubnetRoutePacketInHandler: Failed to decode Table " + NwConstants.L3_INTERFACE_TABLE + " Packet ", e);
+                LOG.warn("SubnetRoutePacketInHandler: Failed to decode Table " + NwConstants.L3_INTERFACE_TABLE + " Packet ", e);
                 return;
             }
             try {
                 Packet pkt = res.getPayload();
                 if (pkt instanceof ARP) {
-                    s_logger.debug("SubnetRoutePacketInHandler: ARP packet received");
+                    LOG.debug("SubnetRoutePacketInHandler: ARP packet received");
                     ARP arpPacket = (ARP) pkt;
                     boolean arpReply = (arpPacket.getOpCode() == 2) ? true : false;
                     if (arpReply) {
                         //Handle subnet routes arp responses
-                        s_logger.debug("SubnetRoutePacketInHandler: ARP reply received");
+                        LOG.debug("SubnetRoutePacketInHandler: ARP reply received");
                         byte[] respSrc = arpPacket.getSenderProtocolAddress();
                         byte[] respDst = arpPacket.getTargetProtocolAddress();
                         String respIp = toStringIpAddress(respSrc);
                         String check = toStringIpAddress(respDst) + respIp;
-                        if (VpnUtil.getNeutronPortNamefromPortFixedIp(broker, respIp) != null) {
-                            s_logger.debug("SubnetRoutePacketInHandler: ARP reply Packet received with "
+                        if (VpnUtil.getNeutronPortNamefromPortFixedIp(dataBroker, respIp) != null) {
+                            LOG.debug("SubnetRoutePacketInHandler: ARP reply Packet received with "
                                     + "Source IP {} which is a valid Neutron port, ignoring subnet route processing", respIp);
                             return;
                         }
@@ -174,34 +159,34 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
                         String srcIp = toStringIpAddress(respSrc);
                         String destIp = toStringIpAddress(respDst);
                         long vpnId = MetaDataUtil.getVpnIdFromMetadata(metadata);
-                        s_logger.info("SubnetRoutePacketInHandler: Processing ARP response Packet received with Source IP {} "
+                        LOG.info("SubnetRoutePacketInHandler: Processing ARP response Packet received with Source IP {} "
                                 + "and Target IP {} and vpnId {}", srcIp, destIp, vpnId);
                         InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.id.to.vpn.instance.VpnIds> vpnIdsInstanceIdentifier = getVpnIdToVpnInstanceIdentifier(vpnId);
-                        Optional<org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.id.to.vpn.instance.VpnIds> vpnIdsOptional = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vpnIdsInstanceIdentifier);
+                        Optional<org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.id.to.vpn.instance.VpnIds> vpnIdsOptional = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vpnIdsInstanceIdentifier);
                         if(!vpnIdsOptional.isPresent()) {
                             // Donot trigger subnetroute logic for packets from unknown VPNs
-                            s_logger.info("Ignoring ARP response packet with destination Ip {} and source Ip {} as it came on with VPN ID {}", destIp, srcIp, vpnId);
+                            LOG.info("Ignoring ARP response packet with destination Ip {} and source Ip {} as it came on with VPN ID {}", destIp, srcIp, vpnId);
                             return;
                         }
                         // It is an ARP request on a configured VPN.  So we must attempt to respond.
                         org.opendaylight.yang.gen.v1.urn.opendaylight.l3vpn.rev130911.vpn.id.to.vpn.instance.VpnIds vpnIds = vpnIdsOptional.get();
-                        if (VpnUtil.getNeutronPortFromVpnPortFixedIp(broker, vpnIds.getVpnInstanceName(), srcIp) != null) {
-                            s_logger.debug("SubnetRoutePacketInHandler: ARP response Packet received with "
+                        if (VpnUtil.getNeutronPortFromVpnPortFixedIp(dataBroker, vpnIds.getVpnInstanceName(), srcIp) != null) {
+                            LOG.debug("SubnetRoutePacketInHandler: ARP response Packet received with "
                                     + "Target IP {} is a valid Neutron port, ignoring subnet route processing", destIp);
                             return;
                         }
                         String destination = VpnUtil.getIpPrefix(srcIp);
                         long portTag = MetaDataUtil.getLportFromMetadata(metadata).intValue();
-                        s_logger.info("SubnetRoutePacketInHandler: ARP reply received for target IP {} from LPort {}" + srcIp, portTag);
-                        IfIndexInterface interfaceInfo = VpnUtil.getInterfaceInfoByInterfaceTag(broker, portTag);
+                        LOG.info("SubnetRoutePacketInHandler: ARP reply received for target IP {} from LPort {}" + srcIp, portTag);
+                        IfIndexInterface interfaceInfo = VpnUtil.getInterfaceInfoByInterfaceTag(dataBroker, portTag);
                         String ifName = interfaceInfo.getInterfaceName();
                         InstanceIdentifier<VpnInterface> vpnIfIdentifier = VpnUtil.getVpnInterfaceIdentifier(ifName);
-                        VpnInterface vpnInterface = VpnUtil.getConfiguredVpnInterface(broker, ifName);
+                        VpnInterface vpnInterface = VpnUtil.getConfiguredVpnInterface(dataBroker, ifName);
 
                         //Get VPN interface adjacencies
                         if (vpnInterface != null) {
                             InstanceIdentifier<Adjacencies> path = vpnIfIdentifier.augmentation(Adjacencies.class);
-                            Optional<Adjacencies> adjacencies = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, path);
+                            Optional<Adjacencies> adjacencies = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, path);
                             String nextHopIpAddr = null;
                             String nextHopMacAddress = null;
                             if (adjacencies.isPresent()) {
@@ -214,7 +199,7 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
                                     }
                                 }
                                 if (nextHopMacAddress != null && destination != null) {
-                                    String rd = VpnUtil.getVpnRd(broker, vpnInterface.getVpnInstanceName());
+                                    String rd = VpnUtil.getVpnRd(dataBroker, vpnInterface.getVpnInstanceName());
                                     long label =
                                             VpnUtil.getUniqueId(idManager, VpnConstants.VPN_IDPOOL_NAME,
                                                     VpnUtil.getNextHopLabelKey((rd != null) ? rd : vpnInterface.getVpnInstanceName(), destination));
@@ -230,8 +215,8 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
                                     VpnInterface newVpnIntf = new VpnInterfaceBuilder().setKey(new VpnInterfaceKey(vpnInterface.getName())).
                                             setName(vpnInterface.getName()).setVpnInstanceName(vpnInterface.getVpnInstanceName()).
                                             addAugmentation(Adjacencies.class, aug).build();
-                                    VpnUtil.syncUpdate(broker, LogicalDatastoreType.CONFIGURATION, vpnIfIdentifier, newVpnIntf);
-                                    s_logger.debug("SubnetRoutePacketInHandler: Successfully stored subnetroute Adjacency into VpnInterface {}", newVpnIntf);
+                                    VpnUtil.syncUpdate(dataBroker, LogicalDatastoreType.CONFIGURATION, vpnIfIdentifier, newVpnIntf);
+                                    LOG.debug("SubnetRoutePacketInHandler: Successfully stored subnetroute Adjacency into VpnInterface {}", newVpnIntf);
                                 }
                             }
                         }
@@ -239,7 +224,7 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
                 }
             } catch (Exception ex) {
                 //Failed to decode packet
-                s_logger.error("SubnetRoutePacketInHandler: Failed to handle subnetroute Table " + NwConstants.L3_INTERFACE_TABLE +
+                LOG.error("SubnetRoutePacketInHandler: Failed to handle subnetroute Table " + NwConstants.L3_INTERFACE_TABLE +
                         " packets ", ex);
             }
         }*/
@@ -249,7 +234,7 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
         BigInteger dpnid = BigInteger.ZERO;
         ElanTagName elanInfo = VpnUtil.getElanInfoByElanTag(broker, elanTag);
         if (elanInfo == null) {
-            s_logger.trace("SubnetRoutePacketInHandler: Unable to retrieve ElanInfo for elanTag {}", elanTag);
+            LOG.trace("SubnetRoutePacketInHandler: Unable to retrieve ElanInfo for elanTag {}", elanTag);
             return dpnid;
         }
         InstanceIdentifier<NetworkMap> networkId = InstanceIdentifier.builder(NetworkMaps.class)
@@ -258,7 +243,7 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
         Optional<NetworkMap> optionalNetworkMap = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, networkId);
         if (optionalNetworkMap.isPresent()) {
             List<Uuid> subnetList = optionalNetworkMap.get().getSubnetIdList();
-            s_logger.trace("SubnetRoutePacketInHandler: Obtained subnetList as " + subnetList);
+            LOG.trace("SubnetRoutePacketInHandler: Obtained subnetList as " + subnetList);
             for (Uuid subnetId : subnetList) {
                 InstanceIdentifier<SubnetOpDataEntry> subOpIdentifier = InstanceIdentifier.builder(SubnetOpData.class).
                         child(SubnetOpDataEntry.class, new SubnetOpDataEntryKey(subnetId)).build();
@@ -269,9 +254,9 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
                 }
                 SubnetOpDataEntry subOpEntry = optionalSubs.get();
                 if (subOpEntry.getNhDpnId() != null) {
-                    s_logger.trace("SubnetRoutePacketInHandler: Viewing Subnet " + subnetId);
+                    LOG.trace("SubnetRoutePacketInHandler: Viewing Subnet " + subnetId);
                     boolean match = VpnUtil.isIpInSubnet(ipAddress, subOpEntry.getSubnetCidr());
-                    s_logger.trace("SubnetRoutePacketInHandler: Viewing Subnet " + subnetId + " matching " + match);
+                    LOG.trace("SubnetRoutePacketInHandler: Viewing Subnet " + subnetId + " matching " + match);
                     if (match) {
                         dpnid = subOpEntry.getNhDpnId();
                         return dpnid;
@@ -292,21 +277,16 @@ public class SubnetRoutePacketInHandler implements PacketProcessingListener {
         try {
             ip = InetAddress.getByAddress(ipAddress).getHostAddress();
         } catch(UnknownHostException e) {
-            s_logger.error("SubnetRoutePacketInHandler: Unable to translate byt[] ipAddress to String {}", e);
+            LOG.error("SubnetRoutePacketInHandler: Unable to translate byt[] ipAddress to String {}", e);
         }
 
         return ip;
     }
 
-    public void setPacketProcessingService(PacketProcessingService service) {
-        this.packetService = service;
-    }
-
     public static long getElanTagFromSubnetRouteMetadata(BigInteger metadata) {
         return ((metadata.and(MetaDataUtil.METADATA_MASK_ELAN_SUBNET_ROUTE)).shiftRight(32)).longValue();
     }
 
-
     static InstanceIdentifier<VpnIds>
     getVpnIdToVpnInstanceIdentifier(long vpnId) {
         return InstanceIdentifier.builder(VpnIdToVpnInstance.class)
diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TransactionUtil.java b/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/TransactionUtil.java
new file mode 100644 (file)
index 0000000..24d67a9
--- /dev/null
@@ -0,0 +1,77 @@
+/*
+ * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.netvirt.vpnmanager;
+
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import java.util.concurrent.ExecutionException;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+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;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class TransactionUtil {
+    private static final Logger LOG = LoggerFactory.getLogger(TransactionUtil.class);
+
+    private TransactionUtil() {
+    }
+
+    public static final FutureCallback<Void> DEFAULT_CALLBACK = new FutureCallback<Void>() {
+        public void onSuccess(Void result) {
+            LOG.debug("Success in Datastore operation");
+        }
+
+        public void onFailure(Throwable error) {
+            LOG.error("Error in Datastore operation", error);
+        };
+    };
+
+    public static <T extends DataObject> Optional<T> read(DataBroker dataBroker, LogicalDatastoreType datastoreType,
+                                                    InstanceIdentifier<T> path) {
+
+        ReadOnlyTransaction tx = dataBroker.newReadOnlyTransaction();
+
+        Optional<T> result;
+        try {
+            result = tx.read(datastoreType, path).get();
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+
+        return result;
+    }
+
+    public static <T extends DataObject> void asyncWrite(DataBroker dataBroker, LogicalDatastoreType datastoreType,
+                                                   InstanceIdentifier<T> path, T data,
+                                                   FutureCallback<Void> callback) {
+        WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
+        tx.put(datastoreType, path, data, true);
+        Futures.addCallback(tx.submit(), callback);
+    }
+
+    public static <T extends DataObject> void syncWrite(DataBroker dataBroker, LogicalDatastoreType datastoreType,
+                                                  InstanceIdentifier<T> path,
+                                                  T data, FutureCallback<Void> callback) {
+        WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
+        tx.put(datastoreType, path, data, true);
+        CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
+        try {
+            futures.get();
+        } catch (InterruptedException | ExecutionException e) {
+            LOG.error("Error writing VPN instance to ID info to datastore (path, data) : ({}, {})", path, data);
+            throw new RuntimeException(e.getMessage());
+        }
+    }
+}
index 726b814a6243a69a52de360b4956c67126cbf426..4420ce76951db822e8f76886b6b8adc15a903067 100644 (file)
  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
  * and is available at http://www.eclipse.org/legal/epl-v10.html
  */
-
 package org.opendaylight.netvirt.vpnmanager;
 
 import com.google.common.base.Optional;
-
+import java.math.BigInteger;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.Future;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
-import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnAfConfig;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInstances;
 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.vpn.interfaces.VpnInterface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TunnelsState;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.Adjacencies;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.Adjacency;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TepTypeExternal;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TepTypeHwvtep;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TepTypeInternal;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TunnelsState;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnels_state.StateTunnelList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.IsDcgwPresentInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.IsDcgwPresentOutput;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.Adjacencies;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.Adjacency;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.math.BigInteger;
-import java.util.Iterator;
-import java.util.List;
-import java.util.concurrent.Future;
-
-public class TunnelInterfaceStateListener extends AbstractDataChangeListener<StateTunnelList> implements AutoCloseable{
-
+public class TunnelInterfaceStateListener extends AbstractDataChangeListener<StateTunnelList>
+        implements AutoCloseable{
     private static final Logger LOG = LoggerFactory.getLogger(TunnelInterfaceStateListener.class);
-    protected enum UpdateRouteAction {
-        ADVERTISE_ROUTE, WITHDRAW_ROUTE
-    }
-
-    private ListenerRegistration<DataChangeListener> tunnelInterfaceStateListenerRegistration;
-    private final DataBroker broker;
+    private ListenerRegistration<DataChangeListener> listenerRegistration;
+    private final DataBroker dataBroker;
     private final IBgpManager bgpManager;
     private IFibManager fibManager;
     private ItmRpcService itmRpcService;
+    protected enum UpdateRouteAction {
+        ADVERTISE_ROUTE, WITHDRAW_ROUTE
+    }
 
     /**
      * Responsible for listening to tunnel interface state change
      *
-     * @param db - dataBroker service reference
-     * @param bgpManager Used to advertise routes to the BGP Router
+     * @param dataBroker dataBroker
+     * @param bgpManager bgpManager
+     * @param fibManager fibManager
+     * @param itmRpcService itmRpcService
      */
-    public TunnelInterfaceStateListener(final DataBroker db,
-                                        final IBgpManager bgpManager) {
+    public TunnelInterfaceStateListener(final DataBroker dataBroker,
+                                        final IBgpManager bgpManager,
+                                        final IFibManager fibManager,
+                                        final ItmRpcService itmRpcService) {
         super(StateTunnelList.class);
-        broker = db;
+        this.dataBroker = dataBroker;
         this.bgpManager = bgpManager;
-        registerListener(db);
-    }
-
-    public void setITMRpcService(ItmRpcService itmRpcService) {
+        this.fibManager = fibManager;
         this.itmRpcService = itmRpcService;
     }
 
-    public void setFibManager(IFibManager fibManager) {
-        this.fibManager = fibManager;
+    public void start() {
+        LOG.info("{} start", getClass().getSimpleName());
+        listenerRegistration = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
+                getWildCardPath(), this, AsyncDataBroker.DataChangeScope.SUBTREE);
     }
 
-    public IFibManager getFibManager() {
-        return this.fibManager;
+    private InstanceIdentifier<StateTunnelList> getWildCardPath() {
+        return InstanceIdentifier.create(TunnelsState.class).child(StateTunnelList.class);
     }
 
     @Override
     public void close() throws Exception {
-        if (tunnelInterfaceStateListenerRegistration != null) {
-            try {
-                tunnelInterfaceStateListenerRegistration.close();
-            } catch (final Exception e) {
-                LOG.error("Error when cleaning up DataChangeListener.", e);
-            }
-            tunnelInterfaceStateListenerRegistration = null;
-        }
-        LOG.info("Tunnel Interface State Listener Closed");
-    }
-
-    private void registerListener(final DataBroker db) {
-        try {
-            tunnelInterfaceStateListenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
-                    getWildCardPath(), TunnelInterfaceStateListener.this, AsyncDataBroker.DataChangeScope.SUBTREE);
-        } catch (final Exception e) {
-            LOG.error("Tunnel Interface State Listener DataChange listener registration fail!", e);
-            throw new IllegalStateException("Tunnel Interface State Listener registration Listener failed.", e);
+        if (listenerRegistration != null) {
+            listenerRegistration.close();
+            listenerRegistration = null;
         }
-    }
-
-    private InstanceIdentifier<StateTunnelList> getWildCardPath() {
-        return InstanceIdentifier.create(TunnelsState.class).child(StateTunnelList.class);
+        LOG.info("{} close", getClass().getSimpleName());
     }
 
     @Override
@@ -152,7 +133,7 @@ public class TunnelInterfaceStateListener extends AbstractDataChangeListener<Sta
 
         InstanceIdentifier.InstanceIdentifierBuilder<VpnInstances> idBuilder = InstanceIdentifier.builder(VpnInstances.class);
         InstanceIdentifier<VpnInstances> vpnInstancesId = idBuilder.build();
-        Optional<VpnInstances> vpnInstances = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, vpnInstancesId);
+        Optional<VpnInstances> vpnInstances = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vpnInstancesId);
         long tunTypeVal = 0, vpnId;
 
         if (stateTunnelList.getDstInfo().getTepDeviceType() == TepTypeInternal.class) {
@@ -191,7 +172,7 @@ public class TunnelInterfaceStateListener extends AbstractDataChangeListener<Sta
             while (vpnInstIter.hasNext()) {
                 VpnInstance vpnInstance = vpnInstIter.next();
                 LOG.trace("vpnInstance {}", vpnInstance);
-                vpnId = VpnUtil.getVpnId(broker, vpnInstance.getVpnInstanceName());
+                vpnId = VpnUtil.getVpnId(dataBroker, vpnInstance.getVpnInstanceName());
                 try {
                     VpnAfConfig vpnConfig = vpnInstance.getIpv4Family();
                     LOG.trace("vpnConfig {}", vpnConfig);
@@ -203,13 +184,13 @@ public class TunnelInterfaceStateListener extends AbstractDataChangeListener<Sta
                     InstanceIdentifier<VpnToDpnList> srcId =
                             VpnUtil.getVpnToDpnListIdentifier(rd, srcDpnId);
                     Optional<VpnToDpnList> srcDpnInVpn =
-                            VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, srcId);
+                            VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, srcId);
                     if (tunTypeVal == VpnConstants.ITMTunnelLocType.Internal.getValue()) {
                         destDpnId = new BigInteger(stateTunnelList.getDstInfo().getTepDeviceId());
                         InstanceIdentifier<VpnToDpnList> destId =
                                 VpnUtil.getVpnToDpnListIdentifier(rd, destDpnId);
                         Optional<VpnToDpnList> destDpnInVpn =
-                                VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, destId);
+                                VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, destId);
                         if (!(srcDpnInVpn.isPresent() &&
                                 destDpnInVpn.isPresent())) {
                             LOG.trace(" srcDpn {} - destDPN {}, do not share the VPN {} with rd {}.",
@@ -229,7 +210,7 @@ public class TunnelInterfaceStateListener extends AbstractDataChangeListener<Sta
                             InstanceIdentifier<Adjacencies> path =
                                     vpnIntfId.augmentation(Adjacencies.class);
                             Optional<Adjacencies> adjacencies =
-                                    VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, path);
+                                    VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path);
                             LOG.trace("adjacencies {}", adjacencies);
                             if (adjacencies.isPresent()) {
                                 List<Adjacency> adjacencyList = adjacencies.get().getAdjacency();
@@ -247,7 +228,7 @@ public class TunnelInterfaceStateListener extends AbstractDataChangeListener<Sta
                                                 fibManager.handleRemoteRoute(true,
                                                         new BigInteger(stateTunnelList.getSrcInfo().getTepDeviceId()),
                                                         new BigInteger(stateTunnelList.getDstInfo().getTepDeviceId()),
-                                                        VpnUtil.getVpnId(broker, vpnInstance.getVpnInstanceName()),
+                                                        VpnUtil.getVpnId(dataBroker, vpnInstance.getVpnInstanceName()),
                                                         rd, adjacency.getIpAddress(), srcTepIp, destTepIp);
                                             }
                                             if (tunTypeVal == VpnConstants.ITMTunnelLocType.External.getValue()) {
@@ -276,12 +257,12 @@ public class TunnelInterfaceStateListener extends AbstractDataChangeListener<Sta
                             }
                         }
                         // if (action == UpdateRouteAction.WITHDRAW_ROUTE) {
-                        //    fibManager.cleanUpDpnForVpn(dpnId, VpnUtil.getVpnId(broker, vpnInstance.getVpnInstanceName()), rd);
+                        //    fibManager.cleanUpDpnForVpn(dpnId, VpnUtil.getVpnId(dataBroker, vpnInstance.getVpnInstanceName()), rd);
                         // }
                         // Go through all the VrfEntries and withdraw and readvertise the prefixes to BGP for which the nextHop is the SrcTepIp
                         if ((action == UpdateRouteAction.ADVERTISE_ROUTE) &&
                                 (tunTypeVal == VpnConstants.ITMTunnelLocType.External.getValue())) {
-                            List<VrfEntry> vrfEntries = VpnUtil.getAllVrfEntries(broker, rd);
+                            List<VrfEntry> vrfEntries = VpnUtil.getAllVrfEntries(dataBroker, rd);
                             if (vrfEntries != null) {
                                 for (VrfEntry vrfEntry : vrfEntries) {
                                     String destPrefix = vrfEntry.getDestPrefix().trim();
similarity index 66%
rename from vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnManager.java
rename to vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInstanceListener.java
index ce50456954040b3cd57f4686a8343d30e579bd68..8d28556d7250c66e29e6eb7190eb9118ee25a361 100644 (file)
  */
 package org.opendaylight.netvirt.vpnmanager;
 
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.util.concurrent.ThreadFactoryBuilder;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.*;
-
-import com.google.common.util.concurrent.*;
-
-import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
-import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
-import org.opendaylight.controller.md.sal.binding.api.NotificationService;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
+import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
+import org.opendaylight.netvirt.fibmanager.api.IFibManager;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnAfConfig;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInstances;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.vpntargets.VpnTarget;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.VpnInstance;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.id.to.vpn.instance.VpnIds;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntryBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntryKey;
-
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op
-        .data.entry.VpnToDpnList;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-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;
-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.vpn.instances.VpnInstanceKey;
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInstances;
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.VpnInstanceOpData;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTablesKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
-import org.opendaylight.netvirt.fibmanager.api.IFibManager;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Optional;
-
-public class VpnManager extends AbstractDataChangeListener<VpnInstance> implements AutoCloseable {
-    private static final Logger LOG = LoggerFactory.getLogger(VpnManager.class);
-    private ListenerRegistration<DataChangeListener> listenerRegistration, fibListenerRegistration;
-    private ConcurrentMap<String, Runnable> vpnOpMap = new ConcurrentHashMap<String, Runnable>();
-    private ExecutorService executorService = Executors.newSingleThreadExecutor();
-    private final DataBroker broker;
+public class VpnInstanceListener extends AbstractDataChangeListener<VpnInstance> implements AutoCloseable {
+    private static final Logger LOG = LoggerFactory.getLogger(VpnInstanceListener.class);
+    private ListenerRegistration<DataChangeListener> listenerRegistration;
+    private final DataBroker dataBroker;
     private final IBgpManager bgpManager;
-    private IdManagerService idManager;
-    private VpnInterfaceManager vpnInterfaceManager;
-    private final FibEntriesListener fibListener;
-    private NotificationService notificationService;
-
-    private static final FutureCallback<Void> DEFAULT_CALLBACK =
-            new FutureCallback<Void>() {
-                @Override
-                public void onSuccess(Void result) {
-                    LOG.debug("Success in Datastore operation");
-                }
+    private final IdManagerService idManager;
+    private final VpnInterfaceManager vpnInterfaceManager;
+    private final IFibManager fibManager;
+    private static final ThreadFactory threadFactory = new ThreadFactoryBuilder()
+            .setNameFormat("NV-VpnMgr-%d").build();
+    private ExecutorService executorService = Executors.newSingleThreadExecutor(threadFactory);
+    private ConcurrentMap<String, Runnable> vpnOpMap = new ConcurrentHashMap<String, Runnable>();
 
-                @Override
-                public void onFailure(Throwable error) {
-                    LOG.error("Error in Datastore operation", error);
-                };
-            };
-
-    /**
-     * Listens for data change related to VPN Instance
-     * Informs the BGP about VRF information
-     *
-     * @param db dataBroker reference
-     * @param bgpManager Used to advertise routes to the BGP Router
-     */
-    public VpnManager(final DataBroker db, final IBgpManager bgpManager) {
+    public VpnInstanceListener(final DataBroker dataBroker, final IBgpManager bgpManager,
+                               final IdManagerService idManager,
+                               final VpnInterfaceManager vpnInterfaceManager,
+                               final IFibManager fibManager) {
         super(VpnInstance.class);
-        broker = db;
+        this.dataBroker = dataBroker;
         this.bgpManager = bgpManager;
-        this.fibListener = new FibEntriesListener();
-        registerListener(db);
+        this.idManager = idManager;
+        this.vpnInterfaceManager = vpnInterfaceManager;
+        this.fibManager = fibManager;
     }
 
-    private void registerListener(final DataBroker db) {
-        try {
-            listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
-                    getWildCardPath(), VpnManager.this, DataChangeScope.SUBTREE);
-            fibListenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
-                    getFibEntryListenerPath(), fibListener, DataChangeScope.BASE);
-        } catch (final Exception e) {
-            LOG.error("VPN Service DataChange listener registration fail !", e);
-            throw new IllegalStateException("VPN Service registration Listener failed.", e);
-        }
+    public void start() {
+        LOG.info("{} start", getClass().getSimpleName());
+        listenerRegistration = dataBroker.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
+                getWildCardPath(), this, AsyncDataBroker.DataChangeScope.SUBTREE);
     }
 
-    public void setIdManager(IdManagerService idManager) {
-        this.idManager = idManager;
+    private InstanceIdentifier<VpnInstance> getWildCardPath() {
+        return InstanceIdentifier.create(VpnInstances.class).child(VpnInstance.class);
     }
 
-    public void setVpnInterfaceManager(VpnInterfaceManager vpnInterfaceManager) {
-        this.vpnInterfaceManager = vpnInterfaceManager;
+    @Override
+    public void close() throws Exception {
+        if (listenerRegistration != null) {
+            listenerRegistration.close();
+            listenerRegistration = null;
+        }
+        LOG.info("{} close", getClass().getSimpleName());
+    }
+
+    void notifyTaskIfRequired(String vpnName) {
+        Runnable notifyTask = vpnOpMap.remove(vpnName);
+        if (notifyTask == null) {
+            LOG.trace("VpnInstanceListener update: No Notify Task queued for vpnName {}", vpnName);
+            return;
+        }
+        executorService.execute(notifyTask);
     }
 
     private void waitForOpRemoval(String rd, String vpnName) {
@@ -121,8 +107,8 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
         Integer retryCount = 1;
         long timeout = VpnConstants.MIN_WAIT_TIME_IN_MILLISECONDS;
         Optional<VpnInstanceOpDataEntry> vpnOpValue = null;
-        vpnOpValue = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
-                    VpnUtil.getVpnInstanceOpDataIdentifier(rd));
+        vpnOpValue = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                VpnUtil.getVpnInstanceOpDataIdentifier(rd));
 
         if ((vpnOpValue != null) && (vpnOpValue.isPresent())) {
             vpnOpEntry = vpnOpValue.get();
@@ -151,11 +137,11 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
 
                 try {
                     Thread.sleep(timeout);
-                } catch (java.lang.InterruptedException e) {
+                } catch (InterruptedException e) {
                 }
 
                 // Check current interface count
-                vpnOpValue = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
+                vpnOpValue = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
                         VpnUtil.getVpnInstanceOpDataIdentifier(rd));
                 if ((vpnOpValue != null) && (vpnOpValue.isPresent())) {
                     vpnOpEntry = vpnOpValue.get();
@@ -209,16 +195,16 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
         LOG.trace("Remove VPN event key: {}, value: {}", identifier, del);
         final String vpnName = del.getVpnInstanceName();
         final String rd = del.getIpv4Family().getRouteDistinguisher();
-        final long vpnId = VpnUtil.getVpnId(broker, vpnName);
+        final long vpnId = VpnUtil.getVpnId(dataBroker, vpnName);
         Optional<VpnInstanceOpDataEntry> vpnOpValue = null;
 
         //TODO(vpnteam): Entire code would need refactoring to listen only on the parent object - VPNInstance
         try {
             if ((rd != null) && (!rd.isEmpty())) {
-                vpnOpValue = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
+                vpnOpValue = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
                         VpnUtil.getVpnInstanceOpDataIdentifier(rd));
             } else {
-                vpnOpValue = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
+                vpnOpValue = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
                         VpnUtil.getVpnInstanceOpDataIdentifier(vpnName));
             }
         } catch (Exception e) {
@@ -233,7 +219,7 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
 
         DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
         dataStoreCoordinator.enqueueJob("VPN-" + vpnName,
-                new DeleteVpnInstanceWorker(idManager, broker, del));
+                new DeleteVpnInstanceWorker(idManager, dataBroker, del));
     }
 
     private class DeleteVpnInstanceWorker implements Callable<List<ListenableFuture<Void>>> {
@@ -268,7 +254,6 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
             List<ListenableFuture<Void>> futures = new ArrayList<>();
             futures.add(writeTxn.submit());
             LOG.trace("Removed vpnIdentifier for  rd{} vpnname {}", rd, vpnName);
-            IFibManager fibManager = vpnInterfaceManager.getFibManager();
             if (rd != null) {
                 synchronized (vpnName.intern()) {
                     fibManager.removeVrfTable(broker, rd, null);
@@ -323,7 +308,7 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
 
         DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
         dataStoreCoordinator.enqueueJob("VPN-" + vpnName,
-                new AddVpnInstanceWorker(idManager, vpnInterfaceManager, broker, value));
+                new AddVpnInstanceWorker(idManager, vpnInterfaceManager, dataBroker, value));
     }
 
     private class AddVpnInstanceWorker implements Callable<List<ListenableFuture<Void>>> {
@@ -382,15 +367,16 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
                 : vpnInstanceName);
 
         if (writeConfigTxn != null) {
-            writeConfigTxn.put(LogicalDatastoreType.CONFIGURATION, VpnUtil.getVpnInstanceToVpnIdIdentifier(vpnInstanceName),
+            writeConfigTxn.put(LogicalDatastoreType.CONFIGURATION,
+                    VpnUtil.getVpnInstanceToVpnIdIdentifier(vpnInstanceName),
                     vpnInstanceToVpnId, true);
         } else {
-            syncWrite(LogicalDatastoreType.CONFIGURATION, VpnUtil.getVpnInstanceToVpnIdIdentifier(vpnInstanceName),
-                    vpnInstanceToVpnId, DEFAULT_CALLBACK);
+             TransactionUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                     VpnUtil.getVpnInstanceToVpnIdIdentifier(vpnInstanceName),
+                     vpnInstanceToVpnId, TransactionUtil.DEFAULT_CALLBACK);
         }
 
-        org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.id.to.vpn.instance.VpnIds
-                vpnIdToVpnInstance = VpnUtil.getVpnIdToVpnInstance(vpnId, value.getVpnInstanceName(),
+        VpnIds vpnIdToVpnInstance = VpnUtil.getVpnIdToVpnInstance(vpnId, value.getVpnInstanceName(),
                 (rd != null) ? rd : value.getVpnInstanceName(), (rd != null)/*isExternalVpn*/);
 
         if (writeConfigTxn != null) {
@@ -398,12 +384,11 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
                     VpnUtil.getVpnIdToVpnInstanceIdentifier(vpnId),
                     vpnIdToVpnInstance, true);
         } else {
-            syncWrite(LogicalDatastoreType.CONFIGURATION,
-                    VpnUtil.getVpnIdToVpnInstanceIdentifier(vpnId),
-                    vpnIdToVpnInstance, DEFAULT_CALLBACK);
+             TransactionUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION,
+                     VpnUtil.getVpnIdToVpnInstanceIdentifier(vpnId),
+                     vpnIdToVpnInstance, TransactionUtil.DEFAULT_CALLBACK);
         }
 
-        IFibManager fibManager = vpnInterfaceManager.getFibManager();
         try {
             String cachedTransType = fibManager.getConfTransType();
             LOG.trace("Value for confTransportType is " + cachedTransType);
@@ -427,31 +412,32 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
                             .setVpnInstanceName(vpnInstanceName)
                             .setVpnInterfaceCount(0L);
             if (writeOperTxn != null) {
-                writeOperTxn.merge(LogicalDatastoreType.OPERATIONAL, VpnUtil.getVpnInstanceOpDataIdentifier(vpnInstanceName),
+                writeOperTxn.merge(LogicalDatastoreType.OPERATIONAL,
+                        VpnUtil.getVpnInstanceOpDataIdentifier(vpnInstanceName),
                         builder.build(), true);
             } else {
-                syncWrite(LogicalDatastoreType.OPERATIONAL, VpnUtil.getVpnInstanceOpDataIdentifier(vpnInstanceName),
-                        builder.build(), DEFAULT_CALLBACK);
+                 TransactionUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                         VpnUtil.getVpnInstanceOpDataIdentifier(vpnInstanceName),
+                         builder.build(), TransactionUtil.DEFAULT_CALLBACK);
             }
             synchronized (vpnInstanceName.intern()) {
-                fibManager.addVrfTable(broker, vpnInstanceName, null);
+                fibManager.addVrfTable(dataBroker, vpnInstanceName, null);
             }
         } else {
-            VpnInstanceOpDataEntryBuilder builder =
-                    new VpnInstanceOpDataEntryBuilder().setVrfId(rd).setVpnId(vpnId).setVpnInstanceName(vpnInstanceName)
-                            .setVpnInterfaceCount(0L);
+            VpnInstanceOpDataEntryBuilder builder = new VpnInstanceOpDataEntryBuilder()
+                    .setVrfId(rd).setVpnId(vpnId).setVpnInstanceName(vpnInstanceName).setVpnInterfaceCount(0L);
 
             if (writeOperTxn != null) {
                 writeOperTxn.merge(LogicalDatastoreType.OPERATIONAL,
                         VpnUtil.getVpnInstanceOpDataIdentifier(rd),
                         builder.build(), true);
             } else {
-                syncWrite(LogicalDatastoreType.OPERATIONAL,
+                 TransactionUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL,
                         VpnUtil.getVpnInstanceOpDataIdentifier(rd),
-                        builder.build(), DEFAULT_CALLBACK);
+                        builder.build(), TransactionUtil.DEFAULT_CALLBACK);
             }
             synchronized (vpnInstanceName.intern()) {
-                fibManager.addVrfTable(broker, rd, null);
+                fibManager.addVrfTable(dataBroker, rd, null);
             }
         }
     }
@@ -520,7 +506,7 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
 
         InstanceIdentifier<VpnInstances> vpnsIdentifier =
                 InstanceIdentifier.builder(VpnInstances.class).build();
-        Optional<VpnInstances> optionalVpns = read( LogicalDatastoreType.CONFIGURATION,
+        Optional<VpnInstances> optionalVpns = TransactionUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION,
                 vpnsIdentifier);
         if (!optionalVpns.isPresent() ||
                 optionalVpns.get().getVpnInstance() == null ||
@@ -532,144 +518,13 @@ public class VpnManager extends AbstractDataChangeListener<VpnInstance> implemen
         return true;
     }
 
-    private InstanceIdentifier<?> getWildCardPath() {
-        return InstanceIdentifier.create(VpnInstances.class).child(VpnInstance.class);
-    }
-
-    private InstanceIdentifier<?> getFibEntryListenerPath() {
-        return InstanceIdentifier.create(FibEntries.class).child(VrfTables.class)
-                .child(VrfEntry.class);
-    }
-
-    private InstanceIdentifier<?> getVpnInstanceOpListenerPath() {
-        return InstanceIdentifier.create(VpnInstanceOpData.class).child(VpnInstanceOpDataEntry.class);
-    }
-
-    @Override
-    public void close() throws Exception {
-        if (listenerRegistration != null) {
-            try {
-                listenerRegistration.close();
-            } catch (final Exception e) {
-                LOG.error("Error when cleaning up Vpn DataChangeListener.", e);
-            }
-            listenerRegistration = null;
-        }
-        if (fibListenerRegistration != null) {
-            try {
-                fibListenerRegistration.close();
-            } catch (final Exception e) {
-                LOG.error("Error when cleaning up Fib entries DataChangeListener.", e);
-            }
-            fibListenerRegistration = null;
-        }
-        LOG.trace("VPN Manager Closed");
-    }
-
-    private <T extends DataObject> Optional<T> read(LogicalDatastoreType datastoreType,
-            InstanceIdentifier<T> path) {
-
-        ReadOnlyTransaction tx = broker.newReadOnlyTransaction();
-
-        Optional<T> result = Optional.absent();
-        try {
-            result = tx.read(datastoreType, path).get();
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
-
-        return result;
-    }
-
-    private <T extends DataObject> void asyncWrite(LogicalDatastoreType datastoreType,
-            InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
-        WriteTransaction tx = broker.newWriteOnlyTransaction();
-        tx.put(datastoreType, path, data, true);
-        Futures.addCallback(tx.submit(), callback);
-    }
-
-    private <T extends DataObject> void syncWrite(LogicalDatastoreType datastoreType,
-                                                   InstanceIdentifier<T> path, T data, FutureCallback<Void> callback) {
-        WriteTransaction tx = broker.newWriteOnlyTransaction();
-        tx.put(datastoreType, path, data, true);
-        CheckedFuture<Void, TransactionCommitFailedException> futures = tx.submit();
-        try {
-            futures.get();
-        } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Error writing VPN instance to ID info to datastore (path, data) : ({}, {})", path, data);
-            throw new RuntimeException(e.getMessage());
-        }
-    }
-
-    protected VpnInstance getVpnInstance(String vpnInstanceName) {
-        return VpnUtil.getVpnInstance(broker, vpnInstanceName);
-    }
-
     protected VpnInstanceOpDataEntry getVpnInstanceOpData(String rd) {
         InstanceIdentifier<VpnInstanceOpDataEntry> id = VpnUtil.getVpnInstanceOpDataIdentifier(rd);
-        Optional<VpnInstanceOpDataEntry> vpnInstanceOpData = read(LogicalDatastoreType.OPERATIONAL, id);
+        Optional<VpnInstanceOpDataEntry> vpnInstanceOpData =
+                TransactionUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
         if(vpnInstanceOpData.isPresent()) {
             return vpnInstanceOpData.get();
         }
         return null;
     }
-
-    private class FibEntriesListener extends AbstractDataChangeListener<VrfEntry>  {
-
-        public FibEntriesListener() {
-            super(VrfEntry.class);
-        }
-
-        @Override
-        protected void remove(InstanceIdentifier<VrfEntry> identifier,
-                VrfEntry del) {
-            LOG.trace("Remove Fib event - Key : {}, value : {} ", identifier, del);
-            final VrfTablesKey key = identifier.firstKeyOf(VrfTables.class, VrfTablesKey.class);
-            String rd = key.getRouteDistinguisher();
-            Long label = del.getLabel();
-            VpnInstanceOpDataEntry vpnInstanceOpData = getVpnInstanceOpData(rd);
-            if(vpnInstanceOpData != null) {
-                List<Long> routeIds = vpnInstanceOpData.getRouteEntryId();
-                if(routeIds == null) {
-                    LOG.debug("Fib Route entry is empty.");
-                    return;
-                }
-                LOG.debug("Removing label from vpn info - {}", label);
-                routeIds.remove(label);
-                asyncWrite(LogicalDatastoreType.OPERATIONAL, VpnUtil.getVpnInstanceOpDataIdentifier(rd),
-                           new VpnInstanceOpDataEntryBuilder(vpnInstanceOpData).setRouteEntryId(routeIds).build(), DEFAULT_CALLBACK);
-            } else {
-                LOG.warn("No VPN Instance found for RD: {}", rd);
-            }
-        }
-
-        @Override
-        protected void update(InstanceIdentifier<VrfEntry> identifier,
-                VrfEntry original, VrfEntry update) {
-            // TODO Auto-generated method stub
-
-        }
-
-        @Override
-        protected void add(InstanceIdentifier<VrfEntry> identifier,
-                           VrfEntry add) {
-            LOG.trace("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();
-            VpnInstanceOpDataEntry vpn = getVpnInstanceOpData(rd);
-            if(vpn != null) {
-                List<Long> routeIds = vpn.getRouteEntryId();
-                if(routeIds == null) {
-                    routeIds = new ArrayList<>();
-                }
-                LOG.debug("Adding label to vpn info - {}", label);
-                routeIds.add(label);
-                asyncWrite(LogicalDatastoreType.OPERATIONAL, VpnUtil.getVpnInstanceOpDataIdentifier(rd),
-                           new VpnInstanceOpDataEntryBuilder(vpn).setRouteEntryId(routeIds).build(), DEFAULT_CALLBACK);
-            } else {
-                LOG.warn("No VPN Instance found for RD: {}", rd);
-            }
-        }
-    }
 }
index 8a54060dff38428914dec742723d5a4cf3c53487..b13581ee9c64477ad7631be505d4b1c62d6fd7b3 100644 (file)
  */
 package org.opendaylight.netvirt.vpnmanager;
 
-import com.google.common.base.*;
+import com.google.common.base.Function;
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
 import com.google.common.collect.FluentIterable;
 import com.google.common.collect.Iterators;
-import com.google.common.util.concurrent.*;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.JdkFutureAdapters;
+import com.google.common.util.concurrent.ListenableFuture;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
+import org.opendaylight.genius.mdsalutil.AbstractDataChangeListener;
+import org.opendaylight.genius.mdsalutil.ActionInfo;
+import org.opendaylight.genius.mdsalutil.ActionType;
+import org.opendaylight.genius.mdsalutil.FlowEntity;
+import org.opendaylight.genius.mdsalutil.InstructionInfo;
+import org.opendaylight.genius.mdsalutil.InstructionType;
+import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.genius.mdsalutil.MatchFieldType;
+import org.opendaylight.genius.mdsalutil.MatchInfo;
+import org.opendaylight.genius.mdsalutil.MetaDataUtil;
+import org.opendaylight.genius.mdsalutil.NwConstants;
+import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+import org.opendaylight.genius.utils.ServiceIndex;
 import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
-import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.netvirt.fibmanager.api.IFibManager;
+import org.opendaylight.netvirt.fibmanager.api.RouteOrigin;
 import org.opendaylight.netvirt.vpnmanager.utilities.InterfaceUtils;
-
-import org.opendaylight.controller.md.sal.binding.api.*;
-import org.opendaylight.genius.mdsalutil.*;
-import org.opendaylight.genius.mdsalutil.AbstractDataChangeListener;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnAfConfig;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInstances;
+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.af.config.VpnTargets;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.vpntargets.VpnTarget;
+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.vpn.instances.VpnInstanceKey;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceBuilder;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;
+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.yang.types.rev130715.PhysAddress;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.TableKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TepTypeExternal;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TepTypeHwvtep;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TepTypeInternal;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.TunnelsState;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.op.rev160406.tunnels_state.StateTunnelList;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.IsDcgwPresentInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.IsDcgwPresentOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.OdlArputilService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.SendArpResponseInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.SendArpResponseInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServices;
 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.NodeBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fib.rpc.rev160121.FibRpcService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.LabelRouteMap;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.SubnetRoute;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.SubnetRouteBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTablesBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTablesKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.label.route.map.LabelRouteInfo;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.label.route.map.LabelRouteInfoBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.label.route.map.LabelRouteInfoKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.*;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.PhysAddress;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntryBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.AddDpnEvent;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.AddDpnEventBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.Adjacencies;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.NeutronRouterDpns;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.RemoveDpnEvent;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.RemoveDpnEventBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.add.dpn.event.AddEventData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.add.dpn.event.AddEventDataBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.Adjacency;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.AdjacencyBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.AdjacencyKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.to.extraroute.Vpn;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.prefix.to._interface.vpn.ids.Prefixes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.neutron.router.dpns.RouterDpnList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.neutron.router.dpns.RouterDpnListBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.neutron.router.dpns.RouterDpnListKey;
@@ -69,57 +121,16 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.neu
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.remove.dpn.event.RemoveEventData;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.remove.dpn.event.RemoveEventDataBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
-
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data
-        .VpnInstanceOpDataEntryBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnList;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.VpnToDpnListBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.vpn.to.dpn.list.IpAddresses;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.vpn.to.dpn.list.VpnInterfacesBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data.entry.vpn.to.dpn.list.VpnInterfacesKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.rev131026.instruction.list.Instruction;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.FibEntries;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTables;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTablesBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.fibentries.VrfTablesKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntryBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.OdlArputilService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.SendArpResponseInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.SendArpResponseInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
-
-import java.math.BigInteger;
-import java.util.Collection;
-import java.util.List;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.concurrent.*;
-
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServices;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
-import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
-import org.opendaylight.genius.utils.ServiceIndex;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.NeutronvpnService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.neutron.vpn.portip.port.data.VpnPortipToPort;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.links.InterVpnLink;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier.InstanceIdentifierBuilder;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.InterfacesState;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.Adjacency;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.AdjacencyBuilder;
-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.VpnAfConfig;
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.VpnInstances;
-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.vpn.instances.VpnInstanceKey;
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterface;
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;
 import org.opendaylight.yangtools.yang.common.RpcError;
 import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
@@ -127,121 +138,54 @@ import org.slf4j.LoggerFactory;
 
 public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface> implements AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(VpnInterfaceManager.class);
-    private ListenerRegistration<DataChangeListener> listenerRegistration, opListenerRegistration;
-    private final DataBroker broker;
+    private ListenerRegistration<DataChangeListener> listenerRegistration;
+    private final DataBroker dataBroker;
     private final IBgpManager bgpManager;
-    private IFibManager fibManager;
-    private IMdsalApiManager mdsalManager;
-    private OdlInterfaceRpcService ifaceMgrRpcService;
-    private IdManagerService idManager;
-    private OdlArputilService arpManager;
-    private NeutronvpnService neuService;
-    private VpnSubnetRouteHandler vpnSubnetRouteHandler;
+    private final IFibManager fibManager;
+    private final IMdsalApiManager mdsalManager;
+    private final IdManagerService idManager;
+    private final OdlArputilService arpManager;
+    private final OdlInterfaceRpcService ifaceMgrRpcService;
+    private final NotificationPublishService notificationPublishService;
     private ConcurrentHashMap<String, Runnable> vpnIntfMap = new ConcurrentHashMap<String, Runnable>();
     private ExecutorService executorService = Executors.newSingleThreadExecutor();
-    private InterfaceStateChangeListener interfaceListener;
-    private SubnetRouteInterfaceStateChangeListener subnetRouteInterfaceListener;
-    private TunnelInterfaceStateListener tunnelInterfaceStateListener;
-    private VpnInterfaceOpListener vpnInterfaceOpListener;
-    private ArpNotificationHandler arpNotificationHandler;
-    private DpnInVpnChangeListener dpnInVpnChangeListener;
-    private NotificationPublishService notificationPublishService;
-    private FibRpcService fibService;
-
-    /**
-     * Responsible for listening to data change related to VPN Interface
-     * Bind VPN Service on the interface and informs the BGP service
-     *
-     * @param db - dataBroker service reference
-     * @param bgpManager Used to advertise routes to the BGP Router
-     * @param notificationService Used to subscribe to notification events
-     */
-    public VpnInterfaceManager(final DataBroker db, final IBgpManager bgpManager, NotificationService notificationService) {
+
+    public VpnInterfaceManager(final DataBroker dataBroker,
+                               final IBgpManager bgpManager,
+                               final OdlArputilService arpManager,
+                               final IdManagerService idManager,
+                               final IMdsalApiManager mdsalManager,
+                               final IFibManager fibManager,
+                               final OdlInterfaceRpcService ifaceMgrRpcService,
+                               final NotificationPublishService notificationPublishService) {
         super(VpnInterface.class);
-        broker = db;
+        this.dataBroker = dataBroker;
         this.bgpManager = bgpManager;
-        interfaceListener = new InterfaceStateChangeListener(db, this);
-        subnetRouteInterfaceListener = new SubnetRouteInterfaceStateChangeListener(db, this);
-        vpnInterfaceOpListener = new VpnInterfaceOpListener();
-        arpNotificationHandler = new ArpNotificationHandler(this, broker);
-        vpnSubnetRouteHandler = new VpnSubnetRouteHandler(broker, bgpManager, this);
-        dpnInVpnChangeListener = new DpnInVpnChangeListener(broker);
-        notificationService.registerNotificationListener(vpnSubnetRouteHandler);
-        notificationService.registerNotificationListener(arpNotificationHandler);
-        notificationService.registerNotificationListener(dpnInVpnChangeListener);
-        registerListener(db);
-    }
-
-    public void setMdsalManager(IMdsalApiManager mdsalManager) {
+        this.arpManager = arpManager;
+        this.idManager = idManager;
         this.mdsalManager = mdsalManager;
-    }
-
-    public void setIfaceMgrRpcService(OdlInterfaceRpcService ifMgrRpcService) {
-        this.ifaceMgrRpcService = ifMgrRpcService;
-        interfaceListener.setIfaceMgrRpcService(ifMgrRpcService);
-    }
-
-    public void setFibManager(IFibManager fibManager) {
         this.fibManager = fibManager;
-    }
-
-    public IFibManager getFibManager() {
-        return this.fibManager;
-    }
-
-
-    public void setIdManager(IdManagerService idManager) {
-        this.idManager = idManager;
-        vpnSubnetRouteHandler.setIdManager(idManager);
-    }
-
-    public void setArpManager(OdlArputilService arpManager) {
-        this.arpManager = arpManager;
-    }
-
-    void setNotificationPublishService(NotificationPublishService notificationPublishService) {
+        this.ifaceMgrRpcService = ifaceMgrRpcService;
         this.notificationPublishService = notificationPublishService;
     }
 
-    public void setNeutronvpnManager(NeutronvpnService neuService) { this.neuService = neuService; }
-
-    public void setFibRpcService(FibRpcService fibService) {
-        this.fibService = fibService;
-    }
-
-    public FibRpcService getFibRpcService() {
-        return fibService;
+    public void start() {
+        LOG.info("{} start", getClass().getSimpleName());
+        listenerRegistration = dataBroker.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
+                getWildCardPath(), this, DataChangeScope.SUBTREE);
     }
 
-    public VpnSubnetRouteHandler getVpnSubnetRouteHandler() {
-        return this.vpnSubnetRouteHandler;
+    private InstanceIdentifier<VpnInterface> getWildCardPath() {
+        return InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class);
     }
 
     @Override
     public void close() throws Exception {
         if (listenerRegistration != null) {
-            try {
-                listenerRegistration.close();
-                opListenerRegistration.close();
-            } catch (final Exception e) {
-                LOG.error("Error when cleaning up DataChangeListener.", e);
-            }
+            listenerRegistration.close();
             listenerRegistration = null;
-            opListenerRegistration = null;
-        }
-        LOG.info("VPN Interface Manager Closed");
-    }
-
-    private void registerListener(final DataBroker db) {
-        try {
-            listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
-                    getWildCardPath(), VpnInterfaceManager.this, DataChangeScope.SUBTREE);
-            opListenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
-                    getWildCardPath(), vpnInterfaceOpListener, DataChangeScope.SUBTREE);
-        } catch (final Exception e) {
-            LOG.error("VPN Service DataChange listener registration fail!", e);
-            throw new IllegalStateException("VPN Service registration Listener failed.", e);
         }
+        LOG.info("{} close", getClass().getSimpleName());
     }
 
     private InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface> getInterfaceListenerPath() {
@@ -256,7 +200,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         final String interfaceName = key.getName();
 
         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface interfaceState =
-                InterfaceUtils.getInterfaceStateFromOperDS(broker, interfaceName);
+                InterfaceUtils.getInterfaceStateFromOperDS(dataBroker, interfaceName);
         if(interfaceState != null){
             try{
                 final BigInteger dpnId = InterfaceUtils.getDpIdFromInterface(interfaceState);
@@ -266,9 +210,9 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                         new Callable<List<ListenableFuture<Void>>>() {
                             @Override
                             public List<ListenableFuture<Void>> call() throws Exception {
-                                WriteTransaction writeConfigTxn = broker.newWriteOnlyTransaction();
-                                WriteTransaction writeOperTxn = broker.newWriteOnlyTransaction();
-                                                           WriteTransaction writeInvTxn = broker.newWriteOnlyTransaction();
+                                WriteTransaction writeConfigTxn = dataBroker.newWriteOnlyTransaction();
+                                WriteTransaction writeOperTxn = dataBroker.newWriteOnlyTransaction();
+                                WriteTransaction writeInvTxn = dataBroker.newWriteOnlyTransaction();
                                 processVpnInterfaceUp(dpnId, vpnInterface, ifIndex, false, writeConfigTxn, writeOperTxn, writeInvTxn);
                                 CheckedFuture<Void, TransactionCommitFailedException> futures = writeOperTxn.submit();
                                 try {
@@ -282,19 +226,19 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                                 try {
                                     futures.get();
                                 } catch (InterruptedException | ExecutionException e) {
-                                                                       LOG.error("Error adding config data for interface {} to vpn {} on dpn {}", interfaceName,
+                                    LOG.error("Error adding config data for interface {} to vpn {} on dpn {}", interfaceName,
                                         vpnInterface.getVpnInstanceName(), dpnId);
-                                                                       throw new RuntimeException(e.getMessage());
-                                                               }
-                                                               futures = writeInvTxn.submit();
-                                                               try {
-                                                                       futures.get();
-                                                               } catch (InterruptedException | ExecutionException e) {
-                                                                       LOG.error("Error adding inventory/flow data for interface {} to vpn {} on dpn {}", interfaceName,
+                                    throw new RuntimeException(e.getMessage());
+                                }
+                                futures = writeInvTxn.submit();
+                                try {
+                                    futures.get();
+                                } catch (InterruptedException | ExecutionException e) {
+                                    LOG.error("Error adding inventory/flow data for interface {} to vpn {} on dpn {}", interfaceName,
                                         vpnInterface.getVpnInstanceName(), dpnId);
-                                                                       throw new RuntimeException(e.getMessage());   
-                                                               }
-                                                               return null;
+                                    throw new RuntimeException(e.getMessage());
+                                }
+                                return null;
                             }
                         });
             }catch (Exception e){
@@ -310,19 +254,19 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                                          final int lPortTag, boolean isInterfaceUp,
                                          WriteTransaction writeConfigTxn,
                                          WriteTransaction writeOperTxn,
-                                                                                WriteTransaction writeInvTxn) {
+                                         WriteTransaction writeInvTxn) {
 
         final String interfaceName = vpnInterface.getName();
         if (!isInterfaceUp) {
             final String vpnName = vpnInterface.getVpnInstanceName();
             LOG.info("Binding vpn service to interface {} ", interfaceName);
-            long vpnId = VpnUtil.getVpnId(broker, vpnName);
+            long vpnId = VpnUtil.getVpnId(dataBroker, vpnName);
             if (vpnId == VpnConstants.INVALID_ID) {
                 LOG.trace("VpnInstance to VPNId mapping is not yet available, bailing out now.");
                 return;
             }
             boolean waitForVpnInterfaceOpRemoval = false;
-            VpnInterface opVpnInterface = VpnUtil.getOperationalVpnInterface(broker, vpnInterface.getName());
+            VpnInterface opVpnInterface = VpnUtil.getOperationalVpnInterface(dataBroker, vpnInterface.getName());
             if (opVpnInterface != null ) {
                 String opVpnName = opVpnInterface.getVpnInstanceName();
                 String primaryInterfaceIp = null;
@@ -331,7 +275,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                     // If so, we have to process ADD, as this might be a DPN Restart with Remove and Add triggered
                     // back to back
                     // However, if the primary VRF Entry for this VPNInterface exists, please continue bailing out !
-                    List<Adjacency> adjs = VpnUtil.getAdjacenciesForVpnInterfaceFromConfig(broker, interfaceName);
+                    List<Adjacency> adjs = VpnUtil.getAdjacenciesForVpnInterfaceFromConfig(dataBroker, interfaceName);
                     if (adjs == null) {
                         LOG.info("VPN Interface {} addition failed as adjacencies for this vpn interface could not be obtained", interfaceName);
                         return;
@@ -349,8 +293,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                     }
                     // Get the rd of the vpn instance
                     String rd = getRouteDistinguisher(opVpnName);
-                                       rd =  (rd == null) ? opVpnName : rd;
-                    VrfEntry vrf = VpnUtil.getVrfEntry(broker, rd, primaryInterfaceIp);
+                    rd =  (rd == null) ? opVpnName : rd;
+                    VrfEntry vrf = VpnUtil.getVrfEntry(dataBroker, rd, primaryInterfaceIp);
                     if (vrf != null) {
                         LOG.info("VPN Interface {} already provisioned , bailing out from here.", interfaceName);
                         return;
@@ -385,7 +329,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                 vpnIntfMap.remove(interfaceName);
             }
 
-            opVpnInterface = VpnUtil.getOperationalVpnInterface(broker, interfaceName);
+            opVpnInterface = VpnUtil.getOperationalVpnInterface(dataBroker, interfaceName);
             if (opVpnInterface != null) {
                 LOG.error("VPN Interface {} removal by FIB did not complete on time, bailing addition ...", interfaceName);
                 return;
@@ -423,7 +367,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
 //        public List<ListenableFuture<Void>> call() throws Exception {
 //            // If another renderer(for eg : CSS) needs to be supported, check can be performed here
 //            // to call the respective helpers.
-//            WriteTransaction writeTxn = broker.newWriteOnlyTransaction();
+//            WriteTransaction writeTxn = dataBroker.newWriteOnlyTransaction();
 //            updateDpnDbs(dpnId, vpnName, interfaceName, addToDpn, writeTxn);
 //            List<ListenableFuture<Void>> futures = new ArrayList<>();
 //            futures.add(writeTxn.submit());
@@ -461,7 +405,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
 //         */
 //        @Override
 //        public void onSuccess(List<Void> voids) {
-//            WriteTransaction writeTxn = broker.newWriteOnlyTransaction();
+//            WriteTransaction writeTxn = dataBroker.newWriteOnlyTransaction();
 //            bindService(dpnId, vpnName, interfaceName, lPortTag, writeTxn);
 //            processVpnInterfaceAdjacencies(dpnId, vpnName, interfaceName, writeTxn);
 //            writeTxn.submit();
@@ -487,9 +431,9 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                                                  VpnInterface intf) {
         //Read NextHops
         InstanceIdentifier<Adjacencies> path = identifier.augmentation(Adjacencies.class);
-        Optional<Adjacencies> adjacencies = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, path);
+        Optional<Adjacencies> adjacencies = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path);
 
-        String rd = VpnUtil.getVpnRd(broker, intf.getVpnInstanceName());
+        String rd = VpnUtil.getVpnRd(dataBroker, intf.getVpnInstanceName());
         if (rd == null) {
             LOG.error("advertiseAdjacenciesForVpnFromBgp: Unable to recover rd for interface {} in vpn {}",
                     intf.getName(), intf.getVpnInstanceName());
@@ -505,7 +449,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         LOG.info("advertiseAdjacenciesForVpnToBgp: Advertising interface {} in vpn {} with rd {} ", intf.getName(),
                 intf.getVpnInstanceName(), rd);
 
-        String nextHopIp = InterfaceUtils.getEndpointIpAddressForDPN(broker, dpnId);
+        String nextHopIp = InterfaceUtils.getEndpointIpAddressForDPN(dataBroker, dpnId);
         if (nextHopIp == null){
             LOG.trace("advertiseAdjacenciesForVpnToBgp: NextHop for interface {} is null, returning", intf.getName());
             return;
@@ -534,9 +478,9 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
     private void withdrawAdjacenciesForVpnFromBgp(final InstanceIdentifier<VpnInterface> identifier, VpnInterface intf) {
         //Read NextHops
         InstanceIdentifier<Adjacencies> path = identifier.augmentation(Adjacencies.class);
-        Optional<Adjacencies> adjacencies = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, path);
+        Optional<Adjacencies> adjacencies = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path);
 
-        String rd = VpnUtil.getVpnRd(broker, intf.getVpnInstanceName());
+        String rd = VpnUtil.getVpnRd(dataBroker, intf.getVpnInstanceName());
         if (rd == null) {
             LOG.error("withdrawAdjacenciesForVpnFromBgp: Unable to recover rd for interface {} in vpn {}",
                     intf.getName(), intf.getVpnInstanceName());
@@ -569,8 +513,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         }
     }
 
-    private void updateVpnToDpnMapping(BigInteger dpId, String vpnName, String interfaceName, boolean add) {
-        long vpnId = VpnUtil.getVpnId(broker, vpnName);
+    public void updateVpnToDpnMapping(BigInteger dpId, String vpnName, String interfaceName, boolean add) {
+        long vpnId = VpnUtil.getVpnId(dataBroker, vpnName);
         if (dpId == null) {
             dpId = InterfaceUtils.getDpnForInterface(ifaceMgrRpcService, interfaceName);
         }
@@ -585,7 +529,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
     private void bindService(BigInteger dpId, String vpnInstanceName, String vpnInterfaceName, int lPortTag,
                              WriteTransaction writeConfigTxn, WriteTransaction writeInvTxn) {
         int priority = VpnConstants.DEFAULT_FLOW_PRIORITY;
-        long vpnId = VpnUtil.getVpnId(broker, vpnInstanceName);
+        long vpnId = VpnUtil.getVpnId(dataBroker, vpnInstanceName);
 
         int instructionKey = 0;
         List<Instruction> instructions = new ArrayList<Instruction>();
@@ -598,7 +542,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         BoundServices
                 serviceInfo =
                 InterfaceUtils.getBoundServices(String.format("%s.%s.%s", "vpn",vpnInstanceName, vpnInterfaceName),
-                               l3vpn_service_index, priority,
+                        l3vpn_service_index, priority,
                         NwConstants.COOKIE_VM_INGRESS_TABLE, instructions);
         writeConfigTxn.put(LogicalDatastoreType.CONFIGURATION,
                 InterfaceUtils.buildServiceId(vpnInterfaceName, l3vpn_service_index), serviceInfo, true);
@@ -615,7 +559,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         InstanceIdentifier<VpnInterface> identifier = VpnUtil.getVpnInterfaceIdentifier(interfaceName);
         // Read NextHops
         InstanceIdentifier<Adjacencies> path = identifier.augmentation(Adjacencies.class);
-        Optional<Adjacencies> adjacencies = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, path);
+        Optional<Adjacencies> adjacencies = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, path);
 
         if (adjacencies.isPresent()) {
             List<Adjacency> nextHops = adjacencies.get().getAdjacency();
@@ -624,7 +568,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
             // Get the rd of the vpn instance
             String rd = getRouteDistinguisher(vpnName);
 
-            String nextHopIp = InterfaceUtils.getEndpointIpAddressForDPN(broker, dpnId);
+            String nextHopIp = InterfaceUtils.getEndpointIpAddressForDPN(dataBroker, dpnId);
             if (nextHopIp == null){
                 LOG.error("NextHop for interface {} is null", interfaceName);
                 return;
@@ -648,7 +592,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                     writeOperTxn.merge(
                             LogicalDatastoreType.OPERATIONAL,
                             VpnUtil.getPrefixToInterfaceIdentifier(
-                                    VpnUtil.getVpnId(broker, vpnName), prefix),
+                                    VpnUtil.getVpnId(dataBroker, vpnName), prefix),
                             VpnUtil.getPrefixToInterface(dpnId, interfaceName, prefix), true);
                 } else {
                     //Extra route adjacency
@@ -666,7 +610,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
             VpnInterface opInterface = VpnUtil.getVpnInterface(interfaceName, vpnName, aug, dpnId, Boolean.FALSE);
             InstanceIdentifier<VpnInterface> interfaceId = VpnUtil.getVpnInterfaceIdentifier(interfaceName);
             writeOperTxn.put(LogicalDatastoreType.OPERATIONAL, interfaceId, opInterface, true);
-            long vpnId = VpnUtil.getVpnId(broker, vpnName);
+            long vpnId = VpnUtil.getVpnId(dataBroker, vpnName);
 
             for (Adjacency nextHop : aug.getAdjacency()) {
                 long label = nextHop.getLabel();
@@ -680,13 +624,13 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                         String vpnRd = vpn.getIpv4Family().getRouteDistinguisher();
                         if (vpnRd != null) {
                             LOG.debug("Exporting route with rd {} prefix {} nexthop {} label {} to VPN {}", vpnRd, nextHop.getIpAddress(), nextHopIp, label, vpn);
-                            fibManager.addOrUpdateFibEntry(broker, vpnRd, nextHop.getIpAddress(), Arrays.asList(nextHopIp), (int) label,
+                            fibManager.addOrUpdateFibEntry(dataBroker, vpnRd, nextHop.getIpAddress(), Arrays.asList(nextHopIp), (int) label,
                                     RouteOrigin.SELF_IMPORTED, writeConfigTxn);
                         }
                     }
                 } else {
                     // ### add FIB route directly
-                    fibManager.addOrUpdateFibEntry(broker, vpnName, nextHop.getIpAddress(), Arrays.asList(nextHopIp),
+                    fibManager.addOrUpdateFibEntry(dataBroker, vpnName, nextHop.getIpAddress(), Arrays.asList(nextHopIp),
                             (int) label, RouteOrigin.STATIC, writeConfigTxn);
                 }
             }
@@ -698,7 +642,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
 
         InstanceIdentifier<VpnInstance> id = InstanceIdentifier.builder(VpnInstances.class)
                 .child(VpnInstance.class, new VpnInstanceKey(vpnName)).build();
-        Optional<VpnInstance> optVpnInstance = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, id);
+        Optional<VpnInstance> optVpnInstance = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id);
         final VpnInstance vpnInstance;
         if (optVpnInstance.isPresent()) {
             vpnInstance = optVpnInstance.get();
@@ -731,7 +675,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
             }
         };
 
-        vpnsToImportRoute = FluentIterable.from(VpnUtil.getAllVpnInstance(broker)).
+        vpnsToImportRoute = FluentIterable.from(VpnUtil.getAllVpnInstance(dataBroker)).
                 filter(excludeVpn).
                 filter(matchRTs).toList();
         return vpnsToImportRoute;
@@ -742,7 +686,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
 
         InstanceIdentifier<VpnInstance> id = InstanceIdentifier.builder(VpnInstances.class)
                 .child(VpnInstance.class, new VpnInstanceKey(vpnName)).build();
-        Optional<VpnInstance> optVpnInstance = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, id);
+        Optional<VpnInstance> optVpnInstance = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id);
         final VpnInstance vpnInstance;
         if (optVpnInstance.isPresent()) {
             vpnInstance = optVpnInstance.get();
@@ -774,7 +718,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
             }
         };
 
-        vpnsToExportRoute = FluentIterable.from(VpnUtil.getAllVpnInstance(broker)).
+        vpnsToExportRoute = FluentIterable.from(VpnUtil.getAllVpnInstance(dataBroker)).
                 filter(excludeVpn).
                 filter(matchRTs).toList();
         return vpnsToExportRoute;
@@ -904,7 +848,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
     private String getRouteDistinguisher(String vpnName) {
         InstanceIdentifier<VpnInstance> id = InstanceIdentifier.builder(VpnInstances.class)
                 .child(VpnInstance.class, new VpnInstanceKey(vpnName)).build();
-        Optional<VpnInstance> vpnInstance = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, id);
+        Optional<VpnInstance> vpnInstance = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id);
         String rd = "";
         if(vpnInstance.isPresent()) {
             VpnInstance instance = vpnInstance.get();
@@ -918,11 +862,11 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         String routeDistinguisher = getRouteDistinguisher(vpnName);
         String rd = (routeDistinguisher == null) ? vpnName : routeDistinguisher;
         Boolean newDpnOnVpn = Boolean.FALSE;
-               
+
         synchronized (vpnName.intern()) {
-            WriteTransaction writeTxn = broker.newWriteOnlyTransaction();
+            WriteTransaction writeTxn = dataBroker.newWriteOnlyTransaction();
             InstanceIdentifier<VpnToDpnList> id = VpnUtil.getVpnToDpnListIdentifier(rd, dpnId);
-            Optional<VpnToDpnList> dpnInVpn = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, id);
+            Optional<VpnToDpnList> dpnInVpn = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
             org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.vpn.instance.op.data
                     .entry.vpn.to.dpn.list.VpnInterfaces
                     vpnInterface = new VpnInterfacesBuilder().setInterfaceName(intfName).build();
@@ -934,7 +878,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                                     .op.data.vpn.instance.op.data.entry.vpn.to.dpn.list.VpnInterfaces.class,
                             new VpnInterfacesKey(intfName)), vpnInterface, true);
                 } else {
-                    VpnUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, id.child(
+                    VpnUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, id.child(
                             org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance
                                     .op.data.vpn.instance.op.data.entry.vpn.to.dpn.list.VpnInterfaces.class,
                             new VpnInterfacesKey(intfName)), vpnInterface);
@@ -949,7 +893,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                 if (writeTxn != null) {
                     writeTxn.put(LogicalDatastoreType.OPERATIONAL, id, vpnToDpnListBuilder.build(), true);
                 } else {
-                    VpnUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, id, vpnToDpnListBuilder.build());
+                    VpnUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, id, vpnToDpnListBuilder.build());
                 }
                 newDpnOnVpn = Boolean.TRUE;
             }
@@ -975,10 +919,10 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         Boolean lastDpnOnVpn = Boolean.FALSE;
 
         synchronized (vpnName.intern()) {
-            String rd = VpnUtil.getVpnRd(broker, vpnName);
+            String rd = VpnUtil.getVpnRd(dataBroker, vpnName);
             InstanceIdentifier<VpnToDpnList> id = VpnUtil.getVpnToDpnListIdentifier(rd, dpnId);
-            Optional<VpnToDpnList> dpnInVpn = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, id);
-            WriteTransaction writeTxn = broker.newWriteOnlyTransaction();
+            Optional<VpnToDpnList> dpnInVpn = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, id);
+            WriteTransaction writeTxn = dataBroker.newWriteOnlyTransaction();
             if (dpnInVpn.isPresent()) {
                 List<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data
                         .vpn.instance.op.data.entry.vpn.to.dpn.list.VpnInterfaces> vpnInterfaces = dpnInVpn.get().getVpnInterfaces();
@@ -996,7 +940,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                             if (writeTxn != null) {
                                 writeTxn.put(LogicalDatastoreType.OPERATIONAL, id, dpnInVpnBuilder.build(), true);
                             } else {
-                                VpnUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, id, dpnInVpnBuilder.build());
+                                VpnUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, id, dpnInVpnBuilder.build());
                             }
                             lastDpnOnVpn = Boolean.TRUE;
                         } else {
@@ -1009,7 +953,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                                             .vpn.instance.op.data.entry.vpn.to.dpn.list.VpnInterfaces.class,
                                     new VpnInterfacesKey(intfName)));
                         } else {
-                            VpnUtil.delete(broker, LogicalDatastoreType.OPERATIONAL, id.child(
+                            VpnUtil.delete(dataBroker, LogicalDatastoreType.OPERATIONAL, id.child(
                                     org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data
                                             .vpn.instance.op.data.entry.vpn.to.dpn.list.VpnInterfaces.class,
                                     new VpnInterfacesKey(intfName)), VpnUtil.DEFAULT_CALLBACK);
@@ -1036,8 +980,8 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         List<VpnInstance> vpnsToExportRoute = getVpnsExportingMyRoute(vpnName);
         for (VpnInstance vpn : vpnsToExportRoute) {
             String rd = vpn.getIpv4Family().getRouteDistinguisher();
-            List<VrfEntry> vrfEntries = VpnUtil.getAllVrfEntries(broker, vpn.getIpv4Family().getRouteDistinguisher());
-            WriteTransaction writeConfigTxn = broker.newWriteOnlyTransaction();
+            List<VrfEntry> vrfEntries = VpnUtil.getAllVrfEntries(dataBroker, vpn.getIpv4Family().getRouteDistinguisher());
+            WriteTransaction writeConfigTxn = dataBroker.newWriteOnlyTransaction();
             if (vrfEntries != null) {
                 for (VrfEntry vrfEntry : vrfEntries) {
                     try {
@@ -1054,7 +998,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                                 importSubnetRouteForNewVpn(rd, prefix, nh, (int)label, route, writeConfigTxn);
                             } else {
                                 LOG.info("Importing fib entry rd {} prefix {} nexthop {} label {} to vpn {}", vpnRd, prefix, nh, label, vpn.getVpnInstanceName());
-                                fibManager.addOrUpdateFibEntry(broker, vpnRd, prefix, Arrays.asList(nh), (int)label,
+                                fibManager.addOrUpdateFibEntry(dataBroker, vpnRd, prefix, Arrays.asList(nh), (int)label,
                                         RouteOrigin.SELF_IMPORTED, writeConfigTxn);
                             }
                         }
@@ -1072,7 +1016,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
     private void addPrefixToBGP(String rd, String prefix, String nextHopIp, long label, WriteTransaction writeConfigTxn) {
         try {
             LOG.info("ADD: Adding Fib entry rd {} prefix {} nextHop {} label {}", rd, prefix, nextHopIp, label);
-            fibManager.addOrUpdateFibEntry(broker, rd, prefix, Arrays.asList(nextHopIp), (int)label, RouteOrigin.STATIC, writeConfigTxn);
+            fibManager.addOrUpdateFibEntry(dataBroker, rd, prefix, Arrays.asList(nextHopIp), (int)label, RouteOrigin.STATIC, writeConfigTxn);
             bgpManager.advertisePrefix(rd, prefix, Arrays.asList(nextHopIp), (int)label);
             LOG.info("ADD: Added Fib entry rd {} prefix {} nextHop {} label {}", rd, prefix, nextHopIp, label);
         } catch(Exception e) {
@@ -1080,11 +1024,6 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         }
     }
 
-
-    private InstanceIdentifier<VpnInterface> getWildCardPath() {
-        return InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class);
-    }
-
     @Override
     public void remove( InstanceIdentifier<VpnInterface> identifier, VpnInterface vpnInterface) {
         LOG.trace("Remove event - key: {}, value: {}" ,identifier, vpnInterface );
@@ -1092,9 +1031,9 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         final String interfaceName = key.getName();
 
         InstanceIdentifier<VpnInterface> interfaceId = VpnUtil.getVpnInterfaceIdentifier(interfaceName);
-        final Optional<VpnInterface> optVpnInterface = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, interfaceId);
+        final Optional<VpnInterface> optVpnInterface = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, interfaceId);
         org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface interfaceState =
-                InterfaceUtils.getInterfaceStateFromOperDS(broker, interfaceName);
+                InterfaceUtils.getInterfaceStateFromOperDS(dataBroker, interfaceName);
         if (optVpnInterface.isPresent()){
             BigInteger dpnId = BigInteger.ZERO;
             Boolean dpnIdRetrieved = Boolean.FALSE;
@@ -1121,9 +1060,9 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                     new Callable<List<ListenableFuture<Void>>>() {
                         @Override
                         public List<ListenableFuture<Void>> call() throws Exception {
-                            WriteTransaction writeConfigTxn = broker.newWriteOnlyTransaction();
-                            WriteTransaction writeOperTxn = broker.newWriteOnlyTransaction();
-                            WriteTransaction writeInvTxn = broker.newWriteOnlyTransaction();
+                            WriteTransaction writeConfigTxn = dataBroker.newWriteOnlyTransaction();
+                            WriteTransaction writeOperTxn = dataBroker.newWriteOnlyTransaction();
+                            WriteTransaction writeInvTxn = dataBroker.newWriteOnlyTransaction();
                             processVpnInterfaceDown(dpId, interfaceName, ifIndex, false, true, writeConfigTxn, writeOperTxn, writeInvTxn);
                             CheckedFuture<Void, TransactionCommitFailedException> futures = writeOperTxn.submit();
                             try {
@@ -1148,7 +1087,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                                 LOG.error("Error removing Inventory/Flow data for interface {} from vpn {} on dpn {}", interfaceName,
                                         vpnOpInterface.getVpnInstanceName(), dpId);
                                 throw new RuntimeException(e.getMessage());
-                                                       }
+                            }
                             return null;
                         }
                     });
@@ -1159,23 +1098,23 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
     }
 
     protected void processVpnInterfaceDown(BigInteger dpId, 
-                                                                                  String interfaceName, 
-                                                                                  int lPortTag, 
-                                                                                  boolean isInterfaceStateDown,
+                                           String interfaceName,
+                                           int lPortTag,
+                                           boolean isInterfaceStateDown,
                                            boolean isConfigRemoval, 
-                                                                                  WriteTransaction writeConfigTxn, 
-                                                                                  WriteTransaction writeOperTxn,
-                                                                                  WriteTransaction writeInvTxn) {
+                                           WriteTransaction writeConfigTxn,
+                                           WriteTransaction writeOperTxn,
+                                           WriteTransaction writeInvTxn) {
         InstanceIdentifier<VpnInterface> identifier = VpnUtil.getVpnInterfaceIdentifier(interfaceName);
         if (!isInterfaceStateDown) {
-            VpnInterface vpnInterface = VpnUtil.getOperationalVpnInterface(broker, interfaceName);
+            VpnInterface vpnInterface = VpnUtil.getOperationalVpnInterface(dataBroker, interfaceName);
             if(vpnInterface == null){
                 LOG.info("Unable to process delete/down for interface {} as it is not available in operational data store", interfaceName);
                 return;
             }else{
                 final String vpnName = vpnInterface.getVpnInstanceName();
                 if(!vpnInterface.isScheduledForRemove()){
-                    VpnUtil.scheduleVpnInterfaceForRemoval(broker, interfaceName, dpId, vpnName, Boolean.TRUE, writeOperTxn);
+                    VpnUtil.scheduleVpnInterfaceForRemoval(dataBroker, interfaceName, dpId, vpnName, Boolean.TRUE, writeOperTxn);
                     removeAdjacenciesFromVpn(dpId, interfaceName, vpnInterface.getVpnInstanceName(), writeConfigTxn);
                     LOG.info("Unbinding vpn service from interface {} ", interfaceName);
                     unbindService(dpId, vpnName, interfaceName, lPortTag, isInterfaceStateDown, isConfigRemoval, writeConfigTxn, writeInvTxn);
@@ -1187,7 +1126,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         } else {
             // Interface is retained in the DPN, but its Link Down.
             // Only withdraw the prefixes for this interface from BGP
-            VpnInterface vpnInterface = VpnUtil.getOperationalVpnInterface(broker, interfaceName);
+            VpnInterface vpnInterface = VpnUtil.getOperationalVpnInterface(dataBroker, interfaceName);
             if(vpnInterface == null){
                 LOG.info("Unable to withdraw adjacencies for vpn interface {} from BGP as it is not available in operational data store", interfaceName);
                 return;
@@ -1220,9 +1159,9 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         //Read NextHops
         InstanceIdentifier<VpnInterface> identifier = VpnUtil.getVpnInterfaceIdentifier(interfaceName);
         InstanceIdentifier<Adjacencies> path = identifier.augmentation(Adjacencies.class);
-        Optional<Adjacencies> adjacencies = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, path);
+        Optional<Adjacencies> adjacencies = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path);
 
-        String rd = VpnUtil.getVpnRd(broker, vpnName);
+        String rd = VpnUtil.getVpnRd(dataBroker, vpnName);
         LOG.trace("removeAdjacenciesFromVpn: For interface {} RD recovered for vpn {} as rd {}", interfaceName,
                 vpnName, rd);
         if (adjacencies.isPresent()) {
@@ -1234,7 +1173,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                     List<String> nhList = new ArrayList<String>();
                     if (nextHop.getMacAddress() == null || nextHop.getMacAddress().isEmpty()) {
                         // This is either an extra-route (or) a learned IP via subnet-route
-                        String nextHopIp = InterfaceUtils.getEndpointIpAddressForDPN(broker, dpnId);
+                        String nextHopIp = InterfaceUtils.getEndpointIpAddressForDPN(dataBroker, dpnId);
                         if (nextHopIp == null || nextHopIp.isEmpty()) {
                             LOG.error("Unable to obtain nextHopIp for extra-route/learned-route in rd {} prefix {}",
                                     rd, nextHop.getIpAddress());
@@ -1249,7 +1188,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                         //this is an internal vpn - the rd is assigned to the vpn instance name;
                         //remove from FIB directly
                         for(String nh : nhList) {
-                            fibManager.removeOrUpdateFibEntry(broker, vpnName, nextHop.getIpAddress(), nh, writeConfigTxn);
+                            fibManager.removeOrUpdateFibEntry(dataBroker, vpnName, nextHop.getIpAddress(), nh, writeConfigTxn);
                         }
                     } else {
                         List<VpnInstance> vpnsToImportRoute = getVpnsImportingMyRoute(vpnName);
@@ -1260,18 +1199,18 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                                 String vpnRd = vpn.getIpv4Family().getRouteDistinguisher();
                                 if (vpnRd != null) {
                                     LOG.info("Removing Exported route with rd {} prefix {} from VPN {}", vpnRd, nextHop.getIpAddress(), vpn.getVpnInstanceName());
-                                    fibManager.removeOrUpdateFibEntry(broker, vpnRd, nextHop.getIpAddress(), nh, writeConfigTxn);
+                                    fibManager.removeOrUpdateFibEntry(dataBroker, vpnRd, nextHop.getIpAddress(), nh, writeConfigTxn);
                                 }
                             }
                         }
                     }
                     String ip = nextHop.getIpAddress().split("/")[0];
-                    VpnPortipToPort vpnPortipToPort = VpnUtil.getNeutronPortFromVpnPortFixedIp(broker,
+                    VpnPortipToPort vpnPortipToPort = VpnUtil.getNeutronPortFromVpnPortFixedIp(dataBroker,
                             vpnName, ip);
                     if (vpnPortipToPort != null && !vpnPortipToPort.isConfig()) {
                         LOG.trace("VpnInterfaceManager removing adjacency for Interface {} ip {} from VpnPortData Entry",
                                 vpnPortipToPort.getPortName(),ip);
-                        VpnUtil.removeVpnPortFixedIpToPort(broker, vpnName, ip);
+                        VpnUtil.removeVpnPortFixedIpToPort(dataBroker, vpnName, ip);
                     }
                 }
             }
@@ -1288,7 +1227,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                     InterfaceUtils.buildServiceId(vpnInterfaceName,
                             l3vpn_service_index));
         }
-        long vpnId = VpnUtil.getVpnId(broker, vpnInstanceName);
+        long vpnId = VpnUtil.getVpnId(dataBroker, vpnInstanceName);
         makeArpFlow(dpId, l3vpn_service_index, lPortTag, vpnInterfaceName,
                 vpnId, ArpReplyOrRequest.REQUEST, NwConstants.DEL_FLOW, writeInvTxn);
         makeArpFlow(dpId, l3vpn_service_index, lPortTag, vpnInterfaceName,
@@ -1299,7 +1238,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
     private void removePrefixFromBGP(String rd, String prefix, String nextHop, WriteTransaction writeConfigTxn) {
         try {
             LOG.info("VPN WITHDRAW: Removing Fib Entry rd {} prefix {}", rd, prefix);
-            fibManager.removeOrUpdateFibEntry(broker, rd, prefix, nextHop, writeConfigTxn);
+            fibManager.removeOrUpdateFibEntry(dataBroker, rd, prefix, nextHop, writeConfigTxn);
             bgpManager.withdrawPrefix(rd, prefix); // TODO: Might be needed to include nextHop here
             LOG.info("VPN WITHDRAW: Removed Fib Entry rd {} prefix {}", rd, prefix);
         } catch(Exception e) {
@@ -1403,7 +1342,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                 lriBuilder.setVpnInterfaceName(vpnInterfaceName);
             }
             lriBuilder.setParentVpnRd(rd);
-            VpnInstanceOpDataEntry vpnInstanceOpDataEntry = VpnUtil.getVpnInstanceOpData(broker, rd);
+            VpnInstanceOpDataEntry vpnInstanceOpDataEntry = VpnUtil.getVpnInstanceOpData(dataBroker, rd);
             if (vpnInstanceOpDataEntry != null) {
                 List<String> vpnInstanceNames = Arrays.asList(vpnInstanceOpDataEntry.getVpnInstanceName());
                 lriBuilder.setVpnInstanceList(vpnInstanceNames);
@@ -1413,7 +1352,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
             if (writeOperTxn != null) {
                 writeOperTxn.merge(LogicalDatastoreType.OPERATIONAL, lriIid, lri, true);
             } else {
-                VpnUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, lriIid, lri);
+                VpnUtil.syncUpdate(dataBroker, LogicalDatastoreType.OPERATIONAL, lriIid, lri);
             }
         } else {
             LOG.trace("Can't add entry to label map for lable {},dpnId is null", label);
@@ -1431,7 +1370,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         LOG.debug("Created vrfEntry for {} nexthop {} label {} and elantag {}", prefix, nextHop, label, elantag);
 
         //TODO: What should be parentVpnId? Get it from RD?
-        long vpnId = VpnUtil.getVpnId(broker, vpnName);
+        long vpnId = VpnUtil.getVpnId(dataBroker, vpnName);
         addToLabelMapper((long)label, dpnId, prefix, Arrays.asList(nextHop), vpnId, null, elantag, true, rd, null);
         List<VrfEntry> vrfEntryList = Arrays.asList(vrfEntry);
 
@@ -1445,7 +1384,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         if (writeTxn != null) {
             writeTxn.merge(LogicalDatastoreType.CONFIGURATION, vrfTableId, vrfTableNew, true);
         } else {
-            VpnUtil.syncUpdate(broker, LogicalDatastoreType.CONFIGURATION, vrfTableId, vrfTableNew);
+            VpnUtil.syncUpdate(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfTableId, vrfTableNew);
         }
 
         List<VpnInstance> vpnsToImportRoute = getVpnsImportingMyRoute(vpnName);
@@ -1462,7 +1401,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                 if (writeTxn != null) {
                     writeTxn.merge(LogicalDatastoreType.CONFIGURATION, importingVrfTableId, importingVrfTable, true);
                 } else {
-                    VpnUtil.syncUpdate(broker, LogicalDatastoreType.CONFIGURATION, importingVrfTableId, importingVrfTable);
+                    VpnUtil.syncUpdate(dataBroker, LogicalDatastoreType.CONFIGURATION, importingVrfTableId, importingVrfTable);
                 }
             }
         }
@@ -1485,30 +1424,30 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         if (writeConfigTxn != null) {
             writeConfigTxn.merge(LogicalDatastoreType.CONFIGURATION, vrfTableId, vrfTableNew, true);
         } else {
-            VpnUtil.syncUpdate(broker, LogicalDatastoreType.CONFIGURATION, vrfTableId, vrfTableNew);
+            VpnUtil.syncUpdate(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfTableId, vrfTableNew);
         }
     }
 
     public synchronized void deleteSubnetRouteFibEntryFromDS(String rd, String prefix, String vpnName){
-        fibManager.removeOrUpdateFibEntry(broker, rd, prefix, null /* nextHopToRemove */, null);
+        fibManager.removeOrUpdateFibEntry(dataBroker, rd, prefix, null /* nextHopToRemove */, null);
         List<VpnInstance> vpnsToImportRoute = getVpnsImportingMyRoute(vpnName);
         for (VpnInstance vpnInstance : vpnsToImportRoute) {
             String importingRd = vpnInstance.getIpv4Family().getRouteDistinguisher();
             LOG.info("Deleting imported subnet route rd {} prefix {} from vpn {}", rd, prefix, vpnInstance.getVpnInstanceName());
-            fibManager.removeOrUpdateFibEntry(broker, importingRd, prefix, null /* nextHopToRemove */, null);
+            fibManager.removeOrUpdateFibEntry(dataBroker, importingRd, prefix, null /* nextHopToRemove */, null);
         }
     }
 
     protected void addNewAdjToVpnInterface(InstanceIdentifier<VpnInterface> identifier, Adjacency adj, BigInteger dpnId) {
 
-        Optional<VpnInterface> optVpnInterface = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, identifier);
+        Optional<VpnInterface> optVpnInterface = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier);
 
         if (optVpnInterface.isPresent()) {
             VpnInterface currVpnIntf = optVpnInterface.get();
             String prefix = VpnUtil.getIpPrefix(adj.getIpAddress());
             String rd = getRouteDistinguisher(currVpnIntf.getVpnInstanceName());
             InstanceIdentifier<Adjacencies> adjPath = identifier.augmentation(Adjacencies.class);
-            Optional<Adjacencies> optAdjacencies = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, adjPath);
+            Optional<Adjacencies> optAdjacencies = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, adjPath);
             long label =
                     VpnUtil.getUniqueId(idManager, VpnConstants.VPN_IDPOOL_NAME,
                             VpnUtil.getNextHopLabelKey((rd != null) ? rd : currVpnIntf.getVpnInstanceName(), prefix));
@@ -1527,7 +1466,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
             Adjacencies aug = VpnUtil.getVpnInterfaceAugmentation(adjacencies);
             VpnInterface newVpnIntf = VpnUtil.getVpnInterface(currVpnIntf.getName(), currVpnIntf.getVpnInstanceName(), aug, dpnId, currVpnIntf.isScheduledForRemove());
 
-            VpnUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, identifier, newVpnIntf);
+            VpnUtil.syncUpdate(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier, newVpnIntf);
             for (String nh : adj.getNextHopIpList()) {
                 addExtraRoute(adj.getIpAddress(), nh, rd, currVpnIntf.getVpnInstanceName(), (int) label,
                         currVpnIntf.getName());
@@ -1536,13 +1475,13 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
     }
 
     protected void delAdjFromVpnInterface(InstanceIdentifier<VpnInterface> identifier, Adjacency adj, BigInteger dpnId) {
-        Optional<VpnInterface> optVpnInterface = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, identifier);
+        Optional<VpnInterface> optVpnInterface = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier);
 
         if (optVpnInterface.isPresent()) {
             VpnInterface currVpnIntf = optVpnInterface.get();
 
             InstanceIdentifier<Adjacencies> path = identifier.augmentation(Adjacencies.class);
-            Optional<Adjacencies> optAdjacencies = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, path);
+            Optional<Adjacencies> optAdjacencies = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path);
             if (optAdjacencies.isPresent()) {
                 List<Adjacency> adjacencies = optAdjacencies.get().getAdjacency();
 
@@ -1560,7 +1499,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                                     currVpnIntf.getVpnInstanceName(),
                                     aug, dpnId, currVpnIntf.isScheduledForRemove());
 
-                            VpnUtil.syncUpdate(broker, LogicalDatastoreType.OPERATIONAL, identifier, newVpnIntf);
+                            VpnUtil.syncUpdate(dataBroker, LogicalDatastoreType.OPERATIONAL, identifier, newVpnIntf);
 
                             for (String nh : adj.getNextHopIpList()) {
                                 delExtraRoute(adj.getIpAddress(), nh, rd, currVpnIntf.getVpnInstanceName(),
@@ -1581,7 +1520,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
 
         //add extra route to vpn mapping; advertise with nexthop as tunnel ip
         VpnUtil.syncUpdate(
-                broker,
+                dataBroker,
                 LogicalDatastoreType.OPERATIONAL,
                 VpnUtil.getVpnToExtrarouteIdentifier( (rd != null) ? rd : routerID, destination),
                 VpnUtil.getVpnToExtraroute(destination, Arrays.asList(nextHop)));
@@ -1589,7 +1528,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         BigInteger dpnId = null;
         if (intfName != null && !intfName.isEmpty()) {
             dpnId = InterfaceUtils.getDpnForInterface(ifaceMgrRpcService, intfName);
-            String nextHopIp = InterfaceUtils.getEndpointIpAddressForDPN(broker, dpnId);
+            String nextHopIp = InterfaceUtils.getEndpointIpAddressForDPN(dataBroker, dpnId);
             if (nextHopIp == null || nextHopIp.isEmpty()) {
                 LOG.error("NextHop for interface {} is null / empty. Failed advertising extra route for prefix {}",
                         intfName, destination);
@@ -1600,14 +1539,14 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         List<String> nextHopIpList = Arrays.asList(nextHop);
         if (rd != null) {
             /* Label mapper is required only for BGP VPN and not for Internal VPN */
-            addToLabelMapper((long) label, dpnId, destination, nextHopIpList, VpnUtil.getVpnId(broker, routerID),
+            addToLabelMapper((long) label, dpnId, destination, nextHopIpList, VpnUtil.getVpnId(dataBroker, routerID),
                     intfName, null, false, rd, null);
         }
 
         // TODO (eperefr): This is a limitation to be stated in docs. When configuring static route to go to
         // another VPN, there can only be one nexthop or, at least, the nexthop to the interVpnLink should be in
         // first place.
-        InterVpnLink interVpnLink = VpnUtil.getInterVpnLinkByEndpointIp(broker, nextHop);
+        InterVpnLink interVpnLink = VpnUtil.getInterVpnLinkByEndpointIp(dataBroker, nextHop);
         if ( interVpnLink != null ) {
             // If the nexthop is the endpoint of Vpn2, then prefix must be advertised to Vpn1 in DC-GW, with nexthops
             // pointing to the DPNs where Vpn1 is instantiated. LFIB in these DPNS must have a flow entry, with lower
@@ -1618,16 +1557,16 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                     : interVpnLink.getFirstEndpoint().getVpnUuid().getValue();
             String dstVpnUuid = (nexthopIsVpn2) ? interVpnLink.getFirstEndpoint().getVpnUuid().getValue()
                     : interVpnLink.getSecondEndpoint().getVpnUuid().getValue();
-            String dstVpnRd = VpnUtil.getVpnRd(broker, dstVpnUuid);
+            String dstVpnRd = VpnUtil.getVpnRd(dataBroker, dstVpnUuid);
             long newLabel = VpnUtil.getUniqueId(idManager, VpnConstants.VPN_IDPOOL_NAME,
                     VpnUtil.getNextHopLabelKey(dstVpnRd, destination));
-            VpnUtil.leakRoute(broker, bgpManager, interVpnLink, srcVpnUuid, dstVpnUuid, destination, newLabel);
+            VpnUtil.leakRoute(dataBroker, bgpManager, interVpnLink, srcVpnUuid, dstVpnUuid, destination, newLabel);
         } else {
             if (rd != null) {
                 addPrefixToBGP(rd, destination, nextHop, label, null);
             } else {
                 // ### add FIB route directly
-                fibManager.addOrUpdateFibEntry(broker, routerID, destination, Arrays.asList(nextHop), label, RouteOrigin.STATIC, null);
+                fibManager.addOrUpdateFibEntry(dataBroker, routerID, destination, Arrays.asList(nextHop), label, RouteOrigin.STATIC, null);
             }
         }
     }
@@ -1635,7 +1574,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
     protected void delExtraRoute(String destination, String nextHop, String rd, String routerID, String intfName) {
         if (intfName != null && !intfName.isEmpty()) {
             BigInteger dpnId = InterfaceUtils.getDpnForInterface(ifaceMgrRpcService, intfName);
-            String nextHopIp = InterfaceUtils.getEndpointIpAddressForDPN(broker, dpnId);
+            String nextHopIp = InterfaceUtils.getEndpointIpAddressForDPN(dataBroker, dpnId);
             if (nextHopIp == null || nextHopIp.isEmpty()) {
                 LOG.warn("NextHop for interface {} is null / empty. Failed advertising extra route for prefix {}",
                         intfName, destination);
@@ -1647,184 +1586,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
             removePrefixFromBGP(rd, destination, nextHop, null);
         } else {
             // ### add FIB route directly
-            fibManager.removeOrUpdateFibEntry(broker, routerID, destination, nextHop, null);
-        }
-    }
-
-    class VpnInterfaceOpListener extends org.opendaylight.genius.mdsalutil.AbstractDataChangeListener<VpnInterface> {
-
-        public VpnInterfaceOpListener() {
-            super(VpnInterface.class);
-        }
-
-        @Override
-        protected void remove(final InstanceIdentifier<VpnInterface> identifier, final VpnInterface del) {
-            final VpnInterfaceKey key = identifier.firstKeyOf(VpnInterface.class, VpnInterfaceKey.class);
-            final String interfaceName = key.getName();
-            final String vpnName = del.getVpnInstanceName();
-            DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
-            dataStoreCoordinator.enqueueJob("VPNINTERFACE-" + interfaceName,
-                    new Callable<List<ListenableFuture<Void>>>() {
-                        @Override
-                        public List<ListenableFuture<Void>> call() throws Exception {
-                            WriteTransaction writeOperTxn = broker.newWriteOnlyTransaction();
-                            postProcessVpnInterfaceRemoval(identifier, del, writeOperTxn);
-                            CheckedFuture<Void, TransactionCommitFailedException> futures = writeOperTxn.submit();
-                            try {
-                                futures.get();
-                            } catch (InterruptedException | ExecutionException e) {
-                                LOG.error("Error handling removal of oper data for interface {} from vpn {}", interfaceName,
-                                        vpnName);
-                                throw new RuntimeException(e.getMessage());
-                            }
-                            return null;
-                        }
-                    });
-        }
-
-        private void postProcessVpnInterfaceRemoval(InstanceIdentifier<VpnInterface> identifier, VpnInterface del,
-                                                    WriteTransaction writeOperTxn) {
-            final VpnInterfaceKey key = identifier.firstKeyOf(VpnInterface.class, VpnInterfaceKey.class);
-            String interfaceName = key.getName();
-            String vpnName = del.getVpnInstanceName();
-
-            LOG.trace("VpnInterfaceOpListener removed: interface name {} vpnName {}", interfaceName, vpnName);
-            //decrement the vpn interface count in Vpn Instance Op Data
-            InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to
-                    .vpn.id.VpnInstance>
-                    id = VpnUtil.getVpnInstanceToVpnIdIdentifier(vpnName);
-            Optional<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id
-                    .VpnInstance> vpnInstance
-                    = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, id);
-
-            if (vpnInstance.isPresent()) {
-                String rd = null;
-                rd = vpnInstance.get().getVrfId();
-                //String rd = getRouteDistinguisher(del.getVpnInstanceName());
-
-                VpnInstanceOpDataEntry vpnInstOp = VpnUtil.getVpnInstanceOpData(broker, rd);
-                LOG.trace("VpnInterfaceOpListener removed: interface name {} rd {} vpnName {} in Vpn Op Instance {}",
-                        interfaceName, rd, vpnName, vpnInstOp);
-
-                if (vpnInstOp != null) {
-                    // Vpn Interface removed => No more adjacencies from it.
-                    // Hence clean up interface from vpn-dpn-interface list.
-                    Adjacency adjacency = del.getAugmentation(Adjacencies.class).getAdjacency().get(0);
-                    List<Prefixes> prefixToInterface = new ArrayList<>();
-                    Optional<Prefixes> prefix = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
-                            VpnUtil.getPrefixToInterfaceIdentifier(vpnInstOp.getVpnId(),
-                                    VpnUtil.getIpPrefix(adjacency.getIpAddress())));
-                    if (prefix.isPresent()) {
-                        prefixToInterface.add(prefix.get());
-                    }
-                    if (prefixToInterface.isEmpty()) {
-                        for (String nh : adjacency.getNextHopIpList()) {
-                            prefix = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
-                                    VpnUtil.getPrefixToInterfaceIdentifier(vpnInstOp.getVpnId(),
-                                            VpnUtil.getIpPrefix(nh)));
-                            if (prefix.isPresent())
-                                prefixToInterface.add(prefix.get());
-                        }
-                    }
-                    for (Prefixes pref : prefixToInterface) {
-                        if (writeOperTxn != null) {
-                            writeOperTxn.delete(LogicalDatastoreType.OPERATIONAL,
-                                    VpnUtil.getPrefixToInterfaceIdentifier(vpnInstOp.getVpnId(), pref.getIpAddress()));
-                        } else {
-                            VpnUtil.delete(broker, LogicalDatastoreType.OPERATIONAL,
-                                    VpnUtil.getPrefixToInterfaceIdentifier(vpnInstOp.getVpnId(), pref.getIpAddress()),
-                                    VpnUtil.DEFAULT_CALLBACK);
-                        }
-                        updateVpnToDpnMapping(pref.getDpnId(), del.getVpnInstanceName(), interfaceName, false /* delete */);
-                    }
-                }
-            } else {
-                LOG.error("rd not retrievable as vpninstancetovpnid for vpn {} is absent, trying rd as ", vpnName, vpnName);
-            }
-            notifyTaskIfRequired(interfaceName);
-        }
-
-        private void notifyTaskIfRequired(String intfName) {
-            Runnable notifyTask = vpnIntfMap.remove(intfName);
-            if (notifyTask == null) {
-                LOG.trace("VpnInterfaceOpListener update: No Notify Task queued for vpnInterface {}", intfName);
-                return;
-            }
-            executorService.execute(notifyTask);
-        }
-
-        @Override
-        protected void update(final InstanceIdentifier<VpnInterface> identifier, final VpnInterface original,
-                              final VpnInterface update) {
-            final VpnInterfaceKey key = identifier.firstKeyOf(VpnInterface.class, VpnInterfaceKey.class);
-            final String interfaceName = key.getName();
-
-            if (original.getVpnInstanceName().equals(update.getVpnInstanceName())) {
-                return;
-            }
-
-            final String vpnName = update.getVpnInstanceName();
-            DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
-            dataStoreCoordinator.enqueueJob("VPNINTERFACE-" + interfaceName,
-                    new Callable<List<ListenableFuture<Void>>>() {
-                        @Override
-                        public List<ListenableFuture<Void>> call() throws Exception {
-                            postProcessVpnInterfaceUpdate(identifier, original, update);
-                            return null;
-                        }
-                    });
-        }
-
-        private void postProcessVpnInterfaceUpdate(InstanceIdentifier<VpnInterface> identifier, VpnInterface original,
-                                                   VpnInterface update) {
-            final VpnInterfaceKey key = identifier.firstKeyOf(VpnInterface.class, VpnInterfaceKey.class);
-            String interfaceName = key.getName();
-
-            //increment the vpn interface count in Vpn Instance Op Data
-            VpnInstanceOpDataEntry vpnInstOp = null;
-            InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to
-                    .vpn.id.VpnInstance>
-                    origId = VpnUtil.getVpnInstanceToVpnIdIdentifier(original.getVpnInstanceName());
-            Optional<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id
-                    .VpnInstance> origVpnInstance
-                    = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, origId);
-
-            if (origVpnInstance.isPresent()) {
-                String rd = null;
-                rd = origVpnInstance.get().getVrfId();
-
-                vpnInstOp = VpnUtil.getVpnInstanceOpData(broker, rd);
-                LOG.trace("VpnInterfaceOpListener updated: interface name {} original rd {} original vpnName {}",
-                        interfaceName, rd, original.getVpnInstanceName());
-
-                if (vpnInstOp != null) {
-                    Adjacency adjacency = original.getAugmentation(Adjacencies.class).getAdjacency().get(0);
-                    List<Prefixes> prefixToInterfaceList = new ArrayList<>();
-                    Optional<Prefixes> prefixToInterface = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
-                            VpnUtil.getPrefixToInterfaceIdentifier(vpnInstOp.getVpnId(),
-                                    VpnUtil.getIpPrefix(adjacency.getIpAddress())));
-                    if (prefixToInterface.isPresent()) {
-                        prefixToInterfaceList.add(prefixToInterface.get());
-                    } else {
-                        for (String adj : adjacency.getNextHopIpList()) {
-                            prefixToInterface = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
-                                    VpnUtil.getPrefixToInterfaceIdentifier(vpnInstOp.getVpnId(),
-                                            VpnUtil.getIpPrefix(adj)));
-                            if (prefixToInterface.isPresent()) {
-                                prefixToInterfaceList.add(prefixToInterface.get());
-                            }
-                        }
-                    }
-                    for (Prefixes prefix : prefixToInterfaceList) {
-                        updateVpnToDpnMapping(prefix.getDpnId(), original.getVpnInstanceName(), interfaceName, false /* delete */);
-                    }
-                }
-            }
-            notifyTaskIfRequired(interfaceName);
-        }
-
-        @Override
-        protected void add(InstanceIdentifier<VpnInterface> identifier, VpnInterface add) {
+            fibManager.removeOrUpdateFibEntry(dataBroker, routerID, destination, nextHop, null);
         }
     }
 
@@ -1883,7 +1645,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         }
         InstanceIdentifier<DpnVpninterfacesList> routerDpnListIdentifier = getRouterDpnId(routerName, dpId);
 
-        Optional<DpnVpninterfacesList> optionalRouterDpnList = VpnUtil.read(broker, LogicalDatastoreType
+        Optional<DpnVpninterfacesList> optionalRouterDpnList = VpnUtil.read(dataBroker, LogicalDatastoreType
                 .OPERATIONAL, routerDpnListIdentifier);
         RouterInterfaces routerInterface = new RouterInterfacesBuilder().setKey(new RouterInterfacesKey(vpnInterfaceName)).setInterface(vpnInterfaceName).build();
         if (optionalRouterDpnList.isPresent()) {
@@ -1909,7 +1671,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
             return;
         }
         InstanceIdentifier<DpnVpninterfacesList> routerDpnListIdentifier = getRouterDpnId(routerName, dpId);
-        Optional<DpnVpninterfacesList> optionalRouterDpnList = VpnUtil.read(broker, LogicalDatastoreType
+        Optional<DpnVpninterfacesList> optionalRouterDpnList = VpnUtil.read(dataBroker, LogicalDatastoreType
                 .OPERATIONAL, routerDpnListIdentifier);
         if (optionalRouterDpnList.isPresent()) {
             List<RouterInterfaces> routerInterfaces = optionalRouterDpnList.get().getRouterInterfaces();
@@ -1920,7 +1682,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                     if (writeOperTxn != null) {
                         writeOperTxn.delete(LogicalDatastoreType.OPERATIONAL, routerDpnListIdentifier);
                     } else {
-                        MDSALUtil.syncDelete(broker, LogicalDatastoreType.OPERATIONAL, routerDpnListIdentifier);
+                        MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, routerDpnListIdentifier);
                     }
                 } else {
                     if (writeOperTxn != null) {
@@ -1928,7 +1690,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                                 RouterInterfaces.class,
                                 new RouterInterfacesKey(vpnInterfaceName)));
                     } else {
-                        MDSALUtil.syncDelete(broker, LogicalDatastoreType.OPERATIONAL, routerDpnListIdentifier.child(
+                        MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, routerDpnListIdentifier.child(
                                 RouterInterfaces.class,
                                 new RouterInterfacesKey(vpnInterfaceName)));
                     }
@@ -1944,7 +1706,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
             return;
         }
         InstanceIdentifier<DpnVpninterfacesList> routerDpnListIdentifier = getRouterDpnId(routerName, dpId);
-        Optional<DpnVpninterfacesList> optionalRouterDpnList = VpnUtil.read(broker, LogicalDatastoreType
+        Optional<DpnVpninterfacesList> optionalRouterDpnList = VpnUtil.read(dataBroker, LogicalDatastoreType
                 .OPERATIONAL, routerDpnListIdentifier);
         if (optionalRouterDpnList.isPresent()) {
             List<RouterInterfaces> routerInterfaces = optionalRouterDpnList.get().getRouterInterfaces();
@@ -1967,7 +1729,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         LOG.trace("Adding {} adjacency to VPN Interface {} ",prefix,vpnInterface);
         InstanceIdentifier<VpnInterface> vpnIfId = VpnUtil.getVpnInterfaceIdentifier(vpnInterface);
         InstanceIdentifier<Adjacencies> path = vpnIfId.augmentation(Adjacencies.class);
-        Optional<Adjacencies> adjacencies = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, path);
+        Optional<Adjacencies> adjacencies = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, path);
         String nextHopIpAddr = null;
         String nextHopMacAddress = null;
         String ip = prefix.getIpv4Address().getValue();
@@ -1982,7 +1744,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                 }
             }
             if (nextHopMacAddress != null && ip != null) {
-                String rd = VpnUtil.getVpnRd(broker, vpnName);
+                String rd = VpnUtil.getVpnRd(dataBroker, vpnName);
                 long label =
                         VpnUtil.getUniqueId(idManager, VpnConstants.VPN_IDPOOL_NAME,
                                 VpnUtil.getNextHopLabelKey((rd != null) ? rd : vpnName, ip));
@@ -1993,7 +1755,7 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
                 Adjacencies aug = VpnUtil.getVpnInterfaceAugmentation(adjacencyList);
                 VpnInterface newVpnIntf = new VpnInterfaceBuilder().setKey(new VpnInterfaceKey(vpnInterface)).
                         setName(vpnInterface).setVpnInstanceName(vpnName).addAugmentation(Adjacencies.class, aug).build();
-                VpnUtil.syncUpdate(broker, LogicalDatastoreType.CONFIGURATION, vpnIfId, newVpnIntf);
+                VpnUtil.syncUpdate(dataBroker, LogicalDatastoreType.CONFIGURATION, vpnIfId, newVpnIntf);
                 LOG.debug(" Successfully stored subnetroute Adjacency into VpnInterface {}", vpnInterface);
             }
         }
@@ -2006,13 +1768,21 @@ public class VpnInterfaceManager extends AbstractDataChangeListener<VpnInterface
         LOG.trace("Removing {} adjacency from Old VPN Interface {} ",ip,vpnInterface);
         InstanceIdentifier<VpnInterface> vpnIfId = VpnUtil.getVpnInterfaceIdentifier(vpnInterface);
         InstanceIdentifier<Adjacencies> path = vpnIfId.augmentation(Adjacencies.class);
-        Optional<Adjacencies> adjacencies = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL, path);
+        Optional<Adjacencies> adjacencies = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL, path);
         if (adjacencies.isPresent()) {
             InstanceIdentifier<Adjacency> adjacencyIdentifier = InstanceIdentifier.builder(VpnInterfaces.class).
                     child(VpnInterface.class, new VpnInterfaceKey(vpnInterface)).augmentation(Adjacencies.class)
                     .child(Adjacency.class, new AdjacencyKey(ip)).build();
-            MDSALUtil.syncDelete(broker, LogicalDatastoreType.CONFIGURATION, adjacencyIdentifier);
+            MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, adjacencyIdentifier);
             LOG.trace("Successfully Deleted Adjacency into VpnInterface {}", vpnInterface);
         }
     }
+
+    void notifyTaskIfRequired(String intfName) {
+        Runnable notifyTask = vpnIntfMap.remove(intfName);
+        if (notifyTask == null) {
+            return;
+        }
+        executorService.execute(notifyTask);
+    }
 }
diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceOpListener.java b/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceOpListener.java
new file mode 100644 (file)
index 0000000..5f3a97c
--- /dev/null
@@ -0,0 +1,249 @@
+/*
+ * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.netvirt.vpnmanager;
+
+import com.google.common.base.Optional;
+import com.google.common.util.concurrent.CheckedFuture;
+import com.google.common.util.concurrent.ListenableFuture;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.genius.datastoreutils.DataStoreJobCoordinator;
+import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
+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.interfaces.VpnInterface;
+import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.interfaces.VpnInterfaceKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.Adjacencies;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.adjacency.list.Adjacency;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.prefix.to._interface.vpn.ids.Prefixes;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.op.data.VpnInstanceOpDataEntry;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id.VpnInstance;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class VpnInterfaceOpListener extends AbstractDataChangeListener<VpnInterface> implements AutoCloseable {
+    private static final Logger LOG = LoggerFactory.getLogger(VpnInterfaceOpListener.class);
+    private ListenerRegistration<DataChangeListener> listenerRegistration;
+    private final DataBroker dataBroker;
+    private final VpnInterfaceManager vpnInterfaceManager;
+    private ConcurrentHashMap<String, Runnable> vpnIntfMap = new ConcurrentHashMap<String, Runnable>();
+    private ExecutorService executorService = Executors.newSingleThreadExecutor();
+
+    /*public VpnInterfaceOpListener(final DataBroker dataBroker) {
+        super(VpnInterface.class);
+        this.dataBroker = dataBroker;
+    }*/
+
+    public VpnInterfaceOpListener(final DataBroker dataBroker, final VpnInterfaceManager vpnInterfaceManager) {
+        super(VpnInterface.class);
+        this.dataBroker = dataBroker;
+        this.vpnInterfaceManager = vpnInterfaceManager;
+    }
+
+    public void start() {
+        LOG.info("{} start", getClass().getSimpleName());
+        listenerRegistration = dataBroker.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
+                getWildCardPath(), this, AsyncDataBroker.DataChangeScope.SUBTREE);
+    }
+
+    private InstanceIdentifier<VpnInterface> getWildCardPath() {
+        return InstanceIdentifier.create(VpnInterfaces.class).child(VpnInterface.class);
+    }
+
+    @Override
+    public void close() throws Exception {
+        if (listenerRegistration != null) {
+            listenerRegistration.close();
+            listenerRegistration = null;
+        }
+        LOG.info("{} close", getClass().getSimpleName());
+    }
+
+    @Override
+    protected void remove(final InstanceIdentifier<VpnInterface> identifier, final VpnInterface del) {
+        final VpnInterfaceKey key = identifier.firstKeyOf(VpnInterface.class, VpnInterfaceKey.class);
+        final String interfaceName = key.getName();
+        final String vpnName = del.getVpnInstanceName();
+        DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
+        dataStoreCoordinator.enqueueJob("VPNINTERFACE-" + interfaceName,
+                new Callable<List<ListenableFuture<Void>>>() {
+                    @Override
+                    public List<ListenableFuture<Void>> call() throws Exception {
+                        WriteTransaction writeOperTxn = dataBroker.newWriteOnlyTransaction();
+                        postProcessVpnInterfaceRemoval(identifier, del, writeOperTxn);
+                        CheckedFuture<Void, TransactionCommitFailedException> futures = writeOperTxn.submit();
+                        try {
+                            futures.get();
+                        } catch (InterruptedException | ExecutionException e) {
+                            LOG.error("Error handling removal of oper data for interface {} from vpn {}", interfaceName,
+                                    vpnName);
+                            throw new RuntimeException(e.getMessage());
+                        }
+                        return null;
+                    }
+                });
+    }
+
+    private void postProcessVpnInterfaceRemoval(InstanceIdentifier<VpnInterface> identifier, VpnInterface del,
+                                                WriteTransaction writeOperTxn) {
+        final VpnInterfaceKey key = identifier.firstKeyOf(VpnInterface.class, VpnInterfaceKey.class);
+        String interfaceName = key.getName();
+        String vpnName = del.getVpnInstanceName();
+
+        LOG.trace("VpnInterfaceOpListener removed: interface name {} vpnName {}", interfaceName, vpnName);
+        //decrement the vpn interface count in Vpn Instance Op Data
+        InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to
+                .vpn.id.VpnInstance>
+                id = VpnUtil.getVpnInstanceToVpnIdIdentifier(vpnName);
+        Optional<VpnInstance> vpnInstance
+                = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, id);
+
+        if (vpnInstance.isPresent()) {
+            String rd = null;
+            rd = vpnInstance.get().getVrfId();
+            //String rd = getRouteDistinguisher(del.getVpnInstanceName());
+
+            VpnInstanceOpDataEntry vpnInstOp = VpnUtil.getVpnInstanceOpData(dataBroker, rd);
+            LOG.trace("VpnInterfaceOpListener removed: interface name {} rd {} vpnName {} in Vpn Op Instance {}",
+                    interfaceName, rd, vpnName, vpnInstOp);
+
+            if (vpnInstOp != null) {
+                // Vpn Interface removed => No more adjacencies from it.
+                // Hence clean up interface from vpn-dpn-interface list.
+                Adjacency adjacency = del.getAugmentation(Adjacencies.class).getAdjacency().get(0);
+                List<Prefixes> prefixToInterface = new ArrayList<>();
+                Optional<Prefixes> prefix = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                        VpnUtil.getPrefixToInterfaceIdentifier(vpnInstOp.getVpnId(),
+                                VpnUtil.getIpPrefix(adjacency.getIpAddress())));
+                if (prefix.isPresent()) {
+                    prefixToInterface.add(prefix.get());
+                }
+                if (prefixToInterface.isEmpty()) {
+                    for (String nh : adjacency.getNextHopIpList()) {
+                        prefix = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                                VpnUtil.getPrefixToInterfaceIdentifier(vpnInstOp.getVpnId(),
+                                        VpnUtil.getIpPrefix(nh)));
+                        if (prefix.isPresent())
+                            prefixToInterface.add(prefix.get());
+                    }
+                }
+                for (Prefixes pref : prefixToInterface) {
+                    if (writeOperTxn != null) {
+                        writeOperTxn.delete(LogicalDatastoreType.OPERATIONAL,
+                                VpnUtil.getPrefixToInterfaceIdentifier(vpnInstOp.getVpnId(), pref.getIpAddress()));
+                    } else {
+                        VpnUtil.delete(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                                VpnUtil.getPrefixToInterfaceIdentifier(vpnInstOp.getVpnId(), pref.getIpAddress()),
+                                VpnUtil.DEFAULT_CALLBACK);
+                    }
+                    vpnInterfaceManager.updateVpnToDpnMapping(pref.getDpnId(), del.getVpnInstanceName(),
+                            interfaceName, false /* delete */);
+                }
+            }
+        } else {
+            LOG.error("rd not retrievable as vpninstancetovpnid for vpn {} is absent, trying rd as ", vpnName, vpnName);
+        }
+        notifyTaskIfRequired(interfaceName);
+    }
+
+    private void notifyTaskIfRequired(String intfName) {
+        Runnable notifyTask = vpnIntfMap.remove(intfName);
+        if (notifyTask == null) {
+            LOG.trace("VpnInterfaceOpListener update: No Notify Task queued for vpnInterface {}", intfName);
+            return;
+        }
+        executorService.execute(notifyTask);
+    }
+
+    @Override
+    protected void update(final InstanceIdentifier<VpnInterface> identifier, final VpnInterface original,
+                          final VpnInterface update) {
+        final VpnInterfaceKey key = identifier.firstKeyOf(VpnInterface.class, VpnInterfaceKey.class);
+        final String interfaceName = key.getName();
+
+        if (original.getVpnInstanceName().equals(update.getVpnInstanceName())) {
+            return;
+        }
+
+        final String vpnName = update.getVpnInstanceName();
+        DataStoreJobCoordinator dataStoreCoordinator = DataStoreJobCoordinator.getInstance();
+        dataStoreCoordinator.enqueueJob("VPNINTERFACE-" + interfaceName,
+                new Callable<List<ListenableFuture<Void>>>() {
+                    @Override
+                    public List<ListenableFuture<Void>> call() throws Exception {
+                        postProcessVpnInterfaceUpdate(identifier, original, update);
+                        return null;
+                    }
+                });
+    }
+
+    private void postProcessVpnInterfaceUpdate(InstanceIdentifier<VpnInterface> identifier, VpnInterface original,
+                                               VpnInterface update) {
+        final VpnInterfaceKey key = identifier.firstKeyOf(VpnInterface.class, VpnInterfaceKey.class);
+        String interfaceName = key.getName();
+
+        //increment the vpn interface count in Vpn Instance Op Data
+        VpnInstanceOpDataEntry vpnInstOp = null;
+        InstanceIdentifier<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to
+                .vpn.id.VpnInstance>
+                origId = VpnUtil.getVpnInstanceToVpnIdIdentifier(original.getVpnInstanceName());
+        Optional<org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.vpn.instance.to.vpn.id
+                .VpnInstance> origVpnInstance
+                = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, origId);
+
+        if (origVpnInstance.isPresent()) {
+            String rd = null;
+            rd = origVpnInstance.get().getVrfId();
+
+            vpnInstOp = VpnUtil.getVpnInstanceOpData(dataBroker, rd);
+            LOG.trace("VpnInterfaceOpListener updated: interface name {} original rd {} original vpnName {}",
+                    interfaceName, rd, original.getVpnInstanceName());
+
+            if (vpnInstOp != null) {
+                Adjacency adjacency = original.getAugmentation(Adjacencies.class).getAdjacency().get(0);
+                List<Prefixes> prefixToInterfaceList = new ArrayList<>();
+                Optional<Prefixes> prefixToInterface = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                        VpnUtil.getPrefixToInterfaceIdentifier(vpnInstOp.getVpnId(),
+                                VpnUtil.getIpPrefix(adjacency.getIpAddress())));
+                if (prefixToInterface.isPresent()) {
+                    prefixToInterfaceList.add(prefixToInterface.get());
+                } else {
+                    for (String adj : adjacency.getNextHopIpList()) {
+                        prefixToInterface = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
+                                VpnUtil.getPrefixToInterfaceIdentifier(vpnInstOp.getVpnId(),
+                                        VpnUtil.getIpPrefix(adj)));
+                        if (prefixToInterface.isPresent()) {
+                            prefixToInterfaceList.add(prefixToInterface.get());
+                        }
+                    }
+                }
+                for (Prefixes prefix : prefixToInterfaceList) {
+                    vpnInterfaceManager.updateVpnToDpnMapping(prefix.getDpnId(), original.getVpnInstanceName(),
+                            interfaceName, false /* delete */);
+                }
+            }
+        }
+        notifyTaskIfRequired(interfaceName);
+    }
+
+    @Override
+    protected void add(InstanceIdentifier<VpnInterface> identifier, VpnInterface add) {
+    }
+}
diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnManagerImpl.java b/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnManagerImpl.java
new file mode 100644 (file)
index 0000000..b3220e3
--- /dev/null
@@ -0,0 +1,87 @@
+/*
+ * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.netvirt.vpnmanager;
+
+import java.math.BigInteger;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.netvirt.fibmanager.api.IFibManager;
+import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
+import org.opendaylight.yangtools.yang.common.RpcResult;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class VpnManagerImpl implements IVpnManager {
+    private static final Logger LOG = LoggerFactory.getLogger(VpnManagerImpl.class);
+    private final DataBroker dataBroker;
+    private final VpnInterfaceManager vpnInterfaceManager;
+    private final VpnInstanceListener vpnInstanceListener;
+    private final IdManagerService idManager;
+
+    public VpnManagerImpl(final DataBroker dataBroker,
+                          final IdManagerService idManagerService,
+                          final VpnInstanceListener vpnInstanceListener,
+                          final VpnInterfaceManager vpnInterfaceManager) {
+        this.dataBroker = dataBroker;
+        this.vpnInterfaceManager = vpnInterfaceManager;
+        this.vpnInstanceListener = vpnInstanceListener;
+        this.idManager = idManagerService;
+    }
+
+    public void start() {
+        LOG.info("{} start", getClass().getSimpleName());
+        createIdPool();
+    }
+
+    private void createIdPool() {
+        CreateIdPoolInput createPool = new CreateIdPoolInputBuilder()
+                .setPoolName(VpnConstants.VPN_IDPOOL_NAME)
+                .setLow(VpnConstants.VPN_IDPOOL_START)
+                .setHigh(new BigInteger(VpnConstants.VPN_IDPOOL_SIZE).longValue())
+                .build();
+        try {
+            Future<RpcResult<Void>> 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 setFibManager(IFibManager fibManager) {
+
+    }
+
+    @Override
+    public void addExtraRoute(String destination, String nextHop, String rd, String routerID, int label) {
+        LOG.info("Adding extra route with destination {}, nextHop {} and label{}", destination, nextHop, label);
+        vpnInterfaceManager.addExtraRoute(destination, nextHop, rd, routerID, label, /*intfName*/ null);
+    }
+
+    @Override
+    public void delExtraRoute(String destination, String nextHop, String rd, String routerID) {
+        LOG.info("Deleting extra route with destination {} and nextHop {}", destination, nextHop);
+        vpnInterfaceManager.delExtraRoute(destination, nextHop, rd, routerID, null);
+    }
+
+    @Override
+    public boolean isVPNConfigured() {
+        return vpnInstanceListener.isVPNConfigured();
+    }
+
+    @Override
+    public boolean existsVpn(String vpnName) {
+        return VpnUtil.getVpnInstance(dataBroker, vpnName) != null;
+    }
+}
index 980352a7b0ee4d05773cb032524affea7e726c3d..2a17909dd73f7aee732aace3ef5ef4add2697626 100644 (file)
@@ -27,17 +27,17 @@ import java.util.Collection;
 import java.util.concurrent.Future;
 
 public class VpnRpcServiceImpl implements VpnRpcService {
-
     private static final Logger LOG = LoggerFactory.getLogger(VpnRpcServiceImpl.class);
-    private IdManagerService idManager;
-    private VpnInterfaceManager vpnInterfaceMgr;
-    private DataBroker dataBroker;
-    private IFibManager fibManager;
+    private final DataBroker dataBroker;
+    private final IdManagerService idManager;
+    private final VpnInterfaceManager vpnInterfaceMgr;
+    private final IFibManager fibManager;
 
-    public VpnRpcServiceImpl(IdManagerService idManager, VpnInterfaceManager vpnIfaceMgr, DataBroker dataBroker) {
+    public VpnRpcServiceImpl(final DataBroker dataBroker, final IdManagerService idManager,
+                             final VpnInterfaceManager vpnIfaceMgr, final IFibManager fibManager) {
+        this.dataBroker = dataBroker;
         this.idManager = idManager;
         this.vpnInterfaceMgr = vpnIfaceMgr;
-        this.dataBroker = dataBroker;
         this.fibManager = fibManager;
     }
 
index 796057cd56cb130e8464eb8c3035090e09d9b9a9..e4b1a64440da9c08240651d047161e2a19e5b736 100644 (file)
@@ -7,60 +7,67 @@
  */
 package org.opendaylight.netvirt.vpnmanager;
 
-import java.util.*;
-
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
-
-import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.mdsalutil.MDSALUtil;
+import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
 import org.opendaylight.netvirt.vpnmanager.utilities.InterfaceUtils;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
 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.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.*;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.PortOpData;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.SubnetOpData;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.TaskState;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.port.op.data.PortOpDataEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.port.op.data.PortOpDataEntryKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.subnet.op.data.SubnetOpDataEntry;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.subnet.op.data.SubnetOpDataEntryKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.subnet.op.data.SubnetOpDataEntryBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.*;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.Subnetmap;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.SubnetmapKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.subnet.op.data.SubnetOpDataEntryKey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.subnet.op.data.subnet.op.data.entry.SubnetToDpn;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.subnet.op.data.subnet.op.data.entry.subnet.to.dpn.VpnInterfaces;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.state.Interface;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ExternalNetworks;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.networks.Networks;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.external.networks.NetworksKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.natservice.rev160111.ExternalNetworks;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.NeutronvpnListener;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.PortAddedToSubnet;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.PortRemovedFromSubnet;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.RouterAssociatedToVpn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.RouterDisassociatedFromVpn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.SubnetAddedToVpn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.SubnetAddedToVpnBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.SubnetDeletedFromVpn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.SubnetDeletedFromVpnBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.SubnetUpdatedInVpn;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.Subnetmaps;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.Subnetmap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.subnetmaps.SubnetmapKey;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-
-import java.math.BigInteger;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Optional;
-
-
 public class VpnSubnetRouteHandler implements NeutronvpnListener {
     private static final Logger logger = LoggerFactory.getLogger(VpnSubnetRouteHandler.class);
-
-    private final DataBroker broker;
-    private SubnetOpDpnManager subOpDpnManager;
+    private final DataBroker dataBroker;
+    private final SubnetOpDpnManager subOpDpnManager;
     private final IBgpManager bgpManager;
-    private IdManagerService idManager;
-    private VpnInterfaceManager vpnInterfaceManager;
-
-    public VpnSubnetRouteHandler(final DataBroker db, IBgpManager bgpManager, VpnInterfaceManager vpnIntfManager) {
-        broker = db;
-        subOpDpnManager = new SubnetOpDpnManager(broker);
+    private final VpnInterfaceManager vpnInterfaceManager;
+    private final IdManagerService idManager;
+
+    public VpnSubnetRouteHandler(final DataBroker dataBroker, final SubnetOpDpnManager subnetOpDpnManager,
+                                 final IBgpManager bgpManager, final VpnInterfaceManager vpnIntfManager,
+                                 final IdManagerService idManager) {
+        this.dataBroker = dataBroker;
+        this.subOpDpnManager = subnetOpDpnManager;
         this.bgpManager = bgpManager;
         this.vpnInterfaceManager = vpnIntfManager;
-    }
-
-    public void setIdManager(IdManagerService idManager) {
         this.idManager = idManager;
     }
 
@@ -89,7 +96,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                 // Please check if subnetId belongs to an External Network
                 InstanceIdentifier<Subnetmap> subMapid = InstanceIdentifier.builder(Subnetmaps.class).
                         child(Subnetmap.class, new SubnetmapKey(subnetId)).build();
-                Optional<Subnetmap> sm = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, subMapid);
+                Optional<Subnetmap> sm = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, subMapid);
                 if (!sm.isPresent()) {
                     logger.error("onSubnetAddedToVpn: Unable to retrieve subnetmap entry for subnet : " + subnetId);
                     return;
@@ -97,7 +104,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                 subMap = sm.get();
                 InstanceIdentifier<Networks> netsIdentifier = InstanceIdentifier.builder(ExternalNetworks.class).
                         child(Networks.class, new NetworksKey(subMap.getNetworkId())).build();
-                Optional<Networks> optionalNets = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, netsIdentifier);
+                Optional<Networks> optionalNets = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, netsIdentifier);
                 if (optionalNets.isPresent()) {
                     logger.info("onSubnetAddedToVpn: subnet {} is an external subnet on external network {}, so ignoring this for SubnetRoute",
                             subnetId.getValue(), subMap.getNetworkId().getValue());
@@ -106,7 +113,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                 //Create and add SubnetOpDataEntry object for this subnet to the SubnetOpData container
                 InstanceIdentifier<SubnetOpDataEntry> subOpIdentifier = InstanceIdentifier.builder(SubnetOpData.class).
                         child(SubnetOpDataEntry.class, new SubnetOpDataEntryKey(subnetId)).build();
-                Optional<SubnetOpDataEntry> optionalSubs = VpnUtil.read(broker,
+                Optional<SubnetOpDataEntry> optionalSubs = VpnUtil.read(dataBroker,
                         LogicalDatastoreType.OPERATIONAL,
                         subOpIdentifier);
                 if (optionalSubs.isPresent()) {
@@ -124,7 +131,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                 SubnetOpDataEntryBuilder subOpBuilder = new SubnetOpDataEntryBuilder().setKey(new SubnetOpDataEntryKey(subnetId));
                 subOpBuilder.setSubnetId(subnetId);
                 subOpBuilder.setSubnetCidr(subnetIp);
-                String rd = VpnUtil.getVpnRdFromVpnInstanceConfig(broker, vpnName);
+                String rd = VpnUtil.getVpnRdFromVpnInstanceConfig(dataBroker, vpnName);
                 if (rd == null) {
                     logger.error("onSubnetAddedToVpn: The VPN Instance name " + notification.getVpnName() + " does not have RD ");
                     return;
@@ -139,7 +146,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                 List<Uuid> portList = subMap.getPortList();
                 if (portList != null) {
                     for (Uuid port: portList) {
-                        Interface intfState = InterfaceUtils.getInterfaceStateFromOperDS(broker,port.getValue());
+                        Interface intfState = InterfaceUtils.getInterfaceStateFromOperDS(dataBroker,port.getValue());
                         if (intfState != null) {
                             dpnId = InterfaceUtils.getDpIdFromInterface(intfState);
                             if (dpnId == null) {
@@ -190,8 +197,9 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                 }
 
                 subOpEntry = subOpBuilder.build();
-                MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier, subOpEntry);
-                logger.info("onSubnetAddedToVpn: Added subnetopdataentry to OP Datastore for subnet " + subnetId.getValue());
+                MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier, subOpEntry);
+                logger.info("onSubnetAddedToVpn: Added subnetopdataentry to OP Datastore for subnet {}",
+                        subnetId.getValue());
             } catch (Exception ex) {
                 logger.error("Creation of SubnetOpDataEntry for subnet " +
                         subnetId.getValue() + " failed {}", ex);
@@ -214,7 +222,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                 InstanceIdentifier<SubnetOpDataEntry> subOpIdentifier = InstanceIdentifier.builder(SubnetOpData.class).
                     child(SubnetOpDataEntry.class, new SubnetOpDataEntryKey(subnetId)).build();
                 logger.trace(" Removing the SubnetOpDataEntry node for subnet: " +  subnetId.getValue());
-                Optional<SubnetOpDataEntry> optionalSubs = VpnUtil.read(broker,
+                Optional<SubnetOpDataEntry> optionalSubs = VpnUtil.read(dataBroker,
                         LogicalDatastoreType.OPERATIONAL,
                         subOpIdentifier);
                 if (!optionalSubs.isPresent()) {
@@ -230,7 +238,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                  */
                 InstanceIdentifier<Subnetmap> subMapid = InstanceIdentifier.builder(Subnetmaps.class).
                         child(Subnetmap.class, new SubnetmapKey(subnetId)).build();
-                Optional<Subnetmap> sm = VpnUtil.read(broker, LogicalDatastoreType.CONFIGURATION, subMapid);
+                Optional<Subnetmap> sm = VpnUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, subMapid);
                 if (!sm.isPresent()) {
                     logger.error("Stale ports removal: Unable to retrieve subnetmap entry for subnet : " + subnetId);
                 } else {
@@ -241,7 +249,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                             InstanceIdentifier<PortOpDataEntry> portOpIdentifier = InstanceIdentifier.builder(PortOpData.class).
                                     child(PortOpDataEntry.class, new PortOpDataEntryKey(port.getValue())).build();
                             logger.trace("Deleting portOpData entry for port " + port.getValue());
-                            MDSALUtil.syncDelete(broker, LogicalDatastoreType.OPERATIONAL, portOpIdentifier);
+                            MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, portOpIdentifier);
                         }
                     }
                 }
@@ -250,7 +258,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                 String rd = subOpBuilder.getVrfId();
                 String subnetIp = subOpBuilder.getSubnetCidr();
                 String vpnName = subOpBuilder.getVpnName();
-                MDSALUtil.syncDelete(broker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier);
+                MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier);
                 logger.info("onSubnetDeletedFromVpn: Removed subnetopdataentry for subnet {} successfully from Datastore", subnetId.getValue());
                 try {
                     //Withdraw the routes for all the interfaces on this subnet
@@ -283,7 +291,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
 
         InstanceIdentifier<SubnetOpDataEntry> subOpIdentifier = InstanceIdentifier.builder(SubnetOpData.class).
                 child(SubnetOpDataEntry.class, new SubnetOpDataEntryKey(subnetId)).build();
-        Optional<SubnetOpDataEntry> optionalSubs = VpnUtil.read(broker,
+        Optional<SubnetOpDataEntry> optionalSubs = VpnUtil.read(dataBroker,
                 LogicalDatastoreType.OPERATIONAL,
                 subOpIdentifier);
         if (optionalSubs.isPresent()) {
@@ -315,14 +323,14 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                 InstanceIdentifier<SubnetOpDataEntry> subOpIdentifier = InstanceIdentifier.builder(SubnetOpData.class).
                     child(SubnetOpDataEntry.class, new SubnetOpDataEntryKey(subnetId)).build();
 
-                Optional<SubnetOpDataEntry> optionalSubs = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
+                Optional<SubnetOpDataEntry> optionalSubs = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
                         subOpIdentifier);
                 if (!optionalSubs.isPresent()) {
                     logger.info("onPortAddedToSubnet: Port " + portId.getValue() + " is part of a subnet " + subnetId.getValue() +
                             " that is not in VPN, ignoring");
                     return;
                 }
-                Interface intfState = InterfaceUtils.getInterfaceStateFromOperDS(broker,portId.getValue());
+                Interface intfState = InterfaceUtils.getInterfaceStateFromOperDS(dataBroker,portId.getValue());
                 if (intfState == null) {
                     // Interface State not yet available
                     subOpDpnManager.addPortOpDataEntry(portId.getValue(), subnetId, null);
@@ -370,7 +378,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                     }
                 }
                 SubnetOpDataEntry subOpEntry = subOpBuilder.build();
-                MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier, subOpEntry);
+                MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier, subOpEntry);
                 logger.info("onPortAddedToSubnet: Updated subnetopdataentry to OP Datastore for port " + portId.getValue());
 
             } catch (Exception ex) {
@@ -403,7 +411,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                 boolean last = subOpDpnManager.removeInterfaceFromDpn(subnetId, dpnId, portId.getValue());
                 InstanceIdentifier<SubnetOpDataEntry> subOpIdentifier = InstanceIdentifier.builder(SubnetOpData.class).
                         child(SubnetOpDataEntry.class, new SubnetOpDataEntryKey(subnetId)).build();
-                Optional<SubnetOpDataEntry> optionalSubs = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
+                Optional<SubnetOpDataEntry> optionalSubs = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
                         subOpIdentifier);
                 if (!optionalSubs.isPresent()) {
                     logger.info("onPortRemovedFromSubnet: Port " + portId.getValue() + " is part of a subnet " + subnetId.getValue() +
@@ -458,7 +466,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                     }
                 }
                 subOpEntry = subOpBuilder.build();
-                MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier, subOpEntry);
+                MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier, subOpEntry);
                 logger.info("onPortRemovedFromSubnet: Updated subnetopdataentry to OP Datastore removing port " + portId.getValue());
             } catch (Exception ex) {
                 logger.error("Creation of SubnetOpDataEntry for subnet " +
@@ -490,7 +498,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
             try {
                 InstanceIdentifier<SubnetOpDataEntry> subOpIdentifier = InstanceIdentifier.builder(SubnetOpData.class).
                     child(SubnetOpDataEntry.class, new SubnetOpDataEntryKey(subnetId)).build();
-                Optional<SubnetOpDataEntry> optionalSubs = VpnUtil.read(broker, LogicalDatastoreType.OPERATIONAL,
+                Optional<SubnetOpDataEntry> optionalSubs = VpnUtil.read(dataBroker, LogicalDatastoreType.OPERATIONAL,
                         subOpIdentifier);
                 if (!optionalSubs.isPresent()) {
                     logger.error("onInterfaceUp: SubnetOpDataEntry for subnet " + subnetId.getValue() +
@@ -530,7 +538,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                     }
                 }
                 SubnetOpDataEntry subOpEntry = subOpBuilder.build();
-                MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier, subOpEntry);
+                MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier, subOpEntry);
                 logger.info("onInterfaceUp: Updated subnetopdataentry to OP Datastore port up " + intfName);
             } catch (Exception ex) {
                 logger.error("Creation of SubnetOpDataEntry for subnet " +
@@ -559,7 +567,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                 boolean last = subOpDpnManager.removeInterfaceFromDpn(subnetId, dpnId, interfaceName);
                 InstanceIdentifier<SubnetOpDataEntry> subOpIdentifier = InstanceIdentifier.builder(SubnetOpData.class).
                         child(SubnetOpDataEntry.class, new SubnetOpDataEntryKey(subnetId)).build();
-                Optional<SubnetOpDataEntry> optionalSubs = VpnUtil.read(broker,
+                Optional<SubnetOpDataEntry> optionalSubs = VpnUtil.read(dataBroker,
                         LogicalDatastoreType.OPERATIONAL,
                         subOpIdentifier);
                 if (!optionalSubs.isPresent()) {
@@ -613,7 +621,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
                     }
                 }
                 subOpEntry = subOpBuilder.build();
-                MDSALUtil.syncWrite(broker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier, subOpEntry);
+                MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.OPERATIONAL, subOpIdentifier, subOpEntry);
                 logger.info("onInterfaceDown: Updated subnetopdataentry to OP Datastore port down " + interfaceName);
             } catch (Exception ex) {
                 logger.error("Creation of SubnetOpDataEntry for subnet " +
@@ -637,7 +645,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
         Preconditions.checkNotNull(subnetIp, "SubnetRouteIp cannot be null or empty!");
         Preconditions.checkNotNull(vpnName, "vpnName cannot be null or empty!");
         Preconditions.checkNotNull(elanTag, "elanTag cannot be null or empty!");
-        String nexthopIp = InterfaceUtils.getEndpointIpAddressForDPN(broker, nhDpnId);
+        String nexthopIp = InterfaceUtils.getEndpointIpAddressForDPN(dataBroker, nhDpnId);
         if(nexthopIp != null)
             vpnInterfaceManager.addSubnetRouteFibEntryToDS(rd, vpnName, subnetIp, nexthopIp, label, elanTag, nhDpnId , null);
         else
@@ -665,7 +673,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
         Preconditions.checkNotNull(nhDpnId, "nhDpnId cannot be null or empty!");
         Preconditions.checkNotNull(vpnName, "vpnName cannot be null or empty!");
         String nexthopIp = null;
-        nexthopIp = InterfaceUtils.getEndpointIpAddressForDPN(broker, nhDpnId);
+        nexthopIp = InterfaceUtils.getEndpointIpAddressForDPN(dataBroker, nhDpnId);
         if (nexthopIp == null) {
             logger.error("createSubnetRouteInVpn: Unable to obtain endpointIp address for DPNId " + nhDpnId);
             throw new Exception("Unable to obtain endpointIp address for DPNId " + nhDpnId);
diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnmanagerServiceAccessor.java b/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnmanagerServiceAccessor.java
deleted file mode 100644 (file)
index 7cf2539..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2016 Hewlett Packard Enterprise, Co. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-
-package org.opendaylight.netvirt.vpnmanager;
-
-import org.opendaylight.netvirt.elanmanager.api.IElanService;
-
-/**
- * FIXME :This is a temp hack to access OSGi services from blueprint.
- * Can be removed after vpnmanager migration to blueprint is complete https://git.opendaylight.org/gerrit/#/c/39012/
- *
- */
-public class VpnmanagerServiceAccessor {
-    private static IElanService elanProvider;
-
-    public VpnmanagerServiceAccessor(IElanService elanProvider) {
-        VpnmanagerServiceAccessor.elanProvider = elanProvider;
-    }
-
-    public static IElanService getElanProvider() {
-        return elanProvider;
-    }
-
-}
diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnserviceProvider.java b/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnserviceProvider.java
deleted file mode 100644 (file)
index 1e7a6fa..0000000
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.netvirt.vpnmanager;
-
-import java.math.BigInteger;
-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.sal.binding.api.BindingAwareBroker;
-import org.opendaylight.controller.sal.binding.api.BindingAwareBroker.ProviderContext;
-import org.opendaylight.controller.sal.binding.api.BindingAwareProvider;
-import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
-import org.opendaylight.netvirt.bgpmanager.api.IBgpManager;
-import org.opendaylight.netvirt.fibmanager.api.IFibManager;
-import org.opendaylight.netvirt.vpnmanager.api.IVpnManager;
-import org.opendaylight.netvirt.vpnmanager.intervpnlink.InterVpnLinkListener;
-import org.opendaylight.netvirt.vpnmanager.intervpnlink.InterVpnLinkNodeListener;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fib.rpc.rev160121.FibRpcService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.NeutronvpnService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.vpn.rpc.rev160201.VpnRpcService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
-import org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.OdlArputilService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInput;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.CreateIdPoolInputBuilder;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceRegistration;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class VpnserviceProvider implements BindingAwareProvider, IVpnManager, AutoCloseable {
-
-    private static final Logger LOG = LoggerFactory.getLogger(VpnserviceProvider.class);
-    private VpnInterfaceManager vpnInterfaceManager;
-    private VpnManager vpnManager;
-    private ArpScheduler arpscheduler;
-    private IBgpManager bgpManager;
-    private FibRpcService fibService;
-    private IFibManager fibManager;
-    private IMdsalApiManager mdsalManager;
-    private OdlInterfaceRpcService odlInterfaceRpcService;
-    private ItmRpcService itmRpcService;
-    private IdManagerService idManager;
-    private OdlArputilService arpManager;
-    private NeutronvpnService neuService;
-    private NotificationService notificationService;
-    private RpcProviderRegistry rpcProviderRegistry;
-    private BindingAwareBroker.RpcRegistration<VpnRpcService> rpcRegistration;
-    private NotificationPublishService notificationPublishService;
-    private PacketProcessingService m_packetProcessingService;
-    private SubnetRoutePacketInHandler subnetRoutePacketInHandler;
-    private InterVpnLinkListener interVpnLinkListener;
-    private static DataBroker dataBroker;
-    private InterVpnLinkNodeListener interVpnLinkNodeListener;
-    private TunnelInterfaceStateListener tunIntfStateListener;
-    private BundleContext bundleContext;
-    private FloatingIpGarpHandler garpHandler;
-
-    public VpnserviceProvider(BundleContext bundleContext) {
-        this.bundleContext = bundleContext;
-    }
-
-    public static DataBroker getDataBroker() {
-        return dataBroker;
-    }
-
-
-    @Override
-    public void onSessionInitiated(ProviderContext session) {
-        LOG.info("VpnserviceProvider Session Initiated");
-        try {
-            dataBroker = session.getSALService(DataBroker.class);
-            vpnManager = new VpnManager(dataBroker, bgpManager);
-            vpnManager.setIdManager(idManager);
-            vpnInterfaceManager = new VpnInterfaceManager(dataBroker, bgpManager, notificationService);
-            tunIntfStateListener = new TunnelInterfaceStateListener(dataBroker, bgpManager);
-            vpnInterfaceManager.setMdsalManager(mdsalManager);
-            vpnInterfaceManager.setIfaceMgrRpcService(odlInterfaceRpcService);
-            vpnInterfaceManager.setIdManager(idManager);
-            vpnInterfaceManager.setArpManager(arpManager);
-            vpnInterfaceManager.setNeutronvpnManager(neuService);
-            vpnInterfaceManager.setNotificationPublishService(notificationPublishService);
-            vpnManager.setVpnInterfaceManager(vpnInterfaceManager);
-            fibService = rpcProviderRegistry.getRpcService(FibRpcService.class);
-            itmRpcService = rpcProviderRegistry.getRpcService(ItmRpcService.class);
-            vpnInterfaceManager.setFibRpcService(fibService);
-            tunIntfStateListener.setITMRpcService(itmRpcService);
-            VpnRpcService vpnRpcService = new VpnRpcServiceImpl(idManager, vpnInterfaceManager, dataBroker);
-            rpcRegistration = getRpcProviderRegistry().addRpcImplementation(VpnRpcService.class, vpnRpcService);
-            //Handles subnet route entries
-            subnetRoutePacketInHandler = new SubnetRoutePacketInHandler(dataBroker, idManager);
-            m_packetProcessingService = session.getRpcService(PacketProcessingService.class);
-            subnetRoutePacketInHandler.setPacketProcessingService(m_packetProcessingService);
-            notificationService.registerNotificationListener(subnetRoutePacketInHandler);
-            interVpnLinkListener = new InterVpnLinkListener(dataBroker, idManager, mdsalManager, bgpManager,
-                                                            notificationPublishService);
-            interVpnLinkNodeListener = new InterVpnLinkNodeListener(dataBroker, mdsalManager);
-            createIdPool();
-            RouterInterfaceListener routerListener = new RouterInterfaceListener(dataBroker);
-            arpscheduler = new ArpScheduler(odlInterfaceRpcService, dataBroker);
-            routerListener.setVpnInterfaceManager(vpnInterfaceManager);
-            garpHandler = new FloatingIpGarpHandler(dataBroker);
-            garpHandler.setPacketService(m_packetProcessingService);
-            
-            //ServiceRegistration serviceRegistration = bundleContext.registerService(IVpnManager.)
-        } catch (Exception e) {
-            LOG.error("Error initializing services", e);
-        }
-    }
-
-    public void setNotificationService(NotificationService notificationService) {
-        this.notificationService = notificationService;
-    }
-
-    public void setBgpManager(IBgpManager bgpManager) {
-        LOG.debug("BGP Manager reference initialized");
-        this.bgpManager = bgpManager;
-    }
-
-    public void setMdsalManager(IMdsalApiManager mdsalManager) {
-        this.mdsalManager = mdsalManager;
-    }
-
-    public void setOdlInterfaceRpcService(OdlInterfaceRpcService odlInterfaceRpcService) {
-        this.odlInterfaceRpcService = odlInterfaceRpcService;
-    }
-
-    public void setIdManager(IdManagerService idManager) {
-        this.idManager = idManager;
-    }
-
-    public void setArpManager(OdlArputilService arpManager) {
-        this.arpManager = arpManager;
-    }
-
-    public void setRpcProviderRegistry(RpcProviderRegistry rpcProviderRegistry) {
-        this.rpcProviderRegistry = rpcProviderRegistry;
-    }
-
-    private RpcProviderRegistry getRpcProviderRegistry() {
-        return rpcProviderRegistry;
-    }
-
-    public void setNotificationPublishService(NotificationPublishService notificationPublishService) {
-        this.notificationPublishService = notificationPublishService;
-    }
-
-    private void createIdPool() {
-        CreateIdPoolInput createPool = new CreateIdPoolInputBuilder()
-            .setPoolName(VpnConstants.VPN_IDPOOL_NAME)
-            .setLow(VpnConstants.VPN_IDPOOL_START)
-            .setHigh(new BigInteger(VpnConstants.VPN_IDPOOL_SIZE).longValue())
-            .build();
-        try {
-           Future<RpcResult<Void>> result = idManager.createIdPool(createPool);
-           if ((result != null) && (result.get().isSuccessful())) {
-                LOG.debug("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();
-        vpnInterfaceManager.close();
-        tunIntfStateListener.close();
-        interVpnLinkListener.close();
-        interVpnLinkNodeListener.close();
-
-    }
-
-    @Override
-    public void setFibManager(IFibManager fibManager) {
-        LOG.debug("Fib service reference is initialized in VPN Manager");
-        this.fibManager = fibManager;
-        vpnInterfaceManager.setFibManager(fibManager);
-        tunIntfStateListener.setFibManager(fibManager);
-    }
-
-    @Override
-    public void addExtraRoute(String destination, String nextHop, String rd, String routerID, int label) {
-        LOG.info("Adding extra route with destination {}, nextHop {} and label{}", destination, nextHop, label);
-        vpnInterfaceManager.addExtraRoute(destination, nextHop, rd, routerID, label, /*intfName*/ null);
-    }
-
-    @Override
-    public void delExtraRoute(String destination, String nextHop, String rd, String routerID) {
-        LOG.info("Deleting extra route with destination {} and nextHop {}", destination, nextHop);
-        vpnInterfaceManager.delExtraRoute(destination, nextHop, rd, routerID, null);
-    }
-
-    @Override
-    public boolean existsVpn(String vpnName) {
-        return vpnManager.getVpnInstance(vpnName) != null;
-    }
-
-    @Override
-    public boolean isVPNConfigured() {
-        return vpnManager.isVPNConfigured();
-    }
-}
index 47afcad74eecba137b0d5bdeaf02da225a3bc54b..cd63e74de3af485d5fec06d9c8b0f0f3ae4856a9 100644 (file)
@@ -7,11 +7,15 @@
  */
 package org.opendaylight.netvirt.vpnmanager.intervpnlink;
 
-
 import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
+import java.math.BigInteger;
+import java.util.ArrayList;
+import java.util.List;
+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.DataChangeListener;
 import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
@@ -32,7 +36,12 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.Fl
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.Flow;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.table.FlowKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.*;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.AllocateIdOutput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.ReleaseIdInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.fibmanager.rev150330.vrfentries.VrfEntry;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.InterVpnLinkCreationError;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.InterVpnLinkCreationErrorBuilder;
@@ -53,70 +62,47 @@ import org.opendaylight.yangtools.yang.common.RpcResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-
-public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLink> {
-    private static final Logger logger = LoggerFactory.getLogger(InterVpnLinkListener.class);
+public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLink> implements  AutoCloseable {
+    private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkListener.class);
+    private ListenerRegistration<DataChangeListener> listenerRegistration;
+    private final DataBroker dataBroker;
+    private final IMdsalApiManager mdsalManager;
+    private final IdManagerService idManager;
+    private final IBgpManager bgpManager;
+    private final NotificationPublishService notificationsService;
     private static final String NBR_OF_DPNS_PROPERTY_NAME = "vpnservice.intervpnlink.number.dpns";
     private static final int INVALID_ID = 0;
 
-    private IMdsalApiManager mdsalManager;
-    private IdManagerService idManager;
-    private IBgpManager bgpManager;
-    private NotificationPublishService notificationsService;
-
-    private ListenerRegistration<DataChangeListener> listenerRegistration;
-    private final DataBroker broker;
-
-
-    public InterVpnLinkListener(DataBroker db, IdManagerService idManager, IMdsalApiManager mdsalManager,
-                                IBgpManager bgpManager, NotificationPublishService notifService) {
+    public InterVpnLinkListener(final DataBroker dataBroker, final IdManagerService idManager,
+                                final IMdsalApiManager mdsalManager, final IBgpManager bgpManager,
+                                final NotificationPublishService notifService) {
         super(InterVpnLink.class);
-        this.broker = db;
+        this.dataBroker = dataBroker;
         this.idManager = idManager;
         this.mdsalManager = mdsalManager;
         this.bgpManager = bgpManager;
         this.notificationsService = notifService;
-        this.registerListener(db);
     }
 
-    public void close() {
-        if (listenerRegistration != null) {
-            try {
-                listenerRegistration.close();
-            } catch (final Exception e) {
-                logger.error("Error when cleaning up DataChangeListener.", e);
-            }
-            listenerRegistration = null;
-        }
-    }
-
-
-    /**
-     * Register the databroker to all the possible changes from MDSAL - InterVpnLink class
-     *
-     * @param db dataBroker service reference
-     */
-    private void registerListener(DataBroker db) {
-        try {
-            this.listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
-                                                                      this.getWildCardPath(),
-                                                                      this,
-                                                                      AsyncDataBroker.DataChangeScope.SUBTREE);
-        } catch (Exception e) {
-            logger.error("InterVpnLinkListener: DataChange listener registration fail!", e);
-            throw new IllegalStateException("InterVpnLinkListener: registration Listener failed.", e);
-        }
+    public void start() {
+        LOG.info("{} start", getClass().getSimpleName());
+        listenerRegistration = dataBroker.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
+                getWildCardPath(), this, AsyncDataBroker.DataChangeScope.SUBTREE);
     }
 
     private InstanceIdentifier<InterVpnLink> getWildCardPath() {
         return InstanceIdentifier.create(InterVpnLinks.class).child(InterVpnLink.class);
     }
 
+    @Override
+    public void close() throws Exception {
+        if (listenerRegistration != null) {
+            listenerRegistration.close();
+            listenerRegistration = null;
+        }
+        LOG.info("{} close", getClass().getSimpleName());
+    }
+
     private String getInterVpnLinkIfaceName(String vpnUuid, BigInteger dpnId ) {
         return String.format("InterVpnLink.%s.%s", vpnUuid, dpnId.toString());
     }
@@ -128,7 +114,7 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
         // Create VpnLink state
         InstanceIdentifier<InterVpnLinkState> vpnLinkStateIid = VpnUtil.getInterVpnLinkStateIid(add.getName());
         InterVpnLinkState vpnLinkState = new InterVpnLinkStateBuilder().setInterVpnLinkName(add.getName()).build();
-        MDSALUtil.syncWrite(broker, LogicalDatastoreType.CONFIGURATION, vpnLinkStateIid, vpnLinkState);
+        MDSALUtil.syncWrite(dataBroker, LogicalDatastoreType.CONFIGURATION, vpnLinkStateIid, vpnLinkState);
 
         InterVpnLinkKey key = add.getKey();
         Uuid firstEndpointVpnUuid = add.getFirstEndpoint().getVpnUuid();
@@ -137,7 +123,7 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
         if (!checkVpnAvailability(key, firstEndpointVpnUuid)) {
             String errMsg = String.format("Vpn already associated with a previous inter-vpn-link {}",
                                           firstEndpointVpnUuid);
-            logger.error(errMsg);
+            LOG.error(errMsg);
             setInError(vpnLinkStateIid, vpnLinkState, errMsg);
             return;
         }
@@ -146,16 +132,16 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
         if (!checkVpnAvailability(key, secondEndpointVpnUuid)) {
             String errMsg = String.format("Vpn already associated with a previous inter-vpn-link {}",
                                           secondEndpointVpnUuid);
-            logger.error(errMsg);
+            LOG.error(errMsg);
             setInError(vpnLinkStateIid, vpnLinkState, errMsg);
             return;
         }
 
         // TODO: Doing like this we are retrieving operative DPNs from MDSAL when we just need one. Fix it
-        List<BigInteger> firstDpnList = VpnUtil.pickRandomDPNs(broker, numberOfDpns, null);
+        List<BigInteger> firstDpnList = VpnUtil.pickRandomDPNs(dataBroker, numberOfDpns, null);
         if (firstDpnList != null && !firstDpnList.isEmpty()) {
             // TODO: Limitation to be solved later
-            // List<BigInteger> secondDpnList = VpnUtil.pickRandomDPNs(broker, numberOfDpns, firstDpnList);
+            // List<BigInteger> secondDpnList = VpnUtil.pickRandomDPNs(dataBroker, numberOfDpns, firstDpnList);
             List<BigInteger> secondDpnList = firstDpnList;
 
             Integer firstVpnLportTag = allocateVpnLinkLportTag(key.getName() + firstEndpointVpnUuid.getValue());
@@ -167,21 +153,21 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
                 new SecondEndpointStateBuilder().setVpnUuid(secondEndpointVpnUuid).setDpId(secondDpnList)
                                                 .setLportTag(secondVpnLportTag).build();
 
-            InterVpnLinkUtil.updateInterVpnLinkState(broker, add.getName(), InterVpnLinkState.State.Active, firstEndPointState,
+            InterVpnLinkUtil.updateInterVpnLinkState(dataBroker, add.getName(), InterVpnLinkState.State.Active, firstEndPointState,
                                             secondEndPointState);
 
             // Note that in the DPN of the firstEndpoint we install the lportTag of the secondEndpoint and viceversa
-            InterVpnLinkUtil.installLPortDispatcherTableFlow(broker, mdsalManager, add, firstDpnList,
+            InterVpnLinkUtil.installLPortDispatcherTableFlow(dataBroker, mdsalManager, add, firstDpnList,
                                                     secondEndpointVpnUuid, secondVpnLportTag);
-            InterVpnLinkUtil.installLPortDispatcherTableFlow(broker, mdsalManager, add, secondDpnList,
+            InterVpnLinkUtil.installLPortDispatcherTableFlow(dataBroker, mdsalManager, add, secondDpnList,
                                                     firstEndpointVpnUuid, firstVpnLportTag);
             // Update the VPN -> DPNs Map.
             // Note: when a set of DPNs is calculated for Vpn1, these DPNs are added to the VpnToDpn map of Vpn2. Why?
             // because we do the handover from Vpn1 to Vpn2 in those DPNs, so in those DPNs we must know how to reach
             // to Vpn2 targets. If new Vpn2 targets are added later, the Fib will be maintained in these DPNs even if
             // Vpn2 is not physically present there.
-            InterVpnLinkUtil.updateVpnToDpnMap(broker, firstDpnList, secondEndpointVpnUuid);
-            InterVpnLinkUtil.updateVpnToDpnMap(broker, secondDpnList, firstEndpointVpnUuid);
+            InterVpnLinkUtil.updateVpnToDpnMap(dataBroker, firstDpnList, secondEndpointVpnUuid);
+            InterVpnLinkUtil.updateVpnToDpnMap(dataBroker, secondDpnList, firstEndpointVpnUuid);
 
             // Now, if the corresponding flags are activated, there will be some routes exchange
             leakRoutesIfNeeded(add);
@@ -196,7 +182,7 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
             SecondEndpointState secondEndPointState =
                 new SecondEndpointStateBuilder().setVpnUuid(secondEndpointVpnUuid)
                                                 .setLportTag(secondVpnLportTag).build();
-            InterVpnLinkUtil.updateInterVpnLinkState(broker, add.getName(), InterVpnLinkState.State.Error, firstEndPointState,
+            InterVpnLinkUtil.updateInterVpnLinkState(dataBroker, add.getName(), InterVpnLinkState.State.Error, firstEndPointState,
                                             secondEndPointState);
         }
 
@@ -244,14 +230,14 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
 
     private void leakRoutes(InterVpnLink vpnLink, String srcVpnUuid, String dstVpnUuid,
                             List<RouteOrigin> originsToConsider) {
-        String srcVpnRd = VpnUtil.getVpnRd(broker, srcVpnUuid);
-        String dstVpnRd = VpnUtil.getVpnRd(broker, dstVpnUuid);
-        List<VrfEntry> srcVpnRemoteVrfEntries = VpnUtil.getVrfEntriesByOrigin(broker, srcVpnRd, originsToConsider);
+        String srcVpnRd = VpnUtil.getVpnRd(dataBroker, srcVpnUuid);
+        String dstVpnRd = VpnUtil.getVpnRd(dataBroker, dstVpnUuid);
+        List<VrfEntry> srcVpnRemoteVrfEntries = VpnUtil.getVrfEntriesByOrigin(dataBroker, srcVpnRd, originsToConsider);
         for ( VrfEntry vrfEntry : srcVpnRemoteVrfEntries ) {
             long label = VpnUtil.getUniqueId(idManager, VpnConstants.VPN_IDPOOL_NAME,
                                              VpnUtil.getNextHopLabelKey(dstVpnRd, vrfEntry.getDestPrefix()));
 
-            VpnUtil.leakRoute(broker, bgpManager, vpnLink, srcVpnUuid, dstVpnUuid,
+            VpnUtil.leakRoute(dataBroker, bgpManager, vpnLink, srcVpnUuid, dstVpnUuid,
                               vrfEntry.getDestPrefix(), label);
         }
     }
@@ -265,9 +251,9 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
      */
     private void leakExtraRoutesToVpnEndpoint(InterVpnLink vpnLink, String vpn1Uuid, String vpn2Uuid) {
 
-        String vpn1Rd = VpnUtil.getVpnRd(broker, vpn1Uuid);
+        String vpn1Rd = VpnUtil.getVpnRd(dataBroker, vpn1Uuid);
         String vpn2Endpoint = vpnLink.getSecondEndpoint().getIpAddress().getValue();
-        List<VrfEntry> allVpnVrfEntries = VpnUtil.getAllVrfEntries(broker, vpn1Rd);
+        List<VrfEntry> allVpnVrfEntries = VpnUtil.getAllVrfEntries(dataBroker, vpn1Rd);
         for ( VrfEntry vrfEntry : allVpnVrfEntries ) {
             if ( vrfEntry.getNextHopAddressList() != null
                 && vrfEntry.getNextHopAddressList().contains(vpn2Endpoint) ) {
@@ -276,7 +262,7 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
                 long label = VpnUtil.getUniqueId(idManager, VpnConstants.VPN_IDPOOL_NAME,
                                                   VpnUtil.getNextHopLabelKey(vpn1Rd, vrfEntry.getDestPrefix()));
 
-                VpnUtil.leakRoute(broker, bgpManager, vpnLink, vpn2Uuid, vpn1Uuid, vrfEntry.getDestPrefix(),
+                VpnUtil.leakRoute(dataBroker, bgpManager, vpnLink, vpn2Uuid, vpn1Uuid, vrfEntry.getDestPrefix(),
                                   label, RouteOrigin.value(vrfEntry.getOrigin()));
             }
         }
@@ -286,7 +272,7 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
     private boolean checkVpnAvailability(InterVpnLinkKey key, Uuid vpnId) {
         Preconditions.checkNotNull(vpnId);
 
-        List<InterVpnLink> interVpnLinks = VpnUtil.getAllInterVpnLinks(broker);
+        List<InterVpnLink> interVpnLinks = VpnUtil.getAllInterVpnLinks(dataBroker);
         if ( interVpnLinks != null ) {
             for (InterVpnLink interVpnLink : interVpnLinks) {
                 if (!key.equals(interVpnLink.getKey())
@@ -309,16 +295,16 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
 
         // For each endpoint, remove all routes that have been learnt by intervpnLink
         String vpn1Uuid = del.getFirstEndpoint().getVpnUuid().getValue();
-        String rd1 = VpnUtil.getVpnRdFromVpnInstanceConfig(broker, vpn1Uuid);
-        VpnUtil.removeVrfEntriesByOrigin(broker, rd1, RouteOrigin.INTERVPN);
-        VpnUtil.removeVrfEntriesByNexthop(broker, rd1, del.getSecondEndpoint().getIpAddress().getValue());
+        String rd1 = VpnUtil.getVpnRdFromVpnInstanceConfig(dataBroker, vpn1Uuid);
+        VpnUtil.removeVrfEntriesByOrigin(dataBroker, rd1, RouteOrigin.INTERVPN);
+        VpnUtil.removeVrfEntriesByNexthop(dataBroker, rd1, del.getSecondEndpoint().getIpAddress().getValue());
 
         String vpn2Uuid = del.getSecondEndpoint().getVpnUuid().getValue();
-        String rd2 = VpnUtil.getVpnRdFromVpnInstanceConfig(broker, vpn2Uuid);
-        VpnUtil.removeVrfEntriesByOrigin(broker, rd2, RouteOrigin.INTERVPN);
-        VpnUtil.removeVrfEntriesByNexthop(broker, rd2, del.getFirstEndpoint().getIpAddress().getValue());
+        String rd2 = VpnUtil.getVpnRdFromVpnInstanceConfig(dataBroker, vpn2Uuid);
+        VpnUtil.removeVrfEntriesByOrigin(dataBroker, rd2, RouteOrigin.INTERVPN);
+        VpnUtil.removeVrfEntriesByNexthop(dataBroker, rd2, del.getFirstEndpoint().getIpAddress().getValue());
 
-        InterVpnLinkState interVpnLinkState = VpnUtil.getInterVpnLinkState(broker, del.getName());
+        InterVpnLinkState interVpnLinkState = VpnUtil.getInterVpnLinkState(dataBroker, del.getName());
         Integer firstEndpointLportTag = interVpnLinkState.getFirstEndpointState().getLportTag();
 
         Integer secondEndpointLportTag = interVpnLinkState.getSecondEndpointState().getLportTag();
@@ -333,7 +319,7 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
             mdsalManager.removeFlow(dpnId, flow);
 
             // Also remove the 'fake' iface from the VpnToDpn map
-            VpnUtil.removeIfaceFromVpnToDpnMap(broker, rd1, dpnId, getInterVpnLinkIfaceName(vpn1Uuid, dpnId));
+            VpnUtil.removeIfaceFromVpnToDpnMap(dataBroker, rd1, dpnId, getInterVpnLinkIfaceName(vpn1Uuid, dpnId));
         }
 
         // Removing the flow entries in 2nd Endpoint DPNs
@@ -346,7 +332,7 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
             mdsalManager.removeFlow(dpnId, flow);
 
             // Also remove the 'fake' iface from the VpnToDpn map
-            VpnUtil.removeIfaceFromVpnToDpnMap(broker, rd2, dpnId, getInterVpnLinkIfaceName(vpn2Uuid, dpnId));
+            VpnUtil.removeIfaceFromVpnToDpnMap(dataBroker, rd2, dpnId, getInterVpnLinkIfaceName(vpn2Uuid, dpnId));
         }
 
         // Release idManager wit LPortTag associated to endpoints
@@ -373,7 +359,7 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
 
         // Removing the InterVpnLinkState
         InstanceIdentifier<InterVpnLinkState> interVpnLinkStateIid = VpnUtil.getInterVpnLinkStateIid(del.getName());
-        VpnUtil.delete(broker, LogicalDatastoreType.CONFIGURATION, interVpnLinkStateIid);
+        VpnUtil.delete(dataBroker, LogicalDatastoreType.CONFIGURATION, interVpnLinkStateIid);
     }
 
     private void releaseVpnLinkLPortTag(String idKey) {
@@ -413,10 +399,10 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
             if(rpcResult.isSuccessful()) {
                 return rpcResult.getResult().getIdValue().intValue();
             } else {
-                logger.warn("RPC Call to Get Unique Id returned with Errors {}", rpcResult.getErrors());
+                LOG.warn("RPC Call to Get Unique Id returned with Errors {}", rpcResult.getErrors());
             }
         } catch (InterruptedException | ExecutionException e) {
-            logger.warn("Exception when getting Unique Id",e);
+            LOG.warn("Exception when getting Unique Id",e);
         }
         return INVALID_ID;
     }
@@ -429,7 +415,7 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
            new InterVpnLinkStateBuilder(vpnLinkState).setState(InterVpnLinkState.State.Error)
                                                      .setErrorDescription(errorMsg)
                                                      .build();
-        WriteTransaction tx = broker.newWriteOnlyTransaction();
+        WriteTransaction tx = dataBroker.newWriteOnlyTransaction();
         tx.put(LogicalDatastoreType.CONFIGURATION, vpnLinkStateIid, vpnLinkErrorState, true);
         tx.submit();
 
@@ -442,13 +428,13 @@ public class InterVpnLinkListener extends AbstractDataChangeListener<InterVpnLin
         Futures.addCallback(eventFuture, new FutureCallback<Object>() {
             @Override
             public void onFailure(Throwable error) {
-                logger.warn("Error when sending notification about InterVpnLink creation issue. InterVpnLink name={}. Error={}",
+                LOG.warn("Error when sending notification about InterVpnLink creation issue. InterVpnLink name={}. Error={}",
                             vpnLinkState.getInterVpnLinkName(), vpnLinkState, error);
             }
 
             @Override
             public void onSuccess(Object arg) {
-                logger.trace("Error notification for InterVpnLink successfully sent. VpnLink={} error={}",
+                LOG.trace("Error notification for InterVpnLink successfully sent. VpnLink={} error={}",
                              vpnLinkState.getInterVpnLinkName(), vpnLinkState);
             }
         });
index 1dc2dd9bc30d697f90dbd33ae49ba59e5f100ae0..35d41a23ed15c411037fc4d5b3ee5087e866eba1 100644 (file)
@@ -43,81 +43,70 @@ import java.util.concurrent.Callable;
  * moved to some other DPN
  *
  */
-public class InterVpnLinkNodeListener extends AbstractDataChangeListener<Node>
-                                      implements AutoCloseable {
-
-    private static final Logger logger = LoggerFactory.getLogger(InterVpnLinkNodeListener.class);
+public class InterVpnLinkNodeListener extends AbstractDataChangeListener<Node> implements AutoCloseable {
+    private static final Logger LOG = LoggerFactory.getLogger(InterVpnLinkNodeListener.class);
     private ListenerRegistration<DataChangeListener> listenerRegistration;
+    private final DataBroker dataBroker;
+    private final IMdsalApiManager mdsalManager;
     private static final String NBR_OF_DPNS_PROPERTY_NAME = "vpnservice.intervpnlink.number.dpns";
-    private final DataBroker broker;
-    final IMdsalApiManager mdsalManager;
 
-    public InterVpnLinkNodeListener(final DataBroker db, IMdsalApiManager mdsalMgr) {
+    public InterVpnLinkNodeListener(final DataBroker dataBroker, final IMdsalApiManager mdsalMgr) {
         super(Node.class);
-        broker = db;
+        this.dataBroker = dataBroker;
         mdsalManager = mdsalMgr;
-        registerListener(db);
     }
 
-    @Override
-    public void close() {
-        if (listenerRegistration != null) {
-            try {
-                listenerRegistration.close();
-            } catch (final Exception e) {
-                logger.error("Error when cleaning up DataChangeListener.", e);
-            }
-            listenerRegistration = null;
-        }
-    }
-
-    private void registerListener(final DataBroker db) {
-        try {
-            listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.OPERATIONAL,
-                                                                 getWildCardPath(),
-                                                                 InterVpnLinkNodeListener.this,
-                                                                 AsyncDataBroker.DataChangeScope.SUBTREE);
-        } catch (final Exception e) {
-            logger.error("InterVpnLinkNodeListener: DataChange listener registration fail!", e);
-            throw new IllegalStateException("InterVpnLinkNodeListener: registration Listener failed.", e);
-        }
+    public void start() {
+        LOG.info("{} start", getClass().getSimpleName());
+        listenerRegistration = dataBroker.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION,
+                getWildCardPath(), this, AsyncDataBroker.DataChangeScope.SUBTREE);
     }
 
     protected InstanceIdentifier<Node> getWildCardPath() {
         return InstanceIdentifier.create(Nodes.class).child(Node.class);
     }
 
+    @Override
+    public void close() throws Exception {
+        if (listenerRegistration != null) {
+            listenerRegistration.close();
+            listenerRegistration = null;
+        }
+        LOG.info("{} close", getClass().getSimpleName());
+    }
+
     @Override
     protected void add(InstanceIdentifier<Node> identifier, Node add) {
         NodeId nodeId = add.getId();
         String[] node =  nodeId.getValue().split(":");
         if(node.length < 2) {
-            logger.warn("Unexpected nodeId {}", nodeId.getValue());
+            LOG.warn("Unexpected nodeId {}", nodeId.getValue());
             return;
         }
         BigInteger dpId = new BigInteger(node[1]);
         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
-        coordinator.enqueueJob("IVpnLink" + dpId.toString(), new InterVpnLinkNodeAddTask(broker, mdsalManager, dpId));
+        coordinator.enqueueJob("IVpnLink" + dpId.toString(),
+                new InterVpnLinkNodeAddTask(dataBroker, mdsalManager, dpId));
     }
 
     @Override
     protected void remove(InstanceIdentifier<Node> identifier, Node del) {
-        logger.trace("Node {} has been deleted", identifier.firstKeyOf(Node.class).toString());
+        LOG.trace("Node {} has been deleted", identifier.firstKeyOf(Node.class).toString());
         NodeId nodeId = del.getId();
         String[] node =  nodeId.getValue().split(":");
         if(node.length < 2) {
-            logger.warn("Unexpected nodeId {}", nodeId.getValue());
+            LOG.warn("Unexpected nodeId {}", nodeId.getValue());
             return;
         }
         BigInteger dpId = new BigInteger(node[1]);
         DataStoreJobCoordinator coordinator = DataStoreJobCoordinator.getInstance();
-        coordinator.enqueueJob("IVpnLink" + dpId.toString(), new InterVpnLinkNodeWorker(broker, dpId));
+        coordinator.enqueueJob("IVpnLink" + dpId.toString(), new InterVpnLinkNodeWorker(dataBroker, dpId));
 
     }
 
     @Override
     protected void update(InstanceIdentifier<Node> identifier, Node original, Node update) {
-        logger.trace("Node {} has changed", identifier.firstKeyOf(Node.class).toString());
+        LOG.trace("Node {} has changed", identifier.firstKeyOf(Node.class).toString());
     }
 
     protected class InterVpnLinkNodeWorker implements Callable<List<ListenableFuture<Void>>> {
@@ -137,7 +126,7 @@ public class InterVpnLinkNodeListener extends AbstractDataChangeListener<Node>
             for ( InterVpnLink interVpnLink : allInterVpnLinks ) {
                 InterVpnLinkState interVpnLinkState = VpnUtil.getInterVpnLinkState(broker, interVpnLink.getName());
                 if ( interVpnLinkState == null ) {
-                    logger.warn("Could not find State info for InterVpnLink={}", interVpnLink.getName());
+                    LOG.warn("Could not find State info for InterVpnLink={}", interVpnLink.getName());
                     continue;
                 }
 
@@ -157,7 +146,7 @@ public class InterVpnLinkNodeListener extends AbstractDataChangeListener<Node>
                     try {
                         Thread.sleep(timeToWait);
                     } catch (InterruptedException e) {
-                        logger.warn("Interrupted while waiting for Flows removal sync.", e);
+                        LOG.warn("Interrupted while waiting for Flows removal sync.", e);
                     }
 
                     InterVpnLink interVpnLink2 = new InterVpnLinkBuilder(interVpnLink).build();
diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/vpnservice/impl/rev150216/VpnserviceImplModule.java b/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/vpnservice/impl/rev150216/VpnserviceImplModule.java
deleted file mode 100644 (file)
index 4de4987..0000000
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2015 - 2016 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpnservice.impl.rev150216;
-
-import org.opendaylight.netvirt.vpnmanager.VpnserviceProvider;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.OdlArputilService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService;
-import org.osgi.framework.BundleContext;
-
-public class VpnserviceImplModule extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpnservice.impl.rev150216.AbstractVpnserviceImplModule {
-    private BundleContext bundleContext = null;
-
-    public VpnserviceImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver) {
-        super(identifier, dependencyResolver);
-    }
-
-    public VpnserviceImplModule(org.opendaylight.controller.config.api.ModuleIdentifier identifier, org.opendaylight.controller.config.api.DependencyResolver dependencyResolver, org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpnservice.impl.rev150216.VpnserviceImplModule oldModule, java.lang.AutoCloseable oldInstance) {
-        super(identifier, dependencyResolver, oldModule, oldInstance);
-    }
-
-    @Override
-    public void customValidation() {
-        // add custom validation form module attributes here.
-    }
-
-    @Override
-    public java.lang.AutoCloseable createInstance() {
-        IdManagerService idManager = getRpcregistryDependency().getRpcService(IdManagerService.class);
-        OdlArputilService arpManager =  getRpcregistryDependency().getRpcService(OdlArputilService.class);
-        OdlInterfaceRpcService odlInterfaceRpcService = getRpcregistryDependency().getRpcService(OdlInterfaceRpcService.class);
-
-        VpnserviceProvider provider = new VpnserviceProvider(bundleContext);
-        provider.setNotificationService(getNotificationServiceDependency());
-        provider.setBgpManager(getBgpmanagerDependency());
-        provider.setMdsalManager(getMdsalutilDependency());
-        provider.setOdlInterfaceRpcService(odlInterfaceRpcService);
-        provider.setIdManager(idManager);
-        provider.setArpManager(arpManager);
-        provider.setRpcProviderRegistry(getRpcregistryDependency());
-        provider.setNotificationPublishService(getNotificationPublishServiceDependency());
-        getBrokerDependency().registerProvider(provider);
-        return provider;
-    }
-
-    public void setBundleContext(BundleContext bundleContext) {
-        this.bundleContext = bundleContext;
-    }
-}
diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/vpnservice/impl/rev150216/VpnserviceImplModuleFactory.java b/vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/yang/gen/v1/urn/opendaylight/params/xml/ns/yang/vpnservice/impl/rev150216/VpnserviceImplModuleFactory.java
deleted file mode 100644 (file)
index b80050d..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2015 Ericsson India Global Services Pvt Ltd. and others.  All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v1.0 which accompanies this distribution,
- * and is available at http://www.eclipse.org/legal/epl-v10.html
- */
-/*
-* Generated file
-*
-* Generated from: yang module name: vpnservice yang module local name: vpnservice
-* Generated by: org.opendaylight.controller.config.yangjmxgenerator.plugin.JMXGenerator
-* Generated at: Fri Feb 13 17:27:11 IST 2015
-*
-* Do not modify this file unless it is present under src/main directory
-*/
-package org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpnservice.impl.rev150216;
-
-import org.opendaylight.controller.config.api.DependencyResolver;
-import org.opendaylight.controller.config.api.DynamicMBeanWithInstance;
-import org.opendaylight.controller.config.spi.Module;
-import org.osgi.framework.BundleContext;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class VpnserviceImplModuleFactory extends org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.vpnservice.impl.rev150216.AbstractVpnserviceImplModuleFactory {
-    private static final Logger LOG = LoggerFactory.getLogger(VpnserviceImplModuleFactory.class);
-
-    @Override
-    public Module createModule(String instanceName,
-                               DependencyResolver dependencyResolver,
-                               DynamicMBeanWithInstance old, BundleContext bundleContext)
-            throws Exception {
-        Module module =  super.createModule(instanceName, dependencyResolver, old, bundleContext);
-        setModuleBundleContext(bundleContext, module);
-        return module;
-    }
-
-    @Override
-    public Module createModule(String instanceName,
-                               DependencyResolver dependencyResolver, BundleContext bundleContext) {
-        Module module = super.createModule(instanceName, dependencyResolver, bundleContext);
-        setModuleBundleContext(bundleContext, module);
-        return module;
-    }
-
-    private void setModuleBundleContext(BundleContext bundleContext,
-                                        Module module) {
-        if (module instanceof VpnserviceImplModule) {
-            ((VpnserviceImplModule)module).setBundleContext(bundleContext);
-        } else {
-            LOG.warn("Module is of type {} expected type {}",
-                    module.getClass(), VpnserviceImplModule.class);
-        }
-    }
-}
diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/main/resources/OSGI-INF/blueprint/blueprint.xml b/vpnservice/vpnmanager/vpnmanager-impl/src/main/resources/OSGI-INF/blueprint/blueprint.xml
deleted file mode 100644 (file)
index dcb5007..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0">
-    <reference id="elanProvider" interface="org.opendaylight.netvirt.elanmanager.api.IElanService" availability="optional" />
-    <bean id="vpnmanagerServiceAccessor" class="org.opendaylight.netvirt.vpnmanager.VpnmanagerServiceAccessor">
-        <argument ref="elanProvider" />
-    </bean>
-</blueprint>
diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/main/resources/org/opendaylight/blueprint/vpnmanager.xml b/vpnservice/vpnmanager/vpnmanager-impl/src/main/resources/org/opendaylight/blueprint/vpnmanager.xml
new file mode 100644 (file)
index 0000000..e59e157
--- /dev/null
@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0"
+           xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0"
+           odl:use-default-for-reference-types="true">
+
+  <reference id="dataBroker"
+             interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+             odl:type="default" />
+  <reference id="mdsalUtils"
+             interface="org.opendaylight.genius.mdsalutil.interfaces.IMdsalApiManager" />
+  <reference id="notificationPublishService"
+             interface="org.opendaylight.controller.md.sal.binding.api.NotificationPublishService" />
+  <reference id="bgpmanager"
+             interface="org.opendaylight.netvirt.bgpmanager.api.IBgpManager" />
+  <reference id="elanService"
+             interface="org.opendaylight.netvirt.elanmanager.api.IElanService" />
+  <reference id="fibManager"
+             interface="org.opendaylight.netvirt.fibmanager.api.IFibManager" />
+
+  <odl:rpc-service id="idManagerService"
+                   interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService" />
+  <odl:rpc-service id="itmRpcService"
+                   interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService" />
+  <odl:rpc-service id="odlInterfaceRpcService"
+                   interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService" />
+  <odl:rpc-service id="odlArputilService"
+                   interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.OdlArputilService" />
+  <odl:rpc-service id="packetProcessingService"
+                   interface="org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService" />
+
+  <bean id="dpnInVpnChangeListener"
+        class="org.opendaylight.netvirt.vpnmanager.DpnInVpnChangeListener">
+    <argument ref="dataBroker" />
+  </bean>
+  <service ref="dpnInVpnChangeListener" odl:type="default"
+           interface="org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.l3vpn.rev130911.OdlL3vpnListener" />
+  <odl:notification-listener ref="dpnInVpnChangeListener" />
+
+  <bean id="vpnInterfaceManager"
+        class="org.opendaylight.netvirt.vpnmanager.VpnInterfaceManager"
+        init-method="start" destroy-method="close">
+    <argument ref="dataBroker" />
+    <argument ref="bgpmanager" />
+    <argument ref="odlArputilService" />
+    <argument ref="idManagerService" />
+    <argument ref="mdsalUtils" />
+    <argument ref="fibManager" />
+    <argument ref="odlInterfaceRpcService" />
+    <argument ref="notificationPublishService" />
+  </bean>
+
+  <bean id="tunnelInterfaceStateListener"
+        class="org.opendaylight.netvirt.vpnmanager.TunnelInterfaceStateListener"
+        init-method="start" destroy-method="close">
+    <argument ref="dataBroker" />
+    <argument ref="bgpmanager" />
+    <argument ref="fibManager" />
+    <argument ref="itmRpcService" />
+  </bean>
+
+  <bean id="interfaceStateChangeListener"
+        class="org.opendaylight.netvirt.vpnmanager.InterfaceStateChangeListener"
+        init-method="start" destroy-method="close">
+    <argument ref="dataBroker" />
+    <argument ref="vpnInterfaceManager" />
+  </bean>
+
+  <bean id="vpnInterfaceOpListener"
+        class="org.opendaylight.netvirt.vpnmanager.VpnInterfaceOpListener"
+        init-method="start" destroy-method="close">
+    <argument ref="dataBroker" />
+    <argument ref="vpnInterfaceManager" />
+  </bean>
+
+  <bean id="arpScheduler"
+        class="org.opendaylight.netvirt.vpnmanager.ArpScheduler"
+        init-method="start" destroy-method="close">
+    <argument ref="dataBroker" />
+    <argument ref="odlInterfaceRpcService" />
+  </bean>
+
+  <bean id="floatingIpGarpHandler"
+        class="org.opendaylight.netvirt.vpnmanager.FloatingIpGarpHandler"
+        init-method="start" destroy-method="close">
+    <argument ref="dataBroker" />
+    <argument ref="packetProcessingService" />
+    <argument ref="elanService" />
+    <argument ref="odlInterfaceRpcService" />
+  </bean>
+
+  <bean id="subnetRoutePacketInHandler"
+        class="org.opendaylight.netvirt.vpnmanager.SubnetRoutePacketInHandler">
+    <argument ref="dataBroker" />
+    <argument ref="packetProcessingService" />
+  </bean>
+  <service ref="subnetRoutePacketInHandler" odl:type="default"
+           interface="org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingListener" />
+  <odl:notification-listener ref="subnetRoutePacketInHandler" />
+
+  <bean id="arpNotificationHandler"
+        class="org.opendaylight.netvirt.vpnmanager.ArpNotificationHandler">
+    <argument ref="vpnInterfaceManager" />
+    <argument ref="dataBroker" />
+    <argument ref="elanService" />
+  </bean>
+  <service ref="arpNotificationHandler" odl:type="default"
+           interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.OdlArputilListener" />
+  <odl:notification-listener ref="arpNotificationHandler" />
+
+  <bean id="subnetRouteInterfaceStateChangeListener"
+        class="org.opendaylight.netvirt.vpnmanager.SubnetRouteInterfaceStateChangeListener"
+        init-method="start" destroy-method="close">
+    <argument ref="dataBroker" />
+    <argument ref="vpnInterfaceManager" />
+    <argument ref="vpnSubnetRouteHandler" />
+  </bean>
+
+  <bean id="vpnSubnetRouteHandler"
+        class="org.opendaylight.netvirt.vpnmanager.VpnSubnetRouteHandler">
+    <argument ref="dataBroker" />
+    <argument ref="subnetOpDpnManager" />
+    <argument ref="bgpmanager" />
+    <argument ref="vpnInterfaceManager" />
+    <argument ref="idManagerService" />
+  </bean>
+  <service ref="vpnSubnetRouteHandler" odl:type="default"
+           interface="org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.NeutronvpnListener" />
+  <odl:notification-listener ref="vpnSubnetRouteHandler" />
+
+  <bean id="subnetOpDpnManager" class="org.opendaylight.netvirt.vpnmanager.SubnetOpDpnManager">
+    <argument ref="dataBroker" />
+  </bean>
+
+  <bean id="vpnManagerImpl" class="org.opendaylight.netvirt.vpnmanager.VpnManagerImpl"
+        init-method="start">
+    <argument ref="dataBroker" />
+    <argument ref="idManagerService" />
+    <argument ref="vpnInstanceListener" />
+    <argument ref="vpnInterfaceManager" />
+  </bean>
+  <service ref="vpnManagerImpl"
+           interface="org.opendaylight.netvirt.vpnmanager.api.IVpnManager" />
+
+  <bean id="vpnInstanceListener"
+        class="org.opendaylight.netvirt.vpnmanager.VpnInstanceListener"
+        init-method="start" destroy-method="close">
+    <argument ref="dataBroker" />
+    <argument ref="bgpmanager" />
+    <argument ref="idManagerService" />
+    <argument ref="vpnInterfaceManager" />
+    <argument ref="fibManager" />
+  </bean>
+
+  <bean id="fibEntriesListener" class="org.opendaylight.netvirt.vpnmanager.FibEntriesListener"
+        init-method="start" destroy-method="close">
+    <argument ref="dataBroker" />
+    <argument ref="vpnInstanceListener" />
+  </bean>
+
+  <bean id="VpnInterfaceOpListener"
+        class="org.opendaylight.netvirt.vpnmanager.VpnInterfaceOpListener"
+        init-method="start" destroy-method="close">
+    <argument ref="dataBroker" />
+    <argument ref="vpnInterfaceManager" />
+  </bean>
+
+  <bean id="routerInterfaceListener"
+        class="org.opendaylight.netvirt.vpnmanager.RouterInterfaceListener"
+        init-method="start" destroy-method="close">
+    <argument ref="dataBroker" />
+    <argument ref="vpnInterfaceManager" />
+  </bean>
+
+  <odl:rpc-implementation ref="vpnRpcServiceImpl" />
+  <bean id="vpnRpcServiceImpl"
+        class="org.opendaylight.netvirt.vpnmanager.VpnRpcServiceImpl">
+    <argument ref="dataBroker" />
+    <argument ref="idManagerService" />
+    <argument ref="vpnInterfaceManager" />
+    <argument ref="fibManager" />
+  </bean>
+  <service ref="vpnRpcServiceImpl"
+           interface="org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.vpn.rpc.rev160201.VpnRpcService" />
+
+  <bean id="interVpnLinkListener"
+        class="org.opendaylight.netvirt.vpnmanager.intervpnlink.InterVpnLinkListener"
+        init-method="start" destroy-method="close">
+    <argument ref="dataBroker" />
+    <argument ref="idManagerService" />
+    <argument ref="mdsalUtils" />
+    <argument ref="bgpmanager" />
+    <argument ref="notificationPublishService" />
+  </bean>
+
+  <bean id="interVpnLinkNodeListener"
+        class="org.opendaylight.netvirt.vpnmanager.intervpnlink.InterVpnLinkNodeListener"
+        init-method="start" destroy-method="close">
+    <argument ref="dataBroker" />
+    <argument ref="mdsalUtils" />
+  </bean>
+</blueprint>
diff --git a/vpnservice/vpnmanager/vpnmanager-impl/src/main/yang/vpnservice-impl.yang b/vpnservice/vpnmanager/vpnmanager-impl/src/main/yang/vpnservice-impl.yang
deleted file mode 100644 (file)
index 46f703e..0000000
+++ /dev/null
@@ -1,80 +0,0 @@
-module vpnservice-impl {
-    yang-version 1;
-    namespace "urn:opendaylight:params:xml:ns:yang:vpnservice:impl";
-    prefix "vpnservice-impl";
-
-    import config { prefix config; revision-date 2013-04-05; }
-    import opendaylight-md-sal-binding { prefix md-sal-binding; revision-date 2013-10-28;}
-    import opendaylight-sal-binding-broker-impl { prefix md-sal-binding-impl; revision-date 2013-10-28;}
-    import bgpmanager-api { prefix bgpmgr-api; revision-date 2015-04-20;}
-    import vpnmanager-api { prefix vpnmgr-api; revision-date 2015-05-08;}
-    import odl-mdsalutil { prefix odl-mdsal; revision-date 2016-04-06;}
-
-    description
-        "Service definition for vpnservice project";
-
-    revision "2015-02-16" {
-        description
-            "Initial revision";
-    }
-
-    identity vpnservice-impl {
-        base config:module-type;
-        config:provided-service vpnmgr-api:vpnmanager-api;
-        config:java-name-prefix VpnserviceImpl;
-    }
-
-    augment "/config:modules/config:module/config:configuration" {
-        case vpnservice-impl {
-            when "/config:modules/config:module/config:type = 'vpnservice-impl'";
-            container broker {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity md-sal-binding:binding-broker-osgi-registry;
-                    }
-                }
-            }
-            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 {
-                        mandatory true;
-                        config:required-identity bgpmgr-api:bgpmanager-api;
-                    }
-                }
-            }
-            container mdsalutil {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity odl-mdsal:odl-mdsalutil;
-                    }
-                }
-            }
-            container notification-service {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity md-sal-binding-impl:binding-new-notification-service;
-                    }
-                }
-            }
-            container notification-publish-service {
-                uses config:service-ref {
-                    refine type {
-                        mandatory true;
-                        config:required-identity md-sal-binding-impl:binding-new-notification-publish-service;
-                    }
-                }
-            }
-        }
-    }
-}
index 1ef3a63ab8089696ced74e68341294df2fc09b48..7299973b3765363b7047b3dfaf8b82ac81fab319 100644 (file)
@@ -19,7 +19,6 @@ import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.DataChangeListener;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.netvirt.vpnmanager.VpnManager;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.vpntargets.VpnTarget;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.vpntargets.VpnTargetBuilder;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.vpntargets.VpnTargetKey;
@@ -31,7 +30,6 @@ import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev14081
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.*;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.*;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.apply.label.apply.label.mode.*;
-import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.apply.label.ApplyLabelMode;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.af.config.ApplyLabelBuilder;
 import org.opendaylight.yang.gen.v1.urn.huawei.params.xml.ns.yang.l3vpn.rev140815.vpn.instances.vpn.instance.Ipv4FamilyBuilder;
 
@@ -78,7 +76,6 @@ public class VpnServiceTest {
         VpnInstanceBuilder builder = new VpnInstanceBuilder().setKey(new VpnInstanceKey("Vpn1")).setIpv4Family
                 (ipv4Family);
         VpnInstance instance = builder.build();
-        VpnManager vpnManager = new VpnManager(dataBroker, bgpManager);
         event.created.put(createVpnId("Vpn1"), instance);
         //TODO: Need to enhance the test case to handle ds read/write ops
         //vpnManager.onDataChanged(event);
index 061da52417f23565b11d54257b36904cf6e16057..702df896570983265d310f786fc4373b744b4daf 100644 (file)
@@ -24,6 +24,7 @@ import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.genius.interfacemanager.globals.IfmConstants;
+import org.opendaylight.netvirt.vpnmanager.SubnetOpDpnManager;
 import org.opendaylight.netvirt.vpnmanager.VpnInterfaceManager;
 import org.opendaylight.netvirt.vpnmanager.VpnSubnetRouteHandler;
 import org.opendaylight.netvirt.vpnmanager.utilities.InterfaceUtils;
@@ -172,9 +173,9 @@ public class VpnSubnetRouteHandlerTest {
     @Mock ReadOnlyTransaction mockReadTx;
     @Mock WriteTransaction mockWriteTx;
     @Mock IBgpManager bgpManager;
-    @Mock
-    VpnInterfaceManager vpnInterfaceManager;
+    @Mock VpnInterfaceManager vpnInterfaceManager;
     @Mock IdManagerService idManager;
+    @Mock SubnetOpDpnManager subnetOpDpnManager;
 
     VpnSubnetRouteHandler vpnSubnetRouteHandler;
 
@@ -201,9 +202,10 @@ public class VpnSubnetRouteHandlerTest {
                 .thenReturn(dataChangeListenerRegistration);
         setupMocks();
 
-        vpnSubnetRouteHandler = new VpnSubnetRouteHandler(dataBroker, bgpManager, vpnInterfaceManager);
-        vpnSubnetRouteHandler.setIdManager(idManager);
-        Future<RpcResult<AllocateIdOutput>> idOutputOptional = RpcResultBuilder.success(allocateIdOutput).buildFuture();
+        vpnSubnetRouteHandler = new VpnSubnetRouteHandler(dataBroker, subnetOpDpnManager, bgpManager,
+                vpnInterfaceManager, idManager);
+        Future<RpcResult<AllocateIdOutput>> idOutputOptional =
+                RpcResultBuilder.success(allocateIdOutput).buildFuture();
 
         optionalIfState = Optional.of(stateInterface);
         optionalSubs = Optional.of(subnetOp);
@@ -311,7 +313,6 @@ public class VpnSubnetRouteHandlerTest {
         doReturn(mockReadTx).when(dataBroker).newReadOnlyTransaction();
         doReturn(mockWriteTx).when(dataBroker).newWriteOnlyTransaction();
         doReturn(Futures.immediateCheckedFuture(null)).when(mockWriteTx).submit();
-
     }
 
     @Test