Change type of service-ref grouping to service-type-ref from leafref. 59/2959/2
authorTomas Olvecky <tolvecky@cisco.com>
Thu, 21 Nov 2013 16:07:26 +0000 (17:07 +0100)
committerTomas Olvecky <tolvecky@cisco.com>
Thu, 21 Nov 2013 16:12:02 +0000 (17:12 +0100)
Also fix bug in config-netconf-connector where edit strategy was in global scope.

Change-Id: Ia09a11078c87ffa4c6fa8de34f0b69b438b6c50e
Signed-off-by: Tomas Olvecky <tolvecky@cisco.com>
opendaylight/config/config-api/src/main/resources/META-INF/yang/config.yang
opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/Config.java
opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/InstanceConfig.java
opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/InstanceConfigElementResolved.java
opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/mapping/config/ModuleConfig.java
opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfig.java
opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfigXmlParser.java
opendaylight/netconf/config-netconf-connector/src/main/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditStrategyType.java
opendaylight/netconf/config-netconf-connector/src/test/java/org/opendaylight/controller/netconf/confignetconfconnector/operations/editconfig/EditConfigTest.java

index 5d6c11fbeead51a0652ce151265ca3e50313f7d0..a0a4292adf406a597fa120cdbf869c5b4cc0e0c6 100644 (file)
@@ -122,9 +122,7 @@ module config {
                  the actual service-type which is actually required.";
 
             mandatory true;
-            type leafref {
-                path "/config:services/config:service/config:type";
-            }
+            type service-type-ref;
         }
 
         leaf name {
index ca849c71cf8bcc8ca50b543d9b97a0ac79af2e27..115fc2ccb6dc6f75c4a40cc15e95d2e6cc63a56a 100644 (file)
@@ -15,6 +15,7 @@ import com.google.common.collect.Lists;
 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.operations.editconfig.EditStrategyType;
 import org.opendaylight.controller.netconf.util.xml.XmlElement;
 import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants;
 import org.opendaylight.controller.netconf.util.xml.XmlUtil;
@@ -162,7 +163,8 @@ public class Config {
     // TODO refactor, replace string representing namespace with namespace class
     // TODO refactor, replace Map->Multimap with e.g. ConfigElementResolved
     // class
-    public Map<String, Multimap<String, ModuleElementResolved>> fromXml(XmlElement xml, Set<ObjectName> instancesForFillingServiceRefMapping) {
+    public Map<String, Multimap<String, ModuleElementResolved>> fromXml(XmlElement xml, Set<ObjectName> instancesForFillingServiceRefMapping,
+                                                                        EditStrategyType defaultEditStrategyType) {
         Map<String, Multimap<String, ModuleElementResolved>> retVal = Maps.newHashMap();
 
         List<XmlElement> recognisedChildren = Lists.newArrayList();
@@ -173,7 +175,7 @@ public class Config {
         xml.checkUnrecognisedElements(recognisedChildren);
 
         for (XmlElement moduleElement : moduleElements) {
-            resolveModule(retVal, serviceTracker, moduleElement);
+            resolveModule(retVal, serviceTracker, moduleElement, defaultEditStrategyType);
         }
 
         return retVal;
@@ -194,7 +196,7 @@ public class Config {
     }
 
     private void resolveModule(Map<String, Multimap<String, ModuleElementResolved>> retVal, Services serviceTracker,
-            XmlElement moduleElement) {
+            XmlElement moduleElement, EditStrategyType defaultStrategy) {
         XmlElement typeElement = moduleElement.getOnlyChildElementWithSameNamespace(XmlNetconfConstants.TYPE_KEY);
         Entry<String, String> prefixToNamespace = typeElement.findNamespaceOfTextContent();
         String moduleNamespace = prefixToNamespace.getValue();
@@ -213,7 +215,7 @@ public class Config {
         }
 
         ModuleElementResolved moduleElementResolved = moduleMapping.fromXml(moduleElement, serviceTracker,
-                instanceName, moduleNamespace);
+                instanceName, moduleNamespace, defaultStrategy);
 
         innerMap.put(factoryName, moduleElementResolved);
     }
index 549d94bdf2774fe1c453a742c01812004ae9bcc8..33858746cb0f06bdd4d7387ad8141f29a6d23b51 100644 (file)
@@ -24,6 +24,7 @@ import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attrib
 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.resolving.ObjectResolver;
 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.toxml.AttributeWritingStrategy;
 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.attributes.toxml.ObjectXmlWriter;
+import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditStrategyType;
 import org.opendaylight.controller.netconf.util.xml.XmlElement;
 import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants;
 import org.slf4j.Logger;
@@ -126,7 +127,8 @@ public final class InstanceConfig {
         }
     }
 
-    public InstanceConfigElementResolved fromXml(XmlElement moduleElement, Services services, String moduleNamespace) {
+    public InstanceConfigElementResolved fromXml(XmlElement moduleElement, Services services, String moduleNamespace,
+                                                 EditStrategyType defaultStrategy) {
         Map<String, AttributeConfigElement> retVal = Maps.newHashMap();
 
         Map<String, AttributeReadingStrategy> strats = new ObjectXmlReader().prepareReading(yangToAttrConfig);
@@ -151,7 +153,7 @@ public final class InstanceConfig {
                 XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0);
 
         InstanceConfigElementResolved instanceConfigElementResolved = perInstanceEditStrategy.equals("") ? new InstanceConfigElementResolved(
-                retVal) : new InstanceConfigElementResolved(perInstanceEditStrategy, retVal);
+                retVal, defaultStrategy) : new InstanceConfigElementResolved(perInstanceEditStrategy, retVal, defaultStrategy);
 
         resolveConfiguration(instanceConfigElementResolved, services);
         return instanceConfigElementResolved;
index 6624fc182ebf09021500856bf6bd72cd676a6214..e4bd9212e90995ae7515026c49815645afe6ff3e 100644 (file)
@@ -25,20 +25,26 @@ public class InstanceConfigElementResolved {
     private final EditStrategyType editStrategy;
     private final Map<String, AttributeConfigElement> configuration;
 
-    public InstanceConfigElementResolved(String strat, Map<String, AttributeConfigElement> configuration) {
-        EditStrategyType valueOf = checkStrategy(strat);
+    public InstanceConfigElementResolved(String currentStrategy, Map<String, AttributeConfigElement> configuration, EditStrategyType defaultStrategy) {
+        EditStrategyType valueOf = checkStrategy(currentStrategy, defaultStrategy);
         this.editStrategy = valueOf;
         this.configuration = configuration;
     }
 
-    EditStrategyType checkStrategy(String strat) {
-        EditStrategyType valueOf = EditStrategyType.valueOf(strat);
-        if (EditStrategyType.defaultStrategy().isEnforcing()) {
+    public InstanceConfigElementResolved(Map<String, AttributeConfigElement> configuration, EditStrategyType defaultStrategy) {
+        editStrategy = defaultStrategy;
+        this.configuration = configuration;
+    }
+
+
+    EditStrategyType checkStrategy(String currentStrategy, EditStrategyType defaultStrategy) {
+        EditStrategyType valueOf = EditStrategyType.valueOf(currentStrategy);
+        if (defaultStrategy.isEnforcing()) {
             Preconditions
                     .checkArgument(
-                            valueOf == EditStrategyType.defaultStrategy(),
+                            valueOf == defaultStrategy,
                             "With "
-                                    + EditStrategyType.defaultStrategy()
+                                    + defaultStrategy
                                     + " as "
                                     + EditConfigXmlParser.DEFAULT_OPERATION_KEY
                                     + " operations on module elements are not permitted since the default option is restrictive");
@@ -46,10 +52,6 @@ public class InstanceConfigElementResolved {
         return valueOf;
     }
 
-    public InstanceConfigElementResolved(Map<String, AttributeConfigElement> configuration) {
-        editStrategy = EditStrategyType.defaultStrategy();
-        this.configuration = configuration;
-    }
 
     public EditConfigStrategy getEditStrategy() {
         return editStrategy.getFittingStrategy();
index 264c9c11da0a194f265baa76135051d66c3db8c3..991a5637e1c3f549fb6609888abc8bfbae50e5bb 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.controller.netconf.confignetconfconnector.mapping.config;
 
 import org.opendaylight.controller.config.api.jmx.ObjectNameUtil;
+import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditStrategyType;
 import org.opendaylight.controller.netconf.util.xml.XmlElement;
 import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants;
 import org.opendaylight.controller.netconf.util.xml.XmlUtil;
@@ -70,9 +71,9 @@ public class ModuleConfig {
     }
 
     public ModuleElementResolved fromXml(XmlElement moduleElement, Services depTracker, String instanceName,
-            String moduleNamespace) {
+            String moduleNamespace, EditStrategyType defaultStrategy) {
 
-        InstanceConfigElementResolved ice = instanceConfig.fromXml(moduleElement, depTracker, moduleNamespace);
+        InstanceConfigElementResolved ice = instanceConfig.fromXml(moduleElement, depTracker, moduleNamespace, defaultStrategy);
         return new ModuleElementResolved(instanceName, ice);
     }
 
index d04fdbcc4398a926aca99e374621c00fb6c38510..362f0232836482626afbd0b53e8069dc531de3e8 100644 (file)
@@ -27,6 +27,7 @@ import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config
 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ModuleConfig;
 import org.opendaylight.controller.netconf.confignetconfconnector.mapping.config.ModuleElementResolved;
 import org.opendaylight.controller.netconf.confignetconfconnector.operations.AbstractConfigNetconfOperation;
+import org.opendaylight.controller.netconf.confignetconfconnector.operations.editconfig.EditConfigXmlParser.EditConfigExecution;
 import org.opendaylight.controller.netconf.confignetconfconnector.transactions.TransactionProvider;
 import org.opendaylight.controller.netconf.util.xml.XmlElement;
 import org.opendaylight.controller.netconf.util.xml.XmlNetconfConstants;
@@ -88,9 +89,9 @@ public class EditConfig extends AbstractConfigNetconfOperation {
     }
 
     private void executeTests(ConfigRegistryClient configRegistryClient,
-            EditConfigXmlParser.EditConfigExecution editConfigExecution) throws NetconfDocumentedException {
+            EditConfigExecution editConfigExecution) throws NetconfDocumentedException {
         try {
-            test(configRegistryClient, editConfigExecution.resolvedXmlElements);
+            test(configRegistryClient, editConfigExecution.getResolvedXmlElements(), editConfigExecution.getDefaultStrategy());
         } catch (IllegalStateException | JmxAttributeValidationException | ValidationException e) {
             logger.warn("Test phase for {} failed", EditConfigXmlParser.EDIT_CONFIG, e);
             final Map<String, String> errorInfo = new HashMap<>();
@@ -102,12 +103,12 @@ public class EditConfig extends AbstractConfigNetconfOperation {
     }
 
     private void test(ConfigRegistryClient configRegistryClient,
-            Map<String, Multimap<String, ModuleElementResolved>> resolvedModules) {
+                      Map<String, Multimap<String, ModuleElementResolved>> resolvedModules, EditStrategyType editStrategyType) {
         ObjectName taON = transactionProvider.getTestTransaction();
         try {
 
             // default strategy = replace wipes config
-            if (EditStrategyType.defaultStrategy() == EditStrategyType.replace) {
+            if (editStrategyType == EditStrategyType.replace) {
                 transactionProvider.wipeTestTransaction(taON);
             }
             setOnTransaction(configRegistryClient, resolvedModules, taON);
@@ -122,10 +123,10 @@ public class EditConfig extends AbstractConfigNetconfOperation {
         ObjectName taON = transactionProvider.getOrCreateTransaction();
 
         // default strategy = replace wipes config
-        if (EditStrategyType.defaultStrategy() == EditStrategyType.replace) {
+        if (editConfigExecution.getDefaultStrategy() == EditStrategyType.replace) {
             transactionProvider.wipeTransaction();
         }
-        setOnTransaction(configRegistryClient, editConfigExecution.resolvedXmlElements, taON);
+        setOnTransaction(configRegistryClient, editConfigExecution.getResolvedXmlElements(), taON);
     }
 
     private void setOnTransaction(ConfigRegistryClient configRegistryClient,
index db82aa66fc9a2f3417db73a9c7bcc9940921117b..3d4e5b6d0c2b9b431ae1d73cae22ea035cb304b6 100644 (file)
@@ -47,7 +47,7 @@ public class EditConfigXmlParser {
                                                     TransactionProvider transactionProvider, ConfigRegistryClient configRegistryClient)
             throws NetconfDocumentedException {
 
-        EditStrategyType.resetDefaultStrategy();
+        EditStrategyType editStrategyType = EditStrategyType.getDefaultStrategy();
 
         xml.checkName(EditConfigXmlParser.EDIT_CONFIG);
         xml.checkNamespace(XmlNetconfConstants.URN_IETF_PARAMS_XML_NS_NETCONF_BASE_1_0);
@@ -90,13 +90,10 @@ public class EditConfigXmlParser {
         if (defaultContent.isPresent()) {
             String mergeStrategyString = defaultContent.get().getTextContent();
             logger.trace("Setting merge strategy to {}", mergeStrategyString);
-            EditStrategyType editStrategyType = EditStrategyType.valueOf(mergeStrategyString);
-            // FIXME: thread safety, remove global state
-            EditStrategyType.setDefaultStrategy(editStrategyType);
+            editStrategyType = EditStrategyType.valueOf(mergeStrategyString);
         }
-        // FIXME: thread safety, remove global state
         Set<ObjectName> instancesForFillingServiceRefMapping = Collections.emptySet();
-        if (EditStrategyType.defaultStrategy() == EditStrategyType.merge) {
+        if (editStrategyType == EditStrategyType.merge) {
             instancesForFillingServiceRefMapping = Datastore.getInstanceQueryStrategy(targetDatastore, transactionProvider)
                     .queryInstances(configRegistryClient);
             logger.trace("Pre-filling services from following instances: {}", instancesForFillingServiceRefMapping);
@@ -104,7 +101,8 @@ public class EditConfigXmlParser {
 
         XmlElement configElement = xml.getOnlyChildElementWithSameNamespace(XmlNetconfConstants.CONFIG_KEY);
 
-        return new EditConfigXmlParser.EditConfigExecution(xml, cfgMapping, configElement, testOption, instancesForFillingServiceRefMapping);
+        return new EditConfigXmlParser.EditConfigExecution(xml, cfgMapping, configElement, testOption,
+                instancesForFillingServiceRefMapping, editStrategyType);
     }
 
     private void removeMountpointsFromConfig(XmlElement configElement, XmlElement mountpointsElement) {
@@ -137,14 +135,17 @@ public class EditConfigXmlParser {
 
     @VisibleForTesting
     static class EditConfigExecution {
-        XmlElement editConfigXml;
-        Map<String, Multimap<String, ModuleElementResolved>> resolvedXmlElements;
-        TestOption testOption;
+        private final XmlElement editConfigXml;
+        private final Map<String, Multimap<String, ModuleElementResolved>> resolvedXmlElements;
+        private final TestOption testOption;
+        private final EditStrategyType defaultEditStrategyType;
 
-        EditConfigExecution(XmlElement xml, Config configResolver, XmlElement configElement, TestOption testOption, Set<ObjectName> instancesForFillingServiceRefMapping) {
+        EditConfigExecution(XmlElement xml, Config configResolver, XmlElement configElement, TestOption testOption, Set<ObjectName> instancesForFillingServiceRefMapping,
+                            EditStrategyType defaultStrategy) {
             this.editConfigXml = xml;
-            this.resolvedXmlElements = configResolver.fromXml(configElement, instancesForFillingServiceRefMapping);
+            this.resolvedXmlElements = configResolver.fromXml(configElement, instancesForFillingServiceRefMapping, defaultStrategy);
             this.testOption = testOption;
+            this.defaultEditStrategyType = defaultStrategy;
         }
 
         boolean shouldTest() {
@@ -154,5 +155,13 @@ public class EditConfigXmlParser {
         boolean shouldSet() {
             return testOption == TestOption.set || testOption == TestOption.testThenSet;
         }
+
+        Map<String, Multimap<String, ModuleElementResolved>> getResolvedXmlElements() {
+            return resolvedXmlElements;
+        }
+
+        EditStrategyType getDefaultStrategy() {
+            return defaultEditStrategyType;
+        }
     }
 }
index 707baab93b50a707899c52c7206bb5731d8a2a34..cb03342a1e1febf8d883b1a47ac271ade2c96637 100644 (file)
@@ -11,8 +11,6 @@ package org.opendaylight.controller.netconf.confignetconfconnector.operations.ed
 import java.util.EnumSet;
 import java.util.Set;
 
-import com.google.common.base.Preconditions;
-
 //FIXME: make thread safe
 public enum EditStrategyType {
     // can be default
@@ -22,20 +20,8 @@ public enum EditStrategyType {
 
     private static final Set<EditStrategyType> defaultStrats = EnumSet.of(merge, replace, none);
 
-    private static EditStrategyType defaultStrat = merge;
-
-    public static EditStrategyType defaultStrategy() {
-        return defaultStrat;
-    }
-
-    public static void setDefaultStrategy(EditStrategyType strat) {
-        Preconditions.checkArgument(strat.canBeDefault(), "Default edit strategy can be only of value " + defaultStrats
-                + ", but was " + strat);
-        defaultStrat = strat;
-    }
-
-    public static void resetDefaultStrategy() {
-        setDefaultStrategy(EditStrategyType.merge);
+    public static EditStrategyType getDefaultStrategy() {
+        return merge;
     }
 
     public boolean isEnforcing() {
@@ -54,16 +40,6 @@ public enum EditStrategyType {
         }
     }
 
-    private static final EnumSet<EditStrategyType> defaults;
-
-    static {
-        defaults = EnumSet.of(merge, replace, none);
-    }
-
-    private boolean canBeDefault() {
-        return defaults.contains(this);
-    }
-
     public EditConfigStrategy getFittingStrategy() {
         switch (this) {
         case merge:
index c8f83c88760f077323fff8235587bdbacad9cf7d..1b8e24702aa32300a600518704250b02bdd480c1 100644 (file)
@@ -89,10 +89,11 @@ public class EditConfigTest {
         Config cfg = mock(Config.class);
         XmlElement xmlElement = mock(XmlElement.class);
         Set<ObjectName> instancesForFillingServiceRefMapping = Collections.emptySet();
-        doReturn(resolvedXmlElements).when(cfg).fromXml(xmlElement, instancesForFillingServiceRefMapping);
+        EditStrategyType defaultStrategy = EditStrategyType.getDefaultStrategy();
+        doReturn(resolvedXmlElements).when(cfg).fromXml(xmlElement, instancesForFillingServiceRefMapping, defaultStrategy);
 
         EditConfigExecution editConfigExecution = new EditConfigExecution(null, cfg, xmlElement,
-                EditConfigXmlParser.TestOption.testThenSet, instancesForFillingServiceRefMapping);
+                EditConfigXmlParser.TestOption.testThenSet, instancesForFillingServiceRefMapping, defaultStrategy);
 
         edit.getResponseInternal(XmlUtil.newDocument(), editConfigExecution);