You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by st...@apache.org on 2016/12/15 16:06:01 UTC

ambari git commit: AMBARI-19164. Add PK to hostcomponentdesiredstate Table To Support FK Relationships. (stoader)

Repository: ambari
Updated Branches:
  refs/heads/trunk 65fe71a1b -> f7399125e


AMBARI-19164. Add PK to hostcomponentdesiredstate Table To Support FK Relationships. (stoader)


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

Branch: refs/heads/trunk
Commit: f7399125edb9615ad7cb7842b084314307495a83
Parents: 65fe71a
Author: Toader, Sebastian <st...@hortonworks.com>
Authored: Thu Dec 15 17:04:22 2016 +0100
Committer: Toader, Sebastian <st...@hortonworks.com>
Committed: Thu Dec 15 17:04:22 2016 +0100

----------------------------------------------------------------------
 .../apache/ambari/server/orm/DBAccessor.java    |  11 +
 .../ambari/server/orm/DBAccessorImpl.java       |  20 +-
 .../orm/dao/HostComponentDesiredStateDAO.java   |  32 ++-
 .../HostComponentDesiredStateEntity.java        |  59 ++++--
 .../HostComponentDesiredStateEntityPK.java      |  96 ---------
 .../server/orm/helpers/dbms/DbmsHelper.java     |   3 +
 .../orm/helpers/dbms/GenericDbmsHelper.java     |  16 +-
 .../server/state/ServiceComponentImpl.java      |  14 +-
 .../svccomphost/ServiceComponentHostImpl.java   |  23 +--
 .../server/upgrade/UpgradeCatalog250.java       | 113 +++++++++-
 .../main/resources/Ambari-DDL-Derby-CREATE.sql  |   9 +-
 .../main/resources/Ambari-DDL-MySQL-CREATE.sql  |   8 +-
 .../main/resources/Ambari-DDL-Oracle-CREATE.sql |   5 +-
 .../resources/Ambari-DDL-Postgres-CREATE.sql    |   7 +-
 .../resources/Ambari-DDL-SQLAnywhere-CREATE.sql |   5 +-
 .../resources/Ambari-DDL-SQLServer-CREATE.sql   |   8 +-
 .../server/state/ServiceComponentTest.java      |  15 +-
 .../server/state/cluster/ClustersTest.java      |  20 +-
 .../svccomphost/ServiceComponentHostTest.java   |  34 +--
 .../server/upgrade/UpgradeCatalog200Test.java   |  13 +-
 .../server/upgrade/UpgradeCatalog250Test.java   | 205 ++++++++++---------
 21 files changed, 416 insertions(+), 300 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessor.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessor.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessor.java
