You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by mp...@apache.org on 2014/08/29 19:18:37 UTC

[1/2] git commit: AMBARI-7085. Configs: audit log scv changes.(mpapirkovskyy)

Repository: ambari
Updated Branches:
  refs/heads/trunk 85ccaede3 -> 030413409


AMBARI-7085. Configs: audit log scv changes.(mpapirkovskyy)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/03041340
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/03041340
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/03041340

Branch: refs/heads/trunk
Commit: 030413409eeabab60bca88dc367e08e895383cc4
Parents: 9c28108
Author: Myroslav Papirkovskyy <mp...@hortonworks.com>
Authored: Fri Aug 29 20:16:20 2014 +0300
Committer: Myroslav Papirkovskyy <mp...@hortonworks.com>
Committed: Fri Aug 29 20:16:43 2014 +0300

----------------------------------------------------------------------
 .../controller/internal/ConfigGroupResourceProvider.java     | 2 +-
 .../org/apache/ambari/server/state/cluster/ClusterImpl.java  | 8 ++++++++
 2 files changed, 9 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/03041340/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java
index e1d73e6..6e13d9c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java
@@ -561,7 +561,7 @@ public class ConfigGroupResourceProvider extends
       configGroup.setDescription(request.getDescription());
       configGroup.setTag(request.getTag());
 
