Migrate users of NormalizedNode.getIdentifier()
[bgpcep.git] / config-loader / protocols-config-loader / src / main / java / org / opendaylight / bgpcep / config / loader / protocols / ProtocolsConfigFileProcessor.java
1 /*
2  * Copyright (c) 2017 AT&T Intellectual Property. All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.bgpcep.config.loader.protocols;
9
10 import com.google.common.annotations.VisibleForTesting;
11 import com.google.common.util.concurrent.FluentFuture;
12 import javax.annotation.PostConstruct;
13 import javax.annotation.PreDestroy;
14 import javax.inject.Inject;
15 import javax.inject.Singleton;
16 import org.eclipse.jdt.annotation.NonNull;
17 import org.opendaylight.bgpcep.config.loader.spi.AbstractConfigFileProcessor;
18 import org.opendaylight.bgpcep.config.loader.spi.ConfigLoader;
19 import org.opendaylight.mdsal.common.api.CommitInfo;
20 import org.opendaylight.mdsal.common.api.LogicalDatastoreType;
21 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
22 import org.opendaylight.mdsal.dom.api.DOMDataTreeWriteTransaction;
23 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.NetworkInstances;
24 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.NetworkInstance;
25 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.Protocols;
26 import org.opendaylight.yang.gen.v1.http.openconfig.net.yang.network.instance.rev151018.network.instance.top.network.instances.network.instance.protocols.Protocol;
27 import org.opendaylight.yangtools.yang.common.QName;
28 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
29 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier;
30 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates;
31 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
32 import org.opendaylight.yangtools.yang.data.api.schema.MapNode;
33 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
34 import org.opendaylight.yangtools.yang.data.impl.schema.Builders;
35 import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
36 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Absolute;
37
38 @Singleton
39 public final class ProtocolsConfigFileProcessor extends AbstractConfigFileProcessor {
40     private static final QName NAME = QName.create(NetworkInstance.QNAME, "name").intern();
41
42     // TODO: isn't there a better place where we can get this?
43     @VisibleForTesting
44     static final String GLOBAL_BGP_NAME = "global-bgp";
45
46     private static final @NonNull NodeIdentifierWithPredicates GLOBAL_BGP =
47         NodeIdentifierWithPredicates.of(NetworkInstance.QNAME, NAME, GLOBAL_BGP_NAME);
48     private static final @NonNull YangInstanceIdentifier GLOBAL_BGP_PATH = YangInstanceIdentifier.create(
49         NodeIdentifier.create(NetworkInstances.QNAME), NodeIdentifier.create(NetworkInstance.QNAME), GLOBAL_BGP);
50
51     @Inject
52     public ProtocolsConfigFileProcessor(final ConfigLoader configLoader, final DOMDataBroker dataBroker) {
53         super("Protocols", configLoader, dataBroker);
54     }
55
56     @PostConstruct
57     public void init() {
58         start();
59     }
60
61     @PreDestroy
62     @Override
63     public void close() {
64         stop();
65     }
66
67     @Override
68     public Absolute fileRootSchema() {
69         return Absolute.of(NetworkInstances.QNAME, NetworkInstance.QNAME, Protocols.QNAME);
70     }
71
72     @Override
73     protected FluentFuture<? extends CommitInfo> loadConfiguration(final DOMDataBroker dataBroker,
74             final NormalizedNode dto) {
75         final ContainerNode protocolsContainer = (ContainerNode) dto;
76         final MapNode protocols = (MapNode) protocolsContainer.childByArg(new NodeIdentifier(Protocol.QNAME));
77         if (protocols == null) {
78             return CommitInfo.emptyFluentFuture();
79         }
80
81         final DOMDataTreeWriteTransaction wtx = dataBroker.newWriteOnlyTransaction();
82
83         // Ensure global-bgp exists
84         wtx.merge(LogicalDatastoreType.CONFIGURATION, GLOBAL_BGP_PATH, Builders.mapEntryBuilder()
85             .withNodeIdentifier(GLOBAL_BGP)
86             .withChild(ImmutableNodes.leafNode(NAME, GLOBAL_BGP_NAME))
87             .build());
88         wtx.merge(LogicalDatastoreType.CONFIGURATION,
89             GLOBAL_BGP_PATH.node(Protocols.QNAME).node(protocols.name()), protocols);
90         return wtx.commit();
91     }
92 }