Просмотр исходного кода

AMBARI-5599. Switching between existing configs is not working in API (ncole)

Nate Cole 11 лет назад
Родитель
Сommit
2182d60cff

+ 15 - 7
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java

@@ -966,13 +966,21 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
 
       Config oldConfig = cluster.getDesiredConfigByType(cr.getType());
       
-      if (null != cr.getProperties()) { 
-        LOG.info(MessageFormat.format("Applying configuration with tag ''{0}'' to cluster ''{1}''",
-            cr.getVersionTag(),
-            request.getClusterName()));
-
-        cr.setClusterName(cluster.getClusterName());
-        createConfiguration(cr);
+      if (null != cr.getProperties()) {
+        // !!! empty property sets are supported, and need to be able to use
+        // previously-defined configs (revert)
+        Map<String, Config> all = cluster.getConfigsByType(cr.getType());
+        if (null == all ||                              // none set
+            !all.containsKey(cr.getVersionTag()) ||     // tag not set
+            cr.getProperties().size() > 0) {            // properties to set
+          
+          LOG.info(MessageFormat.format("Applying configuration with tag ''{0}'' to cluster ''{1}''",
+              cr.getVersionTag(),
+              request.getClusterName()));
+  
+          cr.setClusterName(cluster.getClusterName());
+          createConfiguration(cr);
+        }
       }
 
       Config baseConfig = cluster.getConfig(cr.getType(), cr.getVersionTag());

+ 19 - 0
ambari-server/src/test/java/org/apache/ambari/server/controller/AmbariManagementControllerTest.java

@@ -9803,6 +9803,25 @@ public class AmbariManagementControllerTest {
     config = cluster.getDesiredConfigByType("typeA");
     Assert.assertNotNull(config);
     Assert.assertTrue(config.getProperties().containsKey("c"));
+    
+    // test reset to v2
+    cr.setDesiredConfig(
+        new ConfigurationRequest(clusterName, "typeA", "v2", new HashMap<String, String>()));
+    controller.updateClusters(Collections.singleton(cr), new HashMap<String, String>());
+    config = cluster.getDesiredConfigByType("typeA");
+    Assert.assertEquals("v2", config.getVersionTag());
+    Assert.assertNotNull(config);
+    Assert.assertEquals(Integer.valueOf(0), Integer.valueOf(config.getProperties().size()));
+    
+    // test v2, but with properties
+    cr.setDesiredConfig(
+        new ConfigurationRequest(clusterName, "typeA", "v2", new HashMap<String, String>() {{ put("a", "b"); }}));
+    try {
+      controller.updateClusters(Collections.singleton(cr), new HashMap<String, String>());
+      Assert.fail("Expect failure when creating a config that exists");
+    } catch (AmbariException e) {
+      // expected
+    }
   }
 }