-      configLogger.info("Persisting updated Config group, "
+      configLogger.info("Persisting updated Config group"
         + ", clusterName = " + configGroup.getClusterName()
         + ", id = " + configGroup.getId()
         + ", tag = " + configGroup.getTag()

http://git-wip-us.apache.org/repos/asf/ambari/blob/03041340/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
index 9f88cf7..06f46fe 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
@@ -91,6 +91,8 @@ public class ClusterImpl implements Cluster {
 
   private static final Logger LOG =
     LoggerFactory.getLogger(ClusterImpl.class);
+  private static final Logger configChangeLog =
+    LoggerFactory.getLogger("configchange");
 
   @Inject
   private Clusters clusters;
@@ -1456,6 +1458,12 @@ public class ClusterImpl implements Cluster {
 
     serviceConfigDAO.create(serviceConfigEntity);
 
+    configChangeLog.info("Cluster '{}' changed by: '{}'; service_name='{}' config_group='{}' config_group_id='{}' " +
+      "version='{}'", getClusterName(), user, serviceName,
+      configGroup==null?"default":configGroup.getName(),
+      configGroup==null?"-1":configGroup.getId(),
+      serviceConfigEntity.getVersion());
+
     ServiceConfigVersionResponse response = new ServiceConfigVersionResponse();
     response.setUserName(user);
     response.setClusterName(getClusterName());


[2/2] git commit: AMBARI-7063. Cannot query serviceConfigVersion with a config group name NULL.(mpapirkovskyy)

Posted by mp...@apache.org.
AMBARI-7063. Cannot query serviceConfigVersion with a config group name NULL.(mpapirkovskyy)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/9c281087
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/9c281087
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/9c281087

Branch: refs/heads/trunk
Commit: 9c281087d096a48695d4382a4e863c24a50b2699
Parents: 85ccaed
Author: Myroslav Papirkovskyy <mp...@hortonworks.com>
Authored: Fri Aug 29 20:15:46 2014 +0300
Committer: Myroslav Papirkovskyy <mp...@hortonworks.com>
Committed: Fri Aug 29 20:16:43 2014 +0300

----------------------------------------------------------------------
 .../orm/dao/ConfigGroupHostMappingDAO.java      |   2 +
 .../apache/ambari/server/state/ConfigImpl.java  |  17 ++-
 .../server/state/cluster/ClusterImpl.java       |  41 +++----
 .../state/configgroup/ConfigGroupImpl.java      |  41 ++++++-
 .../server/state/cluster/ClusterTest.java       | 122 ++++++++++++++++---
 .../HDP/0.1/services/MAPREDUCE/metainfo.xml     |   6 +
 6 files changed, 174 insertions(+), 55 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/9c281087/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupHostMappingDAO.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupHostMappingDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupHostMappingDAO.java
index d597bdf..592679e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupHostMappingDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupHostMappingDAO.java
@@ -262,6 +262,8 @@ public class ConfigGroupHostMappingDAO {
 
   @Transactional
   public void removeAllByGroup(final Long groupId) {
+    populateCache();
+
     TypedQuery<Long> query = entityManagerProvider.get().createQuery
       ("DELETE FROM ConfigGroupHostMappingEntity confighosts WHERE " +
         "confighosts.configGroupId = ?1", Long.class);

http://git-wip-us.apache.org/repos/asf/ambari/blob/9c281087/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java
index 1972739..2f844d5 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigImpl.java
@@ -87,11 +87,17 @@ public class ConfigImpl implements Config {
 
   @Override
   public synchronized String getTag() {
+    if (this.tag == null) {
+      tag = GENERATED_TAG_PREFIX + getVersion();
+    }
     return tag;
   }
 
   @Override
   public synchronized Long getVersion() {
+    if (this.version == null) {
+      this.version = cluster.getNextConfigVersion(type);
+    }
     return version;
   }
 
@@ -160,18 +166,11 @@ public class ConfigImpl implements Config {
     
     ClusterEntity clusterEntity = clusterDAO.findById(cluster.getClusterId());
 
-    if (this.version == null) {
-      this.version = cluster.getNextConfigVersion(type);
-    }
-    if (this.tag == null) {
-      tag = GENERATED_TAG_PREFIX + version;
-    }
-    
     ClusterConfigEntity entity = new ClusterConfigEntity();
     entity.setClusterEntity(clusterEntity);
     entity.setClusterId(cluster.getClusterId());
-    entity.setType(type);
-    entity.setVersion(version);
+    entity.setType(getType());
+    entity.setVersion(getVersion());
     entity.setTag(getTag());
     entity.setTimestamp(new Date().getTime());
     

http://git-wip-us.apache.org/repos/asf/ambari/blob/9c281087/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
index 1ae61f9..9f88cf7 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
@@ -1560,14 +1560,9 @@ public class ClusterImpl implements Cluster {
         Set<Long> activeIds = getActiveServiceConfigVersionIds();
 
         for (ServiceConfigEntity serviceConfigEntity : serviceConfigDAO.getServiceConfigs(getClusterId())) {
-          ServiceConfigVersionResponse serviceConfigVersionResponse = new ServiceConfigVersionResponse();
-
-          serviceConfigVersionResponse.setClusterName(getClusterName());
-          serviceConfigVersionResponse.setServiceName(serviceConfigEntity.getServiceName());
-          serviceConfigVersionResponse.setVersion(serviceConfigEntity.getVersion());
-          serviceConfigVersionResponse.setCreateTime(serviceConfigEntity.getCreateTimestamp());
-          serviceConfigVersionResponse.setUserName(serviceConfigEntity.getUser());
-          serviceConfigVersionResponse.setNote(serviceConfigEntity.getNote());
+          ServiceConfigVersionResponse serviceConfigVersionResponse =
+            convertToServiceConfigVersionResponse(serviceConfigEntity);
+
           serviceConfigVersionResponse.setHosts(serviceConfigEntity.getHostNames());
           serviceConfigVersionResponse.setConfigurations(new ArrayList<ConfigurationResponse>());
           serviceConfigVersionResponse.setIsCurrent(activeIds.contains(serviceConfigEntity.getServiceConfigId()));
@@ -1580,17 +1575,6 @@ public class ClusterImpl implements Cluster {
               config.getPropertiesAttributes()));
           }
 
-          Long groupId = serviceConfigEntity.getGroupId();
-          if (groupId != null) {
-            serviceConfigVersionResponse.setGroupId(groupId);
-            ConfigGroup configGroup = clusterConfigGroups.get(groupId);
-            if (configGroup != null) {
-              serviceConfigVersionResponse.setGroupName(configGroup.getName());
-            } else {
-              //TODO null or special name?
-            }
-          }
-
           serviceConfigVersionResponses.add(serviceConfigVersionResponse);
         }
 
@@ -1657,15 +1641,26 @@ public class ClusterImpl implements Cluster {
     serviceConfigVersionResponse.setCreateTime(serviceConfigEntity.getCreateTimestamp());    
     serviceConfigVersionResponse.setUserName(serviceConfigEntity.getUser());
     serviceConfigVersionResponse.setNote(serviceConfigEntity.getNote());
-    if (clusterConfigGroups != null) {
-      ConfigGroup configGroup = clusterConfigGroups.get(serviceConfigEntity.getGroupId());
+
+    Long groupId = serviceConfigEntity.getGroupId();
+
+    if (groupId != null) {
+      serviceConfigVersionResponse.setGroupId(groupId);
+      ConfigGroup configGroup = null;
+      if (clusterConfigGroups != null) {
+        configGroup = clusterConfigGroups.get(groupId);
+      }
+
       if (configGroup != null) {
-        serviceConfigVersionResponse.setGroupId(configGroup.getId());
         serviceConfigVersionResponse.setGroupName(configGroup.getName());
+      } else {
+        serviceConfigVersionResponse.setGroupName("deleted");
       }
+    } else {
+      serviceConfigVersionResponse.setGroupId(-1L); // -1 if no group
+      serviceConfigVersionResponse.setGroupName("default");
     }
 
-
     return serviceConfigVersionResponse;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/9c281087/ambari-server/src/main/java/org/apache/ambari/server/state/configgroup/ConfigGroupImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/configgroup/ConfigGroupImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/configgroup/ConfigGroupImpl.java
index 9aea618..96bedf8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/configgroup/ConfigGroupImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/configgroup/ConfigGroupImpl.java
@@ -176,7 +176,13 @@ public class ConfigGroupImpl implements ConfigGroup {
 
   @Override
   public void setName(String name) {
-    this.configGroupEntity.setGroupName(name);
+    readWriteLock.writeLock().lock();
+    try {
+      this.configGroupEntity.setGroupName(name);
+    } finally {
+      readWriteLock.writeLock().unlock();
+    }
+
   }
 
   @Override
@@ -196,7 +202,13 @@ public class ConfigGroupImpl implements ConfigGroup {
 
   @Override
   public void setTag(String tag) {
-    this.configGroupEntity.setTag(tag);
+    readWriteLock.writeLock().lock();
+    try {
+      this.configGroupEntity.setTag(tag);
+    } finally {
+      readWriteLock.writeLock().unlock();
+    }
+
   }
 
   @Override
@@ -211,7 +223,13 @@ public class ConfigGroupImpl implements ConfigGroup {
 
   @Override
   public void setDescription(String description) {
-    this.configGroupEntity.setDescription(description);
+    readWriteLock.writeLock().lock();
+    try {
+      this.configGroupEntity.setDescription(description);
+    } finally {
+      readWriteLock.writeLock().unlock();
+    }
+
   }
 
   @Override
@@ -241,7 +259,13 @@ public class ConfigGroupImpl implements ConfigGroup {
    */
   @Override
   public void setHosts(Map<String, Host> hosts) {
-    this.hosts = hosts;
+    readWriteLock.writeLock().lock();
+    try {
+      this.hosts = hosts;
+    } finally {
+      readWriteLock.writeLock().unlock();
+    }
+
   }
 
   /**
@@ -250,7 +274,13 @@ public class ConfigGroupImpl implements ConfigGroup {
    */
   @Override
   public void setConfigurations(Map<String, Config> configs) {
-    this.configurations = configs;
+    readWriteLock.writeLock().lock();
+    try {
+      this.configurations = configs;
+    } finally {
+      readWriteLock.writeLock().unlock();
+    }
+
   }
 
   @Override
@@ -383,7 +413,6 @@ public class ConfigGroupImpl implements ConfigGroup {
           }
           clusterConfigEntity.setTimestamp(System.currentTimeMillis());
 
-          //TODO why not use config.persist() here?
 
           // TODO: Is locking necessary and functional ?
           cluster.getClusterGlobalLock().writeLock().lock();

http://git-wip-us.apache.org/repos/asf/ambari/blob/9c281087/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java
index a282e92..b2bb602 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClusterTest.java
@@ -28,6 +28,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.ConcurrentModificationException;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -75,6 +76,8 @@ import org.apache.ambari.server.state.ServiceComponentHostFactory;
 import org.apache.ambari.server.state.ServiceFactory;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.State;
+import org.apache.ambari.server.state.configgroup.ConfigGroup;
+import org.apache.ambari.server.state.configgroup.ConfigGroupFactory;
 import org.apache.ambari.server.state.fsm.InvalidStateTransitionException;
 import org.apache.ambari.server.state.host.HostHealthyHeartbeatEvent;
 import org.apache.ambari.server.state.host.HostRegistrationRequestEvent;
@@ -100,6 +103,7 @@ public class ClusterTest {
   private ServiceComponentHostFactory serviceComponentHostFactory;
   private AmbariMetaInfo metaInfo;
   private ConfigFactory configFactory;
+  private ConfigGroupFactory configGroupFactory;
 
   @Before
   public void setup() throws Exception {
@@ -107,6 +111,7 @@ public class ClusterTest {
     injector.getInstance(GuiceJpaInitializer.class);
     clusters = injector.getInstance(Clusters.class);
     serviceFactory = injector.getInstance(ServiceFactory.class);
+    configGroupFactory = injector.getInstance(ConfigGroupFactory.class);
     serviceComponentFactory = injector.getInstance(
         ServiceComponentFactory.class);
     serviceComponentHostFactory = injector.getInstance(
@@ -636,7 +641,7 @@ public class ClusterTest {
   }
 
   @Test
-  public void testAddServiceConfigVersions() {
+  public void testServiceConfigVersions() throws AmbariException {
     Config config1 = configFactory.createNew(c1, "hdfs-site",
       new HashMap<String, String>() {{ put("a", "b"); }}, new HashMap<String, Map<String,String>>());
     config1.setTag("version1");
@@ -656,38 +661,44 @@ public class ClusterTest {
     Map<String, Collection<ServiceConfigVersionResponse>> activeServiceConfigVersions =
       c1.getActiveServiceConfigVersions();
     Assert.assertEquals(1, activeServiceConfigVersions.size());
-    ServiceConfigVersionResponse mapredResponse =
-      activeServiceConfigVersions.get("MAPREDUCE").iterator().next();
+    ServiceConfigVersionResponse hdfsResponse =
+      activeServiceConfigVersions.get("HDFS").iterator().next();
 
-    Assert.assertEquals("MAPREDUCE", mapredResponse.getServiceName());
-    Assert.assertEquals("c1", mapredResponse.getClusterName());
-    Assert.assertEquals("admin", mapredResponse.getUserName());
-    Assert.assertEquals(Long.valueOf(1), mapredResponse.getVersion());
+    Assert.assertEquals("HDFS", hdfsResponse.getServiceName());
+    Assert.assertEquals("c1", hdfsResponse.getClusterName());
+    Assert.assertEquals("admin", hdfsResponse.getUserName());
+    Assert.assertEquals(Long.valueOf(1), hdfsResponse.getVersion());
 
     c1.addDesiredConfig("admin", Collections.singleton(config2));
     serviceConfigVersions = c1.getServiceConfigVersions();
     Assert.assertNotNull(serviceConfigVersions);
     // created new ServiceConfigVersion
     Assert.assertEquals(2, serviceConfigVersions.size());
-    // active version still 1
+
+    activeServiceConfigVersions = c1.getActiveServiceConfigVersions();
     Assert.assertEquals(1, activeServiceConfigVersions.size());
-    mapredResponse = activeServiceConfigVersions.get("MAPREDUCE").iterator().next();
-    Assert.assertEquals("MAPREDUCE", mapredResponse.getServiceName());
-    Assert.assertEquals("c1", mapredResponse.getClusterName());
-    Assert.assertEquals("admin", mapredResponse.getUserName());
+    hdfsResponse = activeServiceConfigVersions.get("HDFS").iterator().next();
+    Assert.assertEquals("HDFS", hdfsResponse.getServiceName());
+    Assert.assertEquals("c1", hdfsResponse.getClusterName());
+    Assert.assertEquals("admin", hdfsResponse.getUserName());
+    assertEquals(Long.valueOf(2), hdfsResponse.getVersion());
 
     // Rollback , clonning version1 config, created new ServiceConfigVersion
-    c1.addDesiredConfig("admin", Collections.singleton(config1));
+    c1.setServiceConfigVersion("HDFS", 1L, "admin", "test_note");
     serviceConfigVersions = c1.getServiceConfigVersions();
     Assert.assertNotNull(serviceConfigVersions);
     // created new ServiceConfigVersion
     Assert.assertEquals(3, serviceConfigVersions.size());
     // active version still 1
+    activeServiceConfigVersions = c1.getActiveServiceConfigVersions();
     Assert.assertEquals(1, activeServiceConfigVersions.size());
-    mapredResponse = activeServiceConfigVersions.get("MAPREDUCE").iterator().next();
-    Assert.assertEquals("MAPREDUCE", mapredResponse.getServiceName());
-    Assert.assertEquals("c1", mapredResponse.getClusterName());
-    Assert.assertEquals("admin", mapredResponse.getUserName());
+    hdfsResponse = activeServiceConfigVersions.get("HDFS").iterator().next();
+    Assert.assertEquals("HDFS", hdfsResponse.getServiceName());
+    Assert.assertEquals("c1", hdfsResponse.getClusterName());
+    Assert.assertEquals("admin", hdfsResponse.getUserName());
+    assertEquals(Long.valueOf(3), hdfsResponse.getVersion());
+
+
   }
 
   @Test
@@ -724,4 +735,81 @@ public class ClusterTest {
 
 
   }
+
+  @Test
+  public void testServiceConfigVersionsForGroups() throws AmbariException {
+    Config config1 = configFactory.createNew(c1, "hdfs-site",
+      new HashMap<String, String>() {{ put("a", "b"); }}, new HashMap<String, Map<String,String>>());
+    config1.setTag("version1");
+
+    c1.addConfig(config1);
+
+    ServiceConfigVersionResponse scvResponse =
+      c1.addDesiredConfig("admin", Collections.singleton(config1));
+
+    assertEquals("SCV 1 should be created", Long.valueOf(1), scvResponse.getVersion());
+
+    Map<String, Collection<ServiceConfigVersionResponse>> activeServiceConfigVersions =
+      c1.getActiveServiceConfigVersions();
+    Assert.assertEquals("Only one scv should be active", 1, activeServiceConfigVersions.get("HDFS").size());
+
+    //create config group
+    Config config2 = configFactory.createNew(c1, "hdfs-site",
+      new HashMap<String, String>() {{ put("a", "c"); }}, new HashMap<String, Map<String,String>>());
+    config2.setTag("version2");
+
+    ConfigGroup configGroup =
+      configGroupFactory.createNew(c1, "test group", "HDFS", "descr", Collections.singletonMap("hdfs-site", config2),
+        Collections.<String, Host>emptyMap());
+
+    configGroup.persist();
+
+    c1.addConfigGroup(configGroup);
+
+    scvResponse = c1.createServiceConfigVersion("HDFS", "admin", "test note", configGroup);
+    assertEquals("SCV 2 should be created", Long.valueOf(2), scvResponse.getVersion());
+
+    //two scv active
+    activeServiceConfigVersions = c1.getActiveServiceConfigVersions();
+    Assert.assertEquals("Two service config versions should be active, for default and test groups",
+      2, activeServiceConfigVersions.get("HDFS").size());
+
+    Config config3 = configFactory.createNew(c1, "hdfs-site",
+      new HashMap<String, String>() {{ put("a", "d"); }}, new HashMap<String, Map<String,String>>());
+
+    configGroup.setConfigurations(Collections.singletonMap("hdfs-site", config3));
+
+    configGroup.persist();
+    scvResponse = c1.createServiceConfigVersion("HDFS", "admin", "test note", configGroup);
+    assertEquals("SCV 3 should be created", Long.valueOf(3), scvResponse.getVersion());
+
+    //still two scv active, 3 total
+    activeServiceConfigVersions = c1.getActiveServiceConfigVersions();
+    Assert.assertEquals("Two service config versions should be active, for default and test groups",
+      2, activeServiceConfigVersions.get("HDFS").size());
+
+    assertEquals(3, c1.getServiceConfigVersions().size());
+
+    //rollback group
+
+    scvResponse = c1.setServiceConfigVersion("HDFS", 2L, "admin", "group rollback");
+    assertEquals("SCV 4 should be created", Long.valueOf(4), scvResponse.getVersion());
+
+    configGroup = c1.getConfigGroups().get(configGroup.getId()); //refresh?
+
+    //still two scv active, 4 total
+    activeServiceConfigVersions = c1.getActiveServiceConfigVersions();
+    Assert.assertEquals("Two service config versions should be active, for default and test groups",
+      2, activeServiceConfigVersions.get("HDFS").size());
+    assertEquals(4, c1.getServiceConfigVersions().size());
+
+    //check properties rolled back
+    Map<String, String> configProperties = configGroup.getConfigurations().get("hdfs-site").getProperties();
+
+    assertEquals("Configurations should be rolled back to a:c ", "c", configProperties.get("a"));
+
+
+  }
+
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/9c281087/ambari-server/src/test/resources/stacks/HDP/0.1/services/MAPREDUCE/metainfo.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/resources/stacks/HDP/0.1/services/MAPREDUCE/metainfo.xml b/ambari-server/src/test/resources/stacks/HDP/0.1/services/MAPREDUCE/metainfo.xml
index ba9bbe8..98a8aee 100644
--- a/ambari-server/src/test/resources/stacks/HDP/0.1/services/MAPREDUCE/metainfo.xml
+++ b/ambari-server/src/test/resources/stacks/HDP/0.1/services/MAPREDUCE/metainfo.xml
@@ -78,6 +78,12 @@
         <config-type>mapred-site</config-type>
         <config-type>mapred-queue-acls</config-type>
       </configuration-dependencies>
+
+      <excluded-config-types>
+        <config-type>hdfs-site</config-type>
+        <config-type>hbase-site</config-type>
+      </excluded-config-types>
+
     </service>
   </services>
 </metainfo>