Repository: ambari
Updated Branches:
  refs/heads/trunk d2e0c42a1 -> dee7317e0


AMBARI-21728. Service and Patch Upgrade Catalog Changes for 2.6 - additional 
fixes (dlysnichenko)


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

Branch: refs/heads/trunk
Commit: dee7317e000879313da9d7a08614331daae57e3a
Parents: d2e0c42
Author: Lisnichenko Dmitro <dlysniche...@hortonworks.com>
Authored: Tue Aug 22 19:26:30 2017 +0300
Committer: Lisnichenko Dmitro <dlysniche...@hortonworks.com>
Committed: Tue Aug 22 19:26:30 2017 +0300

----------------------------------------------------------------------
 .../apache/ambari/server/orm/DBAccessor.java    |  55 +++
 .../ambari/server/orm/DBAccessorImpl.java       | 119 +++++
 .../server/orm/helpers/dbms/DbmsHelper.java     |  27 ++
 .../orm/helpers/dbms/GenericDbmsHelper.java     |  14 +
 .../server/orm/helpers/dbms/H2Helper.java       |  16 +
 .../server/orm/helpers/dbms/MySqlHelper.java    |  16 +
 .../server/orm/helpers/dbms/OracleHelper.java   |  16 +
 .../server/orm/helpers/dbms/PostgresHelper.java |  15 +
 .../server/upgrade/SchemaUpgradeHelper.java     |   1 +
 .../server/upgrade/UpgradeCatalog252.java       |  51 ++
 .../server/upgrade/UpgradeCatalog260.java       | 325 +++++++++++++
 .../server/upgrade/UpgradeCatalog300.java       |  97 +---
 .../ambari/server/orm/DBAccessorImplTest.java   |  88 ++++
 .../server/upgrade/UpgradeCatalog260Test.java   | 468 +++++++++++++++++++
 .../server/upgrade/UpgradeCatalog300Test.java   |  74 ---
 15 files changed, 1212 insertions(+), 170 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/dee7317e/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 ef343d5..549c0fd 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
