Do not use RpcService in learning-switch 39/108239/15
authorlubos-cicut <lubos.cicut@pantheon.tech>
Tue, 3 Oct 2023 19:49:33 +0000 (21:49 +0200)
committerRobert Varga <nite@hq.sk>
Wed, 7 Feb 2024 08:03:41 +0000 (08:03 +0000)
Use simple RPCs instead of rolled-up RpcServices. Also ditch blueprint
as our dependencies have changed.

JIRA: OPNFLWPLUG-1112
JIRA: OPNFLWPLUG-1125
Change-Id: I76f7a4de09c9eb66cc9d4cd4704485c7a0dac36d
Signed-off-by: lubos-cicut <lubos.cicut@pantheon.tech>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
samples/learning-switch/pom.xml
samples/learning-switch/src/main/java/org/opendaylight/openflowplugin/learningswitch/LearningSwitchHandlerSimpleImpl.java
samples/learning-switch/src/main/java/org/opendaylight/openflowplugin/learningswitch/LearningSwitchManager.java [deleted file]
samples/learning-switch/src/main/java/org/opendaylight/openflowplugin/learningswitch/LearningSwitchManagerSimpleImpl.java
samples/learning-switch/src/main/java/org/opendaylight/openflowplugin/learningswitch/WakeupOnNode.java
samples/learning-switch/src/main/java/org/opendaylight/openflowplugin/learningswitch/multi/LearningSwitchManagerMultiImpl.java
samples/learning-switch/src/main/java/org/opendaylight/openflowplugin/learningswitch/multi/MultipleLearningSwitchHandlerFacadeImpl.java
samples/learning-switch/src/main/resources/OSGI-INF/blueprint/learning-switch.xml [deleted file]

index d4a82d4b4782baeaf414e1e34b96c7a66e24095d..e406627be6d7a783d3176fa85cd7341f2b33c5df 100644 (file)
     <artifactId>learning-switch</artifactId>
     <packaging>bundle</packaging>
 
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <extensions>true</extensions>
-            </plugin>
-        </plugins>
-    </build>
     <dependencies>
         <dependency>
-            <groupId>org.opendaylight.openflowplugin.model</groupId>
-            <artifactId>model-flow-base</artifactId>
+            <groupId>com.guicedee.services</groupId>
+            <artifactId>javax.inject</artifactId>
+            <optional>true</optional>
         </dependency>
         <dependency>
-            <groupId>org.opendaylight.openflowplugin.model</groupId>
-            <artifactId>model-flow-service</artifactId>
+            <groupId>jakarta.annotation</groupId>
+            <artifactId>jakarta.annotation-api</artifactId>
+            <optional>true</optional>
         </dependency>
         <dependency>
-            <groupId>org.opendaylight.openflowplugin.model</groupId>
-            <artifactId>model-inventory</artifactId>
+            <groupId>org.opendaylight.infrautils</groupId>
+            <artifactId>infrautils-util</artifactId>
         </dependency>
         <dependency>
             <groupId>org.opendaylight.mdsal</groupId>
             <artifactId>openflowplugin-api</artifactId>
         </dependency>
         <dependency>
-            <groupId>org.opendaylight.infrautils</groupId>
-            <artifactId>infrautils-util</artifactId>
+            <groupId>org.opendaylight.openflowplugin.model</groupId>
+            <artifactId>model-flow-base</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.openflowplugin.model</groupId>
+            <artifactId>model-flow-service</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.opendaylight.openflowplugin.model</groupId>
+            <artifactId>model-inventory</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.osgi</groupId>
+            <artifactId>org.osgi.service.component.annotations</artifactId>
         </dependency>
     </dependencies>
 </project>
index 2ba8d1eea9d0711cc5f40dd49177b440c0c89d67..df66da9719e558c5f7694a7d19f0cc7264f3f15c 100644 (file)
@@ -7,12 +7,13 @@
  */
 package org.opendaylight.openflowplugin.learningswitch;
 
