You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by be...@apache.org on 2018/09/26 17:59:21 UTC

[ambari] branch branch-feature-AMBARI-14714 updated: [AMBARI 24678] Config group mapping should allow multiple service instances (benyoka)

This is an automated email from the ASF dual-hosted git repository.

benyoka pushed a commit to branch branch-feature-AMBARI-14714
in repository https://gitbox.apache.org/repos/asf/ambari.git


The following commit(s) were added to refs/heads/branch-feature-AMBARI-14714 by this push:
     new 2e6ddbb  [AMBARI 24678]  Config group mapping should allow multiple service instances (benyoka)
2e6ddbb is described below

commit 2e6ddbbc8a9114dd955725ec634c8aec2f8faea4
Author: benyoka <be...@users.noreply.github.com>
AuthorDate: Wed Sep 26 19:59:15 2018 +0200

    [AMBARI 24678]  Config group mapping should allow multiple service instances (benyoka)
    
    * AMBARI-24678 wip (benyoka)
    
    * AMBARI-24678 fix remaining DDLs (benyoka)
    
    * AMBARI-24678 add javadoc (benyoka)
    
    * AMBARI-24678 review comments (benyoka)
    
    * AMBARI-24678 review comments #2 (benyoka)
---
 .../orm/dao/ConfigGroupConfigMappingDAO.java       | 21 +++---
 .../server/orm/entities/ClusterConfigEntity.java   |  6 +-
 .../ambari/server/orm/entities/ClusterEntity.java  |  1 -
 .../entities/ConfigGroupConfigMappingEntity.java   | 61 ++++++++++++++--
 .../entities/ConfigGroupConfigMappingEntityPK.java | 81 ----------------------
 .../server/state/configgroup/ConfigGroupImpl.java  |  1 +
 .../src/main/resources/Ambari-DDL-Derby-CREATE.sql | 17 +++--
 .../src/main/resources/Ambari-DDL-MySQL-CREATE.sql | 15 ++--
 .../main/resources/Ambari-DDL-Oracle-CREATE.sql    | 13 ++--
 .../main/resources/Ambari-DDL-Postgres-CREATE.sql  | 15 ++--
 .../resources/Ambari-DDL-SQLAnywhere-CREATE.sql    | 13 ++--
 .../main/resources/Ambari-DDL-SQLServer-CREATE.sql | 15 ++--
 12 files changed, 132 insertions(+), 127 deletions(-)

diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupConfigMappingDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupConfigMappingDAO.java
index bfaf82d..1c17ab4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupConfigMappingDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/ConfigGroupConfigMappingDAO.java
@@ -24,7 +24,6 @@ import javax.persistence.TypedQuery;
 
 import org.apache.ambari.server.orm.RequiresSession;
 import org.apache.ambari.server.orm.entities.ConfigGroupConfigMappingEntity;
-import org.apache.ambari.server.orm.entities.ConfigGroupConfigMappingEntityPK;
 
 import com.google.inject.Inject;
 import com.google.inject.Provider;
