Merge "Add filtering capability to config.ini in order to reference logging bridge...
[controller.git] / opendaylight / netconf / config-netconf-connector / src / main / java / org / opendaylight / controller / netconf / confignetconfconnector / osgi / NetconfOperationServiceImpl.java
1 /*
2  * Copyright (c) 2013 Cisco Systems, Inc. and others.  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
9 package org.opendaylight.controller.netconf.confignetconfconnector.osgi;
10
11 import com.google.common.annotations.VisibleForTesting;
12 import com.google.common.base.Optional;
13 import com.google.common.base.Preconditions;
14 import com.google.common.collect.Sets;
15 import org.opendaylight.controller.config.api.LookupRegistry;
16 import org.opendaylight.controller.config.util.ConfigRegistryJMXClient;
17 import org.opendaylight.controller.config.yangjmxgenerator.ModuleMXBeanEntry;
18 import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider;
19 import org.opendaylight.controller.netconf.confignetconfconnector.util.Util;
20 import org.opendaylight.controller.netconf.mapping.api.Capability;
21 import org.opendaylight.controller.netconf.mapping.api.NetconfOperation;
22 import org.opendaylight.controller.netconf.mapping.api.NetconfOperationService;
23 import org.opendaylight.yangtools.yang.model.api.Module;
24
25 import java.util.HashSet;
26 import java.util.List;
27 import java.util.Map;
28 import java.util.Set;
29
30 /**
31  * Manages life cycle of {@link YangStoreSnapshot}.
32  */
33 public class NetconfOperationServiceImpl implements NetconfOperationService {
34
35     private final YangStoreSnapshot yangStoreSnapshot;
36     private final NetconfOperationProvider operationProvider;
37     private final Set<Capability> capabilities;
38     private final TransactionProvider transactionProvider;
39
40     public NetconfOperationServiceImpl(YangStoreService yangStoreService, ConfigRegistryJMXClient jmxClient,
41             String netconfSessionIdForReporting) throws YangStoreException {
42
43         yangStoreSnapshot = yangStoreService.getYangStoreSnapshot();
44         checkConsistencyBetweenYangStoreAndConfig(jmxClient, yangStoreSnapshot);
45
46         transactionProvider = new TransactionProvider(jmxClient, netconfSessionIdForReporting);
47         operationProvider = new NetconfOperationProvider(yangStoreSnapshot, jmxClient, transactionProvider,
48                 netconfSessionIdForReporting);
49         capabilities = setupCapabilities(yangStoreSnapshot);
50     }
51
52
53     @VisibleForTesting
54     static void checkConsistencyBetweenYangStoreAndConfig(LookupRegistry jmxClient, YangStoreSnapshot yangStoreSnapshot) {
55         Set<String> missingModulesFromConfig = Sets.newHashSet();
56
57         Set<String> modulesSeenByConfig = jmxClient.getAvailableModuleFactoryQNames();
58         Map<String, Map<String, ModuleMXBeanEntry>> moduleMXBeanEntryMap = yangStoreSnapshot.getModuleMXBeanEntryMap();
59
60         for (Map<String, ModuleMXBeanEntry> moduleNameToMBE : moduleMXBeanEntryMap.values()) {
61             for (ModuleMXBeanEntry moduleMXBeanEntry : moduleNameToMBE.values()) {
62                 String moduleSeenByYangStore = moduleMXBeanEntry.getYangModuleQName().toString();
63                 if(modulesSeenByConfig.contains(moduleSeenByYangStore) == false)
64                     missingModulesFromConfig.add(moduleSeenByYangStore);
65             }
66         }
67
68         Preconditions
69                 .checkState(
70                         missingModulesFromConfig.isEmpty(),
71                         "There are inconsistencies between configuration subsystem and yangstore in terms of discovered yang modules, yang modules missing from config subsystem but present in yangstore: %s, %sAll modules present in config: %s",
72                         missingModulesFromConfig, System.lineSeparator(), modulesSeenByConfig);
73
74     }
75
76     @Override
77     public void close() {
78         yangStoreSnapshot.close();
79         transactionProvider.close();
80     }
81
82     @Override
83     public Set<Capability> getCapabilities() {
84         return capabilities;
85     }
86
87     @Override
88     public Set<NetconfOperation> getNetconfOperations() {
89         return operationProvider.getOperations();
90     }
91
92     private static Set<Capability> setupCapabilities(YangStoreSnapshot yangStoreSnapshot) {
93         Set<Capability> capabilities = new HashSet<>();
94         // [RFC6241] 8.3.  Candidate Configuration Capability
95         capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:candidate:1.0"));
96         // [RFC6241] 8.5.  Rollback-on-Error Capability
97         capabilities.add(new BasicCapability("urn:ietf:params:netconf:capability:rollback-on-error:1.0"));
98
99         Set<Module> modules = yangStoreSnapshot.getModules();
100         for (Module module : modules) {
101             capabilities.add(new YangStoreCapability(module, yangStoreSnapshot.getModuleSource(module)));
102         }
103
104         return capabilities;
105     }
106
107     private static class BasicCapability implements Capability {
108
109         private final String capability;
110
111         private BasicCapability(String capability) {
112             this.capability = capability;
113         }
114
115         @Override
116         public String getCapabilityUri() {
117             return capability;
118         }
119
120         @Override
121         public Optional<String> getModuleNamespace() {
122             return Optional.absent();
123         }
124
125         @Override
126         public Optional<String> getModuleName() {
127             return Optional.absent();
128         }
129
130         @Override
131         public Optional<String> getRevision() {
132             return Optional.absent();
133         }
134
135         @Override
136         public Optional<String> getCapabilitySchema() {
137             return Optional.absent();
138         }
139
140         @Override
141         public Optional<List<String>> getLocation() {
142             return Optional.absent();
143         }
144     }
145
146     private static class YangStoreCapability extends BasicCapability {
147
148         private final String content;
149         private final String revision;
150         private final String moduleName;
151         private final String moduleNamespace;
152
153         public YangStoreCapability(Module module, String moduleContent) {
154             super(toCapabilityURI(module));
155             this.content = moduleContent;
156             this.moduleName = module.getName();
157             this.moduleNamespace = module.getNamespace().toString();
158             this.revision = Util.writeDate(module.getRevision());
159         }
160
161         @Override
162         public Optional<String> getCapabilitySchema() {
163             return Optional.of(content);
164         }
165
166         private static String toCapabilityURI(Module module) {
167             return String.valueOf(module.getNamespace()) + "?module="
168                     + module.getName() + "&revision=" + Util.writeDate(module.getRevision());
169         }
170
171         @Override
172         public Optional<String> getModuleName() {
173             return Optional.of(moduleName);
174         }
175
176         @Override
177         public Optional<String> getModuleNamespace() {
178             return Optional.of(moduleNamespace);
179         }
180
181         @Override
182         public Optional<String> getRevision() {
183             return Optional.of(revision);
184         }
185     }
186 }