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

[5/6] git commit: AMBARI-6848 Service config version should always clone and rev up (not simply point to an older version) (dsen)

AMBARI-6848 Service config version should always clone and rev up (not simply point to an older version) (dsen)


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

Branch: refs/heads/branch-alerts-dev
Commit: 6eb753d8cbc8fb89d0efb15234c543121a1f83ad
Parents: 16d8093
Author: Dmytro Sen <ds...@hortonworks.com>
Authored: Thu Aug 14 14:30:56 2014 +0300
Committer: Jonathan Hurley <jh...@hortonworks.com>
Committed: Thu Aug 14 09:19:16 2014 -0400

----------------------------------------------------------------------
 .../ServiceConfigVersionResponse.java           |  11 -
 .../ServiceConfigVersionResourceProvider.java   |   2 -
 .../ambari/server/orm/dao/ServiceConfigDAO.java |  37 +--
 .../ServiceConfigApplicationEntity.java         | 114 --------
 .../orm/entities/ServiceConfigEntity.java       |  34 ++-
 .../server/state/cluster/ClusterImpl.java       |  76 +++--
 .../server/upgrade/UpgradeCatalog170.java       |   9 +-
 .../main/resources/Ambari-DDL-MySQL-CREATE.sql  |  12 +-
 .../main/resources/Ambari-DDL-Oracle-CREATE.sql |   8 +-
 .../resources/Ambari-DDL-Postgres-CREATE.sql    |   9 +-
 .../Ambari-DDL-Postgres-EMBEDDED-CREATE.sql     |  11 +-
 .../src/main/resources/properties.json          |   1 -
 .../server/orm/dao/ServiceConfigDAOTest.java    | 282 +++++++++++++++++++
 .../orm/entities/ServiceConfigEntityTest.java   |  49 ++++
 .../server/state/cluster/ClusterTest.java       |  57 +++-
 .../server/upgrade/UpgradeCatalog170Test.java   |  11 +
 16 files changed, 486 insertions(+), 237 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/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 491f112..f463a4b 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
