*/
package org.opendaylight.bgpcep.config.loader.protocols;
-import static java.util.Objects.requireNonNull;
-
import com.google.common.annotations.VisibleForTesting;
-import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.ExecutionException;
-import org.opendaylight.bgpcep.config.loader.spi.ConfigFileProcessor;
+import com.google.common.util.concurrent.FluentFuture;
+import javax.annotation.PostConstruct;
+import javax.annotation.PreDestroy;
+import javax.inject.Inject;
+import javax.inject.Singleton;
+import org.eclipse.jdt.annotation.NonNull;
+import org.opendaylight.bgpcep.config.loader.spi.AbstractConfigFileProcessor;
import org.opendaylight.bgpcep.config.loader.spi.ConfigLoader;
-import org.opendaylight.mdsal.binding.api.DataBroker;
-import org.opendaylight.mdsal.binding.api.WriteTransaction;
-import org.opendaylight.mdsal.binding.dom.codec.api.BindingNormalizedNodeSerializer;
+import org.opendaylight.mdsal.common.api.CommitInfo;
import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
+import org.opendaylight.mdsal.dom.api.DOMDataBroker;
+import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstanceKey;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
-import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.ProtocolKey;
-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.common.QName;
import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
+import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
-import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode;
import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
-import org.opendaylight.yangtools.yang.model.api.SchemaPath;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.opendaylight.yangtools.yang.data.spi.node.ImmutableNodes;
+import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
-public final class ProtocolsConfigFileProcessor implements ConfigFileProcessor, AutoCloseable {
+@Singleton
+public final class ProtocolsConfigFileProcessor extends AbstractConfigFileProcessor {
+ private static final QName NAME = QName.create(NetworkInstance.QNAME, "name").intern();
+ // TODO: isn't there a better place where we can get this?
@VisibleForTesting
- static final InstanceIdentifier<Protocols> BGP_PROTOCOLS_IID =
- InstanceIdentifier.create(NetworkInstances.class)
- .child(NetworkInstance.class, new NetworkInstanceKey("global-bgp")).child(Protocols.class);
- private static final Logger LOG = LoggerFactory.getLogger(ProtocolsConfigFileProcessor.class);
- private static final SchemaPath PROTOCOLS_SCHEMA_PATH = SchemaPath
- .create(true, NetworkInstances.QNAME, NetworkInstance.QNAME, Protocols.QNAME);
- private final BindingNormalizedNodeSerializer bindingSerializer;
- private final YangInstanceIdentifier protocolYIId;
- private final DataBroker dataBroker;
- private final ConfigLoader configLoader;
- private AbstractRegistration registration;
+ static final String GLOBAL_BGP_NAME = "global-bgp";
- public ProtocolsConfigFileProcessor(final ConfigLoader configLoader, final DataBroker dataBroker) {
- requireNonNull(configLoader);
- this.dataBroker = requireNonNull(dataBroker);
- this.configLoader = requireNonNull(configLoader);
- this.bindingSerializer = configLoader.getBindingNormalizedNodeSerializer();
- this.protocolYIId = this.bindingSerializer
- .toYangInstanceIdentifier(BGP_PROTOCOLS_IID.child(Protocol.class));
- }
+ private static final @NonNull NodeIdentifierWithPredicates GLOBAL_BGP =
+ NodeIdentifierWithPredicates.of(NetworkInstance.QNAME, NAME, GLOBAL_BGP_NAME);
+ private static final @NonNull YangInstanceIdentifier GLOBAL_BGP_PATH = YangInstanceIdentifier.of(
+ NodeIdentifier.create(NetworkInstances.QNAME), NodeIdentifier.create(NetworkInstance.QNAME), GLOBAL_BGP);
- private static void processProtocol(final Protocol protocol, final WriteTransaction wtx) {
- final KeyedInstanceIdentifier<Protocol, ProtocolKey> topologyIIdKeyed =
- BGP_PROTOCOLS_IID.child(Protocol.class, protocol.key());
- wtx.mergeParentStructureMerge(LogicalDatastoreType.CONFIGURATION, topologyIIdKeyed, protocol);
+ @Inject
+ public ProtocolsConfigFileProcessor(final ConfigLoader configLoader, final DOMDataBroker dataBroker) {
+ super("Protocols", configLoader, dataBroker);
}
- public synchronized void init() {
- this.registration = configLoader.registerConfigFile(this);
- LOG.info("Protocols Loader service initiated");
+ @PostConstruct
+ public void init() {
+ start();
}
+ @PreDestroy
@Override
- public SchemaPath getSchemaPath() {
- return PROTOCOLS_SCHEMA_PATH;
+ public void close() {
+ stop();
}
@Override
- public synchronized void loadConfiguration(final NormalizedNode<?, ?> dto) {
- final ContainerNode protocolsContainer = (ContainerNode) dto;
- final MapNode protocolList = (MapNode) protocolsContainer
- .getChild(protocolYIId.getLastPathArgument()).get();
- final Collection<MapEntryNode> protocolsCollection = protocolList.getValue();
- final WriteTransaction wtx = this.dataBroker.newWriteOnlyTransaction();
- for (final MapEntryNode protocolEntry : protocolsCollection) {
- final Map.Entry<InstanceIdentifier<?>, DataObject> bi = this.bindingSerializer
- .fromNormalizedNode(this.protocolYIId, protocolEntry);
- if (bi != null) {
- final Protocol protocol = (Protocol) bi.getValue();
- processProtocol(protocol, wtx);
- }
- }
- try {
- wtx.commit().get();
- } catch (final ExecutionException | InterruptedException e) {
- LOG.warn("Failed to create Protocol", e);
- }
+ public Absolute fileRootSchema() {
+ return Absolute.of(NetworkInstances.QNAME, NetworkInstance.QNAME, Protocols.QNAME);
}
@Override
- public synchronized void close() {
- if (this.registration != null) {
- this.registration.close();
- this.registration = null;
+ protected FluentFuture<? extends CommitInfo> loadConfiguration(final DOMDataBroker dataBroker,
+ final NormalizedNode dto) {
+ final ContainerNode protocolsContainer = (ContainerNode) dto;
+ final MapNode protocols = (MapNode) protocolsContainer.childByArg(new NodeIdentifier(Protocol.QNAME));
+ if (protocols == null) {
+ return CommitInfo.emptyFluentFuture();
}
+
+ final DOMDataTreeWriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
+
+ // Ensure global-bgp exists
+ wtx.merge(LogicalDatastoreType.CONFIGURATION, GLOBAL_BGP_PATH, ImmutableNodes.newMapEntryBuilder()
+ .withNodeIdentifier(GLOBAL_BGP)
+ .withChild(ImmutableNodes.leafNode(NAME, GLOBAL_BGP_NAME))
+ .build());
+ wtx.merge(LogicalDatastoreType.CONFIGURATION,
+ GLOBAL_BGP_PATH.node(Protocols.QNAME).node(protocols.name()), protocols);
+ return wtx.commit();
}
}