Add running configuration data to get netconf operation response
[controller.git] / opendaylight / netconf / config-netconf-connector / src / main / java / org / opendaylight / controller / netconf / confignetconfconnector / mapping / runtime / Runtime.java
index 8af1e0ee90e94fe7c009eb93ece4b1f478b16d4f..64f295a4d885f784a1f2c6a0ddaea915bc19ee8e 100644 (file)
@@ -12,26 +12,37 @@ import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Multimap;
 import org.opendaylight.controller.config.api.jmx.ObjectNameUtil;
+import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.Config;
+import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ModuleConfig;
+import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.Services;
 import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants;
 import org.opendaylight.controller.netconf.util.xml.XmlUtil;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 
 import javax.management.ObjectName;
+import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
 
 public class Runtime {
 
     private final Map<String, Map<String, ModuleRuntime>> moduleRuntimes;
+    private final Map<String, Map<String, ModuleConfig>> moduleConfigs;
 
-    public Runtime(Map<String, Map<String, ModuleRuntime>> moduleRuntimes) {
+    public Runtime(Map<String, Map<String, ModuleRuntime>> moduleRuntimes,
+            Map<String, Map<String, ModuleConfig>> moduleConfigs) {
         this.moduleRuntimes = moduleRuntimes;
+        this.moduleConfigs = moduleConfigs;
     }
 
     private Map<String, Multimap<String, ObjectName>> mapInstancesToModules(Set<ObjectName> instancesToMap) {
         Map<String, Multimap<String, ObjectName>> retVal = Maps.newHashMap();
 
+        // TODO map to namepsace, prevent module name conflicts
+        // this code does not support same module names from different namespaces
+        // Namespace should be present in ObjectName
+
         for (ObjectName objectName : instancesToMap) {
             String moduleName = ObjectNameUtil.getFactoryName(objectName);
 
@@ -49,7 +60,9 @@ public class Runtime {
         return retVal;
     }
 
-    public Element toXml(Set<ObjectName> instancesToMap, Document document) {
+    public Element toXml(Set<ObjectName> instancesToMap, Set<ObjectName> configBeans, Document document) {
+        Services serviceTracker = new Services();
+
         Element root = document.createElement(XmlNetconfConstants.DATA_KEY);
 
         Element modulesElement = document.createElement(XmlNetconfConstants.MODULES_KEY);
@@ -57,19 +70,30 @@ public class Runtime {
                 XmlNetconfConstants.URN_OPENDAYLIGHT_PARAMS_XML_NS_YANG_CONTROLLER_CONFIG);
         root.appendChild(modulesElement);
 
-        Map<String, Multimap<String, ObjectName>> moduleToInstances = mapInstancesToModules(instancesToMap);
+        Map<String, Multimap<String, ObjectName>> moduleToRuntimeInstance = mapInstancesToModules(instancesToMap);
+        Map<String, Map<String, Collection<ObjectName>>> moduleToConfigInstance = Config.getMappedInstances(
+                configBeans, serviceTracker, moduleConfigs);
+
+        for (String localNamespace : moduleConfigs.keySet()) {
+
+            Map<String, Collection<ObjectName>> instanceToMbe = moduleToConfigInstance.get(localNamespace);
 
-        for (String localNamespace : moduleRuntimes.keySet()) {
-            for (String moduleName : moduleRuntimes.get(localNamespace).keySet()) {
-                Multimap<String, ObjectName> instanceToRbe = moduleToInstances.get(moduleName);
+            for (String moduleName : moduleConfigs.get(localNamespace).keySet()) {
+                Multimap<String, ObjectName> instanceToRbe = moduleToRuntimeInstance.get(moduleName);
 
-                if (instanceToRbe == null)
-                    continue;
+                for (ObjectName instanceON : instanceToMbe.get(moduleName)) {
+                    String instanceName = ObjectNameUtil.getInstanceName(instanceON);
 
-                for (String instanceName : instanceToRbe.keySet()) {
-                    ModuleRuntime moduleRuntime = moduleRuntimes.get(localNamespace).get(moduleName);
-                    Element innerXml = moduleRuntime.toXml(localNamespace, instanceName, instanceToRbe.get(instanceName), document);
-                    modulesElement.appendChild(innerXml);
+                    Element runtimeXml;
+                    ModuleConfig moduleConfig = moduleConfigs.get(localNamespace).get(moduleName);
+                    if(instanceToRbe==null || instanceToRbe.containsKey(instanceName) == false) {
+                        runtimeXml = moduleConfig.toXml(instanceON, serviceTracker, document, localNamespace);
+                    } else {
+                        ModuleRuntime moduleRuntime = moduleRuntimes.get(localNamespace).get(moduleName);
+                        runtimeXml = moduleRuntime.toXml(localNamespace, instanceToRbe.get(instanceName), document,
+                                moduleConfig, instanceON, serviceTracker);
+                    }
+                    modulesElement.appendChild(runtimeXml);
                 }
 
             }
@@ -78,4 +102,14 @@ public class Runtime {
         return root;
     }
 
+    private ObjectName findInstance(Collection<ObjectName> objectNames, String instanceName) {
+        for (ObjectName objectName : objectNames) {
+            String name = ObjectNameUtil.getInstanceName(objectName);
+            if(name.equals(instanceName))
+                return objectName;
+        }
+
+        throw new UnsupportedOperationException("Unable to find config bean instance under name " + instanceName + " among " + objectNames);
+    }
+
 }