/*
- * Copyright (c) 2017 AT&T Intellectual Property. All rights reserved.
+ * Copyright (c) 2017 AT&T Intellectual Property. 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;
+package org.opendaylight.bgpcep.config.loader.bmp;
import static java.util.Objects.requireNonNull;
+import com.google.common.annotations.VisibleForTesting;
import java.util.Collection;
-import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ExecutionException;
import javax.annotation.concurrent.GuardedBy;
-import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
+import org.opendaylight.bgpcep.config.loader.spi.ConfigFileProcessor;
+import org.opendaylight.bgpcep.config.loader.spi.ConfigLoader;
+import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
+import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
-import org.opendaylight.protocol.bgp.config.loader.spi.ConfigFileProcessor;
-import org.opendaylight.protocol.bgp.config.loader.spi.ConfigLoader;
-import org.opendaylight.protocol.bmp.impl.api.BmpDeployer;
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.yangtools.concepts.AbstractRegistration;
-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.schema.ContainerNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
public final class BmpMonitorConfigFileProcessor implements ConfigFileProcessor, AutoCloseable {
+ @VisibleForTesting
+ static final InstanceIdentifier<OdlBmpMonitors> ODL_BMP_MONITORS_IID =
+ InstanceIdentifier.create(OdlBmpMonitors.class);
private static final Logger LOG = LoggerFactory.getLogger(BmpMonitorConfigFileProcessor.class);
-
private final SchemaPath bmpMonitorsSchemaPath = SchemaPath.create(true, OdlBmpMonitors.QNAME);
- private final BmpDeployer deployer;
private final BindingNormalizedNodeSerializer bindingSerializer;
private final YangInstanceIdentifier bmpMonitorsYii;
private final ConfigLoader configLoader;
+ private final DataBroker dataBroker;
@GuardedBy("this")
private AbstractRegistration registration;
- public BmpMonitorConfigFileProcessor(final ConfigLoader configLoader, final BmpDeployer deployer) {
+ public BmpMonitorConfigFileProcessor(final ConfigLoader configLoader, final DataBroker dataBroker) {
requireNonNull(configLoader);
- this.deployer = requireNonNull(deployer);
this.configLoader = requireNonNull(configLoader);
+ this.dataBroker = requireNonNull(dataBroker);
this.bindingSerializer = configLoader.getBindingNormalizedNodeSerializer();
this.bmpMonitorsYii = this.bindingSerializer.toYangInstanceIdentifier(
InstanceIdentifier.create(OdlBmpMonitors.class).child(BmpMonitorConfig.class));
}
- public synchronized void register() {
+ private static void processBmpMonitorConfig(final BmpMonitorConfig bmpConfig, final WriteTransaction wtx) {
+ final KeyedInstanceIdentifier<BmpMonitorConfig, BmpMonitorConfigKey> iid = ODL_BMP_MONITORS_IID
+ .child(BmpMonitorConfig.class, bmpConfig.getKey());
+
+ wtx.merge(LogicalDatastoreType.CONFIGURATION, iid, bmpConfig, true);
+ }
+
+ public synchronized void init() {
this.registration = this.configLoader.registerConfigFile(this);
+ LOG.info("BMP Config Loader service initiated");
}
@Override
public synchronized void close() {
- if(this.registration != null) {
+ if (this.registration != null) {
this.registration.close();
this.registration = null;
}
}
@Override
- public void loadConfiguration(final NormalizedNode<?, ?> dto) {
+ public synchronized void loadConfiguration(final NormalizedNode<?, ?> dto) {
final ContainerNode bmpMonitorsConfigsContainer = (ContainerNode) dto;
final MapNode monitorsList = (MapNode) bmpMonitorsConfigsContainer.getChild(
this.bmpMonitorsYii.getLastPathArgument()).orNull();
return;
}
final Collection<MapEntryNode> bmpMonitorConfig = monitorsList.getValue();
- for (final MapEntryNode topology : bmpMonitorConfig) {
- final Map.Entry<InstanceIdentifier<?>, DataObject> bi = this.bindingSerializer
- .fromNormalizedNode(this.bmpMonitorsYii, topology);
- if (bi != null) {
- final BmpMonitorConfig config = (BmpMonitorConfig) bi.getValue();
- try {
- this.deployer.writeBmpMonitor(config);
- } catch (final TransactionCommitFailedException e) {
- LOG.error("Failed to create BMP Monitor {}.", config, e);
- }
- }
+ final WriteTransaction wtx = this.dataBroker.newWriteOnlyTransaction();
+
+ bmpMonitorConfig.stream().map(topology -> this.bindingSerializer
+ .fromNormalizedNode(this.bmpMonitorsYii, topology))
+ .filter(Objects::nonNull)
+ .forEach(bi -> processBmpMonitorConfig((BmpMonitorConfig) bi.getValue(), wtx));
+
+ try {
+ wtx.submit().get();
+ } catch (final ExecutionException | InterruptedException e) {
+ LOG.warn("Failed to create Bmp config", e);
}
}
}