@@ -30,7 +30,6 @@ public class ServiceConfigVersionResponse {
   private String serviceName;
   private Long version;
   private Long createTime;
-  private Long applyTime;
   private String userName;
   private String note;
   private List<ConfigurationResponse> configurations;
@@ -63,16 +62,6 @@ public class ServiceConfigVersionResponse {
     this.createTime = createTime;
   }
 
-  @JsonProperty("appliedtime")
-  @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
-  public Long getApplyTime() {
-    return applyTime;
-  }
-
-  public void setApplyTime(Long applyTime) {
-    this.applyTime = applyTime;
-  }
-
   @JsonProperty("user")
   @JsonSerialize(include = JsonSerialize.Inclusion.NON_NULL)
   public String getUserName() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceConfigVersionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceConfigVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceConfigVersionResourceProvider.java
index 581ed54..1713d01 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceConfigVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceConfigVersionResourceProvider.java
@@ -36,7 +36,6 @@ public class ServiceConfigVersionResourceProvider extends
   public static final String SERVICE_CONFIG_VERSION_PROPERTY_ID = PropertyHelper.getPropertyId(null, "serviceconfigversion");
   public static final String SERVICE_CONFIG_VERSION_SERVICE_NAME_PROPERTY_ID = PropertyHelper.getPropertyId(null, "service_name");
   public static final String SERVICE_CONFIG_VERSION_CREATE_TIME_PROPERTY_ID = PropertyHelper.getPropertyId(null, "createtime");
-  public static final String SERVICE_CONFIG_VERSION_APPLY_TIME_PROPERTY_ID = PropertyHelper.getPropertyId(null, "appliedtime");
   public static final String SERVICE_CONFIG_VERSION_USER_PROPERTY_ID = PropertyHelper.getPropertyId(null, "user");
   public static final String SERVICE_CONFIG_VERSION_NOTE_PROPERTY_ID = PropertyHelper.getPropertyId(null, "service_config_version_note");
   public static final String SERVICE_CONFIG_VERSION_CONFIGURATIONS_PROPERTY_ID = PropertyHelper.getPropertyId(null, "configurations");
@@ -98,7 +97,6 @@ public class ServiceConfigVersionResourceProvider extends
       resource.setProperty(SERVICE_CONFIG_VERSION_SERVICE_NAME_PROPERTY_ID, response.getServiceName());
       resource.setProperty(SERVICE_CONFIG_VERSION_USER_PROPERTY_ID, response.getUserName());
       resource.setProperty(SERVICE_CONFIG_VERSION_PROPERTY_ID, response.getVersion());
-      resource.setProperty(SERVICE_CONFIG_VERSION_APPLY_TIME_PROPERTY_ID, response.getApplyTime());
       resource.setProperty(SERVICE_CONFIG_VERSION_CREATE_TIME_PROPERTY_ID, response.getCreateTime());
       resource.setProperty(SERVICE_CONFIG_VERSION_CONFIGURATIONS_PROPERTY_ID,
           convertToSubResources(response.getClusterName(), response.getConfigurations()));

http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceConfigDAO.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceConfigDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceConfigDAO.java
index 698e655..add58fc 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceConfigDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ServiceConfigDAO.java
@@ -23,7 +23,6 @@ import com.google.inject.Provider;
 import com.google.inject.Singleton;
 import com.google.inject.persist.Transactional;
 import org.apache.ambari.server.orm.RequiresSession;
-import org.apache.ambari.server.orm.entities.ServiceConfigApplicationEntity;
 import org.apache.ambari.server.orm.entities.ServiceConfigEntity;
 
 import javax.persistence.EntityManager;
@@ -72,21 +71,24 @@ public class ServiceConfigDAO {
     return daoUtils.selectList(query, clusterId, configType, configVersion);
   }
 
-  public List<ServiceConfigApplicationEntity> getLastApplications(Long clusterId) {
-    TypedQuery<ServiceConfigApplicationEntity> query = entityManagerProvider.get().
-      createQuery("SELECT sca FROM ServiceConfigEntity scv JOIN scv.serviceConfigApplicationEntities sca " +
-          "WHERE scv.clusterId = ?1 AND sca.applyTimestamp = (" +
-          "SELECT max(sca2.applyTimestamp) FROM ServiceConfigApplicationEntity sca2 JOIN sca2.serviceConfigEntity scv2 WHERE scv2.serviceName = scv.serviceName " +
-          "AND scv2.clusterId = ?1)",
-        ServiceConfigApplicationEntity.class);
+  public List<ServiceConfigEntity> getLastServiceConfigs(Long clusterId) {
+    TypedQuery<ServiceConfigEntity> query = entityManagerProvider.get().
+      createQuery("SELECT scv FROM ServiceConfigEntity scv " +
+        "WHERE scv.clusterId = ?1 AND scv.createTimestamp = (" +
+        "SELECT MAX(scv2.createTimestamp) FROM ServiceConfigEntity scv2 " +
+        "WHERE scv2.serviceName = scv.serviceName AND scv2.clusterId = ?1)",
+        ServiceConfigEntity.class);
+
     return daoUtils.selectList(query, clusterId);
   }
 
-  public ServiceConfigApplicationEntity getLastApplication(Long clusterId, String serviceName) {
-    TypedQuery<ServiceConfigApplicationEntity> query = entityManagerProvider.get().
-        createQuery("SELECT sca FROM ServiceConfigEntity scv JOIN scv.serviceConfigApplicationEntities sca " +
-                "WHERE scv.clusterId = ?1 AND scv.serviceName = ?2 ORDER BY sca.applyTimestamp DESC",
-            ServiceConfigApplicationEntity.class);
+  public ServiceConfigEntity getLastServiceConfig(Long clusterId, String serviceName) {
+    TypedQuery<ServiceConfigEntity> query = entityManagerProvider.get().
+        createQuery("SELECT scv FROM ServiceConfigEntity scv " +
+          "WHERE scv.clusterId = ?1 AND scv.serviceName = ?2 " +
+          "ORDER BY scv.createTimestamp DESC",
+          ServiceConfigEntity.class);
+
     return daoUtils.selectOne(query, clusterId, serviceName);
   }
 
@@ -99,10 +101,11 @@ public class ServiceConfigDAO {
     return daoUtils.selectSingle(query, clusterId, serviceName);
   }
 
-  public List<ServiceConfigApplicationEntity> getServiceConfigApplications(Long clusterId) {
-    TypedQuery<ServiceConfigApplicationEntity> query = entityManagerProvider.get().createQuery(
-        "SELECT apply FROM ServiceConfigApplicationEntity apply JOIN apply.serviceConfigEntity scv " +
-            "WHERE scv.clusterId=?1 ORDER BY apply.applyTimestamp DESC", ServiceConfigApplicationEntity.class);
+  public List<ServiceConfigEntity> getServiceConfigs(Long clusterId) {
+    TypedQuery<ServiceConfigEntity> query = entityManagerProvider.get()
+      .createQuery("SELECT scv FROM ServiceConfigEntity scv " +
+        "WHERE scv.clusterId=?1 " +
+        "ORDER BY scv.createTimestamp DESC", ServiceConfigEntity.class);
 
     return daoUtils.selectList(query, clusterId);
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigApplicationEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigApplicationEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigApplicationEntity.java
deleted file mode 100644
index 6f2f441..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigApplicationEntity.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.ambari.server.orm.entities;
-
-import javax.persistence.Basic;
-import javax.persistence.Column;
-import javax.persistence.Entity;
-import javax.persistence.GeneratedValue;
-import javax.persistence.GenerationType;
-import javax.persistence.Id;
-import javax.persistence.JoinColumn;
-import javax.persistence.ManyToOne;
-import javax.persistence.Table;
-import javax.persistence.TableGenerator;
-
-@Entity
-@Table(name = "serviceconfigapplication")
-@TableGenerator(name = "service_config_application_id_generator",
-  table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "value"
-  , pkColumnValue = "service_config_application_id_seq"
-  , initialValue = 1
-  , allocationSize = 1
-)
-public class ServiceConfigApplicationEntity {
-  @Id
-  @Column(name = "apply_id")
-  @GeneratedValue(strategy = GenerationType.TABLE, generator = "service_config_application_id_generator")
-  private Long applyId;
-
-  @Basic
-  @Column(name = "service_config_id", updatable = false, insertable = false, nullable = false)
-  private Long serviceConfigId;
-
-  @Basic
-  @Column(name = "apply_timestamp")
-  private Long applyTimestamp;
-
-  @Basic
-  @Column(name = "user_name")
-  private String user = "_db";
-
-  @Basic
-  @Column(name = "note")
-  private String note;
-
-  @ManyToOne
-  @JoinColumn(name = "service_config_id", referencedColumnName = "service_config_id")
-  private ServiceConfigEntity serviceConfigEntity;
-
-
-  public Long getApplyId() {
-    return applyId;
-  }
-
-  public void setApplyId(Long applyId) {
-    this.applyId = applyId;
-  }
-
-  public Long getServiceConfigId() {
-    return serviceConfigId;
-  }
-
-  public void setServiceConfigId(Long serviceConfigId) {
-    this.serviceConfigId = serviceConfigId;
-  }
-
-  public Long getApplyTimestamp() {
-    return applyTimestamp;
-  }
-
-  public void setApplyTimestamp(Long applyTimestamp) {
-    this.applyTimestamp = applyTimestamp;
-  }
-
-  public ServiceConfigEntity getServiceConfigEntity() {
-    return serviceConfigEntity;
-  }
-
-  public void setServiceConfigEntity(ServiceConfigEntity serviceConfigEntity) {
-    this.serviceConfigEntity = serviceConfigEntity;
-  }
-
-  public String getUser() {
-    return user;
-  }
-
-  public void setUser(String user) {
-    this.user = user;
-  }
-
-  public String getNote() {
-    return note;
-  }
-
-  public void setNote(String note) {
-    this.note = note;
-  }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigEntity.java
index 2727388..ce47e28 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ServiceConfigEntity.java
@@ -64,8 +64,13 @@ public class ServiceConfigEntity {
   @Column(name = "create_timestamp", nullable = false)
   private Long createTimestamp = System.currentTimeMillis();
 
-  @OneToMany(mappedBy = "serviceConfigEntity", cascade = CascadeType.ALL)
-  private List<ServiceConfigApplicationEntity> serviceConfigApplicationEntities;
+  @Basic
+  @Column(name = "user_name")
+  private String user = "_db";
+
+  @Basic
+  @Column(name = "note")
+  private String note;
 
   @ManyToMany
   @JoinTable(
@@ -111,15 +116,6 @@ public class ServiceConfigEntity {
     this.createTimestamp = create_timestamp;
   }
 
-
-  public List<ServiceConfigApplicationEntity> getServiceConfigApplicationEntities() {
-    return serviceConfigApplicationEntities;
-  }
-
-  public void setServiceConfigApplicationEntities(List<ServiceConfigApplicationEntity> serviceConfigApplicationEntities) {
-    this.serviceConfigApplicationEntities = serviceConfigApplicationEntities;
-  }
-
   public List<ClusterConfigEntity> getClusterConfigEntities() {
     return clusterConfigEntities;
   }
@@ -143,4 +139,20 @@ public class ServiceConfigEntity {
   public void setClusterEntity(ClusterEntity clusterEntity) {
     this.clusterEntity = clusterEntity;
   }
+
+  public String getUser() {
+    return user;
+  }
+
+  public void setUser(String user) {
+    this.user = user;
+  }
+
+  public String getNote() {
+    return note;
+  }
+
+  public void setNote(String note) {
+    this.note = note;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/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 eb5d36d..00316ce 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
@@ -65,7 +65,6 @@ import org.apache.ambari.server.orm.entities.PermissionEntity;
 import org.apache.ambari.server.orm.entities.PrivilegeEntity;
 import org.apache.ambari.server.orm.entities.RequestScheduleEntity;
 import org.apache.ambari.server.orm.entities.ResourceEntity;
-import org.apache.ambari.server.orm.entities.ServiceConfigApplicationEntity;
 import org.apache.ambari.server.orm.entities.ServiceConfigEntity;
 import org.apache.ambari.server.state.*;
 import org.apache.ambari.server.state.configgroup.ConfigGroup;
@@ -1423,7 +1422,7 @@ public class ClusterImpl implements Cluster {
       readWriteLock.writeLock().lock();
       try {
         applyServiceConfigVersion(serviceName, version, user, note);
-
+        configHelper.invalidateStaleConfigsCache();
         return true;
       } finally {
         readWriteLock.writeLock().unlock();
@@ -1462,14 +1461,17 @@ public class ClusterImpl implements Cluster {
       readWriteLock.readLock().lock();
       try {
         List<ServiceConfigVersionResponse> serviceConfigVersionResponses = new ArrayList<ServiceConfigVersionResponse>();
-        for (ServiceConfigApplicationEntity applicationEntity : serviceConfigDAO.getServiceConfigApplications(getClusterId())) {
-          ServiceConfigVersionResponse serviceConfigVersionResponse =
-            convertToServiceConfigVersionResponse(applicationEntity);
-
+        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.setConfigurations(new ArrayList<ConfigurationResponse>());
 
-          ServiceConfigEntity serviceConfigEntity = applicationEntity.getServiceConfigEntity();
-
           List<ClusterConfigEntity> clusterConfigEntities = serviceConfigEntity.getClusterConfigEntities();
           for (ClusterConfigEntity clusterConfigEntity : clusterConfigEntities) {
             Config config = allConfigs.get(clusterConfigEntity.getType()).get(clusterConfigEntity.getTag());
@@ -1493,36 +1495,33 @@ public class ClusterImpl implements Cluster {
   @RequiresSession
   Set<ServiceConfigVersionResponse> getActiveServiceConfigVersionSet() {
     Set<ServiceConfigVersionResponse> responses = new HashSet<ServiceConfigVersionResponse>();
-    List<ServiceConfigApplicationEntity> lastApplications = serviceConfigDAO.getLastApplications(getClusterId());
-    for (ServiceConfigApplicationEntity lastApplication : lastApplications) {
-      responses.add(convertToServiceConfigVersionResponse(lastApplication));
+    List<ServiceConfigEntity> lastServiceConfigs = serviceConfigDAO.getLastServiceConfigs(getClusterId());
+    for (ServiceConfigEntity lastServiceConfig : lastServiceConfigs) {
+      responses.add(convertToServiceConfigVersionResponse(lastServiceConfig));
     }
     return responses;
   }
 
   @RequiresSession
   ServiceConfigVersionResponse getActiveServiceConfigVersion(String serviceName) {
-    ServiceConfigApplicationEntity lastApplication = serviceConfigDAO.getLastApplication(getClusterId(), serviceName);
-    if (lastApplication == null) {
-      LOG.debug("No active service config version found for service {}", serviceName);
+    ServiceConfigEntity lastServiceConfig = serviceConfigDAO.getLastServiceConfig(getClusterId(), serviceName);
+    if (lastServiceConfig == null) {
+      LOG.debug("No service config version found for service {}", serviceName);
       return null;
     }
-    return convertToServiceConfigVersionResponse(lastApplication);
+    return convertToServiceConfigVersionResponse(lastServiceConfig);
   }
 
   @RequiresSession
-  ServiceConfigVersionResponse convertToServiceConfigVersionResponse(ServiceConfigApplicationEntity applicationEntity) {
+  ServiceConfigVersionResponse convertToServiceConfigVersionResponse(ServiceConfigEntity serviceConfigEntity) {
     ServiceConfigVersionResponse serviceConfigVersionResponse = new ServiceConfigVersionResponse();
 
-    ServiceConfigEntity serviceConfigEntity = applicationEntity.getServiceConfigEntity();
-
     serviceConfigVersionResponse.setClusterName(getClusterName());
     serviceConfigVersionResponse.setServiceName(serviceConfigEntity.getServiceName());
     serviceConfigVersionResponse.setVersion(serviceConfigEntity.getVersion());
-    serviceConfigVersionResponse.setCreateTime(serviceConfigEntity.getCreateTimestamp());
-    serviceConfigVersionResponse.setApplyTime(applicationEntity.getApplyTimestamp());
-    serviceConfigVersionResponse.setUserName(applicationEntity.getUser());
-    serviceConfigVersionResponse.setNote(applicationEntity.getNote());
+    serviceConfigVersionResponse.setCreateTime(serviceConfigEntity.getCreateTimestamp());    
+    serviceConfigVersionResponse.setUserName(serviceConfigEntity.getUser());
+    serviceConfigVersionResponse.setNote(serviceConfigEntity.getNote());
     return serviceConfigVersionResponse;
   }
 
@@ -1547,15 +1546,17 @@ public class ClusterImpl implements Cluster {
       selectConfig(configEntity.getType(), configEntity.getTag(), user);
     }
 
-    ServiceConfigApplicationEntity applicationEntity = new ServiceConfigApplicationEntity();
-    applicationEntity.setApplyTimestamp(System.currentTimeMillis());
-    applicationEntity.setServiceConfigEntity(serviceConfigEntity);
-    applicationEntity.setUser(user);
-    applicationEntity.setNote(serviceConfigVersionNote);
-
-    serviceConfigEntity.getServiceConfigApplicationEntities().add(applicationEntity);
+    ServiceConfigEntity serviceConfigEntityClone = new ServiceConfigEntity();
+    serviceConfigEntityClone.setCreateTimestamp(System.currentTimeMillis());
+    serviceConfigEntityClone.setUser(user);
+    serviceConfigEntityClone.setServiceName(serviceName);
+    serviceConfigEntityClone.setClusterEntity(clusterEntity);
+    serviceConfigEntityClone.setClusterConfigEntities(serviceConfigEntity.getClusterConfigEntities());
+    serviceConfigEntityClone.setClusterId(serviceConfigEntity.getClusterId());
+    serviceConfigEntityClone.setNote(serviceConfigVersionNote);
+    serviceConfigEntityClone.setVersion(configVersionHelper.getNextVersion(serviceName));
 
-    serviceConfigDAO.merge(serviceConfigEntity);
+    serviceConfigDAO.create(serviceConfigEntityClone);
   }
 
   @Transactional
@@ -1613,15 +1614,8 @@ public class ClusterImpl implements Cluster {
     serviceConfigEntity.setServiceName(serviceName);
     serviceConfigEntity.setClusterEntity(clusterEntity);
     serviceConfigEntity.setVersion(configVersionHelper.getNextVersion(serviceName));
-
-    //set first default application
-    serviceConfigEntity.setServiceConfigApplicationEntities(new ArrayList<ServiceConfigApplicationEntity>());
-    ServiceConfigApplicationEntity serviceConfigApplicationEntity = new ServiceConfigApplicationEntity();
-    serviceConfigApplicationEntity.setApplyTimestamp(serviceConfigEntity.getCreateTimestamp());
-    serviceConfigApplicationEntity.setServiceConfigEntity(serviceConfigEntity);
-    serviceConfigApplicationEntity.setUser(user);
-    serviceConfigApplicationEntity.setNote(serviceConfigVersionNote);
-    serviceConfigEntity.getServiceConfigApplicationEntities().add(serviceConfigApplicationEntity);
+    serviceConfigEntity.setUser(user);
+    serviceConfigEntity.setNote(serviceConfigVersionNote);
 
     List<ClusterConfigEntity> configEntities = new ArrayList<ClusterConfigEntity>();
     serviceConfigEntity.setClusterConfigEntities(configEntities);
@@ -1649,8 +1643,8 @@ public class ClusterImpl implements Cluster {
     response.setVersion(serviceConfigEntity.getVersion());
     response.setServiceName(serviceConfigEntity.getServiceName());
     response.setCreateTime(serviceConfigEntity.getCreateTimestamp());
-    response.setApplyTime(serviceConfigApplicationEntity.getApplyTimestamp());
-    response.setNote(serviceConfigApplicationEntity.getNote());
+    response.setUserName(serviceConfigEntity.getUser());
+    response.setNote(serviceConfigEntity.getNote());
     return response;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
index bb248ba..0601d2c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog170.java
@@ -273,6 +273,8 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
     columns.add(new DBColumnInfo("service_name", String.class, null, null, false));
     columns.add(new DBColumnInfo("version", Long.class, null, null, false));
     columns.add(new DBColumnInfo("create_timestamp", Long.class, null, null, false));
+    columns.add(new DBColumnInfo("user_name", String.class, null, "_db", false));
+    columns.add(new DBColumnInfo("note", char[].class, null, null, true));
     dbAccessor.createTable("serviceconfig", columns, "service_config_id");
 
     columns.clear();
@@ -280,13 +282,6 @@ public class UpgradeCatalog170 extends AbstractUpgradeCatalog {
     columns.add(new DBColumnInfo("config_id", Long.class, null, null, false));
     dbAccessor.createTable("serviceconfigmapping", columns, "service_config_id", "config_id");
 
-    columns.clear();
-    columns.add(new DBColumnInfo("apply_id", Long.class, null, null, false));
-    columns.add(new DBColumnInfo("service_config_id", Long.class, null, null, false));
-    columns.add(new DBColumnInfo("apply_timestamp", Long.class, null, null, false));
-    columns.add(new DBColumnInfo("user_name", String.class, null, "_db", false));
-    dbAccessor.createTable("serviceconfigapplication", columns, "apply_id");
-
     dbAccessor.addFKConstraint("confgroupclusterconfigmapping", "FK_confg",
       new String[]{"cluster_id", "config_type", "version_tag"}, "clusterconfig",
       new String[]{"cluster_id", "type_name", "version_tag"}, true);

http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
index 5fc03b1..00f0e7c 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
@@ -28,9 +28,8 @@ delimiter ;
 
 CREATE TABLE clusters (cluster_id BIGINT NOT NULL, resource_id BIGINT NOT NULL, cluster_info VARCHAR(255) NOT NULL, cluster_name VARCHAR(100) NOT NULL UNIQUE, provisioning_state VARCHAR(255) NOT NULL DEFAULT 'INIT', desired_cluster_state VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 CREATE TABLE clusterconfig (config_id BIGINT NOT NULL, version_tag VARCHAR(255) NOT NULL, version BIGINT NOT NULL, type_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, config_data LONGTEXT NOT NULL, config_attributes LONGTEXT, create_timestamp BIGINT NOT NULL, PRIMARY KEY (config_id));
-CREATE TABLE serviceconfig (service_config_id BIGINT NOT NULL, cluster_id BIGINT NOT NULL, service_name VARCHAR(255) NOT NULL, version BIGINT NOT NULL, create_timestamp BIGINT NOT NULL, PRIMARY KEY (service_config_id));
+CREATE TABLE serviceconfig (service_config_id BIGINT NOT NULL, cluster_id BIGINT NOT NULL, service_name VARCHAR(255) NOT NULL, version BIGINT NOT NULL, create_timestamp BIGINT NOT NULL, user_name VARCHAR(255) NOT NULL DEFAULT '_db', note LONGTEXT, PRIMARY KEY (service_config_id));
 CREATE TABLE serviceconfigmapping (service_config_id BIGINT NOT NULL, config_id BIGINT NOT NULL, PRIMARY KEY(service_config_id, config_id));
-CREATE TABLE serviceconfigapplication (apply_id BIGINT NOT NULL, service_config_id BIGINT NOT NULL, apply_timestamp BIGINT NOT NULL, user_name VARCHAR(255) NOT NULL DEFAULT '_db', note LONGTEXT,  PRIMARY KEY(apply_id));
 CREATE TABLE clusterservices (service_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, service_enabled INTEGER NOT NULL, PRIMARY KEY (service_name, cluster_id));
 CREATE TABLE clusterstate (cluster_id BIGINT NOT NULL, current_cluster_state VARCHAR(255) NOT NULL, current_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
 CREATE TABLE hostcomponentdesiredstate (cluster_id BIGINT NOT NULL, component_name VARCHAR(255) NOT NULL, desired_stack_version VARCHAR(255) NOT NULL, desired_state VARCHAR(255) NOT NULL, host_name VARCHAR(255) NOT NULL, service_name VARCHAR(255) NOT NULL, admin_state VARCHAR(32), maintenance_state VARCHAR(32) NOT NULL DEFAULT 'ACTIVE', restart_required TINYINT(1) NOT NULL DEFAULT 0, PRIMARY KEY (cluster_id, component_name, host_name, service_name));
@@ -81,7 +80,7 @@ CREATE TABLE adminprincipal (principal_id BIGINT NOT NULL, principal_type_id INT
 CREATE TABLE adminpermission (permission_id BIGINT NOT NULL, permission_name VARCHAR(255) NOT NULL, resource_type_id INTEGER NOT NULL, PRIMARY KEY(permission_id));
 CREATE TABLE adminprivilege (privilege_id BIGINT, permission_id BIGINT NOT NULL, resource_id BIGINT NOT NULL, principal_id BIGINT NOT NULL, PRIMARY KEY(privilege_id));
 
---------altering tables by creating unique constraints----------
+-- altering tables by creating unique constraints----------
 ALTER TABLE users ADD CONSTRAINT UNQ_users_0 UNIQUE (user_name, ldap_user);
 ALTER TABLE groups ADD CONSTRAINT UNQ_groups_0 UNIQUE (group_name, ldap_group);
 ALTER TABLE members ADD CONSTRAINT UNQ_members_0 UNIQUE (group_id, user_id);
@@ -92,7 +91,7 @@ ALTER TABLE viewinstance ADD CONSTRAINT UQ_viewinstance_name_id UNIQUE (view_ins
 ALTER TABLE serviceconfig ADD CONSTRAINT UQ_scv_service_version UNIQUE (cluster_id, service_name, version);
 ALTER TABLE adminpermission ADD CONSTRAINT UQ_perm_name_resource_type_id UNIQUE (permission_name, resource_type_id);
 
---------altering tables by creating foreign keys----------
+-- altering tables by creating foreign keys----------
 ALTER TABLE members ADD CONSTRAINT FK_members_group_id FOREIGN KEY (group_id) REFERENCES groups (group_id);
 ALTER TABLE members ADD CONSTRAINT FK_members_user_id FOREIGN KEY (user_id) REFERENCES users (user_id);
 ALTER TABLE clusterconfig ADD CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id);
@@ -118,12 +117,8 @@ ALTER TABLE user_roles ADD CONSTRAINT FK_user_roles_user_id FOREIGN KEY (user_id
 ALTER TABLE user_roles ADD CONSTRAINT FK_user_roles_role_name FOREIGN KEY (role_name) REFERENCES roles (role_name);
 ALTER TABLE hostconfigmapping ADD CONSTRAINT FK_hostconfmapping_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id);
 ALTER TABLE hostconfigmapping ADD CONSTRAINT FK_hostconfmapping_host_name FOREIGN KEY (host_name) REFERENCES hosts (host_name);
-ALTER TABLE clusterconfig ADD CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, type_name, version_tag);
-ALTER TABLE clusterconfig ADD CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, type_name, version);
-ALTER TABLE serviceconfig ADD CONSTRAINT UQ_scv_service_version UNIQUE (cluster_id, service_name, version);
 ALTER TABLE serviceconfigmapping ADD CONSTRAINT FK_scvm_scv FOREIGN KEY (service_config_id) REFERENCES serviceconfig(service_config_id);
 ALTER TABLE serviceconfigmapping ADD CONSTRAINT FK_scvm_config FOREIGN KEY (config_id) REFERENCES clusterconfig(config_id);
-ALTER TABLE serviceconfigapplication ADD CONSTRAINT FK_scva_scv FOREIGN KEY (service_config_id) REFERENCES serviceconfig(service_config_id);
 ALTER TABLE configgroup ADD CONSTRAINT FK_configgroup_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id);
 ALTER TABLE confgroupclusterconfigmapping ADD CONSTRAINT FK_confg FOREIGN KEY (cluster_id, config_type, version_tag) REFERENCES clusterconfig (cluster_id, type_name, version_tag);
 ALTER TABLE confgroupclusterconfigmapping ADD CONSTRAINT FK_cgccm_gid FOREIGN KEY (config_group_id) REFERENCES configgroup (group_id);
@@ -272,7 +267,6 @@ INSERT INTO ambari_sequences(sequence_name, value) values ('permission_id_seq',
 INSERT INTO ambari_sequences(sequence_name, value) values ('privilege_id_seq', 1);
 INSERT INTO ambari_sequences(sequence_name, value) values ('config_id_seq', 1);
 INSERT INTO ambari_sequences(sequence_name, value) values ('service_config_id_seq', 1);
-INSERT INTO ambari_sequences(sequence_name, value) values ('service_config_application_id_seq', 1);
 INSERT INTO ambari_sequences(sequence_name, value) values ('alert_definition_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, value) values ('alert_group_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, value) values ('alert_target_id_seq', 0);

http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
index c8897f7..ccf99af 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
@@ -19,9 +19,8 @@
 ------create tables---------
 CREATE TABLE clusters (cluster_id NUMBER(19) NOT NULL, resource_id NUMBER(19) NOT NULL, cluster_info VARCHAR2(255) NULL, cluster_name VARCHAR2(100) NOT NULL UNIQUE, provisioning_state VARCHAR2(255) DEFAULT 'INIT' NOT NULL, desired_cluster_state VARCHAR2(255) NULL, desired_stack_version VARCHAR2(255) NULL, PRIMARY KEY (cluster_id));
 CREATE TABLE clusterconfig (config_id NUMBER(19) NOT NULL, version_tag VARCHAR2(255) NOT NULL, version NUMBER(19) NOT NULL, type_name VARCHAR2(255) NOT NULL, cluster_id NUMBER(19) NOT NULL, config_data CLOB NOT NULL, config_attributes CLOB, create_timestamp NUMBER(19) NOT NULL, PRIMARY KEY (config_id));
-CREATE TABLE serviceconfig (service_config_id NUMBER(19) NOT NULL, cluster_id NUMBER(19) NOT NULL, service_name VARCHAR(255) NOT NULL, version NUMBER(19) NOT NULL, create_timestamp NUMBER(19) NOT NULL, PRIMARY KEY (service_config_id));
+CREATE TABLE serviceconfig (service_config_id NUMBER(19) NOT NULL, cluster_id NUMBER(19) NOT NULL, service_name VARCHAR(255) NOT NULL, version NUMBER(19) NOT NULL, create_timestamp NUMBER(19) NOT NULL, user_name VARCHAR(255) DEFAULT '_db' NOT NULL, note CLOB, PRIMARY KEY (service_config_id));
 CREATE TABLE serviceconfigmapping (service_config_id NUMBER(19) NOT NULL, config_id NUMBER(19) NOT NULL, PRIMARY KEY(service_config_id, config_id));
-CREATE TABLE serviceconfigapplication (apply_id NUMBER(19) NOT NULL, service_config_id NUMBER(19) NOT NULL, apply_timestamp NUMBER(19) NOT NULL, user_name VARCHAR(255) DEFAULT '_db' NOT NULL, note CLOB,  PRIMARY KEY(apply_id));
 CREATE TABLE clusterservices (service_name VARCHAR2(255) NOT NULL, cluster_id NUMBER(19) NOT NULL, service_enabled NUMBER(10) NOT NULL, PRIMARY KEY (service_name, cluster_id));
 CREATE TABLE clusterstate (cluster_id NUMBER(19) NOT NULL, current_cluster_state VARCHAR2(255) NULL, current_stack_version VARCHAR2(255) NULL, PRIMARY KEY (cluster_id));
 CREATE TABLE hostcomponentdesiredstate (cluster_id NUMBER(19) NOT NULL, component_name VARCHAR2(255) NOT NULL, desired_stack_version VARCHAR2(255) NULL, desired_state VARCHAR2(255) NOT NULL, host_name VARCHAR2(255) NOT NULL, service_name VARCHAR2(255) NOT NULL, admin_state VARCHAR2(32) NULL, maintenance_state VARCHAR2(32) NOT NULL, restart_required NUMBER(1) DEFAULT 0 NOT NULL, PRIMARY KEY (cluster_id, component_name, host_name, service_name));
@@ -109,12 +108,8 @@ ALTER TABLE user_roles ADD CONSTRAINT FK_user_roles_user_id FOREIGN KEY (user_id
 ALTER TABLE user_roles ADD CONSTRAINT FK_user_roles_role_name FOREIGN KEY (role_name) REFERENCES roles (role_name);
 ALTER TABLE hostconfigmapping ADD CONSTRAINT FK_hostconfmapping_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id);
 ALTER TABLE hostconfigmapping ADD CONSTRAINT FK_hostconfmapping_host_name FOREIGN KEY (host_name) REFERENCES hosts (host_name);
-ALTER TABLE clusterconfig ADD CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, type_name, version_tag);
-ALTER TABLE clusterconfig ADD CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, type_name, version);
-ALTER TABLE serviceconfig ADD CONSTRAINT UQ_scv_service_version UNIQUE (cluster_id, service_name, version);
 ALTER TABLE serviceconfigmapping ADD CONSTRAINT FK_scvm_scv FOREIGN KEY (service_config_id) REFERENCES serviceconfig(service_config_id);
 ALTER TABLE serviceconfigmapping ADD CONSTRAINT FK_scvm_config FOREIGN KEY (config_id) REFERENCES clusterconfig(config_id);
-ALTER TABLE serviceconfigapplication ADD CONSTRAINT FK_scva_scv FOREIGN KEY (service_config_id) REFERENCES serviceconfig(service_config_id);
 ALTER TABLE configgroup ADD CONSTRAINT FK_configgroup_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id);
 ALTER TABLE confgroupclusterconfigmapping ADD CONSTRAINT FK_confg FOREIGN KEY (version_tag, config_type, cluster_id) REFERENCES clusterconfig (version_tag, type_name, cluster_id);
 ALTER TABLE confgroupclusterconfigmapping ADD CONSTRAINT FK_cgccm_gid FOREIGN KEY (config_group_id) REFERENCES configgroup (group_id);
@@ -264,7 +259,6 @@ INSERT INTO ambari_sequences(sequence_name, value) values ('permission_id_seq',
 INSERT INTO ambari_sequences(sequence_name, value) values ('privilege_id_seq', 1);
 INSERT INTO ambari_sequences(sequence_name, value) values ('config_id_seq', 1);
 INSERT INTO ambari_sequences(sequence_name, value) values ('service_config_id_seq', 1);
-INSERT INTO ambari_sequences(sequence_name, value) values ('service_config_application_id_seq', 1);
 INSERT INTO ambari_sequences(sequence_name, value) values ('alert_definition_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, value) values ('alert_group_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, value) values ('alert_target_id_seq', 0);

http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
index eb4d073..9178336 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
@@ -23,12 +23,10 @@ CREATE TABLE clusterconfig (config_id BIGINT NOT NULL, version_tag VARCHAR(255)
 
 CREATE TABLE clusterconfigmapping (cluster_id BIGINT NOT NULL, type_name VARCHAR(255) NOT NULL, version_tag VARCHAR(255) NOT NULL, create_timestamp BIGINT NOT NULL, selected INTEGER NOT NULL DEFAULT 0, user_name VARCHAR(255) NOT NULL DEFAULT '_db', PRIMARY KEY (cluster_id, type_name, create_timestamp));
 
-CREATE TABLE serviceconfig (service_config_id BIGINT NOT NULL, cluster_id BIGINT NOT NULL, service_name VARCHAR(255) NOT NULL, version BIGINT NOT NULL, create_timestamp BIGINT NOT NULL, PRIMARY KEY (service_config_id));
+CREATE TABLE serviceconfig (service_config_id BIGINT NOT NULL, cluster_id BIGINT NOT NULL, service_name VARCHAR(255) NOT NULL, version BIGINT NOT NULL, create_timestamp BIGINT NOT NULL, user_name VARCHAR(255) NOT NULL DEFAULT '_db', note TEXT, PRIMARY KEY (service_config_id));
 
 CREATE TABLE serviceconfigmapping (service_config_id BIGINT NOT NULL, config_id BIGINT NOT NULL, PRIMARY KEY(service_config_id, config_id));
 
-CREATE TABLE serviceconfigapplication (apply_id BIGINT NOT NULL, service_config_id BIGINT NOT NULL, apply_timestamp BIGINT NOT NULL, user_name VARCHAR(255) NOT NULL DEFAULT '_db', note TEXT, PRIMARY KEY(apply_id));
-
 CREATE TABLE clusterservices (service_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, service_enabled INTEGER NOT NULL, PRIMARY KEY (service_name, cluster_id));
 
 CREATE TABLE clusterstate (cluster_id BIGINT NOT NULL, current_cluster_state VARCHAR(255) NOT NULL, current_stack_version VARCHAR(255) NOT NULL, PRIMARY KEY (cluster_id));
@@ -173,7 +171,6 @@ ALTER TABLE users ADD CONSTRAINT FK_users_principal_id FOREIGN KEY (principal_id
 ALTER TABLE groups ADD CONSTRAINT FK_groups_principal_id FOREIGN KEY (principal_id) REFERENCES adminprincipal(principal_id);
 ALTER TABLE serviceconfigmapping ADD CONSTRAINT FK_scvm_scv FOREIGN KEY (service_config_id) REFERENCES serviceconfig(service_config_id);
 ALTER TABLE serviceconfigmapping ADD CONSTRAINT FK_scvm_config FOREIGN KEY (config_id) REFERENCES clusterconfig(config_id);
-ALTER TABLE serviceconfigapplication ADD CONSTRAINT FK_scva_scv FOREIGN KEY (service_config_id) REFERENCES serviceconfig(service_config_id);
 ALTER TABLE clusters ADD CONSTRAINT FK_clusters_resource_id FOREIGN KEY (resource_id) REFERENCES adminresource(resource_id);
 
 -- Alerting Framework
@@ -326,9 +323,7 @@ BEGIN;
   union all
   select 'config_id_seq', 1
   union all
-  select 'service_config_id_seq', 1
-  union  all
-  select 'service_config_application_id_seq', 1;
+  select 'service_config_id_seq', 1;
 
   INSERT INTO adminresourcetype (resource_type_id, resource_type_name)
   SELECT 1, 'AMBARI'

http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
index d775eea..2dfea87 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-EMBEDDED-CREATE.sql
@@ -37,15 +37,12 @@ GRANT ALL PRIVILEGES ON TABLE ambari.clusterconfig TO :username;
 CREATE TABLE ambari.clusterconfigmapping (cluster_id BIGINT NOT NULL, type_name VARCHAR(255) NOT NULL, version_tag VARCHAR(255) NOT NULL, create_timestamp BIGINT NOT NULL, selected INTEGER NOT NULL DEFAULT 0, user_name VARCHAR(255) NOT NULL DEFAULT '_db', PRIMARY KEY (cluster_id, type_name, create_timestamp));
 GRANT ALL PRIVILEGES ON TABLE ambari.clusterconfigmapping TO :username;
 
-CREATE TABLE ambari.serviceconfig (service_config_id BIGINT NOT NULL, cluster_id BIGINT NOT NULL, service_name VARCHAR(255) NOT NULL, version BIGINT NOT NULL, create_timestamp BIGINT NOT NULL, PRIMARY KEY (service_config_id));
+CREATE TABLE ambari.serviceconfig (service_config_id BIGINT NOT NULL, cluster_id BIGINT NOT NULL, service_name VARCHAR(255) NOT NULL, version BIGINT NOT NULL, create_timestamp BIGINT NOT NULL, user_name VARCHAR(255) NOT NULL DEFAULT '_db', note TEXT, PRIMARY KEY (service_config_id));
 GRANT ALL PRIVILEGES ON TABLE ambari.serviceconfig TO :username;
 
 CREATE TABLE ambari.serviceconfigmapping (service_config_id BIGINT NOT NULL, config_id BIGINT NOT NULL, PRIMARY KEY(service_config_id, config_id));
 GRANT ALL PRIVILEGES ON TABLE ambari.serviceconfigmapping TO :username;
 
-CREATE TABLE ambari.serviceconfigapplication (apply_id BIGINT NOT NULL, service_config_id BIGINT NOT NULL, apply_timestamp BIGINT NOT NULL, user_name VARCHAR(255) NOT NULL DEFAULT '_db', note TEXT, PRIMARY KEY(apply_id));
-GRANT ALL PRIVILEGES ON TABLE ambari.serviceconfigapplication TO :username;
-
 CREATE TABLE ambari.clusterservices (service_name VARCHAR(255) NOT NULL, cluster_id BIGINT NOT NULL, service_enabled INTEGER NOT NULL, PRIMARY KEY (service_name, cluster_id));
 GRANT ALL PRIVILEGES ON TABLE ambari.clusterservices TO :username;
 
@@ -229,7 +226,6 @@ ALTER TABLE ambari.confgroupclusterconfigmapping ADD CONSTRAINT FK_confg FOREIGN
 ALTER TABLE ambari.confgroupclusterconfigmapping ADD CONSTRAINT FK_cgccm_gid FOREIGN KEY (config_group_id) REFERENCES ambari.configgroup (group_id);
 ALTER TABLE ambari.serviceconfigmapping ADD CONSTRAINT FK_scvm_scv FOREIGN KEY (service_config_id) REFERENCES ambari.serviceconfig(service_config_id);
 ALTER TABLE ambari.serviceconfigmapping ADD CONSTRAINT FK_scvm_config FOREIGN KEY (config_id) REFERENCES ambari.clusterconfig(config_id);
-ALTER TABLE ambari.serviceconfigapplication ADD CONSTRAINT FK_scva_scv FOREIGN KEY (service_config_id) REFERENCES ambari.serviceconfig(service_config_id);
 ALTER TABLE ambari.adminresource ADD CONSTRAINT FK_resource_resource_type_id FOREIGN KEY (resource_type_id) REFERENCES ambari.adminresourcetype(resource_type_id);
 ALTER TABLE ambari.adminprincipal ADD CONSTRAINT FK_principal_principal_type_id FOREIGN KEY (principal_type_id) REFERENCES ambari.adminprincipaltype(principal_type_id);
 ALTER TABLE ambari.adminpermission ADD CONSTRAINT FK_permission_resource_type_id FOREIGN KEY (resource_type_id) REFERENCES ambari.adminresourcetype(resource_type_id);
@@ -401,10 +397,7 @@ INSERT INTO ambari.ambari_sequences (sequence_name, "value")
   union all
   select 'config_id_seq', 1
   union all
-  select 'service_config_id_seq', 1
-  union  all
-  select 'service_config_application_id_seq', 1;
-
+  select 'service_config_id_seq', 1;
 
 INSERT INTO ambari.adminresourcetype (resource_type_id, resource_type_name)
   SELECT 1, 'AMBARI'

http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/ambari-server/src/main/resources/properties.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/properties.json b/ambari-server/src/main/resources/properties.json
index 753efeb..b12a531 100644
--- a/ambari-server/src/main/resources/properties.json
+++ b/ambari-server/src/main/resources/properties.json
@@ -90,7 +90,6 @@
         "ServiceConfigVersion/service_name",
         "ServiceConfigVersion/serviceconfigversion",
         "ServiceConfigVersion/createtime",
-        "ServiceConfigVersion/appliedtime",
         "ServiceConfigVersion/user",
         "ServiceConfigVersion/service_config_version_note"
     ],

http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/ServiceConfigDAOTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/ServiceConfigDAOTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/ServiceConfigDAOTest.java
new file mode 100644
index 0000000..5118156
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/dao/ServiceConfigDAOTest.java
@@ -0,0 +1,282 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.orm.dao;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.persist.PersistService;
+import junit.framework.Assert;
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.orm.GuiceJpaInitializer;
+import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
+import org.apache.ambari.server.orm.cache.ConfigGroupHostMapping;
+import org.apache.ambari.server.orm.entities.ClusterConfigEntity;
+import org.apache.ambari.server.orm.entities.ClusterEntity;
+import org.apache.ambari.server.orm.entities.ConfigGroupConfigMappingEntity;
+import org.apache.ambari.server.orm.entities.ConfigGroupEntity;
+import org.apache.ambari.server.orm.entities.ConfigGroupHostMappingEntity;
+import org.apache.ambari.server.orm.entities.HostEntity;
+import org.apache.ambari.server.orm.entities.ResourceEntity;
+import org.apache.ambari.server.orm.entities.ResourceTypeEntity;
+import org.apache.ambari.server.orm.entities.ServiceConfigEntity;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+public class ServiceConfigDAOTest {
+  private Injector injector;
+  private ServiceConfigDAO serviceConfigDAO;
+  private ClusterDAO clusterDAO;
+  private ResourceTypeDAO resourceTypeDAO;
+
+
+  @Before
+  public void setup() throws Exception {
+    injector = Guice.createInjector(new InMemoryDefaultTestModule());
+    injector.getInstance(GuiceJpaInitializer.class);
+
+    clusterDAO = injector.getInstance(ClusterDAO.class);
+    serviceConfigDAO = injector.getInstance(ServiceConfigDAO.class);
+    resourceTypeDAO = injector.getInstance(ResourceTypeDAO.class);
+  }
+
+  @After
+  public void teardown() throws AmbariException {
+    injector.getInstance(PersistService.class).stop();
+  }
+
+  private ServiceConfigEntity createServiceConfig(String serviceName,
+         String userName, Long version, Long serviceConfigId,
+         Long createTimestamp, List<ClusterConfigEntity> clusterConfigEntities)
+    throws Exception {
+
+    // create an admin resource to represent this cluster
+    ResourceTypeEntity resourceTypeEntity = resourceTypeDAO.findById(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+    if (resourceTypeEntity == null) {
+      resourceTypeEntity = new ResourceTypeEntity();
+      resourceTypeEntity.setId(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE);
+      resourceTypeEntity.setName(ResourceTypeEntity.CLUSTER_RESOURCE_TYPE_NAME);
+      resourceTypeEntity = resourceTypeDAO.merge(resourceTypeEntity);
+    }
+    ResourceEntity resourceEntity = new ResourceEntity();
+    resourceEntity.setResourceType(resourceTypeEntity);
+
+    ClusterEntity  clusterEntity = clusterDAO.findByName("c1");
+    if (clusterEntity == null) {
+      clusterEntity = new ClusterEntity();
+      clusterEntity.setClusterName("c1");
+      clusterEntity.setResource(resourceEntity);
+      clusterDAO.create(clusterEntity);
+    }
+
+    ServiceConfigEntity serviceConfigEntity = new ServiceConfigEntity();
+    serviceConfigEntity.setServiceName(serviceName);
+    serviceConfigEntity.setUser(userName);
+    serviceConfigEntity.setVersion(version);
+    serviceConfigEntity.setServiceConfigId(serviceConfigId);
+    serviceConfigEntity.setClusterId(clusterEntity.getClusterId());
+    serviceConfigEntity.setCreateTimestamp(createTimestamp);
+    serviceConfigEntity.setClusterConfigEntities(clusterConfigEntities);
+    serviceConfigEntity.setClusterEntity(clusterEntity);
+
+    serviceConfigDAO.create(serviceConfigEntity);
+
+    return serviceConfigEntity;
+  }
+
+  @Test
+  public void testCreateServiceConfigVersion() throws Exception {
+
+    ServiceConfigEntity serviceConfigEntity =
+      createServiceConfig("HDFS", "admin", 1L, 1L, 1111L, null);
+
+    Assert.assertNotNull(serviceConfigEntity);
+    Assert.assertEquals("c1", serviceConfigEntity.getClusterEntity().getClusterName());
+    Assert.assertEquals(Long.valueOf(1), serviceConfigEntity.getClusterEntity()
+      .getClusterId());
+    Assert.assertEquals("HDFS", serviceConfigEntity.getServiceName());
+    Assert.assertEquals(Long.valueOf(1111L), serviceConfigEntity.getCreateTimestamp());
+    Assert.assertEquals("admin", serviceConfigEntity.getUser());
+    Assert.assertEquals(Long.valueOf(1), serviceConfigEntity.getVersion());
+    Assert.assertTrue(serviceConfigEntity.getClusterConfigEntities().isEmpty());
+    Assert.assertNotNull(serviceConfigEntity.getServiceConfigId());
+  }
+
+  @Test
+  public void testFindServiceConfigEntity() throws Exception {
+    ServiceConfigEntity sce =
+      createServiceConfig("HDFS", "admin", 1L, 1L, 1111L, null);
+
+    ServiceConfigEntity serviceConfigEntity = serviceConfigDAO.find(sce.getServiceConfigId());
+
+    Assert.assertNotNull(serviceConfigEntity);
+    Assert.assertEquals("c1", serviceConfigEntity.getClusterEntity().getClusterName());
+    Assert.assertEquals(Long.valueOf(1), serviceConfigEntity.getClusterEntity()
+      .getClusterId());
+    Assert.assertEquals("HDFS", serviceConfigEntity.getServiceName());
+    Assert.assertEquals(Long.valueOf(1111L), serviceConfigEntity.getCreateTimestamp());
+    Assert.assertEquals("admin", serviceConfigEntity.getUser());
+    Assert.assertEquals(Long.valueOf(1), serviceConfigEntity.getVersion());
+    Assert.assertTrue(serviceConfigEntity.getClusterConfigEntities().isEmpty());
+    Assert.assertNotNull(serviceConfigEntity.getServiceConfigId());
+  }
+
+  @Test
+  public void testFindByServiceAndVersion() throws Exception {
+
+    createServiceConfig("HDFS", "admin", 1L, 1L, 1111L, null);
+
+    ServiceConfigEntity serviceConfigEntity =
+      serviceConfigDAO.findByServiceAndVersion("HDFS", 1L);
+
+    Assert.assertNotNull(serviceConfigEntity);
+    Assert.assertEquals("c1", serviceConfigEntity.getClusterEntity().getClusterName());
+    Assert.assertEquals(Long.valueOf(1), serviceConfigEntity.getClusterEntity()
+      .getClusterId());
+    Assert.assertEquals("HDFS", serviceConfigEntity.getServiceName());
+    Assert.assertEquals(Long.valueOf(1111L), serviceConfigEntity.getCreateTimestamp());
+    Assert.assertEquals("admin", serviceConfigEntity.getUser());
+    Assert.assertEquals(Long.valueOf(1), serviceConfigEntity.getVersion());
+    Assert.assertTrue(serviceConfigEntity.getClusterConfigEntities().isEmpty());
+    Assert.assertNotNull(serviceConfigEntity.getServiceConfigId());
+  }
+
+  @Test
+  public void testFindMaxVersions() throws Exception {
+    createServiceConfig("HDFS", "admin", 1L, 1L, 1111L, null);
+    createServiceConfig("HDFS", "admin", 2L, 2L, 2222L, null);
+    createServiceConfig("YARN", "admin", 1L, 3L, 3333L, null);
+
+
+    Map<String,Long> maxVersions = serviceConfigDAO.findMaxVersions(
+      clusterDAO.findByName("c1").getClusterId());
+
+    Assert.assertNotNull(maxVersions);
+
+    Assert.assertEquals(2, maxVersions.size());
+
+    Assert.assertEquals(Long.valueOf(2), maxVersions.get("HDFS"));
+    Assert.assertEquals(Long.valueOf(1), maxVersions.get("YARN"));
+  }
+
+  @Test
+  public void testGetLastServiceConfigs() throws Exception {
+    createServiceConfig("HDFS", "admin", 1L, 1L, 1111L, null);
+    createServiceConfig("HDFS", "admin", 2L, 2L, 2222L, null);
+    createServiceConfig("YARN", "admin", 1L, 3L, 3333L, null);
+
+    List<ServiceConfigEntity> serviceConfigEntities =
+      serviceConfigDAO.getLastServiceConfigs(clusterDAO.findByName("c1").getClusterId());
+
+    Assert.assertNotNull(serviceConfigEntities);
+    Assert.assertEquals(2, serviceConfigEntities.size());
+
+    for (ServiceConfigEntity sce: serviceConfigEntities) {
+      if ("HDFS".equals(sce.getServiceName())) {
+        Assert.assertEquals("c1", sce.getClusterEntity().getClusterName());
+        Assert.assertEquals(Long.valueOf(1), sce.getClusterEntity()
+          .getClusterId());
+        Assert.assertEquals(Long.valueOf(2222L), sce.getCreateTimestamp());
+        Assert.assertEquals(Long.valueOf(2), sce.getVersion());
+        Assert.assertTrue(sce.getClusterConfigEntities().isEmpty());
+        Assert.assertNotNull(sce.getServiceConfigId());
+      }
+      if ("YARN".equals(sce.getServiceName())) {
+        Assert.assertEquals("c1", sce.getClusterEntity().getClusterName());
+        Assert.assertEquals(Long.valueOf(1), sce.getClusterEntity()
+          .getClusterId());
+        Assert.assertEquals(Long.valueOf(3333L), sce.getCreateTimestamp());
+        Assert.assertEquals(Long.valueOf(1), sce.getVersion());
+        Assert.assertTrue(sce.getClusterConfigEntities().isEmpty());
+        Assert.assertNotNull(sce.getServiceConfigId());
+      }
+
+      Assert.assertEquals("admin", sce.getUser());
+    }
+  }
+
+  @Test
+  public void testGetLastServiceConfig() throws Exception {
+    createServiceConfig("HDFS", "admin", 1L, 1L, 1111L, null);
+    createServiceConfig("HDFS", "admin", 2L, 2L, 2222L, null);
+    createServiceConfig("YARN", "admin", 1L, 3L, 3333L, null);
+
+    ServiceConfigEntity serviceConfigEntity =
+      serviceConfigDAO.getLastServiceConfig(1L, "HDFS");
+
+    Assert.assertNotNull(serviceConfigEntity);
+    Assert.assertEquals("c1", serviceConfigEntity.getClusterEntity().getClusterName());
+    Assert.assertEquals(Long.valueOf(1), serviceConfigEntity.getClusterEntity()
+      .getClusterId());
+    Assert.assertEquals("HDFS", serviceConfigEntity.getServiceName());
+    Assert.assertEquals(Long.valueOf(2222L), serviceConfigEntity.getCreateTimestamp());
+    Assert.assertEquals("admin", serviceConfigEntity.getUser());
+    Assert.assertEquals(Long.valueOf(2), serviceConfigEntity.getVersion());
+    Assert.assertTrue(serviceConfigEntity.getClusterConfigEntities().isEmpty());
+    Assert.assertNotNull(serviceConfigEntity.getServiceConfigId());
+  }
+
+  @Test
+  public void testGetServiceConfigs() throws Exception {
+    createServiceConfig("HDFS", "admin", 1L, 1L, 1111L, null);
+    createServiceConfig("HDFS", "admin", 2L, 2L, 2222L, null);
+    createServiceConfig("YARN", "admin", 1L, 3L, 3333L, null);
+
+    List<ServiceConfigEntity> serviceConfigEntities =
+      serviceConfigDAO.getServiceConfigs(clusterDAO.findByName("c1").getClusterId());
+
+    Assert.assertNotNull(serviceConfigEntities);
+    Assert.assertEquals(3, serviceConfigEntities.size());
+
+    for (ServiceConfigEntity sce: serviceConfigEntities) {
+      if ("HDFS".equals(sce.getServiceName()) && (sce.getVersion() == 1)) {
+        Assert.assertEquals("c1", sce.getClusterEntity().getClusterName());
+        Assert.assertEquals(Long.valueOf(1), sce.getClusterEntity()
+          .getClusterId());
+        Assert.assertEquals(Long.valueOf(1111L), sce.getCreateTimestamp());
+        Assert.assertTrue(sce.getClusterConfigEntities().isEmpty());
+        Assert.assertNotNull(sce.getServiceConfigId());
+      } else if ("HDFS".equals(sce.getServiceName()) && (sce.getVersion() == 2)) {
+        Assert.assertEquals("c1", sce.getClusterEntity().getClusterName());
+        Assert.assertEquals(Long.valueOf(1), sce.getClusterEntity()
+          .getClusterId());
+        Assert.assertEquals(Long.valueOf(2222L), sce.getCreateTimestamp());
+        Assert.assertTrue(sce.getClusterConfigEntities().isEmpty());
+        Assert.assertNotNull(sce.getServiceConfigId());
+      } else if ("YARN".equals(sce.getServiceName())) {
+        Assert.assertEquals("c1", sce.getClusterEntity().getClusterName());
+        Assert.assertEquals(Long.valueOf(1), sce.getClusterEntity()
+          .getClusterId());
+        Assert.assertEquals(Long.valueOf(3333L), sce.getCreateTimestamp());
+        Assert.assertEquals(Long.valueOf(1), sce.getVersion());
+        Assert.assertTrue(sce.getClusterConfigEntities().isEmpty());
+        Assert.assertNotNull(sce.getServiceConfigId());
+
+      } else {
+        Assert.fail();
+      }
+      Assert.assertEquals("admin", sce.getUser());
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ServiceConfigEntityTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ServiceConfigEntityTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ServiceConfigEntityTest.java
new file mode 100644
index 0000000..e12e7ae
--- /dev/null
+++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/entities/ServiceConfigEntityTest.java
@@ -0,0 +1,49 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ambari.server.orm.entities;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+
+/**
+ * ServiceConfigEntity unit tests.
+ */
+public class ServiceConfigEntityTest {
+  @Test
+  public void testSettersGetters() {
+    ServiceConfigEntity entity = new ServiceConfigEntity();
+    entity.setServiceName("foo");
+    entity.setUser("bar");
+    entity.setNote("note");
+    entity.setVersion(1L);
+    entity.setServiceConfigId(1L);
+    entity.setClusterId(1L);
+    entity.setCreateTimestamp(1111L);
+    assertEquals("foo", entity.getServiceName());
+    assertEquals("bar", entity.getUser());
+    assertEquals("note", entity.getNote());
+    assertEquals(Long.valueOf(1), entity.getVersion());
+    assertEquals(Long.valueOf(1), entity.getServiceConfigId());
+    assertEquals(Long.valueOf(1), entity.getClusterId());
+    assertEquals(Long.valueOf(1111), entity.getCreateTimestamp());
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/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 453c26b..222924b 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
@@ -47,6 +47,7 @@ import org.apache.ambari.server.agent.DiskInfo;
 import org.apache.ambari.server.agent.HostInfo;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.controller.ClusterResponse;
+import org.apache.ambari.server.controller.ServiceConfigVersionResponse;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
 import org.apache.ambari.server.orm.entities.ClusterEntity;
@@ -633,4 +634,58 @@ public class ClusterTest {
     assertEquals(2, result.size());
   }
 
-}
+  @Test
+  public void testAddServiceConfigVersions() {
+    Config config1 = configFactory.createNew(c1, "hdfs-site",
+      new HashMap<String, String>() {{ put("a", "b"); }}, new HashMap<String, Map<String,String>>());
+    config1.setTag("version1");
+
+    Config config2 = configFactory.createNew(c1, "hdfs-site",
+      new HashMap<String, String>() {{ put("x", "y"); }}, new HashMap<String, Map<String,String>>());
+    config2.setTag("version2");
+
+    c1.addConfig(config1);
+    c1.addConfig(config2);
+
+    c1.addDesiredConfig("admin", config1);
+    List<ServiceConfigVersionResponse> serviceConfigVersions =
+      c1.getServiceConfigVersions();
+    Assert.assertNotNull(serviceConfigVersions);
+    Assert.assertEquals(1, serviceConfigVersions.size());
+    Map<String, ServiceConfigVersionResponse> activeServiceConfigVersions =
+      c1.getActiveServiceConfigVersions();
+    Assert.assertEquals(1, activeServiceConfigVersions.size());
+    ServiceConfigVersionResponse mapredResponse =
+      activeServiceConfigVersions.get("MAPREDUCE");
+
+    Assert.assertEquals("MAPREDUCE", mapredResponse.getServiceName());
+    Assert.assertEquals("c1", mapredResponse.getClusterName());
+    Assert.assertEquals("admin", mapredResponse.getUserName());
+    Assert.assertEquals(Long.valueOf(1), mapredResponse.getVersion());
+
+    c1.addDesiredConfig("admin", config2);
+    serviceConfigVersions = c1.getServiceConfigVersions();
+    Assert.assertNotNull(serviceConfigVersions);
+    // created new ServiceConfigVersion
+    Assert.assertEquals(2, serviceConfigVersions.size());
+    // active version still 1
+    Assert.assertEquals(1, activeServiceConfigVersions.size());
+    mapredResponse = activeServiceConfigVersions.get("MAPREDUCE");
+    Assert.assertEquals("MAPREDUCE", mapredResponse.getServiceName());
+    Assert.assertEquals("c1", mapredResponse.getClusterName());
+    Assert.assertEquals("admin", mapredResponse.getUserName());
+
+    // Rollback , clonning version1 config, created new ServiceConfigVersion
+    c1.addDesiredConfig("admin", config1);
+    serviceConfigVersions = c1.getServiceConfigVersions();
+    Assert.assertNotNull(serviceConfigVersions);
+    // created new ServiceConfigVersion
+    Assert.assertEquals(3, serviceConfigVersions.size());
+    // active version still 1
+    Assert.assertEquals(1, activeServiceConfigVersions.size());
+    mapredResponse = activeServiceConfigVersions.get("MAPREDUCE");
+    Assert.assertEquals("MAPREDUCE", mapredResponse.getServiceName());
+    Assert.assertEquals("c1", mapredResponse.getClusterName());
+    Assert.assertEquals("admin", mapredResponse.getUserName());
+  }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/6eb753d8/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog170Test.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog170Test.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog170Test.java
index 63b64e4..19f37ad 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog170Test.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog170Test.java
@@ -85,6 +85,8 @@ public class UpgradeCatalog170Test {
     Capture<List<DBAccessor.DBColumnInfo>> alertGroupTargetCapture = new Capture<List<DBAccessor.DBColumnInfo>>();
     Capture<List<DBAccessor.DBColumnInfo>> alertGroupingCapture = new Capture<List<DBAccessor.DBColumnInfo>>();
     Capture<List<DBAccessor.DBColumnInfo>> alertNoticeCapture = new Capture<List<DBAccessor.DBColumnInfo>>();
+    Capture<List<DBAccessor.DBColumnInfo>> serviceConfigCapture = new Capture<List<DBAccessor.DBColumnInfo>>();
+    Capture<List<DBAccessor.DBColumnInfo>> serviceConfigMappingCapture = new Capture<List<DBAccessor.DBColumnInfo>>();
 
     setViewExpectations(dbAccessor, maskColumnCapture);
     setViewParameterExpectations(dbAccessor, maskedColumnCapture);
@@ -114,6 +116,13 @@ public class UpgradeCatalog170Test {
     dbAccessor.createTable(eq("alert_notice"), capture(alertNoticeCapture),
         eq("notification_id"));
 
+    dbAccessor.createTable(eq("serviceconfig"), capture(serviceConfigCapture),
+        eq("service_config_id"));
+
+    dbAccessor.createTable(eq("serviceconfigmapping"),
+        capture(serviceConfigMappingCapture), eq("service_config_id"),
+        eq("config_id"));
+
     dbAccessor.executeSelect(anyObject(String.class));
     expectLastCall().andReturn(resultSet).anyTimes();
     resultSet.next();
@@ -143,6 +152,8 @@ public class UpgradeCatalog170Test {
     assertEquals(2, alertGroupTargetCapture.getValue().size());
     assertEquals(2, alertGroupingCapture.getValue().size());
     assertEquals(4, alertNoticeCapture.getValue().size());
+    assertEquals(2, serviceConfigCapture.getValue().size());
+    assertEquals(2, serviceConfigMappingCapture.getValue().size());
   }
 
   @Test