@@ -367,6 +367,21 @@ public interface DBAccessor {
   void executePreparedUpdate(String query, boolean ignoreFailure, 
Object...arguments) throws SQLException;
 
   /**
+   * Execute select {@code columnName} from {@code tableName}
+   * where {@code columnNames} values = {@code values}
+   *
+   * @param tableName
+   * @param columnName
+   * @param columnNames
+   * @param values
+   * @param ignoreFailure
+   * @return
+   * @throws SQLException
+   */
+  List<Integer> getIntColumnValues(String tableName, String columnName, 
String[] columnNames,
+                                   String[] values, boolean ignoreFailure) 
throws SQLException;
+
+  /**
    * Drop table from schema
    * @param tableName
    * @throws SQLException
@@ -689,6 +704,46 @@ public interface DBAccessor {
   void moveColumnToAnotherTable(String sourceTableName, DBColumnInfo 
sourceColumn, String sourceIDFieldName,
        String targetTableName, DBColumnInfo targetColumn, String 
targetIDFieldName, Object initialValue) throws SQLException;
 
+  /**
+   * Copy column from {@code targetTable} by matching
+   * table keys {@code sourceIDColumnName} and {@code targetIDColumnName}
+   * and condition {@code sourceConditionFieldName} = {@code condition}
+   *
+   * @param sourceTableName          the source table name
+   * @param sourceColumn             the source column name
+   * @param sourceIDFieldName1       the source id key filed name matched with 
{@code targetIDFieldName1}
+   * @param sourceIDFieldName2       the source id key filed name matched with 
{@code targetIDFieldName2}
+   * @param sourceIDFieldName3       the source id key filed name matched with 
{@code targetIDFieldName3}
+   * @param targetTableName          the target table name
+   * @param targetColumn             the target column name
+   * @param targetIDFieldName1       the target id key name matched with 
{@code sourceIDFieldName1}
+   * @param targetIDFieldName2       the target id key name matched with 
{@code sourceIDFieldName2}
+   * @param targetIDFieldName3       the target id key name matched with 
{@code sourceIDFieldName3}
+   * @param sourceConditionFieldName source key column name which should match 
{@code condition}
+   * @param condition                value which should match {@code 
sourceConditionFieldName}
+   * @param initialValue             initial value for null-contained cells
+   * @throws SQLException
+   */
+  void copyColumnToAnotherTable(String sourceTableName, DBColumnInfo 
sourceColumn, String sourceIDFieldName1, String sourceIDFieldName2, String 
sourceIDFieldName3,
+                                String targetTableName, DBColumnInfo 
targetColumn, String targetIDFieldName1, String targetIDFieldName2, String 
targetIDFieldName3,
+                                String sourceConditionFieldName, String 
condition, Object initialValue) throws SQLException;
+
+  /**
+   * Remove all rows from the table
+   *
+   * @param tableName name of the table
+   */
+  void clearTable(String tableName) throws SQLException;
+
+  /**
+   * Reset all rows with {@code value} for {@code columnName} column
+   *
+   * @param tableName  name of the table
+   * @param columnName name of the column name to be update
+   * @param value      data to use for update
+   */
+  void clearTableColumn(String tableName, String columnName, Object value) 
throws SQLException;
+
   enum DbType {
     ORACLE,
     MYSQL,

http://git-wip-us.apache.org/repos/asf/ambari/blob/dee7317e/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 04e4c66..b137705 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
@@ -1400,6 +1400,101 @@ public class DBAccessorImpl implements DBAccessor {
   }
 
   /**
+   * {@inheritDoc}
+   */
+  @Override
+  public void copyColumnToAnotherTable(String sourceTableName, DBColumnInfo 
sourceColumn, String sourceIDFieldName1, String sourceIDFieldName2, String 
sourceIDFieldName3,
+                                       String targetTableName, DBColumnInfo 
targetColumn, String targetIDFieldName1, String targetIDFieldName2, String 
targetIDFieldName3,
+                                       String sourceConditionFieldName, String 
condition, Object initialValue) throws SQLException {
+
+    if (tableHasColumn(sourceTableName, sourceIDFieldName1) &&
+        tableHasColumn(sourceTableName, sourceIDFieldName2) &&
+        tableHasColumn(sourceTableName, sourceIDFieldName3) &&
+        tableHasColumn(sourceTableName, sourceColumn.getName()) &&
+        tableHasColumn(sourceTableName, sourceConditionFieldName) &&
+        tableHasColumn(targetTableName, targetIDFieldName1) &&
+        tableHasColumn(targetTableName, targetIDFieldName2) &&
+        tableHasColumn(targetTableName, targetIDFieldName3)
+        ) {
+
+      final String moveSQL = 
dbmsHelper.getCopyColumnToAnotherTableStatement(sourceTableName, 
sourceColumn.getName(),
+          sourceIDFieldName1, sourceIDFieldName2, sourceIDFieldName3, 
targetTableName, targetColumn.getName(),
+          targetIDFieldName1, targetIDFieldName2, targetIDFieldName3, 
sourceConditionFieldName, condition);
+      final boolean isTargetColumnNullable = targetColumn.isNullable();
+
+      targetColumn.setNullable(true);  // setting column nullable by default 
to move rows with null
+
+      addColumn(targetTableName, targetColumn);
+      executeUpdate(moveSQL, false);
+
+      if (initialValue != null) {
+        String updateSQL = 
dbmsHelper.getColumnUpdateStatementWhereColumnIsNull(convertObjectName(targetTableName),
+            convertObjectName(targetColumn.getName()), 
convertObjectName(targetColumn.getName()));
+
+        executePreparedUpdate(updateSQL, initialValue);
+      }
+
+      if (!isTargetColumnNullable) {
+        setColumnNullable(targetTableName, targetColumn.getName(), false);
+      }
+    }
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public List<Integer> getIntColumnValues(String tableName, String columnName, 
String[] ConditionColumnNames,
+                                          String[] values, boolean 
ignoreFailure) throws SQLException {
+
+    if (!tableHasColumn(tableName, columnName)) {
+      throw new IllegalArgumentException(String.format("%s table does not 
contain %s column", tableName, columnName));
+    }
+    StringBuilder builder = new StringBuilder();
+    builder.append("SELECT ").append(columnName).append(" FROM 
").append(tableName);
+    if (ConditionColumnNames != null && ConditionColumnNames.length > 0) {
+      for (String name : ConditionColumnNames) {
+        if (!tableHasColumn(tableName, name)) {
+          throw new IllegalArgumentException(String.format("%s table does not 
contain %s column", tableName, name));
+        }
+      }
+      if (ConditionColumnNames.length != values.length) {
+        throw new IllegalArgumentException("number of columns should be equal 
to number of values");
+      }
+      builder.append(" WHERE 
").append(ConditionColumnNames[0]).append("='").append(values[0]).append("'");
+      for (int i = 1; i < ConditionColumnNames.length; i++) {
+        builder.append(" AND 
").append(ConditionColumnNames[i]).append("='").append(values[i]).append("'");
+      }
+    }
+
+    List<Integer> result = new ArrayList<>();
+    Statement statement = getConnection().createStatement();
+    ResultSet resultSet = null;
+    String query = builder.toString();
+    try {
+      resultSet = statement.executeQuery(query);
+      if (resultSet != null) {
+        while (resultSet.next()) {
+          result.add(resultSet.getInt(1));
+        }
+      }
+    } catch (SQLException e) {
+      LOG.warn("Unable to execute query: " + query, e);
+      if (!ignoreFailure) {
+        throw e;
+      }
+    } finally {
+      if (resultSet != null) {
+        resultSet.close();
+      }
+      if (statement != null) {
+        statement.close();
+      }
+    }
+    return result;
+  }
+
+  /**
    * Move column data from {@code sourceTableName} to {@code targetTableName} 
using {@code sourceIDFieldName} and
    * {@code targetIDFieldName} keys to match right rows
    *
@@ -1450,4 +1545,28 @@ public class DBAccessorImpl implements DBAccessor {
       dropColumn(sourceTableName, sourceColumn.getName());
     }
   }
+
+  /**
+   * Remove all rows from the table
+   *
+   * @param tableName name of the table
+   */
+  @Override
+  public void clearTable(String tableName) throws SQLException {
+    String sqlQuery = "DELETE FROM " + convertObjectName(tableName);
+    executeQuery(sqlQuery);
+  }
+
+  /**
+   * Reset all rows with {@code value} for {@code columnName} column
+   *
+   * @param tableName  name of the table
+   * @param columnName
+   * @param value      data to use for update
+   */
+  @Override
+  public void clearTableColumn(String tableName, String columnName, Object 
value) throws SQLException {
+    String sqlQuery = String.format("UPDATE %s SET %s = ?", 
convertObjectName(tableName), convertObjectName(columnName));
+    executePreparedUpdate(sqlQuery, value);
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/dee7317e/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 b30d01b..e3129d8 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
@@ -158,6 +158,33 @@ public interface DbmsHelper {
                                               String targetTable, String 
targetColumnName, String targetIDColumnName);
 
   /**
+   * Get's the {@code UPDATE} statement for {@code sourceTable} for copy 
column from {@code targetTable} by matching
+   * table keys {@code sourceIDColumnName} and {@code targetIDColumnName}
+   * and condition {@code sourceConditionFieldName} = {@code condition}
+   *
+   * @param sourceTable              the source table name
+   * @param sourceColumnName         the source column name
+   * @param sourceIDColumnName1      source key id column which would be used 
to math right rows for {@code targetTable}
+   * @param sourceIDColumnName2      source key id column which would be used 
to math right rows for {@code targetTable}
+   * @param sourceIDColumnName3      source key id column which would be used 
to math right rows for {@code targetTable}
+   * @param targetTable              the destination table name
+   * @param targetColumnName         the destination column name
+   * @param targetIDColumnName1      destination key id column name which 
should match {@code sourceIDColumnName1}
+   * @param targetIDColumnName2      destination key id column name which 
should match {@code sourceIDColumnName1}
+   * @param targetIDColumnName3      destination key id column name which 
should match {@code sourceIDColumnName1}
+   * @param sourceConditionFieldName source key column name which should match 
{@code condition}
+   * @param condition                value which should match {@code 
sourceConditionFieldName}
+   * @return
+   */
+  String getCopyColumnToAnotherTableStatement(String sourceTable, String 
sourceColumnName,
+                                              String sourceIDColumnName1, 
String sourceIDColumnName2,
+                                              String sourceIDColumnName3,
+                                              String targetTable, String 
targetColumnName,
+                                              String targetIDColumnName1, 
String targetIDColumnName2,
+                                              String targetIDColumnName3,
+                                              String sourceConditionFieldName, 
String condition);
+
+  /**
    * Gets whether the database platform supports adding contraints after the
    * {@code NULL} constraint. Some database, such as Oracle, don't allow this.
    * Unfortunately, EclipsLink hard codes the order of constraints.

http://git-wip-us.apache.org/repos/asf/ambari/blob/dee7317e/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 e2a1f38..24665c8 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
@@ -86,6 +86,20 @@ public class GenericDbmsHelper implements DbmsHelper {
     throw new UnsupportedOperationException("Column copy is not supported for 
generic DB");
   }
 
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public String getCopyColumnToAnotherTableStatement(String sourceTable, 
String sourceColumnName,
+                                                     String 
sourceIDColumnName1, String sourceIDColumnName2,
+                                                     String 
sourceIDColumnName3,
+                                                     String targetTable, 
String targetColumnName,
+                                                     String 
targetIDColumnName1, String targetIDColumnName2,
+                                                     String 
targetIDColumnName3,
+                                                     String 
sourceConditionFieldName, String condition) {
+    throw new UnsupportedOperationException("Column copy is not supported for 
generic DB");
+  }
+
   public StringBuilder writeAlterTableClause(StringBuilder builder, String 
tableName) {
     builder.append("ALTER TABLE ").append(tableName).append(" ");
     return builder;

http://git-wip-us.apache.org/repos/asf/ambari/blob/dee7317e/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/H2Helper.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/H2Helper.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/H2Helper.java
index 91905e4..93b3bf9 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/H2Helper.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/H2Helper.java
@@ -81,4 +81,20 @@ public class H2Helper extends GenericDbmsHelper {
     return String.format("UPDATE %1$s a SET %3$s = (SELECT b.%4$s FROM %2$s b 
WHERE b.%6$s = a.%5$s LIMIT 1)",
       targetTable, sourceTable, targetColumnName, sourceColumnName, 
targetIDColumnName, sourceIDColumnName);
   }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public String getCopyColumnToAnotherTableStatement(String sourceTable, 
String sourceColumnName,
+                                                     String 
sourceIDColumnName1, String sourceIDColumnName2,
+                                                     String 
sourceIDColumnName3,
+                                                     String targetTable, 
String targetColumnName,
+                                                     String 
targetIDColumnName1, String targetIDColumnName2,
+                                                     String 
targetIDColumnName3,
+                                                     String 
sourceConditionFieldName, String condition) {
+    return String.format("UPDATE %1$s a SET %3$s = (SELECT b.%4$s FROM %2$s b 
WHERE b.%8$s = a.%5$s AND b.%9$s = a.%6$s AND b.%10$s = a.%7$s AND b.%11$s = 
'%12$s'  LIMIT 1)",
+        targetTable, sourceTable, targetColumnName, sourceColumnName, 
targetIDColumnName1, targetIDColumnName2, targetIDColumnName3,
+        sourceIDColumnName1, sourceIDColumnName2, sourceIDColumnName3, 
sourceConditionFieldName, condition);
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/dee7317e/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/MySqlHelper.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/MySqlHelper.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/MySqlHelper.java
index 0daea72..4f8478e 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/MySqlHelper.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/MySqlHelper.java
@@ -105,4 +105,20 @@ public class MySqlHelper extends GenericDbmsHelper {
       targetTable, sourceTable, targetColumnName, sourceColumnName, 
targetIDColumnName, sourceIDColumnName);
   }
 
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public String getCopyColumnToAnotherTableStatement(String sourceTable, 
String sourceColumnName,
+                                                     String 
sourceIDColumnName1, String sourceIDColumnName2,
+                                                     String 
sourceIDColumnName3,
+                                                     String targetTable, 
String targetColumnName,
+                                                     String 
targetIDColumnName1, String targetIDColumnName2,
+                                                     String 
targetIDColumnName3,
+                                                     String 
sourceConditionFieldName, String condition) {
+    return String.format("UPDATE %1$s AS a INNER JOIN %2$s AS b ON a.%5$s = 
b.%8$s AND a.%6$s = b.%9$s AND a.%7$s = b.%10$s AND b.%11$s = '%12$s' SET 
a.%3$s = b.%4$s",
+        targetTable, sourceTable, targetColumnName, sourceColumnName, 
targetIDColumnName1, targetIDColumnName2, targetIDColumnName3,
+        sourceIDColumnName1, sourceIDColumnName2, sourceIDColumnName3, 
sourceConditionFieldName, condition);
+  }
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/dee7317e/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/OracleHelper.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/OracleHelper.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/OracleHelper.java
index 73356d1..fd512c2 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/OracleHelper.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/OracleHelper.java
@@ -91,4 +91,20 @@ public class OracleHelper extends GenericDbmsHelper {
     return String.format("UPDATE %1$s a SET (a.%3$s) = (SELECT b.%4$s FROM 
%2$s b WHERE b.%6$s = a.%5$s and ROWNUM < 2)",
       targetTable, sourceTable, targetColumnName, sourceColumnName, 
targetIDColumnName, sourceIDColumnName);
   }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public String getCopyColumnToAnotherTableStatement(String sourceTable, 
String sourceColumnName,
+                                                     String 
sourceIDColumnName1, String sourceIDColumnName2,
+                                                     String 
sourceIDColumnName3,
+                                                     String targetTable, 
String targetColumnName,
+                                                     String 
targetIDColumnName1, String targetIDColumnName2,
+                                                     String 
targetIDColumnName3,
+                                                     String 
sourceConditionFieldName, String condition) {
+    return String.format("UPDATE %1$s a SET (a.%3$s) = (SELECT b.%4$s FROM 
%2$s b WHERE b.%8$s = a.%5$s AND b.%9$s = a.%6$s AND b.%10$s = a.%7$s AND 
b.%11$s = '%12$s' AND ROWNUM < 2)",
+        targetTable, sourceTable, targetColumnName, sourceColumnName, 
targetIDColumnName1, targetIDColumnName2, targetIDColumnName3,
+        sourceIDColumnName1, sourceIDColumnName2, sourceIDColumnName3, 
sourceConditionFieldName, condition);
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/dee7317e/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/PostgresHelper.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/PostgresHelper.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/PostgresHelper.java
index 37c1184..a173bbd 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/PostgresHelper.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/PostgresHelper.java
@@ -55,6 +55,21 @@ public class PostgresHelper extends GenericDbmsHelper {
       targetTable, sourceTable, targetColumnName, sourceColumnName, 
targetIDColumnName, sourceIDColumnName);
   }
 
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public String getCopyColumnToAnotherTableStatement(String sourceTable, 
String sourceColumnName,
+                                                     String 
sourceIDColumnName1, String sourceIDColumnName2,
+                                                     String 
sourceIDColumnName3,
+                                                     String targetTable, 
String targetColumnName,
+                                                     String 
targetIDColumnName1, String targetIDColumnName2,
+                                                     String 
targetIDColumnName3,
+                                                     String 
sourceConditionFieldName, String condition) {
+    return String.format("UPDATE %1$s AS a SET %3$s = b.%4$s FROM %2$s AS b 
WHERE a.%5$s = b.%8$s AND a.%6$s = b.%9$s AND a.%7$s = b.%10$s AND b.%11$s = 
'%12$s'",
+        targetTable, sourceTable, targetColumnName, sourceColumnName, 
targetIDColumnName1, targetIDColumnName2, targetIDColumnName3,
+        sourceIDColumnName1, sourceIDColumnName2, sourceIDColumnName3, 
sourceConditionFieldName, condition);
+  }
 
   @Override
   public StringBuilder writeSetNullableString(StringBuilder builder,

http://git-wip-us.apache.org/repos/asf/ambari/blob/dee7317e/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
index bcc8328..8812ef5 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
@@ -178,6 +178,7 @@ public class SchemaUpgradeHelper {
         Multibinder.newSetBinder(binder(), UpgradeCatalog.class);
       catalogBinder.addBinding().to(UpgradeCatalog251.class);
       catalogBinder.addBinding().to(UpgradeCatalog252.class);
+      catalogBinder.addBinding().to(UpgradeCatalog260.class);
       catalogBinder.addBinding().to(UpgradeCatalog300.class);
       catalogBinder.addBinding().to(FinalUpgradeCatalog.class);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/dee7317e/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog252.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog252.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog252.java
index 1192c11..b83ba64 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog252.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog252.java
@@ -21,6 +21,7 @@ import java.sql.SQLException;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeSet;
@@ -55,8 +56,22 @@ public class UpgradeCatalog252 extends 
AbstractUpgradeCatalog {
   static final String CLUSTERCONFIG_TABLE = "clusterconfig";
   static final String SERVICE_DELETED_COLUMN = "service_deleted";
 
+  private static final String UPGRADE_TABLE = "upgrade";
+  private static final String UPGRADE_TABLE_FROM_REPO_COLUMN = 
"from_repo_version_id";
+  private static final String UPGRADE_TABLE_TO_REPO_COLUMN = 
"to_repo_version_id";
+  private static final String CLUSTERS_TABLE = "clusters";
+  private static final String SERVICE_COMPONENT_HISTORY_TABLE = 
"servicecomponent_history";
+  private static final String UPGRADE_GROUP_TABLE = "upgrade_group";
+  private static final String UPGRADE_ITEM_TABLE = "upgrade_item";
+  private static final String UPGRADE_ID_COLUMN = "upgrade_id";
+
   private static final String CLUSTER_ENV = "cluster-env";
 
+  private static final String HIVE_ENV = "hive-env";
+  private static final String MARIADB_REDHAT_SUPPORT = 
"mariadb_redhat_support";
+
+  private static final List<String> configTypesToEnsureSelected = 
Arrays.asList("spark2-javaopts-properties");
+
   /**
    * Logger.
    */
@@ -94,6 +109,7 @@ public class UpgradeCatalog252 extends 
AbstractUpgradeCatalog {
   @Override
   protected void executeDDLUpdates() throws AmbariException, SQLException {
     addServiceDeletedColumnToClusterConfigTable();
+    addRepositoryColumnsToUpgradeTable();
   }
 
   /**
@@ -126,6 +142,41 @@ public class UpgradeCatalog252 extends 
AbstractUpgradeCatalog {
   }
 
   /**
+   * Changes the following columns to {@value #UPGRADE_TABLE}:
+   * <ul>
+   * <li>{@value #UPGRADE_TABLE_FROM_REPO_COLUMN}
+   * <li>{@value #UPGRADE_TABLE_TO_REPO_COLUMN}
+   * <li>Removes {@code to_version}
+   * <li>Removes {@code from_version}
+   * </ul>
+   *
+   * @throws SQLException
+   */
+  private void addRepositoryColumnsToUpgradeTable() throws SQLException {
+    dbAccessor.clearTableColumn(CLUSTERS_TABLE, UPGRADE_ID_COLUMN, null);
+    dbAccessor.clearTable(SERVICE_COMPONENT_HISTORY_TABLE);
+    dbAccessor.clearTable(SERVICE_COMPONENT_HISTORY_TABLE);
+    dbAccessor.clearTable(UPGRADE_ITEM_TABLE);
+    dbAccessor.clearTable(UPGRADE_GROUP_TABLE);
+    dbAccessor.clearTable(UPGRADE_TABLE);
+
+    dbAccessor.dropColumn(UPGRADE_TABLE, "to_version");
+    dbAccessor.dropColumn(UPGRADE_TABLE, "from_version");
+
+    dbAccessor.addColumn(UPGRADE_TABLE,
+        new DBColumnInfo(UPGRADE_TABLE_FROM_REPO_COLUMN, Long.class, null, 
null, false));
+
+    dbAccessor.addFKConstraint(UPGRADE_TABLE, "FK_upgrade_from_repo_id",
+        UPGRADE_TABLE_FROM_REPO_COLUMN, "repo_version", "repo_version_id", 
false);
+
+    dbAccessor.addColumn(UPGRADE_TABLE,
+        new DBColumnInfo(UPGRADE_TABLE_TO_REPO_COLUMN, Long.class, null, null, 
false));
+
+    dbAccessor.addFKConstraint(UPGRADE_TABLE, "FK_upgrade_to_repo_id",
+        UPGRADE_TABLE_FROM_REPO_COLUMN, "repo_version", "repo_version_id", 
false);
+  }
+
+  /**
    * Resets the following properties in {@code cluster-env} to their new
    * defaults:
    * <ul>

http://git-wip-us.apache.org/repos/asf/ambari/blob/dee7317e/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
new file mode 100644
index 0000000..ce84cc6
--- /dev/null
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog260.java
@@ -0,0 +1,325 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.upgrade;
+
+import java.sql.SQLException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.orm.DBAccessor;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+
+/**
+ * The {@link org.apache.ambari.server.upgrade.UpgradeCatalog260} upgrades 
Ambari from 2.5.2 to 2.6.0.
+ */
+public class UpgradeCatalog260 extends AbstractUpgradeCatalog {
+
+  public static final String CLUSTER_CONFIG_MAPPING_TABLE = 
"clusterconfigmapping";
+  public static final String CLUSTER_VERSION_TABLE = "cluster_version";
+  public static final String CLUSTER_ID_COLUMN = "cluster_id";
+  public static final String STATE_COLUMN = "state";
+  public static final String CREATE_TIMESTAMP_COLUMN = "create_timestamp";
+  public static final String VERSION_TAG_COLUMN = "version_tag";
+  public static final String TYPE_NAME_COLUMN = "type_name";
+
+  public static final String CLUSTER_CONFIG_TABLE = "clusterconfig";
+  public static final String SELECTED_COLUMN = "selected";
+  public static final String SELECTED_TIMESTAMP_COLUMN = "selected_timestamp";
+
+  public static final String SERVICE_COMPONENT_DESIRED_STATE_TABLE = 
"servicecomponentdesiredstate";
+  public static final String DESIRED_STACK_ID_COLUMN = "desired_stack_id";
+  public static final String DESIRED_VERSION_COLUMN = "desired_version";
+  public static final String DESIRED_REPO_VERSION_ID_COLUMN = 
"desired_repo_version_id";
+  public static final String REPO_STATE_COLUMN = "repo_state";
+  public static final String FK_SCDS_DESIRED_STACK_ID = 
"FK_scds_desired_stack_id";
+  public static final String FK_SCDS_DESIRED_REPO_ID = 
"FK_scds_desired_repo_id";
+
+  public static final String REPO_VERSION_TABLE = "repo_version";
+  public static final String REPO_VERSION_ID_COLUMN = "repo_version_id";
+
+  public static final String HOST_COMPONENT_DESIRED_STATE_TABLE = 
"hostcomponentdesiredstate";
+  public static final String FK_HCDS_DESIRED_STACK_ID = 
"FK_hcds_desired_stack_id";
+
+  public static final String HOST_COMPONENT_STATE_TABLE = "hostcomponentstate";
+  public static final String CURRENT_STACK_ID_COLUMN = "current_stack_id";
+  public static final String FK_HCS_CURRENT_STACK_ID = 
"FK_hcs_current_stack_id";
+
+  public static final String HOST_VERSION_TABLE = "host_version";
+  public static final String UQ_HOST_REPO = "UQ_host_repo";
+  public static final String HOST_ID_COLUMN = "host_id";
+
+  public static final String SERVICE_DESIRED_STATE_TABLE = 
"servicedesiredstate";
+  public static final String FK_SDS_DESIRED_STACK_ID = 
"FK_sds_desired_stack_id";
+  public static final String FK_REPO_VERSION_ID = "FK_repo_version_id";
+
+  public static final String UPGRADE_TABLE = "upgrade";
+  public static final String FROM_REPO_VERSION_ID_COLUMN = 
"from_repo_version_id";
+  public static final String TO_REPO_VERSION_ID_COLUMN = "to_repo_version_id";
+  public static final String ORCHESTRATION_COLUMN = "orchestration";
+  public static final String FK_UPGRADE_FROM_REPO_ID = 
"FK_upgrade_from_repo_id";
+  public static final String FK_UPGRADE_TO_REPO_ID = "FK_upgrade_to_repo_id";
+  public static final String FK_UPGRADE_REPO_VERSION_ID = 
"FK_upgrade_repo_version_id";
+
+  public static final String SERVICE_COMPONENT_HISTORY_TABLE = 
"servicecomponent_history";
+  public static final String UPGRADE_HISTORY_TABLE = "upgrade_history";
+  public static final String ID_COLUMN = "id";
+  public static final String UPGRADE_ID_COLUMN = "upgrade_id";
+  public static final String SERVICE_NAME_COLUMN = "service_name";
+  public static final String COMPONENT_NAME_COLUMN = "component_name";
+  public static final String TARGET_REPO_VERSION_ID_COLUMN = 
"target_repo_version_id";
+  public static final String PK_UPGRADE_HIST = "PK_upgrade_hist";
+  public static final String FK_UPGRADE_HIST_UPGRADE_ID = 
"FK_upgrade_hist_upgrade_id";
+  public static final String FK_UPGRADE_HIST_FROM_REPO = 
"FK_upgrade_hist_from_repo";
+  public static final String FK_UPGRADE_HIST_TARGET_REPO = 
"FK_upgrade_hist_target_repo";
+  public static final String UQ_UPGRADE_HIST = "UQ_upgrade_hist";
+
+  /**
+   * Logger.
+   */
+  private static final Logger LOG = 
LoggerFactory.getLogger(UpgradeCatalog260.class);
+  public static final String STANDARD = "STANDARD";
+  public static final String NOT_REQUIRED = "NOT_REQUIRED";
+  public static final String CURRENT = "CURRENT";
+  public static final String SELECTED = "1";
+
+
+  /**
+   * Constructor.
+   *
+   * @param injector
+   */
+  @Inject
+  public UpgradeCatalog260(Injector injector) {
+    super(injector);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public String getSourceVersion() {
+    return "2.5.2";
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  public String getTargetVersion() {
+    return "2.6.0";
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  protected void executeDDLUpdates() throws AmbariException, SQLException {
+    int currentVersionID = getCurrentVersionID();
+    updateServiceComponentDesiredStateTable(currentVersionID);
+    updateServiceDesiredStateTable(currentVersionID);
+    addSelectedCollumsToClusterconfigTable();
+    updateHostComponentDesiredStateTable();
+    updateHostComponentStateTable();
+    updateUpgradeTable();
+    createUpgradeHistoryTable();
+    dropStaleTables();
+  }
+
+  private void createUpgradeHistoryTable() throws SQLException {
+    List<DBAccessor.DBColumnInfo> columns = new 
ArrayList<DBAccessor.DBColumnInfo>();
+
+    columns.add(new DBAccessor.DBColumnInfo(ID_COLUMN, Long.class, null, null, 
false));
+    columns.add(new DBAccessor.DBColumnInfo(UPGRADE_ID_COLUMN, Long.class, 
null, null, false));
+    columns.add(new DBAccessor.DBColumnInfo(SERVICE_NAME_COLUMN, String.class, 
255, null, false));
+    columns.add(new DBAccessor.DBColumnInfo(COMPONENT_NAME_COLUMN, 
String.class, 255, null, false));
+    columns.add(new DBAccessor.DBColumnInfo(FROM_REPO_VERSION_ID_COLUMN, 
Long.class, null, null, false));
+    columns.add(new DBAccessor.DBColumnInfo(TARGET_REPO_VERSION_ID_COLUMN, 
Long.class, null, null, false));
+    dbAccessor.createTable(UPGRADE_HISTORY_TABLE, columns);
+
+    dbAccessor.addPKConstraint(UPGRADE_HISTORY_TABLE, PK_UPGRADE_HIST, 
ID_COLUMN);
+
+    dbAccessor.addFKConstraint(UPGRADE_HISTORY_TABLE, 
FK_UPGRADE_HIST_UPGRADE_ID, UPGRADE_ID_COLUMN, UPGRADE_TABLE, 
UPGRADE_ID_COLUMN, false);
+    dbAccessor.addFKConstraint(UPGRADE_HISTORY_TABLE, 
FK_UPGRADE_HIST_FROM_REPO, FROM_REPO_VERSION_ID_COLUMN, REPO_VERSION_TABLE, 
REPO_VERSION_ID_COLUMN, false);
+    dbAccessor.addFKConstraint(UPGRADE_HISTORY_TABLE, 
FK_UPGRADE_HIST_TARGET_REPO, TARGET_REPO_VERSION_ID_COLUMN, REPO_VERSION_TABLE, 
REPO_VERSION_ID_COLUMN, false);
+    dbAccessor.addUniqueConstraint(UPGRADE_HISTORY_TABLE, UQ_UPGRADE_HIST, 
UPGRADE_ID_COLUMN, COMPONENT_NAME_COLUMN, SERVICE_NAME_COLUMN);
+
+    addSequence("upgrade_history_id_seq", 0L, false);
+  }
+
+  /**
+   * Updates {@value #UPGRADE_TABLE} table.
+   * clear {@value #UPGRADE_TABLE} table
+   * Removes {@value #FROM_REPO_VERSION_ID_COLUMN} column.
+   * Removes {@value #TO_REPO_VERSION_ID_COLUMN} column.
+   * Adds the {@value #ORCHESTRATION_COLUMN} column.
+   * Adds the {@value #REPO_VERSION_ID_COLUMN} column.
+   * Removes {@value #FK_UPGRADE_FROM_REPO_ID} foreign key.
+   * Removes {@value #FK_UPGRADE_TO_REPO_ID} foreign key.
+   * adds {@value #FK_REPO_VERSION_ID} foreign key.
+   *
+   * @throws java.sql.SQLException
+   */
+  private void updateUpgradeTable() throws SQLException {
+    dbAccessor.clearTable(UPGRADE_TABLE);
+    dbAccessor.dropFKConstraint(UPGRADE_TABLE, FK_UPGRADE_FROM_REPO_ID);
+    dbAccessor.dropFKConstraint(UPGRADE_TABLE, FK_UPGRADE_TO_REPO_ID);
+    dbAccessor.dropColumn(UPGRADE_TABLE, FROM_REPO_VERSION_ID_COLUMN);
+    dbAccessor.dropColumn(UPGRADE_TABLE, TO_REPO_VERSION_ID_COLUMN);
+
+    dbAccessor.addColumn(UPGRADE_TABLE,
+        new DBAccessor.DBColumnInfo(REPO_VERSION_ID_COLUMN, Long.class, null, 
null, false));
+    dbAccessor.addColumn(UPGRADE_TABLE,
+        new DBAccessor.DBColumnInfo(ORCHESTRATION_COLUMN, String.class, 255, 
STANDARD, false));
+
+    dbAccessor.addFKConstraint(UPGRADE_TABLE, FK_UPGRADE_REPO_VERSION_ID, 
REPO_VERSION_ID_COLUMN, REPO_VERSION_TABLE, REPO_VERSION_ID_COLUMN, false);
+  }
+
+  /**
+   * Updates {@value #SERVICE_DESIRED_STATE_TABLE} table.
+   * Removes {@value #DESIRED_STACK_ID_COLUMN} column.
+   * Adds the {@value #DESIRED_REPO_VERSION_ID_COLUMN} column.
+   * Removes {@value #FK_SDS_DESIRED_STACK_ID} foreign key.
+   * adds {@value #FK_REPO_VERSION_ID} foreign key.
+   *
+   * @throws java.sql.SQLException
+   */
+  private void updateServiceDesiredStateTable(int currentRepoID) throws 
SQLException {
+
+    dbAccessor.addColumn(SERVICE_DESIRED_STATE_TABLE,
+        new DBAccessor.DBColumnInfo(DESIRED_REPO_VERSION_ID_COLUMN, 
Long.class, null, currentRepoID, false));
+    dbAccessor.alterColumn(SERVICE_DESIRED_STATE_TABLE,
+        new DBAccessor.DBColumnInfo(DESIRED_REPO_VERSION_ID_COLUMN, 
Long.class, null, null, false));
+
+    dbAccessor.addFKConstraint(SERVICE_DESIRED_STATE_TABLE, 
FK_REPO_VERSION_ID, DESIRED_REPO_VERSION_ID_COLUMN, REPO_VERSION_TABLE, 
REPO_VERSION_ID_COLUMN, false);
+    dbAccessor.dropFKConstraint(SERVICE_DESIRED_STATE_TABLE, 
FK_SDS_DESIRED_STACK_ID);
+    dbAccessor.dropColumn(SERVICE_DESIRED_STATE_TABLE, 
DESIRED_STACK_ID_COLUMN);
+  }
+
+  /**
+   * drop {@value #CLUSTER_CONFIG_MAPPING_TABLE} and {@value 
#CLUSTER_VERSION_TABLE} tables.
+   *
+   * @throws java.sql.SQLException
+   */
+  private void dropStaleTables() throws SQLException {
+    dbAccessor.dropTable(CLUSTER_CONFIG_MAPPING_TABLE);
+    dbAccessor.dropTable(CLUSTER_VERSION_TABLE);
+    dbAccessor.dropTable(SERVICE_COMPONENT_HISTORY_TABLE);
+  }
+
+  /**
+   * Adds the {@value #SELECTED_COLUMN} and {@value 
#SELECTED_TIMESTAMP_COLUMN} columns to the
+   * {@value #CLUSTER_CONFIG_TABLE} table.
+   *
+   * @throws java.sql.SQLException
+   */
+  private void addSelectedCollumsToClusterconfigTable() throws SQLException {
+    DBAccessor.DBColumnInfo selectedColumnInfo = new 
DBAccessor.DBColumnInfo(SELECTED_COLUMN, Short.class, null, 0, false);
+    DBAccessor.DBColumnInfo selectedmappingColumnInfo = new 
DBAccessor.DBColumnInfo(SELECTED_COLUMN, Integer.class, null, 0, false);
+    DBAccessor.DBColumnInfo selectedTimestampColumnInfo = new 
DBAccessor.DBColumnInfo(SELECTED_TIMESTAMP_COLUMN, Long.class, null, 0, false);
+    DBAccessor.DBColumnInfo createTimestampColumnInfo = new 
DBAccessor.DBColumnInfo(CREATE_TIMESTAMP_COLUMN, Long.class, null, null, false);
+    dbAccessor.copyColumnToAnotherTable(CLUSTER_CONFIG_MAPPING_TABLE, 
selectedmappingColumnInfo,
+        CLUSTER_ID_COLUMN, TYPE_NAME_COLUMN, VERSION_TAG_COLUMN, 
CLUSTER_CONFIG_TABLE, selectedColumnInfo,
+        CLUSTER_ID_COLUMN, TYPE_NAME_COLUMN, VERSION_TAG_COLUMN, 
SELECTED_COLUMN, SELECTED, 0);
+
+    dbAccessor.copyColumnToAnotherTable(CLUSTER_CONFIG_MAPPING_TABLE, 
createTimestampColumnInfo,
+        CLUSTER_ID_COLUMN, TYPE_NAME_COLUMN, VERSION_TAG_COLUMN, 
CLUSTER_CONFIG_TABLE, selectedTimestampColumnInfo,
+        CLUSTER_ID_COLUMN, TYPE_NAME_COLUMN, VERSION_TAG_COLUMN, 
SELECTED_COLUMN, SELECTED, 0);
+  }
+
+
+  /**
+   * Updates {@value #SERVICE_COMPONENT_DESIRED_STATE_TABLE} table.
+   * Removes {@value #DESIRED_VERSION_COLUMN},{@value 
#DESIRED_STACK_ID_COLUMN} columns.
+   * Adds the {@value #DESIRED_REPO_VERSION_ID_COLUMN},{@value 
#REPO_STATE_COLUMN} columns.
+   * Removes {@value #FK_SCDS_DESIRED_STACK_ID} foreign key.
+   * adds {@value #FK_SCDS_DESIRED_REPO_ID} foreign key.
+   *
+   * @throws java.sql.SQLException
+   */
+  private void updateServiceComponentDesiredStateTable(int currentRepoID) 
throws SQLException {
+    dbAccessor.addColumn(SERVICE_COMPONENT_DESIRED_STATE_TABLE,
+        new DBAccessor.DBColumnInfo(DESIRED_REPO_VERSION_ID_COLUMN, 
Long.class, null, currentRepoID, false));
+    dbAccessor.alterColumn(SERVICE_COMPONENT_DESIRED_STATE_TABLE,
+        new DBAccessor.DBColumnInfo(DESIRED_REPO_VERSION_ID_COLUMN, 
Long.class, null, null, false));
+
+    dbAccessor.addColumn(SERVICE_COMPONENT_DESIRED_STATE_TABLE,
+        new DBAccessor.DBColumnInfo(REPO_STATE_COLUMN, String.class, 255, 
CURRENT, false));
+    dbAccessor.alterColumn(SERVICE_COMPONENT_DESIRED_STATE_TABLE,
+        new DBAccessor.DBColumnInfo(REPO_STATE_COLUMN, String.class, 255, 
NOT_REQUIRED, false));
+
+    dbAccessor.addFKConstraint(SERVICE_COMPONENT_DESIRED_STATE_TABLE, 
FK_SCDS_DESIRED_REPO_ID, DESIRED_REPO_VERSION_ID_COLUMN, REPO_VERSION_TABLE, 
REPO_VERSION_ID_COLUMN, false);
+
+    dbAccessor.dropFKConstraint(SERVICE_COMPONENT_DESIRED_STATE_TABLE, 
FK_SCDS_DESIRED_STACK_ID);
+    dbAccessor.dropColumn(SERVICE_COMPONENT_DESIRED_STATE_TABLE, 
DESIRED_STACK_ID_COLUMN);
+    dbAccessor.dropColumn(SERVICE_COMPONENT_DESIRED_STATE_TABLE, 
DESIRED_VERSION_COLUMN);
+  }
+
+  /**
+   * Updates {@value #HOST_COMPONENT_DESIRED_STATE_TABLE} table.
+   * Removes {@value #DESIRED_STACK_ID_COLUMN} column.
+   * Removes {@value #FK_HCDS_DESIRED_STACK_ID} foreign key.
+   *
+   * @throws java.sql.SQLException
+   */
+  private void updateHostComponentDesiredStateTable() throws SQLException {
+    dbAccessor.dropFKConstraint(HOST_COMPONENT_DESIRED_STATE_TABLE, 
FK_HCDS_DESIRED_STACK_ID);
+    dbAccessor.dropColumn(HOST_COMPONENT_DESIRED_STATE_TABLE, 
DESIRED_STACK_ID_COLUMN);
+  }
+
+  /**
+   * Updates {@value #HOST_COMPONENT_STATE_TABLE} table.
+   * Removes {@value #CURRENT_STACK_ID_COLUMN} column.
+   * Removes {@value #FK_HCS_CURRENT_STACK_ID} foreign key.
+   *
+   * @throws java.sql.SQLException
+   */
+  private void updateHostComponentStateTable() throws SQLException {
+    dbAccessor.dropFKConstraint(HOST_COMPONENT_STATE_TABLE, 
FK_HCS_CURRENT_STACK_ID);
+    dbAccessor.dropColumn(HOST_COMPONENT_STATE_TABLE, CURRENT_STACK_ID_COLUMN);
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  protected void executePreDMLUpdates() throws AmbariException, SQLException {
+
+  }
+
+  /**
+   * {@inheritDoc}
+   */
+  @Override
+  protected void executeDMLUpdates() throws AmbariException, SQLException {
+    addNewConfigurationsFromXml();
+  }
+
+  public int getCurrentVersionID() throws AmbariException, SQLException {
+    List<Integer> currentVersionList = 
dbAccessor.getIntColumnValues(CLUSTER_VERSION_TABLE, REPO_VERSION_ID_COLUMN,
+        new String[]{STATE_COLUMN}, new String[]{CURRENT}, false);
+    if (currentVersionList.size() != 1) {
+      throw new AmbariException("Can't get current version id");
+    }
+    return currentVersionList.get(0);
+  }
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/dee7317e/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog300.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog300.java
 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog300.java
index 230cd95..9255163 100644
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog300.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog300.java
@@ -18,9 +18,7 @@
 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.Collection;
 import java.util.Collections;
@@ -40,7 +38,6 @@ import org.apache.ambari.server.actionmanager.StageFactory;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.internal.CalculatedStatus;
 import org.apache.ambari.server.orm.DBAccessor;
-import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo;
 import org.apache.ambari.server.orm.dao.DaoUtils;
 import org.apache.ambari.server.orm.dao.RequestDAO;
 import org.apache.ambari.server.orm.entities.RequestEntity;
@@ -48,11 +45,9 @@ import org.apache.ambari.server.orm.entities.StageEntity;
 import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.Config;
-import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.springframework.jdbc.support.JdbcUtils;
 
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
@@ -73,7 +68,6 @@ public class UpgradeCatalog300 extends AbstractUpgradeCatalog 
{
   protected static final String CLUSTER_CONFIG_TABLE = "clusterconfig";
   protected static final String CLUSTER_CONFIG_SELECTED_COLUMN = "selected";
   protected static final String CLUSTER_CONFIG_SELECTED_TIMESTAMP_COLUMN = 
"selected_timestamp";
-  protected static final String CLUSTER_CONFIG_MAPPING_TABLE = 
"clusterconfigmapping";
   protected static final String HOST_ROLE_COMMAND_TABLE = "host_role_command";
   protected static final String HRC_OPS_DISPLAY_NAME_COLUMN = 
"ops_display_name";
   protected static final String COMPONENT_TABLE = 
"servicecomponentdesiredstate";
@@ -117,7 +111,7 @@ public class UpgradeCatalog300 extends 
AbstractUpgradeCatalog {
    */
   @Override
   public String getSourceVersion() {
-    return "2.5.2";
+    return "2.6.0";
   }
 
   /**
@@ -125,9 +119,7 @@ public class UpgradeCatalog300 extends 
AbstractUpgradeCatalog {
    */
   @Override
   protected void executeDDLUpdates() throws AmbariException, SQLException {
-    addServiceComponentColumn();
     updateStageTable();
-    updateClusterConfigurationTable();
     addOpsDisplayNameColumnToHostRoleCommand();
     removeSecurityState();
   }
@@ -146,7 +138,6 @@ public class UpgradeCatalog300 extends 
AbstractUpgradeCatalog {
    */
   @Override
   protected void executePreDMLUpdates() throws AmbariException, SQLException {
-    setSelectedConfigurationsAndRemoveMappingTable();
   }
 
   /**
@@ -181,17 +172,6 @@ public class UpgradeCatalog300 extends 
AbstractUpgradeCatalog {
 
   }
 
-  /**
-   * Updates the {@code servicecomponentdesiredstate} table.
-   *
-   * @throws SQLException
-   */
-  protected void addServiceComponentColumn() throws SQLException {
-    dbAccessor.addColumn(COMPONENT_TABLE,
-        new DBColumnInfo("repo_state", String.class, 255,
-            RepositoryVersionState.NOT_REQUIRED.name(), false));
-  }
-
   protected void setStatusOfStagesAndRequests() {
     executeInTransaction(new Runnable() {
       @Override
@@ -231,81 +211,6 @@ public class UpgradeCatalog300 extends 
AbstractUpgradeCatalog {
   }
 
   /**
-   * Performs the following operations on {@code clusterconfig}:
-   * <ul>
-   * <li>Adds the {@link #CLUSTER_CONFIG_SELECTED_COLUMN} to
-   * {@link #CLUSTER_CONFIG_TABLE}.
-   * <li>Adds the {@link #CLUSTER_CONFIG_SELECTED_TIMESTAMP_COLUMN} to
-   * {@link #CLUSTER_CONFIG_TABLE}.
-   * </ul>
-   */
-  protected void updateClusterConfigurationTable() throws SQLException {
-    dbAccessor.addColumn(CLUSTER_CONFIG_TABLE,
-        new DBAccessor.DBColumnInfo(CLUSTER_CONFIG_SELECTED_COLUMN, 
Short.class, null, 0, false));
-
-    dbAccessor.addColumn(CLUSTER_CONFIG_TABLE,
-        new DBAccessor.DBColumnInfo(CLUSTER_CONFIG_SELECTED_TIMESTAMP_COLUMN, 
Long.class, null, 0,
-            false));
-  }
-
-  /**
-   * Performs the following operations on {@code clusterconfig} and
-   * {@code clusterconfigmapping}:
-   * <ul>
-   * <li>Sets both selected columns to the current config by querying
-   * {@link #CLUSTER_CONFIG_MAPPING_TABLE}.
-   * <li>Removes {@link #CLUSTER_CONFIG_MAPPING_TABLE}.
-   * </ul>
-   */
-  protected void setSelectedConfigurationsAndRemoveMappingTable() throws 
SQLException {
-    // update the new selected columns
-    executeInTransaction(new Runnable() {
-      /**
-       * {@inheritDoc}
-       */
-      @Override
-      public void run() {
-        String selectSQL = String.format(
-            "SELECT cluster_id, type_name, version_tag FROM %s WHERE selected 
= 1 ORDER BY cluster_id ASC, type_name ASC, version_tag ASC",
-            CLUSTER_CONFIG_MAPPING_TABLE);
-
-        Statement statement = null;
-        ResultSet resultSet = null;
-
-        long now = System.currentTimeMillis();
-
-        try {
-          statement = dbAccessor.getConnection().createStatement();
-          resultSet = statement.executeQuery(selectSQL);
-
-          while (resultSet.next()) {
-            final Long clusterId = resultSet.getLong("cluster_id");
-            final String typeName = resultSet.getString("type_name");
-            final String versionTag = resultSet.getString("version_tag");
-
-            // inefficient since this can be done with a single nested SELECT,
-            // but this way we can log what's happening which is more useful
-            String updateSQL = String.format(
-                "UPDATE %s SET selected = 1, selected_timestamp = %d WHERE 
cluster_id = %d AND type_name = '%s' AND version_tag = '%s'",
-                CLUSTER_CONFIG_TABLE, now, clusterId, typeName, versionTag);
-
-            dbAccessor.executeQuery(updateSQL);
-          }
-        } catch (SQLException sqlException) {
-          throw new RuntimeException(sqlException);
-        } finally {
-          JdbcUtils.closeResultSet(resultSet);
-          JdbcUtils.closeStatement(statement);
-        }
-      }
-    });
-
-    // if the above execution and committed the transaction, then we can remove
-    // the cluster configuration mapping table
-    dbAccessor.dropTable(CLUSTER_CONFIG_MAPPING_TABLE);
-  }
-
-  /**
    * Adds the {@value #HRC_OPS_DISPLAY_NAME_COLUMN} column to the
    * {@value #HOST_ROLE_COMMAND_TABLE} table.
    *

http://git-wip-us.apache.org/repos/asf/ambari/blob/dee7317e/ambari-server/src/test/java/org/apache/ambari/server/orm/DBAccessorImplTest.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/orm/DBAccessorImplTest.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/orm/DBAccessorImplTest.java
index b4ffbf1..29f9d91 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/orm/DBAccessorImplTest.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/orm/DBAccessorImplTest.java
@@ -640,6 +640,94 @@ public class DBAccessorImplTest {
    }
 
   @Test
+  public void testCopyColumnToAnotherTable() throws Exception {
+    DBAccessorImpl dbAccessor = injector.getInstance(DBAccessorImpl.class);
+    String sourceTableName = getFreeTableName();
+    String targetTableName = getFreeTableName();
+    int testRowAmount = 10;
+
+    createMyTable(sourceTableName, "col1", "col2", "col3", "col4", "col5");
+    createMyTable(targetTableName, "col1", "col2", "col3");
+
+    for (Integer i = 0; i < testRowAmount; i++) {
+      dbAccessor.insertRow(sourceTableName,
+          new String[]{"id", "col1", "col2", "col3", "col4", "col5"},
+          new String[]{i.toString(), String.format("'1,%s'", i), 
String.format("'2,%s'", i * 2), String.format("'3,%s'", i * 3), 
String.format("'4,%s'", i * 4), String.format("'%s'", (i * 5) % 2)}, false);
+
+      dbAccessor.insertRow(targetTableName,
+          new String[]{"id", "col1", "col2", "col3"},
+          new String[]{i.toString(), String.format("'1,%s'", i), 
String.format("'2,%s'", i * 2), String.format("'3,%s'", i * 3)}, false);
+    }
+
+    DBColumnInfo sourceColumn = new DBColumnInfo("col4", String.class, null, 
null, false);
+    DBColumnInfo targetColumn = new DBColumnInfo("col4", String.class, null, 
null, false);
+
+    dbAccessor.copyColumnToAnotherTable(sourceTableName, sourceColumn, "id", 
"col1", "col2",
+        targetTableName, targetColumn, "id", "col1", "col2", "col5", "0", 
"initial");
+
+    Statement statement = dbAccessor.getConnection().createStatement();
+    ResultSet resultSet = statement.executeQuery("SELECT col4 FROM " + 
targetTableName + " ORDER BY id");
+
+    assertNotNull(resultSet);
+
+    List<String> response = new LinkedList<>();
+
+    while (resultSet.next()) {
+      response.add(resultSet.getString(1));
+    }
+
+    assertEquals(testRowAmount, response.toArray().length);
+    for (String row : response) {
+      System.out.println(row);
+    }
+
+
+    int i = 0;
+    for (String row : response) {
+      if (i % 2 == 0) {
+        assertEquals(String.format("4,%s", i * 4), row);
+      } else {
+        assertEquals("initial", row);
+      }
+      i++;
+    }
+
+  }
+
+  @Test
+  public void testGetIntColumnValues() throws Exception {
+    DBAccessorImpl dbAccessor = injector.getInstance(DBAccessorImpl.class);
+    String sourceTableName = getFreeTableName();
+    int testRowAmount = 10;
+
+    createMyTable(sourceTableName, "col1", "col2", "col3", "col4", "col5");
+
+    for (Integer i = 0; i < testRowAmount; i++) {
+      dbAccessor.insertRow(sourceTableName,
+          new String[]{"id", "col1", "col2", "col3", "col4", "col5"},
+          new String[]{i.toString(), String.format("'1,%s'", i), 
String.format("'2,%s'", i * 2), String.format("'3,%s'", i * 3), 
String.format("'4,%s'", i * 4), String.format("'%s'", (i * 5) % 2)}, false);
+    }
+
+    List<Integer> idList = dbAccessor.getIntColumnValues(sourceTableName, "id",
+        new String[]{"col1", "col5"}, new String[]{"1,0", "0"}, false);
+
+    assertEquals(idList.size(), 1);
+    assertEquals(idList.get(0), Integer.valueOf(0));
+
+    idList = dbAccessor.getIntColumnValues(sourceTableName, "id",
+        new String[]{"col5"}, new String[]{"0"}, false);
+
+    assertEquals(idList.size(), 5);
+
+    int i = 0;
+    for (Integer id : idList) {
+      assertEquals(id, Integer.valueOf(i * 2));
+      i++;
+    }
+
+  }
+
+  @Test
   public void testMoveNonexistentColumnIsNoop() throws Exception {
     DBAccessorImpl dbAccessor = injector.getInstance(DBAccessorImpl.class);
     String sourceTableName = getFreeTableName();

http://git-wip-us.apache.org/repos/asf/ambari/blob/dee7317e/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
new file mode 100644
index 0000000..44b5d91
--- /dev/null
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog260Test.java
@@ -0,0 +1,468 @@
+/*
+ * 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.upgrade;
+
+import static org.easymock.EasyMock.anyObject;
+import static org.easymock.EasyMock.capture;
+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 java.sql.Connection;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.persistence.EntityManager;
+
+import org.apache.ambari.server.actionmanager.ActionManager;
+import org.apache.ambari.server.configuration.Configuration;
+import org.apache.ambari.server.controller.KerberosHelper;
+import org.apache.ambari.server.controller.MaintenanceStateHelper;
+import org.apache.ambari.server.orm.DBAccessor;
+import org.apache.ambari.server.orm.DBAccessor.DBColumnInfo;
+import org.apache.ambari.server.state.Cluster;
+import org.apache.ambari.server.state.Clusters;
+import org.apache.ambari.server.state.Config;
+import org.apache.ambari.server.state.Service;
+import org.apache.ambari.server.state.stack.OsFamily;
+import org.easymock.Capture;
+import org.easymock.EasyMockRunner;
+import org.easymock.Mock;
+import org.easymock.MockType;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+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;
+
+/**
+ * {@link UpgradeCatalog260} unit tests.
+ */
+@RunWith(EasyMockRunner.class)
+public class UpgradeCatalog260Test {
+
+  //  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, injector);
+
+    expect(entityManagerProvider.get()).andReturn(entityManager).anyTimes();
+
+    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
+  public void tearDown() {
+  }
+
+  @Test
+  public void testExecuteDDLUpdates() throws Exception {
+
+    List<Integer> current = new ArrayList<Integer>();
+    current.add(1);
+
+    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();
+
+
+    Capture<String[]> scdcaptureKey = newCapture();
+    Capture<String[]> scdcaptureValue = newCapture();
+    expectGetCurrentVersionID(current, scdcaptureKey, scdcaptureValue);
+
+    Capture<DBColumnInfo> scdstadd1 = newCapture();
+    Capture<DBColumnInfo> scdstalter1 = newCapture();
+    Capture<DBColumnInfo> scdstadd2 = newCapture();
+    Capture<DBColumnInfo> scdstalter2 = newCapture();
+    expectUpdateServiceComponentDesiredStateTable(scdstadd1, scdstalter1, 
scdstadd2, scdstalter2);
+
+    Capture<DBColumnInfo> sdstadd = newCapture();
+    Capture<DBColumnInfo> sdstalter = newCapture();
+    expectUpdateServiceDesiredStateTable(sdstadd, sdstalter);
+
+    Capture<DBColumnInfo> selectedColumnInfo = newCapture();
+    Capture<DBColumnInfo> selectedmappingColumnInfo = newCapture();
+    Capture<DBColumnInfo> selectedTimestampColumnInfo = newCapture();
+    Capture<DBColumnInfo> createTimestampColumnInfo = newCapture();
+    expectAddSelectedCollumsToClusterconfigTable(selectedColumnInfo, 
selectedmappingColumnInfo, selectedTimestampColumnInfo, 
createTimestampColumnInfo);
+
+    expectUpdateHostComponentDesiredStateTable();
+    expectUpdateHostComponentStateTable();
+
+    Capture<DBColumnInfo> rvid = newCapture();
+    Capture<DBColumnInfo> orchestration = newCapture();
+    expectUpdateUpgradeTable(rvid, orchestration);
+
+    Capture<List<DBAccessor.DBColumnInfo>> columns = newCapture();
+    expectCreateUpgradeHistoryTable(columns);
+
+    expectDropStaleTables();
+
+    replay(dbAccessor, configuration, connection, statement, resultSet);
+
+    Module module = new Module() {
+      @Override
+      public void configure(Binder binder) {
+        binder.bind(DBAccessor.class).toInstance(dbAccessor);
+        binder.bind(OsFamily.class).toInstance(osFamily);
+        binder.bind(EntityManager.class).toInstance(entityManager);
+        binder.bind(Configuration.class).toInstance(configuration);
+      }
+    };
+
+    Injector injector = Guice.createInjector(module);
+    UpgradeCatalog260 upgradeCatalog260 = 
injector.getInstance(UpgradeCatalog260.class);
+    upgradeCatalog260.executeDDLUpdates();
+
+    verify(dbAccessor);
+
+    verifyGetCurrentVersionID(scdcaptureKey, scdcaptureValue);
+    verifyUpdateServiceComponentDesiredStateTable(scdstadd1, scdstalter1, 
scdstadd2, scdstalter2);
+    verifyUpdateServiceDesiredStateTable(sdstadd, sdstalter);
+    verifyAddSelectedCollumsToClusterconfigTable(selectedColumnInfo, 
selectedmappingColumnInfo, selectedTimestampColumnInfo, 
createTimestampColumnInfo);
+    verifyUpdateUpgradeTable(rvid, orchestration);
+    verifyCreateUpgradeHistoryTable(columns);
+
+  }
+
+  public void expectDropStaleTables() throws SQLException {
+    dbAccessor.dropTable(eq(UpgradeCatalog260.CLUSTER_CONFIG_MAPPING_TABLE));
+    expectLastCall().once();
+    dbAccessor.dropTable(eq(UpgradeCatalog260.CLUSTER_VERSION_TABLE));
+    expectLastCall().once();
+    
dbAccessor.dropTable(eq(UpgradeCatalog260.SERVICE_COMPONENT_HISTORY_TABLE));
+    expectLastCall().once();
+  }
+
+  public void verifyCreateUpgradeHistoryTable(Capture<List<DBColumnInfo>> 
columns) {
+    List<DBColumnInfo> columnsValue = columns.getValue();
+    Assert.assertEquals(columnsValue.size(), 6);
+
+    DBColumnInfo id = columnsValue.get(0);
+    Assert.assertEquals(UpgradeCatalog260.ID_COLUMN, id.getName());
+    Assert.assertEquals(Long.class, id.getType());
+    Assert.assertEquals(null, id.getLength());
+    Assert.assertEquals(null, id.getDefaultValue());
+    Assert.assertEquals(false, id.isNullable());
+
+    DBColumnInfo upgradeId = columnsValue.get(1);
+    Assert.assertEquals(UpgradeCatalog260.UPGRADE_ID_COLUMN, 
upgradeId.getName());
+    Assert.assertEquals(Long.class, upgradeId.getType());
+    Assert.assertEquals(null, upgradeId.getLength());
+    Assert.assertEquals(null, upgradeId.getDefaultValue());
+    Assert.assertEquals(false, upgradeId.isNullable());
+
+    DBColumnInfo serviceName = columnsValue.get(2);
+    Assert.assertEquals(UpgradeCatalog260.SERVICE_NAME_COLUMN, 
serviceName.getName());
+    Assert.assertEquals(String.class, serviceName.getType());
+    Assert.assertEquals(Integer.valueOf(255), serviceName.getLength());
+    Assert.assertEquals(null, serviceName.getDefaultValue());
+    Assert.assertEquals(false, serviceName.isNullable());
+
+    DBColumnInfo componentName = columnsValue.get(3);
+    Assert.assertEquals(UpgradeCatalog260.COMPONENT_NAME_COLUMN, 
componentName.getName());
+    Assert.assertEquals(String.class, componentName.getType());
+    Assert.assertEquals(Integer.valueOf(255), componentName.getLength());
+    Assert.assertEquals(null, componentName.getDefaultValue());
+    Assert.assertEquals(false, componentName.isNullable());
+
+    DBColumnInfo fromRepoID = columnsValue.get(4);
+    Assert.assertEquals(UpgradeCatalog260.FROM_REPO_VERSION_ID_COLUMN, 
fromRepoID.getName());
+    Assert.assertEquals(Long.class, fromRepoID.getType());
+    Assert.assertEquals(null, fromRepoID.getLength());
+    Assert.assertEquals(null, fromRepoID.getDefaultValue());
+    Assert.assertEquals(false, fromRepoID.isNullable());
+
+    DBColumnInfo targetRepoID = columnsValue.get(5);
+    Assert.assertEquals(UpgradeCatalog260.TARGET_REPO_VERSION_ID_COLUMN, 
targetRepoID.getName());
+    Assert.assertEquals(Long.class, targetRepoID.getType());
+    Assert.assertEquals(null, targetRepoID.getLength());
+    Assert.assertEquals(null, targetRepoID.getDefaultValue());
+    Assert.assertEquals(false, targetRepoID.isNullable());
+  }
+
+  public void expectCreateUpgradeHistoryTable(Capture<List<DBColumnInfo>> 
columns) throws SQLException {
+    dbAccessor.createTable(eq(UpgradeCatalog260.UPGRADE_HISTORY_TABLE), 
capture(columns));
+    expectLastCall().once();
+
+    dbAccessor.addPKConstraint(eq(UpgradeCatalog260.UPGRADE_HISTORY_TABLE), 
eq(UpgradeCatalog260.PK_UPGRADE_HIST), eq(UpgradeCatalog260.ID_COLUMN));
+    expectLastCall().once();
+
+    dbAccessor.addFKConstraint(eq(UpgradeCatalog260.UPGRADE_HISTORY_TABLE), 
eq(UpgradeCatalog260.FK_UPGRADE_HIST_UPGRADE_ID), 
eq(UpgradeCatalog260.UPGRADE_ID_COLUMN), eq(UpgradeCatalog260.UPGRADE_TABLE), 
eq(UpgradeCatalog260.UPGRADE_ID_COLUMN), eq(false));
+    expectLastCall().once();
+    dbAccessor.addFKConstraint(eq(UpgradeCatalog260.UPGRADE_HISTORY_TABLE), 
eq(UpgradeCatalog260.FK_UPGRADE_HIST_FROM_REPO), 
eq(UpgradeCatalog260.FROM_REPO_VERSION_ID_COLUMN), 
eq(UpgradeCatalog260.REPO_VERSION_TABLE), 
eq(UpgradeCatalog260.REPO_VERSION_ID_COLUMN), eq(false));
+    expectLastCall().once();
+    dbAccessor.addFKConstraint(eq(UpgradeCatalog260.UPGRADE_HISTORY_TABLE), 
eq(UpgradeCatalog260.FK_UPGRADE_HIST_TARGET_REPO), 
eq(UpgradeCatalog260.TARGET_REPO_VERSION_ID_COLUMN), 
eq(UpgradeCatalog260.REPO_VERSION_TABLE), 
eq(UpgradeCatalog260.REPO_VERSION_ID_COLUMN), eq(false));
+    expectLastCall().once();
+    
dbAccessor.addUniqueConstraint(eq(UpgradeCatalog260.UPGRADE_HISTORY_TABLE), 
eq(UpgradeCatalog260.UQ_UPGRADE_HIST), eq(UpgradeCatalog260.UPGRADE_ID_COLUMN), 
eq(UpgradeCatalog260.COMPONENT_NAME_COLUMN), 
eq(UpgradeCatalog260.SERVICE_NAME_COLUMN));
+    expectLastCall().once();
+  }
+
+  public void verifyUpdateUpgradeTable(Capture<DBColumnInfo> rvid, 
Capture<DBColumnInfo> orchestration) {
+    DBColumnInfo rvidValue = rvid.getValue();
+    Assert.assertEquals(UpgradeCatalog260.REPO_VERSION_ID_COLUMN, 
rvidValue.getName());
+    Assert.assertEquals(Long.class, rvidValue.getType());
+    Assert.assertEquals(null, rvidValue.getLength());
+    Assert.assertEquals(null, rvidValue.getDefaultValue());
+    Assert.assertEquals(false, rvidValue.isNullable());
+
+    DBColumnInfo orchestrationValue = orchestration.getValue();
+    Assert.assertEquals(UpgradeCatalog260.ORCHESTRATION_COLUMN, 
orchestrationValue.getName());
+    Assert.assertEquals(String.class, orchestrationValue.getType());
+    Assert.assertEquals(Integer.valueOf(255), orchestrationValue.getLength());
+    Assert.assertEquals(UpgradeCatalog260.STANDARD, 
orchestrationValue.getDefaultValue());
+    Assert.assertEquals(false, orchestrationValue.isNullable());
+  }
+
+  public void expectUpdateUpgradeTable(Capture<DBColumnInfo> rvid, 
Capture<DBColumnInfo> orchestration) throws SQLException {
+    dbAccessor.clearTable(eq(UpgradeCatalog260.UPGRADE_TABLE));
+    expectLastCall().once();
+    dbAccessor.dropFKConstraint(eq(UpgradeCatalog260.UPGRADE_TABLE), 
eq(UpgradeCatalog260.FK_UPGRADE_FROM_REPO_ID));
+    expectLastCall().once();
+    dbAccessor.dropFKConstraint(eq(UpgradeCatalog260.UPGRADE_TABLE), 
eq(UpgradeCatalog260.FK_UPGRADE_TO_REPO_ID));
+    expectLastCall().once();
+    dbAccessor.dropColumn(eq(UpgradeCatalog260.UPGRADE_TABLE), 
eq(UpgradeCatalog260.FROM_REPO_VERSION_ID_COLUMN));
+    expectLastCall().once();
+    dbAccessor.dropColumn(eq(UpgradeCatalog260.UPGRADE_TABLE), 
eq(UpgradeCatalog260.TO_REPO_VERSION_ID_COLUMN));
+    expectLastCall().once();
+
+    dbAccessor.addColumn(eq(UpgradeCatalog260.UPGRADE_TABLE), capture(rvid));
+    expectLastCall().once();
+    dbAccessor.addColumn(eq(UpgradeCatalog260.UPGRADE_TABLE), 
capture(orchestration));
+    expectLastCall().once();
+
+    dbAccessor.addFKConstraint(eq(UpgradeCatalog260.UPGRADE_TABLE), 
eq(UpgradeCatalog260.FK_UPGRADE_REPO_VERSION_ID), 
eq(UpgradeCatalog260.REPO_VERSION_ID_COLUMN), 
eq(UpgradeCatalog260.REPO_VERSION_TABLE), 
eq(UpgradeCatalog260.REPO_VERSION_ID_COLUMN), eq(false));
+    expectLastCall().once();
+  }
+
+  public void expectUpdateHostComponentStateTable() throws SQLException {
+    
dbAccessor.dropFKConstraint(eq(UpgradeCatalog260.HOST_COMPONENT_STATE_TABLE), 
eq(UpgradeCatalog260.FK_HCS_CURRENT_STACK_ID));
+    expectLastCall().once();
+    dbAccessor.dropColumn(eq(UpgradeCatalog260.HOST_COMPONENT_STATE_TABLE), 
eq(UpgradeCatalog260.CURRENT_STACK_ID_COLUMN));
+    expectLastCall().once();
+  }
+
+  public void expectUpdateHostComponentDesiredStateTable() throws SQLException 
{
+    
dbAccessor.dropFKConstraint(eq(UpgradeCatalog260.HOST_COMPONENT_DESIRED_STATE_TABLE),
 eq(UpgradeCatalog260.FK_HCDS_DESIRED_STACK_ID));
+    expectLastCall().once();
+    
dbAccessor.dropColumn(eq(UpgradeCatalog260.HOST_COMPONENT_DESIRED_STATE_TABLE), 
eq(UpgradeCatalog260.DESIRED_STACK_ID_COLUMN));
+    expectLastCall().once();
+  }
+
+  public void 
verifyAddSelectedCollumsToClusterconfigTable(Capture<DBColumnInfo> 
selectedColumnInfo, Capture<DBColumnInfo> selectedmappingColumnInfo, 
Capture<DBColumnInfo> selectedTimestampColumnInfo, Capture<DBColumnInfo> 
createTimestampColumnInfo) {
+    DBColumnInfo selectedColumnInfoValue = selectedColumnInfo.getValue();
+    Assert.assertEquals(UpgradeCatalog260.SELECTED_COLUMN, 
selectedColumnInfoValue.getName());
+    Assert.assertEquals(Short.class, selectedColumnInfoValue.getType());
+    Assert.assertEquals(null, selectedColumnInfoValue.getLength());
+    Assert.assertEquals(0, selectedColumnInfoValue.getDefaultValue());
+    Assert.assertEquals(false, selectedColumnInfoValue.isNullable());
+
+    DBColumnInfo selectedmappingColumnInfoValue = 
selectedmappingColumnInfo.getValue();
+    Assert.assertEquals(UpgradeCatalog260.SELECTED_COLUMN, 
selectedmappingColumnInfoValue.getName());
+    Assert.assertEquals(Integer.class, 
selectedmappingColumnInfoValue.getType());
+    Assert.assertEquals(null, selectedmappingColumnInfoValue.getLength());
+    Assert.assertEquals(0, selectedmappingColumnInfoValue.getDefaultValue());
+    Assert.assertEquals(false, selectedmappingColumnInfoValue.isNullable());
+
+    DBColumnInfo selectedTimestampColumnInfoValue = 
selectedTimestampColumnInfo.getValue();
+    Assert.assertEquals(UpgradeCatalog260.SELECTED_TIMESTAMP_COLUMN, 
selectedTimestampColumnInfoValue.getName());
+    Assert.assertEquals(Long.class, 
selectedTimestampColumnInfoValue.getType());
+    Assert.assertEquals(null, selectedTimestampColumnInfoValue.getLength());
+    Assert.assertEquals(0, selectedTimestampColumnInfoValue.getDefaultValue());
+    Assert.assertEquals(false, selectedTimestampColumnInfoValue.isNullable());
+
+    DBColumnInfo createTimestampColumnInfoValue = 
createTimestampColumnInfo.getValue();
+    Assert.assertEquals(UpgradeCatalog260.CREATE_TIMESTAMP_COLUMN, 
createTimestampColumnInfoValue.getName());
+    Assert.assertEquals(Long.class, createTimestampColumnInfoValue.getType());
+    Assert.assertEquals(null, createTimestampColumnInfoValue.getLength());
+    Assert.assertEquals(null, 
createTimestampColumnInfoValue.getDefaultValue());
+    Assert.assertEquals(false, createTimestampColumnInfoValue.isNullable());
+  }
+
+  public void 
expectAddSelectedCollumsToClusterconfigTable(Capture<DBColumnInfo> 
selectedColumnInfo, Capture<DBColumnInfo> selectedmappingColumnInfo, 
Capture<DBColumnInfo> selectedTimestampColumnInfo, Capture<DBColumnInfo> 
createTimestampColumnInfo) throws SQLException {
+    
dbAccessor.copyColumnToAnotherTable(eq(UpgradeCatalog260.CLUSTER_CONFIG_MAPPING_TABLE),
 capture(selectedmappingColumnInfo),
+        eq(UpgradeCatalog260.CLUSTER_ID_COLUMN), 
eq(UpgradeCatalog260.TYPE_NAME_COLUMN), 
eq(UpgradeCatalog260.VERSION_TAG_COLUMN), 
eq(UpgradeCatalog260.CLUSTER_CONFIG_TABLE), capture(selectedColumnInfo),
+        eq(UpgradeCatalog260.CLUSTER_ID_COLUMN), 
eq(UpgradeCatalog260.TYPE_NAME_COLUMN), 
eq(UpgradeCatalog260.VERSION_TAG_COLUMN), 
eq(UpgradeCatalog260.SELECTED_COLUMN), eq(UpgradeCatalog260.SELECTED), eq(0));
+    expectLastCall().once();
+
+    
dbAccessor.copyColumnToAnotherTable(eq(UpgradeCatalog260.CLUSTER_CONFIG_MAPPING_TABLE),
 capture(createTimestampColumnInfo),
+        eq(UpgradeCatalog260.CLUSTER_ID_COLUMN), 
eq(UpgradeCatalog260.TYPE_NAME_COLUMN), 
eq(UpgradeCatalog260.VERSION_TAG_COLUMN), 
eq(UpgradeCatalog260.CLUSTER_CONFIG_TABLE), 
capture(selectedTimestampColumnInfo),
+        eq(UpgradeCatalog260.CLUSTER_ID_COLUMN), 
eq(UpgradeCatalog260.TYPE_NAME_COLUMN), 
eq(UpgradeCatalog260.VERSION_TAG_COLUMN), 
eq(UpgradeCatalog260.SELECTED_COLUMN), eq(UpgradeCatalog260.SELECTED), eq(0));
+    expectLastCall().once();
+  }
+
+  public void verifyUpdateServiceDesiredStateTable(Capture<DBColumnInfo> 
sdstadd, Capture<DBColumnInfo> sdstalter) {
+    DBColumnInfo sdstaddValue = sdstadd.getValue();
+    Assert.assertEquals(UpgradeCatalog260.DESIRED_REPO_VERSION_ID_COLUMN, 
sdstaddValue.getName());
+    Assert.assertEquals(1, sdstaddValue.getDefaultValue());
+    Assert.assertEquals(Long.class, sdstaddValue.getType());
+    Assert.assertEquals(false, sdstaddValue.isNullable());
+    Assert.assertEquals(null, sdstaddValue.getLength());
+
+    DBColumnInfo sdstalterValue = sdstalter.getValue();
+    Assert.assertEquals(UpgradeCatalog260.DESIRED_REPO_VERSION_ID_COLUMN, 
sdstalterValue.getName());
+    Assert.assertEquals(null, sdstalterValue.getDefaultValue());
+    Assert.assertEquals(Long.class, sdstalterValue.getType());
+    Assert.assertEquals(false, sdstalterValue.isNullable());
+    Assert.assertEquals(null, sdstalterValue.getLength());
+  }
+
+  public void expectUpdateServiceDesiredStateTable(Capture<DBColumnInfo> 
sdstadd, Capture<DBColumnInfo> sdstalter) throws SQLException {
+    dbAccessor.addColumn(eq(UpgradeCatalog260.SERVICE_DESIRED_STATE_TABLE), 
capture(sdstadd));
+    expectLastCall().once();
+    dbAccessor.alterColumn(eq(UpgradeCatalog260.SERVICE_DESIRED_STATE_TABLE), 
capture(sdstalter));
+    expectLastCall().once();
+
+    
dbAccessor.addFKConstraint(eq(UpgradeCatalog260.SERVICE_DESIRED_STATE_TABLE), 
eq(UpgradeCatalog260.FK_REPO_VERSION_ID), 
eq(UpgradeCatalog260.DESIRED_REPO_VERSION_ID_COLUMN), 
eq(UpgradeCatalog260.REPO_VERSION_TABLE), 
eq(UpgradeCatalog260.REPO_VERSION_ID_COLUMN), eq(false));
+    expectLastCall().once();
+    
dbAccessor.dropFKConstraint(eq(UpgradeCatalog260.SERVICE_DESIRED_STATE_TABLE), 
eq(UpgradeCatalog260.FK_SDS_DESIRED_STACK_ID));
+    expectLastCall().once();
+    dbAccessor.dropColumn(eq(UpgradeCatalog260.SERVICE_DESIRED_STATE_TABLE), 
eq(UpgradeCatalog260.DESIRED_STACK_ID_COLUMN));
+    expectLastCall().once();
+  }
+
+  public void 
verifyUpdateServiceComponentDesiredStateTable(Capture<DBColumnInfo> scdstadd1, 
Capture<DBColumnInfo> scdstalter1, Capture<DBColumnInfo> scdstadd2, 
Capture<DBColumnInfo> scdstalter2) {
+    DBColumnInfo scdstaddValue1 = scdstadd1.getValue();
+    Assert.assertEquals(UpgradeCatalog260.DESIRED_REPO_VERSION_ID_COLUMN, 
scdstaddValue1.getName());
+    Assert.assertEquals(1, scdstaddValue1.getDefaultValue());
+    Assert.assertEquals(Long.class, scdstaddValue1.getType());
+    Assert.assertEquals(false, scdstaddValue1.isNullable());
+
+    DBColumnInfo scdstalterValue1 = scdstalter1.getValue();
+    Assert.assertEquals(UpgradeCatalog260.DESIRED_REPO_VERSION_ID_COLUMN, 
scdstalterValue1.getName());
+    Assert.assertEquals(null, scdstalterValue1.getDefaultValue());
+    Assert.assertEquals(Long.class, scdstalterValue1.getType());
+    Assert.assertEquals(false, scdstalterValue1.isNullable());
+
+    DBColumnInfo scdstaddValue2 = scdstadd2.getValue();
+    Assert.assertEquals(UpgradeCatalog260.REPO_STATE_COLUMN, 
scdstaddValue2.getName());
+    Assert.assertEquals(UpgradeCatalog260.CURRENT, 
scdstaddValue2.getDefaultValue());
+    Assert.assertEquals(String.class, scdstaddValue2.getType());
+    Assert.assertEquals(false, scdstaddValue2.isNullable());
+    Assert.assertEquals(Integer.valueOf(255), scdstaddValue2.getLength());
+
+    DBColumnInfo scdstalterValue2 = scdstalter2.getValue();
+    Assert.assertEquals(UpgradeCatalog260.REPO_STATE_COLUMN, 
scdstalterValue2.getName());
+    Assert.assertEquals(UpgradeCatalog260.NOT_REQUIRED, 
scdstalterValue2.getDefaultValue());
+    Assert.assertEquals(String.class, scdstalterValue2.getType());
+    Assert.assertEquals(false, scdstalterValue2.isNullable());
+    Assert.assertEquals(Integer.valueOf(255), scdstaddValue2.getLength());
+  }
+
+  public void verifyGetCurrentVersionID(Capture<String[]> scdcaptureKey, 
Capture<String[]> scdcaptureValue) {
+    Assert.assertTrue(Arrays.equals(scdcaptureKey.getValue(), new 
String[]{UpgradeCatalog260.STATE_COLUMN}));
+    Assert.assertTrue(Arrays.equals(scdcaptureValue.getValue(), new 
String[]{UpgradeCatalog260.CURRENT}));
+  }
+
+  public void 
expectUpdateServiceComponentDesiredStateTable(Capture<DBColumnInfo> scdstadd1, 
Capture<DBColumnInfo> scdstalter1, Capture<DBColumnInfo> scdstadd2, 
Capture<DBColumnInfo> scdstalter2) throws SQLException {
+    
dbAccessor.addColumn(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE),
 capture(scdstadd1));
+    expectLastCall().once();
+
+    
dbAccessor.alterColumn(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE),
 capture(scdstalter1));
+    expectLastCall().once();
+
+    
dbAccessor.addColumn(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE),
 capture(scdstadd2));
+    expectLastCall().once();
+
+    
dbAccessor.alterColumn(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE),
 capture(scdstalter2));
+    expectLastCall().once();
+
+    
dbAccessor.addFKConstraint(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE),
 eq(UpgradeCatalog260.FK_SCDS_DESIRED_REPO_ID), 
eq(UpgradeCatalog260.DESIRED_REPO_VERSION_ID_COLUMN), 
eq(UpgradeCatalog260.REPO_VERSION_TABLE), 
eq(UpgradeCatalog260.REPO_VERSION_ID_COLUMN), eq(false));
+    expectLastCall().once();
+
+    
dbAccessor.dropFKConstraint(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE),
 eq(UpgradeCatalog260.FK_SCDS_DESIRED_STACK_ID));
+    expectLastCall().once();
+    
dbAccessor.dropColumn(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE),
 eq(UpgradeCatalog260.DESIRED_STACK_ID_COLUMN));
+    expectLastCall().once();
+    
dbAccessor.dropColumn(eq(UpgradeCatalog260.SERVICE_COMPONENT_DESIRED_STATE_TABLE),
 eq(UpgradeCatalog260.DESIRED_VERSION_COLUMN));
+    expectLastCall().once();
+  }
+
+  public void expectGetCurrentVersionID(List<Integer> current, 
Capture<String[]> scdcaptureKey, Capture<String[]> scdcaptureValue) throws 
SQLException {
+    expect(dbAccessor.getIntColumnValues(eq("cluster_version"), 
eq("repo_version_id"),
+        capture(scdcaptureKey), capture(scdcaptureValue), 
eq(false))).andReturn(current).once();
+  }
+
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/dee7317e/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog300Test.java
----------------------------------------------------------------------
diff --git 
a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog300Test.java
 
b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog300Test.java
index baae4c5..4de7e11 100644
--- 
a/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog300Test.java
+++ 
b/ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog300Test.java
@@ -173,44 +173,19 @@ public class UpgradeCatalog300Test {
       }
     };
 
-    Capture<DBAccessor.DBColumnInfo> clusterConfigSelectedColumn = 
newCapture();
-    Capture<DBAccessor.DBColumnInfo> clusterConfigSelectedTimestampColumn = 
newCapture();
     Capture<DBAccessor.DBColumnInfo> hrcOpsDisplayNameColumn = newCapture();
-
-    dbAccessor.addColumn(eq(UpgradeCatalog300.CLUSTER_CONFIG_TABLE), 
capture(clusterConfigSelectedColumn));
-    dbAccessor.addColumn(eq(UpgradeCatalog300.CLUSTER_CONFIG_TABLE), 
capture(clusterConfigSelectedTimestampColumn));
     dbAccessor.addColumn(eq(UpgradeCatalog300.HOST_ROLE_COMMAND_TABLE), 
capture(hrcOpsDisplayNameColumn));
 
     dbAccessor.dropColumn(COMPONENT_DESIRED_STATE_TABLE, 
SECURITY_STATE_COLUMN); expectLastCall().once();
     dbAccessor.dropColumn(COMPONENT_STATE_TABLE, SECURITY_STATE_COLUMN); 
expectLastCall().once();
     dbAccessor.dropColumn(SERVICE_DESIRED_STATE_TABLE, SECURITY_STATE_COLUMN); 
expectLastCall().once();
 
-    // component table
-    Capture<DBAccessor.DBColumnInfo> componentStateColumn = newCapture();
-    dbAccessor.addColumn(eq(UpgradeCatalog300.COMPONENT_TABLE), 
capture(componentStateColumn));
-
     replay(dbAccessor, configuration);
 
     Injector injector = Guice.createInjector(module);
     UpgradeCatalog300 upgradeCatalog300 = 
injector.getInstance(UpgradeCatalog300.class);
     upgradeCatalog300.executeDDLUpdates();
 
-    DBAccessor.DBColumnInfo capturedSelectedColumn = 
clusterConfigSelectedColumn.getValue();
-    Assert.assertNotNull(capturedSelectedColumn);
-    Assert.assertEquals(UpgradeCatalog300.CLUSTER_CONFIG_SELECTED_COLUMN, 
capturedSelectedColumn.getName());
-    Assert.assertEquals(Short.class, capturedSelectedColumn.getType());
-
-    DBAccessor.DBColumnInfo capturedSelectedTimestampColumn = 
clusterConfigSelectedTimestampColumn.getValue();
-    Assert.assertNotNull(capturedSelectedTimestampColumn);
-    
Assert.assertEquals(UpgradeCatalog300.CLUSTER_CONFIG_SELECTED_TIMESTAMP_COLUMN, 
capturedSelectedTimestampColumn.getName());
-    Assert.assertEquals(Long.class, capturedSelectedTimestampColumn.getType());
-
-    // component table
-    DBAccessor.DBColumnInfo capturedStateColumn = 
componentStateColumn.getValue();
-    Assert.assertNotNull(componentStateColumn);
-    Assert.assertEquals("repo_state", capturedStateColumn.getName());
-    Assert.assertEquals(String.class, capturedStateColumn.getType());
-
     DBAccessor.DBColumnInfo capturedOpsDisplayNameColumn = 
hrcOpsDisplayNameColumn.getValue();
     Assert.assertEquals(UpgradeCatalog300.HRC_OPS_DISPLAY_NAME_COLUMN, 
capturedOpsDisplayNameColumn.getName());
     Assert.assertEquals(null, capturedOpsDisplayNameColumn.getDefaultValue());
@@ -219,55 +194,6 @@ public class UpgradeCatalog300Test {
     verify(dbAccessor);
   }
 
-  /**
-   * Tests pre-DML executions.
-   *
-   * @throws Exception
-   */
-  @Test
-  public void testExecutePreDMLUpdates() throws Exception {
-    Module module = new Module() {
-      @Override
-      public void configure(Binder binder) {
-        binder.bind(DBAccessor.class).toInstance(dbAccessor);
-        binder.bind(OsFamily.class).toInstance(osFamily);
-        binder.bind(EntityManager.class).toInstance(entityManager);
-        binder.bind(Configuration.class).toInstance(configuration);
-      }
-    };
-
-    EntityManagerFactory emFactory = 
EasyMock.createNiceMock(EntityManagerFactory.class);
-    Cache emCache = EasyMock.createNiceMock(Cache.class);
-
-    
expect(entityManager.getEntityManagerFactory()).andReturn(emFactory).atLeastOnce();
-    expect(emFactory.getCache()).andReturn(emCache).atLeastOnce();
-
-    EntityTransaction mockTransaction = 
EasyMock.createNiceMock(EntityTransaction.class);
-    Connection mockConnection = EasyMock.createNiceMock(Connection.class);
-    Statement mockStatement = EasyMock.createNiceMock(Statement.class);
-
-    expect(dbAccessor.getConnection()).andReturn(mockConnection).once();
-    expect(mockConnection.createStatement()).andReturn(mockStatement).once();
-
-    expect(mockStatement.executeQuery(EasyMock.anyString())).andReturn(
-        EasyMock.createNiceMock(ResultSet.class));
-
-    expect(entityManager.getTransaction()).andReturn(
-        mockTransaction).atLeastOnce();
-
-    dbAccessor.dropTable(UpgradeCatalog300.CLUSTER_CONFIG_MAPPING_TABLE);
-    EasyMock.expectLastCall().once();
-
-    replay(dbAccessor, entityManager, emFactory, emCache, mockConnection, 
mockTransaction,
-        mockStatement, configuration);
-
-    Injector injector = Guice.createInjector(module);
-    UpgradeCatalog300 upgradeCatalog300 = 
injector.getInstance(UpgradeCatalog300.class);
-    upgradeCatalog300.executePreDMLUpdates();
-
-    verify(dbAccessor, entityManager, emFactory, emCache);
-  }
-
   @Test
   public void testLogSearchUpdateConfigs() throws Exception {
     reset(clusters, cluster);

Reply via email to