Migrate sfc-ovs listeners to Genius' Listeners framework 40/65640/2
authorDavid Suarez <[email protected]>
Thu, 16 Nov 2017 20:23:53 +0000 (21:23 +0100)
committerBrady Johnson <[email protected]>
Fri, 17 Nov 2017 21:32:43 +0000 (21:32 +0000)
Change-Id: I02019c49787c45cd45d3d27d089e5bc0a140416d
Signed-off-by: David Suarez <[email protected]>
sfc-ovs/pom.xml
sfc-ovs/src/main/java/org/opendaylight/sfc/ovs/listener/SfcOvsNodeDataListener.java
sfc-ovs/src/main/java/org/opendaylight/sfc/ovs/listener/SfcOvsSffEntryDataListener.java
sfc-ovs/src/main/resources/org/opendaylight/blueprint/sfc-ovs.xml
sfc-ovs/src/test/java/org/opendaylight/sfc/ovs/listener/SfcOvsNodeDataListenerTest.java
sfc-ovs/src/test/java/org/opendaylight/sfc/ovs/listener/SfcOvsSffEntryDataListenerTest.java
sfc-ovs/src/test/java/org/opendaylight/sfc/sfc_ovs/provider/listener/SfcOvsSffEntryDataListenerTest.java

index d3c709bf98dddb94c56b31169eb4f9b54cef00f0..df0c9cabf6a67166a034e3837f8f235f0eac9892 100644 (file)
 
   <build>
     <plugins>
+      <plugin>
+        <groupId>org.apache.aries.blueprint</groupId>
+        <artifactId>blueprint-maven-plugin</artifactId>
+        <configuration>
+          <scanPaths>
+            <scanPath>org.opendaylight.sfc.ovs</scanPath>
+          </scanPaths>
+        </configuration>
+      </plugin>
       <plugin>
         <groupId>org.apache.felix</groupId>
         <artifactId>maven-bundle-plugin</artifactId>
index 18228df3df42da4584bbcf9cb97667ecfcceeef3..5648293fd719b3609ecc313d8afeef586bb2de77 100755 (executable)
 package org.opendaylight.sfc.ovs.listener;
 
 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.MoreExecutors;
+import javax.annotation.Nonnull;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
 import org.opendaylight.controller.md.sal.binding.api.ReadTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
+import org.opendaylight.genius.datastoreutils.listeners.AbstractSyncDataTreeChangeListener;
 import org.opendaylight.ovsdb.southbound.SouthboundConstants;
 import org.opendaylight.sfc.ovs.provider.SfcOvsUtil;
-import org.opendaylight.sfc.provider.listeners.AbstractDataTreeChangeListener;
 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.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbNodeAugmentation;
@@ -38,43 +39,27 @@ import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.Topology;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.TopologyKey;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.network.topology.topology.Node;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class SfcOvsNodeDataListener extends AbstractDataTreeChangeListener<Node> {
+@Singleton
+public class SfcOvsNodeDataListener extends AbstractSyncDataTreeChangeListener<Node> {
+
     private static final Logger LOG = LoggerFactory.getLogger(SfcOvsNodeDataListener.class);
+
     private final DataBroker dataBroker;
-    private ListenerRegistration<SfcOvsNodeDataListener> listenerRegistration;
 
+    @Inject
     public SfcOvsNodeDataListener(final DataBroker dataBroker) {
+        super(dataBroker, LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(NetworkTopology.class)
+                .child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID))
+                .child(Node.class));
         this.dataBroker = dataBroker;
     }
 
-    public void init() {
-        LOG.debug("Initializing...");
-        registerListeners();
-    }
-
-    private void registerListeners() {
-        final DataTreeIdentifier<Node> treeId = new DataTreeIdentifier<>(LogicalDatastoreType.OPERATIONAL,
-                InstanceIdentifier.create(NetworkTopology.class)
-                        .child(Topology.class, new TopologyKey(SouthboundConstants.OVSDB_TOPOLOGY_ID))
-                        .child(Node.class));
-        listenerRegistration = dataBroker.registerDataTreeChangeListener(treeId, this);
-    }
-
-    @Override
-    public void close() throws Exception {
-        LOG.debug("Closing listener...");
-        if (listenerRegistration != null) {
-            listenerRegistration.close();
-        }
-    }
-
     @Override
