--- /dev/null
+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
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;
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);
@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;
}
-
}
--- /dev/null
+/*
+ * 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;
+}
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;
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;
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;
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) {
wTx.submit().checkedGet();
LOG.info("BMP monitoring station {} closed.", this.monitorId.getValue());
}
-
}
--- /dev/null
+/*
+ * 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();
+ }
+}
--- /dev/null
+/*
+ * 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;
+ }
+}
--- /dev/null
+/*
+ * 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();
+ }
+ }
+}
<?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
+++ /dev/null
-/*
- * 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);
- }
-}
+++ /dev/null
-/*
- * 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;
- }
-}
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;
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
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;
private BmpDispatcher dispatcher;
private BmpMonitoringStation bmpApp;
private BmpMessageRegistry msgRegistry;
- private ModuleInfoBackedContext moduleInfoBackedContext;
+ private BindingCodecTree tree;
+ private RIBExtensionProviderContext ribExtension;
@Before
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();
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;
});
}
// 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());
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;
});
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());
}
@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;
});
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();
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 () {
*/
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;
@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,
@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);
}
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;