Repository: ambari
Updated Branches:
  refs/heads/branch-2.2 9cc888fce -> 42bd76222


AMBARI-15280. Config version remains is_current=true even after it's group is 
deleted. (stoader)


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

Branch: refs/heads/branch-2.2
Commit: 42bd762229819177308b20718ee6edd8ad96e22b
Parents: 9cc888f
Author: Toader, Sebastian <stoa...@hortonworks.com>
Authored: Thu Mar 3 14:39:56 2016 +0100
Committer: Toader, Sebastian <stoa...@hortonworks.com>
Committed: Thu Mar 3 14:41:38 2016 +0100

----------------------------------------------------------------------
 .../ServiceConfigVersionResponse.java           | 11 +++
 .../server/state/cluster/ClusterImpl.java       | 17 ++--
 .../server/state/cluster/ClusterTest.java       | 83 ++++++++++++++++++++
 3 files changed, 104 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/42bd7622/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceConfigVersionResponse.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceConfigVersionResponse.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceConfigVersionResponse.java
index e86b768..638e747 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceConfigVersionResponse.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/ServiceConfigVersionResponse.java
@@ -37,6 +37,17 @@ import com.google.inject.Inject;
 
 @StaticallyInject
 public class ServiceConfigVersionResponse {
+  /**
+   * Name used for default config group.
+   */
+  public static final String DEFAULT_CONFIG_GROUP_NAME = "default";
+
+  /**
+   * Name used for config groups that were deleted in the service config 
version response.
+   */
+  public static final String DELETED_CONFIG_GROUP_NAME = "deleted";
+
+
   @JsonProperty("cluster_name")
   @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
   private final String clusterName;

http://git-wip-us.apache.org/repos/asf/ambari/blob/42bd7622/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 784a2d4..916f60b 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
@@ -2344,11 +2344,11 @@ public class ClusterImpl implements Cluster {
 
     configChangeLog.info("Cluster '{}' changed by: '{}'; service_name='{}' 
config_group='{}' config_group_id='{}' " +
         "version='{}'", getClusterName(), user, serviceName,
-      configGroup == null ? "default" : configGroup.getName(),
+      configGroup == null ? 
ServiceConfigVersionResponse.DEFAULT_CONFIG_GROUP_NAME : configGroup.getName(),
       configGroup == null ? "-1" : configGroup.getId(),
       serviceConfigEntity.getVersion());
 
-    String configGroupName = configGroup != null ? configGroup.getName() : 
"default";
+    String configGroupName = configGroup != null ? configGroup.getName() : 
ServiceConfigVersionResponse.DEFAULT_CONFIG_GROUP_NAME;
 
     ServiceConfigVersionResponse response = new ServiceConfigVersionResponse(
         serviceConfigEntity, configGroupName);
@@ -2455,7 +2455,8 @@ public class ClusterImpl implements Cluster {
         // the active config within a group
         ServiceConfigVersionResponse activeServiceConfigResponse = 
activeServiceConfigResponseGroups.get(serviceConfigVersionResponse.getGroupName());
 
-        if (activeServiceConfigResponse == null) {
+        if (activeServiceConfigResponse == null && 
!ServiceConfigVersionResponse.DELETED_CONFIG_GROUP_NAME.equals(serviceConfigVersionResponse.getGroupName()))
 {
+          // service config version with deleted group should always be marked 
is not current
           
activeServiceConfigResponseGroups.put(serviceConfigVersionResponse.getGroupName(),
 serviceConfigVersionResponse);
           activeServiceConfigResponse = serviceConfigVersionResponse;
         }
@@ -2463,12 +2464,14 @@ public class ClusterImpl implements Cluster {
         serviceConfigVersionResponse.setConfigurations(new 
ArrayList<ConfigurationResponse>());
 
         if (serviceConfigEntity.getGroupId() == null) {
-          if (serviceConfigVersionResponse.getCreateTime() > 
activeServiceConfigResponse.getCreateTime())
+          if (serviceConfigVersionResponse.getCreateTime() > 
activeServiceConfigResponse.getCreateTime()) {
             
activeServiceConfigResponseGroups.put(serviceConfigVersionResponse.getGroupName(),
 serviceConfigVersionResponse);
+          }
         }
         else if (clusterConfigGroups != null && 
clusterConfigGroups.containsKey(serviceConfigEntity.getGroupId())){
-          if (serviceConfigVersionResponse.getVersion() > 
activeServiceConfigResponse.getVersion())
+          if (serviceConfigVersionResponse.getVersion() > 
activeServiceConfigResponse.getVersion()) {
             
activeServiceConfigResponseGroups.put(serviceConfigVersionResponse.getGroupName(),
 serviceConfigVersionResponse);
+          }
         }
 
         serviceConfigVersionResponse.setIsCurrent(false);
@@ -2549,10 +2552,10 @@ public class ClusterImpl implements Cluster {
       if (configGroup != null) {
         groupName = configGroup.getName();
       } else {
-        groupName = "deleted";
+        groupName = ServiceConfigVersionResponse.DELETED_CONFIG_GROUP_NAME;
       }
     } else {
-      groupName = "default";
+      groupName = ServiceConfigVersionResponse.DEFAULT_CONFIG_GROUP_NAME;
     }
 
     ServiceConfigVersionResponse serviceConfigVersionResponse = new 
ServiceConfigVersionResponse(

http://git-wip-us.apache.org/repos/asf/ambari/blob/42bd7622/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 5c4bf11..bf3b376 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
@@ -1400,6 +1400,89 @@ public class ClusterTest {
   }
 
   @Test
+  public void testAllServiceConfigVersionsWithDeletedConfigGroups() throws 
Exception {
+    // Given
+    createDefaultCluster();
+
+    Config hdfsSiteConfigV1 = configFactory.createNew(c1, "hdfs-site", 
ImmutableMap.of("p1", "v1"), ImmutableMap.<String, Map<String,String>>of());
+    hdfsSiteConfigV1.setTag("version1");
+    hdfsSiteConfigV1.persist();
+
+    c1.addConfig(hdfsSiteConfigV1);
+
+
+    ServiceConfigVersionResponse hdfsSiteConfigResponseV1 = 
c1.addDesiredConfig("admin", Collections.singleton(hdfsSiteConfigV1));
+    List<ConfigurationResponse> configResponsesDefaultGroup =  
Collections.singletonList(
+      new ConfigurationResponse(c1.getClusterName(), 
hdfsSiteConfigV1.getStackId(),
+        hdfsSiteConfigV1.getType(), hdfsSiteConfigV1.getTag(), 
hdfsSiteConfigV1.getVersion(),
+        hdfsSiteConfigV1.getProperties(), 
hdfsSiteConfigV1.getPropertiesAttributes(), 
hdfsSiteConfigV1.getPropertiesTypes())
+    );
+
+    hdfsSiteConfigResponseV1.setConfigurations(configResponsesDefaultGroup);
+
+    Config hdfsSiteConfigV2 = configFactory.createNew(c1, "hdfs-site", 
ImmutableMap.of("p1", "v2"), ImmutableMap.<String, Map<String,String>>of());
+    hdfsSiteConfigV2.setTag("version2");
+
+    ConfigGroup configGroup = configGroupFactory.createNew(c1, "configGroup1", 
"version1", "test description", ImmutableMap.of(hdfsSiteConfigV2.getType(), 
hdfsSiteConfigV2), ImmutableMap.<Long, Host>of());
+    configGroup.persist();
+
+    c1.addConfigGroup(configGroup);
+    ServiceConfigVersionResponse hdfsSiteConfigResponseV2 = 
c1.createServiceConfigVersion("HDFS", "admin", "test note", configGroup);
+    hdfsSiteConfigResponseV2.setConfigurations(Collections.singletonList(
+      new ConfigurationResponse(c1.getClusterName(), 
hdfsSiteConfigV2.getStackId(),
+        hdfsSiteConfigV2.getType(), hdfsSiteConfigV2.getTag(), 
hdfsSiteConfigV2.getVersion(),
+        hdfsSiteConfigV2.getProperties(), 
hdfsSiteConfigV2.getPropertiesAttributes(), 
hdfsSiteConfigV2.getPropertiesTypes())
+    ));
+
+    // delete the config group
+    c1.deleteConfigGroup(configGroup.getId());
+
+
+    // hdfs config v3
+    ServiceConfigVersionResponse hdfsSiteConfigResponseV3 = 
c1.createServiceConfigVersion("HDFS", "admin", "new config in default group", 
null);
+    hdfsSiteConfigResponseV3.setConfigurations(configResponsesDefaultGroup);
+    hdfsSiteConfigResponseV3.setIsCurrent(true); // this is the active config 
in default config group as it's more recent than V1
+
+
+
+    // When
+
+    List<ServiceConfigVersionResponse> allServiceConfigResponses = 
c1.getServiceConfigVersions();
+
+    Collections.sort(
+      allServiceConfigResponses,
+      new Comparator<ServiceConfigVersionResponse>() {
+        @Override
+        public int compare(ServiceConfigVersionResponse o1, 
ServiceConfigVersionResponse o2) {
+          return o1.getVersion().compareTo(o2.getVersion());
+        }
+      }
+    );
+
+
+    // Then
+
+    assertEquals(3, allServiceConfigResponses.size());
+
+    // all configs that was created as member of config group 'configGroup1' 
should be marked as 'not current'
+    // as the parent config group has been deleted
+
+    // default group
+    assertEquals(false, allServiceConfigResponses.get(0).getIsCurrent());
+    assertEquals(ServiceConfigVersionResponse.DEFAULT_CONFIG_GROUP_NAME, 
allServiceConfigResponses.get(0).getGroupName());
+
+    assertEquals(true, allServiceConfigResponses.get(2).getIsCurrent());
+    assertEquals(ServiceConfigVersionResponse.DEFAULT_CONFIG_GROUP_NAME, 
allServiceConfigResponses.get(2).getGroupName());
+
+    // deleted group
+    assertEquals(false, allServiceConfigResponses.get(1).getIsCurrent());
+    assertEquals(ServiceConfigVersionResponse.DELETED_CONFIG_GROUP_NAME, 
allServiceConfigResponses.get(1).getGroupName());
+
+
+
+  }
+
+  @Test
   public void testTransitionClusterVersion() throws Exception {
     createDefaultCluster();
 

Reply via email to