index 488c01e..b8a760f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessor.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessor.java
@@ -71,6 +71,17 @@ public interface DBAccessor {
                           String... columnNames) throws SQLException;
 
   /**
+   * Create new index
+   * @param indexName The name of the index to be created
+   * @param tableName The database table the index to be created on
+   * @param columnNames The columns included into the index
+   * @param isUnique Specifies whether unique index is to be created.
+   * @throws SQLException Exception in case the index creation fails.
+   */
+  void createIndex(String indexName, String tableName, boolean isUnique,
+                   String... columnNames) throws SQLException;
+
+  /**
    * Add foreign key for a relation
    * @param tableName
    * @param constraintName

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
index 39e8488..c645d6d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
@@ -427,12 +427,18 @@ public class DBAccessorImpl implements DBAccessor {
   @Override
   public void createIndex(String indexName, String tableName,
           String... columnNames) throws SQLException {
-   if (!tableHasIndex(tableName, false, indexName)) {
-     String query = dbmsHelper.getCreateIndexStatement(indexName, tableName, columnNames);
-     executeQuery(query);
-   } else {
-     LOG.info("Index {} already exist, skipping creation, table = {}", indexName, tableName);
-   }
+    createIndex(indexName, tableName, false, columnNames);
+  }
+
+  @Override
+  public void createIndex(String indexName, String tableName, boolean isUnique,
+                          String... columnNames) throws SQLException {
+    if (!tableHasIndex(tableName, false, indexName)) {
+      String query = dbmsHelper.getCreateIndexStatement(indexName, tableName, isUnique, columnNames);
+      executeQuery(query);
+    } else {
+      LOG.info("Index {} already exist, skipping creation, table = {}", indexName, tableName);
+    }
   }
 
   @Override
@@ -1177,6 +1183,7 @@ public class DBAccessorImpl implements DBAccessor {
 
         break;
       }
+      case MYSQL:
       case POSTGRES: {
         String lookupPrimaryKeyNameSql = String.format(
             "SELECT constraint_name FROM information_schema.table_constraints AS tc WHERE tc.constraint_type = 'PRIMARY KEY' AND table_name = '%s'",
@@ -1195,6 +1202,7 @@ public class DBAccessorImpl implements DBAccessor {
 
         break;
       }
+
       default:
         break;
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentDesiredStateDAO.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentDesiredStateDAO.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentDesiredStateDAO.java
index 876b1cf..5540294 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentDesiredStateDAO.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/HostComponentDesiredStateDAO.java
@@ -26,7 +26,6 @@ import javax.persistence.TypedQuery;
 
 import org.apache.ambari.server.orm.RequiresSession;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
-import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntityPK;
 import org.apache.ambari.server.orm.entities.HostEntity;
 
 import com.google.inject.Inject;
@@ -46,8 +45,8 @@ public class HostComponentDesiredStateDAO {
   DaoUtils daoUtils;
 
   @RequiresSession
-  public HostComponentDesiredStateEntity findByPK(HostComponentDesiredStateEntityPK primaryKey) {
-    return entityManagerProvider.get().find(HostComponentDesiredStateEntity.class, primaryKey);
+  public HostComponentDesiredStateEntity findById(long id) {
+    return entityManagerProvider.get().find(HostComponentDesiredStateEntity.class, id);
   }
 
   @RequiresSession
@@ -78,6 +77,29 @@ public class HostComponentDesiredStateDAO {
     return daoUtils.selectSingle(query);
   }
 
+  /**
+   * Retrieve the single Host Component Desired State for the given unique cluster, service, component, and host.
+   *
+   * @param clusterId Cluster ID
+   * @param serviceName Service Name
+   * @param componentName Component Name
+   * @param hostId Host ID
+   * @return Return the Host Component Desired State entity that match the criteria.
+   */
+  @RequiresSession
+  public HostComponentDesiredStateEntity findByIndex(Long clusterId, String serviceName,
+                                                     String componentName, Long hostId) {
+    final TypedQuery<HostComponentDesiredStateEntity> query = entityManagerProvider.get()
+      .createNamedQuery("HostComponentDesiredStateEntity.findByIndex", HostComponentDesiredStateEntity.class);
+
+    query.setParameter("clusterId", clusterId);
+    query.setParameter("serviceName", serviceName);
+    query.setParameter("componentName", componentName);
+    query.setParameter("hostId", hostId);
+
+    return daoUtils.selectSingle(query);
+  }
+
   @Transactional
   public void refresh(HostComponentDesiredStateEntity hostComponentDesiredStateEntity) {
     entityManagerProvider.get().refresh(hostComponentDesiredStateEntity);
@@ -109,8 +131,8 @@ public class HostComponentDesiredStateDAO {
   }
 
   @Transactional
-  public void removeByPK(HostComponentDesiredStateEntityPK primaryKey) {
-    remove(findByPK(primaryKey));
+  public void removeId(long id) {
+    remove(findById(id));
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java
index 274a1e0..ea2938b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntity.java
@@ -24,6 +24,8 @@ import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.EnumType;
 import javax.persistence.Enumerated;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.JoinColumns;
@@ -31,6 +33,9 @@ import javax.persistence.ManyToOne;
 import javax.persistence.NamedQueries;
 import javax.persistence.NamedQuery;
 import javax.persistence.OneToOne;
+import javax.persistence.Table;
+import javax.persistence.TableGenerator;
+import javax.persistence.UniqueConstraint;
 
 import org.apache.ambari.server.state.HostComponentAdminState;
 import org.apache.ambari.server.state.MaintenanceState;
@@ -39,39 +44,49 @@ import org.apache.ambari.server.state.State;
 
 import com.google.common.base.Objects;
 
-@javax.persistence.IdClass(HostComponentDesiredStateEntityPK.class)
-@javax.persistence.Table(name = "hostcomponentdesiredstate")
+
 @Entity
+@Table(
+  name = "hostcomponentdesiredstate",
+  uniqueConstraints = @UniqueConstraint(
+    name = "UQ_hcdesiredstate_name",
+    columnNames = { "component_name", "service_name", "host_id", "cluster_id" }) )
+@TableGenerator(
+  name = "hostcomponentdesiredstate_id_generator",
+  table = "ambari_sequences",
+  pkColumnName = "sequence_name",
+  valueColumnName = "sequence_value",
+  pkColumnValue = "hostcomponentdesiredstate_id_seq",
+  initialValue = 0)
 @NamedQueries({
     @NamedQuery(name = "HostComponentDesiredStateEntity.findAll", query = "SELECT hcds from HostComponentDesiredStateEntity hcds"),
 
-    @NamedQuery(name = "HostComponentDesiredStateEntity.findByHost", query =
-        "SELECT hcds from HostComponentDesiredStateEntity hcds WHERE hcds.hostEntity.hostName=:hostName"),
-
-    @NamedQuery(name = "HostComponentDesiredStateEntity.findByService", query =
-        "SELECT hcds from HostComponentDesiredStateEntity hcds WHERE hcds.serviceName=:serviceName"),
-
     @NamedQuery(name = "HostComponentDesiredStateEntity.findByServiceAndComponent", query =
         "SELECT hcds from HostComponentDesiredStateEntity hcds WHERE hcds.serviceName=:serviceName AND hcds.componentName=:componentName"),
 
     @NamedQuery(name = "HostComponentDesiredStateEntity.findByServiceComponentAndHost", query =
         "SELECT hcds from HostComponentDesiredStateEntity hcds WHERE hcds.serviceName=:serviceName AND hcds.componentName=:componentName AND hcds.hostEntity.hostName=:hostName"),
+
+  @NamedQuery(name = "HostComponentDesiredStateEntity.findByIndex", query =
+    "SELECT hcds from HostComponentDesiredStateEntity hcds WHERE hcds.clusterId=:clusterId AND hcds.serviceName=:serviceName AND hcds.componentName=:componentName AND hcds.hostId=:hostId"),
 })
 public class HostComponentDesiredStateEntity {
 
   @Id
+  @GeneratedValue(strategy = GenerationType.TABLE, generator = "hostcomponentdesiredstate_id_generator")
+  @Column(name = "id", nullable = false, insertable = true, updatable = false)
+  private Long id;
+
+
   @Column(name = "cluster_id", nullable = false, insertable = false, updatable = false, length = 10)
   private Long clusterId;
 
-  @Id
   @Column(name = "service_name", nullable = false, insertable = false, updatable = false)
   private String serviceName;
 
-  @Id
   @Column(name = "host_id", nullable = false, insertable = false, updatable = false)
   private Long hostId;
 
-  @Id
   @Column(name = "component_name", insertable = false, updatable = false)
   private String componentName = "";
 
@@ -115,6 +130,8 @@ public class HostComponentDesiredStateEntity {
   @Column(name = "restart_required", insertable = true, updatable = true, nullable = false)
   private Integer restartRequired = 0;
 
+  public Long getId() { return id; }
+
   public Long getClusterId() {
     return clusterId;
   }
@@ -194,28 +211,31 @@ public class HostComponentDesiredStateEntity {
 
     HostComponentDesiredStateEntity that = (HostComponentDesiredStateEntity) o;
 
-    if (clusterId != null ? !clusterId.equals(that.clusterId) : that.clusterId != null) {
+    if (!Objects.equal(id, that.id)) {
+      return false;
+    }
+
+    if (!Objects.equal(clusterId, that.clusterId)) {
       return false;
     }
 
-    if (componentName != null ? !componentName.equals(that.componentName) : that.componentName != null) {
+    if (!Objects.equal(componentName, that.componentName)) {
       return false;
     }
 
-    if (desiredStack != null ? !desiredStack.equals(that.desiredStack)
-        : that.desiredStack != null) {
+    if (!Objects.equal(desiredStack, that.desiredStack)) {
       return false;
     }
 
-    if (desiredState != null ? !desiredState.equals(that.desiredState) : that.desiredState != null) {
+    if (!Objects.equal(desiredState, that.desiredState)) {
       return false;
     }
 
-    if (hostEntity != null ? !hostEntity.equals(that.hostEntity) : that.hostEntity != null) {
+    if (!Objects.equal(hostEntity, that.hostEntity)) {
       return false;
     }
 
-    if (serviceName != null ? !serviceName.equals(that.serviceName) : that.serviceName != null) {
+    if (!Objects.equal(serviceName, that.serviceName)) {
       return false;
     }
 
@@ -224,7 +244,8 @@ public class HostComponentDesiredStateEntity {
 
   @Override
   public int hashCode() {
-    int result = clusterId != null ? clusterId.intValue() : 0;
+    int result = id != null ? id.hashCode() : 0;
+    result = 31 * result + (clusterId != null ? clusterId.hashCode() : 0);
     result = 31 * result + (hostEntity != null ? hostEntity.hashCode() : 0);
     result = 31 * result + (componentName != null ? componentName.hashCode() : 0);
     result = 31 * result + (desiredState != null ? desiredState.hashCode() : 0);

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntityPK.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntityPK.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntityPK.java
deleted file mode 100644
index b16d582..0000000
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/entities/HostComponentDesiredStateEntityPK.java
+++ /dev/null
@@ -1,96 +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;
-
-@SuppressWarnings("serial")
-public class HostComponentDesiredStateEntityPK implements Serializable {
-  private Long clusterId;
-
-  @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;
-  }
-
-  private String serviceName;
-
-  @Id
-  @Column(name = "service_name", nullable = false, insertable = true, updatable = true)
-  public String getServiceName() {
-    return serviceName;
-  }
-
-  public void setServiceName(String serviceName) {
-    this.serviceName = serviceName;
-  }
-
-  private Long hostId;
-
-  @Id
-  @Column(name = "host_id", nullable = false, insertable = true, updatable = true)
-  public Long getHostId() {
-    return hostId;
-  }
-
-  public void setHostId(Long hostId) {
-    this.hostId = hostId;
-  }
-
-  private String componentName;
-
-  @Id
-  @Column(name = "component_name", nullable = false, insertable = true, updatable = true)
-  public String getComponentName() {
-    return componentName;
-  }
-
-  public void setComponentName(String componentName) {
-    this.componentName = componentName;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) return true;
-    if (o == null || getClass() != o.getClass()) return false;
-
-    HostComponentDesiredStateEntityPK that = (HostComponentDesiredStateEntityPK) o;
-
-    if (clusterId != null ? !clusterId.equals(that.clusterId) : that.clusterId != null) return false;
-    if (componentName != null ? !componentName.equals(that.componentName) : that.componentName != null) return false;
-    if (hostId != null ? !hostId.equals(that.hostId) : that.hostId != null) return false;
-
-    return true;
-  }
-
-  @Override
-  public int hashCode() {
-    int result = clusterId !=null ? clusterId.intValue() : 0;
-    result = 31 * result + (hostId != null ? hostId.hashCode() : 0);
-    result = 31 * result + (componentName != null ? componentName.hashCode() : 0);
-    return result;
-  }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/DbmsHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/DbmsHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/DbmsHelper.java
index 1fe65db..c2778d3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/DbmsHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/DbmsHelper.java
@@ -58,6 +58,9 @@ public interface DbmsHelper {
   String getCreateIndexStatement(String indexName, String tableName,
                                  String... columnNames);
 
+  String getCreateIndexStatement(String indexName, String tableName, boolean isUnique,
+                                 String... columnNames);
+
   /**
    * Gets DROP INDEX statement
    *

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/GenericDbmsHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/GenericDbmsHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/GenericDbmsHelper.java
index 042b4d2..36fab83 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/GenericDbmsHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/GenericDbmsHelper.java
@@ -243,8 +243,22 @@ public class GenericDbmsHelper implements DbmsHelper {
   @Override
   public String getCreateIndexStatement(String indexName, String tableName,
                                         String... columnNames) {
+    return getCreateIndexStatement(indexName, tableName, false, columnNames);
+  }
+
+  /**
+   * get create index statement
+   * @param indexName The name of the index to be created
+   * @param tableName The database table the index to be created on
+   * @param columnNames The columns included into the index
+   * @param  isUnique Specifies whether unique index is to be created.
+   * @return The sql statement for creating the index
+   */
+  @Override
+  public String getCreateIndexStatement(String indexName, String tableName, boolean isUnique,
+                                        String... columnNames) {
     //TODO validateColumnNames()
-    String createIndex = databasePlatform.buildCreateIndex(tableName, indexName, columnNames);
+    String createIndex = databasePlatform.buildCreateIndex(tableName, indexName, "", isUnique, columnNames);
     return createIndex;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
index f9c0eb7..236091b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceComponentImpl.java
@@ -40,7 +40,6 @@ import org.apache.ambari.server.orm.dao.StackDAO;
 import org.apache.ambari.server.orm.entities.ClusterServiceEntity;
 import org.apache.ambari.server.orm.entities.ClusterServiceEntityPK;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
-import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntityPK;
 import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
 import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
 import org.apache.ambari.server.orm.entities.StackEntity;
@@ -165,13 +164,14 @@ public class ServiceComponentImpl implements ServiceComponent {
     updateComponentInfo();
 
     for (HostComponentStateEntity hostComponentStateEntity : serviceComponentDesiredStateEntity.getHostComponentStateEntities()) {
-      HostComponentDesiredStateEntityPK pk = new HostComponentDesiredStateEntityPK();
-      pk.setClusterId(hostComponentStateEntity.getClusterId());
-      pk.setServiceName(hostComponentStateEntity.getServiceName());
-      pk.setComponentName(hostComponentStateEntity.getComponentName());
-      pk.setHostId(hostComponentStateEntity.getHostId());
 
-      HostComponentDesiredStateEntity hostComponentDesiredStateEntity = hostComponentDesiredStateDAO.findByPK(pk);
+      HostComponentDesiredStateEntity hostComponentDesiredStateEntity = hostComponentDesiredStateDAO.findByIndex(
+        hostComponentStateEntity.getClusterId(),
+        hostComponentStateEntity.getServiceName(),
+        hostComponentStateEntity.getComponentName(),
+        hostComponentStateEntity.getHostId()
+      );
+
       try {
         hostComponents.put(hostComponentStateEntity.getHostName(),
           serviceComponentHostFactory.createExisting(this,

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
index 5225598..1bcffe4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
@@ -46,7 +46,6 @@ import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO;
 import org.apache.ambari.server.orm.dao.StackDAO;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
-import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntityPK;
 import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
@@ -140,9 +139,9 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
   private final StackDAO stackDAO;
 
   /**
-   * The desired component state entity PK.
+   * The desired component state entity id.
    */
-  private final HostComponentDesiredStateEntityPK desiredStateEntityPK;
+  private final Long desiredStateEntityId;
 
   /**
    * Cache the generated id for host component state for fast lookups.
@@ -799,8 +798,6 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
       desiredStateEntity.setAdminState(null);
     }
 
-    desiredStateEntityPK = getHostComponentDesiredStateEntityPK(desiredStateEntity);
-
     persistEntities(hostEntity, stateEntity, desiredStateEntity);
 
     // publish the service component installed event
@@ -810,6 +807,7 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
 
     eventPublisher.publish(event);
 
+    desiredStateEntityId = desiredStateEntity.getId();
     hostComponentStateId = stateEntity.getId();
 
     resetLastOpInfo();
@@ -836,7 +834,7 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
     this.hostComponentDesiredStateDAO = hostComponentDesiredStateDAO;
     this.eventPublisher = eventPublisher;
 
-    desiredStateEntityPK = getHostComponentDesiredStateEntityPK(desiredStateEntity);
+    desiredStateEntityId = desiredStateEntity.getId();
     hostComponentStateId = stateEntity.getId();
 
     //TODO implement State Machine init as now type choosing is hardcoded in above code
@@ -1580,7 +1578,7 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
    * @return
    */
   private HostComponentDesiredStateEntity getDesiredStateEntity() {
-    return hostComponentDesiredStateDAO.findByPK(desiredStateEntityPK);
+    return hostComponentDesiredStateDAO.findById(desiredStateEntityId);
   }
 
   /**
@@ -1593,15 +1591,4 @@ public class ServiceComponentHostImpl implements ServiceComponentHost {
     return hostComponentStateDAO.findById(hostComponentStateId);
   }
 
-  // create a PK object from the given desired component state entity.
-  private static HostComponentDesiredStateEntityPK getHostComponentDesiredStateEntityPK(
-      HostComponentDesiredStateEntity desiredStateEntity) {
-
-    HostComponentDesiredStateEntityPK dpk = new HostComponentDesiredStateEntityPK();
-    dpk.setClusterId(desiredStateEntity.getClusterId());
-    dpk.setComponentName(desiredStateEntity.getComponentName());
-    dpk.setServiceName(desiredStateEntity.getServiceName());
-    dpk.setHostId(desiredStateEntity.getHostId());
-    return dpk;
-  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog250.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog250.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog250.java
index 823fb27..a7e73fe 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog250.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog250.java
@@ -17,16 +17,20 @@
  */
 package org.apache.ambari.server.upgrade;
 
+import java.sql.ResultSet;
 import java.sql.SQLException;
+import java.sql.Statement;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.actionmanager.CommandExecutionType;
+import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.orm.DBAccessor;
 import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo;
@@ -37,6 +41,7 @@ import org.apache.ambari.server.state.Config;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import org.springframework.jdbc.support.JdbcUtils;
 
 import com.google.inject.Inject;
 import com.google.inject.Injector;
@@ -63,6 +68,10 @@ public class UpgradeCatalog250 extends AbstractUpgradeCatalog {
   protected static final String CREDENTIAL_STORE_SUPPORTED_COL = "credential_store_supported";
   protected static final String CREDENTIAL_STORE_ENABLED_COL = "credential_store_enabled";
 
+  protected static final String HOST_COMPONENT_DESIREDSTATE_TABLE = "hostcomponentdesiredstate";
+  protected static final String HOST_COMPONENT_DESIREDSTATE_ID_COL = "id";
+  protected static final String HOST_COMPONENT_DESIREDSTATE_INDEX = "UQ_hcdesiredstate_name";
+
   /**
    * Logger.
    */
@@ -117,6 +126,7 @@ public class UpgradeCatalog250 extends AbstractUpgradeCatalog {
       new DBAccessor.DBColumnInfo("command_execution_type", String.class, 32, CommandExecutionType.STAGE.toString(),
         false));
     updateServiceDesiredStateTable();
+    updateHostComponentDesiredStateTable();
   }
 
   /**
@@ -307,10 +317,10 @@ public class UpgradeCatalog250 extends AbstractUpgradeCatalog {
     dbAccessor.addPKConstraint(COMPONENT_VERSION_TABLE, COMPONENT_VERSION_PK, "id");
 
     dbAccessor.addFKConstraint(COMPONENT_VERSION_TABLE, COMPONENT_VERSION_FK_COMPONENT, "component_id",
-        COMPONENT_TABLE, "id", false);
+      COMPONENT_TABLE, "id", false);
 
     dbAccessor.addFKConstraint(COMPONENT_VERSION_TABLE, COMPONENT_VERSION_FK_REPO_VERSION, "repo_version_id",
-        "repo_version", "repo_version_id", false);
+      "repo_version", "repo_version_id", false);
 
     addSequence("servicecomponent_version_id_seq", 0L, false);
   }
@@ -324,10 +334,105 @@ public class UpgradeCatalog250 extends AbstractUpgradeCatalog {
     // credential_store_supported SMALLINT DEFAULT 0 NOT NULL
     // credential_store_enabled SMALLINT DEFAULT 0 NOT NULL
     dbAccessor.addColumn(SERVICE_DESIRED_STATE_TABLE,
-            new DBColumnInfo(CREDENTIAL_STORE_SUPPORTED_COL, Short.class, null, 0, false));
+      new DBColumnInfo(CREDENTIAL_STORE_SUPPORTED_COL, Short.class, null, 0, false));
 
     dbAccessor.addColumn(SERVICE_DESIRED_STATE_TABLE,
-            new DBColumnInfo(CREDENTIAL_STORE_ENABLED_COL, Short.class, null, 0, false));
+      new DBColumnInfo(CREDENTIAL_STORE_ENABLED_COL, Short.class, null, 0, false));
+  }
+
+
+  /**
+   * Removes the compound PK from hostcomponentdesiredstate table
+   * and replaces it with a surrogate PK, but only if the table doesn't have it's new PK set.
+   * Create index and unqiue constraint on the columns that originally formed the compound PK.
+   *
+   * @throws SQLException
+   */
+  private void updateHostComponentDesiredStateTable() throws SQLException {
+    if (dbAccessor.tableHasPrimaryKey(HOST_COMPONENT_DESIREDSTATE_TABLE, HOST_COMPONENT_DESIREDSTATE_ID_COL)) {
+      LOG.info("Skipping {} table Primary Key modifications since the new {} column already exists",
+        HOST_COMPONENT_DESIREDSTATE_TABLE, HOST_COMPONENT_DESIREDSTATE_ID_COL);
+
+      return;
+    }
+    // add the new ID column as nullable until we populate
+    dbAccessor.addColumn(HOST_COMPONENT_DESIREDSTATE_TABLE,
+      new DBColumnInfo(HOST_COMPONENT_DESIREDSTATE_ID_COL, Long.class, null, null, true));
+
+    // insert sequence values
+    AtomicLong id = new AtomicLong(1);
+    Statement statement = null;
+    ResultSet resultSet = null;
+
+    try {
+      statement = dbAccessor.getConnection().createStatement();
+
+      if (statement != null) {
+        // Select records by old PK
+        String selectSQL = String.format(
+          "SELECT cluster_id, component_name, host_id, service_name FROM %s", HOST_COMPONENT_DESIREDSTATE_TABLE);
+
+        resultSet = statement.executeQuery(selectSQL);
+
+        while (resultSet.next()) {
+          final Long clusterId = resultSet.getLong("cluster_id");
+          final String componentName = resultSet.getString("component_name");
+          final Long hostId = resultSet.getLong("host_id");
+          final String serviceName = resultSet.getString("service_name");
+
+          String updateSQL = String.format(
+            "UPDATE %s SET %s = %s WHERE cluster_id = %d AND component_name = '%s' AND service_name = '%s' AND host_id = %d",
+            HOST_COMPONENT_DESIREDSTATE_TABLE, HOST_COMPONENT_DESIREDSTATE_ID_COL, id.getAndIncrement(),
+            clusterId, componentName, serviceName, hostId);
+
+          dbAccessor.executeQuery(updateSQL);
+        }
+
+        // Add sequence for hostcomponentdesiredstate table ids
+        addSequence("hostcomponentdesiredstate_id_seq", id.get(), false);
+      }
+
+    }
+    finally {
+      JdbcUtils.closeResultSet(resultSet);
+      JdbcUtils.closeStatement(statement);
+    }
+
+    // make the ID column NON NULL now
+    dbAccessor.alterColumn(HOST_COMPONENT_DESIREDSTATE_TABLE,
+      new DBColumnInfo(HOST_COMPONENT_DESIREDSTATE_ID_COL, Long.class, null, null, false));
+
+    // drop existing PK and create new one on ID column
+    String primaryKeyConstraintName = null;
+    Configuration.DatabaseType databaseType = configuration.getDatabaseType();
+
+    switch (databaseType) {
+      case POSTGRES:
+      case MYSQL:
+      case ORACLE:
+      case SQL_SERVER:
+        primaryKeyConstraintName = dbAccessor.getPrimaryKeyConstraintName(HOST_COMPONENT_DESIREDSTATE_TABLE);
+        break;
+
+      default:
+        throw new UnsupportedOperationException(String.format("Invalid database type '%s'", databaseType));
+
+    }
+
+    // warn if we can't find it
+    if (null == primaryKeyConstraintName) {
+      LOG.warn("Unable to determine the primary key constraint name for {}", HOST_COMPONENT_DESIREDSTATE_TABLE);
+    }
+    else {
+      dbAccessor.dropPKConstraint(HOST_COMPONENT_DESIREDSTATE_TABLE, primaryKeyConstraintName, true);
+    }
+
+    // create a new PK, matching the name of the constraint found in the SQL files
+    dbAccessor.addPKConstraint(HOST_COMPONENT_DESIREDSTATE_TABLE, "PK_hostcomponentdesiredstate", "id");
+
+    // create index, ensuring column order matches that of the SQL files
+    dbAccessor.addUniqueConstraint(HOST_COMPONENT_DESIREDSTATE_TABLE, HOST_COMPONENT_DESIREDSTATE_INDEX,
+      "component_name", "service_name", "host_id", "cluster_id");
   }
 
   protected void updateAtlasConfigs() throws AmbariException {

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
----------------------------------------------------------------------
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 8cf2c0d..6d79cd4 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Derby-CREATE.sql
@@ -197,6 +197,7 @@ CREATE TABLE servicecomponentdesiredstate (
   CONSTRAINT srvccmponentdesiredstatesrvcnm FOREIGN KEY (service_name, cluster_id) REFERENCES clusterservices (service_name, cluster_id));
 
 CREATE TABLE hostcomponentdesiredstate (
+  id BIGINT NOT NULL,
   cluster_id BIGINT NOT NULL,
   component_name VARCHAR(255) NOT NULL,
   desired_stack_id BIGINT NOT NULL,
@@ -207,11 +208,13 @@ CREATE TABLE hostcomponentdesiredstate (
   maintenance_state VARCHAR(32) NOT NULL,
   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   restart_required SMALLINT NOT NULL DEFAULT 0,
-  CONSTRAINT PK_hostcomponentdesiredstate PRIMARY KEY (cluster_id, component_name, host_id, service_name),
+  CONSTRAINT PK_hostcomponentdesiredstate PRIMARY KEY (id),
+  CONSTRAINT UQ_hcdesiredstate_name UNIQUE (component_name, service_name, host_id, cluster_id),
   CONSTRAINT FK_hcdesiredstate_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id),
   CONSTRAINT FK_hcds_desired_stack_id FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id),
   CONSTRAINT hstcmpnntdesiredstatecmpnntnme FOREIGN KEY (component_name, service_name, cluster_id) REFERENCES servicecomponentdesiredstate (component_name, service_name, cluster_id));
 
+
 CREATE TABLE hostcomponentstate (
   id BIGINT NOT NULL,
   cluster_id BIGINT NOT NULL,
@@ -1158,7 +1161,9 @@ INSERT INTO ambari_sequences (sequence_name, sequence_value)
   union all
   select 'remote_cluster_service_id_seq', 0 FROM SYSIBM.SYSDUMMY1
   union all
-  select 'servicecomponent_version_id_seq', 0 FROM SYSIBM.SYSDUMMY1;
+  select 'servicecomponent_version_id_seq', 0 FROM SYSIBM.SYSDUMMY1
+  union all
+  select 'hostcomponentdesiredstate_id_seq', 0 FROM SYSIBM.SYSDUMMY1;
 
 
 INSERT INTO adminresourcetype (resource_type_id, resource_type_name)

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/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 82ce31e..b493d0a 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
@@ -207,6 +207,7 @@ CREATE TABLE servicecomponentdesiredstate (
   CONSTRAINT srvccmponentdesiredstatesrvcnm FOREIGN KEY (service_name, cluster_id) REFERENCES clusterservices (service_name, cluster_id));
 
 CREATE TABLE hostcomponentdesiredstate (
+  id BIGINT NOT NULL,
   cluster_id BIGINT NOT NULL,
   component_name VARCHAR(100) NOT NULL,
   desired_stack_id BIGINT NOT NULL,
@@ -217,11 +218,13 @@ CREATE TABLE hostcomponentdesiredstate (
   maintenance_state VARCHAR(32) NOT NULL DEFAULT 'ACTIVE',
   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   restart_required TINYINT(1) NOT NULL DEFAULT 0,
-  CONSTRAINT PK_hostcomponentdesiredstate PRIMARY KEY (cluster_id, component_name, host_id, service_name),
+  CONSTRAINT PK_hostcomponentdesiredstate PRIMARY KEY (id),
+  CONSTRAINT UQ_hcdesiredstate_name UNIQUE (component_name, service_name, host_id, cluster_id),
   CONSTRAINT FK_hcdesiredstate_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id),
   CONSTRAINT FK_hcds_desired_stack_id FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id),
   CONSTRAINT hstcmpnntdesiredstatecmpnntnme FOREIGN KEY (component_name, service_name, cluster_id) REFERENCES servicecomponentdesiredstate (component_name, service_name, cluster_id));
 
+
 CREATE TABLE hostcomponentstate (
   id BIGINT NOT NULL,
   cluster_id BIGINT NOT NULL,
@@ -1123,7 +1126,8 @@ INSERT INTO ambari_sequences(sequence_name, sequence_value) VALUES
   ('ambari_operation_history_id_seq', 0),
   ('remote_cluster_id_seq', 0),
   ('remote_cluster_service_id_seq', 0),
-  ('servicecomponent_version_id_seq', 0);
+  ('servicecomponent_version_id_seq', 0),
+  ('hostcomponentdesiredstate_id_seq', 0);
 
 INSERT INTO adminresourcetype (resource_type_id, resource_type_name) VALUES
   (1, 'AMBARI'),

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/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 e2c2dd5..3e40103 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Oracle-CREATE.sql
@@ -188,6 +188,7 @@ CREATE TABLE servicecomponentdesiredstate (
   CONSTRAINT srvccmponentdesiredstatesrvcnm FOREIGN KEY (service_name, cluster_id) REFERENCES clusterservices (service_name, cluster_id));
 
 CREATE TABLE hostcomponentdesiredstate (
+  id NUMBER(19) NOT NULL,
   cluster_id NUMBER(19) NOT NULL,
   component_name VARCHAR2(255) NOT NULL,
   desired_stack_id NUMBER(19) NULL,
@@ -198,7 +199,8 @@ CREATE TABLE hostcomponentdesiredstate (
   maintenance_state VARCHAR2(32) NOT NULL,
   security_state VARCHAR2(32) DEFAULT 'UNSECURED' NOT NULL,
   restart_required NUMBER(1) DEFAULT 0 NOT NULL,
-  CONSTRAINT PK_hostcomponentdesiredstate PRIMARY KEY (cluster_id, component_name, host_id, service_name),
+  CONSTRAINT PK_hostcomponentdesiredstate PRIMARY KEY (id),
+  CONSTRAINT UQ_hcdesiredstate_name UNIQUE (component_name, service_name, host_id, cluster_id),
   CONSTRAINT FK_hcdesiredstate_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id),
   CONSTRAINT FK_hcds_desired_stack_id FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id),
   CONSTRAINT hstcmpnntdesiredstatecmpnntnme FOREIGN KEY (component_name, service_name, cluster_id) REFERENCES servicecomponentdesiredstate (component_name, service_name, cluster_id));
@@ -1104,6 +1106,7 @@ INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('ambari_oper
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('remote_cluster_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('remote_cluster_service_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('servicecomponent_version_id_seq', 0);
+INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('hostcomponentdesiredstate_id_seq', 0);
 
 INSERT INTO metainfo("metainfo_key", "metainfo_value") values ('version', '${ambariSchemaVersion}');
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/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 4e9a535..e072805 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-Postgres-CREATE.sql
@@ -197,6 +197,7 @@ CREATE TABLE servicecomponentdesiredstate (
   CONSTRAINT srvccmponentdesiredstatesrvcnm FOREIGN KEY (service_name, cluster_id) REFERENCES clusterservices (service_name, cluster_id));
 
 CREATE TABLE hostcomponentdesiredstate (
+  id BIGINT NOT NULL,
   cluster_id BIGINT NOT NULL,
   component_name VARCHAR(255) NOT NULL,
   desired_stack_id BIGINT NOT NULL,
@@ -207,7 +208,8 @@ CREATE TABLE hostcomponentdesiredstate (
   maintenance_state VARCHAR(32) NOT NULL,
   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   restart_required SMALLINT NOT NULL DEFAULT 0,
-  CONSTRAINT PK_hostcomponentdesiredstate PRIMARY KEY (cluster_id, component_name, host_id, service_name),
+  CONSTRAINT PK_hostcomponentdesiredstate PRIMARY KEY (id),
+  CONSTRAINT UQ_hcdesiredstate_name UNIQUE (component_name, service_name, host_id, cluster_id),
   CONSTRAINT FK_hcdesiredstate_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id),
   CONSTRAINT FK_hcds_desired_stack_id FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id),
   CONSTRAINT hstcmpnntdesiredstatecmpnntnme FOREIGN KEY (component_name, service_name, cluster_id) REFERENCES servicecomponentdesiredstate (component_name, service_name, cluster_id));
@@ -1104,7 +1106,8 @@ INSERT INTO ambari_sequences (sequence_name, sequence_value) VALUES
   ('ambari_operation_history_id_seq', 0),
   ('remote_cluster_id_seq', 0),
   ('remote_cluster_service_id_seq', 0),
-  ('servicecomponent_version_id_seq', 0);
+  ('servicecomponent_version_id_seq', 0),
+  ('hostcomponentdesiredstate_id_seq', 0);
 
 INSERT INTO adminresourcetype (resource_type_id, resource_type_name) VALUES
   (1, 'AMBARI'),

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
----------------------------------------------------------------------
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 0ba7df6..01d9be5 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLAnywhere-CREATE.sql
@@ -186,6 +186,7 @@ CREATE TABLE servicecomponentdesiredstate (
   CONSTRAINT srvccmponentdesiredstatesrvcnm FOREIGN KEY (service_name, cluster_id) REFERENCES clusterservices (service_name, cluster_id));
 
 CREATE TABLE hostcomponentdesiredstate (
+  id NUMERIC(19) NOT NULL,
   cluster_id NUMERIC(19) NOT NULL,
   component_name VARCHAR(255) NOT NULL,
   desired_stack_id NUMERIC(19) NOT NULL,
@@ -196,7 +197,8 @@ CREATE TABLE hostcomponentdesiredstate (
   maintenance_state VARCHAR(32) NOT NULL DEFAULT 'ACTIVE',
   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   restart_required BIT NOT NULL DEFAULT 0,
-  CONSTRAINT PK_hostcomponentdesiredstate PRIMARY KEY (cluster_id, component_name, host_id, service_name),
+  CONSTRAINT PK_hostcomponentdesiredstate PRIMARY KEY (id),
+  CONSTRAINT UQ_hcdesiredstate_name UNIQUE (component_name, service_name, host_id, cluster_id),
   CONSTRAINT FK_hcdesiredstate_host_id FOREIGN KEY (host_id) REFERENCES hosts (host_id),
   CONSTRAINT FK_hcds_desired_stack_id FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id),
   CONSTRAINT hstcmpnntdesiredstatecmpnntnme FOREIGN KEY (component_name, service_name, cluster_id) REFERENCES servicecomponentdesiredstate (component_name, service_name, cluster_id));
@@ -1103,6 +1105,7 @@ INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('ambari_oper
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('remote_cluster_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('remote_cluster_service_id_seq', 0);
 INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('servicecomponent_version_id_seq', 0);
+INSERT INTO ambari_sequences(sequence_name, sequence_value) values ('hostcomponentdesiredstate_id_seq', 0);
 
 insert into adminresourcetype (resource_type_id, resource_type_name)
   select 1, 'AMBARI'

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
----------------------------------------------------------------------
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 d8cad6f..dc03827 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-SQLServer-CREATE.sql
@@ -210,6 +210,7 @@ CREATE TABLE servicecomponentdesiredstate (
   CONSTRAINT srvccmponentdesiredstatesrvcnm FOREIGN KEY (service_name, cluster_id) REFERENCES clusterservices (service_name, cluster_id));
 
 CREATE TABLE hostcomponentdesiredstate (
+  id BIGINT NOT NULL,
   cluster_id BIGINT NOT NULL,
   component_name VARCHAR(255) NOT NULL,
   desired_stack_id BIGINT NOT NULL,
@@ -220,11 +221,13 @@ CREATE TABLE hostcomponentdesiredstate (
   maintenance_state VARCHAR(32) NOT NULL,
   security_state VARCHAR(32) NOT NULL DEFAULT 'UNSECURED',
   restart_required BIT NOT NULL DEFAULT 0,
-  CONSTRAINT PK_hostcomponentdesiredstate PRIMARY KEY CLUSTERED (cluster_id, component_name, host_id, service_name),
+  CONSTRAINT PK_hostcomponentdesiredstate PRIMARY KEY CLUSTERED (id),
+  CONSTRAINT UQ_hcdesiredstate_name UNIQUE NONCLUSTERED (component_name, service_name, host_id, cluster_id),
   CONSTRAINT FK_hcds_desired_stack_id FOREIGN KEY (desired_stack_id) REFERENCES stack(stack_id),
   CONSTRAINT hstcmpnntdesiredstatecmpnntnme FOREIGN KEY (component_name, service_name, cluster_id) REFERENCES servicecomponentdesiredstate (component_name, service_name, cluster_id),
   CONSTRAINT hstcmponentdesiredstatehstid FOREIGN KEY (host_id) REFERENCES hosts (host_id));
 
+
 CREATE TABLE hostcomponentstate (
   id BIGINT NOT NULL,
   cluster_id BIGINT NOT NULL,
@@ -1128,7 +1131,8 @@ BEGIN TRANSACTION
     ('ambari_operation_history_id_seq', 0),
     ('remote_cluster_id_seq', 0),
     ('remote_cluster_service_id_seq', 0),
-    ('servicecomponent_version_id_seq', 0);
+    ('servicecomponent_version_id_seq', 0),
+    ('hostcomponentdesiredstate_id_seq', 0);
 
   insert into adminresourcetype (resource_type_id, resource_type_name)
   values

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java
index 0cf7f09..0f615ee 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/ServiceComponentTest.java
@@ -39,7 +39,6 @@ import org.apache.ambari.server.orm.dao.RepositoryVersionDAO;
 import org.apache.ambari.server.orm.dao.ServiceComponentDesiredStateDAO;
 import org.apache.ambari.server.orm.dao.UpgradeDAO;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
-import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntityPK;
 import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
@@ -245,16 +244,14 @@ public class ServiceComponentTest {
     HostComponentStateDAO liveStateDAO = injector.getInstance(
         HostComponentStateDAO.class);
 
-    HostComponentDesiredStateEntityPK dPK =
-        new HostComponentDesiredStateEntityPK();
-
-    dPK.setClusterId(cluster.getClusterId());
-    dPK.setComponentName(componentName);
-    dPK.setHostId(hostEntity1.getHostId());
-    dPK.setServiceName(serviceName);
 
     HostComponentDesiredStateEntity desiredStateEntity =
-        desiredStateDAO.findByPK(dPK);
+        desiredStateDAO.findByIndex(
+          cluster.getClusterId(),
+          serviceName,
+          componentName,
+          hostEntity1.getHostId()
+        );
 
     HostComponentStateEntity stateEntity = liveStateDAO.findByIndex(cluster.getClusterId(),
         serviceName, componentName, hostEntity1.getHostId());

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClustersTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClustersTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClustersTest.java
index d75d9d0..b190704 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClustersTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/cluster/ClustersTest.java
@@ -54,7 +54,6 @@ import org.apache.ambari.server.orm.dao.HostComponentStateDAO;
 import org.apache.ambari.server.orm.dao.HostDAO;
 import org.apache.ambari.server.orm.dao.TopologyRequestDAO;
 import org.apache.ambari.server.orm.entities.ClusterStateEntity;
-import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntityPK;
 import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.state.AgentVersion;
 import org.apache.ambari.server.state.Cluster;
@@ -453,18 +452,16 @@ public class ClustersTest {
     ServiceComponentHost serviceCheckNodeHost = serviceCheckNode.addServiceComponentHost(h2);
     serviceCheckNodeHost.setState(State.UNKNOWN);
 
-    HostComponentDesiredStateEntityPK hkdspk = new HostComponentDesiredStateEntityPK();
-
-    hkdspk.setClusterId(nameNodeHost.getClusterId());
-    hkdspk.setHostId(nameNodeHostEntity.getHostId());
-    hkdspk.setServiceName(nameNodeHost.getServiceName());
-    hkdspk.setComponentName(nameNodeHost.getServiceComponentName());
-
     Assert.assertNotNull(injector.getInstance(HostComponentStateDAO.class).findByIndex(
       nameNodeHost.getClusterId(), nameNodeHost.getServiceName(),
       nameNodeHost.getServiceComponentName(), nameNodeHostEntity.getHostId()));
 
-    Assert.assertNotNull(injector.getInstance(HostComponentDesiredStateDAO.class).findByPK(hkdspk));
+    Assert.assertNotNull(injector.getInstance(HostComponentDesiredStateDAO.class).findByIndex(
+      nameNodeHost.getClusterId(),
+      nameNodeHost.getServiceName(),
+      nameNodeHost.getServiceComponentName(),
+      nameNodeHostEntity.getHostId()
+    ));
     Assert.assertEquals(2, injector.getProvider(EntityManager.class).get().createQuery("SELECT config FROM ClusterConfigEntity config").getResultList().size());
     Assert.assertEquals(1, injector.getProvider(EntityManager.class).get().createQuery("SELECT state FROM ClusterStateEntity state").getResultList().size());
     Assert.assertEquals(1, injector.getProvider(EntityManager.class).get().createQuery("SELECT config FROM ClusterConfigMappingEntity config").getResultList().size());
@@ -502,7 +499,10 @@ public class ClustersTest {
       nameNodeHost.getClusterId(), nameNodeHost.getServiceName(),
       nameNodeHost.getServiceComponentName(), nameNodeHostEntity.getHostId()));
 
-    Assert.assertNull(injector.getInstance(HostComponentDesiredStateDAO.class).findByPK(hkdspk));
+    Assert.assertNull(injector.getInstance(HostComponentDesiredStateDAO.class).findByIndex(
+      nameNodeHost.getClusterId(), nameNodeHost.getServiceName(),
+      nameNodeHost.getServiceComponentName(), nameNodeHostEntity.getHostId()
+    ));
     Assert.assertEquals(0, injector.getProvider(EntityManager.class).get().createQuery("SELECT config FROM ClusterConfigEntity config").getResultList().size());
     Assert.assertEquals(0, injector.getProvider(EntityManager.class).get().createQuery("SELECT state FROM ClusterStateEntity state").getResultList().size());
     Assert.assertEquals(0, injector.getProvider(EntityManager.class).get().createQuery("SELECT config FROM ClusterConfigMappingEntity config").getResultList().size());

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java
index 5987af3..de2b59d 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostTest.java
@@ -39,7 +39,6 @@ import org.apache.ambari.server.orm.dao.HostComponentStateDAO;
 import org.apache.ambari.server.orm.dao.HostDAO;
 import org.apache.ambari.server.orm.entities.ClusterEntity;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
-import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntityPK;
 import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.state.Cluster;
@@ -1057,20 +1056,24 @@ public class ServiceComponentHostTest {
     //ServiceComponentHost sch2 = createNewServiceComponentHost(cluster, "HDFS", "DATANODE", hostName);
     //ServiceComponentHost sch3 = createNewServiceComponentHost(cluster, "MAPREDUCE2", "HISTORYSERVER", hostName);
 
-    HostComponentDesiredStateEntityPK pk = new HostComponentDesiredStateEntityPK();
-    pk.setClusterId(Long.valueOf(cluster.getClusterId()));
-    pk.setComponentName(sch1.getServiceComponentName());
-    pk.setServiceName(sch1.getServiceName());
-    pk.setHostId(hostEntity.getHostId());
-
-    HostComponentDesiredStateEntity entity = hostComponentDesiredStateDAO.findByPK(pk);
+    HostComponentDesiredStateEntity entity = hostComponentDesiredStateDAO.findByIndex(
+      cluster.getClusterId(),
+      sch1.getServiceName(),
+      sch1.getServiceComponentName(),
+      hostEntity.getHostId()
+    );
     Assert.assertEquals(MaintenanceState.OFF, entity.getMaintenanceState());
     Assert.assertEquals(MaintenanceState.OFF, sch1.getMaintenanceState());
 
     sch1.setMaintenanceState(MaintenanceState.ON);
     Assert.assertEquals(MaintenanceState.ON, sch1.getMaintenanceState());
 
-    entity = hostComponentDesiredStateDAO.findByPK(pk);
+    entity = hostComponentDesiredStateDAO.findByIndex(
+      cluster.getClusterId(),
+      sch1.getServiceName(),
+      sch1.getServiceComponentName(),
+      hostEntity.getHostId()
+    );
     Assert.assertEquals(MaintenanceState.ON, entity.getMaintenanceState());
   }
 
@@ -1097,12 +1100,6 @@ public class ServiceComponentHostTest {
     ServiceComponentHost sch1 = createNewServiceComponentHost(cluster, "HDFS", "NAMENODE", hostName);
 
     HostComponentDesiredStateEntity entityHostComponentDesiredState;
-    HostComponentDesiredStateEntityPK pkHostComponentDesiredState = new HostComponentDesiredStateEntityPK();
-    pkHostComponentDesiredState.setClusterId(cluster.getClusterId());
-    pkHostComponentDesiredState.setComponentName(sch1.getServiceComponentName());
-    pkHostComponentDesiredState.setServiceName(sch1.getServiceName());
-    pkHostComponentDesiredState.setHostId(hostEntity.getHostId());
-
     HostComponentStateEntity entityHostComponentState;
 
     for(SecurityState state: SecurityState.values()) {
@@ -1116,7 +1113,12 @@ public class ServiceComponentHostTest {
       try {
         sch1.setDesiredSecurityState(state);
         Assert.assertTrue(state.isEndpoint());
-        entityHostComponentDesiredState = hostComponentDesiredStateDAO.findByPK(pkHostComponentDesiredState);
+        entityHostComponentDesiredState = hostComponentDesiredStateDAO.findByIndex(
+          cluster.getClusterId(),
+          sch1.getServiceName(),
+          sch1.getServiceComponentName(),
+          hostEntity.getHostId()
+        );
         Assert.assertNotNull(entityHostComponentDesiredState);
         Assert.assertEquals(state, entityHostComponentDesiredState.getSecurityState());
       } catch (AmbariException e) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog200Test.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog200Test.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog200Test.java
index 1513209..b00f9f0 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog200Test.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog200Test.java
@@ -67,7 +67,6 @@ import org.apache.ambari.server.orm.dao.StackDAO;
 import org.apache.ambari.server.orm.entities.ClusterEntity;
 import org.apache.ambari.server.orm.entities.ClusterServiceEntity;
 import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
-import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntityPK;
 import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
 import org.apache.ambari.server.orm.entities.HostEntity;
 import org.apache.ambari.server.orm.entities.ServiceComponentDesiredStateEntity;
@@ -643,12 +642,12 @@ public class UpgradeCatalog200Test {
 
     assertNotNull(serviceComponentDesiredStateEntity);
 
-    HostComponentDesiredStateEntityPK hcDesiredStateEntityPk = new HostComponentDesiredStateEntityPK();
-    hcDesiredStateEntityPk.setServiceName("NAGIOS");
-    hcDesiredStateEntityPk.setClusterId(clusterEntity.getClusterId());
-    hcDesiredStateEntityPk.setComponentName("NAGIOS_SERVER");
-    hcDesiredStateEntityPk.setHostId(hostEntity.getHostId());
-    HostComponentDesiredStateEntity hcDesiredStateEntity = hostComponentDesiredStateDAO.findByPK(hcDesiredStateEntityPk);
+    HostComponentDesiredStateEntity hcDesiredStateEntity = hostComponentDesiredStateDAO.findByIndex(
+      clusterEntity.getClusterId(),
+      "NAGIOS",
+      "NAGIOS_SERVER",
+      hostEntity.getHostId()
+    );
     assertNotNull(hcDesiredStateEntity);
 
     HostComponentStateEntity hcStateEntity = hostComponentStateDAO.findByIndex(

http://git-wip-us.apache.org/repos/asf/ambari/blob/f7399125/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog250Test.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog250Test.java b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog250Test.java
index 89dd567..1f3858f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog250Test.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog250Test.java
@@ -18,31 +18,14 @@
 
 package org.apache.ambari.server.upgrade;
 
-import static org.easymock.EasyMock.anyObject;
-import static org.easymock.EasyMock.anyString;
-import static org.easymock.EasyMock.capture;
-import static org.easymock.EasyMock.createMockBuilder;
-import static org.easymock.EasyMock.createNiceMock;
-import static org.easymock.EasyMock.createStrictMock;
-import static org.easymock.EasyMock.eq;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.expectLastCall;
-import static org.easymock.EasyMock.newCapture;
-import static org.easymock.EasyMock.replay;
-import static org.easymock.EasyMock.reset;
-import static org.easymock.EasyMock.verify;
-import static org.junit.Assert.assertTrue;
-
-import java.lang.reflect.Method;
-import java.sql.Connection;
-import java.sql.ResultSet;
-import java.sql.Statement;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.persistence.EntityManager;
-
+import com.google.common.collect.Maps;
+import com.google.gson.Gson;
+import com.google.inject.Binder;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+import com.google.inject.Provider;
+import junit.framework.Assert;
 import org.apache.ambari.server.actionmanager.ActionManager;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.AmbariManagementController;
@@ -57,35 +40,100 @@ import org.apache.ambari.server.state.Service;
 import org.apache.ambari.server.state.stack.OsFamily;
 import org.easymock.Capture;
 import org.easymock.EasyMock;
+import org.easymock.EasyMockRunner;
 import org.easymock.EasyMockSupport;
+import org.easymock.Mock;
+import org.easymock.MockType;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 
-import com.google.common.collect.Maps;
-import com.google.gson.Gson;
-import com.google.inject.Binder;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-import com.google.inject.Module;
-import com.google.inject.Provider;
+import javax.persistence.EntityManager;
+import java.lang.reflect.Method;
+import java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.Statement;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
-import junit.framework.Assert;
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.anyString;
+import static org.easymock.EasyMock.capture;
+import static org.easymock.EasyMock.createMockBuilder;
+import static org.easymock.EasyMock.eq;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.expectLastCall;
+import static org.easymock.EasyMock.newCapture;
+import static org.easymock.EasyMock.replay;
+import static org.easymock.EasyMock.reset;
+import static org.easymock.EasyMock.verify;
+import static org.junit.Assert.assertTrue;
 
 /**
  * {@link UpgradeCatalog250} unit tests.
  */
+@RunWith(EasyMockRunner.class)
 public class UpgradeCatalog250Test {
 
-//  private Injector injector;
-  private Provider<EntityManager> entityManagerProvider = createStrictMock(Provider.class);
-  private EntityManager entityManager = createNiceMock(EntityManager.class);
+  //  private Injector injector;
+  @Mock(type = MockType.STRICT)
+  private Provider<EntityManager> entityManagerProvider;
+
+  @Mock(type = MockType.NICE)
+  private EntityManager entityManager;
+
+  @Mock(type = MockType.NICE)
+  private DBAccessor dbAccessor;
+
+  @Mock(type = MockType.NICE)
+  private Configuration configuration;
+
+  @Mock(type = MockType.NICE)
+  private Connection connection;
+
+  @Mock(type = MockType.NICE)
+  private Statement statement;
+
+  @Mock(type = MockType.NICE)
+  private ResultSet resultSet;
+
+  @Mock(type = MockType.NICE)
+  private OsFamily osFamily;
+
+  @Mock(type = MockType.NICE)
+  private KerberosHelper kerberosHelper;
+
+  @Mock(type = MockType.NICE)
+  private ActionManager actionManager;
+
+  @Mock(type = MockType.NICE)
+  private Config config;
+
+  @Mock(type = MockType.STRICT)
+  private Service service;
+
+  @Mock(type = MockType.NICE)
+  private Clusters clusters;
+
+  @Mock(type = MockType.NICE)
+  private  Cluster cluster;
+
+  @Mock(type = MockType.NICE)
+  private Injector injector;
 
   @Before
   public void init() {
-    reset(entityManagerProvider);
+    reset(entityManagerProvider, injector);
+
     expect(entityManagerProvider.get()).andReturn(entityManager).anyTimes();
-    replay(entityManagerProvider);
+
+    expect(injector.getInstance(Gson.class)).andReturn(null).anyTimes();
+    expect(injector.getInstance(MaintenanceStateHelper.class)).andReturn(null).anyTimes();
+    expect(injector.getInstance(KerberosHelper.class)).andReturn(kerberosHelper).anyTimes();
+
+    replay(entityManagerProvider, injector);
   }
 
   @After
@@ -94,14 +142,6 @@ public class UpgradeCatalog250Test {
 
   @Test
   public void testExecuteDDLUpdates() throws Exception {
-    final DBAccessor dbAccessor = createNiceMock(DBAccessor.class);
-
-    Configuration configuration = createNiceMock(Configuration.class);
-    Connection connection = createNiceMock(Connection.class);
-    Statement statement = createNiceMock(Statement.class);
-    ResultSet resultSet = createNiceMock(ResultSet.class);
-
-
     // !!! setup capture for host_version
     dbAccessor.addUniqueConstraint("host_version", "UQ_host_repo", "repo_version_id", "host_id");
 
@@ -115,16 +155,16 @@ public class UpgradeCatalog250Test {
     Capture<List<DBAccessor.DBColumnInfo>> capturedComponentVersionColumns = newCapture();
 
     dbAccessor.createTable(eq(UpgradeCatalog250.COMPONENT_VERSION_TABLE), capture(capturedComponentVersionColumns),
-        eq((String[]) null));
+      eq((String[]) null));
 
     dbAccessor.addPKConstraint(eq(UpgradeCatalog250.COMPONENT_VERSION_TABLE),
-        eq(UpgradeCatalog250.COMPONENT_VERSION_PK), eq("id"));
+      eq(UpgradeCatalog250.COMPONENT_VERSION_PK), eq("id"));
     dbAccessor.addFKConstraint(eq(UpgradeCatalog250.COMPONENT_VERSION_TABLE),
-        eq(UpgradeCatalog250.COMPONENT_VERSION_FK_COMPONENT), eq("component_id"),
-        eq(UpgradeCatalog250.COMPONENT_TABLE), eq("id"), eq(false));
+      eq(UpgradeCatalog250.COMPONENT_VERSION_FK_COMPONENT), eq("component_id"),
+      eq(UpgradeCatalog250.COMPONENT_TABLE), eq("id"), eq(false));
     dbAccessor.addFKConstraint(eq(UpgradeCatalog250.COMPONENT_VERSION_TABLE),
-        eq(UpgradeCatalog250.COMPONENT_VERSION_FK_REPO_VERSION), eq("repo_version_id"),
-        eq("repo_version"), eq("repo_version_id"), eq(false));
+      eq(UpgradeCatalog250.COMPONENT_VERSION_FK_REPO_VERSION), eq("repo_version_id"),
+      eq("repo_version"), eq("repo_version_id"), eq(false));
 
     // servicedesiredstate table
     Capture<DBAccessor.DBColumnInfo> capturedCredentialStoreSupportedCol = newCapture();
@@ -132,9 +172,10 @@ public class UpgradeCatalog250Test {
     dbAccessor.addColumn(eq(UpgradeCatalog250.SERVICE_DESIRED_STATE_TABLE), capture(capturedCredentialStoreSupportedCol));
     dbAccessor.addColumn(eq(UpgradeCatalog250.SERVICE_DESIRED_STATE_TABLE), capture(capturedCredentialStoreEnabledCol));
 
-    expect(dbAccessor.getConnection()).andReturn(connection);
-    expect(connection.createStatement()).andReturn(statement);
-    expect(statement.executeQuery(anyObject(String.class))).andReturn(resultSet);
+    expect(dbAccessor.getConnection()).andReturn(connection).anyTimes();
+    expect(connection.createStatement()).andReturn(statement).anyTimes();
+    expect(statement.executeQuery(anyObject(String.class))).andReturn(resultSet).anyTimes();
+    expect(configuration.getDatabaseType()).andReturn(Configuration.DatabaseType.POSTGRES).anyTimes();
 
     replay(dbAccessor, configuration, connection, statement, resultSet);
 
@@ -142,8 +183,9 @@ public class UpgradeCatalog250Test {
       @Override
       public void configure(Binder binder) {
         binder.bind(DBAccessor.class).toInstance(dbAccessor);
-        binder.bind(OsFamily.class).toInstance(createNiceMock(OsFamily.class));
+        binder.bind(OsFamily.class).toInstance(osFamily);
         binder.bind(EntityManager.class).toInstance(entityManager);
+        binder.bind(Configuration.class).toInstance(configuration);
       }
     };
 
@@ -294,28 +336,22 @@ public class UpgradeCatalog250Test {
     };
     EasyMockSupport easyMockSupport = new EasyMockSupport();
 
-    Clusters clusters = easyMockSupport.createNiceMock(Clusters.class);
-    final Cluster cluster = easyMockSupport.createNiceMock(Cluster.class);
     Config mockAmsEnv = easyMockSupport.createNiceMock(Config.class);
 
+    reset(clusters, cluster);
     expect(clusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{
       put("normal", cluster);
     }}).once();
     expect(cluster.getDesiredConfigByType("ams-env")).andReturn(mockAmsEnv).atLeastOnce();
     expect(mockAmsEnv.getProperties()).andReturn(oldPropertiesAmsEnv).anyTimes();
 
-    Injector injector = easyMockSupport.createNiceMock(Injector.class);
-    expect(injector.getInstance(Gson.class)).andReturn(null).anyTimes();
-    expect(injector.getInstance(MaintenanceStateHelper.class)).andReturn(null).anyTimes();
-    expect(injector.getInstance(KerberosHelper.class)).andReturn(createNiceMock(KerberosHelper.class)).anyTimes();
-
-    replay(injector, clusters, mockAmsEnv, cluster);
+    replay(clusters, mockAmsEnv, cluster);
 
-    AmbariManagementControllerImpl controller = createMockBuilder(AmbariManagementControllerImpl.class)
+    AmbariManagementControllerImpl controller = (AmbariManagementControllerImpl)createMockBuilder(AmbariManagementControllerImpl.class)
       .addMockedMethod("createConfiguration")
       .addMockedMethod("getClusters", new Class[] { })
       .addMockedMethod("createConfig")
-      .withConstructor(createNiceMock(ActionManager.class), clusters, injector)
+      .withConstructor(actionManager, clusters, injector)
       .createNiceMock();
 
     Injector injector2 = easyMockSupport.createNiceMock(Injector.class);
@@ -324,7 +360,7 @@ public class UpgradeCatalog250Test {
     expect(injector2.getInstance(AmbariManagementController.class)).andReturn(controller).anyTimes();
     expect(controller.getClusters()).andReturn(clusters).anyTimes();
     expect(controller.createConfig(anyObject(Cluster.class), anyString(), capture(propertiesCapture), anyString(),
-      anyObject(Map.class))).andReturn(createNiceMock(Config.class)).once();
+      anyObject(Map.class))).andReturn(config).once();
 
     replay(controller, injector2);
     new UpgradeCatalog250(injector2).updateAMSConfigs();
@@ -350,29 +386,22 @@ public class UpgradeCatalog250Test {
       }
     };
     EasyMockSupport easyMockSupport = new EasyMockSupport();
-
-    Clusters clusters = easyMockSupport.createNiceMock(Clusters.class);
-    final Cluster cluster = easyMockSupport.createNiceMock(Cluster.class);
     Config mockKafkaBroker = easyMockSupport.createNiceMock(Config.class);
 
+    reset(clusters, cluster);
     expect(clusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{
       put("normal", cluster);
     }}).once();
     expect(cluster.getDesiredConfigByType("kafka-broker")).andReturn(mockKafkaBroker).atLeastOnce();
     expect(mockKafkaBroker.getProperties()).andReturn(oldProperties).anyTimes();
 
-    Injector injector = easyMockSupport.createNiceMock(Injector.class);
-    expect(injector.getInstance(Gson.class)).andReturn(null).anyTimes();
-    expect(injector.getInstance(MaintenanceStateHelper.class)).andReturn(null).anyTimes();
-    expect(injector.getInstance(KerberosHelper.class)).andReturn(createNiceMock(KerberosHelper.class)).anyTimes();
+    replay(clusters, mockKafkaBroker, cluster);
 
-    replay(injector, clusters, mockKafkaBroker, cluster);
-
-    AmbariManagementControllerImpl controller = createMockBuilder(AmbariManagementControllerImpl.class)
+    AmbariManagementControllerImpl controller = (AmbariManagementControllerImpl)createMockBuilder(AmbariManagementControllerImpl.class)
       .addMockedMethod("createConfiguration")
       .addMockedMethod("getClusters", new Class[] { })
       .addMockedMethod("createConfig")
-      .withConstructor(createNiceMock(ActionManager.class), clusters, injector)
+      .withConstructor(actionManager, clusters, injector)
       .createNiceMock();
 
     Injector injector2 = easyMockSupport.createNiceMock(Injector.class);
@@ -381,7 +410,7 @@ public class UpgradeCatalog250Test {
     expect(injector2.getInstance(AmbariManagementController.class)).andReturn(controller).anyTimes();
     expect(controller.getClusters()).andReturn(clusters).anyTimes();
     expect(controller.createConfig(anyObject(Cluster.class), anyString(), capture(propertiesCapture), anyString(),
-      anyObject(Map.class))).andReturn(createNiceMock(Config.class)).once();
+      anyObject(Map.class))).andReturn(config).once();
 
     replay(controller, injector2);
     new UpgradeCatalog250(injector2).updateKafkaConfigs();
@@ -434,10 +463,7 @@ public class UpgradeCatalog250Test {
 
     EasyMockSupport easyMockSupport = new EasyMockSupport();
 
-    Clusters clusters = easyMockSupport.createNiceMock(Clusters.class);
-    final Cluster cluster = easyMockSupport.createNiceMock(Cluster.class);
-    final Service service = createStrictMock(Service.class);
-
+    reset(clusters, cluster);
     expect(clusters.getClusters()).andReturn(new HashMap<String, Cluster>() {{
       put("normal", cluster);
     }}).once();
@@ -448,18 +474,13 @@ public class UpgradeCatalog250Test {
     expect(cluster.getDesiredConfigByType(configType)).andReturn(mockAtlasConfig).atLeastOnce();
     expect(mockAtlasConfig.getProperties()).andReturn(oldProperties).anyTimes();
 
-    Injector injector = easyMockSupport.createNiceMock(Injector.class);
-    expect(injector.getInstance(Gson.class)).andReturn(null).anyTimes();
-    expect(injector.getInstance(MaintenanceStateHelper.class)).andReturn(null).anyTimes();
-    expect(injector.getInstance(KerberosHelper.class)).andReturn(createNiceMock(KerberosHelper.class)).anyTimes();
-
-    replay(injector, clusters, mockAtlasConfig, cluster);
+    replay(clusters, mockAtlasConfig, cluster);
 
-    AmbariManagementControllerImpl controller = createMockBuilder(AmbariManagementControllerImpl.class)
+    AmbariManagementControllerImpl controller = (AmbariManagementControllerImpl)createMockBuilder(AmbariManagementControllerImpl.class)
       .addMockedMethod("createConfiguration")
       .addMockedMethod("getClusters", new Class[] { })
       .addMockedMethod("createConfig")
-      .withConstructor(createNiceMock(ActionManager.class), clusters, injector)
+      .withConstructor(actionManager, clusters, injector)
       .createNiceMock();
 
     Injector injector2 = easyMockSupport.createNiceMock(Injector.class);
@@ -468,7 +489,7 @@ public class UpgradeCatalog250Test {
     expect(injector2.getInstance(AmbariManagementController.class)).andReturn(controller).anyTimes();
     expect(controller.getClusters()).andReturn(clusters).anyTimes();
     expect(controller.createConfig(anyObject(Cluster.class), anyString(), capture(propertiesCapture), anyString(),
-      anyObject(Map.class))).andReturn(createNiceMock(Config.class)).once();
+      anyObject(Map.class))).andReturn(config).once();
 
     replay(controller, injector2);
     new UpgradeCatalog250(injector2).updateAtlasConfigs();