BUG-6976: Migrate BMP collector to use BP wiring 11/57611/6
authorClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Wed, 17 May 2017 14:04:00 +0000 (16:04 +0200)
committerRobert Varga <nite@hq.sk>
Tue, 20 Jun 2017 10:03:06 +0000 (10:03 +0000)
Migrate to BP wiring

Change-Id: I6d7d33029123039d27493b014ae459da1333a77c
Signed-off-by: Claudio D. Gasparini <claudio.gasparini@pantheon.tech>
14 files changed:
bgp/bmp-api/src/main/yang/odl-bmp-monitor-config.yang [new file with mode: 0644]
bgp/bmp-impl/src/main/java/org/opendaylight/controller/config/yang/bmp/impl/BmpMonitorImplModule.java
bgp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/api/BmpDeployer.java [new file with mode: 0644]
bgp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitoringStationImpl.java
bgp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/KeyConstructorUtil.java [new file with mode: 0644]
bgp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerDependencies.java [new file with mode: 0644]
bgp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java [new file with mode: 0644]
bgp/bmp-impl/src/main/resources/org/opendaylight/blueprint/bgp-bmp.xml
bgp/bmp-impl/src/test/java/org/opendaylight/controller/config/yang/bmp/impl/AbstractBmpModuleTest.java [deleted file]
bgp/bmp-impl/src/test/java/org/opendaylight/controller/config/yang/bmp/impl/BmpMonitorImplModuleTest.java [deleted file]
bgp/bmp-impl/src/test/java/org/opendaylight/protocol/bmp/impl/app/BmpMonitorImplTest.java
bgp/bmp-impl/src/test/java/org/opendaylight/protocol/bmp/impl/session/BmpTestSessionListener.java
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/BGPDispatcherImpl.java
concepts/src/main/java/org/opendaylight/protocol/concepts/KeyMapping.java

diff --git a/bgp/bmp-api/src/main/yang/odl-bmp-monitor-config.yang b/bgp/bmp-api/src/main/yang/odl-bmp-monitor-config.yang
new file mode 100644 (file)
index 0000000..dae806d
--- /dev/null
@@ -0,0 +1,74 @@
+module odl-bmp-monitor-config {
+    yang-version 1;
+    namespace "urn:opendaylight:params:xml:ns:yang:bmp-monitor-config";
+    prefix bmp-monitor-config;
+
+    import ietf-inet-types { prefix inet; revision-date 2013-07-15; }
+    import rfc2385 { prefix rfc2385; revision-date 2016-03-24; }
+    import bmp-monitor { prefix bmp-monitor; revision-date 2015-05-12; }
+
+    description
+        "This module contains the base YANG definitions for
+         BMP Monitor Configuration.
+         Copyright (c) 2017 Pantheon Technologies s.r.o. 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";
+
+    revision "2017-05-17" {
+        description
+            "Initial revision.";
+    }
+
+    grouping server-config {
+        container server {
+            leaf binding-address {
+                type inet:ip-address;
+                default "0.0.0.0";
+            }
+
+            leaf binding-port {
+                type inet:port-number;
+                mandatory true;
+            }
+        }
+    }
+
+    container odl-bmp-monitors {
+        list bmp-monitor-config {
+
+            key "monitor-id";
+            leaf monitor-id {
+                type bmp-monitor:monitor-id;
+            }
+
+            uses server-config;
+
+            list monitored-router {
+                leaf address {
+                    type inet:ip-address;
+                    mandatory true;
+                }
+
+                key "address";
+
+                leaf active {
+                    type boolean;
+                }
+
+                leaf port {
+                    when "../active = 'true'";
+                    type inet:port-number;
+                }
+
+                leaf password {
+                    type rfc2385:rfc2385-key;
+                    description "RFC2385 shared secret";
+                }
+            }
+        }
+    }
+
+}
\ No newline at end of file
index 831246812eb17c116f6206c02f3dec9f265596b2..df75f53082eeabf5f15a0a01acdd8aa860625805 100644 (file)
@@ -8,23 +8,20 @@
 
 package org.opendaylight.controller.config.yang.bmp.impl;
 
-import com.google.common.base.Preconditions;
-import com.google.common.net.InetAddresses;
 import io.netty.util.internal.PlatformDependent;
-import java.nio.charset.StandardCharsets;
 import java.security.AccessControlException;
+import java.util.List;
+import java.util.stream.Collectors;
 import org.opendaylight.controller.config.api.JmxAttributeValidationException;
-import org.opendaylight.controller.sal.core.api.model.SchemaService;
-import org.opendaylight.protocol.bmp.impl.app.BmpMonitoringStationImpl;
-import org.opendaylight.protocol.concepts.KeyMapping;
-import org.opendaylight.protocol.util.Ipv4Util;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IpAddress;
+import org.opendaylight.controller.config.api.osgi.WaitingServiceTracker;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.protocol.bmp.impl.api.BmpDeployer;
+import org.opendaylight.protocol.bmp.impl.spi.BmpMonitoringStation;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.bmp.monitors.BmpMonitorConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.bmp.monitors.BmpMonitorConfigBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.server.config.ServerBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev150512.MonitorId;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.rfc2385.cfg.rev160324.Rfc2385Key;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaContextProvider;
 import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,33 +41,6 @@ public class BmpMonitorImplModule extends org.opendaylight.controller.config.yan
         super(identifier, dependencyResolver, oldModule, oldInstance);
     }
 