+import static java.util.Objects.requireNonNull;
+
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
-import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.atomic.AtomicLong;
 import org.eclipse.jdt.annotation.NonNull;
@@ -34,9 +35,8 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.No
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.node.NodeConnectorKey;
 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.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.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacket;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacketInputBuilder;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.common.Uint16;
@@ -49,14 +49,13 @@ import org.slf4j.LoggerFactory;
  * Simple Learning Switch implementation which does mac learning for one switch.
  */
 public class LearningSwitchHandlerSimpleImpl implements LearningSwitchHandler, Listener<PacketReceived> {
-
     private static final Logger LOG = LoggerFactory.getLogger(LearningSwitchHandlerSimpleImpl.class);
     private static final byte[] ETH_TYPE_IPV4 = new byte[] { 0x08, 0x00 };
     private static final Uint16 DIRECT_FLOW_PRIORITY = Uint16.valueOf(512);
 
     private final DataTreeChangeListenerRegistrationHolder registrationPublisher;
     private final FlowCommitWrapper dataStoreAccessor;
-    private final PacketProcessingService packetProcessingService;
+    private final TransmitPacket transmitPacket;
 
     private volatile boolean isLearning = false;
 
@@ -70,16 +69,16 @@ public class LearningSwitchHandlerSimpleImpl implements LearningSwitchHandler, L
     private Map<MacAddress, NodeConnectorRef> mac2portMapping;
     private final Set<String> coveredMacPaths = new HashSet<>();
 
-    public LearningSwitchHandlerSimpleImpl(@NonNull FlowCommitWrapper dataStoreAccessor,
-            @NonNull PacketProcessingService packetProcessingService,
-            @Nullable DataTreeChangeListenerRegistrationHolder registrationPublisher) {
-        this.dataStoreAccessor = Objects.requireNonNull(dataStoreAccessor);
-        this.packetProcessingService = Objects.requireNonNull(packetProcessingService);
+    public LearningSwitchHandlerSimpleImpl(final @NonNull FlowCommitWrapper dataStoreAccessor,
+            final @NonNull TransmitPacket transmitPacket,
+            final @Nullable DataTreeChangeListenerRegistrationHolder registrationPublisher) {
+        this.dataStoreAccessor = requireNonNull(dataStoreAccessor);
+        this.transmitPacket = requireNonNull(transmitPacket);
         this.registrationPublisher = registrationPublisher;
     }
 
     @Override
-    public synchronized void onSwitchAppeared(InstanceIdentifier<Table> appearedTablePath) {
+    public synchronized void onSwitchAppeared(final InstanceIdentifier<Table> appearedTablePath) {
         if (isLearning) {
             LOG.debug("already learning a node, skipping {}", nodeId.getValue());
             return;
@@ -116,7 +115,7 @@ public class LearningSwitchHandlerSimpleImpl implements LearningSwitchHandler, L
     }
 
     @Override
-    public void onNotification(PacketReceived notification) {
+    public void onNotification(final PacketReceived notification) {
         if (!isLearning) {
             // ignoring packets - this should not happen
             return;
@@ -174,10 +173,10 @@ public class LearningSwitchHandlerSimpleImpl implements LearningSwitchHandler, L
             // non IPv4 package
             flood(notification.getPayload(), notification.getIngress());
         }
-
     }
 
-    private void addBridgeFlow(MacAddress srcMac, MacAddress dstMac, NodeConnectorRef destNodeConnector) {
+    private void addBridgeFlow(final MacAddress srcMac, final MacAddress dstMac,
+            final NodeConnectorRef destNodeConnector) {
         synchronized (coveredMacPaths) {
             String macPath = srcMac.toString() + dstMac.toString();
             if (!coveredMacPaths.contains(macPath)) {
@@ -202,7 +201,7 @@ public class LearningSwitchHandlerSimpleImpl implements LearningSwitchHandler, L
         }
     }
 
-    private void flood(byte[] payload, NodeConnectorRef ingress) {
+    private void flood(final byte[] payload, final NodeConnectorRef ingress) {
         NodeConnectorKey nodeConnectorKey = new NodeConnectorKey(nodeConnectorId("0xfffffffb"));
         InstanceIdentifier<?> nodeConnectorPath = InstanceIdentifierUtils.createNodeConnectorPath(
                 nodePath, nodeConnectorKey);
@@ -211,20 +210,18 @@ public class LearningSwitchHandlerSimpleImpl implements LearningSwitchHandler, L
         sendPacketOut(payload, ingress, egressConnectorRef);
     }
 
-    private NodeConnectorId nodeConnectorId(String connectorId) {
+    private NodeConnectorId nodeConnectorId(final String connectorId) {
         NodeKey nodeKey = nodePath.firstKeyOf(Node.class);
         StringBuilder stringId = new StringBuilder(nodeKey.getId().getValue()).append(":").append(connectorId);
         return new NodeConnectorId(stringId.toString());
     }
 
-    private void sendPacketOut(byte[] payload, NodeConnectorRef ingress, NodeConnectorRef egress) {
-        InstanceIdentifier<Node> egressNodePath = InstanceIdentifierUtils.getNodePath(egress.getValue());
-        TransmitPacketInput input = new TransmitPacketInputBuilder()
-                .setPayload(payload)
-                .setNode(new NodeRef(egressNodePath))
-                .setEgress(egress)
-                .setIngress(ingress)
-                .build();
-        LoggingFutures.addErrorLogging(packetProcessingService.transmitPacket(input), LOG, "transmitPacket");
+    private void sendPacketOut(final byte[] payload, final NodeConnectorRef ingress, final NodeConnectorRef egress) {
+        LoggingFutures.addErrorLogging(transmitPacket.invoke(new TransmitPacketInputBuilder()
+            .setPayload(payload)
+            .setNode(new NodeRef(InstanceIdentifierUtils.getNodePath(egress.getValue())))
+            .setEgress(egress)
+            .setIngress(ingress)
+            .build()), LOG, "transmitPacket");
     }
 }
diff --git a/samples/learning-switch/src/main/java/org/opendaylight/openflowplugin/learningswitch/LearningSwitchManager.java b/samples/learning-switch/src/main/java/org/opendaylight/openflowplugin/learningswitch/LearningSwitchManager.java
deleted file mode 100644 (file)
index 005e294..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2014 Cisco Systems, Inc. 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.openflowplugin.learningswitch;
-
-import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.NotificationService;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
-
-public interface LearningSwitchManager {
-
-    /**
-     * Stops this manager.
-     */
-    void stop();
-
-    /**
-     * Starts this manager.
-     */
-    void start();
-
-    /**
-     * Set's Data Broker dependency.
-     *
-     * <p>
-     * Data Broker is used to access overall operational and configuration tree.
-     *
-     * <p>
-     * In simple Learning Switch handler, data broker is used to listen
-     * for changes in Openflow tables and to configure flows which will
-     * be provisioned down to the Openflow switch.
-     *
-     * <p>
-     * inject {@link DataBroker}
-     */
-    void setDataBroker(DataBroker data);
-
-    /**
-     * Set's Packet Processing dependency.
-     *
-     * <p>
-     * Packet Processing service is used to send packet Out on Openflow switch.
-     *
-     * <p>
-     * inject {@link PacketProcessingService}
-     */
-    void setPacketProcessingService(
-            PacketProcessingService packetProcessingService);
-
-    /**
-     * Set's Notification service dependency.
-     *
-     * <p>
-     * Notification service is used to register for listening packet-in notifications.
-     *
-     * <p>
-     * inject {@link NotificationService}
-     */
-    void setNotificationService(NotificationService notificationService);
-}
index 26c582bbc65706e46e646aefb2f4e56deb8954c7..d4d32234ef1e0aeb57142e04ed7d319ae3775d9a 100644 (file)
@@ -11,13 +11,14 @@ import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.api.NotificationService;
+import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
 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.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.TransmitPacket;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
@@ -33,81 +34,35 @@ import org.slf4j.LoggerFactory;
  * corresponding MACs)</li>
  * </ul>
  */
-public class LearningSwitchManagerSimpleImpl
-        implements DataTreeChangeListenerRegistrationHolder, LearningSwitchManager {
+public final class LearningSwitchManagerSimpleImpl implements DataTreeChangeListenerRegistrationHolder, AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(LearningSwitchManagerSimpleImpl.class);
 
-    private NotificationService notificationService = null;
-    private PacketProcessingService packetProcessingService;
-    private DataBroker data = null;
-    private Registration packetInRegistration = null;
-    private ListenerRegistration<DataTreeChangeListener> dataTreeChangeListenerRegistration = null;
+    private final ListenerRegistration<DataTreeChangeListener> dataTreeChangeListenerRegistration;
+    private final Registration packetInRegistration;
 
-    /**
-     * Sets the NotificationService.
-     *
-     * @param notificationService the notificationService to set
-     */
-    @Override
-    public void setNotificationService(final NotificationService notificationService) {
-        this.notificationService = notificationService;
-    }
-
-    /**
-     * Sets the PacketProcessingService.
-     *
-     * @param packetProcessingService the packetProcessingService to set
-     */
-    @Override
-    public void setPacketProcessingService(
-            final PacketProcessingService packetProcessingService) {
-        this.packetProcessingService = packetProcessingService;
-    }
-
-    /**
-     * Sets the DataBroker.
-     */
-    @Override
-    public void setDataBroker(final DataBroker broker) {
-        data = broker;
-    }
-
-    /**
-     * Starts learning switch.
-     */
-    @Override
-    public void start() {
+    public LearningSwitchManagerSimpleImpl(final DataBroker dataBroker, final NotificationService notificationService,
+            final RpcConsumerRegistry rpcService) {
         LOG.debug("start() -->");
-        FlowCommitWrapper dataStoreAccessor = new FlowCommitWrapperImpl(data);
+        final var dataStoreAccessor = new FlowCommitWrapperImpl(dataBroker);
 
-        LearningSwitchHandlerSimpleImpl learningSwitchHandler = new LearningSwitchHandlerSimpleImpl(dataStoreAccessor,
-                packetProcessingService, this);
+        final var learningSwitchHandler = new LearningSwitchHandlerSimpleImpl(dataStoreAccessor,
+            rpcService.getRpc(TransmitPacket.class), this);
         packetInRegistration = notificationService.registerListener(PacketReceived.class, learningSwitchHandler);
 
-        WakeupOnNode wakeupListener = new WakeupOnNode();
-        wakeupListener.setLearningSwitchHandler(learningSwitchHandler);
-        final InstanceIdentifier<Table> instanceIdentifier = InstanceIdentifier.create(Nodes.class)
+        dataTreeChangeListenerRegistration = dataBroker.registerDataTreeChangeListener(DataTreeIdentifier.create(
+            LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class)
                 .child(Node.class)
                 .augmentation(FlowCapableNode.class)
-                .child(Table.class);
-        final DataTreeIdentifier<Table> dataTreeIdentifier =
-                DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, instanceIdentifier);
-        dataTreeChangeListenerRegistration = data.registerDataTreeChangeListener(dataTreeIdentifier, wakeupListener);
+                .child(Table.class)), new WakeupOnNode(learningSwitchHandler));
         LOG.debug("start() <--");
     }
 
-    /**
-     * Stops the learning switch.
-     */
     @Override
-    public void stop() {
+    public void close() {
         LOG.debug("stop() -->");
         //TODO: remove flow (created in #start())
-
         packetInRegistration.close();
-
         dataTreeChangeListenerRegistration.close();
-
         LOG.debug("stop() <--");
     }
 
index c355cc4f4f4e4ade3ed5016e13f212d02a01237e..2c0719a933031c40648480f66c08d3ce1d813768 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.openflowplugin.learningswitch;
 
+import static java.util.Objects.requireNonNull;
+
 import java.util.Collection;
 import org.opendaylight.mdsal.binding.api.DataObjectModification.ModificationType;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
@@ -19,7 +21,11 @@ import org.slf4j.LoggerFactory;
 public class WakeupOnNode implements DataTreeChangeListener<Table> {
     private static final Logger LOG = LoggerFactory.getLogger(WakeupOnNode.class);
 
-    private LearningSwitchHandler learningSwitchHandler = null;
+    private final LearningSwitchHandler learningSwitchHandler;
+
+    public WakeupOnNode(final LearningSwitchHandler learningSwitchHandler) {
+        this.learningSwitchHandler = requireNonNull(learningSwitchHandler);
+    }
 
     @Override
     public void onDataTreeChanged(final Collection<DataTreeModification<Table>> modifications) {
@@ -38,13 +44,4 @@ public class WakeupOnNode implements DataTreeChangeListener<Table> {
             }
         }
     }
-
-    /**
-     * Sets the LearningSwitchHandler.
-     *
-     * @param learningSwitchHandler the learningSwitchHandler to set
-     */
-    public void setLearningSwitchHandler(final LearningSwitchHandler learningSwitchHandler) {
-        this.learningSwitchHandler = learningSwitchHandler;
-    }
 }
index 7ad5bcea9257c8ec1293b7c6653884f426216793..dfac9825b5fd10f996693971f0884d8ab812d461 100644 (file)
@@ -7,25 +7,31 @@
  */
 package org.opendaylight.openflowplugin.learningswitch.multi;
 
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+import javax.inject.Singleton;
 import org.opendaylight.mdsal.binding.api.DataBroker;
 import org.opendaylight.mdsal.binding.api.DataTreeChangeListener;
 import org.opendaylight.mdsal.binding.api.DataTreeIdentifier;
 import org.opendaylight.mdsal.binding.api.NotificationService;
+import org.opendaylight.mdsal.binding.api.RpcConsumerRegistry;
 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
 import org.opendaylight.openflowplugin.learningswitch.DataTreeChangeListenerRegistrationHolder;
-import org.opendaylight.openflowplugin.learningswitch.FlowCommitWrapper;
 import org.opendaylight.openflowplugin.learningswitch.FlowCommitWrapperImpl;
-import org.opendaylight.openflowplugin.learningswitch.LearningSwitchManager;
 import org.opendaylight.openflowplugin.learningswitch.WakeupOnNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
 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.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.TransmitPacket;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.osgi.service.component.annotations.Activate;
+import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
+import org.osgi.service.component.annotations.Reference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -38,81 +44,42 @@ import org.slf4j.LoggerFactory;
  * corresponding MACs)</li>
  * </ul>
  */
-public class LearningSwitchManagerMultiImpl implements DataTreeChangeListenerRegistrationHolder, LearningSwitchManager {
+@Singleton
+@Component(service = { })
+public final class LearningSwitchManagerMultiImpl implements DataTreeChangeListenerRegistrationHolder, AutoCloseable {
     private static final Logger LOG = LoggerFactory.getLogger(LearningSwitchManagerMultiImpl.class);
 
-    private NotificationService notificationService = null;
-    private PacketProcessingService packetProcessingService;
-    private DataBroker data = null;
-    private Registration packetInRegistration = null;
-    private ListenerRegistration<DataTreeChangeListener> dataTreeChangeListenerRegistration = null;
+    private final ListenerRegistration<DataTreeChangeListener> dataTreeChangeListenerRegistration;
+    private final Registration packetInRegistration;
 
-    /**
-     * Sets the NotificationService.
-     *
-     * @param notificationService the notificationService to set
-     */
-    @Override
-    public void setNotificationService(final NotificationService notificationService) {
-        this.notificationService = notificationService;
-    }
-
-    /**
-     * Sets the PacketProcessingService.
-     *
-     * @param packetProcessingService the packetProcessingService to set
-     */
-    @Override
-    public void setPacketProcessingService(
-            final PacketProcessingService packetProcessingService) {
-        this.packetProcessingService = packetProcessingService;
-    }
-
-    /**
-     * Sets the DataBroker.
-     *
-     * @param broker the data to set
-     */
-    @Override
-    public void setDataBroker(final DataBroker broker) {
-        data = broker;
-    }
-
-    /**
-     * Starts learning switch.
-     */
-    @Override
-    public void start() {
+    @Inject
+    @Activate
+    public LearningSwitchManagerMultiImpl(@Reference final DataBroker dataBroker,
+            @Reference final NotificationService notificationService, @Reference final RpcConsumerRegistry rpcService) {
         LOG.debug("start() -->");
-        FlowCommitWrapper dataStoreAccessor = new FlowCommitWrapperImpl(data);
+        final var dataStoreAccessor = new FlowCommitWrapperImpl(dataBroker);
 
-        PacketInDispatcherImpl packetInDispatcher = new PacketInDispatcherImpl();
-        MultipleLearningSwitchHandlerFacadeImpl learningSwitchHandler = new MultipleLearningSwitchHandlerFacadeImpl(
-                dataStoreAccessor, packetProcessingService, packetInDispatcher);
+        final var packetInDispatcher = new PacketInDispatcherImpl();
+        final var learningSwitchHandler = new MultipleLearningSwitchHandlerFacadeImpl(
+                dataStoreAccessor, rpcService.getRpc(TransmitPacket.class), packetInDispatcher);
         packetInRegistration = notificationService.registerListener(PacketReceived.class, packetInDispatcher);
 
-        WakeupOnNode wakeupListener = new WakeupOnNode();
-        wakeupListener.setLearningSwitchHandler(learningSwitchHandler);
-        final InstanceIdentifier<Table> instanceIdentifier = InstanceIdentifier.create(Nodes.class)
+        dataTreeChangeListenerRegistration = dataBroker.registerDataTreeChangeListener(
+            DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, InstanceIdentifier.create(Nodes.class)
                 .child(Node.class)
                 .augmentation(FlowCapableNode.class)
-                .child(Table.class);
-        final DataTreeIdentifier<Table> dataTreeIdentifier =
-                DataTreeIdentifier.create(LogicalDatastoreType.OPERATIONAL, instanceIdentifier);
-        dataTreeChangeListenerRegistration = data.registerDataTreeChangeListener(dataTreeIdentifier, wakeupListener);
+                .child(Table.class)),
+            new WakeupOnNode(learningSwitchHandler));
         LOG.debug("start() <--");
     }
 
-    /**
-     * Stops learning switch.
-     */
+    @PreDestroy
+    @Deactivate
     @Override
-    public void stop() {
+    public void close() {
         LOG.debug("stop() -->");
         //TODO: remove flow (created in #start())
-
         packetInRegistration.close();
-
         dataTreeChangeListenerRegistration.close();
         LOG.debug("stop() <--");
     }
index d9825e6a9a8eeecaa5b96f3285c3eab7346174a7..10a7b60f4b14266ae7d1d6e19f12934367b23f70 100644 (file)
@@ -7,7 +7,8 @@
  */
 package org.opendaylight.openflowplugin.learningswitch.multi;
 
-import java.util.Objects;
+import static java.util.Objects.requireNonNull;
+
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.openflowplugin.learningswitch.FlowCommitWrapper;
 import org.opendaylight.openflowplugin.learningswitch.InstanceIdentifierUtils;
@@ -15,29 +16,27 @@ import org.opendaylight.openflowplugin.learningswitch.LearningSwitchHandler;
 import org.opendaylight.openflowplugin.learningswitch.LearningSwitchHandlerSimpleImpl;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.tables.Table;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.TransmitPacket;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 public class MultipleLearningSwitchHandlerFacadeImpl implements LearningSwitchHandler {
-
     private static final Logger LOG = LoggerFactory.getLogger(MultipleLearningSwitchHandlerFacadeImpl.class);
-    private final FlowCommitWrapper dataStoreAccessor;
-    private final PacketProcessingService packetProcessingService;
+
+    private final @NonNull FlowCommitWrapper dataStoreAccessor;
+    private final @NonNull TransmitPacket transmitPacket;
     private final PacketInDispatcherImpl packetInDispatcher;
 
-    public MultipleLearningSwitchHandlerFacadeImpl(@NonNull FlowCommitWrapper dataStoreAccessor,
-            @NonNull PacketProcessingService packetProcessingService,
-            @NonNull PacketInDispatcherImpl packetInDispatcher) {
-        this.dataStoreAccessor = Objects.requireNonNull(dataStoreAccessor);
-        this.packetProcessingService = Objects.requireNonNull(packetProcessingService);
-        this.packetInDispatcher = Objects.requireNonNull(packetInDispatcher);
+    public MultipleLearningSwitchHandlerFacadeImpl(final @NonNull FlowCommitWrapper dataStoreAccessor,
+            final @NonNull TransmitPacket transmitPacket, final @NonNull PacketInDispatcherImpl packetInDispatcher) {
+        this.dataStoreAccessor = requireNonNull(dataStoreAccessor);
+        this.transmitPacket = requireNonNull(transmitPacket);
+        this.packetInDispatcher = requireNonNull(packetInDispatcher);
     }
 
-
     @Override
-    public synchronized void onSwitchAppeared(InstanceIdentifier<Table> appearedTablePath) {
+    public synchronized void onSwitchAppeared(final InstanceIdentifier<Table> appearedTablePath) {
         LOG.debug("expected table acquired, learning ..");
 
         /**
@@ -52,8 +51,8 @@ public class MultipleLearningSwitchHandlerFacadeImpl implements LearningSwitchHa
          */
         if (!packetInDispatcher.getHandlerMapping().containsKey(nodePath)) {
             // delegate this node (owning appearedTable) to SimpleLearningSwitchHandler
-            LearningSwitchHandlerSimpleImpl simpleLearningSwitch = new LearningSwitchHandlerSimpleImpl(
-                    dataStoreAccessor, packetProcessingService, null);
+            final var simpleLearningSwitch = new LearningSwitchHandlerSimpleImpl(dataStoreAccessor, transmitPacket,
+                null);
 
             /**
              * We propagate table event to newly instantiated instance of learning switch
diff --git a/samples/learning-switch/src/main/resources/OSGI-INF/blueprint/learning-switch.xml b/samples/learning-switch/src/main/resources/OSGI-INF/blueprint/learning-switch.xml
deleted file mode 100644 (file)
index 0d102ea..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-<?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.mdsal.binding.api.DataBroker"/>
-  <reference id="notificationService" interface="org.opendaylight.mdsal.binding.api.NotificationService"/>
-
-  <odl:rpc-service id="packetProcessingService" interface="org.opendaylight.yang.gen.v1.urn.opendaylight.packet.service.rev130709.PacketProcessingService"/>
-
-  <bean id="learningSwitch" class="org.opendaylight.openflowplugin.learningswitch.multi.LearningSwitchManagerMultiImpl"
-      init-method="start" destroy-method="stop">
-    <property name="dataBroker" ref="dataBroker"/>
-    <property name="notificationService" ref="notificationService"/>
-    <property name="packetProcessingService" ref="packetProcessingService"/>
-  </bean>
-
-</blueprint>