@@ -38,11 +37,13 @@ public class ConfigGroupConfigMappingDAO {
   @Inject
   DaoUtils daoUtils;
 
+  /**
+   * @param pk the primary key
+   * @return the config group for the given pk
+   */
   @RequiresSession
-  public ConfigGroupConfigMappingEntity findByPK
-    (ConfigGroupConfigMappingEntityPK configGroupConfigMappingEntityPK) {
-    return entityManagerProvider.get().find(ConfigGroupConfigMappingEntity.class,
-      configGroupConfigMappingEntityPK);
+  public ConfigGroupConfigMappingEntity findByPK(Long pk) {
+    return entityManagerProvider.get().find(ConfigGroupConfigMappingEntity.class, pk);
   }
 
   @RequiresSession
@@ -83,11 +84,13 @@ public class ConfigGroupConfigMappingDAO {
     entityManagerProvider.get().remove(merge(configGroupConfigMappingEntity));
   }
 
+  /**
+   * Removes an entity by its primary key
+   * @param pk the primary key
+   */
   @Transactional
-  public void removeByPK(ConfigGroupConfigMappingEntityPK
-                           configGroupConfigMappingEntityPK) {
-    entityManagerProvider.get().remove(findByPK
-      (configGroupConfigMappingEntityPK));
+  public void removeByPK(Long pk) {
+    entityManagerProvider.get().remove(findByPK(pk));
   }
 
   @Transactional
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterConfigEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterConfigEntity.java
index 13837b7..d3ecf9a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterConfigEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterConfigEntity.java
@@ -44,8 +44,10 @@ import org.apache.commons.lang.builder.EqualsBuilder;
 
 @Entity
 @Table(name = "clusterconfig",
-  uniqueConstraints = {@UniqueConstraint(name = "UQ_config_type_tag", columnNames = {"cluster_id", "type_name", "version_tag"}),
-    @UniqueConstraint(name = "UQ_config_type_version", columnNames = {"cluster_id", "type_name", "version"})})
+  uniqueConstraints = {
+    @UniqueConstraint(name = "UQ_config_type_tag", columnNames = {"cluster_id", "service_id", "type_name", "version_tag"}),
+    @UniqueConstraint(name = "UQ_config_type_version", columnNames = {"cluster_id", "service_id", "type_name", "version"})
+  })
 @TableGenerator(name = "config_id_generator",
   table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "sequence_value"
   , pkColumnValue = "config_id_seq"
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterEntity.java
index 793f1a1..e1e7fc1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ClusterEntity.java
@@ -66,7 +66,6 @@ import org.apache.ambari.server.state.State;
   , initialValue = 1
 )
 public class ClusterEntity {
-
   @Id
   @Column(name = "cluster_id", nullable = false, insertable = true, updatable = true)
   @GeneratedValue(strategy = GenerationType.TABLE, generator = "cluster_id_generator")
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ConfigGroupConfigMappingEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ConfigGroupConfigMappingEntity.java
index 76897c9..a94cbb4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ConfigGroupConfigMappingEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ConfigGroupConfigMappingEntity.java
@@ -19,36 +19,59 @@ package org.apache.ambari.server.orm.entities;
 
 import javax.persistence.Column;
 import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
 import javax.persistence.Id;
-import javax.persistence.IdClass;
 import javax.persistence.JoinColumn;
 import javax.persistence.JoinColumns;
 import javax.persistence.ManyToOne;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.UniqueConstraint;
 
 @Entity
-@Table(name = "confgroupclusterconfigmapping")
-@IdClass(ConfigGroupConfigMappingEntityPK.class)
+@Table(
+  name = "confgroupclusterconfigmapping",
+  uniqueConstraints = {
+    @UniqueConstraint(name = "UQ_cgccm_cgid_cid_ctype_sid",
+      columnNames = {"config_group_id", "cluster_id", "service_id", "config_type"})
+  }
+)
+@TableGenerator(name = "confgroupclusterconfigmapping_id_generator",
+  table = "ambari_sequences", pkColumnName = "sequence_name", valueColumnName = "sequence_value",
+  pkColumnValue = "cnfgrpclstrcnfigmpg_id_seq", initialValue = 1
+)
 @NamedQueries({
   @NamedQuery(name = "configsByGroup", query =
   "SELECT configs FROM ConfigGroupConfigMappingEntity configs " +
     "WHERE configs.configGroupId=:groupId")
 })
 public class ConfigGroupConfigMappingEntity {
+  /**
+   * the primary key
+   */
   @Id
+  @Column(name = "id", nullable = false, insertable = true, updatable = false)
+  @GeneratedValue(strategy = GenerationType.TABLE, generator = "confgroupclusterconfigmapping_id_generator")
+  private Long id;
+
   @Column(name = "config_group_id", nullable = false, insertable = true, updatable = true)
   private Long configGroupId;
 
-  @Id
   @Column(name = "cluster_id", nullable = false, insertable = true, updatable = false)
   private Long clusterId;
 
-  @Id
   @Column(name = "config_type", nullable = false, insertable = true, updatable = false)
   private String configType;
 
+  /**
+   * the optional service id
+   */
+  @Column(name = "service_id", nullable = true, insertable = true, updatable = false)
+  private Long serviceId;
+
   @Column(name = "version_tag", nullable = false, insertable = true, updatable = false)
   private String versionTag;
 
@@ -68,6 +91,20 @@ public class ConfigGroupConfigMappingEntity {
     @JoinColumn(name = "config_group_id", referencedColumnName = "group_id", nullable = false, insertable = false, updatable = false)})
   private ConfigGroupEntity configGroupEntity;
 
+  /**
+   * @return the primary key
+   */
+  public Long getId() {
+    return id;
+  }
+
+  /**
+   * @param id the primary key
+   */
+  public void setId(Long id) {
+    this.id = id;
+  }
+
   public Long getConfigGroupId() {
     return configGroupId;
   }
@@ -92,6 +129,20 @@ public class ConfigGroupConfigMappingEntity {
     this.configType = configType;
   }
 
+  /**
+   * @return the service id if the mapping is associated with a service instance or {@code null} if not.
+   */
+  public Long getServiceId() {
+    return serviceId;
+  }
+
+  /**
+   * @param serviceId the id of the service instance associated with this mapping
+   */
+  public void setServiceId(Long serviceId) {
+    this.serviceId = serviceId;
+  }
+
   public String getVersionTag() {
     return versionTag;
   }
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ConfigGroupConfigMappingEntityPK.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ConfigGroupConfigMappingEntityPK.java
deleted file mode 100644
index 828cd24..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/ConfigGroupConfigMappingEntityPK.java
+++ /dev/null
@@ -1,81 +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 java.io.Serializable;
-
-import javax.persistence.Column;
-import javax.persistence.Id;
-
-public class ConfigGroupConfigMappingEntityPK implements Serializable {
-  private Long configGroupId;
-  private Long clusterId;
-  private String configType;
-
-  @Id
-  @Column(name = "config_group_id", nullable = false, insertable = true, updatable = true)
-  public Long getConfigGroupId() {
-    return configGroupId;
-  }
-
-  public void setConfigGroupId(Long configGroupId) {
-    this.configGroupId = configGroupId;
-  }
-
-  @Id
-  @Column(name = "cluster_id", nullable = false, insertable = true, updatable = true, length = 10)
-  public Long getClusterId() {
-    return clusterId;
-  }
-
-  public void setClusterId(Long clusterId) {
-    this.clusterId = clusterId;
-  }
-
-  @Id
-  @Column(name = "config_type", nullable = false, insertable = true, updatable = true)
-  public String getConfigType() {
-    return configType;
-  }
-
-  public void setConfigType(String configType) {
-    this.configType = configType;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) return true;
-    if (o == null || getClass() != o.getClass()) return false;
-
-    ConfigGroupConfigMappingEntityPK that = (ConfigGroupConfigMappingEntityPK) o;
-
-    if (!clusterId.equals(that.clusterId)) return false;
-    if (!configGroupId.equals(that.configGroupId)) return false;
-    if (!configType.equals(that.configType)) return false;
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = configGroupId.hashCode();
-    result = 31 * result + clusterId.hashCode();
-    result = 31 * result + configType.hashCode();
-    return result;
-  }
-}
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 c6c3fed..5ec4d9d 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
@@ -466,6 +466,7 @@ public class ConfigGroupImpl implements ConfigGroup {
         configMappingEntity.setConfigGroupId(configGroupEntity.getGroupId());
         configMappingEntity.setConfigType(clusterConfigEntity.getType());
         configMappingEntity.setVersionTag(clusterConfigEntity.getTag());
+        configMappingEntity.setServiceId(clusterConfigEntity.getServiceId());
         configGroupConfigMappingDAO.create(configMappingEntity);
         configGroupEntity.getConfigGroupConfigMappingEntities().add
           (configMappingEntity);
diff --git a/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
index 733a4ff..16917aa 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
@@ -179,9 +179,8 @@ CREATE TABLE clusterconfig (
   CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
   CONSTRAINT FK_clusterconfig_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
   CONSTRAINT FK_clusterconfig_service_id FOREIGN KEY (service_id) REFERENCES clusterservices(id),
-  CONSTRAINT UQ_config_type_tag UNIQUE (version_tag, type_name, cluster_id),
-  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, type_name, version));
-
+  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, service_id, type_name, version_tag),
+  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, service_id, type_name, version));
 
 CREATE TABLE servicedependencies (
   id BIGINT NOT NULL,
@@ -574,15 +573,19 @@ CREATE TABLE configgroup (
   CONSTRAINT FK_configgroup_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id));
 
 CREATE TABLE confgroupclusterconfigmapping (
+  id BIGINT NOT NULL,
   config_group_id BIGINT NOT NULL,
   cluster_id BIGINT NOT NULL,
   config_type VARCHAR(255) NOT NULL,
+  service_id BIGINT,
   version_tag VARCHAR(255) NOT NULL,
   user_name VARCHAR(255) DEFAULT '_db',
   create_timestamp BIGINT NOT NULL,
-  CONSTRAINT PK_confgroupclustercfgmapping PRIMARY KEY (config_group_id, cluster_id, config_type),
+  CONSTRAINT PK_confgroupclustercfgmapping PRIMARY KEY (id),
+  CONSTRAINT UQ_cgccm_cgid_cid_ctype_sid UNIQUE (config_group_id, cluster_id, service_id, config_type),
+  CONSTRAINT FK_cgccm_service FOREIGN KEY (service_id) REFERENCES clusterservices (id),
   CONSTRAINT FK_cgccm_gid FOREIGN KEY (config_group_id) REFERENCES configgroup (group_id),
-  CONSTRAINT FK_confg FOREIGN KEY (version_tag, config_type, cluster_id) REFERENCES clusterconfig (version_tag, type_name, cluster_id));
+  CONSTRAINT FK_confg FOREIGN KEY (cluster_id, service_id, config_type, version_tag) REFERENCES clusterconfig (cluster_id, service_id, type_name, version_tag));
 
 CREATE TABLE configgrouphostmapping (
   config_group_id BIGINT NOT NULL,
@@ -1386,7 +1389,9 @@ INSERT INTO ambari_sequences (sequence_name, sequence_value)
   union all
   select 'mpack_instance_id_seq', 0 FROM SYSIBM.SYSDUMMY1
   union all
-  select 'hostgroup_component_id_seq', 0 FROM SYSIBM.SYSDUMMY1;
+  select 'hostgroup_component_id_seq', 0 FROM SYSIBM.SYSDUMMY1
+  union all
+  select 'cnfgrpclstrcnfigmpg_id_seq', 0 FROM SYSIBM.SYSDUMMY1
 
 
 INSERT INTO adminresourcetype (resource_type_id, resource_type_name)
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 999665e..45684c0 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
@@ -199,8 +199,8 @@ CREATE TABLE clusterconfig (
   CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
   CONSTRAINT FK_clusterconfig_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
   CONSTRAINT FK_clusterconfig_service_id FOREIGN KEY (service_id) REFERENCES clusterservices(id),
-  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, type_name, version_tag),
-  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, type_name, version));
+  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, service_id, type_name, version_tag),
+  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, service_id, type_name, version));
 
 CREATE TABLE servicedependencies (
   id BIGINT NOT NULL,
@@ -592,15 +592,19 @@ CREATE TABLE configgroup (
   CONSTRAINT FK_configgroup_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id));
 
 CREATE TABLE confgroupclusterconfigmapping (
+  id BIGINT NOT NULL,
   config_group_id BIGINT NOT NULL,
   cluster_id BIGINT NOT NULL,
   config_type VARCHAR(100) NOT NULL,
+  service_id BIGINT,
   version_tag VARCHAR(100) NOT NULL,
   user_name VARCHAR(100) DEFAULT '_db',
   create_timestamp BIGINT NOT NULL,
-  CONSTRAINT PK_confgroupclustercfgmapping PRIMARY KEY (config_group_id, cluster_id, config_type),
+  CONSTRAINT PK_confgroupclustercfgmapping PRIMARY KEY (id),
+  CONSTRAINT UQ_cgccm_cgid_cid_ctype_sid UNIQUE (config_group_id, cluster_id, service_id, config_type),
+  CONSTRAINT FK_cgccm_service FOREIGN KEY (service_id) REFERENCES clusterservices (id),
   CONSTRAINT FK_cgccm_gid FOREIGN KEY (config_group_id) REFERENCES configgroup (group_id),
-  CONSTRAINT FK_confg FOREIGN KEY (cluster_id, config_type, version_tag) REFERENCES clusterconfig (cluster_id, type_name, version_tag));
+  CONSTRAINT FK_confg FOREIGN KEY (cluster_id, service_id, config_type, version_tag) REFERENCES clusterconfig (cluster_id, service_id, type_name, version_tag));
 
 CREATE TABLE configgrouphostmapping (
   config_group_id BIGINT NOT NULL,
@@ -1333,7 +1337,8 @@ INSERT INTO ambari_sequences(sequence_name, sequence_value) VALUES
   ('hostcomponentdesiredstate_id_seq', 0),
   ('mpack_inst_svc_id_seq', 0),
   ('mpack_instance_id_seq', 0),
-  ('hostgroup_component_id_seq', 0);
+  ('hostgroup_component_id_seq', 0),
+  ('cnfgrpclstrcnfigmpg_id_seq', 0);
 
 INSERT INTO adminresourcetype (resource_type_id, resource_type_name) VALUES
   (1, 'AMBARI'),
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 6d6f6c2..7c473c8 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
@@ -179,8 +179,8 @@ CREATE TABLE clusterconfig (
   CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
   CONSTRAINT FK_clusterconfig_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
   CONSTRAINT FK_clusterconfig_service_id FOREIGN KEY (service_id) REFERENCES clusterservices(id),
-  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, type_name, version_tag),
-  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, type_name, version));
+  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, service_id, type_name, version_tag),
+  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, service_id, type_name, version));
 
 CREATE TABLE servicedependencies (
   id NUMBER(19) NOT NULL,
@@ -572,15 +572,19 @@ CREATE TABLE configgroup (
   CONSTRAINT FK_configgroup_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id));
 
 CREATE TABLE confgroupclusterconfigmapping (
+  id NUMBER(19) NOT NULL,
   config_group_id NUMBER(19) NOT NULL,
   cluster_id NUMBER(19) NOT NULL,
   config_type VARCHAR2(255) NOT NULL,
+  service_id NUMBER(19),
   version_tag VARCHAR2(255) NOT NULL,
   user_name VARCHAR2(255) DEFAULT '_db',
   create_timestamp NUMBER(19) NOT NULL,
-  CONSTRAINT PK_confgroupclustercfgmapping PRIMARY KEY (config_group_id, cluster_id, config_type),
+  CONSTRAINT PK_confgroupclustercfgmapping PRIMARY KEY (id),
+  CONSTRAINT UQ_cgccm_cgid_cid_ctype_sid UNIQUE (config_group_id, cluster_id, service_id, config_type),
+  CONSTRAINT FK_cgccm_service FOREIGN KEY (service_id) REFERENCES clusterservices (id),
   CONSTRAINT FK_cgccm_gid FOREIGN KEY (config_group_id) REFERENCES configgroup (group_id),
-  CONSTRAINT FK_confg FOREIGN KEY (version_tag, config_type, cluster_id) REFERENCES clusterconfig (version_tag, type_name, cluster_id));
+  CONSTRAINT FK_confg FOREIGN KEY (cluster_id, service_id, config_type, version_tag) REFERENCES clusterconfig (cluster_id, service_id, type_name, version_tag));
 
 CREATE TABLE configgrouphostmapping (
   config_group_id NUMBER(19) NOT NULL,
@@ -1312,6 +1316,7 @@ INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('hostcompone
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('mpack_inst_svc_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('mpack_instance_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('hostgroup_component_id_seq', 0);
+INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('cnfgrpclstrcnfigmpg_id_seq', 0);
 
 INSERT INTO metainfo("metainfo_key", "metainfo_value") values ('version', '${ambariSchemaVersion}');
 
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 02bd611..84e5297 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
@@ -182,8 +182,8 @@ CREATE TABLE clusterconfig (
   CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
   CONSTRAINT FK_clusterconfig_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
   CONSTRAINT FK_clusterconfig_service_id FOREIGN KEY (service_id) REFERENCES clusterservices(id),
-  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, type_name, version_tag),
-  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, type_name, version));
+  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, service_id, type_name, version_tag),
+  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, service_id, type_name, version));
 
 CREATE TABLE servicedependencies (
   id BIGINT NOT NULL,
@@ -575,15 +575,19 @@ CREATE TABLE configgroup (
   CONSTRAINT FK_configgroup_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id));
 
 CREATE TABLE confgroupclusterconfigmapping (
+  id BIGINT NOT NULL,
   config_group_id BIGINT NOT NULL,
   cluster_id BIGINT NOT NULL,
   config_type VARCHAR(255) NOT NULL,
+  service_id BIGINT,
   version_tag VARCHAR(255) NOT NULL,
   user_name VARCHAR(255) DEFAULT '_db',
   create_timestamp BIGINT NOT NULL,
-  CONSTRAINT PK_confgroupclustercfgmapping PRIMARY KEY (config_group_id, cluster_id, config_type),
+  CONSTRAINT PK_confgroupclustercfgmapping PRIMARY KEY (id),
+  CONSTRAINT UQ_cgccm_cgid_cid_ctype_sid UNIQUE (config_group_id, cluster_id, service_id, config_type),
+  CONSTRAINT FK_cgccm_service FOREIGN KEY (service_id) REFERENCES clusterservices (id),
   CONSTRAINT FK_cgccm_gid FOREIGN KEY (config_group_id) REFERENCES configgroup (group_id),
-  CONSTRAINT FK_confg FOREIGN KEY (version_tag, config_type, cluster_id) REFERENCES clusterconfig (version_tag, type_name, cluster_id));
+  CONSTRAINT FK_confg FOREIGN KEY (cluster_id, service_id, config_type, version_tag) REFERENCES clusterconfig (cluster_id, service_id, type_name, version_tag));
 
 CREATE TABLE configgrouphostmapping (
   config_group_id BIGINT NOT NULL,
@@ -1318,7 +1322,8 @@ INSERT INTO ambari_sequences (sequence_name, sequence_value) VALUES
   ('servicecomponent_version_id_seq', 0),
   ('repo_os_id_seq', 0),
   ('repo_definition_id_seq', 0),
-  ('hostcomponentdesiredstate_id_seq', 0);
+  ('hostcomponentdesiredstate_id_seq', 0),
+  ('cnfgrpclstrcnfigmpg_id_seq', 0);
 
 INSERT INTO adminresourcetype (resource_type_id, resource_type_name) VALUES
   (1, 'AMBARI'),
diff --git a/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
index bc30a73..135d468 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
@@ -178,8 +178,8 @@ CREATE TABLE clusterconfig (
   CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
   CONSTRAINT FK_clusterconfig_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
   CONSTRAINT FK_clusterconfig_service_id FOREIGN KEY (service_id) REFERENCES clusterservices(id),
-  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, type_name, version_tag),
-  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, type_name, version));
+  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, service_id, type_name, version_tag),
+  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, service_id, type_name, version));
 
 CREATE TABLE servicedependencies (
   id NUMBER(19) NOT NULL,
@@ -570,15 +570,19 @@ CREATE TABLE configgroup (
   CONSTRAINT FK_configgroup_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id));
 
 CREATE TABLE confgroupclusterconfigmapping (
+  id NUMERIC(19) NOT NULL,
   config_group_id NUMERIC(19) NOT NULL,
   cluster_id NUMERIC(19) NOT NULL,
   config_type VARCHAR(255) NOT NULL,
+  service_id NUMERIC(19),
   version_tag VARCHAR(255) NOT NULL,
   user_name VARCHAR(255) DEFAULT '_db',
   create_timestamp NUMERIC(19) NOT NULL,
-  CONSTRAINT PK_confgroupclustercfgmapping PRIMARY KEY (config_group_id, cluster_id, config_type),
+  CONSTRAINT PK_confgroupclustercfgmapping PRIMARY KEY (id),
+  CONSTRAINT UQ_cgccm_cgid_cid_ctype_sid UNIQUE (config_group_id, cluster_id, service_id, config_type),
+  CONSTRAINT FK_cgccm_service FOREIGN KEY (service_id) REFERENCES clusterservices (id),
   CONSTRAINT FK_cgccm_gid FOREIGN KEY (config_group_id) REFERENCES configgroup (group_id),
-  CONSTRAINT FK_confg FOREIGN KEY (cluster_id, config_type, version_tag) REFERENCES clusterconfig (cluster_id, type_name, version_tag));
+  CONSTRAINT FK_confg FOREIGN KEY (cluster_id, service_id, config_type, version_tag) REFERENCES clusterconfig (cluster_id, service_id, type_name, version_tag));
 
 CREATE TABLE configgrouphostmapping (
   config_group_id NUMERIC(19) NOT NULL,
@@ -1314,6 +1318,7 @@ INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('hostcompone
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('mpack_inst_svc_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('mpack_instance_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('hostgroup_component_id_seq', 0);
+INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('cnfgrpclstrcnfigmpg_id_seq', 0);
 
 insert into adminresourcetype (resource_type_id, resource_type_name)
   select 1, 'AMBARI'
diff --git a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
index bcc2297..2e87bf8 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
@@ -193,8 +193,8 @@ CREATE TABLE clusterconfig (
   CONSTRAINT FK_clusterconfig_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id),
   CONSTRAINT FK_clusterconfig_stack_id FOREIGN KEY (stack_id) REFERENCES stack(stack_id),
   CONSTRAINT FK_clusterconfig_service_id FOREIGN KEY (service_id) REFERENCES clusterservices(id),
-  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, type_name, version_tag),
-  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, type_name, version));
+  CONSTRAINT UQ_config_type_tag UNIQUE (cluster_id, service_id, type_name, version_tag),
+  CONSTRAINT UQ_config_type_version UNIQUE (cluster_id, service_id, type_name, version));
 
 CREATE TABLE servicedependencies (
   id BIGINT NOT NULL,
@@ -589,15 +589,19 @@ CREATE TABLE configgroup (
   CONSTRAINT FK_configgroup_cluster_id FOREIGN KEY (cluster_id) REFERENCES clusters (cluster_id));
 
 CREATE TABLE confgroupclusterconfigmapping (
+  id BIGINT NOT NULL,
   config_group_id BIGINT NOT NULL,
   cluster_id BIGINT NOT NULL,
   config_type VARCHAR(255) NOT NULL,
+  service_id BIGINT,
   version_tag VARCHAR(255) NOT NULL,
   user_name VARCHAR(255) DEFAULT '_db',
   create_timestamp BIGINT NOT NULL,
-  CONSTRAINT PK_confgroupclustercfgmapping PRIMARY KEY CLUSTERED (config_group_id, cluster_id, config_type),
+  CONSTRAINT PK_confgroupclustercfgmapping PRIMARY KEY (id),
+  CONSTRAINT UQ_cgccm_cgid_cid_ctype_sid UNIQUE (config_group_id, cluster_id, service_id, config_type),
+  CONSTRAINT FK_cgccm_service FOREIGN KEY (service_id) REFERENCES clusterservices (id),
   CONSTRAINT FK_cgccm_gid FOREIGN KEY (config_group_id) REFERENCES configgroup (group_id),
-  CONSTRAINT FK_confg FOREIGN KEY (cluster_id, config_type, version_tag) REFERENCES clusterconfig (cluster_id, type_name, version_tag));
+  CONSTRAINT FK_confg FOREIGN KEY (cluster_id, service_id, config_type, version_tag) REFERENCES clusterconfig (cluster_id, service_id, type_name, version_tag));
 
 CREATE TABLE configgrouphostmapping (
   config_group_id BIGINT NOT NULL,
@@ -1340,7 +1344,8 @@ BEGIN TRANSACTION
     ('hostcomponentdesiredstate_id_seq', 0),
     ('mpack_inst_svc_id_seq', 0),
     ('mpack_instance_id_seq', 0),
-    ('hostgroup_component_id_seq', 0);
+    ('hostgroup_component_id_seq', 0),
+    ('cnfgrpclstrcnfigmpg_id_seq', 0);
 
   insert into adminresourcetype (resource_type_id, resource_type_name)
   values