-    private String getAddressString(final IpAddress address) {
-        Preconditions.checkArgument(address.getIpv4Address() != null || address.getIpv6Address() != null, "Address %s is invalid", address);
-        if (address.getIpv4Address() != null) {
-            return address.getIpv4Address().getValue();
-        }
-        return address.getIpv6Address().getValue();
-    }
-
-    private KeyMapping constructKeys() {
-        final KeyMapping ret = KeyMapping.getKeyMapping();
-        if (getMonitoredRouter() != null) {
-            for (final MonitoredRouter mr : getMonitoredRouter()) {
-                if (mr.getAddress() == null) {
-                    LOG.warn("Monitored router {} does not have an address skipping it", mr);
-                    continue;
-                }
-                final Rfc2385Key rfc2385KeyPassword = mr.getPassword();
-                if (rfc2385KeyPassword != null && !rfc2385KeyPassword.getValue().isEmpty()) {
-                    final String s = getAddressString(mr.getAddress());
-                    ret.put(InetAddresses.forString(s), rfc2385KeyPassword.getValue().getBytes(StandardCharsets.US_ASCII));
-                }
-            }
-        }
-
-        return ret;
-    }
-
     @Override
     public void customValidation() {
         JmxAttributeValidationException.checkNotNull(getBindingPort(), bindingPortJmxAttribute);
@@ -82,26 +52,45 @@ public class BmpMonitorImplModule extends org.opendaylight.controller.config.yan
 
     @Override
     public java.lang.AutoCloseable createInstance() {
+        final WaitingServiceTracker<BmpDeployer> bgpDeployerTracker = WaitingServiceTracker
+            .create(BmpDeployer.class, this.bundleContext);
+        final BmpDeployer bgpDeployer = bgpDeployerTracker.waitForService(WaitingServiceTracker.FIVE_MINUTES);
+
+        final List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.
+            bmp.monitors.bmp.monitor.config.MonitoredRouter> monitoredRouters = convertBackwarCSS(getMonitoredRouter());
+
+        final BmpMonitorConfig monitorConfig = new BmpMonitorConfigBuilder()
+            .setServer(new ServerBuilder()
+                .setBindingAddress(getBindingAddress())
+                .setBindingPort(getBindingPort()).build())
+            .setMonitorId(new MonitorId(getIdentifier().getInstanceName()))
+            .setMonitoredRouter(monitoredRouters)
+            .build();
         try {
-            return BmpMonitoringStationImpl.createBmpMonitorInstance(getExtensionsDependency(), getBmpDispatcherDependency(),
-                    getDomDataProviderDependency(), new MonitorId(getIdentifier().getInstanceName()),
-                    Ipv4Util.toInetSocketAddress(getBindingAddress(), getBindingPort()),
-                    constructKeys(), getCodecTreeFactoryDependency(), getSchemaProvider(), getMonitoredRouter());
-        } catch(final InterruptedException e) {
-            throw new IllegalStateException("Failed to istantiate BMP application.", e);
+            bgpDeployer.writeBmpMonitor(monitorConfig);
+        } catch (final TransactionCommitFailedException e) {
+            LOG.error("Failed to create BMP Monitor {}.", monitorConfig, e);
         }
+
+        return (BmpMonitoringStation) () -> {
+            bgpDeployer.deleteBmpMonitor(monitorConfig.getMonitorId());
+            bgpDeployerTracker.close();
+        };
     }
 
-    private SchemaContext getSchemaProvider() {
-        if (getDomDataProviderDependency() instanceof SchemaContextProvider) {
-            return ((SchemaContextProvider) getDomDataProviderDependency()).getSchemaContext();
-        }
-        final ServiceReference<SchemaService> serviceRef = this.bundleContext.getServiceReference(SchemaService.class);
-        return this.bundleContext.getService(serviceRef).getGlobalContext();
+    private List<org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.
+        bmp.monitors.bmp.monitor.config.MonitoredRouter> convertBackwarCSS(final List<MonitoredRouter> monitoredRouter) {
+        return monitoredRouter.stream().map(this::convert).collect(Collectors.toList());
+    }
+
+    private org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.
+        bmp.monitors.bmp.monitor.config.MonitoredRouter convert(final MonitoredRouter mr) {
+        return new org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.
+            bmp.monitors.bmp.monitor.config.MonitoredRouterBuilder().setActive(mr.getActive())
+            .setAddress(mr.getAddress()).setPort(mr.getPort()).setPassword(mr.getPassword()).build();
     }
 
     public void setBundleContext(final BundleContext bundleContext) {
         this.bundleContext = bundleContext;
     }
-
 }
diff --git a/bgp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/api/BmpDeployer.java b/bgp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/api/BmpDeployer.java
new file mode 100644 (file)
index 0000000..0d6cf5b
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.protocol.bmp.impl.api;
+
+import com.google.common.annotations.Beta;
+import java.util.concurrent.ExecutionException;
+import javax.annotation.Nonnull;
+import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.bmp.monitors.BmpMonitorConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev150512.MonitorId;
+
+@Beta
+public interface BmpDeployer {
+    /**
+     * Writes BmpMonitorConfig to Config DS
+     *
+     * @param bmpConfig containing bmp Monitor configuration
+     */
+    void writeBmpMonitor(@Nonnull BmpMonitorConfig bmpConfig) throws TransactionCommitFailedException;
+
+    /**
+     * Removes BmpMonitorConfig from Config DS
+     *
+     * @param monitorId Bmp monitor Id
+     */
+    void deleteBmpMonitor(@Nonnull MonitorId monitorId) throws TransactionCommitFailedException;
+}
index 08ba8bfa1c5a56ab1665e653fb8e2a66e74f98d3..370573140df596a5c1ff8c385575e5b0f2ffa3ae 100644 (file)
@@ -8,6 +8,9 @@
 
 package org.opendaylight.protocol.bmp.impl.app;
 
+import static org.opendaylight.protocol.bmp.impl.app.KeyConstructorUtil.constructKeys;
+
+import com.google.common.base.Optional;
 import com.google.common.base.Preconditions;
 import com.google.common.net.InetAddresses;
 import io.netty.channel.Channel;
@@ -16,19 +19,18 @@ import io.netty.channel.ChannelFutureListener;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.util.List;
-import org.opendaylight.controller.config.yang.bmp.impl.MonitoredRouter;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
 import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
 import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
-import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
 import org.opendaylight.protocol.bmp.api.BmpDispatcher;
+import org.opendaylight.protocol.bmp.impl.config.BmpDeployerDependencies;
 import org.opendaylight.protocol.bmp.impl.spi.BmpMonitoringStation;
 import org.opendaylight.protocol.concepts.KeyMapping;
 import org.opendaylight.protocol.util.Ipv4Util;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.bmp.monitors.bmp.monitor.config.MonitoredRouter;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev150512.BmpMonitor;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev150512.MonitorId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev150512.bmp.monitor.Monitor;
@@ -40,7 +42,6 @@ import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdent
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -77,45 +78,45 @@ public final class BmpMonitoringStationImpl implements BmpMonitoringStation {
     private void connectMonitoredRouters(final BmpDispatcher dispatcher) {
         if (this.monitoredRouters != null) {
             for (final MonitoredRouter mr : this.monitoredRouters) {
-                if (mr.getActive()) {
+                if (mr.isActive()) {
                     Preconditions.checkNotNull(mr.getAddress());
                     Preconditions.checkNotNull(mr.getPort());
                     final String s = mr.getAddress().getIpv4Address().getValue();
                     final InetAddress addr = InetAddresses.forString(s);
-                    KeyMapping ret = null;
+                    final KeyMapping ret;
                     final Rfc2385Key rfc2385KeyPassword = mr.getPassword();
                     ret = KeyMapping.getKeyMapping(addr, rfc2385KeyPassword.getValue());
-                    dispatcher.createClient(
-                        Ipv4Util.toInetSocketAddress(mr.getAddress(), mr.getPort()),
-                        this.sessionManager, ret);
+                    dispatcher.createClient(Ipv4Util.toInetSocketAddress(mr.getAddress(), mr.getPort()),
+                        this.sessionManager, Optional.fromNullable(ret));
                 }
             }
         }
     }
 
-    public static BmpMonitoringStation createBmpMonitorInstance(final RIBExtensionConsumerContext ribExtensions, final BmpDispatcher dispatcher,
-            final DOMDataBroker domDataBroker, final MonitorId monitorId, final InetSocketAddress address,
-            final KeyMapping keys, final BindingCodecTreeFactory codecFactory, final SchemaContext schemaContext,
-            final List<MonitoredRouter> mrs ) throws InterruptedException {
-        Preconditions.checkNotNull(ribExtensions);
-        Preconditions.checkNotNull(dispatcher);
-        Preconditions.checkNotNull(domDataBroker);
-        Preconditions.checkNotNull(monitorId);
-        Preconditions.checkNotNull(address);
+    public static BmpMonitoringStation createBmpMonitorInstance(final BmpDeployerDependencies bmpDeployerDependencies,
+        final BmpDispatcher dispatcher, final MonitorId monitorId, final InetSocketAddress inetAddress,
+        final List<MonitoredRouter> monitoredRouter) throws InterruptedException {
+        return createBmpMonitorInstance(bmpDeployerDependencies.getExtensions(), dispatcher,
+            bmpDeployerDependencies.getDomDataBroker(), bmpDeployerDependencies.getTree(), monitorId, inetAddress,
+            monitoredRouter);
+
+    }
+
+    public static BmpMonitoringStation createBmpMonitorInstance(final RIBExtensionConsumerContext ribExtensions,
+        final BmpDispatcher dispatcher, final DOMDataBroker domDataBroker, final BindingCodecTree tree,
+        final MonitorId monitorId, final InetSocketAddress address, final List<MonitoredRouter> mrs)
+        throws InterruptedException {
 
         final YangInstanceIdentifier yangMonitorId = YangInstanceIdentifier.builder()
-                .node(BmpMonitor.QNAME)
-                .node(Monitor.QNAME)
-                .nodeWithKey(Monitor.QNAME, MONITOR_ID_QNAME, monitorId.getValue())
-                .build();
-
-        final BindingRuntimeContext runtimeContext = BindingRuntimeContext.create(ribExtensions.getClassLoadingStrategy(),
-                schemaContext);
-        final BindingCodecTree tree  = codecFactory.create(runtimeContext);
-        final RouterSessionManager sessionManager = new RouterSessionManager(yangMonitorId, domDataBroker, ribExtensions, tree);
-        final ChannelFuture channelFuture = dispatcher.createServer(address, sessionManager, keys);
-
-        return new BmpMonitoringStationImpl(domDataBroker, yangMonitorId, channelFuture.sync().channel(), sessionManager, monitorId, dispatcher, mrs);
+            .node(BmpMonitor.QNAME).node(Monitor.QNAME)
+            .nodeWithKey(Monitor.QNAME, MONITOR_ID_QNAME, monitorId.getValue()).build();
+
+        final RouterSessionManager sessionManager = new RouterSessionManager(yangMonitorId, domDataBroker,
+            ribExtensions, tree);
+        final ChannelFuture channelFuture = dispatcher.createServer(address, sessionManager, constructKeys(mrs));
+
+        return new BmpMonitoringStationImpl(domDataBroker, yangMonitorId, channelFuture.sync().channel(),
+            sessionManager, monitorId, dispatcher, mrs);
     }
 
     private static void ensureParentExists(final DOMDataWriteTransaction wTx, final YangInstanceIdentifier path) {
@@ -150,5 +151,4 @@ public final class BmpMonitoringStationImpl implements BmpMonitoringStation {
         wTx.submit().checkedGet();
         LOG.info("BMP monitoring station {} closed.", this.monitorId.getValue());
     }
-
 }
diff --git a/bgp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/KeyConstructorUtil.java b/bgp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/app/KeyConstructorUtil.java
new file mode 100644 (file)
index 0000000..c88f71e
--- /dev/null
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.protocol.bmp.impl.app;
+
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Objects;
+import org.opendaylight.protocol.concepts.KeyMapping;
+import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.IetfInetUtil;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.bmp.monitors.bmp.monitor.config.MonitoredRouter;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.rfc2385.cfg.rev160324.Rfc2385Key;
+
+public final class KeyConstructorUtil {
+
+    private KeyConstructorUtil() {
+        throw new UnsupportedOperationException();
+    }
+
+    public static KeyMapping constructKeys(final List<MonitoredRouter> mrs) {
+        final KeyMapping ret = KeyMapping.getKeyMapping();
+        if (mrs != null) {
+            mrs.stream().filter(Objects::nonNull).filter(KeyConstructorUtil::isNotNullorEmpty)
+                .forEach(mr -> {
+                    final Rfc2385Key rfc2385KeyPassword = mr.getPassword();
+                    ret.put(IetfInetUtil.INSTANCE.inetAddressFor(mr.getAddress()),
+                        rfc2385KeyPassword.getValue().getBytes(StandardCharsets.US_ASCII));
+                });
+        }
+
+        return ret;
+    }
+
+    private static boolean isNotNullorEmpty(final MonitoredRouter mr) {
+        final Rfc2385Key password = mr.getPassword();
+        return password != null && !password.getValue().isEmpty();
+    }
+}
diff --git a/bgp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerDependencies.java b/bgp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerDependencies.java
new file mode 100644 (file)
index 0000000..a34f69f
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.protocol.bmp.impl.config;
+
+import com.google.common.base.Preconditions;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory;
+import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
+import org.opendaylight.yangtools.yang.model.api.SchemaContext;
+
+public class BmpDeployerDependencies {
+    private final DataBroker dataBroker;
+    private final RIBExtensionConsumerContext extensions;
+    private final BindingCodecTree tree;
+    private final DOMDataBroker domDataBroker;
+
+    public BmpDeployerDependencies(final DataBroker dataBroker, final DOMDataBroker domDataBroker,
+    final RIBExtensionConsumerContext extensions, final BindingCodecTreeFactory codecTreeFactory,
+    final SchemaContext schemaContext) {
+        this.dataBroker = Preconditions.checkNotNull(dataBroker);
+        this.domDataBroker = Preconditions.checkNotNull(domDataBroker);
+        this.extensions = Preconditions.checkNotNull(extensions);
+        this.tree = Preconditions.checkNotNull(codecTreeFactory).create(schemaContext);
+    }
+
+    public DataBroker getDataBroker() {
+        return this.dataBroker;
+    }
+
+    public RIBExtensionConsumerContext getExtensions() {
+        return this.extensions;
+    }
+
+    public BindingCodecTree getTree() {
+        return this.tree;
+    }
+
+    public DOMDataBroker getDomDataBroker() {
+        return this.domDataBroker;
+    }
+}
diff --git a/bgp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java b/bgp/bmp-impl/src/main/java/org/opendaylight/protocol/bmp/impl/config/BmpDeployerImpl.java
new file mode 100644 (file)
index 0000000..7cec03e
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2017 Pantheon Technologies s.r.o. 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.protocol.bmp.impl.config;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Iterables;
+import java.net.InetSocketAddress;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import javax.annotation.concurrent.GuardedBy;
+import org.opendaylight.controller.md.sal.binding.api.ClusteredDataTreeChangeListener;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification;
+import org.opendaylight.controller.md.sal.binding.api.DataObjectModification.ModificationType;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeIdentifier;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
+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.controller.md.sal.dom.api.DOMDataWriteTransaction;
+import org.opendaylight.protocol.bmp.api.BmpDispatcher;
+import org.opendaylight.protocol.bmp.impl.api.BmpDeployer;
+import org.opendaylight.protocol.bmp.impl.app.BmpMonitoringStationImpl;
+import org.opendaylight.protocol.bmp.impl.spi.BmpMonitoringStation;
+import org.opendaylight.protocol.util.Ipv4Util;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.OdlBmpMonitors;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.bmp.monitors.BmpMonitorConfig;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.odl.bmp.monitors.BmpMonitorConfigKey;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.config.rev170517.server.config.Server;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev150512.BmpMonitor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev150512.MonitorId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bmp.monitor.rev150512.bmp.monitor.Monitor;
+import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.opendaylight.yangtools.yang.binding.DataObject;
+import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
+import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class BmpDeployerImpl implements BmpDeployer, ClusteredDataTreeChangeListener<OdlBmpMonitors>, AutoCloseable {
+    private static final Logger LOG = LoggerFactory.getLogger(BmpDeployerImpl.class);
+
+    private static final InstanceIdentifier<OdlBmpMonitors> ODL_BMP_MONITORS_IID =
+        InstanceIdentifier.create(OdlBmpMonitors.class);
+    private static final YangInstanceIdentifier BMP_MONITOR_YII =
+        YangInstanceIdentifier.of(BmpMonitor.QNAME);
+    private final static ContainerNode EMPTY_PARENT_NODE = Builders.containerBuilder().withNodeIdentifier(
+        new NodeIdentifier(BmpMonitor.QNAME)).addChild(ImmutableNodes.mapNodeBuilder(Monitor.QNAME).build()).build();
+    private final BmpDispatcher dispatcher;
+    @GuardedBy("this")
+    private final Map<MonitorId, BmpMonitoringStation> bmpMonitorServices = new HashMap<>();
+    private final BmpDeployerDependencies bmpDeployerDependencies;
+    @GuardedBy("this")
+    private ListenerRegistration<BmpDeployerImpl> registration;
+
+    public BmpDeployerImpl(final BmpDispatcher dispatcher, final BmpDeployerDependencies bmpDeployerDependencies) {
+        this.dispatcher = Preconditions.checkNotNull(dispatcher);
+        this.bmpDeployerDependencies = Preconditions.checkNotNull(bmpDeployerDependencies);
+    }
+
+    public synchronized void register() {
+        final DOMDataWriteTransaction wTx = this.bmpDeployerDependencies.getDomDataBroker().newWriteOnlyTransaction();
+        wTx.merge(LogicalDatastoreType.OPERATIONAL, BMP_MONITOR_YII, EMPTY_PARENT_NODE);
+        wTx.submit();
+        this.registration = this.bmpDeployerDependencies.getDataBroker().registerDataTreeChangeListener(
+            new DataTreeIdentifier<>(LogicalDatastoreType.CONFIGURATION, ODL_BMP_MONITORS_IID), this);
+
+    }
+
+    @Override
+    public synchronized void onDataTreeChanged(final Collection<DataTreeModification<OdlBmpMonitors>> changes) {
+        final DataTreeModification<OdlBmpMonitors> dataTreeModification = Iterables.getOnlyElement(changes);
+        final Collection<DataObjectModification<? extends DataObject>> rootNode = dataTreeModification.getRootNode()
+            .getModifiedChildren();
+        if (rootNode.isEmpty()) {
+            return;
+        }
+        rootNode.forEach(dto -> handleModification((DataObjectModification<BmpMonitorConfig>) dto));
+    }
+
+    private void handleModification(final DataObjectModification<BmpMonitorConfig> config) {
+        final ModificationType modificationType = config.getModificationType();
+        LOG.trace("Bmp Monitor configuration has changed: {}, type modification {}", config, modificationType);
+        switch (modificationType) {
+            case DELETE:
+                removeBmpMonitor(config.getDataBefore().getMonitorId());
+                break;
+            case SUBTREE_MODIFIED:
+            case WRITE:
+                updateBmpMonitor(config.getDataAfter());
+                break;
+            default:
+                break;
+        }
+    }
+
+    private void updateBmpMonitor(final BmpMonitorConfig bmpConfig) {
+        final MonitorId monitorId = bmpConfig.getMonitorId();
+        final BmpMonitoringStation oldService = this.bmpMonitorServices.remove(monitorId);
+        try {
+            if (oldService != null) {
+                oldService.close();
+            }
+
+            final Server server = bmpConfig.getServer();
+            final InetSocketAddress inetAddress =
+                Ipv4Util.toInetSocketAddress(server.getBindingAddress(), server.getBindingPort());
+            final BmpMonitoringStation monitor = BmpMonitoringStationImpl.createBmpMonitorInstance(
+                this.bmpDeployerDependencies, this.dispatcher, monitorId, inetAddress, bmpConfig.getMonitoredRouter());
+            this.bmpMonitorServices.put(monitorId, monitor);
+        } catch (final Exception e) {
+            LOG.error("Failed to create Bmp Monitor {}.", monitorId, e);
+        }
+
+    }
+
+    private void removeBmpMonitor(final MonitorId monitorId) {
+        final BmpMonitoringStation service = this.bmpMonitorServices.remove(monitorId);
+        if (service != null) {
+            LOG.debug("Closing Bmp Monitor {}.", monitorId);
+            try {
+                service.close();
+            } catch (final Exception e) {
+                LOG.error("Failed to close Bmp Monitor {}.", monitorId, e);
+            }
+        }
+    }
+
+    @Override
+    public synchronized void writeBmpMonitor(final BmpMonitorConfig bmpConfig) throws TransactionCommitFailedException {
+        final KeyedInstanceIdentifier<BmpMonitorConfig, BmpMonitorConfigKey> iid = InstanceIdentifier
+            .create(OdlBmpMonitors.class).child(BmpMonitorConfig.class, bmpConfig.getKey());
+
+        final WriteTransaction wTx = this.bmpDeployerDependencies.getDataBroker().newWriteOnlyTransaction();
+        wTx.put(LogicalDatastoreType.CONFIGURATION, iid, bmpConfig, true);
+        wTx.submit().checkedGet();
+    }
+
+    @Override
+    public synchronized void deleteBmpMonitor(final MonitorId monitorId)
+        throws TransactionCommitFailedException {
+        final KeyedInstanceIdentifier<BmpMonitorConfig, BmpMonitorConfigKey> iid = InstanceIdentifier
+            .create(OdlBmpMonitors.class).child(BmpMonitorConfig.class, new BmpMonitorConfigKey(monitorId));
+
+        final WriteTransaction wTx = this.bmpDeployerDependencies.getDataBroker().newWriteOnlyTransaction();
+        wTx.delete(LogicalDatastoreType.CONFIGURATION, iid);
+        wTx.submit().checkedGet();
+    }
+
+    @Override
+    public synchronized void close() throws Exception {
+        if (this.registration != null) {
+            this.registration.close();
+        }
+    }
+}
index 620340b77c30142a3c9bebb0e681259b0e48473e..61c37fa13f9908b2afd50e0621ea2f5c975c2b6e 100644 (file)
@@ -1,6 +1,5 @@
 <?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">
+<blueprint xmlns="http://www.osgi.org/xmlns/blueprint/v1.0.0" xmlns:odl="http://opendaylight.org/xmlns/blueprint/v1.0.0">
 
   <reference id="bmpExtensionContext" interface="org.opendaylight.protocol.bmp.spi.registry.BmpExtensionConsumerContext"/>
   <reference id="globalBossGroup" interface="io.netty.channel.EventLoopGroup" odl:type="global-boss-group"/>
       <entry key="config-instance-name" value="global-bmp-dispatcher"/>
     </service-properties>
   </service>
+
+  <reference id="dataBroker" interface="org.opendaylight.controller.md.sal.binding.api.DataBroker" odl:type="default"/>
+  <reference id="domPingPongDataBroker" interface="org.opendaylight.controller.md.sal.dom.api.DOMDataBroker"
+             odl:type="pingpong"/>
+  <reference id="globalBgpExtensions" interface="org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext"/>
+  <reference id="codecTreeFactory" interface="org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTreeFactory"/>
+  <odl:static-reference id="domSchemaService" interface="org.opendaylight.mdsal.dom.api.DOMSchemaService"/>
+
+  <bean id="bmpDeployerDependecies" class="org.opendaylight.protocol.bmp.impl.config.BmpDeployerDependencies">
+    <argument ref="dataBroker"/>
+    <argument ref="domPingPongDataBroker"/>
+    <argument ref="globalBgpExtensions"/>
+    <argument ref="codecTreeFactory"/>
+    <argument>
+      <bean factory-ref="domSchemaService" factory-method="getGlobalContext"/>
+    </argument>
+  </bean>
+
+  <bean id="bmpDeployer" class="org.opendaylight.protocol.bmp.impl.config.BmpDeployerImpl"
+        init-method="register" destroy-method="close">
+    <argument ref="bmpDispatcher"/>
+    <argument ref="bmpDeployerDependecies"/>
+  </bean>
+
+  <service ref="bmpDeployer" interface="org.opendaylight.protocol.bmp.impl.api.BmpDeployer"/>
+
 </blueprint>
\ No newline at end of file
diff --git a/bgp/bmp-impl/src/test/java/org/opendaylight/controller/config/yang/bmp/impl/AbstractBmpModuleTest.java b/bgp/bmp-impl/src/test/java/org/opendaylight/controller/config/yang/bmp/impl/AbstractBmpModuleTest.java
deleted file mode 100644 (file)
index 4eec08a..0000000
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (c) 2016 Brocade Communications 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.controller.config.yang.bmp.impl;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Matchers.anyString;
-import static org.mockito.Matchers.contains;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-import org.junit.Before;
-import org.mockito.Mockito;
-import org.opendaylight.controller.config.manager.impl.AbstractConfigTest;
-import org.opendaylight.protocol.bgp.parser.spi.AddressFamilyRegistry;
-import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionProviderContext;
-import org.opendaylight.protocol.bgp.parser.spi.MessageRegistry;
-import org.opendaylight.protocol.bgp.parser.spi.SubsequentAddressFamilyRegistry;
-import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionProviderContext;
-import org.opendaylight.protocol.bgp.rib.spi.SimpleRIBExtensionProviderContext;
-import org.opendaylight.protocol.bmp.spi.registry.BmpExtensionProviderContext;
-import org.opendaylight.protocol.bmp.spi.registry.SimpleBmpExtensionProviderContext;
-import org.osgi.framework.Filter;
-import org.osgi.framework.ServiceListener;
-import org.osgi.framework.ServiceReference;
-
-/**
- * Abstract base class for bmp module tests.
- *
- * @author Thomas Pantelis
- */
-public class AbstractBmpModuleTest extends AbstractConfigTest {
-    @Before
-    public void setUp() throws Exception {
-        doAnswer(invocation -> {
-            final String str = invocation.getArgumentAt(0, String.class);
-            final Filter mockFilter = mock(Filter.class);
-            doReturn(str).when(mockFilter).toString();
-            return mockFilter;
-        }).when(this.mockedContext).createFilter(anyString());
-
-        Mockito.doNothing().when(this.mockedContext).addServiceListener(any(ServiceListener.class), Mockito.anyString());
-        Mockito.doNothing().when(this.mockedContext).removeServiceListener(any(ServiceListener.class));
-
-        BGPExtensionProviderContext mockContext = mock(BGPExtensionProviderContext.class);
-        doReturn(mock(AddressFamilyRegistry.class)).when(mockContext).getAddressFamilyRegistry();
-        doReturn(mock(MessageRegistry.class)).when(mockContext).getMessageRegistry();
-        doReturn(mock(SubsequentAddressFamilyRegistry.class)).when(mockContext).getSubsequentAddressFamilyRegistry();
-        setupMockService(BGPExtensionProviderContext.class, mockContext);
-
-        setupMockService(BmpExtensionProviderContext.class, new SimpleBmpExtensionProviderContext());
-
-        setupMockService(RIBExtensionProviderContext.class, new SimpleRIBExtensionProviderContext());
-    }
-
-    void setupMockService(final Class<?> serviceInterface, final Object instance) throws Exception {
-        final ServiceReference<?> mockServiceRef = mock(ServiceReference.class);
-        doReturn(new ServiceReference[]{mockServiceRef}).when(this.mockedContext).
-                getServiceReferences(anyString(), contains(serviceInterface.getName()));
-        doReturn(new ServiceReference[]{mockServiceRef}).when(this.mockedContext).
-                getServiceReferences(serviceInterface.getName(), null);
-        doReturn(instance).when(this.mockedContext).getService(mockServiceRef);
-    }
-}
diff --git a/bgp/bmp-impl/src/test/java/org/opendaylight/controller/config/yang/bmp/impl/BmpMonitorImplModuleTest.java b/bgp/bmp-impl/src/test/java/org/opendaylight/controller/config/yang/bmp/impl/BmpMonitorImplModuleTest.java
deleted file mode 100644 (file)
index 19a4d9a..0000000
+++ /dev/null
@@ -1,255 +0,0 @@
-/*
- * Copyright (c) 2015 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.controller.config.yang.bmp.impl;
-
-import static org.mockito.Matchers.any;
-import static org.mockito.Mockito.doAnswer;
-import static org.mockito.Mockito.doNothing;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.mock;
-
-import com.google.common.collect.Lists;
-import com.google.common.util.concurrent.CheckedFuture;
-import io.netty.channel.nio.NioEventLoopGroup;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import javax.management.InstanceAlreadyExistsException;
-import javax.management.ObjectName;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.MockitoAnnotations;
-import org.opendaylight.controller.config.api.jmx.CommitStatus;
-import org.opendaylight.controller.config.manager.impl.factoriesresolver.HardcodedModuleFactoriesResolver;
-import org.opendaylight.controller.config.util.ConfigTransactionJMXClient;
-import org.opendaylight.controller.config.yang.bgp.rib.spi.RIBExtensionsImplModuleFactory;
-import org.opendaylight.controller.config.yang.bgp.rib.spi.RIBExtensionsImplModuleMXBean;
-import org.opendaylight.controller.config.yang.md.sal.binding.impl.RuntimeMappingModuleFactory;
-import org.opendaylight.controller.config.yang.md.sal.binding.impl.RuntimeMappingModuleMXBean;
-import org.opendaylight.controller.config.yang.md.sal.dom.impl.DomInmemoryDataBrokerModuleFactory;
-import org.opendaylight.controller.config.yang.md.sal.dom.impl.DomInmemoryDataBrokerModuleMXBean;
-import org.opendaylight.controller.config.yang.md.sal.dom.impl.SchemaServiceImplSingletonModuleFactory;
-import org.opendaylight.controller.config.yang.md.sal.dom.impl.SchemaServiceImplSingletonModuleMXBean;
-import org.opendaylight.controller.md.sal.binding.api.DataBroker;
-import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
-import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
-import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodecFactory;
-import org.opendaylight.controller.md.sal.common.api.TransactionStatus;
-import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
-import org.opendaylight.controller.sal.core.api.model.SchemaService;
-import org.opendaylight.controller.sal.core.api.model.YangTextSourceProvider;
-import org.opendaylight.mdsal.binding.generator.api.ClassLoadingStrategy;
-import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
-import org.opendaylight.protocol.bmp.api.BmpDispatcher;
-import org.opendaylight.protocol.bmp.impl.BmpDispatcherImpl;
-import org.opendaylight.protocol.bmp.impl.session.DefaultBmpSessionFactory;
-import org.opendaylight.protocol.bmp.spi.registry.SimpleBmpMessageRegistry;
-import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.inet.types.rev130715.PortNumber;
-import org.opendaylight.yangtools.concepts.ListenerRegistration;
-import org.opendaylight.yangtools.yang.binding.DataObject;
-import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
-import org.opendaylight.yangtools.yang.common.RpcResult;
-import org.opendaylight.yangtools.yang.model.api.SchemaContext;
-import org.opendaylight.yangtools.yang.model.api.SchemaContextListener;
-import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException;
-import org.opendaylight.yangtools.yang.test.util.YangParserTestUtils;
-import org.osgi.framework.Bundle;
-import org.osgi.framework.BundleListener;
-import org.osgi.framework.ServiceReference;
-
-public class BmpMonitorImplModuleTest extends AbstractBmpModuleTest {
-
-    private static final String FACTORY_NAME = BmpMonitorImplModuleFactory.NAME;
-    private static final String INSTANCE_NAME = "bmp-monitor-impl-instance";
-    private static final String RIB_EXT_INSTANCE_NAME = "rib-ext-instance";
-    private static final String CODEC_INSTANCE_NAME = "runtime-mapping-singleton";
-    private static final String DOM_INSTANCE_NAME = "dom-data-instance";
-    private static final String TRANSACTION_NAME = "testTransaction";
-
-    @Mock private ReadWriteTransaction mockedTransaction;
-    @Mock private DataBroker mockedDataProvider;
-    @Mock private CheckedFuture<Void, TransactionCommitFailedException> mockedFuture;
-    @Mock private RpcResult<TransactionStatus> mockedResult;
-
-    @Override
-    @SuppressWarnings("unchecked")
-    @Before
-    public void setUp() throws Exception {
-        MockitoAnnotations.initMocks(this);
-
-        super.setUp();
-        super.initConfigTransactionManagerImpl(new HardcodedModuleFactoriesResolver(this.mockedContext,
-            new BmpMonitorImplModuleFactory(),
-            new RIBExtensionsImplModuleFactory(),
-            new RuntimeMappingModuleFactory(),
-            new DomInmemoryDataBrokerModuleFactory(),
-            new BmpDispatcherImplModuleFactory(),
-            new SchemaServiceImplSingletonModuleFactory()));
-
-        final ServiceReference<?> emptyServiceReference = mock(ServiceReference.class, "Empty");
-        final ServiceReference<?> classLoadingStrategySR = mock(ServiceReference.class, "ClassLoadingStrategy");
-        final ServiceReference<?> dataProviderServiceReference = mock(ServiceReference.class, "Data Provider");
-        final ServiceReference<?> schemaServiceReference = mock(ServiceReference.class, "schemaServiceReference");
-
-        Mockito.doNothing().when(this.mockedContext).addBundleListener(any(BundleListener.class));
-        Mockito.doNothing().when(this.mockedContext).removeBundleListener(any(BundleListener.class));
-
-        Mockito.doReturn(new Bundle[] {}).when(this.mockedContext).getBundles();
-
-        Mockito.doReturn("Empty reference").when(emptyServiceReference).toString();
-        Mockito.doReturn("Data Provider Service Reference").when(dataProviderServiceReference).toString();
-        Mockito.doReturn("Class loading stategy reference").when(classLoadingStrategySR).toString();
-        Mockito.doReturn("Schema Service reference").when(schemaServiceReference).toString();
-
-        Mockito.doReturn(emptyServiceReference).when(this.mockedContext).getServiceReference(any(Class.class));
-        Mockito.doReturn(dataProviderServiceReference).when(this.mockedContext).getServiceReference(DataBroker.class);
-        Mockito.doReturn(classLoadingStrategySR).when(this.mockedContext).getServiceReference(GeneratedClassLoadingStrategy.class);
-        Mockito.doReturn(schemaServiceReference).when(this.mockedContext).getServiceReference(SchemaService.class);
-        Mockito.doReturn(classLoadingStrategySR).when(this.mockedContext).getServiceReference(ClassLoadingStrategy.class);
-
-        Mockito.doReturn(this.mockedDataProvider).when(this.mockedContext).getService(dataProviderServiceReference);
-        Mockito.doReturn(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy()).when(this.mockedContext).getService(classLoadingStrategySR);
-        Mockito.doReturn(null).when(this.mockedContext).getService(emptyServiceReference);
-
-        Mockito.doReturn(this.mockedTransaction).when(this.mockedDataProvider).newReadWriteTransaction();
-
-        Mockito.doReturn(null).when(this.mockedTransaction).read(Mockito.eq(LogicalDatastoreType.OPERATIONAL), any(InstanceIdentifier.class));
-        Mockito.doNothing().when(this.mockedTransaction).put(Mockito.eq(LogicalDatastoreType.OPERATIONAL), any(InstanceIdentifier.class), any(DataObject.class));
-        Mockito.doNothing().when(this.mockedTransaction).delete(Mockito.eq(LogicalDatastoreType.OPERATIONAL), any(InstanceIdentifier.class));
-
-        Mockito.doReturn(this.mockedFuture).when(this.mockedTransaction).submit();
-        Mockito.doReturn(TRANSACTION_NAME).when(this.mockedTransaction).getIdentifier();
-
-        Mockito.doReturn(null).when(this.mockedFuture).get();
-
-        final SchemaContext context = parseYangStreams(getFilesAsStreams(getYangModelsPaths()));
-        final SchemaService mockedSchemaService = mock(SchemaService.class);
-        doReturn(context).when(mockedSchemaService).getGlobalContext();
-        doAnswer(invocation -> {
-            invocation.getArgumentAt(0, SchemaContextListener.class).onGlobalContextUpdated(context);
-            final ListenerRegistration<SchemaContextListener> reg = mock(ListenerRegistration.class);
-            doNothing().when(reg).close();
-            return reg;
-        }).when(mockedSchemaService).registerSchemaContextListener(any(SchemaContextListener.class));
-
-        setupMockService(SchemaService.class, mockedSchemaService);
-        setupMockService(YangTextSourceProvider.class, mock(YangTextSourceProvider.class));
-        Mockito.doReturn(mockedSchemaService).when(this.mockedContext).getService(schemaServiceReference);
-
-        final BindingToNormalizedNodeCodec bindingCodec = BindingToNormalizedNodeCodecFactory.newInstance(
-                GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy());
-        BindingToNormalizedNodeCodecFactory.registerInstance(bindingCodec, mockedSchemaService);
-        setupMockService(BindingToNormalizedNodeCodec.class, bindingCodec);
-
-        final BmpDispatcher bmpDispatcher = new BmpDispatcherImpl(new NioEventLoopGroup(), new NioEventLoopGroup(),
-                new SimpleBmpMessageRegistry(), new DefaultBmpSessionFactory());
-        setupMockService(BmpDispatcher.class, bmpDispatcher);
-    }
-
-    private static SchemaContext parseYangStreams(final List<InputStream> streams) {
-        try {
-            return YangParserTestUtils.parseYangStreams(streams);
-        } catch (final ReactorException e) {
-            throw new RuntimeException("Unable to build schema context from " + streams, e);
-        }
-    }
-
-    private List<String> getYangModelsPaths() {
-        final List<String> paths = Lists.newArrayList("/META-INF/yang/bgp-rib.yang", "/META-INF/yang/ietf-inet-types@2013-07-15.yang",
-                "/META-INF/yang/bgp-message.yang", "/META-INF/yang/bgp-multiprotocol.yang", "/META-INF/yang/bgp-types.yang",
-                "/META-INF/yang/network-concepts.yang", "/META-INF/yang/ieee754.yang", "/META-INF/yang/yang-ext.yang",
-                "/META-INF/yang/bmp-monitor.yang", "/META-INF/yang/bmp-message.yang", "/META-INF/yang/ietf-yang-types@2013-07-15.yang");
-        return paths;
-    }
-
-    private List<InputStream> getFilesAsStreams(final List<String> paths) {
-        final List<InputStream> resources = new ArrayList<>();
-        final List<String> failedToFind = new ArrayList<>();
-        for (final String path : paths) {
-            final InputStream is = BmpMonitorImplModuleTest.class.getResourceAsStream(path);
-            if (is == null) {
-                failedToFind.add(path);
-            } else {
-                resources.add(is);
-            }
-        }
-        Assert.assertEquals("Some files were not found", Collections.emptyList(), failedToFind);
-        return resources;
-    }
-
-    @After
-    public void closeAllModules() throws Exception {
-        super.destroyAllConfigBeans();
-    }
-
-    @Test
-    public void testCreateBean() throws Exception {
-        final CommitStatus status = createInstance();
-        assertBeanCount(1, FACTORY_NAME);
-        assertStatus(status, 6, 0, 0);
-    }
-
-    @Test
-    public void testReusingOldInstance() throws Exception {
-        createInstance();
-        final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-        assertBeanCount(1, FACTORY_NAME);
-        final CommitStatus status = transaction.commit();
-        assertBeanCount(1, FACTORY_NAME);
-        assertStatus(status, 0, 0, 6);
-    }
-
-    private CommitStatus createInstance() throws Exception {
-        final ConfigTransactionJMXClient transaction = this.configRegistryClient.createTransaction();
-        final ObjectName nameCreated = transaction.createModule(FACTORY_NAME, INSTANCE_NAME);
-        final BmpMonitorImplModuleMXBean mxBean = transaction.newMXBeanProxy(nameCreated, BmpMonitorImplModuleMXBean.class);
-        mxBean.setExtensions(createExtensions(transaction));
-        mxBean.setCodecTreeFactory(createRuntimeMapping(transaction));
-        mxBean.setDomDataProvider(createDomData(transaction));
-        mxBean.setBmpDispatcher(createDispatcher(transaction));
-        mxBean.setBindingPort(new PortNumber(9999));
-        return transaction.commit();
-    }
-
-    private static ObjectName createExtensions(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException {
-        final ObjectName nameCreated = transaction.createModule(RIBExtensionsImplModuleFactory.NAME, RIB_EXT_INSTANCE_NAME);
-        transaction.newMXBeanProxy(nameCreated, RIBExtensionsImplModuleMXBean.class);
-        return nameCreated;
-    }
-
-    private static ObjectName createRuntimeMapping(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException {
-        final ObjectName nameCreated = transaction.createModule(RuntimeMappingModuleFactory.NAME, CODEC_INSTANCE_NAME);
-        transaction.newMXBeanProxy(nameCreated, RuntimeMappingModuleMXBean.class);
-        return nameCreated;
-    }
-
-    private static ObjectName createDomData(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException {
-        final ObjectName nameCreated = transaction.createModule(DomInmemoryDataBrokerModuleFactory.NAME, DOM_INSTANCE_NAME);
-        final DomInmemoryDataBrokerModuleMXBean bean = transaction.newMXBeanProxy(nameCreated, DomInmemoryDataBrokerModuleMXBean.class);
-        bean.setSchemaService(createSchemaService(transaction));
-        return nameCreated;
-    }
-
-    private static ObjectName createSchemaService(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException {
-        final ObjectName nameCreated = transaction.createModule(SchemaServiceImplSingletonModuleFactory.NAME, SchemaServiceImplSingletonModuleFactory.SINGLETON_NAME);
-        transaction.newMXBeanProxy(nameCreated, SchemaServiceImplSingletonModuleMXBean.class);
-        return nameCreated;
-    }
-
-    private static ObjectName createDispatcher(final ConfigTransactionJMXClient transaction) throws InstanceAlreadyExistsException {
-        final ObjectName nameCreated = transaction.createModule(BmpDispatcherImplModuleFactory.NAME, "bmp-message-fct");
-        transaction.newMXBeanProxy(nameCreated, BmpDispatcherImplModuleMXBean.class);
-        return nameCreated;
-    }
-}
index b161978d92e03e9b581d2dd05df5c2c30b972013..7331459532dcf4b3b1117edc357a669e569a5e27 100644 (file)
@@ -34,14 +34,17 @@ import java.net.InetSocketAddress;
 import java.util.List;
 import javassist.ClassPool;
 import org.junit.After;
-import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.MockitoAnnotations;
 import org.opendaylight.controller.md.sal.binding.impl.BindingToNormalizedNodeCodec;
 import org.opendaylight.controller.md.sal.binding.test.AbstractConcurrentDataBrokerTest;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
+import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction;
+import org.opendaylight.mdsal.binding.dom.codec.api.BindingCodecTree;
 import org.opendaylight.mdsal.binding.generator.impl.GeneratedClassLoadingStrategy;
 import org.opendaylight.mdsal.binding.generator.impl.ModuleInfoBackedContext;
+import org.opendaylight.mdsal.binding.generator.util.BindingRuntimeContext;
 import org.opendaylight.mdsal.binding.generator.util.JavassistUtils;
 import org.opendaylight.protocol.bgp.inet.RIBActivator;
 import org.opendaylight.protocol.bgp.parser.impl.BGPActivator;
@@ -100,6 +103,11 @@ import org.opendaylight.yangtools.binding.data.codec.impl.BindingNormalizedNodeC
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.KeyedInstanceIdentifier;
 import org.opendaylight.yangtools.yang.binding.util.BindingReflections;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
+import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
+import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 
 public class BmpMonitorImplTest extends AbstractConcurrentDataBrokerTest {
     // the local port and address where the monitor (ODL) will listen for incoming BMP request
@@ -111,9 +119,9 @@ public class BmpMonitorImplTest extends AbstractConcurrentDataBrokerTest {
     private static final String REMOTE_ROUTER_ADDRESS_2 = "127.0.0.13";
     private static final Ipv4Address PEER1 = new Ipv4Address("20.20.20.20");
     private static final MonitorId MONITOR_ID = new MonitorId("monitor");
-    private static final KeyedInstanceIdentifier<Monitor, MonitorKey> MONITOR_IID = InstanceIdentifier.create(BmpMonitor.class).child(Monitor.class, new MonitorKey(MONITOR_ID));
+    private static final KeyedInstanceIdentifier<Monitor, MonitorKey> MONITOR_IID = InstanceIdentifier
+        .create(BmpMonitor.class).child(Monitor.class, new MonitorKey(MONITOR_ID));
     private static final PeerId PEER_ID = new PeerId(PEER1.getValue());
-    private static final String MD5_PASSWORD = "abcdef";
     private static final InstanceIdentifier<BmpMonitor> BMP_II = InstanceIdentifier.create(BmpMonitor.class);
     private BindingToNormalizedNodeCodec mappingService;
     private RIBActivator ribActivator;
@@ -122,7 +130,8 @@ public class BmpMonitorImplTest extends AbstractConcurrentDataBrokerTest {
     private BmpDispatcher dispatcher;
     private BmpMonitoringStation bmpApp;
     private BmpMessageRegistry msgRegistry;
-    private ModuleInfoBackedContext moduleInfoBackedContext;
+    private BindingCodecTree tree;
+    private RIBExtensionProviderContext ribExtension;
 
 
     @Before
@@ -130,21 +139,19 @@ public class BmpMonitorImplTest extends AbstractConcurrentDataBrokerTest {
         MockitoAnnotations.initMocks(this);
         this.mappingService = new BindingToNormalizedNodeCodec(GeneratedClassLoadingStrategy.getTCCLClassLoadingStrategy(),
                 new BindingNormalizedNodeCodecRegistry(StreamWriterGenerator.create(JavassistUtils.forClassPool(ClassPool.getDefault()))));
-        this.moduleInfoBackedContext = ModuleInfoBackedContext.create();
-        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(InitiationMessage.class));
-        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(CParameters1.class));
-        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(BgpParameters.class));
-        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(MultiprotocolCapability.class));
-        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(DestinationIpv4Case.class));
-        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(AdvertizedRoutes.class));
-        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(SentOpen.class));
-        this.moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(ReceivedOpen.class));
-        this.mappingService.onGlobalContextUpdated(this.moduleInfoBackedContext.tryToCreateSchemaContext().get());
-
-        final KeyMapping keys = KeyMapping.getKeyMapping(InetAddresses.forString(MONITOR_LOCAL_ADDRESS), MD5_PASSWORD);
+        final ModuleInfoBackedContext moduleInfoBackedContext = ModuleInfoBackedContext.create();
+        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(InitiationMessage.class));
+        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(CParameters1.class));
+        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(BgpParameters.class));
+        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(MultiprotocolCapability.class));
+        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(DestinationIpv4Case.class));
+        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(AdvertizedRoutes.class));
+        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(SentOpen.class));
+        moduleInfoBackedContext.registerModuleInfo(BindingReflections.getModuleInfo(ReceivedOpen.class));
+        this.mappingService.onGlobalContextUpdated(moduleInfoBackedContext.tryToCreateSchemaContext().get());
         this.ribActivator = new RIBActivator();
-        final RIBExtensionProviderContext ribExtension = new SimpleRIBExtensionProviderContext();
-        this.ribActivator.startRIBExtensionProvider(ribExtension);
+         this.ribExtension = new SimpleRIBExtensionProviderContext();
+        this.ribActivator.startRIBExtensionProvider(this.ribExtension);
 
         this.bgpActivator = new BGPActivator();
         final BGPExtensionProviderContext context = new SimpleBGPExtensionProviderContext();
@@ -155,19 +162,31 @@ public class BmpMonitorImplTest extends AbstractConcurrentDataBrokerTest {
         this.msgRegistry = ctx.getBmpMessageRegistry();
 
         this.dispatcher = new BmpDispatcherImpl(new NioEventLoopGroup(), new NioEventLoopGroup(),
-                ctx.getBmpMessageRegistry(), new DefaultBmpSessionFactory());
+            ctx.getBmpMessageRegistry(), new DefaultBmpSessionFactory());
 
-        this.bmpApp = BmpMonitoringStationImpl.createBmpMonitorInstance(ribExtension, this.dispatcher, getDomBroker(),
-                MONITOR_ID, new InetSocketAddress(InetAddresses.forString(MONITOR_LOCAL_ADDRESS), MONITOR_LOCAL_PORT), keys,
-                this.mappingService.getCodecFactory(), this.moduleInfoBackedContext.getSchemaContext(), null);
+        final BindingRuntimeContext runtimeContext = BindingRuntimeContext.create(this.ribExtension
+            .getClassLoadingStrategy(), this.getSchemaContext());
+        this.tree = this.mappingService.getCodecFactory().create(runtimeContext);
+
+        final InetSocketAddress inetAddress = new InetSocketAddress(InetAddresses.forString(MONITOR_LOCAL_ADDRESS),
+            MONITOR_LOCAL_PORT);
+
+        final DOMDataWriteTransaction wTx = getDomBroker().newWriteOnlyTransaction();
+        final ContainerNode parentNode = Builders.containerBuilder().withNodeIdentifier(
+            new NodeIdentifier(BmpMonitor.QNAME)).addChild(ImmutableNodes.mapNodeBuilder(Monitor.QNAME).build()).build();
+        wTx.merge(LogicalDatastoreType.OPERATIONAL, YangInstanceIdentifier.of(BmpMonitor.QNAME), parentNode);
+        wTx.submit();
+
+        this.bmpApp = BmpMonitoringStationImpl.createBmpMonitorInstance(this.ribExtension, this.dispatcher, getDomBroker(),
+            this.tree, MONITOR_ID, inetAddress, null);
 
         readDataOperational(getDataBroker(), BMP_II, monitor -> {
-            Assert.assertEquals(1, monitor.getMonitor().size());
+            assertEquals(1, monitor.getMonitor().size());
             final Monitor bmpMonitor = monitor.getMonitor().get(0);
-            Assert.assertEquals(MONITOR_ID, bmpMonitor.getMonitorId());
-            Assert.assertEquals(0, bmpMonitor.getRouter().size());
-            Assert.assertEquals(MONITOR_ID, bmpMonitor.getMonitorId());
-            Assert.assertEquals(0, bmpMonitor.getRouter().size());
+            assertEquals(MONITOR_ID, bmpMonitor.getMonitorId());
+            assertEquals(0, bmpMonitor.getRouter().size());
+            assertEquals(MONITOR_ID, bmpMonitor.getMonitorId());
+            assertEquals(0, bmpMonitor.getRouter().size());
             return monitor;
         });
     }
@@ -208,8 +227,8 @@ public class BmpMonitorImplTest extends AbstractConcurrentDataBrokerTest {
 
 
         // channel 1 should still be open, while channel3 should be closed
-        CheckUtil.checkEquals(()-> assertTrue(channel1.isOpen()));
-        CheckUtil.checkEquals(()-> assertFalse(channel3.isOpen()));
+        CheckUtil.checkEquals(() -> assertTrue(channel1.isOpen()));
+        CheckUtil.checkEquals(() -> assertFalse(channel3.isOpen()));
 
         // now if we close the channel 1 and try it again, it should succeed
         waitFutureSuccess(channel1.close());
@@ -376,7 +395,7 @@ public class BmpMonitorImplTest extends AbstractConcurrentDataBrokerTest {
                 final Tables tables = postPolicyRib.getTables().get(0);
                 assertTrue(tables.getAttributes().isUptodate());
                 assertEquals(3, ((org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.bgp.inet.rev150305.bmp.monitor.monitor.router.peer.post.policy.rib.tables.routes.Ipv4RoutesCase)
-                        tables.getRoutes()).getIpv4Routes().getIpv4Route().size());
+                    tables.getRoutes()).getIpv4Routes().getIpv4Route().size());
                 return tables;
             });
 
@@ -388,10 +407,10 @@ public class BmpMonitorImplTest extends AbstractConcurrentDataBrokerTest {
                 return router;
             });
         } catch (final Exception e) {
-            final StringBuffer ex = new StringBuffer();
+            final StringBuilder ex = new StringBuilder();
             ex.append(e.getMessage()).append("\n");
             for (final StackTraceElement element : e.getStackTrace()) {
-                ex.append(element.toString() + "\n");
+                ex.append(element.toString()).append("\n");
             }
             fail(ex.toString());
         }
@@ -400,12 +419,13 @@ public class BmpMonitorImplTest extends AbstractConcurrentDataBrokerTest {
 
     @Test
     public void deploySecondInstance() throws Exception {
-        final BmpMonitoringStation monitoringStation2 = BmpMonitoringStationImpl.createBmpMonitorInstance(new SimpleRIBExtensionProviderContext(), this.dispatcher, getDomBroker(),
-                new MonitorId("monitor2"), new InetSocketAddress(InetAddresses.forString(MONITOR_LOCAL_ADDRESS_2), MONITOR_LOCAL_PORT), KeyMapping.getKeyMapping(),
-                this.mappingService.getCodecFactory(), this.moduleInfoBackedContext.getSchemaContext(), null);
+        final BmpMonitoringStation monitoringStation2 = BmpMonitoringStationImpl
+            .createBmpMonitorInstance(this.ribExtension, this.dispatcher, getDomBroker(), this.tree,
+                new MonitorId("monitor2"), new InetSocketAddress(InetAddresses.forString(MONITOR_LOCAL_ADDRESS_2),
+                    MONITOR_LOCAL_PORT),null);
 
         readDataOperational(getDataBroker(), BMP_II, monitor -> {
-            Assert.assertEquals(2, monitor.getMonitor().size());
+            assertEquals(2, monitor.getMonitor().size());
             return monitor;
         });
 
@@ -416,9 +436,9 @@ public class BmpMonitorImplTest extends AbstractConcurrentDataBrokerTest {
         final BmpHandlerFactory hf = new BmpHandlerFactory(msgRegistry);
         final Bootstrap b = new Bootstrap();
         final EventLoopGroup workerGroup;
-        if(Epoll.isAvailable()){
+        if (Epoll.isAvailable()) {
             b.channel(EpollSocketChannel.class);
-            workerGroup =new EpollEventLoopGroup();
+            workerGroup = new EpollEventLoopGroup();
         } else {
             b.channel(NioSocketChannel.class);
             workerGroup = new NioEventLoopGroup();
index 25c16580152df293ea10e88de14a4ccf69bd9db5..3ba7272a60c57d63732686bd63267bedd485d670 100644 (file)
@@ -16,13 +16,10 @@ import org.opendaylight.yangtools.yang.binding.Notification;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-/**
- * Created by cgasparini on 21.5.2015.
- */
 public class BmpTestSessionListener implements BmpSessionListener {
 
     private static final Logger LOG = LoggerFactory.getLogger(BmpTestSessionListener.class);
-    private List<Notification> messages = Lists.newArrayList();
+    private final List<Notification> messages = Lists.newArrayList();
     private boolean up = false;
 
     public boolean isUp () {
index 5515633d6df63b206b694172e183dcf09dcc2410..0fa5f9a196ba2f53ec2caeb994f9c8c3439c478f 100644 (file)
@@ -7,8 +7,6 @@
  */
 package org.opendaylight.protocol.bgp.rib.impl;
 
-import static org.opendaylight.protocol.concepts.KeyMapping.getKeyMapping;
-
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import io.netty.bootstrap.Bootstrap;
@@ -76,7 +74,7 @@ public class BGPDispatcherImpl implements BGPDispatcher, AutoCloseable {
 
     @Override
     public synchronized Future<BGPSessionImpl> createClient(final InetSocketAddress remoteAddress, final int retryTimer) {
-        return createClient(remoteAddress, retryTimer, createClientBootStrap(getKeyMapping(), false));
+        return createClient(remoteAddress, retryTimer, createClientBootStrap(KeyMapping.getKeyMapping(), false));
     }
 
     private synchronized Future<BGPSessionImpl> createClient(final InetSocketAddress remoteAddress,
@@ -95,7 +93,7 @@ public class BGPDispatcherImpl implements BGPDispatcher, AutoCloseable {
     @VisibleForTesting
     public synchronized Future<BGPSessionImpl> createClient(final InetSocketAddress localAddress,
         final InetSocketAddress remoteAddress, final int retryTimer, final boolean reuseAddress) {
-        final Bootstrap clientBootStrap = createClientBootStrap(getKeyMapping(), reuseAddress);
+        final Bootstrap clientBootStrap = createClientBootStrap(KeyMapping.getKeyMapping(), reuseAddress);
         clientBootStrap.localAddress(localAddress);
         return createClient(remoteAddress, retryTimer, clientBootStrap);
     }
index e24957b8528573365be02eff579c7194b62b7126..7c04d4426c3e2afaf97546eaafbbc9e3efebdbd9 100644 (file)
@@ -9,9 +9,12 @@ package org.opendaylight.protocol.concepts;
 
 import static com.google.common.base.Strings.isNullOrEmpty;
 
+import com.google.common.collect.ImmutableMap;
 import java.net.InetAddress;
 import java.nio.charset.StandardCharsets;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.Map;
 import javax.annotation.Nonnull;
 import javax.annotation.Nullable;