-    protected void add(Node createdNode) {
+    public void add(@Nonnull Node node) {
         /*
          * NODE CREATION When user puts SFF into config DS, reading from
          * topology is involved to write OVSDB bridge and termination point
@@ -82,17 +67,15 @@ public class SfcOvsNodeDataListener extends AbstractDataTreeChangeListener<Node>
          * might put SFF into config DS before topology in operational DS gets
          * populated.
          */
+        LOG.debug("Created OVS Node: {}", node.toString());
 
-        LOG.debug("\nCreated OVS Node: {}", createdNode.toString());
-
-        OvsdbNodeAugmentation ovsdbNodeAugmentation = createdNode.getAugmentation(OvsdbNodeAugmentation.class);
+        OvsdbNodeAugmentation ovsdbNodeAugmentation = node.getAugmentation(OvsdbNodeAugmentation.class);
         if (ovsdbNodeAugmentation != null) {
             final ConnectionInfo connectionInfo = ovsdbNodeAugmentation.getConnectionInfo();
             if (connectionInfo != null) {
-                CheckedFuture<Optional<ServiceFunctionForwarders>, ReadFailedException>
-                    exitsingSffs = readServiceFunctionForwarders();
-                Futures.addCallback(exitsingSffs, new FutureCallback<Optional<ServiceFunctionForwarders>>() {
+                ListenableFuture<Optional<ServiceFunctionForwarders>> exitsingSffs = readServiceFunctionForwarders();
 
+                Futures.addCallback(exitsingSffs, new FutureCallback<Optional<ServiceFunctionForwarders>>() {
                     @Override
                     public void onSuccess(Optional<ServiceFunctionForwarders> optionalSffs) {
                         if (optionalSffs != null && optionalSffs.isPresent()) {
@@ -116,7 +99,7 @@ public class SfcOvsNodeDataListener extends AbstractDataTreeChangeListener<Node>
     }
 
     @Override
-    protected void remove(Node deletedNode) {
+    public void remove(@Nonnull Node node) {
         /*
          * NODE UPDATE and NODE DELETE This case would mean, that user has
          * modified vSwitch state directly by ovs command, which is not handled
@@ -125,7 +108,7 @@ public class SfcOvsNodeDataListener extends AbstractDataTreeChangeListener<Node>
     }
 
     @Override
-    protected void update(Node originalNode, Node updatedNode) {
+    public void update(@Nonnull Node originalNode, @Nonnull Node updatedNode) {
         /*
          * NODE UPDATE and NODE DELETE This case would mean, that user has
          * modified vSwitch state directly by ovs command, which is not handled
@@ -133,11 +116,10 @@ public class SfcOvsNodeDataListener extends AbstractDataTreeChangeListener<Node>
          */
     }
 
-    private CheckedFuture<Optional<ServiceFunctionForwarders>, ReadFailedException> readServiceFunctionForwarders() {
+    private ListenableFuture<Optional<ServiceFunctionForwarders>> readServiceFunctionForwarders() {
         ReadTransaction transaction = dataBroker.newReadOnlyTransaction();
         InstanceIdentifier<ServiceFunctionForwarders> sffIid = InstanceIdentifier
                 .builder(ServiceFunctionForwarders.class).build();
         return transaction.read(LogicalDatastoreType.CONFIGURATION, sffIid);
     }
-
 }
index a04994b23c7dadd99c35763bcc6dd48d222e6615..5852adf444c75c58c72b71dceac72963b9d4ffb5 100755 (executable)
 package org.opendaylight.sfc.ovs.listener;
 
 import java.util.List;
+import javax.annotation.Nonnull;
+import javax.inject.Singleton;
 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.genius.datastoreutils.listeners.AbstractSyncDataTreeChangeListener;
 import org.opendaylight.sfc.ovs.api.SfcSffToOvsMappingAPI;
 import org.opendaylight.sfc.ovs.provider.SfcOvsUtil;
-import org.opendaylight.sfc.provider.listeners.AbstractDataTreeChangeListener;
 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.rev140701.ServiceFunctionForwarders;
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev140701.service.function.forwarder.base.SffDataPlaneLocator;
@@ -30,57 +31,36 @@ import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sff.rev1407
 import org.opendaylight.yang.gen.v1.urn.cisco.params.xml.ns.yang.sfc.sl.rev140701.VxlanGpe;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.ovsdb.rev150105.OvsdbBridgeAugmentation;
 import org.opendaylight.yang.gen.v1.urn.tbd.params.xml.ns.yang.network.topology.rev131021.NodeId;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class SfcOvsSffEntryDataListener extends AbstractDataTreeChangeListener<ServiceFunctionForwarder> {
+@Singleton
+public class SfcOvsSffEntryDataListener extends AbstractSyncDataTreeChangeListener<ServiceFunctionForwarder> {
 
     private static final Logger LOG = LoggerFactory.getLogger(SfcOvsSffEntryDataListener.class);
-    private final DataBroker dataBroker;
-    private ListenerRegistration<SfcOvsSffEntryDataListener> listenerRegistration;
 
     public SfcOvsSffEntryDataListener(final DataBroker dataBroker) {
-        this.dataBroker = dataBroker;
-    }
-
-    public void init() {
-        LOG.debug("Initializing...");
-        registerListeners();
-    }
-
-    private void registerListeners() {
-        final DataTreeIdentifier<ServiceFunctionForwarder> treeId = new DataTreeIdentifier<>(
-                LogicalDatastoreType.CONFIGURATION,
-                InstanceIdentifier.create(ServiceFunctionForwarders.class).child(ServiceFunctionForwarder.class));
-        listenerRegistration = dataBroker.registerDataTreeChangeListener(treeId, this);
+        super(dataBroker, LogicalDatastoreType.CONFIGURATION,
+              InstanceIdentifier.create(ServiceFunctionForwarders.class).child(ServiceFunctionForwarder.class));
     }
 
     @Override
-    public void close() throws Exception {
-        LOG.debug("Closing listener...");
-        if (listenerRegistration != null) {
-            listenerRegistration.close();
-        }
-    }
-
-    @Override
-    protected void add(ServiceFunctionForwarder serviceFunctionForwarder) {
-        LOG.info("\nCreated Service Function Forwarder: {}", serviceFunctionForwarder.toString());
+    public void add(@Nonnull ServiceFunctionForwarder serviceFunctionForwarder) {
+        LOG.info("Created Service Function Forwarder: {}", serviceFunctionForwarder.toString());
         // add augmentations for serviceFunctionForwarder
         addOvsdbAugmentations(serviceFunctionForwarder);
     }
 
     @Override
-    protected void remove(ServiceFunctionForwarder deletedServiceFunctionForwarder) {
-        LOG.info("\nDeleted Service Function Forwarder: {}", deletedServiceFunctionForwarder.toString());
+    public void remove(@Nonnull ServiceFunctionForwarder deletedServiceFunctionForwarder) {
+        LOG.info("Deleted Service Function Forwarder: {}", deletedServiceFunctionForwarder.toString());
         deleteOvsdbAugmentations(deletedServiceFunctionForwarder);
     }
 
     @Override
-    protected void update(ServiceFunctionForwarder originalServiceFunctionForwarder,
-            ServiceFunctionForwarder updatedServiceFunctionForwarder) {
+    public void update(@Nonnull ServiceFunctionForwarder originalServiceFunctionForwarder,
+                       @Nonnull ServiceFunctionForwarder updatedServiceFunctionForwarder) {
         // Notice: Adding an SffDpl to an existing SFF will trigger this
         // listener, not a separate SffDplListener
         // which means 2 different listeners are not needed. This was tested
@@ -92,7 +72,7 @@ public class SfcOvsSffEntryDataListener extends AbstractDataTreeChangeListener<S
         // -X PUT --user admin:admin
         // http://localhost:${PORT}/restconf/config/service-function-forwarder:service-function-forwarders/service-function-forwarder/sff1/sff-data-plane-locator/vxgpe1
 
-        LOG.info("\nModified Service Function Forwarder : {}", updatedServiceFunctionForwarder.toString());
+        LOG.info("Modified Service Function Forwarder : {}", updatedServiceFunctionForwarder.toString());
         // rewrite augmentations for serviceFunctionForwarder
         addOvsdbAugmentations(updatedServiceFunctionForwarder);
     }
@@ -103,8 +83,7 @@ public class SfcOvsSffEntryDataListener extends AbstractDataTreeChangeListener<S
      * @param sff
      *            ServiceFunctionForwarder Object.
      */
-    static void addOvsdbAugmentations(ServiceFunctionForwarder sff) {
-
+    public static void addOvsdbAugmentations(ServiceFunctionForwarder sff) {
         OvsdbBridgeAugmentation ovsdbBridge = SfcSffToOvsMappingAPI.buildOvsdbBridgeAugmentation(sff);
 
         if (ovsdbBridge != null) {
@@ -122,17 +101,14 @@ public class SfcOvsSffEntryDataListener extends AbstractDataTreeChangeListener<S
      * @param sff
      *            ServiceFunctionForwarder Object.
      */
-    private static void deleteOvsdbAugmentations(ServiceFunctionForwarder sff) {
-
+    private void deleteOvsdbAugmentations(ServiceFunctionForwarder sff) {
         // Since in most cases, the OvsdbNode was not created by SFC, lets not
         // delete it
-
         // Iterate the SFF DPLs and delete the VXGPE port
         final List<SffDataPlaneLocator> sffDataPlaneLocatorList = sff.getSffDataPlaneLocator();
         if (sffDataPlaneLocatorList == null || sffDataPlaneLocatorList.isEmpty()) {
             return;
         }
-
         NodeId ovsdbBridgeNodeId = SfcOvsUtil.getOvsdbAugmentationNodeIdBySff(sff);
         for (SffDataPlaneLocator sffDpl : sffDataPlaneLocatorList) {
             // Only delete the port if this SFF is OVS augmented and the
@@ -145,6 +121,5 @@ public class SfcOvsSffEntryDataListener extends AbstractDataTreeChangeListener<S
                         SfcOvsUtil.buildOvsdbTerminationPointIID(ovsdbBridgeNodeId, sffDpl.getName().getValue()));
             }
         }
-
     }
 }
index d6c7fdf9420aa7e2cc207bc8806996ae0c21ebaa..e45119a400bf7cbe65a7edefb8fb43ac5f7bae41 100644 (file)
@@ -1,26 +1,14 @@
 <?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">
+           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="dataBroker"
+               interface="org.opendaylight.controller.md.sal.binding.api.DataBroker"
+               odl:type="default"/>
 
- <bean id="sfcOvsRpc" class="org.opendaylight.sfc.ovs.provider.SfcOvsRpc" destroy-method="close"/>
   <bean id="sfcOvsRpc" class="org.opendaylight.sfc.ovs.provider.SfcOvsRpc" destroy-method="close"/>
 
-  <odl:rpc-implementation ref="sfcOvsRpc"/>
-
-  <bean id="sfcOvsNodeDataListener"
-    class="org.opendaylight.sfc.ovs.listener.SfcOvsNodeDataListener"
-    init-method="init" destroy-method="close">
-    <argument ref="dataBroker"/>
-  </bean>
-
-  <bean id="sfcOvsSffEntryDataListener"
-    class="org.opendaylight.sfc.ovs.listener.SfcOvsSffEntryDataListener"
-    init-method="init" destroy-method="close">
-    <argument ref="dataBroker"/>
-  </bean>
+    <odl:rpc-implementation ref="sfcOvsRpc"/>
 
 </blueprint>
index 3f01c1bf5805ebd626a9f3b7dee88411c1aee406..892e473b8f51cde16c869e968e6b509ab5b88962 100644 (file)
@@ -87,9 +87,6 @@ public class SfcOvsNodeDataListenerTest extends AbstractDataStoreManager {
         dataTreeModification = mock(DataTreeModification.class);
         dataObjectModification = mock(DataObjectModification.class);
         sfcOvsNodeDataListener = new SfcOvsNodeDataListener(getDataBroker());
-        // Dont initialize it since the listener may launch when we're not ready
-        // yet
-        // sfcOvsNodeDataListener.init();
     }
 
     @After
index ca788e3b1c359177953e44fd19b089a7213281ec..d5ca9a0dc51dd40fbb92bf51bd48265918b2d0da 100644 (file)
@@ -86,7 +86,6 @@ public class SfcOvsSffEntryDataListenerTest extends AbstractDataStoreManager {
         dataTreeModification = mock(DataTreeModification.class);
         dataObjectModification = mock(DataObjectModification.class);
         sfcOvsSffEntryDataListener = new SfcOvsSffEntryDataListener(getDataBroker());
-        sfcOvsSffEntryDataListener.init();
     }
 
     @After
index 1c53190e9a7226d19420f462bc2982504339a58f..27dce01e0f514192965eb9a0510b2ce9f63f6055 100644 (file)
@@ -87,7 +87,6 @@ public class SfcOvsSffEntryDataListenerTest extends AbstractDataStoreManager {
         dataTreeModification = mock(DataTreeModification.class);
         dataObjectModification = mock(DataObjectModification.class);
         sfcOvsSffEntryDataListener = new SfcOvsSffEntryDataListener(getDataBroker());
-        sfcOvsSffEntryDataListener.init();
     }
 
     @After