You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by rl...@apache.org on 2017/12/04 23:23:37 UTC

[01/13] ambari git commit: AMBARI-22485 : Allow Ambari to support non-kerberos SASL mechanisms for Kafka - Addendum, fix incorrect config tag (ydavis via mradhakrishnan)

Repository: ambari
Updated Branches:
  refs/heads/branch-feature-AMBARI-20859 b6cf4325e -> de4deaf0b


AMBARI-22485 : Allow Ambari to support non-kerberos SASL mechanisms for Kafka - Addendum, fix incorrect config tag (ydavis via mradhakrishnan)


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

Branch: refs/heads/branch-feature-AMBARI-20859
Commit: 47be7edce686354c11b38d32f6bff3b4318bc611
Parents: 959ad90
Author: Madhuvanthi Radhakrishnan <mr...@hortonworks.com>
Authored: Fri Dec 1 13:44:12 2017 -0800
Committer: Madhuvanthi Radhakrishnan <mr...@hortonworks.com>
Committed: Fri Dec 1 13:45:46 2017 -0800

----------------------------------------------------------------------
 .../common-services/KAFKA/0.10.0/configuration/kafka-broker.xml    | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/47be7edc/ambari-server/src/main/resources/common-services/KAFKA/0.10.0/configuration/kafka-broker.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/common-services/KAFKA/0.10.0/configuration/kafka-broker.xml b/ambari-server/src/main/resources/common-services/KAFKA/0.10.0/configuration/kafka-broker.xml
index da382d5..53c2ca3 100644
--- a/ambari-server/src/main/resources/common-services/KAFKA/0.10.0/configuration/kafka-broker.xml
+++ b/ambari-server/src/main/resources/common-services/KAFKA/0.10.0/configuration/kafka-broker.xml
@@ -22,7 +22,7 @@
         <name>sasl.enabled.mechanisms</name>
         <value>GSSAPI</value>
         <description>The list of SASL mechanisms enabled in the Kafka server. The list may contain any mechanism for which a security provider is available. Only GSSAPI is enabled by default.</description>
-        <on-ambari-upgrade add="upgrade"/>
+        <on-ambari-upgrade add="true"/>
     </property>
     <property>
         <name>security.inter.broker.protocol</name>


[07/13] ambari git commit: AMBARI-22353. Remove properties.json And Switch To Adding Properties to ResourceProviders Dynamically (dlysnichenko)

Posted by rl...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentProcessResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentProcessResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentProcessResourceProvider.java
index 2a25bc4..db514de 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentProcessResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentProcessResourceProvider.java
@@ -18,7 +18,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.Map;
@@ -39,6 +38,9 @@ import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Clusters;
 import org.apache.ambari.server.state.ServiceComponentHost;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * Resource Provider for HostComponent process resources.
  */
@@ -54,22 +56,36 @@ public class HostComponentProcessResourceProvider extends ReadOnlyResourceProvid
   public static final String HC_PROCESS_HOST_NAME_ID = "HostComponentProcess/host_name";
   public static final String HC_PROCESS_COMPONENT_NAME_ID = "HostComponentProcess/component_name";
 
-  // Primary Key Fields
-  private static Set<String> pkPropertyIds =
-    new HashSet<>(Arrays.asList(new String[]{
-      HC_PROCESS_CLUSTER_NAME_ID, HC_PROCESS_HOST_NAME_ID, HC_PROCESS_COMPONENT_NAME_ID, HC_PROCESS_NAME_ID}));
+  /**
+   * The key property ids for a HostComponentProcess resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Cluster, HC_PROCESS_CLUSTER_NAME_ID)
+      .put(Resource.Type.Host, HC_PROCESS_HOST_NAME_ID)
+      .put(Resource.Type.Component, HC_PROCESS_COMPONENT_NAME_ID)
+      .put(Resource.Type.HostComponent, HC_PROCESS_COMPONENT_NAME_ID)
+      .put(Resource.Type.HostComponentProcess, HC_PROCESS_NAME_ID)
+      .build();
+
+  /**
+   * The property ids for a HostComponentProcess resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      HC_PROCESS_NAME_ID,
+      HC_PROCESS_STATUS_ID,
+      HC_PROCESS_CLUSTER_NAME_ID,
+      HC_PROCESS_HOST_NAME_ID,
+      HC_PROCESS_COMPONENT_NAME_ID);
 
   // ----- Constructors ----------------------------------------------------
 
   /**
    * Create a  new resource provider for the given management controller.
    *
-   * @param propertyIds     the property ids
-   * @param keyPropertyIds  the key property ids
+   * @param amc the management controller
    */
-  HostComponentProcessResourceProvider(Set<String> propertyIds,
-      Map<Resource.Type, String> keyPropertyIds, AmbariManagementController amc) {
-    super(propertyIds, keyPropertyIds, amc);
+  HostComponentProcessResourceProvider(AmbariManagementController amc) {
+    super(Resource.Type.HostComponentProcess, propertyIds, keyPropertyIds, amc);
   }
 
 
@@ -77,7 +93,7 @@ public class HostComponentProcessResourceProvider extends ReadOnlyResourceProvid
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
index 94766a5..cf58325 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostComponentResourceProvider.java
@@ -18,7 +18,6 @@
 package org.apache.ambari.server.controller.internal;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumMap;
@@ -69,6 +68,8 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.assistedinject.Assisted;
@@ -84,6 +85,8 @@ public class HostComponentResourceProvider extends AbstractControllerResourcePro
   // ----- Property ID constants ---------------------------------------------
 
   // Host Components
+  public static final String HOST_COMPONENT_ROLE_ID
+      = PropertyHelper.getPropertyId("HostRoles", "role_id");
   public static final String HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID
       = PropertyHelper.getPropertyId("HostRoles", "cluster_name");
   public static final String HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID
@@ -120,12 +123,40 @@ public class HostComponentResourceProvider extends AbstractControllerResourcePro
 
   //Parameters from the predicate
   private static final String QUERY_PARAMETERS_RUN_SMOKE_TEST_ID = "params/run_smoke_test";
-  private static Set<String> pkPropertyIds =
-    new HashSet<>(Arrays.asList(new String[]{
+
+  /**
+   * The key property ids for a HostComponent resource.
+   */
+  public static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Cluster, HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID)
+      .put(Resource.Type.Host, HOST_COMPONENT_HOST_NAME_PROPERTY_ID)
+      .put(Resource.Type.HostComponent, HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID)
+      .put(Resource.Type.Component, HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a HostComponent resource.
+   */
+  protected static Set<String> propertyIds = Sets.newHashSet(
+      HOST_COMPONENT_ROLE_ID,
       HOST_COMPONENT_CLUSTER_NAME_PROPERTY_ID,
       HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID,
       HOST_COMPONENT_COMPONENT_NAME_PROPERTY_ID,
-      HOST_COMPONENT_HOST_NAME_PROPERTY_ID}));
+      HOST_COMPONENT_DISPLAY_NAME_PROPERTY_ID,
+      HOST_COMPONENT_HOST_NAME_PROPERTY_ID,
+      HOST_COMPONENT_PUBLIC_HOST_NAME_PROPERTY_ID,
+      HOST_COMPONENT_STATE_PROPERTY_ID,
+      HOST_COMPONENT_DESIRED_STATE_PROPERTY_ID,
+      HOST_COMPONENT_VERSION_PROPERTY_ID,
+      HOST_COMPONENT_DESIRED_STACK_ID_PROPERTY_ID,
+      HOST_COMPONENT_DESIRED_REPOSITORY_VERSION,
+      HOST_COMPONENT_ACTUAL_CONFIGS_PROPERTY_ID,
+      HOST_COMPONENT_STALE_CONFIGS_PROPERTY_ID,
+      HOST_COMPONENT_RELOAD_CONFIGS_PROPERTY_ID,
+      HOST_COMPONENT_DESIRED_ADMIN_STATE_PROPERTY_ID,
+      HOST_COMPONENT_MAINTENANCE_STATE_PROPERTY_ID,
+      HOST_COMPONENT_UPGRADE_STATE_PROPERTY_ID,
+      QUERY_PARAMETERS_RUN_SMOKE_TEST_ID);
 
   /**
    * maintenance state helper
@@ -141,16 +172,12 @@ public class HostComponentResourceProvider extends AbstractControllerResourcePro
   /**
    * Create a  new resource provider for the given management controller.
    *
-   * @param propertyIds          the property ids
-   * @param keyPropertyIds       the key property ids
    * @param managementController the management controller
    */
   @AssistedInject
-  public HostComponentResourceProvider(@Assisted Set<String> propertyIds,
-                                       @Assisted Map<Resource.Type, String> keyPropertyIds,
-                                       @Assisted AmbariManagementController managementController,
+  public HostComponentResourceProvider(@Assisted AmbariManagementController managementController,
                                        Injector injector) {
-    super(propertyIds, keyPropertyIds, managementController);
+    super(Resource.Type.HostComponent, propertyIds, keyPropertyIds, managementController);
 
     setRequiredCreateAuthorizations(EnumSet.of(RoleAuthorization.SERVICE_ADD_DELETE_SERVICES,RoleAuthorization.HOST_ADD_DELETE_COMPONENTS));
     setRequiredDeleteAuthorizations(EnumSet.of(RoleAuthorization.SERVICE_ADD_DELETE_SERVICES,RoleAuthorization.HOST_ADD_DELETE_COMPONENTS));
@@ -662,7 +689,7 @@ public class HostComponentResourceProvider extends AbstractControllerResourcePro
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostKerberosIdentityResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostKerberosIdentityResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostKerberosIdentityResourceProvider.java
index 0672500..52ab9b5 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostKerberosIdentityResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostKerberosIdentityResourceProvider.java
@@ -125,7 +125,7 @@ public class HostKerberosIdentityResourceProvider extends ReadOnlyResourceProvid
    */
   @AssistedInject
   HostKerberosIdentityResourceProvider(@Assisted AmbariManagementController managementController) {
-    super(PROPERTY_IDS, PK_PROPERTY_MAP, managementController);
+    super(Resource.Type.HostKerberosIdentity, PROPERTY_IDS, PK_PROPERTY_MAP, managementController);
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
index 5c740f1..f683afd 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
@@ -72,7 +72,8 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 import com.google.inject.assistedinject.Assisted;
 import com.google.inject.assistedinject.AssistedInject;
@@ -114,6 +115,7 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
   public static final String RECOVERY_SUMMARY_PROPERTY_ID = "recovery_summary";
   public static final String STATE_PROPERTY_ID = "host_state";
   public static final String TOTAL_MEM_PROPERTY_ID = "total_mem";
+  public static final String ATTRIBUTES_PROPERTY_ID = "attributes";
 
   public static final String HOST_CLUSTER_NAME_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + CLUSTER_NAME_PROPERTY_ID;
   public static final String HOST_CPU_COUNT_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + CPU_COUNT_PROPERTY_ID;
@@ -137,6 +139,7 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
   public static final String HOST_RECOVERY_SUMMARY_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + RECOVERY_SUMMARY_PROPERTY_ID;
   public static final String HOST_STATE_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + STATE_PROPERTY_ID;
   public static final String HOST_TOTAL_MEM_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + TOTAL_MEM_PROPERTY_ID;
+  public static final String HOST_ATTRIBUTES_PROPERTY_ID = PropertyHelper.getPropertyId(RESPONSE_KEY,ATTRIBUTES_PROPERTY_ID);
 
   public static final String BLUEPRINT_PROPERTY_ID = "blueprint";
   public static final String HOST_GROUP_PROPERTY_ID = "host_group";
@@ -145,7 +148,41 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
 
   //todo use the same json structure for cluster host addition (cluster template and upscale)
 
-  private static final Set<String> PK_PROPERTY_IDS = ImmutableSet.of(HOST_HOST_NAME_PROPERTY_ID);
+  /**
+   * The key property ids for a Host resource.
+   */
+  public static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Host, HOST_HOST_NAME_PROPERTY_ID)
+      .put(Resource.Type.Cluster, HOST_CLUSTER_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a Host resource.
+   */
+  public static Set<String> propertyIds = Sets.newHashSet(
+      HOST_CLUSTER_NAME_PROPERTY_ID,
+      HOST_CPU_COUNT_PROPERTY_ID,
+      HOST_DESIRED_CONFIGS_PROPERTY_ID,
+      HOST_DISK_INFO_PROPERTY_ID,
+      HOST_HOST_HEALTH_REPORT_PROPERTY_ID,
+      HOST_HOST_STATUS_PROPERTY_ID,
+      HOST_IP_PROPERTY_ID,
+      HOST_LAST_AGENT_ENV_PROPERTY_ID,
+      HOST_LAST_HEARTBEAT_TIME_PROPERTY_ID,
+      HOST_LAST_REGISTRATION_TIME_PROPERTY_ID,
+      HOST_MAINTENANCE_STATE_PROPERTY_ID,
+      HOST_HOST_NAME_PROPERTY_ID,
+      HOST_OS_ARCH_PROPERTY_ID,
+      HOST_OS_FAMILY_PROPERTY_ID,
+      HOST_OS_TYPE_PROPERTY_ID,
+      HOST_PHYSICAL_CPU_COUNT_PROPERTY_ID,
+      HOST_PUBLIC_NAME_PROPERTY_ID,
+      HOST_RACK_INFO_PROPERTY_ID,
+      HOST_RECOVERY_REPORT_PROPERTY_ID,
+      HOST_RECOVERY_SUMMARY_PROPERTY_ID,
+      HOST_STATE_PROPERTY_ID,
+      HOST_TOTAL_MEM_PROPERTY_ID,
+      HOST_ATTRIBUTES_PROPERTY_ID);
 
   @Inject
   private OsFamily osFamily;
@@ -158,15 +195,11 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
   /**
    * Create a  new resource provider for the given management controller.
    *
-   * @param propertyIds           the property ids
-   * @param keyPropertyIds        the key property ids
    * @param managementController  the management controller
    */
   @AssistedInject
-  HostResourceProvider(@Assisted Set<String> propertyIds,
-                       @Assisted Map<Resource.Type, String> keyPropertyIds,
-                       @Assisted AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  HostResourceProvider(@Assisted AmbariManagementController managementController) {
+    super(Resource.Type.Host, propertyIds, keyPropertyIds, managementController);
 
     Set<RoleAuthorization> authorizationsAddDelete = EnumSet.of(RoleAuthorization.HOST_ADD_DELETE_HOSTS);
 
@@ -354,7 +387,7 @@ public class HostResourceProvider extends AbstractControllerResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return PK_PROPERTY_IDS;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java
index 48e9f59..5282ad4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProvider.java
@@ -166,7 +166,7 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
    */
   public HostStackVersionResourceProvider(
           AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+    super(Type.HostStackVersion, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/InstanceResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/InstanceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/InstanceResourceProvider.java
index d3a695b..3d34982 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/InstanceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/InstanceResourceProvider.java
@@ -18,7 +18,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -39,6 +38,9 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * DR instance resource provider.
  */
@@ -54,21 +56,34 @@ public class InstanceResourceProvider extends AbstractDRResourceProvider {
   protected static final String INSTANCE_DETAILS_PROPERTY_ID    = PropertyHelper.getPropertyId("Instance", "details");
   protected static final String INSTANCE_LOG_PROPERTY_ID        = PropertyHelper.getPropertyId("Instance", "log");
 
-  private static Set<String> pkPropertyIds =
-    new HashSet<>(Arrays.asList(new String[]{
+
+
+  /**
+   * The key property ids for a Instance resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.DRInstance, INSTANCE_FEED_NAME_PROPERTY_ID)
+      .put(Resource.Type.Workflow, INSTANCE_ID_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a Instance resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
       INSTANCE_FEED_NAME_PROPERTY_ID,
-      INSTANCE_ID_PROPERTY_ID}));
+      INSTANCE_ID_PROPERTY_ID,
+      INSTANCE_STATUS_PROPERTY_ID,
+      INSTANCE_START_TIME_PROPERTY_ID,
+      INSTANCE_END_TIME_PROPERTY_ID,
+      INSTANCE_DETAILS_PROPERTY_ID,
+      INSTANCE_LOG_PROPERTY_ID);
 
   /**
    * Construct a provider.
    *
    * @param ivoryService    the ivory service
-   * @param propertyIds     the properties associated with this provider
-   * @param keyPropertyIds  the key property ids
    */
-  public InstanceResourceProvider(IvoryService ivoryService,
-                                  Set<String> propertyIds,
-                                  Map<Resource.Type, String> keyPropertyIds) {
+  public InstanceResourceProvider(IvoryService ivoryService) {
     super(propertyIds, keyPropertyIds, ivoryService);
   }
 
@@ -180,7 +195,7 @@ public class InstanceResourceProvider extends AbstractDRResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/JobResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/JobResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/JobResourceProvider.java
index e70c367..93bf42a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/JobResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/JobResourceProvider.java
@@ -22,7 +22,6 @@ import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -45,6 +44,9 @@ import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * Resource provider for job resources.
  */
@@ -81,22 +83,40 @@ public class JobResourceProvider extends
   protected static final String JOB_WORKFLOW_ENTITY_NAME_PROPERTY_ID = PropertyHelper
       .getPropertyId("Job", "workflow_entity_name");
 
-  private static final Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{JOB_CLUSTER_NAME_PROPERTY_ID,
-      JOB_WORKFLOW_ID_PROPERTY_ID, JOB_ID_PROPERTY_ID}));
-
   protected JobFetcher jobFetcher;
 
   /**
+   * The key property ids for a Job resource.
+   */
+  protected static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.Cluster, JOB_CLUSTER_NAME_PROPERTY_ID)
+      .put(Type.Workflow, JOB_WORKFLOW_ID_PROPERTY_ID)
+      .put(Type.Job, JOB_ID_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a Job resource.
+   */
+  protected static Set<String> propertyIds = Sets.newHashSet(
+      JOB_CLUSTER_NAME_PROPERTY_ID,
+      JOB_WORKFLOW_ID_PROPERTY_ID,
+      JOB_ID_PROPERTY_ID,
+      JOB_NAME_PROPERTY_ID,
+      JOB_STATUS_PROPERTY_ID,
+      JOB_USER_NAME_PROPERTY_ID,
+      JOB_SUBMIT_TIME_PROPERTY_ID,
+      JOB_ELAPSED_TIME_PROPERTY_ID,
+      JOB_MAPS_PROPERTY_ID,
+      JOB_REDUCES_PROPERTY_ID,
+      JOB_INPUT_BYTES_PROPERTY_ID,
+      JOB_OUTPUT_BYTES_PROPERTY_ID,
+      JOB_CONF_PATH_PROPERTY_ID,
+      JOB_WORKFLOW_ENTITY_NAME_PROPERTY_ID);
+
+  /**
    * Create a new job resource provider.
-   * 
-   * @param propertyIds
-   *          the property ids
-   * @param keyPropertyIds
-   *          the key property ids
    */
-  protected JobResourceProvider(Set<String> propertyIds,
-      Map<Type,String> keyPropertyIds) {
+  protected JobResourceProvider() {
     super(propertyIds, keyPropertyIds);
     jobFetcher = new PostgresJobFetcher(
         new JobHistoryPostgresConnectionFactory());
@@ -105,15 +125,10 @@ public class JobResourceProvider extends
   /**
    * Create a new job resource provider.
    * 
-   * @param propertyIds
-   *          the property ids
-   * @param keyPropertyIds
-   *          the key property ids
    * @param jobFetcher
    *          job fetcher
    */
-  protected JobResourceProvider(Set<String> propertyIds,
-      Map<Type,String> keyPropertyIds, JobFetcher jobFetcher) {
+  protected JobResourceProvider(JobFetcher jobFetcher) {
     super(propertyIds, keyPropertyIds);
     this.jobFetcher = jobFetcher;
   }
@@ -162,15 +177,11 @@ public class JobResourceProvider extends
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
   @Override
   public Map<Type,String> getKeyPropertyIds() {
-    Map<Type,String> keyPropertyIds = new HashMap<>();
-    keyPropertyIds.put(Type.Cluster, JOB_CLUSTER_NAME_PROPERTY_ID);
-    keyPropertyIds.put(Type.Workflow, JOB_WORKFLOW_ID_PROPERTY_ID);
-    keyPropertyIds.put(Type.Job, JOB_ID_PROPERTY_ID);
     return keyPropertyIds;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/KerberosDescriptorResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/KerberosDescriptorResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/KerberosDescriptorResourceProvider.java
index 9301341..773064d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/KerberosDescriptorResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/KerberosDescriptorResourceProvider.java
@@ -26,6 +26,8 @@ import org.apache.ambari.server.topology.KerberosDescriptorFactory;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 import com.google.inject.assistedinject.Assisted;
 
 /**
@@ -55,6 +57,20 @@ public class KerberosDescriptorResourceProvider extends AbstractControllerResour
   private static final String KERBEROS_DESCRIPTOR_TEXT_PROPERTY_ID =
       PropertyHelper.getPropertyId("KerberosDescriptors", "kerberos_descriptor_text");
 
+  /**
+   * The key property ids for a KerberosDescriptor resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.KerberosDescriptor, KERBEROS_DESCRIPTOR_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a KerberosDescriptor resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      KERBEROS_DESCRIPTOR_NAME_PROPERTY_ID,
+      KERBEROS_DESCRIPTOR_TEXT_PROPERTY_ID);
+
   private KerberosDescriptorDAO kerberosDescriptorDAO;
 
   private KerberosDescriptorFactory kerberosDescriptorFactory;
@@ -63,10 +79,8 @@ public class KerberosDescriptorResourceProvider extends AbstractControllerResour
   @Inject
   KerberosDescriptorResourceProvider(KerberosDescriptorDAO kerberosDescriptorDAO,
                                      KerberosDescriptorFactory kerberosDescriptorFactory,
-                                     @Assisted Set<String> propertyIds,
-                                     @Assisted Map<Resource.Type, String> keyPropertyIds,
                                      @Assisted AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+    super(Resource.Type.KerberosDescriptor, propertyIds, keyPropertyIds, managementController);
     this.kerberosDescriptorDAO = kerberosDescriptorDAO;
     this.kerberosDescriptorFactory = kerberosDescriptorFactory;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProvider.java
index fc409a3..ad7562a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LdapSyncEventResourceProvider.java
@@ -60,6 +60,9 @@ import org.apache.ambari.server.security.ldap.LdapBatchDto;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * Resource provider for ldap sync events.
  */
@@ -97,33 +100,29 @@ public class LdapSyncEventResourceProvider extends AbstractControllerResourcePro
   /**
    * The key property ids for a event resource.
    */
-  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<>();
-  static {
-    keyPropertyIds.put(Resource.Type.LdapSyncEvent, EVENT_ID_PROPERTY_ID);
-  }
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.LdapSyncEvent, EVENT_ID_PROPERTY_ID)
+      .build();
 
   /**
    * The property ids for a event resource.
    */
-  private static Set<String> propertyIds = new HashSet<>();
-
-  static {
-    propertyIds.add(EVENT_ID_PROPERTY_ID);
-    propertyIds.add(EVENT_STATUS_PROPERTY_ID);
-    propertyIds.add(EVENT_STATUS_DETAIL_PROPERTY_ID);
-    propertyIds.add(EVENT_START_TIME_PROPERTY_ID);
-    propertyIds.add(EVENT_END_TIME_PROPERTY_ID);
-    propertyIds.add(USERS_CREATED_PROPERTY_ID);
-    propertyIds.add(USERS_UPDATED_PROPERTY_ID);
-    propertyIds.add(USERS_REMOVED_PROPERTY_ID);
-    propertyIds.add(USERS_SKIPPED_PROPERTY_ID);
-    propertyIds.add(GROUPS_CREATED_PROPERTY_ID);
-    propertyIds.add(GROUPS_UPDATED_PROPERTY_ID);
-    propertyIds.add(GROUPS_REMOVED_PROPERTY_ID);
-    propertyIds.add(MEMBERSHIPS_CREATED_PROPERTY_ID);
-    propertyIds.add(MEMBERSHIPS_REMOVED_PROPERTY_ID);
-    propertyIds.add(EVENT_SPECS_PROPERTY_ID);
-  }
+  private static Set<String> propertyIds = Sets.newHashSet(
+      EVENT_ID_PROPERTY_ID,
+      EVENT_STATUS_PROPERTY_ID,
+      EVENT_STATUS_DETAIL_PROPERTY_ID,
+      EVENT_START_TIME_PROPERTY_ID,
+      EVENT_END_TIME_PROPERTY_ID,
+      USERS_CREATED_PROPERTY_ID,
+      USERS_UPDATED_PROPERTY_ID,
+      USERS_REMOVED_PROPERTY_ID,
+      USERS_SKIPPED_PROPERTY_ID,
+      GROUPS_CREATED_PROPERTY_ID,
+      GROUPS_UPDATED_PROPERTY_ID,
+      GROUPS_REMOVED_PROPERTY_ID,
+      MEMBERSHIPS_CREATED_PROPERTY_ID,
+      MEMBERSHIPS_REMOVED_PROPERTY_ID,
+      EVENT_SPECS_PROPERTY_ID);
 
   /**
    * Spec property keys.
@@ -164,7 +163,7 @@ public class LdapSyncEventResourceProvider extends AbstractControllerResourcePro
    * Construct a event resource provider.
    */
   public LdapSyncEventResourceProvider(AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+    super(Resource.Type.LdapSyncEvent, propertyIds, keyPropertyIds, managementController);
 
     EnumSet<RoleAuthorization> roleAuthorizations =
         EnumSet.of(RoleAuthorization.AMBARI_MANAGE_GROUPS, RoleAuthorization.AMBARI_MANAGE_USERS);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LoggingResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LoggingResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LoggingResourceProvider.java
index d6afe7b..01766ed 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LoggingResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/LoggingResourceProvider.java
@@ -66,13 +66,8 @@ public class LoggingResourceProvider extends AbstractControllerResourceProvider
   }
 
 
-  public LoggingResourceProvider(Set<String> propertyIds,
-                                 Map<Resource.Type, String> keyPropertyIds,
-                                 AmbariManagementController controller) {
-
-
-
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
+  public LoggingResourceProvider(AmbariManagementController controller) {
+    super(Resource.Type.LoggingQuery, PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MemberResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MemberResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MemberResourceProvider.java
index 3cecddb..d4c1e03 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MemberResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/MemberResourceProvider.java
@@ -17,7 +17,6 @@
  */
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -42,6 +41,8 @@ import org.apache.ambari.server.security.authorization.RoleAuthorization;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 import com.google.inject.assistedinject.Assisted;
 import com.google.inject.assistedinject.AssistedInject;
 import com.google.inject.persist.Transactional;
@@ -59,23 +60,29 @@ public class MemberResourceProvider extends AbstractControllerResourceProvider {
   public static final String MEMBER_GROUP_NAME_PROPERTY_ID = PropertyHelper.getPropertyId("MemberInfo", "group_name");
   public static final String MEMBER_USER_NAME_PROPERTY_ID  = PropertyHelper.getPropertyId("MemberInfo", "user_name");
 
-  private static Set<String> pkPropertyIds =
-    new HashSet<>(Arrays.asList(new String[]{
+  /**
+   * The key property ids for a Member resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Group, MEMBER_GROUP_NAME_PROPERTY_ID)
+      .put(Resource.Type.Member, MEMBER_USER_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a Member resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
       MEMBER_GROUP_NAME_PROPERTY_ID,
-      MEMBER_USER_NAME_PROPERTY_ID}));
+      MEMBER_USER_NAME_PROPERTY_ID);
 
   /**
    * Create a  new resource provider for the given management controller.
    *
-   * @param propertyIds           the property ids
-   * @param keyPropertyIds        the key property ids
    * @param managementController  the management controller
    */
   @AssistedInject
-  public MemberResourceProvider(@Assisted Set<String> propertyIds,
-                          @Assisted Map<Resource.Type, String> keyPropertyIds,
-                          @Assisted AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  public MemberResourceProvider(@Assisted AmbariManagementController managementController) {
+    super(Resource.Type.Member, propertyIds, keyPropertyIds, managementController);
 
     EnumSet<RoleAuthorization> manageUserAuthorizations = EnumSet.of(RoleAuthorization.AMBARI_MANAGE_USERS);
     setRequiredCreateAuthorizations(manageUserAuthorizations);
@@ -193,7 +200,7 @@ public class MemberResourceProvider extends AbstractControllerResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
   private MemberRequest getRequest(Map<String, Object> properties) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/OperatingSystemResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/OperatingSystemResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/OperatingSystemResourceProvider.java
index 174fdf6..2310a28 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/OperatingSystemResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/OperatingSystemResourceProvider.java
@@ -74,7 +74,7 @@ public class OperatingSystemResourceProvider extends ReadOnlyResourceProvider {
   };
 
   protected OperatingSystemResourceProvider(AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+    super(Resource.Type.OperatingSystem, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PermissionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PermissionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PermissionResourceProvider.java
index 43cdf2b..dd9fa16 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PermissionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PermissionResourceProvider.java
@@ -18,7 +18,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -35,6 +34,9 @@ import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.orm.dao.PermissionDAO;
 import org.apache.ambari.server.orm.entities.PermissionEntity;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * Resource provider for permission instances.
  */
@@ -58,22 +60,19 @@ public class PermissionResourceProvider extends AbstractResourceProvider {
   /**
    * The key property ids for a permission resource.
    */
-  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<>();
-  static {
-    keyPropertyIds.put(Resource.Type.Permission, PERMISSION_ID_PROPERTY_ID);
-  }
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Permission, PERMISSION_ID_PROPERTY_ID)
+      .build();
 
   /**
    * The property ids for a permission resource.
    */
-  private static Set<String> propertyIds = new HashSet<>();
-  static {
-    propertyIds.add(PERMISSION_ID_PROPERTY_ID);
-    propertyIds.add(PERMISSION_NAME_PROPERTY_ID);
-    propertyIds.add(PERMISSION_LABEL_PROPERTY_ID);
-    propertyIds.add(RESOURCE_NAME_PROPERTY_ID);
-    propertyIds.add(SORT_ORDER_PROPERTY_ID);
-  }
+  private static Set<String> propertyIds = Sets.newHashSet(
+      PERMISSION_ID_PROPERTY_ID,
+      PERMISSION_NAME_PROPERTY_ID,
+      PERMISSION_LABEL_PROPERTY_ID,
+      RESOURCE_NAME_PROPERTY_ID,
+      SORT_ORDER_PROPERTY_ID);
 
 
   // ----- Constructors ------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java
index fabce6b..717b83b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/PrivilegeResourceProvider.java
@@ -111,7 +111,7 @@ public abstract class PrivilegeResourceProvider<T> extends AbstractAuthorizedRes
   public PrivilegeResourceProvider(Set<String> propertyIds,
                                    Map<Resource.Type, String> keyPropertyIds,
                                    Resource.Type resourceType) {
-    super(propertyIds, keyPropertyIds);
+    super(resourceType, propertyIds, keyPropertyIds);
     this.resourceType = resourceType;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/QuickLinkArtifactResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/QuickLinkArtifactResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/QuickLinkArtifactResourceProvider.java
index f293941..534c369 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/QuickLinkArtifactResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/QuickLinkArtifactResourceProvider.java
@@ -96,7 +96,7 @@ public class QuickLinkArtifactResourceProvider extends AbstractControllerResourc
    * @param managementController the management controller
    */
   protected QuickLinkArtifactResourceProvider(AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+    super(Resource.Type.QuickLink, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ReadOnlyResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ReadOnlyResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ReadOnlyResourceProvider.java
index 505ec63..e0f95d6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ReadOnlyResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ReadOnlyResourceProvider.java
@@ -28,7 +28,6 @@ import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.RequestStatus;
 import org.apache.ambari.server.controller.spi.Resource;
-import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
@@ -37,12 +36,6 @@ public abstract class ReadOnlyResourceProvider extends AbstractControllerResourc
 
   private static final String READ_ONLY_MSG = "Read-only resource";
 
-  protected ReadOnlyResourceProvider(Set<String> propertyIds,
-      Map<Type, String> keyPropertyIds,
-      AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
-  }
-
   /**
    * Create a new resource provider for the given management controller. This
    * constructor will initialize the specified {@link Resource.Type} with the

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RecommendationResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RecommendationResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RecommendationResourceProvider.java
index 9c6259c..dcc6cb6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RecommendationResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RecommendationResourceProvider.java
@@ -46,6 +46,9 @@ import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 public class RecommendationResourceProvider extends StackAdvisorResourceProvider {
 
   private static final Logger LOG = LoggerFactory.getLogger(RecommendationResourceProvider.class);
@@ -56,10 +59,13 @@ public class RecommendationResourceProvider extends StackAdvisorResourceProvider
   protected static final String HOSTS_PROPERTY_ID = "hosts";
   protected static final String SERVICES_PROPERTY_ID = "services";
   protected static final String RECOMMEND_PROPERTY_ID = "recommend";
+  protected static final String RECOMMENDATIONS_PROPERTY_ID = "recommendations";
 
   protected static final String CONFIG_GROUPS_PROPERTY_ID = PropertyHelper
       .getPropertyId("recommendations", "config-groups");
 
+  protected static final String BLUEPRINT_PROPERTY_ID = PropertyHelper
+      .getPropertyId("recommendations", "blueprint");
   protected static final String BLUEPRINT_CONFIGURATIONS_PROPERTY_ID = PropertyHelper
       .getPropertyId("recommendations/blueprint", "configurations");
 
@@ -72,13 +78,56 @@ public class RecommendationResourceProvider extends StackAdvisorResourceProvider
       "recommendations/blueprint_cluster_binding", "host_groups");
   protected static final String BINDING_HOST_GROUPS_NAME_PROPERTY_ID = "name";
   protected static final String BINDING_HOST_GROUPS_HOSTS_PROPERTY_ID = "hosts";
-
-  private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{RECOMMENDATION_ID_PROPERTY_ID}));
-
-  protected RecommendationResourceProvider(Set<String> propertyIds,
-      Map<Type, String> keyPropertyIds, AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  protected static final String CHANGED_CONFIGURATIONS_PROPERTY_ID = "changed_configurations";
+  protected static final String BINDING_PROPERTY_ID = PropertyHelper
+      .getPropertyId("recommendations", "blueprint_cluster_binding");
+  protected static final String USER_CONTEXT_PROPERTY_ID = "user_context";
+  protected static final String USER_CONTEXT_OPERATION_PROPERTY_ID = PropertyHelper
+      .getPropertyId(USER_CONTEXT_PROPERTY_ID, "operation");
+  protected static final String USER_CONTEXT_OPERATION_DETAILS_PROPERTY_ID = PropertyHelper
+      .getPropertyId(USER_CONTEXT_PROPERTY_ID, "operation_details");
+
+
+  /**
+   * The key property ids for a Recommendation resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.Recommendation, RECOMMENDATION_ID_PROPERTY_ID)
+      .put(Type.Stack, STACK_NAME_PROPERTY_ID)
+      .put(Type.StackVersion, STACK_VERSION_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a Recommendation resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      RECOMMENDATION_ID_PROPERTY_ID,
+      STACK_NAME_PROPERTY_ID,
+      STACK_VERSION_PROPERTY_ID,
+      RECOMMEND_PROPERTY_ID,
+      HOSTS_PROPERTY_ID,
+      SERVICES_PROPERTY_ID,
+      CONFIG_GROUPS_PROPERTY_ID,
+      CHANGED_CONFIGURATIONS_PROPERTY_ID,
+      USER_CONTEXT_PROPERTY_ID,
+      USER_CONTEXT_OPERATION_PROPERTY_ID,
+      USER_CONTEXT_OPERATION_DETAILS_PROPERTY_ID,
+      RECOMMENDATIONS_PROPERTY_ID,
+      BLUEPRINT_PROPERTY_ID,
+      BLUEPRINT_CONFIGURATIONS_PROPERTY_ID,
+      BLUEPRINT_HOST_GROUPS_PROPERTY_ID,
+      PropertyHelper.getPropertyId(BLUEPRINT_HOST_GROUPS_PROPERTY_ID, BLUEPRINT_HOST_GROUPS_NAME_PROPERTY_ID),
+      PropertyHelper.getPropertyId(BLUEPRINT_HOST_GROUPS_PROPERTY_ID, BLUEPRINT_HOST_GROUPS_COMPONENTS_PROPERTY_ID),
+      BINDING_PROPERTY_ID,
+      BINDING_HOST_GROUPS_PROPERTY_ID,
+      PropertyHelper.getPropertyId(BINDING_HOST_GROUPS_PROPERTY_ID, BINDING_HOST_GROUPS_NAME_PROPERTY_ID),
+      PropertyHelper.getPropertyId(BINDING_HOST_GROUPS_PROPERTY_ID, BINDING_HOST_GROUPS_HOSTS_PROPERTY_ID),
+      BINDING_HOST_GROUPS_NAME_PROPERTY_ID,
+      BINDING_HOST_GROUPS_HOSTS_PROPERTY_ID);
+
+
+  protected RecommendationResourceProvider(AmbariManagementController managementController) {
+    super(Type.Recommendation, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override
@@ -155,7 +204,7 @@ public class RecommendationResourceProvider extends StackAdvisorResourceProvider
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RemoteClusterResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RemoteClusterResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RemoteClusterResourceProvider.java
index 0b2d2b3..312fcb4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RemoteClusterResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RemoteClusterResourceProvider.java
@@ -21,7 +21,6 @@ package org.apache.ambari.server.controller.internal;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.EnumSet;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.Map;
@@ -52,6 +51,8 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 
 /**
@@ -78,23 +79,20 @@ public class RemoteClusterResourceProvider extends AbstractAuthorizedResourcePro
   /**
    * The key property ids for a Remote Cluster resource.
    */
-  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<>();
-  static {
-    keyPropertyIds.put(Resource.Type.RemoteCluster, CLUSTER_NAME_PROPERTY_ID);
-  }
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.RemoteCluster, CLUSTER_NAME_PROPERTY_ID)
+      .build();
 
   /**
    * The property ids for a Remote Cluster resource.
    */
-  private static Set<String> propertyIds = new HashSet<>();
-  static {
-    propertyIds.add(CLUSTER_NAME_PROPERTY_ID);
-    propertyIds.add(CLUSTER_ID_PROPERTY_ID);
-    propertyIds.add(CLUSTER_URL_PROPERTY_ID);
-    propertyIds.add(USERNAME_PROPERTY_ID);
-    propertyIds.add(PASSWORD_PROPERTY_ID);
-    propertyIds.add(SERVICES_PROPERTY_ID);
-  }
+  private static Set<String> propertyIds = Sets.newHashSet(
+      CLUSTER_NAME_PROPERTY_ID,
+      CLUSTER_ID_PROPERTY_ID,
+      CLUSTER_URL_PROPERTY_ID,
+      USERNAME_PROPERTY_ID,
+      PASSWORD_PROPERTY_ID,
+      SERVICES_PROPERTY_ID);
 
   @Inject
   private static RemoteAmbariClusterDAO remoteAmbariClusterDAO;
@@ -109,7 +107,7 @@ public class RemoteClusterResourceProvider extends AbstractAuthorizedResourcePro
    * Create a  new resource provider.
    */
   protected RemoteClusterResourceProvider() {
-    super(propertyIds, keyPropertyIds);
+    super(Resource.Type.RemoteCluster, propertyIds, keyPropertyIds);
 
     EnumSet<RoleAuthorization> requiredAuthorizations = EnumSet.of(RoleAuthorization.AMBARI_ADD_DELETE_CLUSTERS);
     setRequiredCreateAuthorizations(requiredAuthorizations);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
index 26e3b86..eb8334b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestResourceProvider.java
@@ -23,7 +23,6 @@ import static org.apache.ambari.server.controller.internal.HostComponentResource
 import static org.apache.ambari.server.controller.internal.HostComponentResourceProvider.HOST_COMPONENT_SERVICE_NAME_PROPERTY_ID;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -74,6 +73,7 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 
@@ -135,13 +135,18 @@ public class RequestResourceProvider extends AbstractControllerResourceProvider
   public static final String EXLUSIVE_ID = "exclusive";
   public static final String HAS_RESOURCE_FILTERS = "HAS_RESOURCE_FILTERS";
 
-  private static Set<String> pkPropertyIds =
-    new HashSet<>(Arrays.asList(new String[]{
-      REQUEST_ID_PROPERTY_ID}));
-
   private PredicateCompiler predicateCompiler = new PredicateCompiler();
 
+  /**
+   * The key property ids for a Request resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Request, REQUEST_ID_PROPERTY_ID)
+      .put(Resource.Type.Cluster, REQUEST_CLUSTER_NAME_PROPERTY_ID)
+      .build();
+
   static Set<String> PROPERTY_IDS = Sets.newHashSet(
+    REQUEST_ID_PROPERTY_ID,
     REQUEST_CLUSTER_NAME_PROPERTY_ID,
     REQUEST_CLUSTER_ID_PROPERTY_ID,
     REQUEST_STATUS_PROPERTY_ID,
@@ -175,14 +180,10 @@ public class RequestResourceProvider extends AbstractControllerResourceProvider
   /**
    * Create a  new resource provider for the given management controller.
    *
-   * @param propertyIds          the property ids
-   * @param keyPropertyIds       the key property ids
    * @param managementController the management controller
    */
-  RequestResourceProvider(Set<String> propertyIds,
-                          Map<Resource.Type, String> keyPropertyIds,
-                          AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  RequestResourceProvider(AmbariManagementController managementController) {
+    super(Resource.Type.Request, PROPERTY_IDS, keyPropertyIds, managementController);
   }
 
   // ----- ResourceProvider ------------------------------------------------
@@ -424,7 +425,7 @@ public class RequestResourceProvider extends AbstractControllerResourceProvider
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(Collections.singletonList(REQUEST_ID_PROPERTY_ID));
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestScheduleResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestScheduleResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestScheduleResourceProvider.java
index 4e25369..f556c9c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestScheduleResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RequestScheduleResourceProvider.java
@@ -18,7 +18,6 @@
 package org.apache.ambari.server.controller.internal;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -53,6 +52,9 @@ import org.apache.ambari.server.state.scheduler.Schedule;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 public class RequestScheduleResourceProvider extends AbstractControllerResourceProvider {
   private static final Logger LOG = LoggerFactory.getLogger
     (RequestScheduleResourceProvider.class);
@@ -115,27 +117,60 @@ public class RequestScheduleResourceProvider extends AbstractControllerResourceP
   protected static final String SCHEDULE_END_TIME_PROPERTY_ID =
     PropertyHelper.getPropertyId(REQUEST_SCHEDULE_SCHEDULE_PROPERTY_ID, "endTime");
 
-  private static Set<String> pkPropertyIds = new HashSet<>(Arrays
-    .asList(new String[]{REQUEST_SCHEDULE_ID_PROPERTY_ID}));
+  /**
+   * The key property ids for a RequestSchedule resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Cluster, REQUEST_SCHEDULE_CLUSTER_NAME_PROPERTY_ID)
+      .put(Resource.Type.RequestSchedule, REQUEST_SCHEDULE_ID_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a RequestSchedule resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      REQUEST_SCHEDULE_ID_PROPERTY_ID,
+      REQUEST_SCHEDULE_CLUSTER_NAME_PROPERTY_ID,
+      REQUEST_SCHEDULE_DESC_PROPERTY_ID,
+      REQUEST_SCHEDULE_STATUS_PROPERTY_ID,
+      REQUEST_SCHEDULE_LAST_STATUS_PROPERTY_ID,
+      REQUEST_SCHEDULE_BATCH_PROPERTY_ID,
+      REQUEST_SCHEDULE_SCHEDULE_PROPERTY_ID,
+      REQUEST_SCHEDULE_CREATE_USER_PROPERTY_ID,
+      REQUEST_SCHEDULE_AUTHENTICATED_USER_PROPERTY_ID,
+      REQUEST_SCHEDULE_UPDATE_USER_PROPERTY_ID,
+      REQUEST_SCHEDULE_CREATE_TIME_PROPERTY_ID,
+      REQUEST_SCHEDULE_UPDATE_TIME_PROPERTY_ID,
+      REQUEST_SCHEDULE_BATCH_SEPARATION_PROPERTY_ID,
+      REQUEST_SCHEDULE_BATCH_TOLERATION_PROPERTY_ID,
+      REQUEST_SCHEDULE_BATCH_REQUESTS_PROPERTY_ID,
+      BATCH_REQUEST_TYPE_PROPERTY_ID,
+      BATCH_REQUEST_URI_PROPERTY_ID,
+      BATCH_REQUEST_ORDER_ID_PROPERTY_ID,
+      BATCH_REQUEST_BODY_PROPERTY_ID,
+      SCHEDULE_DAYS_OF_MONTH_PROPERTY_ID,
+      SCHEDULE_MINUTES_PROPERTY_ID,
+      SCHEDULE_HOURS_PROPERTY_ID,
+      SCHEDULE_YEAR_PROPERTY_ID,
+      SCHEDULE_DAY_OF_WEEK_PROPERTY_ID,
+      SCHEDULE_MONTH_PROPERTY_ID,
+      SCHEDULE_START_TIME_PROPERTY_ID,
+      SCHEDULE_END_TIME_PROPERTY_ID);
 
   /**
    * Create a  new resource provider for the given management controller.
    *
-   * @param propertyIds          the property ids
-   * @param keyPropertyIds       the key property ids
    * @param managementController the management controller
    */
 
-  protected RequestScheduleResourceProvider(Set<String> propertyIds,
-      Map<Resource.Type, String> keyPropertyIds,
-        AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  protected RequestScheduleResourceProvider(AmbariManagementController managementController) {
+    super(Resource.Type.RequestSchedule, propertyIds, keyPropertyIds, managementController);
   }
 
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RoleAuthorizationResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RoleAuthorizationResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RoleAuthorizationResourceProvider.java
index 8dbe2bf..9ae1f47 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RoleAuthorizationResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RoleAuthorizationResourceProvider.java
@@ -100,7 +100,7 @@ public class RoleAuthorizationResourceProvider extends ReadOnlyResourceProvider
    * Create a new resource provider.
    */
   public RoleAuthorizationResourceProvider(AmbariManagementController managementController) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
+    super(Type.RoleAuthorization, PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentConfigurationResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentConfigurationResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentConfigurationResourceProvider.java
index b9e7d67..74f8a4d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentConfigurationResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentConfigurationResourceProvider.java
@@ -81,7 +81,7 @@ public class RootServiceComponentConfigurationResourceProvider extends AbstractA
   private RootServiceComponentConfigurationHandlerFactory rootServiceComponentConfigurationHandlerFactory;
 
   public RootServiceComponentConfigurationResourceProvider() {
-    super(PROPERTIES, PK_PROPERTY_MAP);
+    super(Resource.Type.RootServiceComponentConfiguration, PROPERTIES, PK_PROPERTY_MAP);
 
     Set<RoleAuthorization> authorizations = EnumSet.of(RoleAuthorization.AMBARI_MANAGE_CONFIGURATION);
     setRequiredCreateAuthorizations(authorizations);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
index dfca00e..3c7fb6d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProvider.java
@@ -38,7 +38,8 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
-import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 
 public class RootServiceComponentResourceProvider extends ReadOnlyResourceProvider {
 
@@ -57,12 +58,26 @@ public class RootServiceComponentResourceProvider extends ReadOnlyResourceProvid
   public static final String PROPERTIES_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + PROPERTIES;
   public static final String SERVER_CLOCK_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + SERVER_CLOCK;
 
-  private static final Set<String> PK_PROPERTY_IDS = ImmutableSet.of(SERVICE_NAME_PROPERTY_ID, COMPONENT_NAME_PROPERTY_ID);
-
-  protected RootServiceComponentResourceProvider(Set<String> propertyIds,
-      Map<Type, String> keyPropertyIds,
-      AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  /**
+   * The key property ids for a RootServiceComponent resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.RootService, SERVICE_NAME_PROPERTY_ID)
+      .put(Type.RootServiceComponent, COMPONENT_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a RootServiceComponent resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      SERVICE_NAME_PROPERTY_ID,
+      COMPONENT_NAME_PROPERTY_ID,
+      COMPONENT_VERSION_PROPERTY_ID,
+      PROPERTIES_PROPERTY_ID,
+      SERVER_CLOCK_PROPERTY_ID);
+
+  protected RootServiceComponentResourceProvider(AmbariManagementController managementController) {
+    super(Type.RootServiceComponent, propertyIds, keyPropertyIds, managementController);
   }
   
   @Override
@@ -116,7 +131,7 @@ public class RootServiceComponentResourceProvider extends ReadOnlyResourceProvid
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return PK_PROPERTY_IDS;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java
index c37bb2e..94c870b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProvider.java
@@ -39,7 +39,8 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
-import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 
 public class RootServiceHostComponentResourceProvider extends ReadOnlyResourceProvider {
 
@@ -59,12 +60,29 @@ public class RootServiceHostComponentResourceProvider extends ReadOnlyResourcePr
   public static final String COMPONENT_STATE_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + COMPONENT_STATE;
   public static final String PROPERTIES_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + PROPERTIES;
 
-  private static final Set<String> PK_PROPERTY_IDS = ImmutableSet.of(SERVICE_NAME_PROPERTY_ID, HOST_NAME_PROPERTY_ID, COMPONENT_NAME_PROPERTY_ID);
-
-  public RootServiceHostComponentResourceProvider(Set<String> propertyIds,
-      Map<Type, String> keyPropertyIds,
-      AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  /**
+   * The key property ids for a RootServiceHostComponent resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.RootService, SERVICE_NAME_PROPERTY_ID)
+      .put(Type.Host, HOST_NAME_PROPERTY_ID)
+      .put(Type.RootServiceComponent, COMPONENT_NAME_PROPERTY_ID)
+      .put(Type.RootServiceHostComponent, COMPONENT_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a RootServiceHostComponent resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      SERVICE_NAME_PROPERTY_ID,
+      HOST_NAME_PROPERTY_ID,
+      COMPONENT_NAME_PROPERTY_ID,
+      COMPONENT_VERSION_PROPERTY_ID,
+      COMPONENT_STATE_PROPERTY_ID,
+      PROPERTIES_PROPERTY_ID);
+
+  public RootServiceHostComponentResourceProvider(AmbariManagementController managementController) {
+    super(Type.RootServiceHostComponent, propertyIds, keyPropertyIds, managementController);
   }
 
   
@@ -118,7 +136,7 @@ public class RootServiceHostComponentResourceProvider extends ReadOnlyResourcePr
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return PK_PROPERTY_IDS;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
   // Get the root service host components for the given set of requests

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceResourceProvider.java
index b24a94a..dcc8970 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/RootServiceResourceProvider.java
@@ -37,7 +37,8 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
-import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 
 public class RootServiceResourceProvider extends ReadOnlyResourceProvider {
 
@@ -45,12 +46,21 @@ public class RootServiceResourceProvider extends ReadOnlyResourceProvider {
   public static final String SERVICE_NAME = "service_name";
   public static final String SERVICE_NAME_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + SERVICE_NAME;
 
-  private static final Set<String> PK_PROPERTY_IDS = ImmutableSet.of(SERVICE_NAME_PROPERTY_ID);
-
-  protected RootServiceResourceProvider(Set<String> propertyIds,
-      Map<Type, String> keyPropertyIds,
-      AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  /**
+   * The key property ids for a RootService resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.RootService, SERVICE_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a RootService resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      SERVICE_NAME_PROPERTY_ID);
+
+  protected RootServiceResourceProvider(AmbariManagementController managementController) {
+    super(Type.RootService, propertyIds, keyPropertyIds, managementController);
   }
   
   @Override
@@ -94,7 +104,7 @@ public class RootServiceResourceProvider extends ReadOnlyResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return PK_PROPERTY_IDS;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceConfigVersionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceConfigVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceConfigVersionResourceProvider.java
index e7dbbc0..1019e57 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceConfigVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ServiceConfigVersionResourceProvider.java
@@ -115,7 +115,7 @@ public class ServiceConfigVersionResourceProvider extends
    */
   ServiceConfigVersionResourceProvider(
       AmbariManagementController managementController) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
+    super(Resource.Type.ServiceConfigVersion, PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
 
     setRequiredGetAuthorizations(EnumSet.of(RoleAuthorization.CLUSTER_VIEW_CONFIGS,
         RoleAuthorization.SERVICE_VIEW_CONFIGS,

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/SettingResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/SettingResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/SettingResourceProvider.java
index 5235ef4..dd30904 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/SettingResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/SettingResourceProvider.java
@@ -103,7 +103,7 @@ public class SettingResourceProvider extends AbstractAuthorizedResourceProvider
   }
 
   protected SettingResourceProvider() {
-    super(propertyIds, keyPropertyIds);
+    super(Resource.Type.Setting, propertyIds, keyPropertyIds);
     EnumSet<RoleAuthorization> requiredAuthorizations = EnumSet.of(RoleAuthorization.AMBARI_MANAGE_SETTINGS);
     setRequiredCreateAuthorizations(requiredAuthorizations);
     setRequiredDeleteAuthorizations(requiredAuthorizations);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackAdvisorResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackAdvisorResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackAdvisorResourceProvider.java
index 67c177e..599b7c7 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackAdvisorResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackAdvisorResourceProvider.java
@@ -39,6 +39,7 @@ import org.apache.ambari.server.api.services.stackadvisor.recommendations.Recomm
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.spi.Request;
+import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.state.ChangedConfigInfo;
@@ -93,9 +94,9 @@ public abstract class StackAdvisorResourceProvider extends ReadOnlyResourceProvi
     configuration = serverConfig;
   }
 
-  protected StackAdvisorResourceProvider(Set<String> propertyIds, Map<Type, String> keyPropertyIds,
-      AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  protected StackAdvisorResourceProvider(Resource.Type type, Set<String> propertyIds, Map<Type, String> keyPropertyIds,
+                                         AmbariManagementController managementController) {
+    super(type, propertyIds, keyPropertyIds, managementController);
   }
 
   protected abstract String getRequestTypePropertyId();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProvider.java
index d042f86..292d4c1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProvider.java
@@ -184,7 +184,7 @@ public class StackArtifactResourceProvider extends AbstractControllerResourcePro
    * @param managementController ambari controller
    */
   protected StackArtifactResourceProvider(AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+    super(Resource.Type.StackArtifact, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationDependencyResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationDependencyResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationDependencyResourceProvider.java
index 366b3ef..59341a0 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationDependencyResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationDependencyResourceProvider.java
@@ -19,7 +19,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
@@ -39,6 +38,9 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 public class StackConfigurationDependencyResourceProvider extends
     ReadOnlyResourceProvider {
 
@@ -60,15 +62,31 @@ public class StackConfigurationDependencyResourceProvider extends
   public static final String DEPENDENCY_TYPE_PROPERTY_ID = PropertyHelper
       .getPropertyId("StackConfigurationDependency", "dependency_type");
 
-  private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{STACK_NAME_PROPERTY_ID,
-      STACK_VERSION_PROPERTY_ID, SERVICE_NAME_PROPERTY_ID,
-      PROPERTY_NAME_PROPERTY_ID, DEPENDENCY_NAME_PROPERTY_ID}));
-
-  protected StackConfigurationDependencyResourceProvider(Set<String> propertyIds,
-                                                         Map<Type, String> keyPropertyIds,
-                                                         AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  /**
+   * The key property ids for a StackConfigurationDependency resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.Stack, STACK_NAME_PROPERTY_ID)
+      .put(Type.StackVersion, STACK_VERSION_PROPERTY_ID)
+      .put(Type.StackService, SERVICE_NAME_PROPERTY_ID)
+      .put(Type.StackConfiguration, PROPERTY_NAME_PROPERTY_ID)
+      .put(Type.StackLevelConfiguration, PROPERTY_NAME_PROPERTY_ID)
+      .put(Type.StackConfigurationDependency, DEPENDENCY_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a StackConfigurationDependency resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      STACK_NAME_PROPERTY_ID,
+      STACK_VERSION_PROPERTY_ID,
+      SERVICE_NAME_PROPERTY_ID,
+      PROPERTY_NAME_PROPERTY_ID,
+      DEPENDENCY_NAME_PROPERTY_ID,
+      DEPENDENCY_TYPE_PROPERTY_ID);
+
+  protected StackConfigurationDependencyResourceProvider(AmbariManagementController managementController) {
+    super(Type.StackConfigurationDependency, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override
@@ -137,7 +155,7 @@ public class StackConfigurationDependencyResourceProvider extends
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProvider.java
index 6f5b0f8..7b6c658 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProvider.java
@@ -19,7 +19,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
@@ -40,6 +39,9 @@ import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.commons.lang.StringUtils;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 public class StackConfigurationResourceProvider extends
     ReadOnlyResourceProvider {
 
@@ -79,15 +81,35 @@ public class StackConfigurationResourceProvider extends
   public static final String PROPERTY_FINAL_PROPERTY_ID = PropertyHelper
       .getPropertyId("StackConfigurations", "final");
 
+  /**
+   * The key property ids for a StackConfiguration resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.Stack, STACK_NAME_PROPERTY_ID)
+      .put(Type.StackVersion, STACK_VERSION_PROPERTY_ID)
+      .put(Type.StackService, SERVICE_NAME_PROPERTY_ID)
+      .put(Type.StackConfiguration, PROPERTY_NAME_PROPERTY_ID)
+      .build();
 
-  private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{STACK_NAME_PROPERTY_ID,
-      STACK_VERSION_PROPERTY_ID, SERVICE_NAME_PROPERTY_ID, PROPERTY_NAME_PROPERTY_ID}));
-
-  protected StackConfigurationResourceProvider(Set<String> propertyIds,
-      Map<Type, String> keyPropertyIds,
-      AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  /**
+   * The property ids for a StackConfiguration resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      STACK_NAME_PROPERTY_ID,
+      STACK_VERSION_PROPERTY_ID,
+      SERVICE_NAME_PROPERTY_ID,
+      PROPERTY_NAME_PROPERTY_ID,
+      PROPERTY_VALUE_PROPERTY_ID,
+      PROPERTY_VALUE_ATTRIBUTES_PROPERTY_ID,
+      PROPERTY_DEPENDS_ON_PROPERTY_ID,
+      PROPERTY_DESCRIPTION_PROPERTY_ID,
+      PROPERTY_DISPLAY_NAME_PROPERTY_ID,
+      PROPERTY_PROPERTY_TYPE_PROPERTY_ID,
+      PROPERTY_TYPE_PROPERTY_ID,
+      PROPERTY_FINAL_PROPERTY_ID);
+
+  protected StackConfigurationResourceProvider(AmbariManagementController managementController) {
+    super(Type.StackConfiguration, propertyIds, keyPropertyIds, managementController);
   }
 
 
@@ -188,7 +210,7 @@ public class StackConfigurationResourceProvider extends
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackDependencyResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackDependencyResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackDependencyResourceProvider.java
index 8b69c6a..d28b5d9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackDependencyResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackDependencyResourceProvider.java
@@ -19,7 +19,6 @@
 package org.apache.ambari.server.controller.internal;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
@@ -42,6 +41,9 @@ import org.apache.ambari.server.state.AutoDeployInfo;
 import org.apache.ambari.server.state.DependencyConditionInfo;
 import org.apache.ambari.server.state.DependencyInfo;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * Resource provider for Stack Dependency resource.
  */
@@ -70,10 +72,31 @@ public class StackDependencyResourceProvider extends AbstractResourceProvider {
   protected static final String AUTO_DEPLOY_LOCATION_ID = PropertyHelper
       .getPropertyId("auto_deploy", "location");
 
-  // Primary Key Fields
-  private static Set<String> pkPropertyIds =
-    new HashSet<>(Arrays.asList(new String[]{
-      SERVICE_NAME_ID, COMPONENT_NAME_ID}));
+  /**
+   * The key property ids for a StackDependency resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Stack, STACK_NAME_ID)
+      .put(Resource.Type.StackVersion, STACK_VERSION_ID)
+      .put(Resource.Type.StackService, DEPENDENT_SERVICE_NAME_ID)
+      .put(Resource.Type.StackServiceComponent, DEPENDENT_COMPONENT_NAME_ID)
+      .put(Resource.Type.StackServiceComponentDependency, COMPONENT_NAME_ID)
+      .build();
+
+  /**
+   * The property ids for a StackDependency resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      STACK_NAME_ID,
+      STACK_VERSION_ID,
+      DEPENDENT_SERVICE_NAME_ID,
+      DEPENDENT_COMPONENT_NAME_ID,
+      SERVICE_NAME_ID,
+      COMPONENT_NAME_ID,
+      SCOPE_ID,
+      CONDITIONS_ID,
+      AUTO_DEPLOY_ENABLED_ID,
+      AUTO_DEPLOY_LOCATION_ID);
 
   /**
    * Provides stack information
@@ -85,12 +108,8 @@ public class StackDependencyResourceProvider extends AbstractResourceProvider {
 
   /**
    * Constructor.
-   *
-   * @param propertyIds    the property ids
-   * @param keyPropertyIds the key property ids
    */
-  protected StackDependencyResourceProvider(Set<String> propertyIds,
-                                            Map<Resource.Type, String> keyPropertyIds) {
+  protected StackDependencyResourceProvider() {
     super(propertyIds, keyPropertyIds);
   }
 
@@ -108,7 +127,7 @@ public class StackDependencyResourceProvider extends AbstractResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackLevelConfigurationResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackLevelConfigurationResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackLevelConfigurationResourceProvider.java
index 819507b..7519da6 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackLevelConfigurationResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackLevelConfigurationResourceProvider.java
@@ -19,7 +19,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
@@ -40,6 +39,9 @@ import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.commons.lang.StringUtils;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 public class StackLevelConfigurationResourceProvider extends
     ReadOnlyResourceProvider {
 
@@ -76,15 +78,33 @@ public class StackLevelConfigurationResourceProvider extends
   public static final String PROPERTY_FINAL_PROPERTY_ID = PropertyHelper
       .getPropertyId("StackLevelConfigurations", "final");
 
+  /**
+   * The key property ids for a StackLevelConfiguration resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.Stack, STACK_NAME_PROPERTY_ID)
+      .put(Type.StackVersion, STACK_VERSION_PROPERTY_ID)
+      .put(Type.StackLevelConfiguration, PROPERTY_NAME_PROPERTY_ID)
+      .build();
 
-  private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{STACK_NAME_PROPERTY_ID,
-      STACK_VERSION_PROPERTY_ID, PROPERTY_NAME_PROPERTY_ID}));
-
-  protected StackLevelConfigurationResourceProvider(Set<String> propertyIds,
-      Map<Type, String> keyPropertyIds,
-      AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  /**
+   * The property ids for a StackLevelConfiguration resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      STACK_NAME_PROPERTY_ID,
+      STACK_VERSION_PROPERTY_ID,
+      PROPERTY_NAME_PROPERTY_ID,
+      PROPERTY_DISPLAY_NAME_PROPERTY_ID,
+      PROPERTY_VALUE_PROPERTY_ID,
+      PROPERTY_VALUE_ATTRIBUTES_PROPERTY_ID,
+      DEPENDS_ON_PROPERTY_ID,
+      PROPERTY_DESCRIPTION_PROPERTY_ID,
+      PROPERTY_PROPERTY_TYPE_PROPERTY_ID,
+      PROPERTY_TYPE_PROPERTY_ID,
+      PROPERTY_FINAL_PROPERTY_ID);
+
+  protected StackLevelConfigurationResourceProvider(AmbariManagementController managementController) {
+    super(Type.StackLevelConfiguration, propertyIds, keyPropertyIds, managementController);
   }
 
 
@@ -181,7 +201,7 @@ public class StackLevelConfigurationResourceProvider extends
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 }


[02/13] ambari git commit: AMBARI-22445. Warn the user appropriately for default MySQL server install for Hive (Part 2) (vsubramanian)

Posted by rl...@apache.org.
AMBARI-22445. Warn the user appropriately for default MySQL server install for Hive (Part 2) (vsubramanian)


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

Branch: refs/heads/branch-feature-AMBARI-20859
Commit: 5caac19def93748874f50661aabd87f5135d2a0f
Parents: 47be7ed
Author: Vivek Ratnavel Subramanian <vi...@gmail.com>
Authored: Fri Dec 1 16:34:33 2017 -0800
Committer: Vivek Ratnavel Subramanian <vi...@gmail.com>
Committed: Fri Dec 1 16:34:33 2017 -0800

----------------------------------------------------------------------
 ambari-web/app/data/db_properties_info.js       | 15 +++++--
 ambari-web/app/messages.js                      |  3 ++
 ambari-web/app/views/common/controls_view.js    |  5 ++-
 .../test/views/common/controls_view_test.js     | 46 ++++++++------------
 4 files changed, 36 insertions(+), 33 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/5caac19d/ambari-web/app/data/db_properties_info.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/data/db_properties_info.js b/ambari-web/app/data/db_properties_info.js
index 6d93c2a..3b4b856 100644
--- a/ambari-web/app/data/db_properties_info.js
+++ b/ambari-web/app/data/db_properties_info.js
@@ -68,19 +68,28 @@ module.exports = {
       },
       'driver': 'com.mysql.jdbc.Driver',
       'sql_jar_connector': '/usr/share/java/mysql-connector-java.jar',
-      'db_type': 'mysql'
+      'db_type': 'mysql',
+      'db_name': 'MySQL',
+      'driver_download_url': 'https://dev.mysql.com/downloads/connector/j/',
+      'driver_name': 'MySQL Connector/J JDBC Driver'
     },
     'POSTGRES': {
       'connection_url': 'jdbc:postgresql://{0}:5432/{1}',
       'driver': 'org.postgresql.Driver',
       'sql_jar_connector': '/usr/share/java/postgresql.jar',
-      'db_type': 'postgres'
+      'db_type': 'postgres',
+      'db_name': 'PostgreSQL',
+      'driver_download_url': 'https://jdbc.postgresql.org/',
+      'driver_name': 'PostgreSQL JDBC Driver'
     },
     'ORACLE': {
       'connection_url': 'jdbc:oracle:thin:@//{0}:1521/{1}',
       'driver': 'oracle.jdbc.driver.OracleDriver',
       'sql_jar_connector': '/usr/share/java/ojdbc6.jar',
-      'db_type': 'oracle'
+      'db_type': 'oracle',
+      'db_name': 'Oracle',
+      'driver_download_url': 'http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html',
+      'driver_name': 'Oracle JDBC Driver'
     },
     'MSSQL': {
       'connection_url': 'jdbc:sqlserver://{0};databaseName={1}',

http://git-wip-us.apache.org/repos/asf/ambari/blob/5caac19d/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index b294877..06deecb 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -2262,6 +2262,9 @@ Em.I18n.translations = {
   'services.service.config.configHistory.makeCurrent.message': 'Created from service config version {0}',
   'services.service.config.configHistory.comparing': 'Comparing',
   'services.service.config.setRecommendedValue': 'Set Recommended',
+  'services.service.config.database.msg.jdbcSetup.detailed': 'To use {0} with Hive, you must <a href="{3}" target="_blank">' +
+    'download the {4} from {0}</a>. Once downloaded to the Ambari Server host, run: <br/>' +
+    '<b>ambari-server setup --jdbc-db={1} --jdbc-driver=/path/to/{1}/{2}</b>',
 
   'services.service.widgets.list-widget.nothingSelected': 'Nothing selected',
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/5caac19d/ambari-web/app/views/common/controls_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/controls_view.js b/ambari-web/app/views/common/controls_view.js
index 63d08ce..747d96c 100644
--- a/ambari-web/app/views/common/controls_view.js
+++ b/ambari-web/app/views/common/controls_view.js
@@ -762,11 +762,14 @@ App.ServiceConfigRadioButtons = Ember.View.extend(App.ServiceConfigCalculateId,
     var shouldAdditionalViewsBeSet = currentDB && checkDatabase && handledProperties.contains(this.get('serviceConfig.name')),
       driver = this.getDefaultPropertyValue('sql_jar_connector') ? this.getDefaultPropertyValue('sql_jar_connector').split("/").pop() : 'driver.jar',
       dbType = this.getDefaultPropertyValue('db_type'),
+      dbName = this.getDefaultPropertyValue('db_name'),
+      driverName = this.getDefaultPropertyValue('driver_name'),
+      driverDownloadUrl = this.getDefaultPropertyValue('driver_download_url'),
       additionalView1 = shouldAdditionalViewsBeSet && !this.get('isNewDb') ? App.CheckDBConnectionView.extend({databaseName: dbType}) : null,
       additionalView2 = shouldAdditionalViewsBeSet ? Ember.View.extend({
         template: Ember.Handlebars.compile('<div class="alert alert-warning">{{{view.message}}}</div>'),
         message: function() {
-          return Em.I18n.t('services.service.config.database.msg.jdbcSetup').format(dbType, driver);
+          return Em.I18n.t('services.service.config.database.msg.jdbcSetup.detailed').format(dbName, dbType, driver, driverDownloadUrl, driverName);
         }.property()
       }) : null;
     if (propertyAppendTo1) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/5caac19d/ambari-web/test/views/common/controls_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/controls_view_test.js b/ambari-web/test/views/common/controls_view_test.js
index 76742fa..b6f19ef 100644
--- a/ambari-web/test/views/common/controls_view_test.js
+++ b/ambari-web/test/views/common/controls_view_test.js
@@ -35,6 +35,9 @@ describe('App.ServiceConfigRadioButtons', function () {
         {
           dbType: 'mysql',
           driver: 'mysql-connector-java.jar',
+          dbName: 'MySQL',
+          downloadUrl: 'https://dev.mysql.com/downloads/connector/j/',
+          driverName: 'MySQL Connector/J JDBC Driver',
           serviceConfig: {
             name: 'hive_database',
             value: 'New MySQL Database',
@@ -65,6 +68,9 @@ describe('App.ServiceConfigRadioButtons', function () {
         {
           dbType: 'postgres',
           driver: 'postgresql.jar',
+          dbName: 'PostgreSQL',
+          downloadUrl: 'https://jdbc.postgresql.org/',
+          driverName: 'PostgreSQL JDBC Driver',
           serviceConfig: {
             name: 'hive_database',
             value: 'Existing PostgreSQL Database',
@@ -95,6 +101,9 @@ describe('App.ServiceConfigRadioButtons', function () {
         {
           dbType: 'derby',
           driver: 'driver.jar',
+          dbName: 'Derby',
+          downloadUrl: 'http://',
+          driverName: 'Derby JDBC Driver',
           serviceConfig: {
             name: 'oozie_database',
             value: 'New Derby Database',
@@ -125,6 +134,9 @@ describe('App.ServiceConfigRadioButtons', function () {
         {
           dbType: 'oracle',
           driver: 'ojdbc6.jar',
+          dbName: 'Oracle',
+          downloadUrl: 'http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html',
+          driverName: 'Oracle JDBC Driver',
           serviceConfig: {
             name: 'oozie_database',
             value: 'Existing Oracle Database',
@@ -155,6 +167,9 @@ describe('App.ServiceConfigRadioButtons', function () {
         {
           dbType: 'mysql',
           driver: 'mysql-connector-java.jar',
+          dbName: 'MySQL',
+          downloadUrl: 'https://dev.mysql.com/downloads/connector/j/',
+          driverName: 'MySQL Connector/J JDBC Driver',
           serviceConfig: {
             name: 'DB_FLAVOR',
             value: 'MYSQL',
@@ -179,34 +194,6 @@ describe('App.ServiceConfigRadioButtons', function () {
           isAdditionalView1Null: true,
           isAdditionalView2Null: true,
           title: 'Ranger, HDP 2.2, external database'
-        },
-        {
-          dbType: 'mssql',
-          driver: 'sqljdbc4.jar',
-          serviceConfig: {
-            name: 'DB_FLAVOR',
-            value: 'MSSQL',
-            serviceName: 'RANGER'
-          },
-          controller: Em.Object.create({
-            selectedService: {
-              configs: [
-                Em.Object.create({
-                  name: 'ranger.jpa.jdbc.url'
-                }),
-                Em.Object.create({
-                  name: 'DB_FLAVOR'
-                })
-              ]
-            }
-          }),
-          currentStackVersion: 'HDP-2.3',
-          rangerVersion: '0.5.0',
-          propertyAppendTo1: 'ranger.jpa.jdbc.url',
-          propertyAppendTo2: 'DB_FLAVOR',
-          isAdditionalView1Null: false,
-          isAdditionalView2Null: false,
-          title: 'Ranger, HDP 2.3, external database'
         }
       ];
     var rangerVersion = '';
@@ -266,7 +253,8 @@ describe('App.ServiceConfigRadioButtons', function () {
 
         if (!item.isAdditionalView2Null) {
           it('additionalView2.message is valid', function () {
-            expect(additionalView2.create().get('message')).to.equal(Em.I18n.t('services.service.config.database.msg.jdbcSetup').format(item.dbType, item.driver));
+            var message = Em.I18n.t('services.service.config.database.msg.jdbcSetup.detailed').format(item.dbName, item.dbType, item.driver, item.downloadUrl, item.driverName);
+            expect(additionalView2.create().get('message')).to.equal(message);
           });
         }
 


[06/13] ambari git commit: AMBARI-22353. Remove properties.json And Switch To Adding Properties to ResourceProviders Dynamically (dlysnichenko)

Posted by rl...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackResourceProvider.java
index ead4f6d..59b42f1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackResourceProvider.java
@@ -18,7 +18,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
@@ -40,18 +39,29 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 public class StackResourceProvider extends ReadOnlyResourceProvider {
 
   public static final String STACK_NAME_PROPERTY_ID = PropertyHelper
       .getPropertyId("Stacks", "stack_name");
 
-  private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{STACK_NAME_PROPERTY_ID}));
-
-  protected StackResourceProvider(Set<String> propertyIds,
-      Map<Type, String> keyPropertyIds,
-      AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  /**
+   * The key property ids for a Stack resource.
+   */
+  protected static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.Stack, STACK_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a Stack resource.
+   */
+  protected static Set<String> propertyIds = Sets.newHashSet(
+      STACK_NAME_PROPERTY_ID);
+
+  protected StackResourceProvider(AmbariManagementController managementController) {
+    super(Type.Stack, propertyIds, keyPropertyIds, managementController);
   }
 
 
@@ -120,6 +130,6 @@ public class StackResourceProvider extends ReadOnlyResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceComponentResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceComponentResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceComponentResourceProvider.java
index b9661bb..a221248 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceComponentResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceComponentResourceProvider.java
@@ -18,7 +18,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
@@ -39,6 +38,9 @@ import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.state.AutoDeployInfo;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 public class StackServiceComponentResourceProvider extends
     ReadOnlyResourceProvider {
   
@@ -102,15 +104,43 @@ public class StackServiceComponentResourceProvider extends
   private static final String AUTO_DEPLOY_LOCATION_ID = PropertyHelper.getPropertyId(
       "auto_deploy", "location");
 
-  private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{STACK_NAME_PROPERTY_ID,
-      STACK_VERSION_PROPERTY_ID, SERVICE_NAME_PROPERTY_ID,
-      COMPONENT_NAME_PROPERTY_ID}));
-
-  protected StackServiceComponentResourceProvider(Set<String> propertyIds,
-      Map<Type, String> keyPropertyIds,
-      AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  /**
+   * The key property ids for a StackServiceComponent resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.Stack, STACK_NAME_PROPERTY_ID)
+      .put(Type.StackVersion, STACK_VERSION_PROPERTY_ID)
+      .put(Type.StackService, SERVICE_NAME_PROPERTY_ID)
+      .put(Type.StackServiceComponent, COMPONENT_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a StackServiceComponent resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      STACK_NAME_PROPERTY_ID,
+      STACK_VERSION_PROPERTY_ID,
+      SERVICE_NAME_PROPERTY_ID,
+      COMPONENT_NAME_PROPERTY_ID,
+      COMPONENT_DISPLAY_NAME_PROPERTY_ID,
+      COMPONENT_CATEGORY_PROPERTY_ID,
+      IS_CLIENT_PROPERTY_ID,
+      IS_MASTER_PROPERTY_ID,
+      CARDINALITY_ID,
+      ADVERTISE_VERSION_ID,
+      DECOMISSION_ALLOWED_ID,
+      REASSIGN_ALLOWED_ID,
+      CUSTOM_COMMANDS_PROPERTY_ID,
+      HAS_BULK_COMMANDS_PROPERTY_ID,
+      BULK_COMMANDS_DISPLAY_NAME_PROPERTY_ID,
+      BULK_COMMANDS_MASTER_COMPONENT_NAME_PROPERTY_ID,
+      RECOVERY_ENABLED,
+      ROLLING_RESTART_SUPPORTED,
+      AUTO_DEPLOY_ENABLED_ID,
+      AUTO_DEPLOY_LOCATION_ID);
+
+  protected StackServiceComponentResourceProvider(AmbariManagementController managementController) {
+    super(Type.StackServiceComponent, propertyIds, keyPropertyIds, managementController);
   }
 
 
@@ -222,7 +252,7 @@ public class StackServiceComponentResourceProvider extends
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceResourceProvider.java
index 8727741..a4bf32b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackServiceResourceProvider.java
@@ -19,7 +19,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
@@ -41,6 +40,8 @@ import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.state.kerberos.KerberosServiceDescriptorFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 
 
@@ -101,9 +102,37 @@ public class StackServiceResourceProvider extends ReadOnlyResourceProvider {
   private static final String SUPPORT_DELETE_VIA_UI = PropertyHelper.getPropertyId(
       "StackServices", "support_delete_via_ui");
 
-  private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{STACK_NAME_PROPERTY_ID,
-      STACK_VERSION_PROPERTY_ID, SERVICE_NAME_PROPERTY_ID}));
+  /**
+   * The key property ids for a StackVersion resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.Stack, STACK_NAME_PROPERTY_ID)
+      .put(Type.StackVersion, STACK_VERSION_PROPERTY_ID)
+      .put(Type.StackService, SERVICE_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a StackVersion resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      SERVICE_NAME_PROPERTY_ID,
+      SERVICE_TYPE_PROPERTY_ID,
+      STACK_NAME_PROPERTY_ID,
+      STACK_VERSION_PROPERTY_ID,
+      SERVICE_DISPLAY_NAME_PROPERTY_ID,
+      USER_NAME_PROPERTY_ID,
+      COMMENTS_PROPERTY_ID,
+      SELECTION_PROPERTY_ID,
+      VERSION_PROPERTY_ID,
+      CONFIG_TYPES,
+      REQUIRED_SERVICES_ID,
+      SERVICE_CHECK_SUPPORTED_PROPERTY_ID,
+      CUSTOM_COMMANDS_PROPERTY_ID,
+      SERVICE_PROPERTIES_PROPERTY_ID,
+      CREDENTIAL_STORE_SUPPORTED,
+      CREDENTIAL_STORE_REQUIRED,
+      CREDENTIAL_STORE_ENABLED,
+      SUPPORT_DELETE_VIA_UI);
 
   /**
    * KerberosServiceDescriptorFactory used to create KerberosServiceDescriptor instances
@@ -111,10 +140,8 @@ public class StackServiceResourceProvider extends ReadOnlyResourceProvider {
   @Inject
   private static KerberosServiceDescriptorFactory kerberosServiceDescriptorFactory;
 
-  protected StackServiceResourceProvider(Set<String> propertyIds,
-      Map<Type, String> keyPropertyIds,
-      AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  protected StackServiceResourceProvider(AmbariManagementController managementController) {
+    super(Type.StackService, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override
@@ -226,7 +253,7 @@ public class StackServiceResourceProvider extends ReadOnlyResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java
index 094c75b..f2e6d1a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StackVersionResourceProvider.java
@@ -19,7 +19,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
@@ -40,6 +39,9 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 @StaticallyInject
 public class StackVersionResourceProvider extends ReadOnlyResourceProvider {
 
@@ -55,13 +57,32 @@ public class StackVersionResourceProvider extends ReadOnlyResourceProvider {
   public static final String STACK_MIN_JDK     = PropertyHelper.getPropertyId("Versions", "min_jdk");
   public static final String STACK_MAX_JDK     = PropertyHelper.getPropertyId("Versions", "max_jdk");
 
-  private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{STACK_NAME_PROPERTY_ID, STACK_VERSION_PROPERTY_ID}));
-
-  protected StackVersionResourceProvider(Set<String> propertyIds,
-      Map<Type, String> keyPropertyIds,
-      AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  /**
+   * The key property ids for a StackVersion resource.
+   */
+  protected static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.Stack, STACK_NAME_PROPERTY_ID)
+      .put(Type.StackVersion, STACK_VERSION_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a StackVersion resource.
+   */
+  protected static Set<String> propertyIds = Sets.newHashSet(
+      STACK_VERSION_PROPERTY_ID,
+      STACK_NAME_PROPERTY_ID,
+      STACK_MIN_VERSION_PROPERTY_ID,
+      STACK_ACTIVE_PROPERTY_ID,
+      STACK_VALID_PROPERTY_ID,
+      STACK_ERROR_SET,
+      STACK_CONFIG_TYPES,
+      STACK_PARENT_PROPERTY_ID,
+      UPGRADE_PACKS_PROPERTY_ID,
+      STACK_MIN_JDK,
+      STACK_MAX_JDK);
+
+  protected StackVersionResourceProvider(AmbariManagementController managementController) {
+    super(Type.StackVersion, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override
@@ -140,7 +161,7 @@ public class StackVersionResourceProvider extends ReadOnlyResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StageResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StageResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StageResourceProvider.java
index c4251c1..0b9cd79 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StageResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/StageResourceProvider.java
@@ -150,7 +150,7 @@ public class StageResourceProvider extends AbstractControllerResourceProvider im
    * @param managementController  the Ambari management controller
    */
   StageResourceProvider(AmbariManagementController managementController) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
+    super(Resource.Type.Stage, PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
   }
 
   // ----- AbstractResourceProvider ------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TargetClusterResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TargetClusterResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TargetClusterResourceProvider.java
index d0c37f5..be28b54 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TargetClusterResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TargetClusterResourceProvider.java
@@ -18,7 +18,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -39,6 +38,9 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * DR target cluster resource provider.
  */
@@ -52,20 +54,29 @@ public class TargetClusterResourceProvider extends AbstractDRResourceProvider {
   protected static final String CLUSTER_LOCATIONS_PROPERTY_ID  = PropertyHelper.getPropertyId("Cluster", "locations");
   protected static final String CLUSTER_PROPERTIES_PROPERTY_ID = PropertyHelper.getPropertyId("Cluster", "properties");
 
-  private static Set<String> pkPropertyIds =
-    new HashSet<>(Arrays.asList(new String[]{
-      CLUSTER_NAME_PROPERTY_ID}));
+  /**
+   * The key property ids for a TargetCluster resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Cluster, CLUSTER_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a TargetCluster resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      CLUSTER_NAME_PROPERTY_ID,
+      CLUSTER_COLO_PROPERTY_ID,
+      CLUSTER_INTERFACES_PROPERTY_ID,
+      CLUSTER_LOCATIONS_PROPERTY_ID,
+      CLUSTER_PROPERTIES_PROPERTY_ID);
 
   /**
    * Construct a provider.
    *
    * @param ivoryService    the ivory service
-   * @param propertyIds     the properties associated with this provider
-   * @param keyPropertyIds  the key property ids
    */
-  public TargetClusterResourceProvider(IvoryService ivoryService,
-                                       Set<String> propertyIds,
-                                       Map<Resource.Type, String> keyPropertyIds) {
+  public TargetClusterResourceProvider(IvoryService ivoryService) {
     super(propertyIds, keyPropertyIds, ivoryService);
   }
 
@@ -151,7 +162,7 @@ public class TargetClusterResourceProvider extends AbstractDRResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskAttemptResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskAttemptResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskAttemptResourceProvider.java
index 3af7bb1..a6df9be 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskAttemptResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskAttemptResourceProvider.java
@@ -22,7 +22,6 @@ import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -45,6 +44,9 @@ import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * Resource provider for task attempt resources.
  */
@@ -81,23 +83,41 @@ public class TaskAttemptResourceProvider extends
   protected static final String TASK_ATTEMPT_LOCALITY_PROPERTY_ID = PropertyHelper
       .getPropertyId("TaskAttempt", "locality");
 
-  private static final Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{TASK_ATTEMPT_CLUSTER_NAME_PROPERTY_ID,
-      TASK_ATTEMPT_WORKFLOW_ID_PROPERTY_ID,
-      TASK_ATTEMPT_JOB_ID_PROPERTY_ID, TASK_ATTEMPT_ID_PROPERTY_ID}));
-
   protected TaskAttemptFetcher taskAttemptFetcher;
 
   /**
+   * The key property ids for a TaskAttempt resource.
+   */
+  protected static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.Cluster, TASK_ATTEMPT_CLUSTER_NAME_PROPERTY_ID)
+      .put(Type.Workflow, TASK_ATTEMPT_WORKFLOW_ID_PROPERTY_ID)
+      .put(Type.Job, TASK_ATTEMPT_JOB_ID_PROPERTY_ID)
+      .put(Type.TaskAttempt, TASK_ATTEMPT_ID_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a TaskAttempt resource.
+   */
+  protected static Set<String> propertyIds = Sets.newHashSet(
+      TASK_ATTEMPT_CLUSTER_NAME_PROPERTY_ID,
+      TASK_ATTEMPT_WORKFLOW_ID_PROPERTY_ID,
+      TASK_ATTEMPT_JOB_ID_PROPERTY_ID,
+      TASK_ATTEMPT_ID_PROPERTY_ID,
+      TASK_ATTEMPT_TYPE_PROPERTY_ID,
+      TASK_ATTEMPT_START_TIME_PROPERTY_ID,
+      TASK_ATTEMPT_FINISH_TIME_PROPERTY_ID,
+      TASK_ATTEMPT_MAP_FINISH_TIME_PROPERTY_ID,
+      TASK_ATTEMPT_SHUFFLE_FINISH_TIME_PROPERTY_ID,
+      TASK_ATTEMPT_SORT_FINISH_TIME_PROPERTY_ID,
+      TASK_ATTEMPT_INPUT_BYTES_PROPERTY_ID,
+      TASK_ATTEMPT_OUTPUT_BYTES_PROPERTY_ID,
+      TASK_ATTEMPT_STATUS_PROPERTY_ID,
+      TASK_ATTEMPT_LOCALITY_PROPERTY_ID);
+
+  /**
    * Create a new task attempt resource provider.
-   * 
-   * @param propertyIds
-   *          the property ids
-   * @param keyPropertyIds
-   *          the key property ids
    */
-  protected TaskAttemptResourceProvider(Set<String> propertyIds,
-      Map<Type,String> keyPropertyIds) {
+  protected TaskAttemptResourceProvider() {
     super(propertyIds, keyPropertyIds);
     taskAttemptFetcher = new PostgresTaskAttemptFetcher(
         new JobHistoryPostgresConnectionFactory());
@@ -166,16 +186,11 @@ public class TaskAttemptResourceProvider extends
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
   @Override
   public Map<Type,String> getKeyPropertyIds() {
-    Map<Type,String> keyPropertyIds = new HashMap<>();
-    keyPropertyIds.put(Type.Cluster, TASK_ATTEMPT_CLUSTER_NAME_PROPERTY_ID);
-    keyPropertyIds.put(Type.Workflow, TASK_ATTEMPT_WORKFLOW_ID_PROPERTY_ID);
-    keyPropertyIds.put(Type.Job, TASK_ATTEMPT_JOB_ID_PROPERTY_ID);
-    keyPropertyIds.put(Type.TaskAttempt, TASK_ATTEMPT_ID_PROPERTY_ID);
     return keyPropertyIds;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java
index 39419ec..c81742f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/TaskResourceProvider.java
@@ -18,7 +18,6 @@
 package org.apache.ambari.server.controller.internal;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import java.util.LinkedHashSet;
@@ -47,6 +46,7 @@ import org.codehaus.jackson.map.ObjectMapper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.inject.Inject;
 
 /**
@@ -81,9 +81,6 @@ public class TaskResourceProvider extends AbstractControllerResourceProvider {
   public static final String TASK_CUST_CMD_NAME_PROPERTY_ID  = PropertyHelper.getPropertyId("Tasks", "custom_command_name");
   public static final String TASK_COMMAND_OPS_DISPLAY_NAME  = PropertyHelper.getPropertyId("Tasks", "ops_display_name");
 
-  private static Set<String> pkPropertyIds =
-    new HashSet<>(Arrays.asList(new String[]{
-      TASK_ID_PROPERTY_ID}));
 
   /**
    * The property ids for a task resource.
@@ -116,6 +113,18 @@ public class TaskResourceProvider extends AbstractControllerResourceProvider {
   }
 
   /**
+   * The key property ids for a task resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Cluster, TASK_CLUSTER_NAME_PROPERTY_ID)
+      .put(Resource.Type.Request, TASK_REQUEST_ID_PROPERTY_ID)
+      .put(Resource.Type.Upgrade, TASK_REQUEST_ID_PROPERTY_ID)
+      .put(Resource.Type.Stage, TASK_STAGE_ID_PROPERTY_ID)
+      .put(Resource.Type.UpgradeItem, TASK_STAGE_ID_PROPERTY_ID)
+      .put(Resource.Type.Task, TASK_ID_PROPERTY_ID)
+      .build();
+
+  /**
    * Used for querying tasks.
    */
   @Inject
@@ -140,14 +149,10 @@ public class TaskResourceProvider extends AbstractControllerResourceProvider {
   /**
    * Create a  new resource provider for the given management controller.
    *
-   * @param propertyIds           the property ids
-   * @param keyPropertyIds        the key property ids
    * @param managementController  the management controller
    */
-  TaskResourceProvider(Set<String> propertyIds,
-                       Map<Resource.Type, String> keyPropertyIds,
-                       AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  TaskResourceProvider(AmbariManagementController managementController) {
+    super(Resource.Type.Task, PROPERTY_IDS, keyPropertyIds, managementController);
   }
 
   // ----- ResourceProvider ------------------------------------------------
@@ -284,7 +289,7 @@ public class TaskResourceProvider extends AbstractControllerResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ThemeArtifactResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ThemeArtifactResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ThemeArtifactResourceProvider.java
index affd969..46dd914 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ThemeArtifactResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ThemeArtifactResourceProvider.java
@@ -93,7 +93,7 @@ public class ThemeArtifactResourceProvider extends AbstractControllerResourcePro
    * @param managementController the management controller
    */
   protected ThemeArtifactResourceProvider(AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+    super(Resource.Type.Theme, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeGroupResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeGroupResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeGroupResourceProvider.java
index e6aafc1..913375a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeGroupResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeGroupResourceProvider.java
@@ -102,7 +102,7 @@ public class UpgradeGroupResourceProvider extends AbstractControllerResourceProv
    * @param controller the controller
    */
   UpgradeGroupResourceProvider(AmbariManagementController controller) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
+    super(Resource.Type.UpgradeGroup, PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeItemResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeItemResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeItemResourceProvider.java
index 93b3e46..02c9a99 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeItemResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeItemResourceProvider.java
@@ -119,7 +119,7 @@ public class UpgradeItemResourceProvider extends ReadOnlyResourceProvider {
    * @param controller  the controller
    */
   UpgradeItemResourceProvider(AmbariManagementController controller) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
+    super(Resource.Type.UpgradeItem, PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
index bab5369..1fbf130 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeResourceProvider.java
@@ -298,7 +298,7 @@ public class UpgradeResourceProvider extends AbstractControllerResourceProvider
    */
   @Inject
   public UpgradeResourceProvider(@Assisted AmbariManagementController controller) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
+    super(Resource.Type.Upgrade, PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeSummaryResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeSummaryResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeSummaryResourceProvider.java
index 94b2b4a..db9ad2a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeSummaryResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UpgradeSummaryResourceProvider.java
@@ -102,7 +102,7 @@ public class UpgradeSummaryResourceProvider extends AbstractControllerResourcePr
    * @param controller the controller
    */
   public UpgradeSummaryResourceProvider(AmbariManagementController controller) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
+    super(Resource.Type.UpgradeSummary, PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserAuthorizationResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserAuthorizationResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserAuthorizationResourceProvider.java
index 95550f0..c818846 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserAuthorizationResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserAuthorizationResourceProvider.java
@@ -128,7 +128,7 @@ public class UserAuthorizationResourceProvider extends ReadOnlyResourceProvider
    * Create a new resource provider.
    */
   public UserAuthorizationResourceProvider(AmbariManagementController managementController) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
+    super(Type.UserAuthorization, PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
 
     clusterController = ClusterControllerHelper.getClusterController();
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserPrivilegeResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserPrivilegeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserPrivilegeResourceProvider.java
index 614f7ab..1f43383 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserPrivilegeResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserPrivilegeResourceProvider.java
@@ -19,7 +19,6 @@ package org.apache.ambari.server.controller.internal;
 
 import java.util.Collection;
 import java.util.EnumSet;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -57,6 +56,8 @@ import org.apache.ambari.server.security.authorization.Users;
 import com.google.common.cache.CacheBuilder;
 import com.google.common.cache.CacheLoader;
 import com.google.common.cache.LoadingCache;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 
 /**
  * Resource provider for user privilege resources.
@@ -103,20 +104,18 @@ public class UserPrivilegeResourceProvider extends ReadOnlyResourceProvider {
   /**
    * The property ids for a privilege resource.
    */
-  private static Set<String> propertyIds = new HashSet<>();
-  static {
-    propertyIds.add(PRIVILEGE_PRIVILEGE_ID_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_PERMISSION_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_PERMISSION_LABEL_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_PRINCIPAL_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_PRINCIPAL_TYPE_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_VIEW_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_VIEW_VERSION_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_INSTANCE_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_CLUSTER_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_TYPE_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_USER_NAME_PROPERTY_ID);
-  }
+  private static Set<String> propertyIds = Sets.newHashSet(
+      PRIVILEGE_PRIVILEGE_ID_PROPERTY_ID,
+      PRIVILEGE_PERMISSION_NAME_PROPERTY_ID,
+      PRIVILEGE_PERMISSION_LABEL_PROPERTY_ID,
+      PRIVILEGE_PRINCIPAL_NAME_PROPERTY_ID,
+      PRIVILEGE_PRINCIPAL_TYPE_PROPERTY_ID,
+      PRIVILEGE_VIEW_NAME_PROPERTY_ID,
+      PRIVILEGE_VIEW_VERSION_PROPERTY_ID,
+      PRIVILEGE_INSTANCE_NAME_PROPERTY_ID,
+      PRIVILEGE_CLUSTER_NAME_PROPERTY_ID,
+      PRIVILEGE_TYPE_PROPERTY_ID,
+      PRIVILEGE_USER_NAME_PROPERTY_ID);
 
   /**
    * Static initialization.
@@ -145,11 +144,10 @@ public class UserPrivilegeResourceProvider extends ReadOnlyResourceProvider {
   /**
    * The key property ids for a privilege resource.
    */
-  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<>();
-  static {
-    keyPropertyIds.put(Resource.Type.User, PRIVILEGE_USER_NAME_PROPERTY_ID);
-    keyPropertyIds.put(Resource.Type.UserPrivilege, PRIVILEGE_PRIVILEGE_ID_PROPERTY_ID);
-  }
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.User, PRIVILEGE_USER_NAME_PROPERTY_ID)
+      .put(Resource.Type.UserPrivilege, PRIVILEGE_PRIVILEGE_ID_PROPERTY_ID)
+      .build();
 
   private ThreadLocal<LoadingCache<Long, ClusterEntity>> clusterCache =
       new ThreadLocal<LoadingCache<Long, ClusterEntity>>(){
@@ -237,7 +235,7 @@ public class UserPrivilegeResourceProvider extends ReadOnlyResourceProvider {
    * Constructor.
    */
   public UserPrivilegeResourceProvider() {
-    super(propertyIds, keyPropertyIds, null);
+    super(Resource.Type.UserPrivilege, propertyIds, keyPropertyIds, null);
 
     EnumSet<RoleAuthorization> requiredAuthorizations = EnumSet.of(RoleAuthorization.AMBARI_ASSIGN_ROLES);
     setRequiredCreateAuthorizations(requiredAuthorizations);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserResourceProvider.java
index 698f419..f0709aa 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserResourceProvider.java
@@ -17,7 +17,6 @@
  */
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.Map;
@@ -44,6 +43,9 @@ import org.apache.ambari.server.security.authorization.RoleAuthorization;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * Resource provider for user resources.
  */
@@ -63,17 +65,30 @@ public class UserResourceProvider extends AbstractControllerResourceProvider imp
   public static final String USER_GROUPS_PROPERTY_ID       = PropertyHelper.getPropertyId("Users", "groups");
   public static final String USER_ADMIN_PROPERTY_ID        = PropertyHelper.getPropertyId("Users", "admin");
 
-  private static Set<String> pkPropertyIds =
-    new HashSet<>(Arrays.asList(new String[]{
-      USER_USERNAME_PROPERTY_ID}));
+  /**
+   * The key property ids for a User resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.User, USER_USERNAME_PROPERTY_ID)
+      .build();
 
   /**
+   * The property ids for a User resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      USER_USERNAME_PROPERTY_ID,
+      USER_PASSWORD_PROPERTY_ID,
+      USER_OLD_PASSWORD_PROPERTY_ID,
+      USER_LDAP_USER_PROPERTY_ID,
+      USER_TYPE_PROPERTY_ID,
+      USER_ACTIVE_PROPERTY_ID,
+      USER_GROUPS_PROPERTY_ID,
+      USER_ADMIN_PROPERTY_ID);
+  /**
    * Create a new resource provider for the given management controller.
    */
-  UserResourceProvider(Set<String> propertyIds,
-                       Map<Resource.Type, String> keyPropertyIds,
-                       AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  UserResourceProvider(AmbariManagementController managementController) {
+    super(Resource.Type.User, propertyIds, keyPropertyIds, managementController);
 
     setRequiredCreateAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_MANAGE_USERS));
     setRequiredDeleteAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_MANAGE_USERS));
@@ -224,7 +239,7 @@ public class UserResourceProvider extends AbstractControllerResourceProvider imp
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
   private UserRequest getRequest(Map<String, Object> properties) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ValidationResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ValidationResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ValidationResourceProvider.java
index 5448784..7252212 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ValidationResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ValidationResourceProvider.java
@@ -45,6 +45,9 @@ import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 public class ValidationResourceProvider extends StackAdvisorResourceProvider {
 
   private static final Logger LOG = LoggerFactory.getLogger(ValidationResourceProvider.class);
@@ -54,20 +57,59 @@ public class ValidationResourceProvider extends StackAdvisorResourceProvider {
   protected static final String VALIDATE_PROPERTY_ID = "validate";
 
   protected static final String ITEMS_PROPERTY_ID = "items";
-  protected static final String ITEMS_TYPE_PROPERTY_ID = "type";
-  protected static final String ITEMS_LEVE_PROPERTY_ID = "level";
-  protected static final String ITEMS_MESSAGE_PROPERTY_ID = "message";
-  protected static final String ITEMS_COMPONENT_NAME_PROPERTY_ID = "component-name";
-  protected static final String ITEMS_HOST_PROPERTY_ID = "host";
-  protected static final String ITEMS_CONFIG_TYPE_PROPERTY_ID = "config-type";
-  protected static final String ITEMS_CONFIG_NAME_PROPERTY_ID = "config-name";
-
-  private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{VALIDATION_ID_PROPERTY_ID}));
-
-  protected ValidationResourceProvider(Set<String> propertyIds, Map<Type, String> keyPropertyIds,
-      AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  protected static final String TYPE_PROPERTY_ID = "type";
+  protected static final String LEVE_PROPERTY_ID = "level";
+  protected static final String MESSAGE_PROPERTY_ID = "message";
+  protected static final String COMPONENT_NAME_PROPERTY_ID = "component-name";
+  protected static final String HOST_PROPERTY_ID = "host";
+  protected static final String CONFIG_TYPE_PROPERTY_ID = "config-type";
+  protected static final String CONFIG_NAME_PROPERTY_ID = "config-name";
+  protected static final String HOST_GROUP_PROPERTY_ID = "host-group";
+  protected static final String HOSTS_PROPERTY_ID = "hosts";
+  protected static final String SERVICES_PROPERTY_ID = "services";
+  protected static final String RECOMMENDATIONS_PROPERTY_ID = "recommendations";
+
+  protected static final String ITEMS_TYPE_PROPERTY_ID = PropertyHelper.getPropertyId(ITEMS_PROPERTY_ID, TYPE_PROPERTY_ID);
+  protected static final String ITEMS_LEVE_PROPERTY_ID =  PropertyHelper.getPropertyId(ITEMS_PROPERTY_ID, LEVE_PROPERTY_ID);
+  protected static final String ITEMS_MESSAGE_PROPERTY_ID =  PropertyHelper.getPropertyId(ITEMS_PROPERTY_ID, MESSAGE_PROPERTY_ID);
+  protected static final String ITEMS_COMPONENT_NAME_PROPERTY_ID =  PropertyHelper.getPropertyId(ITEMS_PROPERTY_ID, COMPONENT_NAME_PROPERTY_ID);
+  protected static final String ITEMS_HOST_PROPERTY_ID =  PropertyHelper.getPropertyId(ITEMS_PROPERTY_ID, HOST_PROPERTY_ID);
+  protected static final String ITEMS_CONFIG_TYPE_PROPERTY_ID =  PropertyHelper.getPropertyId(ITEMS_PROPERTY_ID, CONFIG_TYPE_PROPERTY_ID);
+  protected static final String ITEMS_CONFIG_NAME_PROPERTY_ID =  PropertyHelper.getPropertyId(ITEMS_PROPERTY_ID, CONFIG_NAME_PROPERTY_ID);
+  protected static final String ITEMS_HOST_GROUP_PROPERTY_ID = PropertyHelper.getPropertyId(ITEMS_PROPERTY_ID, HOST_GROUP_PROPERTY_ID);
+
+  /**
+   * The key property ids for a Validation resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.Validation, VALIDATION_ID_PROPERTY_ID)
+      .put(Type.Stack, STACK_NAME_PROPERTY_ID)
+      .put(Type.StackVersion, STACK_VERSION_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a Validation resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      VALIDATION_ID_PROPERTY_ID,
+      VALIDATE_PROPERTY_ID,
+      ITEMS_PROPERTY_ID,
+      STACK_NAME_PROPERTY_ID,
+      STACK_VERSION_PROPERTY_ID,
+      ITEMS_TYPE_PROPERTY_ID,
+      ITEMS_LEVE_PROPERTY_ID,
+      ITEMS_MESSAGE_PROPERTY_ID,
+      ITEMS_COMPONENT_NAME_PROPERTY_ID,
+      ITEMS_HOST_PROPERTY_ID,
+      ITEMS_CONFIG_TYPE_PROPERTY_ID,
+      ITEMS_CONFIG_NAME_PROPERTY_ID,
+      ITEMS_HOST_GROUP_PROPERTY_ID,
+      HOSTS_PROPERTY_ID,
+      SERVICES_PROPERTY_ID,
+      RECOMMENDATIONS_PROPERTY_ID);
+
+  protected ValidationResourceProvider(AmbariManagementController managementController) {
+    super(Type.Validation, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override
@@ -105,19 +147,19 @@ public class ValidationResourceProvider extends StackAdvisorResourceProvider {
         Set<ValidationItem> items = response.getItems();
         for (ValidationItem item : items) {
           Map<String, Object> mapItemProps = new HashMap<>();
-          mapItemProps.put(ITEMS_TYPE_PROPERTY_ID, item.getType());
-          mapItemProps.put(ITEMS_LEVE_PROPERTY_ID, item.getLevel());
-          mapItemProps.put(ITEMS_MESSAGE_PROPERTY_ID, item.getMessage());
+          mapItemProps.put(TYPE_PROPERTY_ID, item.getType());
+          mapItemProps.put(LEVE_PROPERTY_ID, item.getLevel());
+          mapItemProps.put(MESSAGE_PROPERTY_ID, item.getMessage());
 
           if (item.getComponentName() != null) {
-            mapItemProps.put(ITEMS_COMPONENT_NAME_PROPERTY_ID, item.getComponentName());
+            mapItemProps.put(COMPONENT_NAME_PROPERTY_ID, item.getComponentName());
           }
           if (item.getHost() != null) {
-            mapItemProps.put(ITEMS_HOST_PROPERTY_ID, item.getHost());
+            mapItemProps.put(HOST_PROPERTY_ID, item.getHost());
           }
           if (item.getConfigType() != null) {
-            mapItemProps.put(ITEMS_CONFIG_TYPE_PROPERTY_ID, item.getConfigType());
-            mapItemProps.put(ITEMS_CONFIG_NAME_PROPERTY_ID, item.getConfigName());
+            mapItemProps.put(CONFIG_TYPE_PROPERTY_ID, item.getConfigType());
+            mapItemProps.put(CONFIG_NAME_PROPERTY_ID, item.getConfigName());
           }
           listItemProps.add(mapItemProps);
         }
@@ -134,7 +176,7 @@ public class ValidationResourceProvider extends StackAdvisorResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
index c34c94d..d7d5e30 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/VersionDefinitionResourceProvider.java
@@ -184,7 +184,7 @@ public class VersionDefinitionResourceProvider extends AbstractAuthorizedResourc
    * Constructor.
    */
   VersionDefinitionResourceProvider() {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS);
+    super(Resource.Type.VersionDefinition, PROPERTY_IDS, KEY_PROPERTY_IDS);
 
     setRequiredCreateAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_MANAGE_STACK_VERSIONS));
     setRequiredGetAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_MANAGE_STACK_VERSIONS));

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
index 9562782..f191255 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewInstanceResourceProvider.java
@@ -50,6 +50,8 @@ import org.apache.ambari.server.view.validation.ValidationResultImpl;
 import org.apache.ambari.view.ClusterType;
 import org.apache.ambari.view.validation.Validator;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 import com.google.inject.persist.Transactional;
 
@@ -91,37 +93,34 @@ public class ViewInstanceResourceProvider extends AbstractAuthorizedResourceProv
   /**
    * The key property ids for a view instance resource.
    */
-  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<>();
-  static {
-    keyPropertyIds.put(Resource.Type.View, VIEW_NAME_PROPERTY_ID);
-    keyPropertyIds.put(Resource.Type.ViewVersion, VIEW_VERSION_PROPERTY_ID);
-    keyPropertyIds.put(Resource.Type.ViewInstance, INSTANCE_NAME_PROPERTY_ID);
-  }
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.View, VIEW_NAME_PROPERTY_ID)
+      .put(Resource.Type.ViewVersion, VIEW_VERSION_PROPERTY_ID)
+      .put(Resource.Type.ViewInstance, INSTANCE_NAME_PROPERTY_ID)
+      .build();
 
   /**
    * The property ids for a view instance resource.
    */
-  private static Set<String> propertyIds = new HashSet<>();
-  static {
-    propertyIds.add(VIEW_NAME_PROPERTY_ID);
-    propertyIds.add(VIEW_VERSION_PROPERTY_ID);
-    propertyIds.add(INSTANCE_NAME_PROPERTY_ID);
-    propertyIds.add(LABEL_PROPERTY_ID);
-    propertyIds.add(DESCRIPTION_PROPERTY_ID);
-    propertyIds.add(VISIBLE_PROPERTY_ID);
-    propertyIds.add(ICON_PATH_ID);
-    propertyIds.add(ICON64_PATH_ID);
-    propertyIds.add(PROPERTIES_PROPERTY_ID);
-    propertyIds.add(DATA_PROPERTY_ID);
-    propertyIds.add(CONTEXT_PATH_PROPERTY_ID);
-    propertyIds.add(STATIC_PROPERTY_ID);
-    propertyIds.add(CLUSTER_HANDLE_PROPERTY_ID);
-    propertyIds.add(CLUSTER_TYPE_PROPERTY_ID);
-    propertyIds.add(SHORT_URL_PROPERTY_ID);
-    propertyIds.add(SHORT_URL_NAME_PROPERTY_ID);
-    propertyIds.add(VALIDATION_RESULT_PROPERTY_ID);
-    propertyIds.add(PROPERTY_VALIDATION_RESULTS_PROPERTY_ID);
-  }
+  private static Set<String> propertyIds = Sets.newHashSet(
+      VIEW_NAME_PROPERTY_ID,
+      VIEW_VERSION_PROPERTY_ID,
+      INSTANCE_NAME_PROPERTY_ID,
+      LABEL_PROPERTY_ID,
+      DESCRIPTION_PROPERTY_ID,
+      VISIBLE_PROPERTY_ID,
+      ICON_PATH_ID,
+      ICON64_PATH_ID,
+      PROPERTIES_PROPERTY_ID,
+      DATA_PROPERTY_ID,
+      CONTEXT_PATH_PROPERTY_ID,
+      STATIC_PROPERTY_ID,
+      CLUSTER_HANDLE_PROPERTY_ID,
+      CLUSTER_TYPE_PROPERTY_ID,
+      SHORT_URL_PROPERTY_ID,
+      SHORT_URL_NAME_PROPERTY_ID,
+      VALIDATION_RESULT_PROPERTY_ID,
+      PROPERTY_VALIDATION_RESULTS_PROPERTY_ID);
 
   // ----- Constructors ------------------------------------------------------
 
@@ -130,7 +129,7 @@ public class ViewInstanceResourceProvider extends AbstractAuthorizedResourceProv
    */
   @Inject
   public ViewInstanceResourceProvider() {
-    super(propertyIds, keyPropertyIds);
+    super(Resource.Type.ViewInstance, propertyIds, keyPropertyIds);
 
     EnumSet<RoleAuthorization> requiredAuthorizations = EnumSet.of(RoleAuthorization.AMBARI_MANAGE_VIEWS);
     setRequiredCreateAuthorizations(requiredAuthorizations);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPermissionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPermissionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPermissionResourceProvider.java
index c1846bb..5b354c4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPermissionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPermissionResourceProvider.java
@@ -18,7 +18,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -39,6 +38,9 @@ import org.apache.ambari.server.orm.entities.ResourceTypeEntity;
 import org.apache.ambari.server.orm.entities.ViewEntity;
 import org.apache.ambari.server.view.ViewRegistry;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * Resource provider for custom view permissions.
  */
@@ -62,24 +64,21 @@ public class ViewPermissionResourceProvider extends AbstractResourceProvider {
   /**
    * The key property ids for a permission resource.
    */
-  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<>();
-  static {
-    keyPropertyIds.put(Resource.Type.View, VIEW_NAME_PROPERTY_ID);
-    keyPropertyIds.put(Resource.Type.ViewVersion, VIEW_VERSION_PROPERTY_ID);
-    keyPropertyIds.put(Resource.Type.ViewPermission, PERMISSION_ID_PROPERTY_ID);
-  }
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.View, VIEW_NAME_PROPERTY_ID)
+      .put(Resource.Type.ViewVersion, VIEW_VERSION_PROPERTY_ID)
+      .put(Resource.Type.ViewPermission, PERMISSION_ID_PROPERTY_ID)
+      .build();
 
   /**
    * The property ids for a permission resource.
    */
-  private static Set<String> propertyIds = new HashSet<>();
-  static {
-    propertyIds.add(VIEW_NAME_PROPERTY_ID);
-    propertyIds.add(VIEW_VERSION_PROPERTY_ID);
-    propertyIds.add(PERMISSION_ID_PROPERTY_ID);
-    propertyIds.add(PERMISSION_NAME_PROPERTY_ID);
-    propertyIds.add(RESOURCE_NAME_PROPERTY_ID);
-  }
+  private static Set<String> propertyIds = Sets.newHashSet(
+      VIEW_NAME_PROPERTY_ID,
+      VIEW_VERSION_PROPERTY_ID,
+      PERMISSION_ID_PROPERTY_ID,
+      PERMISSION_NAME_PROPERTY_ID,
+      RESOURCE_NAME_PROPERTY_ID);
 
 
   // ----- Constructors ------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java
index eb57759..2d6f119 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewPrivilegeResourceProvider.java
@@ -38,6 +38,9 @@ import org.apache.ambari.server.security.authorization.ResourceType;
 import org.apache.ambari.server.security.authorization.RoleAuthorization;
 import org.apache.ambari.server.view.ViewRegistry;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * Resource provider for view privilege resources.
  */
@@ -53,28 +56,25 @@ public class ViewPrivilegeResourceProvider extends PrivilegeResourceProvider<Vie
   /**
    * The property ids for a privilege resource.
    */
-  private static Set<String> propertyIds = new HashSet<>();
-  static {
-    propertyIds.add(PRIVILEGE_VIEW_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_VIEW_VERSION_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_INSTANCE_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_ID_PROPERTY_ID);
-    propertyIds.add(PERMISSION_NAME_PROPERTY_ID);
-    propertyIds.add(PERMISSION_LABEL_PROPERTY_ID);
-    propertyIds.add(PRINCIPAL_NAME_PROPERTY_ID);
-    propertyIds.add(PRINCIPAL_TYPE_PROPERTY_ID);
-  }
+  private static Set<String> propertyIds = Sets.newHashSet(
+      PRIVILEGE_VIEW_NAME_PROPERTY_ID,
+      PRIVILEGE_VIEW_VERSION_PROPERTY_ID,
+      PRIVILEGE_INSTANCE_NAME_PROPERTY_ID,
+      PRIVILEGE_ID_PROPERTY_ID,
+      PERMISSION_NAME_PROPERTY_ID,
+      PERMISSION_LABEL_PROPERTY_ID,
+      PRINCIPAL_NAME_PROPERTY_ID,
+      PRINCIPAL_TYPE_PROPERTY_ID);
 
   /**
    * The key property ids for a privilege resource.
    */
-  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<>();
-  static {
-    keyPropertyIds.put(Resource.Type.View, PRIVILEGE_VIEW_NAME_PROPERTY_ID);
-    keyPropertyIds.put(Resource.Type.ViewVersion, PRIVILEGE_VIEW_VERSION_PROPERTY_ID);
-    keyPropertyIds.put(Resource.Type.ViewInstance, PRIVILEGE_INSTANCE_NAME_PROPERTY_ID);
-    keyPropertyIds.put(Resource.Type.ViewPrivilege, PRIVILEGE_ID_PROPERTY_ID);
-  }
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.View, PRIVILEGE_VIEW_NAME_PROPERTY_ID)
+      .put(Resource.Type.ViewVersion, PRIVILEGE_VIEW_VERSION_PROPERTY_ID)
+      .put(Resource.Type.ViewInstance, PRIVILEGE_INSTANCE_NAME_PROPERTY_ID)
+      .put(Resource.Type.ViewPrivilege, PRIVILEGE_ID_PROPERTY_ID)
+      .build();
 
   /**
    * The built-in VIEW.USER permission.

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java
index 7179b33..c8044c3 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewResourceProvider.java
@@ -20,7 +20,6 @@ package org.apache.ambari.server.controller.internal;
 
 import java.util.Collections;
 import java.util.EnumSet;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -38,6 +37,9 @@ import org.apache.ambari.server.orm.entities.ViewEntity;
 import org.apache.ambari.server.security.authorization.RoleAuthorization;
 import org.apache.ambari.server.view.ViewRegistry;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * Resource provider for view instances.
  */
@@ -52,18 +54,15 @@ public class ViewResourceProvider extends AbstractAuthorizedResourceProvider {
   /**
    * The key property ids for a view resource.
    */
-  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<>();
-  static {
-    keyPropertyIds.put(Resource.Type.View, VIEW_NAME_PROPERTY_ID);
-  }
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.View, VIEW_NAME_PROPERTY_ID)
+      .build();
 
   /**
    * The property ids for a view resource.
    */
-  private static Set<String> propertyIds = new HashSet<>();
-  static {
-    propertyIds.add(VIEW_NAME_PROPERTY_ID);
-  }
+  private static Set<String> propertyIds = Sets.newHashSet(
+      VIEW_NAME_PROPERTY_ID);
 
 
   // ----- Constructors ------------------------------------------------------
@@ -72,7 +71,7 @@ public class ViewResourceProvider extends AbstractAuthorizedResourceProvider {
    * Construct a view resource provider.
    */
   public ViewResourceProvider() {
-    super(propertyIds, keyPropertyIds);
+    super(Resource.Type.View, propertyIds, keyPropertyIds);
 
     EnumSet<RoleAuthorization> requiredAuthorizations = EnumSet.of(RoleAuthorization.AMBARI_MANAGE_VIEWS);
     setRequiredCreateAuthorizations(requiredAuthorizations);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewURLResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewURLResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewURLResourceProvider.java
index cb506be..ca9aadf 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewURLResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewURLResourceProvider.java
@@ -19,7 +19,6 @@
 package org.apache.ambari.server.controller.internal;
 
 import java.util.EnumSet;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -48,6 +47,7 @@ import org.apache.ambari.server.view.validation.ValidationException;
 
 import com.google.common.base.Optional;
 import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 
@@ -70,22 +70,19 @@ public class ViewURLResourceProvider extends AbstractAuthorizedResourceProvider
   /**
    * The key property ids for a view URL resource.
    */
-  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<>();
-  static {
-    keyPropertyIds.put(Resource.Type.ViewURL, URL_NAME_PROPERTY_ID);
-  }
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.ViewURL, URL_NAME_PROPERTY_ID)
+      .build();
 
   /**
    * The property ids for a view URL resource.
    */
-  private static Set<String> propertyIds = new HashSet<>();
-  static {
-    propertyIds.add(URL_NAME_PROPERTY_ID);
-    propertyIds.add(URL_SUFFIX_PROPERTY_ID);
-    propertyIds.add(VIEW_INSTANCE_VERSION_PROPERTY_ID);
-    propertyIds.add(VIEW_INSTANCE_NAME_PROPERTY_ID);
-    propertyIds.add(VIEW_INSTANCE_COMMON_NAME_PROPERTY_ID);
-  }
+  private static Set<String> propertyIds = Sets.newHashSet(
+      URL_NAME_PROPERTY_ID,
+      URL_SUFFIX_PROPERTY_ID,
+      VIEW_INSTANCE_VERSION_PROPERTY_ID,
+      VIEW_INSTANCE_NAME_PROPERTY_ID,
+      VIEW_INSTANCE_COMMON_NAME_PROPERTY_ID);
 
   @Inject
   private static ViewURLDAO viewURLDAO;
@@ -97,7 +94,7 @@ public class ViewURLResourceProvider extends AbstractAuthorizedResourceProvider
    */
 
   public ViewURLResourceProvider() {
-    super(propertyIds, keyPropertyIds);
+    super(Resource.Type.ViewURL, propertyIds, keyPropertyIds);
 
     EnumSet<RoleAuthorization> requiredAuthorizations = EnumSet.of(RoleAuthorization.AMBARI_MANAGE_VIEWS);
     setRequiredCreateAuthorizations(requiredAuthorizations);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java
index e0812fa..58d4cf4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ViewVersionResourceProvider.java
@@ -19,7 +19,6 @@
 package org.apache.ambari.server.controller.internal;
 
 import java.util.Collections;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -40,6 +39,9 @@ import org.apache.ambari.server.view.ViewRegistry;
 import org.apache.ambari.server.view.configuration.ParameterConfig;
 import org.apache.ambari.view.ViewDefinition;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * Resource provider for view versions.
  */
@@ -66,32 +68,29 @@ public class ViewVersionResourceProvider extends AbstractResourceProvider {
   /**
    * The key property ids for a view resource.
    */
-  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<>();
-  static {
-    keyPropertyIds.put(Resource.Type.View, VIEW_NAME_PROPERTY_ID);
-    keyPropertyIds.put(Resource.Type.ViewVersion, VIEW_VERSION_PROPERTY_ID);
-  }
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.View, VIEW_NAME_PROPERTY_ID)
+      .put(Resource.Type.ViewVersion, VIEW_VERSION_PROPERTY_ID)
+      .build();
 
   /**
    * The property ids for a view resource.
    */
-  private static Set<String> propertyIds = new HashSet<>();
-  static {
-    propertyIds.add(VIEW_NAME_PROPERTY_ID);
-    propertyIds.add(VIEW_VERSION_PROPERTY_ID);
-    propertyIds.add(VIEW_BUILD_PROPERTY_ID);
-    propertyIds.add(LABEL_PROPERTY_ID);
-    propertyIds.add(DESCRIPTION_PROPERTY_ID);
-    propertyIds.add(MIN_AMBARI_VERSION_PROPERTY_ID);
-    propertyIds.add(MAX_AMBARI_VERSION_PROPERTY_ID);
-    propertyIds.add(PARAMETERS_PROPERTY_ID);
-    propertyIds.add(ARCHIVE_PROPERTY_ID);
-    propertyIds.add(MASKER_CLASS_PROPERTY_ID);
-    propertyIds.add(VIEW_STATUS_PROPERTY_ID);
-    propertyIds.add(VIEW_STATUS_DETAIL_PROPERTY_ID);
-    propertyIds.add(CLUSTER_CONFIG_PROPERTY_ID);
-    propertyIds.add(SYSTEM_PROPERTY_ID);
-  }
+  private static Set<String> propertyIds = Sets.newHashSet(
+      VIEW_NAME_PROPERTY_ID,
+      VIEW_VERSION_PROPERTY_ID,
+      VIEW_BUILD_PROPERTY_ID,
+      LABEL_PROPERTY_ID,
+      DESCRIPTION_PROPERTY_ID,
+      MIN_AMBARI_VERSION_PROPERTY_ID,
+      MAX_AMBARI_VERSION_PROPERTY_ID,
+      PARAMETERS_PROPERTY_ID,
+      ARCHIVE_PROPERTY_ID,
+      MASKER_CLASS_PROPERTY_ID,
+      VIEW_STATUS_PROPERTY_ID,
+      VIEW_STATUS_DETAIL_PROPERTY_ID,
+      CLUSTER_CONFIG_PROPERTY_ID,
+      SYSTEM_PROPERTY_ID);
 
 
   // ----- Constructors ------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/WidgetLayoutResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/WidgetLayoutResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/WidgetLayoutResourceProvider.java
index 8c39fc4..5af2acc 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/WidgetLayoutResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/WidgetLayoutResourceProvider.java
@@ -119,7 +119,7 @@ public class WidgetLayoutResourceProvider extends AbstractControllerResourceProv
    *
    */
   public WidgetLayoutResourceProvider(AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+    super(Type.WidgetLayout, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/WidgetResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/WidgetResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/WidgetResourceProvider.java
index 03fd5d2..89a5aa4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/WidgetResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/WidgetResourceProvider.java
@@ -123,7 +123,7 @@ public class WidgetResourceProvider extends AbstractControllerResourceProvider {
    *
    */
   public WidgetResourceProvider(AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+    super(Type.Widget, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/WorkflowResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/WorkflowResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/WorkflowResourceProvider.java
index 13cb8a4..af1085f 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/WorkflowResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/WorkflowResourceProvider.java
@@ -22,7 +22,6 @@ import java.sql.Connection;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -45,6 +44,9 @@ import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * Resource provider for workflow resources.
  */
@@ -79,22 +81,38 @@ public class WorkflowResourceProvider extends
   protected static final String WORKFLOW_CONTEXT_PROPERTY_ID = PropertyHelper
       .getPropertyId("Workflow", "context");
 
-  private static final Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{WORKFLOW_CLUSTER_NAME_PROPERTY_ID,
-      WORKFLOW_ID_PROPERTY_ID}));
-
   protected WorkflowFetcher workflowFetcher;
 
   /**
+   * The key property ids for a Workflow resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.Cluster, WORKFLOW_CLUSTER_NAME_PROPERTY_ID)
+      .put(Type.Workflow, WORKFLOW_ID_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a Workflow resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      WORKFLOW_CLUSTER_NAME_PROPERTY_ID,
+      WORKFLOW_ID_PROPERTY_ID,
+      WORKFLOW_NAME_PROPERTY_ID,
+      WORKFLOW_USER_NAME_PROPERTY_ID,
+      WORKFLOW_START_TIME_PROPERTY_ID,
+      WORKFLOW_LAST_UPDATE_TIME_PROPERTY_ID,
+      WORKFLOW_ELAPSED_TIME_PROPERTY_ID,
+      WORKFLOW_INPUT_BYTES_PROPERTY_ID,
+      WORKFLOW_OUTPUT_BYTES_PROPERTY_ID,
+      WORKFLOW_NUM_JOBS_TOTAL_PROPERTY_ID,
+      WORKFLOW_NUM_JOBS_COMPLETED_PROPERTY_ID,
+      WORKFLOW_PARENT_ID_PROPERTY_ID,
+      WORKFLOW_CONTEXT_PROPERTY_ID);
+
+  /**
    * Create a new workflow resource provider.
-   * 
-   * @param propertyIds
-   *          the property ids
-   * @param keyPropertyIds
-   *          the key property ids
    */
-  protected WorkflowResourceProvider(Set<String> propertyIds,
-      Map<Type,String> keyPropertyIds) {
+  protected WorkflowResourceProvider() {
     super(propertyIds, keyPropertyIds);
     this.workflowFetcher = new PostgresWorkflowFetcher(
         new JobHistoryPostgresConnectionFactory());
@@ -103,15 +121,10 @@ public class WorkflowResourceProvider extends
   /**
    * Create a new workflow resource provider.
    * 
-   * @param propertyIds
-   *          the property ids
-   * @param keyPropertyIds
-   *          the key property ids
    * @param workflowFetcher
    *          workflow fetcher
    */
-  protected WorkflowResourceProvider(Set<String> propertyIds,
-      Map<Type,String> keyPropertyIds, WorkflowFetcher workflowFetcher) {
+  protected WorkflowResourceProvider(WorkflowFetcher workflowFetcher) {
     super(propertyIds, keyPropertyIds);
     this.workflowFetcher = workflowFetcher;
   }
@@ -159,14 +172,11 @@ public class WorkflowResourceProvider extends
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
   @Override
   public Map<Type,String> getKeyPropertyIds() {
-    Map<Type,String> keyPropertyIds = new HashMap<>();
-    keyPropertyIds.put(Type.Cluster, WORKFLOW_CLUSTER_NAME_PROPERTY_ID);
-    keyPropertyIds.put(Type.Workflow, WORKFLOW_ID_PROPERTY_ID);
     return keyPropertyIds;
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/PropertyHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/PropertyHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/PropertyHelper.java
index 8939780..a63983c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/PropertyHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/PropertyHelper.java
@@ -44,11 +44,9 @@ import org.codehaus.jackson.type.TypeReference;
  */
 public class PropertyHelper {
 
-  private static final String PROPERTIES_FILE = "properties.json";
   private static final String GANGLIA_PROPERTIES_FILE = "ganglia_properties.json";
   private static final String SQLSERVER_PROPERTIES_FILE = "sqlserver_properties.json";
   private static final String JMX_PROPERTIES_FILE = "jmx_properties.json";
-  private static final String KEY_PROPERTIES_FILE = "key_properties.json";
   public static final char EXTERNAL_PATH_SEP = '/';
 
   /**
@@ -60,11 +58,11 @@ public class PropertyHelper {
   private static final List<Resource.InternalType> REPORT_METRIC_RESOURCES =
     Arrays.asList(Resource.InternalType.Cluster, Resource.InternalType.Host);
 
-  private static final Map<Resource.InternalType, Set<String>> PROPERTY_IDS = readPropertyIds(PROPERTIES_FILE);
+  private static final Map<Resource.InternalType, Set<String>> PROPERTY_IDS = new HashMap<>();
   private static final Map<Resource.InternalType, Map<String, Map<String, PropertyInfo>>> JMX_PROPERTY_IDS = readPropertyProviderIds(JMX_PROPERTIES_FILE);
   private static final Map<Resource.InternalType, Map<String, Map<String, PropertyInfo>>> GANGLIA_PROPERTY_IDS = readPropertyProviderIds(GANGLIA_PROPERTIES_FILE);
   private static final Map<Resource.InternalType, Map<String, Map<String, PropertyInfo>>> SQLSERVER_PROPERTY_IDS = readPropertyProviderIds(SQLSERVER_PROPERTIES_FILE);
-  private static final Map<Resource.InternalType, Map<Resource.Type, String>> KEY_PROPERTY_IDS = readKeyPropertyIds(KEY_PROPERTIES_FILE);
+  private static final Map<Resource.InternalType, Map<Resource.Type, String>> KEY_PROPERTY_IDS = new HashMap<>();
 
   // Suffixes to add for Namenode rpc metrics prefixes
   private static final Map<String, List<String>> RPC_METRIC_SUFFIXES = new HashMap<>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/metrics/system/impl/AmbariMetricSinkImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/metrics/system/impl/AmbariMetricSinkImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/metrics/system/impl/AmbariMetricSinkImpl.java
index 5c5801d..6cd7059 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/metrics/system/impl/AmbariMetricSinkImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/metrics/system/impl/AmbariMetricSinkImpl.java
@@ -139,8 +139,6 @@ public class AmbariMetricSinkImpl extends AbstractTimelineMetricsSink implements
 
       ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         ambariManagementController);
 
       try {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/resources/key_properties.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/key_properties.json b/ambari-server/src/main/resources/key_properties.json
deleted file mode 100644
index 5d76062..0000000
--- a/ambari-server/src/main/resources/key_properties.json
+++ /dev/null
@@ -1,161 +0,0 @@
-{
-  "Cluster": {
-    "Cluster": "Clusters/cluster_name"
-  },
-  "Host": {
-    "Cluster": "Hosts/cluster_name",
-    "Host": "Hosts/host_name"
-  },
-  "HostComponent": {
-    "Cluster": "HostRoles/cluster_name",
-    "Host": "HostRoles/host_name",
-    "HostComponent": "HostRoles/component_name",
-    "Component": "HostRoles/component_name"
-  },
-  "Action": {
-    "Action": "Actions/action_name"
-  },
-  "Request": {
-    "Cluster": "Requests/cluster_name",
-    "Request": "Requests/id"
-  },
-  "Task": {
-    "Cluster": "Tasks/cluster_name",
-    "Request": "Tasks/request_id",
-    "Upgrade": "Tasks/request_id",
-    "Stage": "Tasks/stage_id",
-    "UpgradeItem": "Tasks/stage_id",
-    "Task": "Tasks/id"
-  },
-  "User": {
-    "User": "Users/user_name"
-  },
-  "Group": {
-    "Group": "Groups/group_name"
-  },
-  "Member": {
-    "Group": "MemberInfo/group_name",
-    "Member": "MemberInfo/user_name"
-  },
-  "Stack": {
-    "Stack": "Stacks/stack_name"
-  },
-  "StackVersion": {
-    "Stack": "Versions/stack_name",
-    "StackVersion": "Versions/stack_version"
-  },
-  "StackService": {
-    "Stack": "StackServices/stack_name",
-    "StackVersion": "StackServices/stack_version",
-    "StackService": "StackServices/service_name"
-  },
-  "StackConfiguration": {
-    "Stack": "StackConfigurations/stack_name",
-    "StackVersion": "StackConfigurations/stack_version",
-    "StackService": "StackConfigurations/service_name",
-    "StackConfiguration": "StackConfigurations/property_name"
-  },
-  "StackConfigurationDependency": {
-    "Stack": "StackConfigurationDependency/stack_name",
-    "StackVersion": "StackConfigurationDependency/stack_version",
-    "StackService": "StackConfigurationDependency/service_name",
-    "StackConfiguration": "StackConfigurationDependency/property_name",
-    "StackLevelConfiguration": "StackConfigurationDependency/property_name",
-    "StackConfigurationDependency": "StackConfigurationDependency/dependency_name"
-  },
-  "StackServiceComponent": {
-    "Stack": "StackServiceComponents/stack_name",
-    "StackVersion": "StackServiceComponents/stack_version",
-    "StackService": "StackServiceComponents/service_name",
-    "StackServiceComponent": "StackServiceComponents/component_name"
-  },
-  "StackServiceComponentDependency": {
-    "Stack": "Dependencies/stack_name",
-    "StackVersion": "Dependencies/stack_version",
-    "StackService": "Dependencies/dependent_service_name",
-    "StackServiceComponent": "Dependencies/dependent_component_name",
-    "StackServiceComponentDependency": "Dependencies/component_name"
-  },
-  "ExtensionLink": {
-    "ExtensionLink": "ExtensionLink/link_id",
-    "Stack": "ExtensionLink/stack_name",
-    "StackVersion": "ExtensionLink/stack_version",
-    "Extension": "ExtensionLink/extension_name",
-    "ExtensionVersion": "ExtensionLink/extension_version"
-  },
-  "Extension": {
-    "Extension": "Extensions/extension_name"
-  },
-  "ExtensionVersion": {
-    "Extension": "Versions/extension_name",
-    "ExtensionVersion": "Versions/extension_version"
-  },
-  "DRFeed": {
-    "DRFeed": "Feed/name"
-  },
-  "DRTargetCluster": {
-    "DRTargetCluster": "Cluster/name"
-  },
-  "DRInstance": {
-    "DRFeed": "Instance/feedName",
-    "DRInstance": "Instance/id"
-  },
-  "RootService": {
-    "RootService": "RootService/service_name"
-  },
-  "RootServiceComponent": {
-    "RootService": "RootServiceComponents/service_name",
-    "RootServiceComponent": "RootServiceComponents/component_name"
-  },
-  "RootServiceHostComponent": {
-    "RootService": "RootServiceHostComponents/service_name",
-    "Host": "RootServiceHostComponents/host_name",
-    "RootServiceComponent": "RootServiceHostComponents/component_name",
-    "RootServiceHostComponent": "RootServiceHostComponents/component_name"
-  },
-  "ConfigGroup": {
-    "Cluster": "ConfigGroup/cluster_name",
-    "ConfigGroup": "ConfigGroup/id"
-  },
-  "RequestSchedule" : {
-    "Cluster": "RequestSchedule/cluster_name",
-    "RequestSchedule": "RequestSchedule/id"
-  },
-  "Blueprint": {
-    "Blueprint": "Blueprints/blueprint_name"
-  },
-  "Recommendation": {
-    "Recommendation": "Recommendation/id",
-    "Stack": "Versions/stack_name",
-    "StackVersion": "Versions/stack_version"
-  },
-  "Validation": {
-    "Validation": "Validation/id",
-    "Stack": "Versions/stack_name",
-    "StackVersion": "Versions/stack_version"
-  },
-  "HostComponentProcess": {
-    "Cluster": "HostComponentProcess/cluster_name",
-    "Host": "HostComponentProcess/host_name",
-    "Component": "HostComponentProcess/component_name",
-    "HostComponent": "HostComponentProcess/component_name",
-    "HostComponentProcess": "HostComponentProcess/name"
-  },
-  "ClientConfig": {
-    "Cluster": "ServiceComponentInfo/cluster_name",
-    "Service": "ServiceComponentInfo/service_name",
-    "Component": "ServiceComponentInfo/component_name",
-    "Host": "HostRoles/host_name"
-  },
-  "StackLevelConfiguration": {
-    "Stack": "StackLevelConfigurations/stack_name",
-    "StackVersion": "StackLevelConfigurations/stack_version",
-    "StackLevelConfiguration": "StackLevelConfigurations/property_name"  
-  },
-  "KerberosDescriptor": {
-    "KerberosDescriptor": "KerberosDescriptors/kerberos_descriptor_name"
-  },
-  "LoggingQuery": {
-      "Cluster" : "logging/cluster_name"
-  }
-}


[13/13] ambari git commit: Merge branch 'trunk' into branch-feature-AMBARI-20859

Posted by rl...@apache.org.
 Merge branch 'trunk' into branch-feature-AMBARI-20859


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

Branch: refs/heads/branch-feature-AMBARI-20859
Commit: de4deaf0b04f69692c5226c31ad11deb228b367c
Parents: b6cf432 c7cc560
Author: Robert Levas <rl...@hortonworks.com>
Authored: Mon Dec 4 18:23:25 2017 -0500
Committer: Robert Levas <rl...@hortonworks.com>
Committed: Mon Dec 4 18:23:25 2017 -0500

----------------------------------------------------------------------
 ...xternalServerAuthenticationProviderTest.java |   1 -
 .../controller/ResourceProviderFactory.java     |  17 +-
 .../AbstractAuthorizedResourceProvider.java     |  12 +-
 .../AbstractControllerResourceProvider.java     |  81 +-
 .../internal/AbstractDRResourceProvider.java    |   9 +-
 .../internal/ActionResourceProvider.java        |  34 +-
 .../ActiveWidgetLayoutResourceProvider.java     |   2 +-
 .../AlertDefinitionResourceProvider.java        |   2 +-
 .../internal/AlertGroupResourceProvider.java    |   2 +-
 .../internal/AlertHistoryResourceProvider.java  |   2 +-
 .../internal/AlertNoticeResourceProvider.java   |   2 +-
 .../internal/AlertResourceProvider.java         |   2 +-
 .../internal/AlertTargetResourceProvider.java   |   2 +-
 .../AmbariPrivilegeResourceProvider.java        |  36 +-
 .../internal/BlueprintResourceProvider.java     |  37 +-
 .../internal/ClientConfigResourceProvider.java  |  31 +-
 ...usterKerberosDescriptorResourceProvider.java |   2 +-
 .../ClusterPrivilegeResourceProvider.java       |  31 +-
 .../internal/ClusterResourceProvider.java       |  23 +-
 .../ClusterStackVersionResourceProvider.java    |   2 +-
 .../internal/ConfigGroupResourceProvider.java   |  39 +-
 .../internal/ConfigurationResourceProvider.java |   2 +-
 .../internal/CredentialResourceProvider.java    |   2 +-
 .../internal/DefaultProviderModule.java         |  17 +-
 .../internal/ExtensionLinkResourceProvider.java |  33 +-
 .../internal/ExtensionResourceProvider.java     |  27 +-
 .../ExtensionVersionResourceProvider.java       |  32 +-
 .../internal/FeedResourceProvider.java          |  41 +-
 .../GroupPrivilegeResourceProvider.java         |  42 +-
 .../internal/GroupResourceProvider.java         |  32 +-
 .../HostComponentProcessResourceProvider.java   |  38 +-
 .../internal/HostComponentResourceProvider.java |  49 +-
 .../HostKerberosIdentityResourceProvider.java   |   2 +-
 .../internal/HostResourceProvider.java          |  51 +-
 .../HostStackVersionResourceProvider.java       |   2 +-
 .../internal/InstanceResourceProvider.java      |  35 +-
 .../internal/JobResourceProvider.java           |  57 +-
 .../KerberosDescriptorResourceProvider.java     |  20 +-
 .../internal/LdapSyncEventResourceProvider.java |  47 +-
 .../internal/LoggingResourceProvider.java       |   9 +-
 .../internal/MemberResourceProvider.java        |  29 +-
 .../OperatingSystemResourceProvider.java        |   2 +-
 .../internal/PermissionResourceProvider.java    |  25 +-
 .../internal/PrivilegeResourceProvider.java     |   2 +-
 .../QuickLinkArtifactResourceProvider.java      |   2 +-
 .../internal/ReadOnlyResourceProvider.java      |   7 -
 .../RecommendationResourceProvider.java         |  65 +-
 .../internal/RemoteClusterResourceProvider.java |  28 +-
 .../internal/RequestResourceProvider.java       |  25 +-
 .../RequestScheduleResourceProvider.java        |  55 +-
 .../RoleAuthorizationResourceProvider.java      |   2 +-
 ...eComponentConfigurationResourceProvider.java |   2 +-
 .../RootServiceComponentResourceProvider.java   |  31 +-
 ...ootServiceHostComponentResourceProvider.java |  34 +-
 .../internal/RootServiceResourceProvider.java   |  26 +-
 .../ServiceConfigVersionResourceProvider.java   |   2 +-
 .../internal/SettingResourceProvider.java       |   2 +-
 .../internal/StackAdvisorResourceProvider.java  |   7 +-
 .../internal/StackArtifactResourceProvider.java |   2 +-
 ...ConfigurationDependencyResourceProvider.java |  40 +-
 .../StackConfigurationResourceProvider.java     |  42 +-
 .../StackDependencyResourceProvider.java        |  41 +-
 ...StackLevelConfigurationResourceProvider.java |  40 +-
 .../internal/StackResourceProvider.java         |  28 +-
 .../StackServiceComponentResourceProvider.java  |  52 +-
 .../internal/StackServiceResourceProvider.java  |  45 +-
 .../internal/StackVersionResourceProvider.java  |  39 +-
 .../internal/StageResourceProvider.java         |   2 +-
 .../internal/TargetClusterResourceProvider.java |  31 +-
 .../internal/TaskAttemptResourceProvider.java   |  53 +-
 .../internal/TaskResourceProvider.java          |  27 +-
 .../internal/ThemeArtifactResourceProvider.java |   2 +-
 .../internal/UpgradeGroupResourceProvider.java  |   2 +-
 .../internal/UpgradeItemResourceProvider.java   |   2 +-
 .../internal/UpgradeResourceProvider.java       |   2 +-
 .../UpgradeSummaryResourceProvider.java         |   2 +-
 .../UserAuthorizationResourceProvider.java      |   2 +-
 .../internal/UserPrivilegeResourceProvider.java |  40 +-
 .../internal/UserResourceProvider.java          |  23 +-
 .../internal/ValidationResourceProvider.java    |  86 ++-
 .../VersionDefinitionResourceProvider.java      |   2 +-
 .../internal/ViewInstanceResourceProvider.java  |  55 +-
 .../ViewPermissionResourceProvider.java         |  29 +-
 .../internal/ViewPrivilegeResourceProvider.java |  36 +-
 .../internal/ViewResourceProvider.java          |  19 +-
 .../internal/ViewURLResourceProvider.java       |  25 +-
 .../internal/ViewVersionResourceProvider.java   |  45 +-
 .../internal/WidgetLayoutResourceProvider.java  |   2 +-
 .../internal/WidgetResourceProvider.java        |   2 +-
 .../internal/WorkflowResourceProvider.java      |  54 +-
 .../controller/utilities/PropertyHelper.java    |   6 +-
 .../system/impl/AmbariMetricSinkImpl.java       |   2 -
 .../KAFKA/0.10.0/configuration/kafka-broker.xml |   2 +-
 .../src/main/resources/key_properties.json      | 161 ----
 .../src/main/resources/properties.json          | 476 ------------
 .../HDP/2.0.6/properties/stack_packages.json    |  10 +-
 .../2.6/services/TEZ/configuration/tez-site.xml |   8 +
 .../HDP/3.0/properties/stack_packages.json      |   9 -
 .../api/query/render/MinimalRendererTest.java   |   6 +
 .../AbstractControllerResourceProviderTest.java |  10 +-
 .../AbstractDRResourceProviderTest.java         |   2 -
 .../internal/AbstractResourceProviderTest.java  |  26 +-
 .../internal/ActionResourceProviderTest.java    |   4 -
 .../ActiveWidgetLayoutResourceProviderTest.java |   2 -
 .../internal/BlueprintResourceProviderTest.java |  21 +-
 .../ClientConfigResourceProviderTest.java       |  10 -
 .../internal/ClusterControllerImplTest.java     |  14 +-
 ...rKerberosDescriptorResourceProviderTest.java |  17 -
 .../internal/ClusterResourceProviderTest.java   |  14 -
 ...ClusterStackVersionResourceProviderTest.java |  12 +-
 .../ConfigGroupResourceProviderTest.java        |   2 -
 .../ConfigurationResourceProviderTest.java      |   6 -
 .../CredentialResourceProviderTest.java         |  23 -
 .../internal/ExtensionResourceProviderTest.java |   2 -
 .../internal/FeedResourceProviderTest.java      |  29 +-
 .../internal/GroupResourceProviderTest.java     |   8 -
 ...ostComponentProcessResourceProviderTest.java |   2 -
 .../HostComponentResourceProviderTest.java      |  49 +-
 .../internal/HostResourceProviderTest.java      |  53 +-
 .../HostStackVersionResourceProviderTest.java   |  14 +-
 .../internal/InstanceResourceProviderTest.java  |  29 +-
 .../internal/JMXHostProviderTest.java           |   5 +-
 .../internal/JobResourceProviderTest.java       |  37 +-
 .../KerberosDescriptorResourceProviderTest.java |   6 +-
 .../internal/MemberResourceProviderTest.java    |  25 +-
 .../internal/RequestResourceProviderTest.java   |  42 +-
 .../RequestScheduleResourceProviderTest.java    |   2 -
 ...ootServiceComponentResourceProviderTest.java |   2 -
 ...erviceHostComponentResourceProviderTest.java |   2 -
 .../RootServiceResourceProviderTest.java        |   2 -
 .../StackAdvisorResourceProviderTest.java       |  12 +-
 .../StackArtifactResourceProviderTest.java      |   2 -
 ...igurationDependencyResourceProviderTest.java |   2 -
 .../StackConfigurationResourceProviderTest.java |   4 -
 .../StackDependencyResourceProviderTest.java    |   5 +-
 ...kLevelConfigurationResourceProviderTest.java |   4 -
 .../internal/StackResourceProviderTest.java     |   2 -
 .../StackServiceResourceProviderTest.java       |   4 -
 .../TargetClusterResourceProviderTest.java      |  28 +-
 .../TaskAttemptResourceProviderTest.java        |   2 +-
 .../internal/TaskResourceProviderTest.java      |  22 +-
 .../internal/TestIvoryProviderModule.java       |   6 +-
 .../internal/UpgradeResourceProviderTest.java   |   4 +-
 .../ValidationResourceProviderTest.java         |   3 +-
 .../internal/WorkflowResourceProviderTest.java  |  30 +-
 ambari-web/app/assets/test/tests.js             |   2 +-
 .../controllers/main/service/info/configs.js    |   5 +
 ambari-web/app/data/db_properties_info.js       |  15 +-
 ambari-web/app/messages.js                      |   6 +-
 .../mixins/common/configs/configs_comparator.js |   6 +-
 ambari-web/app/styles/application.less          |  24 +-
 ambari-web/app/styles/bootstrap_overrides.less  |   2 +-
 ambari-web/app/styles/config_history_flow.less  | 414 ----------
 .../app/styles/config_versions_control.less     | 144 ++++
 ambari-web/app/styles/widgets.less              |   7 +-
 .../configs/config_history_dropdown_row.hbs     |  24 -
 .../common/configs/config_history_flow.hbs      | 148 ----
 .../common/configs/config_versions_control.hbs  |  42 ++
 .../common/configs/config_versions_dropdown.hbs |  69 ++
 .../templates/common/configs/service_config.hbs |  97 ++-
 ambari-web/app/views.js                         |   3 +-
 .../views/common/configs/config_history_flow.js | 644 ----------------
 .../configs/config_versions_control_view.js     | 235 ++++++
 .../configs/config_versions_dropdown_view.js    |  52 ++
 .../views/common/configs/service_config_view.js |  66 ++
 ambari-web/app/views/common/controls_view.js    |   5 +-
 .../common/configs/config_history_flow_test.js  | 756 -------------------
 .../config_versions_control_view_test.js        | 152 ++++
 .../common/configs/service_config_view_test.js  |  52 +-
 .../test/views/common/controls_view_test.js     |  46 +-
 .../host_progress_popup_body_view_test.js       |   9 +-
 171 files changed, 2407 insertions(+), 4025 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/de4deaf0/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
index 523e21c,5b4967d..5849212
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
@@@ -49,15 -42,8 +42,14 @@@ public interface ResourceProviderFactor
    ResourceProvider getComponentResourceProvider(AmbariManagementController managementController);
  
    @Named("member")
-   ResourceProvider getMemberResourceProvider(Set<String> propertyIds, Map<Type, String> keyPropertyIds,
-                                              AmbariManagementController managementController);
+   ResourceProvider getMemberResourceProvider(AmbariManagementController managementController);
  
 +  @Named("user")
 +  ResourceProvider getUserResourceProvider(AmbariManagementController managementController);
 +
 +  @Named("userAuthenticationSource")
 +  ResourceProvider getUserAuthenticationSourceResourceProvider();
 +
    @Named("hostKerberosIdentity")
    ResourceProvider getHostKerberosIdentityResourceProvider(AmbariManagementController managementController);
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/de4deaf0/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
index a0a6eb1,f5e61ef..15006b0
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
@@@ -165,19 -146,17 +146,19 @@@ public abstract class AbstractControlle
        case ServiceConfigVersion:
          return new ServiceConfigVersionResourceProvider(managementController);
        case Action:
-         return new ActionResourceProvider(propertyIds, keyPropertyIds, managementController);
+         return new ActionResourceProvider(managementController);
        case Request:
-         return new RequestResourceProvider(propertyIds, keyPropertyIds, managementController);
+         return new RequestResourceProvider(managementController);
        case Task:
-         return new TaskResourceProvider(propertyIds, keyPropertyIds, managementController);
+         return new TaskResourceProvider(managementController);
        case User:
 -        return new UserResourceProvider(managementController);
 +        return resourceProviderFactory.getUserResourceProvider(managementController);
 +      case UserAuthenticationSource:
 +        return resourceProviderFactory.getUserAuthenticationSourceResourceProvider();
        case Group:
-         return new GroupResourceProvider(propertyIds, keyPropertyIds, managementController);
+         return new GroupResourceProvider(managementController);
        case Member:
-         return resourceProviderFactory.getMemberResourceProvider(propertyIds, keyPropertyIds, managementController);
+         return resourceProviderFactory.getMemberResourceProvider(managementController);
        case Upgrade:
          return resourceProviderFactory.getUpgradeResourceProvider(managementController);
        case Stack:

http://git-wip-us.apache.org/repos/asf/ambari/blob/de4deaf0/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProvider.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/de4deaf0/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserPrivilegeResourceProvider.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/de4deaf0/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserResourceProvider.java
----------------------------------------------------------------------
diff --cc ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserResourceProvider.java
index 90effac,f0709aa..6c26c9d
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/UserResourceProvider.java
@@@ -58,10 -44,7 +58,10 @@@ import org.slf4j.Logger
  import org.slf4j.LoggerFactory;
  
  import com.google.common.collect.ImmutableMap;
- import com.google.common.collect.ImmutableSet;
+ import com.google.common.collect.Sets;
 +import com.google.inject.Inject;
 +import com.google.inject.assistedinject.Assisted;
 +import com.google.inject.assistedinject.AssistedInject;
  
  /**
   * Resource provider for user resources.
@@@ -72,80 -55,40 +72,81 @@@ public class UserResourceProvider exten
  
    // ----- Property ID constants ---------------------------------------------
  
 +  public static final String USER_RESOURCE_CATEGORY = "Users";
 +
    // Users
 -  public static final String USER_USERNAME_PROPERTY_ID     = PropertyHelper.getPropertyId("Users", "user_name");
 -  public static final String USER_PASSWORD_PROPERTY_ID     = PropertyHelper.getPropertyId("Users", "password");
 -  public static final String USER_OLD_PASSWORD_PROPERTY_ID = PropertyHelper.getPropertyId("Users", "old_password");
 -  public static final String USER_LDAP_USER_PROPERTY_ID    = PropertyHelper.getPropertyId("Users", "ldap_user");
 -  public static final String USER_TYPE_PROPERTY_ID         = PropertyHelper.getPropertyId("Users", "user_type");
 -  public static final String USER_ACTIVE_PROPERTY_ID       = PropertyHelper.getPropertyId("Users", "active");
 -  public static final String USER_GROUPS_PROPERTY_ID       = PropertyHelper.getPropertyId("Users", "groups");
 -  public static final String USER_ADMIN_PROPERTY_ID        = PropertyHelper.getPropertyId("Users", "admin");
 +  public static final String USERNAME_PROPERTY_ID = "user_name";
 +  public static final String DISPLAY_NAME_PROPERTY_ID = "display_name";
 +  public static final String LOCAL_USERNAME_PROPERTY_ID = "local_user_name";
 +  public static final String ACTIVE_PROPERTY_ID = "active";
 +  public static final String CREATE_TIME_PROPERTY_ID = "created";
 +  public static final String CONSECUTIVE_FAILURES_PROPERTY_ID = "consecutive_failures";
 +  public static final String ADMIN_PROPERTY_ID = "admin";
 +  public static final String GROUPS_PROPERTY_ID = "groups";
 +
 +  public static final String USER_USERNAME_PROPERTY_ID = USER_RESOURCE_CATEGORY + "/" + USERNAME_PROPERTY_ID;
 +  public static final String USER_DISPLAY_NAME_PROPERTY_ID = USER_RESOURCE_CATEGORY + "/" + DISPLAY_NAME_PROPERTY_ID;
 +  public static final String USER_LOCAL_USERNAME_PROPERTY_ID = USER_RESOURCE_CATEGORY + "/" + LOCAL_USERNAME_PROPERTY_ID;
 +  public static final String USER_ACTIVE_PROPERTY_ID = USER_RESOURCE_CATEGORY + "/" + ACTIVE_PROPERTY_ID;
 +  public static final String USER_CREATE_TIME_PROPERTY_ID = USER_RESOURCE_CATEGORY + "/" + CREATE_TIME_PROPERTY_ID;
 +  public static final String USER_CONSECUTIVE_FAILURES_PROPERTY_ID = USER_RESOURCE_CATEGORY + "/" + CONSECUTIVE_FAILURES_PROPERTY_ID;
 +  public static final String USER_ADMIN_PROPERTY_ID = USER_RESOURCE_CATEGORY + "/" + ADMIN_PROPERTY_ID;
 +  public static final String USER_GROUPS_PROPERTY_ID = USER_RESOURCE_CATEGORY + "/" + GROUPS_PROPERTY_ID;
 +
 +  /* *******************************************************
 +   * Deprecated properties, kept for backwards compatibility and to maintain API V1 contract.
 +   * These properties are related to a user's authentication resource.
 +   * ******************************************************* */
 +  @Deprecated
 +  public static final String PASSWORD_PROPERTY_ID = "password";
 +  @Deprecated
 +  public static final String OLD_PASSWORD_PROPERTY_ID = "old_password";
 +  @Deprecated
 +  public static final String LDAP_USER_PROPERTY_ID = "ldap_user";
 +  @Deprecated
 +  public static final String USER_TYPE_PROPERTY_ID = "user_type";
 +
 +  @Deprecated
 +  public static final String USER_PASSWORD_PROPERTY_ID = USER_RESOURCE_CATEGORY + "/" + PASSWORD_PROPERTY_ID;
 +  @Deprecated
 +  public static final String USER_OLD_PASSWORD_PROPERTY_ID = USER_RESOURCE_CATEGORY + "/" + OLD_PASSWORD_PROPERTY_ID;
 +  @Deprecated
 +  public static final String USER_LDAP_USER_PROPERTY_ID = USER_RESOURCE_CATEGORY + "/" + LDAP_USER_PROPERTY_ID;
 +  @Deprecated
 +  public static final String USER_USER_TYPE_PROPERTY_ID = USER_RESOURCE_CATEGORY + "/" + USER_TYPE_PROPERTY_ID;
 +  /* ******************************************************* */
  
-   private static final Set<String> PK_PROPERTY_IDS = ImmutableSet.of(
-       USER_USERNAME_PROPERTY_ID
-   );
-   private static final Set<String> PROPERTY_IDS = ImmutableSet.of(
+   /**
+    * The key property ids for a User resource.
+    */
+   private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+       .put(Resource.Type.User, USER_USERNAME_PROPERTY_ID)
+       .build();
+ 
 -  /**
 -   * The property ids for a User resource.
 -   */
+   private static Set<String> propertyIds = Sets.newHashSet(
        USER_USERNAME_PROPERTY_ID,
 +      USER_DISPLAY_NAME_PROPERTY_ID,
 +      USER_LOCAL_USERNAME_PROPERTY_ID,
 +      USER_ACTIVE_PROPERTY_ID,
 +      USER_CREATE_TIME_PROPERTY_ID,
 +      USER_CONSECUTIVE_FAILURES_PROPERTY_ID,
 +      USER_GROUPS_PROPERTY_ID,
        USER_PASSWORD_PROPERTY_ID,
        USER_OLD_PASSWORD_PROPERTY_ID,
        USER_LDAP_USER_PROPERTY_ID,
 -      USER_TYPE_PROPERTY_ID,
 -      USER_ACTIVE_PROPERTY_ID,
 -      USER_GROUPS_PROPERTY_ID,
 -      USER_ADMIN_PROPERTY_ID);
 +      USER_USER_TYPE_PROPERTY_ID,
 +      USER_ADMIN_PROPERTY_ID
 +  );
-   private static final Map<Resource.Type, String> KEY_PROPERTY_IDS = ImmutableMap.of(
-       Resource.Type.User, USER_USERNAME_PROPERTY_ID
-   );
 +
 +  @Inject
 +  private Users users;
 +
    /**
     * Create a new resource provider for the given management controller.
     */
 -  UserResourceProvider(AmbariManagementController managementController) {
 +  @AssistedInject
 +  UserResourceProvider(@Assisted AmbariManagementController managementController) {
-     super(Resource.Type.User, PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
+     super(Resource.Type.User, propertyIds, keyPropertyIds, managementController);
  
      setRequiredCreateAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_MANAGE_USERS));
      setRequiredDeleteAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_MANAGE_USERS));
@@@ -337,348 -260,6 +338,346 @@@
        request.setAdmin(Boolean.valueOf(properties.get(USER_ADMIN_PROPERTY_ID).toString()));
      }
  
 +    if (null != properties.get(USER_CONSECUTIVE_FAILURES_PROPERTY_ID)) {
 +      request.setConsecutiveFailures(Integer.parseInt(properties.get(USER_CONSECUTIVE_FAILURES_PROPERTY_ID).toString()));
 +    }
 +
      return request;
    }
 +
 +
 +  /**
 +   * Creates users.
 +   *
 +   * @param requests the request objects which define the user.
 +   * @throws AmbariException when the user cannot be created.
 +   */
 +  private void createUsers(Set<UserRequest> requests) throws AmbariException, ResourceAlreadyExistsException, AuthorizationException {
 +    // First check for obvious issues... then try to create the accounts.  This will help to avoid
 +    // some accounts being created and some not due to an issue with one or more of the users.
 +    for (UserRequest request : requests) {
 +      String username = request.getUsername();
 +
 +      if (StringUtils.isEmpty(username)) {
 +        throw new AmbariException("Username must be supplied.");
 +      }
 +
 +      if (users.getUser(username) != null) {
 +        String message;
 +        if (requests.size() == 1) {
 +          message = "The requested username already exists.";
 +        } else {
 +          message = "One or more of the requested usernames already exists.";
 +        }
 +        throw new ResourceAlreadyExistsException(message);
 +      }
 +    }
 +
 +    for (UserRequest request : requests) {
 +      String username = request.getUsername();
 +      String displayName = StringUtils.defaultIfEmpty(request.getDisplayName(), username);
 +      String localUserName = StringUtils.defaultIfEmpty(request.getLocalUserName(), username);
 +
 +      UserEntity userEntity = users.createUser(username, localUserName, displayName, request.isActive());
 +      if (userEntity != null) {
 +        if (Boolean.TRUE.equals(request.isAdmin())) {
 +          users.grantAdminPrivilege(userEntity);
 +        }
 +
 +        // Setting a user's the password here is to allow for backward compatibility with pre-Ambari-3.0
 +        // versions so that the contract for REST API V1 is maintained.
 +        if (!StringUtils.isEmpty(request.getPassword())) {
 +          // This is performed as a user administrator since the  authorization check was done prior
 +          // to executing #createResourcesAuthorized.
 +          addOrUpdateLocalAuthenticationSource(true, userEntity, request.getPassword(), null);
 +        }
 +      }
 +    }
 +  }
 +
 +  /**
 +   * Updates the users specified.
 +   *
 +   * @param requests the users to modify
 +   * @throws AmbariException          if the resources cannot be updated
 +   * @throws IllegalArgumentException if the authenticated user is not authorized to update all of
 +   *                                  the requested properties
 +   */
 +  private void updateUsers(Set<UserRequest> requests) throws AmbariException, AuthorizationException {
 +    boolean asUserAdministrator = AuthorizationHelper.isAuthorized(ResourceType.AMBARI, null,
 +        RoleAuthorization.AMBARI_MANAGE_USERS);
 +    String authenticatedUsername = AuthorizationHelper.getAuthenticatedName();
 +
 +    for (final UserRequest request : requests) {
 +      String requestedUsername = request.getUsername();
 +
 +      // An administrator can modify any user, else a user can only modify themself.
 +      if (!asUserAdministrator && (!authenticatedUsername.equalsIgnoreCase(requestedUsername))) {
 +        throw new AuthorizationException();
 +      }
 +
 +      UserEntity userEntity = users.getUserEntity(requestedUsername);
 +      if (null == userEntity) {// Only an user with the privs to manage users can update a user's active status
 +        continue;
 +      }
 +
 +      boolean hasUpdates = false;
 +      if (isValueChanged(request.isActive(), userEntity.getActive())) {
 +        // If this value is being set, make sure the authenticated user is an administrator before
 +        // allowing to change it. Only administrators should be able to change a user's active state
 +        if (!asUserAdministrator) {
 +          throw new AuthorizationException("The authenticated user is not authorized to update the requested user's active property");
 +        }
 +
 +        hasUpdates = true;
 +      }
 +
 +      // Only an user with the privs to manage users can update a user's local username
 +      if (isValueChanged(request.getLocalUserName(), userEntity.getLocalUsername())) {
 +        // If this value is being set, make sure the authenticated user is an administrator before
 +        // allowing to change it. Only administrators should be able to change a user's active state
 +        if (!asUserAdministrator) {
 +          throw new AuthorizationException("The authenticated user is not authorized to update the requested user's local username property");
 +        }
 +
 +        hasUpdates = true;
 +      }
 +
 +      hasUpdates = hasUpdates || isValueChanged(request.getDisplayName(), userEntity.getDisplayName());
 +
 +      if (hasUpdates) {
 +        users.safelyUpdateUserEntity(userEntity,
 +            new Users.Command() {
 +              @Override
 +              public void perform(UserEntity userEntity) {
 +                if (isValueChanged(request.isActive(), userEntity.getActive())) {
 +                  userEntity.setActive(request.isActive());
 +                }
 +
 +                if (isValueChanged(request.getLocalUserName(), userEntity.getLocalUsername())) {
 +                  userEntity.setLocalUsername(request.getLocalUserName());
 +                }
 +
 +                if (isValueChanged(request.getDisplayName(), userEntity.getDisplayName())) {
 +                  userEntity.setDisplayName(request.getDisplayName());
 +                }
 +              }
 +            });
 +      }
 +
 +      // Only an user with the privs to manage users can update a user's roles
 +      if (null != request.isAdmin()) {
 +        // If this value is being set, make sure the authenticated user is an administrator before
 +        // allowing to change it. Only administrators should be able to change a user's administrative
 +        // privileges
 +        if (!asUserAdministrator) {
 +          throw new AuthorizationException("The authenticated user is not authorized to update the requested resource property");
 +        }
 +
 +        if (request.isAdmin()) {
 +          users.grantAdminPrivilege(userEntity);
 +        } else {
 +          users.revokeAdminPrivilege(userEntity);
 +        }
 +      }
 +
 +      // Setting/Changing a user's password here is for backward compatibility to maintain API V1 contract
 +      if (request.getPassword() != null) {
 +        addOrUpdateLocalAuthenticationSource(asUserAdministrator, userEntity, request.getPassword(), request.getOldPassword());
 +      }
 +
 +      if (request.getConsecutiveFailures() != null) {
 +        if (!asUserAdministrator) {
 +          throw new AuthorizationException("The authenticated user is not authorized to update the requested resource property");
 +        }
 +        users.safelyUpdateUserEntity(userEntity, user -> user.setConsecutiveFailures(request.getConsecutiveFailures()));
 +      }
 +    }
 +  }
 +
 +  /**
 +   * Adds to updates a user's local authentication source by issuing a call to the {@link UserAuthenticationSourceResourceProvider}.
 +   * <p>
 +   * This is for backward compatibility to maintain the contract for Ambari's REST API version V1.
 +   *
 +   * @param asUserAdministrator true if the authenticated user have privs to manage user; false otherwise
 +   * @param subjectUserEntity   the user to update
 +   * @param password            the password to set, it is expected that this value is not <code>null</code>
 +   * @param oldPassword         the old/current password to use for verification is needed, this value may be <code>null</code>
 +   */
 +  private void addOrUpdateLocalAuthenticationSource(boolean asUserAdministrator, UserEntity subjectUserEntity, String password, String oldPassword)
 +      throws AuthorizationException, AmbariException {
 +    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(Resource.Type.UserAuthenticationSource,
-         PropertyHelper.getPropertyIds(Resource.Type.UserAuthenticationSource),
-         PropertyHelper.getKeyPropertyIds(Resource.Type.UserAuthenticationSource),
 +        getManagementController());
 +
 +    if (provider != null) {
 +      // Determine if the user already has an LOCAL authentication source setup...
 +      UserAuthenticationEntity userAuthenticationEntity = null;
 +      List<UserAuthenticationEntity> authenticationEntities = subjectUserEntity.getAuthenticationEntities();
 +      for (UserAuthenticationEntity authenticationEntity : authenticationEntities) {
 +        if (authenticationEntity.getAuthenticationType() == UserAuthenticationType.LOCAL) {
 +          userAuthenticationEntity = authenticationEntity;
 +          break;
 +        }
 +      }
 +      if (userAuthenticationEntity == null) {
 +        // a new authentication source needs to be create... only a privileged user can do this...
 +        if (!asUserAdministrator) {
 +          throw new AuthorizationException("The authenticated user is not authorized to create a local authentication source.");
 +        } else {
 +          Set<Map<String, Object>> propertiesSet = new HashSet<>();
 +          Map<String, Object> properties;
 +          properties = new LinkedHashMap<>();
 +          properties.put(UserAuthenticationSourceResourceProvider.AUTHENTICATION_USER_NAME_PROPERTY_ID, subjectUserEntity.getUserName());
 +          properties.put(UserAuthenticationSourceResourceProvider.AUTHENTICATION_AUTHENTICATION_TYPE_PROPERTY_ID, UserAuthenticationType.LOCAL.name());
 +          properties.put(UserAuthenticationSourceResourceProvider.AUTHENTICATION_KEY_PROPERTY_ID, password);
 +          propertiesSet.add(properties);
 +
 +          try {
 +            provider.createResources(PropertyHelper.getCreateRequest(propertiesSet, null));
 +          } catch (Exception e) {
 +            throw new AmbariException(e.getMessage(), e);
 +          }
 +        }
 +      } else {
 +        Map<String, Object> properties = new LinkedHashMap<>();
 +        properties.put(UserAuthenticationSourceResourceProvider.AUTHENTICATION_OLD_KEY_PROPERTY_ID, oldPassword);
 +        properties.put(UserAuthenticationSourceResourceProvider.AUTHENTICATION_KEY_PROPERTY_ID, password);
 +
 +        Predicate predicate1 = new PredicateBuilder()
 +            .property(UserAuthenticationSourceResourceProvider.AUTHENTICATION_USER_NAME_PROPERTY_ID)
 +            .equals(subjectUserEntity.getUserName())
 +            .toPredicate();
 +        Predicate predicate2 = new PredicateBuilder()
 +            .property(UserAuthenticationSourceResourceProvider.AUTHENTICATION_AUTHENTICATION_SOURCE_ID_PROPERTY_ID)
 +            .equals(userAuthenticationEntity.getUserAuthenticationId())
 +            .toPredicate();
 +
 +        try {
 +          provider.updateResources(PropertyHelper.getUpdateRequest(properties, null), new AndPredicate(predicate1, predicate2));
 +        } catch (Exception e) {
 +          throw new AmbariException(e.getMessage(), e);
 +        }
 +      }
 +    }
 +  }
 +
 +  private boolean isValueChanged(Object newValue, Object currentValue) {
 +    return (newValue != null) && !newValue.equals(currentValue);
 +  }
 +
 +  /**
 +   * Deletes the users specified.
 +   *
 +   * @param requests the users to delete
 +   * @throws AmbariException if the resources cannot be deleted
 +   */
 +  private void deleteUsers(Set<UserRequest> requests)
 +      throws AmbariException {
 +
 +    for (UserRequest r : requests) {
 +      String username = r.getUsername();
 +      if (!StringUtils.isEmpty(username)) {
 +
 +        if (LOG.isDebugEnabled()) {
 +          LOG.debug("Received a delete user request, username= {}", username);
 +        }
 +
 +        users.removeUser(users.getUserEntity(username));
 +      }
 +    }
 +  }
 +
 +  /**
 +   * Gets the users identified by the given request objects.
 +   *
 +   * @param requests the request objects
 +   * @return a set of user responses
 +   * @throws AmbariException if the users could not be read
 +   */
 +  private Set<UserResponse> getUsers(Set<UserRequest> requests)
 +      throws AmbariException, AuthorizationException {
 +
 +    Set<UserResponse> responses = new HashSet<>();
 +
 +    for (UserRequest r : requests) {
 +
 +      if (LOG.isDebugEnabled()) {
 +        LOG.debug("Received a getUsers request, userRequest={}", r.toString());
 +      }
 +
 +      String requestedUsername = r.getUsername();
 +      String authenticatedUsername = AuthorizationHelper.getAuthenticatedName();
 +
 +      // A user resource may be retrieved by an administrator or the same user.
 +      if (!AuthorizationHelper.isAuthorized(ResourceType.AMBARI, null, RoleAuthorization.AMBARI_MANAGE_USERS)) {
 +        if (null == requestedUsername) {
 +          // Since the authenticated user is not the administrator, force only that user's resource
 +          // to be returned
 +          requestedUsername = authenticatedUsername;
 +        } else if (!requestedUsername.equalsIgnoreCase(authenticatedUsername)) {
 +          // Since the authenticated user is not the administrator and is asking for a different user,
 +          // throw an AuthorizationException
 +          throw new AuthorizationException();
 +        }
 +      }
 +
 +      // get them all
 +      if (null == requestedUsername) {
 +        for (UserEntity u : users.getAllUserEntities()) {
 +          responses.add(createUserResponse(u));
 +        }
 +      } else {
 +
 +        UserEntity u = users.getUserEntity(requestedUsername);
 +        if (null == u) {
 +          if (requests.size() == 1) {
 +            // only throw exceptin if there is a single request
 +            // if there are multiple requests, this indicates an OR predicate
 +            throw new ObjectNotFoundException("Cannot find user '"
 +                + requestedUsername + "'");
 +          }
 +        } else {
 +          responses.add(createUserResponse(u));
 +        }
 +      }
 +    }
 +
 +    return responses;
 +  }
 +
 +  private UserResponse createUserResponse(UserEntity userEntity) {
 +    List<UserAuthenticationEntity> authenticationEntities = userEntity.getAuthenticationEntities();
 +    boolean isLdapUser = false;
 +    UserAuthenticationType userType = UserAuthenticationType.LOCAL;
 +
 +    for (UserAuthenticationEntity authenticationEntity : authenticationEntities) {
 +      if (authenticationEntity.getAuthenticationType() == UserAuthenticationType.LDAP) {
 +        isLdapUser = true;
 +        userType = UserAuthenticationType.LDAP;
 +      } else if (authenticationEntity.getAuthenticationType() == UserAuthenticationType.PAM) {
 +        userType = UserAuthenticationType.PAM;
 +      }
 +    }
 +
 +    Set<String> groups = new HashSet<>();
 +    for (MemberEntity memberEntity : userEntity.getMemberEntities()) {
 +      groups.add(memberEntity.getGroup().getGroupName());
 +    }
 +
 +    boolean isAdmin = users.hasAdminPrivilege(userEntity);
 +
 +    UserResponse userResponse = new UserResponse(userEntity.getUserName(),
 +        userEntity.getDisplayName(),
 +        userEntity.getLocalUsername(),
 +        userType,
 +        isLdapUser,
 +        userEntity.getActive(),
 +        isAdmin,
 +        userEntity.getConsecutiveFailures(),
 +        userEntity.getCreateTime());
 +    userResponse.setGroups(groups);
 +    return userResponse;
 +  }
 +
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/de4deaf0/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProviderTest.java
----------------------------------------------------------------------


[05/13] ambari git commit: AMBARI-22353. Remove properties.json And Switch To Adding Properties to ResourceProviders Dynamically (dlysnichenko)

Posted by rl...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/resources/properties.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/properties.json b/ambari-server/src/main/resources/properties.json
deleted file mode 100644
index 1d12f83..0000000
--- a/ambari-server/src/main/resources/properties.json
+++ /dev/null
@@ -1,487 +0,0 @@
-{
-    "Cluster":[
-        "Clusters/cluster_id",
-        "Clusters/cluster_name",
-        "Clusters/provisioning_state",
-        "Clusters/security_type",
-        "Clusters/version",
-        "Clusters/state",
-        "Clusters/desired_configs",
-        "Clusters/desired_service_config_versions",
-        "Clusters/total_hosts",
-        "Clusters/health_report",
-        "_"
-    ],
-    "Host":[
-        "Hosts/cluster_name",
-        "Hosts/host_name",
-        "Hosts/ip",
-        "Hosts/attributes",
-        "Hosts/total_mem",
-        "Hosts/cpu_count",
-        "Hosts/ph_cpu_count",
-        "Hosts/os_arch",
-        "Hosts/os_type",
-        "Hosts/os_family",
-        "Hosts/rack_info",
-        "Hosts/last_heartbeat_time",
-        "Hosts/last_agent_env",
-        "Hosts/last_registration_time",
-        "Hosts/disk_info",
-        "Hosts/host_status",
-        "Hosts/host_health_report",
-        "Hosts/public_host_name",
-        "Hosts/host_state",
-        "Hosts/maintenance_state",
-        "Hosts/desired_configs",
-        "Hosts/recovery_report",
-        "Hosts/recovery_summary",
-        "_"
-    ],
-    "HostComponent":[
-        "HostRoles/role_id",
-        "HostRoles/cluster_name",
-        "HostRoles/host_name",
-        "HostRoles/public_host_name",
-        "HostRoles/component_name",
-        "HostRoles/display_name",
-        "HostRoles/state",
-        "HostRoles/desired_state",
-        "HostRoles/version",
-        "HostRoles/desired_stack_id",
-        "HostRoles/desired_repository_version",
-        "HostRoles/actual_configs",
-        "params/run_smoke_test",
-        "HostRoles/stale_configs",
-        "HostRoles/reload_configs",
-        "HostRoles/desired_admin_state",
-        "HostRoles/maintenance_state",
-        "HostRoles/service_name",
-        "HostRoles/upgrade_state",
-        "_"
-    ],
-    "ConfigGroup": [
-        "ConfigGroup/id",
-        "ConfigGroup/cluster_name",
-        "ConfigGroup/group_name",
-        "ConfigGroup/service_name",
-        "ConfigGroup/tag",
-        "ConfigGroup/description",
-        "ConfigGroup/hosts",
-        "ConfigGroup/desired_configs"
-    ],
-    "Action":[
-        "Actions/action_name",
-        "Actions/action_type",
-        "Actions/inputs",
-        "Actions/target_service",
-        "Actions/target_component",
-        "Actions/description",
-        "Actions/target_type",
-        "Actions/default_timeout",
-        "_"
-    ],
-    "Request":[
-        "Requests/id",
-        "Requests/cluster_name",
-        "Requests/request_status",
-        "Requests/request_context",
-        "Requests/request_schedule",
-        "Requests/type",
-        "Requests/inputs",
-        "Requests/resource_filters",
-        "Requests/operation_level",
-        "Requests/create_time",
-        "Requests/start_time",
-        "Requests/end_time",
-        "Requests/exclusive",
-        "Requests/task_count",
-        "Requests/failed_task_count",
-        "Requests/aborted_task_count",
-        "Requests/timed_out_task_count",
-        "Requests/completed_task_count",
-        "Requests/queued_task_count",
-        "Requests/progress_percent",
-        "Requests/abort_reason",
-        "Requests/remove_pending_host_requests",
-        "Requests/pending_host_request_count",
-        "Requests/cluster_host_info",
-        "_"
-    ],
-    "RequestSchedule" : [
-        "RequestSchedule/id",
-        "RequestSchedule/cluster_name",
-        "RequestSchedule/description",
-        "RequestSchedule/status",
-        "RequestSchedule/last_execution_status",
-        "RequestSchedule/batch",
-        "RequestSchedule/schedule",
-        "_"
-    ],
-    "Task":[
-        "Tasks/id",
-        "Tasks/request_id",
-        "Tasks/cluster_name",
-        "Tasks/stage_id",
-        "Tasks/host_name",
-        "Tasks/role",
-        "Tasks/command",
-        "Tasks/status",
-        "Tasks/exit_code",
-        "Tasks/stderr",
-        "Tasks/stdout",
-        "Tasks/output_log",
-        "Tasks/error_log",
-        "Tasks/start_time",
-        "Tasks/end_time",
-        "Tasks/structured_out",
-        "Tasks/attempt_cnt",
-        "Tasks/custom_command_name",
-        "Tasks/command_detail",
-        "Tasks/ops_display_name",
-        "_"
-    ],
-    "User":[
-        "Users/user_name",
-        "Users/password",
-        "Users/old_password",
-        "Users/ldap_user",
-        "Users/user_type",
-        "Users/active",
-        "Users/groups",
-        "Users/admin",
-        "_"
-    ],
-    "Group":[
-        "Groups/group_name",
-        "Groups/ldap_group",
-        "Groups/group_type",
-        "_"
-    ],
-    "Member":[
-        "MemberInfo/group_name",
-        "MemberInfo/user_name",
-        "_"
-    ],
-    "Stack":[
-        "Stacks/stack_name",
-        "_"
-    ],
-    "StackVersion":[
-        "Versions/stack_name",
-        "Versions/stack_version",
-        "Versions/min_upgrade_version",
-        "Versions/active",
-        "Versions/valid",
-        "Versions/stack-errors",
-        "Versions/parent_stack_version",
-        "Versions/config_types",
-        "Versions/upgrade_packs",
-        "_"
-    ],
-    "StackService":[
-        "StackServices/stack_name",
-        "StackServices/stack_version",
-        "StackServices/service_name",
-        "StackServices/display_name",
-        "StackServices/selection",
-        "StackServices/user_name",
-        "StackServices/comments",
-        "StackServices/service_version",
-        "StackServices/config_types",
-        "StackServices/service_check_supported",
-        "StackServices/custom_commands",
-        "StackServices/required_services",
-        "StackServices/credential_store_supported",
-        "StackServices/credential_store_enabled",
-        "StackServices/credential_store_required",
-        "StackServices/properties",
-        "StackServices/support_delete_via_ui",
-        "_"
-    ],
-    "StackConfiguration":[
-        "StackConfigurations/stack_name",
-        "StackConfigurations/stack_version",
-        "StackConfigurations/service_name",
-        "StackConfigurations/property_name",
-        "StackConfigurations/property_value",
-        "StackConfigurations/property_value_attributes",
-        "StackConfigurations/property_depends_on",
-        "StackConfigurations/property_description",
-        "StackConfigurations/property_display_name",
-        "StackConfigurations/type",
-        "StackConfigurations/final",
-        "StackConfigurations/adding_forbidden",
-        "StackConfigurations/do_not_extend",
-        "StackConfigurations/property_type",
-        "_"
-    ],
-    "StackServiceComponent":[
-        "StackServiceComponents/stack_name",
-        "StackServiceComponents/stack_version",
-        "StackServiceComponents/service_name",
-        "StackServiceComponents/component_name",
-        "StackServiceComponents/display_name",
-        "StackServiceComponents/component_category",
-        "StackServiceComponents/is_client",
-        "StackServiceComponents/is_master",
-        "StackServiceComponents/cardinality",
-        "StackServiceComponents/custom_commands",
-        "StackServiceComponents/recovery_enabled",
-        "StackServiceComponents/advertise_version",
-        "StackServiceComponents/decommission_allowed",
-        "StackServiceComponents/reassign_allowed",
-        "StackServiceComponents/has_bulk_commands_definition",
-        "StackServiceComponents/bulk_commands_display_name",
-        "StackServiceComponents/bulk_commands_master_component_name",
-        "StackServiceComponents/rolling_restart_supported",
-        "auto_deploy/enabled",
-        "auto_deploy/location",
-        "_"
-    ],
-    "StackServiceComponentDependency" :[
-        "Dependencies/stack_name",
-        "Dependencies/stack_version",
-        "Dependencies/dependent_service_name",
-        "Dependencies/dependent_component_name",
-        "Dependencies/service_name",
-        "Dependencies/component_name",
-        "Dependencies/scope",
-        "Dependencies/conditions",
-        "auto_deploy/enabled",
-        "auto_deploy/location"
-    ],
-    "ExtensionLink": [
-        "ExtensionLink/link_id",
-        "ExtensionLink/stack_name",
-        "ExtensionLink/stack_version",
-        "ExtensionLink/extension_name",
-        "ExtensionLink/extension_version",
-        "_"
-    ],
-    "Extension":[
-        "Extensions/extension_name",
-        "_"
-    ],
-    "ExtensionVersion":[
-        "Versions/extension_name",
-        "Versions/extension_version",
-        "Versions/valid",
-        "Versions/extension-errors",
-        "Versions/parent_extension_version",
-        "_"
-    ],
-    "DRFeed":[
-        "Feed/name",
-        "Feed/description",
-        "Feed/status",
-        "Feed/frequency",
-        "Feed/sourceCluster",
-        "Feed/targetCluster",
-        "Feed/properties"
-    ],
-    "DRTargetCluster":[
-        "Cluster/name",
-        "Cluster/colo",
-        "Cluster/interfaces",
-        "Cluster/locations",
-        "Cluster/properties"
-    ],
-    "DRInstance":[
-        "Instance/feedName",
-        "Instance/id",
-        "Instance/status",
-        "Instance/startTime",
-        "Instance/endTime",
-        "Instance/details",
-        "Instance/log"
-    ],
-    "Workflow":[
-        "Workflow/cluster_name",
-        "Workflow/workflow_id",
-        "Workflow/name",
-        "Workflow/user_name",
-        "Workflow/start_time",
-        "Workflow/last_update_time",
-        "Workflow/elapsed_time",
-        "Workflow/input_bytes",
-        "Workflow/output_bytes",
-        "Workflow/num_jobs_total",
-        "Workflow/num_jobs_completed",
-        "Workflow/parent_id",
-        "Workflow/context"
-    ],
-    "Job":[
-        "Job/cluster_name",
-        "Job/workflow_id",
-        "Job/job_id",
-        "Job/name",
-        "Job/status",
-        "Job/user_name",
-        "Job/submit_time",
-        "Job/elapsed_time",
-        "Job/maps",
-        "Job/reduces",
-        "Job/input_bytes",
-        "Job/output_bytes",
-        "Job/conf_path",
-        "Job/workflow_entity_name"
-    ],
-    "TaskAttempt":[
-        "TaskAttempt/cluster_name",
-        "TaskAttempt/workflow_id",
-        "TaskAttempt/job_id",
-        "TaskAttempt/task_attempt_id",
-        "TaskAttempt/type",
-        "TaskAttempt/start_time",
-        "TaskAttempt/finish_time",
-        "TaskAttempt/map_finish_time",
-        "TaskAttempt/shuffle_finish_time",
-        "TaskAttempt/sort_finish_fime",
-        "TaskAttempt/input_bytes",
-        "TaskAttempt/output_bytes",
-        "TaskAttempt/status",
-        "TaskAttempt/locality"
-    ],
-    "RootService":[
-        "RootService/service_name"
-    ],
-    "RootServiceComponent":[
-        "RootServiceComponents/service_name",
-        "RootServiceComponents/component_name",
-        "RootServiceComponents/properties",
-        "RootServiceComponents/component_version",
-        "RootServiceComponents/server_clock"
-    ],
-    "RootServiceHostComponent":[
-        "RootServiceHostComponents/service_name",
-        "RootServiceHostComponents/component_name",
-        "RootServiceHostComponents/host_name",
-        "RootServiceHostComponents/component_state",
-        "RootServiceHostComponents/component_version",
-        "RootServiceHostComponents/properties"
-     ],
-    "Blueprint":[
-        "Blueprints/blueprint_name",
-        "Blueprints/stack_name",
-        "Blueprints/stack_version",
-        "Blueprints/security",
-        "host_groups",
-        "host_groups/components",
-        "host_groups/cardinality",
-        "configurations",
-        "validate_topology",
-        "settings"
-    ],
-    "Recommendation":[
-        "Recommendation/id",
-        "Versions/stack_name",
-        "Versions/stack_version",
-        "recommend",
-        "hosts",
-        "services",
-        "changed_configurations",
-        "user_context",
-        "user_context/operation",
-        "user_context/operation_details",
-        "recommendations",
-        "recommendations/blueprint",
-        "recommendations/blueprint/configurations",
-        "recommendations/blueprint/host_groups",
-        "recommendations/blueprint/host_groups/name",
-        "recommendations/blueprint/host_groups/components",
-        "recommendations/blueprint_cluster_binding",
-        "recommendations/blueprint_cluster_binding/host_groups",
-        "recommendations/blueprint_cluster_binding/host_groups/name",
-        "recommendations/blueprint_cluster_binding/host_groups/hosts",
-        "recommendations/config_groups"
-    ],
-    "Validation":[
-        "Validation/id",
-        "Versions/stack_name",
-        "Versions/stack_version",
-        "items",
-        "items/type",
-        "items/level",
-        "items/message",
-        "items/component-name",
-        "items/host",
-        "items/config-type",
-        "items/config-name",
-        "items/host-group",
-        "validate",
-        "hosts",
-        "services",
-        "recommendations"
-    ],
-    "HostComponentProcess": [
-      "HostComponentProcess/cluster_name",
-      "HostComponentProcess/host_name",
-      "HostComponentProcess/component_name",
-      "HostComponentProcess/name",
-      "HostComponentProcess/status"
-    ],
-    "ClientConfig":[
-        "ServiceComponentInfo/service_name",
-        "ServiceComponentInfo/component_name",
-        "ServiceComponentInfo/cluster_name",
-        "HostRoles/host_name",
-        "_"
-    ],
-    "Widget":[
-      "WidgetInfo/id",
-      "WidgetInfo/cluster_name",
-      "WidgetInfo/widget_name",
-      "WidgetInfo/display_name",
-      "WidgetInfo/widget_type",
-      "WidgetInfo/time_created",
-      "WidgetInfo/author",
-      "WidgetInfo/description",
-      "WidgetInfo/scope",
-      "WidgetInfo/metrics",
-      "WidgetInfo/values",
-      "WidgetInfo/properties",
-      "_"
-    ],
-    "WidgetLayout":[
-      "WidgetLayoutInfo/id",
-      "WidgetLayoutInfo/section_name",
-      "WidgetLayoutInfo/cluster_name",
-      "WidgetLayoutInfo/layout_name",
-      "WidgetLayoutInfo/display_name",
-      "WidgetLayoutInfo/scope",
-      "WidgetLayoutInfo/user_name",
-      "WidgetLayoutInfo/WidgetsInfo",
-      "User/user_name",
-      "_"
-    ],
-    "StackLevelConfiguration":[
-        "StackLevelConfigurations/stack_name",
-        "StackLevelConfigurations/stack_version",
-        "StackLevelConfigurations/property_name",
-        "StackLevelConfigurations/property_value",
-        "StackLevelConfigurations/property_display_name",
-        "StackLevelConfigurations/property_value_attributes",
-        "StackLevelConfigurations/property_depends_on",
-        "StackLevelConfigurations/property_description",
-        "StackLevelConfigurations/type",
-        "StackLevelConfigurations/final",
-        "StackLevelConfigurations/property_type",
-        "_"
-    ],
-    "StackConfigurationDependency":[
-        "StackConfigurationDependency/stack_name",
-        "StackConfigurationDependency/stack_version",
-        "StackConfigurationDependency/service_name",
-        "StackConfigurationDependency/property_name",
-        "StackConfigurationDependency/dependency_type",
-        "StackConfigurationDependency/dependency_name",
-        "_"
-    ],
-    "KerberosDescriptor":[
-        "KerberosDescriptors/kerberos_descriptor_name",
-        "KerberosDescriptors/kerberos_descriptor_text",
-        "_"
-    ]
-
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/MinimalRendererTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/MinimalRendererTest.java b/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/MinimalRendererTest.java
index 782f148..6f75bab 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/MinimalRendererTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/api/query/render/MinimalRendererTest.java
@@ -40,10 +40,13 @@ import org.apache.ambari.server.api.services.Result;
 import org.apache.ambari.server.api.services.ResultImpl;
 import org.apache.ambari.server.api.util.TreeNode;
 import org.apache.ambari.server.api.util.TreeNodeImpl;
+import org.apache.ambari.server.controller.internal.HostComponentResourceProvider;
+import org.apache.ambari.server.controller.internal.HostResourceProvider;
 import org.apache.ambari.server.controller.internal.ResourceImpl;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.Schema;
 import org.apache.ambari.server.controller.spi.SchemaFactory;
+import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.junit.Test;
 
 /**
@@ -496,6 +499,9 @@ public class MinimalRendererTest {
 
     // host 1 : ambari host
     Resource hostResource = new ResourceImpl(Resource.Type.Host);
+
+    PropertyHelper.setKeyPropertyIds(Resource.Type.Host,HostResourceProvider.keyPropertyIds);
+    PropertyHelper.setKeyPropertyIds(Resource.Type.HostComponent, HostComponentResourceProvider.keyPropertyIds);
     hostResource.setProperty("Hosts/host_name", "testHost");
     hostResource.setProperty("Hosts/cluster_name", "testCluster");
     hostResource.setProperty("foo", "bar");

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java
index a127de6..7f47ab2 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProviderTest.java
@@ -61,8 +61,6 @@ public class AbstractControllerResourceProviderTest {
     AbstractResourceProvider provider =
         (AbstractResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
             Resource.Type.Service,
-            null,
-            null,
             managementController);
 
     Assert.assertTrue(provider instanceof ServiceResourceProvider);
@@ -73,7 +71,7 @@ public class AbstractControllerResourceProviderTest {
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-        Resource.Type.StackArtifact, null, null, managementController);
+        Resource.Type.StackArtifact, managementController);
 
     assertEquals(StackArtifactResourceProvider.class, provider.getClass());
   }
@@ -85,7 +83,7 @@ public class AbstractControllerResourceProviderTest {
     replay(managementController);
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-        Resource.Type.RoleAuthorization, null, null, managementController);
+        Resource.Type.RoleAuthorization, managementController);
 
     verify(managementController);
 
@@ -99,7 +97,7 @@ public class AbstractControllerResourceProviderTest {
     replay(managementController);
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-        Resource.Type.UserAuthorization, null, null, managementController);
+        Resource.Type.UserAuthorization, managementController);
 
     verify(managementController);
 
@@ -113,7 +111,7 @@ public class AbstractControllerResourceProviderTest {
     replay(managementController);
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
-        Resource.Type.ClusterKerberosDescriptor, null, null, managementController);
+        Resource.Type.ClusterKerberosDescriptor, managementController);
 
     verify(managementController);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractDRResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractDRResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractDRResourceProviderTest.java
index 38e6d36..2aa6efa 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractDRResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractDRResourceProviderTest.java
@@ -53,8 +53,6 @@ public class AbstractDRResourceProviderTest {
     AbstractResourceProvider provider =
         (AbstractResourceProvider) AbstractDRResourceProvider.getResourceProvider(
             Resource.Type.DRFeed,
-            propertyIds,
-            keyPropertyIds,
             ivoryService);
 
     Assert.assertTrue(provider instanceof FeedResourceProvider);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java
index 7165e48..0ed8fba 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/AbstractResourceProviderTest.java
@@ -80,45 +80,41 @@ public class AbstractResourceProviderTest {
 
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
 
-    AbstractResourceProvider provider = new HostComponentProcessResourceProvider(propertyIds,
-        keyPropertyIds, managementController);
+    AbstractResourceProvider provider = new HostComponentProcessResourceProvider(managementController);
 
-    Set<String> unsupported = provider.checkPropertyIds(Collections.singleton("foo"));
+    Set<String> unsupported = provider.checkPropertyIds(Collections.singleton("HostComponentProcess/host_name"));
     Assert.assertTrue(unsupported.isEmpty());
 
     // note that key is not in the set of known property ids.  We allow it if its parent is a known property.
     // this allows for Map type properties where we want to treat the entries as individual properties
-    Assert.assertTrue(provider.checkPropertyIds(Collections.singleton("cat5/subcat5/map/key")).isEmpty());
+    Assert.assertTrue(provider.checkPropertyIds(Collections.singleton("HostComponentProcess/host_name/foo")).isEmpty());
 
     unsupported = provider.checkPropertyIds(Collections.singleton("bar"));
     Assert.assertEquals(1, unsupported.size());
     Assert.assertTrue(unsupported.contains("bar"));
 
-    unsupported = provider.checkPropertyIds(Collections.singleton("cat1/foo"));
+    unsupported = provider.checkPropertyIds(Collections.singleton("HostComponentProcess/status"));
     Assert.assertTrue(unsupported.isEmpty());
 
-    unsupported = provider.checkPropertyIds(Collections.singleton("cat1"));
+    unsupported = provider.checkPropertyIds(Collections.singleton("HostComponentProcess"));
     Assert.assertTrue(unsupported.isEmpty());
   }
 
   @Test
   public void testGetPropertyIds() {
     Set<String> propertyIds = new HashSet<>();
-    propertyIds.add("p1");
-    propertyIds.add("foo");
-    propertyIds.add("cat1/foo");
-    propertyIds.add("cat2/bar");
-    propertyIds.add("cat2/baz");
-    propertyIds.add("cat3/sub1/bam");
-    propertyIds.add("cat4/sub2/sub3/bat");
+    propertyIds.add("HostComponentProcess/name");
+    propertyIds.add("HostComponentProcess/status");
+    propertyIds.add("HostComponentProcess/cluster_name");
+    propertyIds.add("HostComponentProcess/host_name");
+    propertyIds.add("HostComponentProcess/component_name");
 
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
     MaintenanceStateHelper maintenanceStateHelper = createNiceMock(MaintenanceStateHelper.class);
     RepositoryVersionDAO repositoryVersionDAO = createNiceMock(RepositoryVersionDAO.class);
     replay(maintenanceStateHelper, repositoryVersionDAO);
 
-    AbstractResourceProvider provider = new HostComponentProcessResourceProvider(propertyIds,
-        keyPropertyIds, managementController);
+    AbstractResourceProvider provider = new HostComponentProcessResourceProvider(managementController);
 
     Set<String> supportedPropertyIds = provider.getPropertyIds();
     Assert.assertTrue(supportedPropertyIds.containsAll(propertyIds));

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActionResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActionResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActionResourceProviderTest.java
index ef56f9d..e53c534 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActionResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActionResourceProviderTest.java
@@ -65,8 +65,6 @@ public class ActionResourceProviderTest {
 
     return (ActionResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
   }
 
@@ -126,8 +124,6 @@ public class ActionResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<String> propertyIds = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProviderTest.java
index 5221ecf..bfeecfe 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProviderTest.java
@@ -338,8 +338,6 @@ public class ActiveWidgetLayoutResourceProviderTest extends EasyMockSupport {
 
     return AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.ActiveWidgetLayout,
-        PropertyHelper.getPropertyIds(Resource.Type.ActiveWidgetLayout),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.ActiveWidgetLayout),
         managementController);
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintResourceProviderTest.java
index f534411..c7b8d71 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/BlueprintResourceProviderTest.java
@@ -61,7 +61,6 @@ import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
-import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.orm.dao.BlueprintDAO;
 import org.apache.ambari.server.orm.dao.StackDAO;
 import org.apache.ambari.server.orm.entities.BlueprintConfigEntity;
@@ -165,8 +164,6 @@ public class BlueprintResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Blueprint,
-        PropertyHelper.getPropertyIds(Resource.Type.Blueprint),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Blueprint),
         managementController);
 
     AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
@@ -202,8 +199,6 @@ public class BlueprintResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       Resource.Type.Blueprint,
-      PropertyHelper.getPropertyIds(Resource.Type.Blueprint),
-      PropertyHelper.getKeyPropertyIds(Resource.Type.Blueprint),
       managementController);
 
     try {
@@ -245,8 +240,6 @@ public class BlueprintResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Blueprint,
-        PropertyHelper.getPropertyIds(Resource.Type.Blueprint),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Blueprint),
         managementController);
 
     AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
@@ -287,8 +280,6 @@ public class BlueprintResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Blueprint,
-        PropertyHelper.getPropertyIds(Resource.Type.Blueprint),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Blueprint),
         createMock(AmbariManagementController.class));
 
     AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
@@ -334,8 +325,6 @@ public class BlueprintResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Blueprint,
-        PropertyHelper.getPropertyIds(Resource.Type.Blueprint),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Blueprint),
         managementController);
 
     AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
@@ -413,8 +402,6 @@ public class BlueprintResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       Resource.Type.Blueprint,
-      PropertyHelper.getPropertyIds(Resource.Type.Blueprint),
-      PropertyHelper.getKeyPropertyIds(Resource.Type.Blueprint),
       managementController);
 
     AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
@@ -541,8 +528,6 @@ public class BlueprintResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Blueprint,
-        PropertyHelper.getPropertyIds(Resource.Type.Blueprint),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Blueprint),
         managementController);
 
     AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
@@ -590,8 +575,6 @@ public class BlueprintResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Blueprint,
-        PropertyHelper.getPropertyIds(Resource.Type.Blueprint),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Blueprint),
         managementController);
 
     AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
@@ -828,9 +811,7 @@ public class BlueprintResourceProviderTest {
   }
 
   private static BlueprintResourceProvider createProvider() {
-    return new BlueprintResourceProvider(
-        PropertyHelper.getPropertyIds(Resource.Type.Blueprint),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Blueprint), null);
+    return new BlueprintResourceProvider(null);
   }
 
   private BlueprintEntity createEntity(Map<String, Object> properties) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProviderTest.java
index 6779e26f..c5994c5 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProviderTest.java
@@ -102,8 +102,6 @@ public class ClientConfigResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     // add the property map to a set for the request.  add more maps for multiple creates
@@ -144,8 +142,6 @@ public class ClientConfigResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     // add the property map to a set for the request.
@@ -214,8 +210,6 @@ public class ClientConfigResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     String clusterName = "C1";
@@ -461,8 +455,6 @@ public class ClientConfigResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     // create the request
@@ -645,8 +637,6 @@ public class ClientConfigResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Predicate predicate = new PredicateBuilder().property(

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
index 7cbb4b7..686b5cd 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterControllerImplTest.java
@@ -935,7 +935,7 @@ public class ClusterControllerImplTest {
     public TestProviderModule() {
 
       for (Resource.Type type : Resource.Type.values()) {
-        providers.put(type, new TestResourceProvider(type));
+        providers.put(type, new TestResourceProvider());
       }
       providers.put(Resource.Type.Cluster, new TestClusterResourceProvider());
       providers.put(Resource.Type.Host, new TestHostResourceProvider());
@@ -965,8 +965,8 @@ public class ClusterControllerImplTest {
 
   private static class TestResourceProvider extends AbstractResourceProvider {
 
-    private TestResourceProvider(Resource.Type type) {
-      super(PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type));
+    private TestResourceProvider() {
+      super(new HashSet<>(), new HashMap<>());
     }
 
     private TestResourceProvider(Set<String> propertyIds, Map<Resource.Type, String> keyPropertyIds) {
@@ -1029,7 +1029,7 @@ public class ClusterControllerImplTest {
 
   private static class TestClusterResourceProvider extends TestResourceProvider {
     private TestClusterResourceProvider() {
-      super(Resource.Type.Cluster);
+      super(ClusterResourceProvider.propertyIds, ClusterResourceProvider.keyPropertyIds);
     }
 
     @Override
@@ -1048,7 +1048,7 @@ public class ClusterControllerImplTest {
     private Predicate lastPredicate = null;
 
     private TestHostResourceProvider() {
-      super(Resource.Type.Host);
+      super(HostResourceProvider.propertyIds, HostResourceProvider.keyPropertyIds);
     }
 
     @Override
@@ -1143,7 +1143,7 @@ public class ClusterControllerImplTest {
 
   private static class TestStackResourceProvider extends TestResourceProvider {
     private TestStackResourceProvider() {
-      super(Resource.Type.Stack);
+      super(StackResourceProvider.propertyIds, StackResourceProvider.keyPropertyIds);
     }
 
     @Override
@@ -1159,7 +1159,7 @@ public class ClusterControllerImplTest {
 
   private static class TestStackVersionResourceProvider extends TestResourceProvider {
     private TestStackVersionResourceProvider() {
-      super(Resource.Type.StackVersion);
+      super(StackVersionResourceProvider.propertyIds, StackVersionResourceProvider.keyPropertyIds);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterKerberosDescriptorResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterKerberosDescriptorResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterKerberosDescriptorResourceProviderTest.java
index ac28475..e867af3 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterKerberosDescriptorResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterKerberosDescriptorResourceProviderTest.java
@@ -46,7 +46,6 @@ import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.utilities.PredicateBuilder;
-import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.security.SecurePasswordHelper;
 import org.apache.ambari.server.security.TestAuthenticationFactory;
 import org.apache.ambari.server.security.encryption.CredentialStoreService;
@@ -237,8 +236,6 @@ public class ClusterKerberosDescriptorResourceProviderTest extends EasyMockSuppo
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.ClusterKerberosDescriptor,
-        PropertyHelper.getPropertyIds(Resource.Type.ClusterKerberosDescriptor),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.ClusterKerberosDescriptor),
         managementController);
 
     AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
@@ -299,8 +296,6 @@ public class ClusterKerberosDescriptorResourceProviderTest extends EasyMockSuppo
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.ClusterKerberosDescriptor,
-        PropertyHelper.getPropertyIds(Resource.Type.ClusterKerberosDescriptor),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.ClusterKerberosDescriptor),
         managementController);
 
     Predicate predicate = new PredicateBuilder()
@@ -379,8 +374,6 @@ public class ClusterKerberosDescriptorResourceProviderTest extends EasyMockSuppo
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.ClusterKerberosDescriptor,
-        PropertyHelper.getPropertyIds(Resource.Type.ClusterKerberosDescriptor),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.ClusterKerberosDescriptor),
         managementController);
 
     Predicate clusterPredicate = new PredicateBuilder()
@@ -497,8 +490,6 @@ public class ClusterKerberosDescriptorResourceProviderTest extends EasyMockSuppo
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.ClusterKerberosDescriptor,
-        PropertyHelper.getPropertyIds(Resource.Type.ClusterKerberosDescriptor),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.ClusterKerberosDescriptor),
         managementController);
 
     Predicate clusterPredicate = new PredicateBuilder()
@@ -620,8 +611,6 @@ public class ClusterKerberosDescriptorResourceProviderTest extends EasyMockSuppo
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.ClusterKerberosDescriptor,
-        PropertyHelper.getPropertyIds(Resource.Type.ClusterKerberosDescriptor),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.ClusterKerberosDescriptor),
         managementController);
 
     Predicate predicate1 = new PredicateBuilder()
@@ -688,8 +677,6 @@ public class ClusterKerberosDescriptorResourceProviderTest extends EasyMockSuppo
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.ClusterKerberosDescriptor,
-        PropertyHelper.getPropertyIds(Resource.Type.ClusterKerberosDescriptor),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.ClusterKerberosDescriptor),
         managementController);
 
 
@@ -729,8 +716,6 @@ public class ClusterKerberosDescriptorResourceProviderTest extends EasyMockSuppo
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.ClusterKerberosDescriptor,
-        PropertyHelper.getPropertyIds(Resource.Type.ClusterKerberosDescriptor),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.ClusterKerberosDescriptor),
         managementController);
 
     provider.createResources(request);
@@ -767,8 +752,6 @@ public class ClusterKerberosDescriptorResourceProviderTest extends EasyMockSuppo
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.ClusterKerberosDescriptor,
-        PropertyHelper.getPropertyIds(Resource.Type.ClusterKerberosDescriptor),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.ClusterKerberosDescriptor),
         managementController);
 
     Predicate predicate1 = new PredicateBuilder()

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java
index 4a80893..e687983 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterResourceProviderTest.java
@@ -275,8 +275,6 @@ public class ClusterResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
@@ -361,8 +359,6 @@ public class ClusterResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<String> propertyIds = new HashSet<>();
@@ -536,8 +532,6 @@ public class ClusterResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
@@ -620,8 +614,6 @@ public class ClusterResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
@@ -710,8 +702,6 @@ public class ClusterResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Cluster,
-        PropertyHelper.getPropertyIds(Resource.Type.Cluster),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Cluster),
         managementController);
 
     AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
@@ -753,8 +743,6 @@ public class ClusterResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
@@ -801,8 +789,6 @@ public class ClusterResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     // add the property map to a set for the request.  add more maps for multiple creates

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
index a6fc919..51035ba 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProviderTest.java
@@ -484,7 +484,7 @@ public class ClusterStackVersionResourceProviderTest {
             EasyMock.anyObject(), anyObject(String.class))).
             andReturn(packages).times(1); // only one host has the versionable component
 
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostResourceProvider(
             eq(managementController))).andReturn(csvResourceProvider).anyTimes();
 
     expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
@@ -555,8 +555,6 @@ public class ClusterStackVersionResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     injector.injectMembers(provider);
@@ -704,7 +702,7 @@ public class ClusterStackVersionResourceProviderTest {
             EasyMock.anyObject(), anyObject(String.class))).
             andReturn(packages).anyTimes(); // only one host has the versionable component
 
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostResourceProvider(
             eq(managementController))).andReturn(csvResourceProvider).anyTimes();
 
     expect(managementController.findConfigurationTagsWithOverrides(anyObject(Cluster.class), EasyMock.anyString()))
@@ -1362,8 +1360,7 @@ public class ClusterStackVersionResourceProviderTest {
         EasyMock.anyObject(), anyObject(String.class))).andReturn(
             packages).anyTimes(); // only one host has the versionable component
 
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(),
-        EasyMock.anyObject(), eq(managementController))).andReturn(csvResourceProvider).anyTimes();
+    expect(resourceProviderFactory.getHostResourceProvider(eq(managementController))).andReturn(csvResourceProvider).anyTimes();
 
     expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
     expect(clusters.getHostsForCluster(anyObject(String.class))).andReturn(
@@ -1535,7 +1532,7 @@ public class ClusterStackVersionResourceProviderTest {
       .andReturn(new HashMap<String, Map<String, String>>()).anyTimes();
 
 
-    expect(resourceProviderFactory.getHostResourceProvider(anyObject(Set.class), anyObject(Map.class),
+    expect(resourceProviderFactory.getHostResourceProvider(
             eq(managementController))).andReturn(csvResourceProvider).anyTimes();
 
     expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
@@ -2173,7 +2170,6 @@ public class ClusterStackVersionResourceProviderTest {
 
      Resource.Type type = Type.ClusterStackVersion;
      return (ClusterStackVersionResourceProvider) AbstractControllerResourceProvider.getResourceProvider(type,
-         PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type),
          amc);
    }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProviderTest.java
index 78f79ea..82cdc19 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProviderTest.java
@@ -102,8 +102,6 @@ public class ConfigGroupResourceProviderTest {
 
     return (ConfigGroupResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProviderTest.java
index 785ea23..17bc127 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProviderTest.java
@@ -188,8 +188,6 @@ public class ConfigurationResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<String> propertyIds = new HashSet<>();
@@ -297,8 +295,6 @@ public class ConfigurationResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     // add the property map to a set for the request.
@@ -332,8 +328,6 @@ public class ConfigurationResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Predicate predicate = new PredicateBuilder().property(

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CredentialResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CredentialResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CredentialResourceProviderTest.java
index 89ed022..08c9839 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CredentialResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/CredentialResourceProviderTest.java
@@ -43,7 +43,6 @@ import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.utilities.PredicateBuilder;
-import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.security.SecurePasswordHelper;
 import org.apache.ambari.server.security.TestAuthenticationFactory;
 import org.apache.ambari.server.security.authorization.AuthorizationException;
@@ -151,8 +150,6 @@ public class CredentialResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Credential,
-        PropertyHelper.getPropertyIds(Resource.Type.Credential),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Credential),
         managementController);
 
     AbstractResourceProviderTest.TestObserver observer = new AbstractResourceProviderTest.TestObserver();
@@ -196,8 +193,6 @@ public class CredentialResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Credential,
-        PropertyHelper.getPropertyIds(Resource.Type.Credential),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Credential),
         managementController);
 
     try {
@@ -236,8 +231,6 @@ public class CredentialResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Credential,
-        PropertyHelper.getPropertyIds(Resource.Type.Credential),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Credential),
         managementController);
 
     try {
@@ -293,8 +286,6 @@ public class CredentialResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Credential,
-        PropertyHelper.getPropertyIds(Resource.Type.Credential),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Credential),
         managementController);
 
 
@@ -359,8 +350,6 @@ public class CredentialResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Credential,
-        PropertyHelper.getPropertyIds(Resource.Type.Credential),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Credential),
         managementController);
 
     provider.createResources(request);
@@ -435,8 +424,6 @@ public class CredentialResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Credential,
-        PropertyHelper.getPropertyIds(Resource.Type.Credential),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Credential),
         managementController);
 
     provider.createResources(request);
@@ -512,8 +499,6 @@ public class CredentialResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Credential,
-        PropertyHelper.getPropertyIds(Resource.Type.Credential),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Credential),
         managementController);
 
     provider.createResources(request);
@@ -576,8 +561,6 @@ public class CredentialResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Credential,
-        PropertyHelper.getPropertyIds(Resource.Type.Credential),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Credential),
         managementController);
 
 
@@ -634,8 +617,6 @@ public class CredentialResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Credential,
-        PropertyHelper.getPropertyIds(Resource.Type.Credential),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Credential),
         managementController);
 
     provider.createResources(request);
@@ -728,8 +709,6 @@ public class CredentialResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Credential,
-        PropertyHelper.getPropertyIds(Resource.Type.Credential),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Credential),
         managementController);
 
     provider.createResources(request);
@@ -797,8 +776,6 @@ public class CredentialResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Credential,
-        PropertyHelper.getPropertyIds(Resource.Type.Credential),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Credential),
         managementController);
 
     provider.createResources(request);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ExtensionResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ExtensionResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ExtensionResourceProviderTest.java
index 5b6e830..6a5e96b 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ExtensionResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ExtensionResourceProviderTest.java
@@ -58,8 +58,6 @@ public class ExtensionResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<String> propertyIds = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/FeedResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/FeedResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/FeedResourceProviderTest.java
index 5cf9b05..09826f0 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/FeedResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/FeedResourceProviderTest.java
@@ -71,9 +71,7 @@ public class FeedResourceProviderTest {
 
     Request request = PropertyHelper.getCreateRequest(propertySet, Collections.emptyMap());
 
-    FeedResourceProvider provider = new FeedResourceProvider(service,
-        PropertyHelper.getPropertyIds(Resource.Type.DRFeed),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.DRFeed));
+    FeedResourceProvider provider = new FeedResourceProvider(service);
 
     provider.createResources(request);
 
@@ -114,9 +112,7 @@ public class FeedResourceProviderTest {
 
     Request request = PropertyHelper.getCreateRequest(propertySet, Collections.emptyMap());
 
-    FeedResourceProvider provider = new FeedResourceProvider(service,
-        PropertyHelper.getPropertyIds(Resource.Type.DRFeed),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.DRFeed));
+    FeedResourceProvider provider = new FeedResourceProvider(service);
 
     Set<Resource> resources = provider.getResources(request, null);
 
@@ -162,9 +158,7 @@ public class FeedResourceProviderTest {
 
     Request request = PropertyHelper.getCreateRequest(propertySet, Collections.emptyMap());
 
-    FeedResourceProvider provider = new FeedResourceProvider(service,
-        PropertyHelper.getPropertyIds(Resource.Type.DRFeed),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.DRFeed));
+    FeedResourceProvider provider = new FeedResourceProvider(service);
 
     provider.updateResources(request, null);
 
@@ -193,9 +187,7 @@ public class FeedResourceProviderTest {
     // replay
     replay(service);
 
-    FeedResourceProvider provider = new FeedResourceProvider(service,
-        PropertyHelper.getPropertyIds(Resource.Type.DRFeed),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.DRFeed));
+    FeedResourceProvider provider = new FeedResourceProvider(service);
 
     Predicate predicate = new PredicateBuilder().property(FeedResourceProvider.FEED_NAME_PROPERTY_ID).equals("Feed1").toPredicate();
 
@@ -204,17 +196,4 @@ public class FeedResourceProviderTest {
     // verify
     verify(service);
   }
-
-  @Test
-  public void testGetKeyPropertyIds() throws Exception {
-    IvoryService service = createMock(IvoryService.class);
-
-    Map<Resource.Type, String> keyPropertyIds = PropertyHelper.getKeyPropertyIds(Resource.Type.DRFeed);
-
-    FeedResourceProvider provider = new FeedResourceProvider(service,
-        PropertyHelper.getPropertyIds(Resource.Type.DRFeed),
-        keyPropertyIds);
-
-    Assert.assertEquals(keyPropertyIds, provider.getKeyPropertyIds());
-  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/GroupResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/GroupResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/GroupResourceProviderTest.java
index bbfa2d8..938564a 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/GroupResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/GroupResourceProviderTest.java
@@ -83,8 +83,6 @@ public class GroupResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     // add the property map to a set for the request.  add more maps for multiple creates
@@ -135,8 +133,6 @@ public class GroupResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<String> propertyIds = new HashSet<>();
@@ -186,8 +182,6 @@ public class GroupResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Map<String, Object> properties = new LinkedHashMap<>();
@@ -227,8 +221,6 @@ public class GroupResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Predicate predicate = new PredicateBuilder().property(GroupResourceProvider.GROUP_GROUPNAME_PROPERTY_ID).

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentProcessResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentProcessResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentProcessResourceProviderTest.java
index 5a7460d..d012601 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentProcessResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentProcessResourceProviderTest.java
@@ -161,8 +161,6 @@ public class HostComponentProcessResourceProviderTest {
     
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         amc);
     
     return provider;

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentResourceProviderTest.java
index 7e32c15..650dc78 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostComponentResourceProviderTest.java
@@ -105,9 +105,7 @@ public class HostComponentResourceProviderTest {
     ResourceProviderFactory resourceProviderFactory = createNiceMock(ResourceProviderFactory.class);
     Injector injector = createNiceMock(Injector.class);
     HostComponentResourceProvider hostComponentResourceProvider =
-        new HostComponentResourceProvider(PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
-        managementController, injector);
+        new HostComponentResourceProvider(managementController, injector);
 
     AbstractControllerResourceProvider.init(resourceProviderFactory);
 
@@ -115,8 +113,7 @@ public class HostComponentResourceProviderTest {
         AbstractResourceProviderTest.Matcher.getHostComponentRequestSet(
             "Cluster100", "Service100", "Component100", "Host100", null, null));
 
-    expect(resourceProviderFactory.getHostComponentResourceProvider(EasyMock.anyObject(),
-        EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostComponentResourceProvider(
         eq(managementController))).
         andReturn(hostComponentResourceProvider).anyTimes();
 
@@ -128,8 +125,6 @@ public class HostComponentResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     // add the property map to a set for the request.  add more maps for multiple creates
@@ -218,8 +213,7 @@ public class HostComponentResourceProviderTest {
 
 
     // set expectations
-    expect(resourceProviderFactory.getHostComponentResourceProvider(EasyMock.anyObject(),
-        EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostComponentResourceProvider(
         eq(managementController))).
         andReturn(hostComponentResourceProvider).anyTimes();
 
@@ -291,8 +285,6 @@ public class HostComponentResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
 
@@ -393,8 +385,7 @@ public class HostComponentResourceProviderTest {
     provider.setFieldValue("maintenanceStateHelper", maintenanceStateHelper);
     provider.setFieldValue("hostVersionDAO", hostVersionDAO);
 
-    expect(resourceProviderFactory.getHostComponentResourceProvider(EasyMock.anyObject(),
-        EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostComponentResourceProvider(
         eq(managementController))).
         andReturn(provider).anyTimes();
 
@@ -451,9 +442,7 @@ public class HostComponentResourceProviderTest {
     Injector injector = createNiceMock(Injector.class);
 
     HostComponentResourceProvider provider =
-        new HostComponentResourceProvider(PropertyHelper.getPropertyIds(type),
-            PropertyHelper.getKeyPropertyIds(type),
-            managementController, injector);
+        new HostComponentResourceProvider(managementController, injector);
 
     // set expectations
     expect(managementController.deleteHostComponents(
@@ -488,40 +477,27 @@ public class HostComponentResourceProviderTest {
 
   @Test
   public void testCheckPropertyIds() throws Exception {
-    Set<String> propertyIds = new HashSet<>();
-    propertyIds.add("foo");
-    propertyIds.add("cat1/foo");
-    propertyIds.add("cat2/bar");
-    propertyIds.add("cat2/baz");
-    propertyIds.add("cat3/sub1/bam");
-    propertyIds.add("cat4/sub2/sub3/bat");
-    propertyIds.add("cat5/subcat5/map");
-
-    Map<Resource.Type, String> keyPropertyIds = new HashMap<>();
-
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
     Injector injector = createNiceMock(Injector.class);
 
     HostComponentResourceProvider provider =
-        new HostComponentResourceProvider(propertyIds,
-        keyPropertyIds,
-        managementController, injector);
+        new HostComponentResourceProvider(managementController, injector);
 
-    Set<String> unsupported = provider.checkPropertyIds(Collections.singleton("foo"));
+    Set<String> unsupported = provider.checkPropertyIds(Collections.singleton(PropertyHelper.getPropertyId("HostRoles", "cluster_name")));
     Assert.assertTrue(unsupported.isEmpty());
 
     // note that key is not in the set of known property ids.  We allow it if its parent is a known property.
     // this allows for Map type properties where we want to treat the entries as individual properties
-    Assert.assertTrue(provider.checkPropertyIds(Collections.singleton("cat5/subcat5/map/key")).isEmpty());
+    Assert.assertTrue(provider.checkPropertyIds(Collections.singleton(PropertyHelper.getPropertyId("HostRoles/service_name", "key"))).isEmpty());
 
     unsupported = provider.checkPropertyIds(Collections.singleton("bar"));
     Assert.assertEquals(1, unsupported.size());
     Assert.assertTrue(unsupported.contains("bar"));
 
-    unsupported = provider.checkPropertyIds(Collections.singleton("cat1/foo"));
+    unsupported = provider.checkPropertyIds(Collections.singleton(PropertyHelper.getPropertyId("HostRoles", "component_name")));
     Assert.assertTrue(unsupported.isEmpty());
 
-    unsupported = provider.checkPropertyIds(Collections.singleton("cat1"));
+    unsupported = provider.checkPropertyIds(Collections.singleton("HostRoles"));
     Assert.assertTrue(unsupported.isEmpty());
 
     unsupported = provider.checkPropertyIds(Collections.singleton("config"));
@@ -587,8 +563,7 @@ public class HostComponentResourceProviderTest {
     provider.setFieldValue("maintenanceStateHelper", maintenanceStateHelper);
     provider.setFieldValue("hostVersionDAO", hostVersionDAO);
 
-    expect(resourceProviderFactory.getHostComponentResourceProvider(EasyMock.anyObject(),
-        EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostComponentResourceProvider(
         eq(managementController))).
         andReturn(provider).anyTimes();
 
@@ -657,7 +632,7 @@ public class HostComponentResourceProviderTest {
      */
     public TestHostComponentResourceProvider(Set<String> propertyIds, Map<Resource.Type, String> keyPropertyIds,
                                              AmbariManagementController managementController, Injector injector) throws Exception {
-      super(propertyIds, keyPropertyIds, managementController, injector);
+      super(managementController, injector);
     }
 
     public void setFieldValue(String fieldName, Object fieldValue) throws Exception {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostResourceProviderTest.java
index 5e6201b..fcf1950 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostResourceProviderTest.java
@@ -153,8 +153,7 @@ public class HostResourceProviderTest extends EasyMockSupport {
 
     expect(managementController.getClusters()).andReturn(clusters).atLeastOnce();
 
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(),
-        EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostResourceProvider(
         eq(managementController))).andReturn(hostResourceProvider).anyTimes();
 
     // replay
@@ -164,8 +163,6 @@ public class HostResourceProviderTest extends EasyMockSupport {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     // add the property map to a set for the request.  add more maps for multiple creates
@@ -244,8 +241,7 @@ public class HostResourceProviderTest extends EasyMockSupport {
     expect(managementController.getAmbariMetaInfo()).andReturn(ambariMetaInfo).anyTimes();
     expect(managementController.getHostComponents(EasyMock.anyObject()))
         .andReturn(Collections.emptySet()).anyTimes();
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(),
-            EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostResourceProvider(
             eq(managementController))).
         andReturn(hostResourceProvider).anyTimes();
 
@@ -277,8 +273,6 @@ public class HostResourceProviderTest extends EasyMockSupport {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
 
@@ -358,8 +352,7 @@ public class HostResourceProviderTest extends EasyMockSupport {
 
     expect(componentInfo.getCategory()).andReturn("MASTER").anyTimes();
 
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(),
-        EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostResourceProvider(
         eq(managementController))).andReturn(hostResourceProvider).anyTimes();
 
     Set<String> propertyIds = new HashSet<>();
@@ -378,8 +371,6 @@ public class HostResourceProviderTest extends EasyMockSupport {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<Resource> resources = provider.getResources(request, predicate);
@@ -453,8 +444,7 @@ public class HostResourceProviderTest extends EasyMockSupport {
 
     expect(componentInfo.getCategory()).andReturn("MASTER").anyTimes();
 
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(),
-        EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostResourceProvider(
         eq(managementController))).andReturn(hostResourceProvider).anyTimes();
 
     Set<String> propertyIds = new HashSet<>();
@@ -473,8 +463,6 @@ public class HostResourceProviderTest extends EasyMockSupport {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
 
@@ -550,8 +538,7 @@ public class HostResourceProviderTest extends EasyMockSupport {
 
     expect(componentInfo.getCategory()).andReturn("MASTER").anyTimes();
 
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(),
-        EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostResourceProvider(
         eq(managementController))).andReturn(hostResourceProvider).anyTimes();
 
     Set<String> propertyIds = new HashSet<>();
@@ -570,8 +557,6 @@ public class HostResourceProviderTest extends EasyMockSupport {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<Resource> resources = provider.getResources(request, predicate);
@@ -624,8 +609,7 @@ public class HostResourceProviderTest extends EasyMockSupport {
     expect(hostResponse1.getHostname()).andReturn("Host100").anyTimes();
     expect(hostResponse1.getStatus()).andReturn(HealthStatus.UNKNOWN.name()).anyTimes();
     expect(hostResponse1.getHealthReport()).andReturn("UNKNOWN").anyTimes();
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(),
-        EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostResourceProvider(
         eq(managementController))).andReturn(hostResourceProvider).anyTimes();
 
     Set<String> propertyIds = new HashSet<>();
@@ -644,8 +628,6 @@ public class HostResourceProviderTest extends EasyMockSupport {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<Resource> resources = provider.getResources(request, predicate);
@@ -728,8 +710,7 @@ public class HostResourceProviderTest extends EasyMockSupport {
     expect(ambariMetaInfo.getComponent((String) anyObject(), (String) anyObject(),
         (String) anyObject(), (String) anyObject())).andReturn(componentInfo).anyTimes();
     expect(componentInfo.getCategory()).andReturn("SLAVE").anyTimes();
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(),
-        EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostResourceProvider(
         eq(managementController))).andReturn(hostResourceProvider).anyTimes();
 
 
@@ -750,8 +731,6 @@ public class HostResourceProviderTest extends EasyMockSupport {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<Resource> resources = provider.getResources(request, predicate);
@@ -824,8 +803,7 @@ public class HostResourceProviderTest extends EasyMockSupport {
     expect(ambariMetaInfo.getComponent((String) anyObject(), (String) anyObject(),
         (String) anyObject(), (String) anyObject())).andReturn(componentInfo).anyTimes();
     expect(componentInfo.getCategory()).andReturn("SLAVE").anyTimes();
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(),
-        EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostResourceProvider(
         eq(managementController))).andReturn(hostResourceProvider).anyTimes();
 
 
@@ -845,8 +823,6 @@ public class HostResourceProviderTest extends EasyMockSupport {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
 
@@ -920,8 +896,7 @@ public class HostResourceProviderTest extends EasyMockSupport {
     expect(hostResponse1.getClusterName()).andReturn("Cluster100").anyTimes();
     expect(hostResponse1.getHostname()).andReturn("Host100").anyTimes();
     expect(hostResponse1.getHealthReport()).andReturn("HEALTHY").anyTimes();
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(),
-        EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostResourceProvider(
         eq(managementController))).andReturn(hostResourceProvider).anyTimes();
 
     // replay
@@ -945,8 +920,6 @@ public class HostResourceProviderTest extends EasyMockSupport {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.Host,
-        PropertyHelper.getPropertyIds(Resource.Type.Host),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.Host),
         managementController);
 
     provider.updateResources(request, predicate);
@@ -1008,8 +981,7 @@ public class HostResourceProviderTest extends EasyMockSupport {
     expect(hostResponse1.getClusterName()).andReturn("Cluster100").anyTimes();
     expect(hostResponse1.getHostname()).andReturn("Host100").anyTimes();
     expect(hostResponse1.getHealthReport()).andReturn("HEALTHY").anyTimes();
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(),
-        EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostResourceProvider(
         eq(managementController))).andReturn(hostResourceProvider).anyTimes();
 
     // replay
@@ -1019,8 +991,6 @@ public class HostResourceProviderTest extends EasyMockSupport {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     // add the property map to a set for the request.
@@ -1106,8 +1076,7 @@ public class HostResourceProviderTest extends EasyMockSupport {
   public static HostResourceProvider getHostProvider(AmbariManagementController managementController) {
     Resource.Type type = Resource.Type.Host;
 
-    return new HostResourceProvider(PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
+    return new HostResourceProvider(
         managementController);
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProviderTest.java
index 6c95c53..670c187 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/HostStackVersionResourceProviderTest.java
@@ -185,8 +185,6 @@ public class HostStackVersionResourceProviderTest {
     Request request = PropertyHelper.getCreateRequest(Collections.emptySet(), null);
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
             type,
-            PropertyHelper.getPropertyIds(type),
-            PropertyHelper.getKeyPropertyIds(type),
             managementController);
 
     expect(hostVersionDAOMock.findByClusterAndHost(clustername, hostname)).andReturn(Collections.singletonList(hostVersionEntityMock));
@@ -234,7 +232,7 @@ public class HostStackVersionResourceProviderTest {
     expect(managementController.getPackagesForServiceHost(anyObject(ServiceInfo.class),
             EasyMock.anyObject(), anyObject(String.class))).andReturn(packages).anyTimes();
 
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostResourceProvider(
         eq(managementController))).andReturn(csvResourceProvider).anyTimes();
 
     expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
@@ -270,8 +268,6 @@ public class HostStackVersionResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     injector.injectMembers(provider);
@@ -330,7 +326,7 @@ public class HostStackVersionResourceProviderTest {
     expect(managementController.getPackagesForServiceHost(anyObject(ServiceInfo.class),
       anyObject(Map.class), anyObject(String.class))).andReturn(packages).anyTimes();
 
-    expect(resourceProviderFactory.getHostResourceProvider(anyObject(Set.class), anyObject(Map.class),
+    expect(resourceProviderFactory.getHostResourceProvider(
       eq(managementController))).andReturn(csvResourceProvider).anyTimes();
 
     expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
@@ -358,8 +354,6 @@ public class HostStackVersionResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     injector.injectMembers(provider);
@@ -428,7 +422,7 @@ public class HostStackVersionResourceProviderTest {
     expect(managementController.getPackagesForServiceHost(anyObject(ServiceInfo.class),
             EasyMock.anyObject(), anyObject(String.class))).andReturn(packages).anyTimes();
 
-    expect(resourceProviderFactory.getHostResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(),
+    expect(resourceProviderFactory.getHostResourceProvider(
             eq(managementController))).andReturn(csvResourceProvider).anyTimes();
 
     expect(clusters.getCluster(anyObject(String.class))).andReturn(cluster);
@@ -464,8 +458,6 @@ public class HostStackVersionResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
             type,
-            PropertyHelper.getPropertyIds(type),
-            PropertyHelper.getKeyPropertyIds(type),
             managementController);
 
     injector.injectMembers(provider);


[10/13] ambari git commit: AMBARI-22582 Clean up Configs page. (atkach)

Posted by rl...@apache.org.
AMBARI-22582 Clean up Configs page. (atkach)


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

Branch: refs/heads/branch-feature-AMBARI-20859
Commit: 2e9c964650665028caa6351eebebe5f55e6d28ca
Parents: e77a31a
Author: Andrii Tkach <at...@apache.org>
Authored: Mon Dec 4 18:41:04 2017 +0200
Committer: Andrii Tkach <at...@apache.org>
Committed: Mon Dec 4 18:41:04 2017 +0200

----------------------------------------------------------------------
 ambari-web/app/assets/test/tests.js             |   2 +-
 .../controllers/main/service/info/configs.js    |   5 +
 ambari-web/app/messages.js                      |   3 +-
 .../mixins/common/configs/configs_comparator.js |   6 +-
 ambari-web/app/styles/application.less          |  24 +-
 ambari-web/app/styles/bootstrap_overrides.less  |   2 +-
 ambari-web/app/styles/config_history_flow.less  | 414 ----------
 .../app/styles/config_versions_control.less     | 144 ++++
 ambari-web/app/styles/widgets.less              |   7 +-
 .../configs/config_history_dropdown_row.hbs     |  24 -
 .../common/configs/config_history_flow.hbs      | 148 ----
 .../common/configs/config_versions_control.hbs  |  42 ++
 .../common/configs/config_versions_dropdown.hbs |  69 ++
 .../templates/common/configs/service_config.hbs |  97 ++-
 ambari-web/app/views.js                         |   3 +-
 .../views/common/configs/config_history_flow.js | 644 ----------------
 .../configs/config_versions_control_view.js     | 235 ++++++
 .../configs/config_versions_dropdown_view.js    |  52 ++
 .../views/common/configs/service_config_view.js |  66 ++
 .../common/configs/config_history_flow_test.js  | 756 -------------------
 .../config_versions_control_view_test.js        | 152 ++++
 .../common/configs/service_config_view_test.js  |  52 +-
 .../host_progress_popup_body_view_test.js       |   9 +-
 23 files changed, 896 insertions(+), 2060 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/assets/test/tests.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/assets/test/tests.js b/ambari-web/app/assets/test/tests.js
index de81764..990c489 100644
--- a/ambari-web/app/assets/test/tests.js
+++ b/ambari-web/app/assets/test/tests.js
@@ -372,7 +372,7 @@ var files = [
   'test/views/main/admin/highAvailability/nameNode/wizard_view_test',
   'test/views/main/admin/highAvailability/progress_view_test',
   'test/views/common/host_progress_popup_body_view_test',
-  'test/views/common/configs/config_history_flow_test',
+  'test/views/common/configs/config_versions_control_view_test',
   'test/views/common/configs/overriddenProperty_view_test',
   'test/views/common/configs/service_config_view_test',
   'test/views/common/configs/service_config_container_view_test',

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/controllers/main/service/info/configs.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/controllers/main/service/info/configs.js b/ambari-web/app/controllers/main/service/info/configs.js
index 8436086..a3a4206 100644
--- a/ambari-web/app/controllers/main/service/info/configs.js
+++ b/ambari-web/app/controllers/main/service/info/configs.js
@@ -43,6 +43,11 @@ App.MainServiceInfoConfigsController = Em.Controller.extend(App.AddSecurityConfi
 
   selectedConfigGroup: null,
 
+  /**
+   * currently displayed service config version
+   */
+  displayedVersion: null,
+
   groupsStore: App.ServiceConfigGroup.find(),
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/messages.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/messages.js b/ambari-web/app/messages.js
index 06deecb..8b6ce72 100644
--- a/ambari-web/app/messages.js
+++ b/ambari-web/app/messages.js
@@ -360,6 +360,7 @@ Em.I18n.translations = {
   'common.express.downgrade': 'Express Downgrade',
   'common.views': 'Views',
   'common.critical.error': 'Critical',
+  'common.with': 'with',
 
   'models.alert_instance.tiggered.verbose': "Occurred on {0} <br> Checked on {1}",
   'models.alert_definition.triggered.verbose': "Occurred on {0}",
@@ -2260,7 +2261,7 @@ Em.I18n.translations = {
   'services.service.config.configHistory.leftArrow.tooltip': 'Show later versions',
   'services.service.config.configHistory.dismissIcon.tooltip': 'Dismiss',
   'services.service.config.configHistory.makeCurrent.message': 'Created from service config version {0}',
-  'services.service.config.configHistory.comparing': 'Comparing',
+  'services.service.config.configHistory.comparing': 'Comparing Changes',
   'services.service.config.setRecommendedValue': 'Set Recommended',
   'services.service.config.database.msg.jdbcSetup.detailed': 'To use {0} with Hive, you must <a href="{3}" target="_blank">' +
     'download the {4} from {0}</a>. Once downloaded to the Ambari Server host, run: <br/>' +

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/mixins/common/configs/configs_comparator.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/mixins/common/configs/configs_comparator.js b/ambari-web/app/mixins/common/configs/configs_comparator.js
index 748e77e..45cd106 100644
--- a/ambari-web/app/mixins/common/configs/configs_comparator.js
+++ b/ambari-web/app/mixins/common/configs/configs_comparator.js
@@ -46,13 +46,11 @@ App.ConfigsComparator = Em.Mixin.create({
       } else {
         compareServiceVersions = [this.get('compareServiceVersion').get('version')];
       }
+      this.set('isCompareMode', true);
       this.getCompareVersionConfigs(compareServiceVersions).done(function (json) {
         allConfigs.setEach('isEditable', false);
         self.initCompareConfig(allConfigs, json);
-        self.setProperties({
-          compareServiceVersion: null,
-          isCompareMode: true
-        });
+        self.set('compareServiceVersion', null);
         dfd.resolve(true);
       }).fail(function () {
         self.set('compareServiceVersion', null);

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/styles/application.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/application.less b/ambari-web/app/styles/application.less
index 2a908b3..7629355 100644
--- a/ambari-web/app/styles/application.less
+++ b/ambari-web/app/styles/application.less
@@ -602,6 +602,8 @@ h1 {
 }
 
 #serviceConfig {
+  background: white;
+  padding: 15px;
 
   .alert{
     .glyphicon-refresh{
@@ -1768,7 +1770,7 @@ ul.inline li {
 }
 
 .full-width {
-  width: 100%
+  width: 100% !important;
 }
 
 .rack-id {
@@ -2564,26 +2566,6 @@ input[type="radio"].align-checkbox, input[type="checkbox"].align-checkbox {
   }
 }
 
-.config-manage-nav {
-  .config-groups-dropdown {
-    display: inline-block;
-    .btn.dropdown-toggle.first {
-      border-top-left-radius: 4px;
-      border-bottom-left-radius: 4px;
-      border-top-right-radius: 0;
-      border-bottom-right-radius: 0;
-    }
-    .spinner {
-      background-size: 20px;
-      height: 20px;
-      width: 20px;
-    }
-  }
-  .filter-combobox {
-    margin-bottom: 0;
-  }
-}
-
 .icon-undo {
   color: #F3B20B;
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/styles/bootstrap_overrides.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/bootstrap_overrides.less b/ambari-web/app/styles/bootstrap_overrides.less
index e1a5ab5..3637c6b 100644
--- a/ambari-web/app/styles/bootstrap_overrides.less
+++ b/ambari-web/app/styles/bootstrap_overrides.less
@@ -286,7 +286,7 @@ select.form-control {
 }
 
 .nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
-  background-color: #f0f0f0;
+  background-color: transparent;
 }
 
 @media (max-width: 992px) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/styles/config_history_flow.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/config_history_flow.less b/ambari-web/app/styles/config_history_flow.less
deleted file mode 100644
index cc09d23..0000000
--- a/ambari-web/app/styles/config_history_flow.less
+++ /dev/null
@@ -1,414 +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.
- */
-@import 'common.less';
-
-#config_history_flow {
-  margin-bottom: 10px;
-  .version-slider {
-    .flow-element {
-      .version-box .box {
-        font-size: 13px;
-        .label-current {
-          padding-top: 2px;
-        }
-      }
-      .arrow-box {
-        margin-left: 5px;
-      }
-    }
-  }
-  .version-info-bar {
-    .label-current .glyphicon-ok {
-      display: inline;
-      color: #fff;
-    }
-  }
-}
-
-.dependencies-info-bar-wrapper {
-  z-index: 100;
-  margin: 0 0 20px;
-  .alert {
-    margin: 0;
-  }
-}
-
-#config_history_flow {
-  margin-top: -5px;
-  .version-slider {
-    width: 100%;
-    height: 75px;
-    margin: 5px 0;
-    .flow-element {
-      height: 75px;
-      width: 15.2%;
-      max-width: 146px;
-      .version-box {
-        position: relative;
-        height: 90%;
-      }
-      .version-box .box {
-        cursor: pointer;
-        width: 92%;
-        height: 100%;
-        background-color: #fff;
-        -webkit-border-radius: 4px;
-        -moz-border-radius: 4px;
-        border-radius: 4px;
-        border: 1px solid #d2d9dd;
-        font-size: 11px;
-        .top-label {
-          min-width: 20px;
-          padding: 3px 2px 0 2px;
-        }
-        .author,
-        .content {
-          text-align: center;
-          color: #555;
-          display: block;
-          overflow: hidden;
-          text-overflow: ellipsis;
-          white-space: nowrap;
-        }
-        .current-label {
-          text-align: center;
-          padding: 5px;
-        }
-        .stack-label {
-          margin-right: 6px;
-          text-align: right;
-          line-height: 11px;
-        }
-      }
-      .version-box .version-popover {
-        display: none;
-        position: absolute;
-        bottom: 50px;
-        left: -45px;
-        z-index: 1000;
-        float: left;
-        width: 380px;
-        padding: 8px;
-        list-style: none;
-        background-color: #fff;
-        border: 1px solid #c3c3c3;
-        -webkit-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
-        -moz-box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
-        box-shadow: 0 0 10px rgba(0, 0, 0, 0.2);
-        -webkit-background-clip: padding-box;
-        -moz-background-clip: padding;
-        background-clip: padding-box;
-        font-size: 13px;
-        .content {
-          padding: 1px 5px 15px 5px;
-          text-align: left;
-          .notes{
-            padding-top: 6px;
-            overflow-wrap: break-word;
-            word-wrap: break-word;
-            white-space: pre-wrap;
-          }
-          .date{
-            padding-top: 5px;
-            color: #808080;
-            font-size: 11px;
-            white-space: nowrap;
-          }
-        }
-        .version-operations-buttons .btn {
-          font-size: 13px;
-        }
-      }
-      .version-box:hover{
-        .box {
-          background-color: #e6f1f6;
-        }
-      }
-      .version-box .box.displayed {
-        background-color: #e6f1f6;
-        .content {
-          color: #444;
-        }
-      }
-      .version-box .box.grayedOut {
-        background-color: #f4f4f4;
-        border: 1px solid #f4f4f4;
-        .author,
-        .content,
-        .stack-label {
-          color: #a6a6a6;
-        }
-        .current-label .label,
-        .top-label .label {
-          opacity: .5;
-        }
-
-      }
-
-    }
-    .first {
-      width: 14%;
-      margin-left: 10px;
-      .arrow-box {
-        display: none;
-      }
-      .version-box .box {
-        width: 100%;
-      }
-    }
-
-    .glyphicon-chevron-box {
-      margin-top: 8px;
-      width: 4%;
-      cursor: pointer;
-      .glyphicon-chevron-right,
-      .glyphicon-chevron-left{
-        color: #d2d9dd;
-      }
-      .glyphicon-chevron-left:hover,
-      .glyphicon-chevron-right:hover{
-        color: #808080;
-      }
-      &.disabled {
-        cursor: not-allowed;
-      }
-    }
-  }
-  .version-info-bar-wrapper {
-    margin: 0;
-    z-index: 100;
-  }
-
-  .version-info-bar {
-    background-color: @navigation-navy;
-    -webkit-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
-    -moz-box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
-    box-shadow: inset 0 0 0 rgba(0, 0, 0, 0.1), 0 1px 10px rgba(0, 0, 0, 0.1);
-    -webkit-border-radius: 4px;
-    -moz-border-radius: 4px;
-    border-radius: 4px;
-    padding: 5px;
-    clear:both;
-    margin-bottom: 5px;
-
-    .glyphicon-remove-circle {
-      color: #fff;
-      font-size: 1.5em;
-      padding-top: 4px;
-      margin-top: 0;
-      display: inline-block;
-      cursor: pointer;
-    }
-    .label-wrapper {
-      line-height: 30px;
-      color: #d3d3d3;
-      .label {
-        font-size: 14px;
-        padding: 4px;
-      }
-    }
-
-    ul#dropdown_menu {
-      position: absolute;
-      left: 0;
-      z-index: 1000;
-      min-width: 400px;
-      padding: 5px 0;
-      margin: 0;
-    }
-
-    #dropdown_content {
-      overflow: hidden;
-      &::-webkit-scrollbar {
-        display: none;
-      }
-    }
-
-    #dropdown_outer_container, #dropdown_menu_container {
-      min-width: 400px;
-      height: 300px;
-    }
-
-    #dropdown_outer_container {
-      position: relative;
-      overflow: hidden;
-    }
-
-    #dropdown_inner_container {
-      position: absolute;
-      left: 0;
-      overflow-x: hidden;
-      overflow-y: scroll;
-      &::-webkit-scrollbar {
-        display: none;
-      }
-    }
-
-    .dropdown-menu {
-      min-width: 400px;
-      margin-top: 4px !important;
-      font-size: 13px;
-      li {
-        height:35px;
-        line-height: 12px;
-        .glyphicon-caret-right {
-          font-size: 18px;
-          margin-right: 20px;
-        }
-      }
-      li:hover {
-        background-color: #666;
-        background-image: linear-gradient(to bottom, #666, #555);
-        color: #fff;
-      }
-      li#show_more:hover {
-        background: none;
-      }
-      li.not-allowed {
-        // the version which is displayed
-        cursor: not-allowed;
-        color: #808080;
-        .glyphicon-caret-right,
-        .dropdown-menu {
-          display: none;
-        }
-      }
-      li.not-allowed:hover {
-        background-color: #fff;
-        background-image: none;
-        color: #808080;
-      }
-
-      div.row, a {
-        padding-left: 10px;
-      }
-    }
-    .dropdown-submenu .dropdown-menu {
-      min-width: 200px;
-      max-width: 300px;
-      line-height: 20px;
-      font-size: 13px;
-      margin: 0;
-      padding: 8px;
-      color: #333;
-      cursor: default;
-      .content {
-        padding: 1px 5px 15px 5px;
-        .group {
-          text-align: right;
-          margin-top: -20px;
-        }
-        .date{
-          color: #808080;
-          font-size: 11px;
-          white-space: nowrap;
-        }
-        .notes{
-          word-wrap: break-word;
-          overflow-wrap: break-word;
-          white-space: pre-wrap;
-        }
-      }
-      .version-operations-buttons .btn {
-        font-size: 13px;
-      }
-    }
-  }
-
-  #config_version_popup {
-    z-index: 1001;
-    line-height: 20px;
-    padding: 8px;
-    font-size: 13px;
-    .content {
-      padding: 1px 5px 15px 5px;
-      .group {
-        text-align: right;
-        margin-top: -20px;
-      }
-      .date{
-        color: #808080;
-        font-size: 11px;
-        white-space: nowrap;
-      }
-      .notes{
-        word-wrap: break-word;
-        overflow-wrap: break-word;
-        white-space: pre-wrap;
-      }
-    }
-    .version-operations-buttons .btn {
-      font-size: 13px;
-    }
-  }
-  .stack {
-    padding: 1px 10px;
-    font-size: 11px;
-  }
-}
-
-#config_history {
-  .table {
-    .filter-input-width{
-      width: ~"calc(100% - 20px)";
-    }
-    // service name column
-    th:first-child,
-    td:first-child {
-      width: 15%;
-    }
-    // config group, create time columns
-    th:first-child + th,
-    td:first-child + td,
-    th:first-child + th + th,
-    td:first-child + td + td {
-      width: 20%;
-      word-wrap: break-word;
-    }
-    // author column
-    th:first-child + th + th + th,
-    td:first-child + td + td + td {
-      width: 180px;
-    }
-    // notes column
-    th:first-child + th + th + th + th,
-    td:first-child + td + td + td + td {
-      word-wrap: break-word;
-    }
-    td.notes .show-more-button {
-      font-size: @default-font-size - 1;
-    }
-  }
-  a {
-    cursor: pointer;
-  }
-}
-
-
-// Firefox specific styles
-@-moz-document url-prefix() {
-  #config_history_flow {
-    .version-info-bar {
-      .dropdown-menu {
-        li {
-          line-height: 30px !important;
-        }
-      }
-    }
-  }
-}

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/styles/config_versions_control.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/config_versions_control.less b/ambari-web/app/styles/config_versions_control.less
new file mode 100644
index 0000000..e7375d6
--- /dev/null
+++ b/ambari-web/app/styles/config_versions_control.less
@@ -0,0 +1,144 @@
+/**
+ * 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.
+ */
+@import 'common.less';
+
+@button-width: 150px;
+@border-color: #EBECF1;
+
+#config-versions-control {
+  .dropdown-menu {
+    min-width: 600px;
+    li {
+      padding: 3px 20px;
+    }
+  }
+  .versions-list {
+    max-height: 405px;
+    overflow-y: auto;
+    padding-left: 0;
+    margin-bottom: 0;
+    li {
+      list-style-type: none;
+    }
+  }
+  .grey-text {
+    color: @top-nav-brand-color;
+  }
+  .current-color {
+    color: @health-status-green;
+  }
+  .notes-color {
+    color: #666;
+  }
+  .version-info.selected {
+    background-color: rgb(242, 249, 242);
+    border: 2px solid @border-color;
+    box-shadow: none;
+  }
+  .btn.dropdown-toggle {
+    padding: 10px;
+    text-align: left;
+    span {
+      text-transform: capitalize;
+    }
+    strong {
+      margin-left: 10px;
+      margin-right: 5px;
+    }
+  }
+  .search-input {
+    width: 100%;
+    margin: 5px 0 10px 0;
+    .btn {
+      padding: 10px;
+    }
+  }
+  .version-info {
+    border: 1px solid @border-color;
+    box-shadow: 0 0 5px 2px @border-color;
+    border-radius: 3px;
+    padding: 0 10px;
+    width: 93%;
+    display: inline-block;
+    cursor: pointer;
+    min-height: 60px;
+  }
+  .compare-button {
+    width: 5%;
+    vertical-align: top;
+    padding: 0 6px;
+    margin: 15px 0 0 6px;
+    height: 30px;
+    cursor: pointer;
+  }
+  .make-current {
+    color: @health-status-green;
+    border-color: @health-status-green;
+  }
+  .compare-bar {
+    background-color: @border-color;
+    padding: 10px 15px;
+    .close {
+      line-height: 30px;
+    }
+  }
+}
+
+.config-manage-nav {
+  .config-groups-dropdown {
+    display: inline-block;
+    width: @button-width;
+    .btn.dropdown-toggle {
+      width: 100%;
+      text-align: left;
+      padding: 10px;
+    }
+    .caret {
+      float: right;
+      margin-top: 5px;
+    }
+  }
+  .filter-combobox {
+    display: inline-block;
+    width: @button-width;
+  }
+  .spinner {
+    background-size: 20px;
+    height: 20px;
+    width: 20px;
+  }
+}
+
+div.config-manage-nav.pull-bottom {
+  margin-top: 0;
+}
+
+.config-manage-nav.pull-top {
+  margin-top: -42px;
+}
+
+.configs-save-panel {
+  position: fixed;
+  background: white;
+  padding: 15px 30px 20px;
+  bottom: 0;
+  right: 0;
+  width: 100%;
+  z-index: 3;
+  box-shadow: 0 -3px 5px 2px @border-color;
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/styles/widgets.less
----------------------------------------------------------------------
diff --git a/ambari-web/app/styles/widgets.less b/ambari-web/app/styles/widgets.less
index 9bf60f0..a11c30f 100644
--- a/ambari-web/app/styles/widgets.less
+++ b/ambari-web/app/styles/widgets.less
@@ -143,6 +143,9 @@
       left: -@overriden-property-widget-padding;
     }
   }
+  .input-group-btn {
+    width: auto;
+  }
 }
 
 .widget-config-comparison .widget-config&.slider-widget {
@@ -494,6 +497,4 @@
   padding: 10px 5px 0 10px;
 }
 
-.input-group-btn {
-  width: auto;
-}
+

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/templates/common/configs/config_history_dropdown_row.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/configs/config_history_dropdown_row.hbs b/ambari-web/app/templates/common/configs/config_history_dropdown_row.hbs
deleted file mode 100644
index 80e6878..0000000
--- a/ambari-web/app/templates/common/configs/config_history_dropdown_row.hbs
+++ /dev/null
@@ -1,24 +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.
-}}
-
-<div class="row version-in-dropdown" {{action doAction view.serviceVersion view.actionTypes.SWITCH target="view"}}>
-  <div class="col-md-2">{{view.serviceVersion.versionText}}</div>
-  <div class="col-md-6">{{view.serviceVersion.createdDate}}</div>
-  <div class="col-md-3">{{view.serviceVersion.authorFormatted}}</div>
-  <div class="pull-right"><i class="glyphicon glyphicon-caret-right"></i></div>
-</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/templates/common/configs/config_history_flow.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/configs/config_history_flow.hbs b/ambari-web/app/templates/common/configs/config_history_flow.hbs
deleted file mode 100644
index 99cd140..0000000
--- a/ambari-web/app/templates/common/configs/config_history_flow.hbs
+++ /dev/null
@@ -1,148 +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.
-}}
-
-<div id="config_history_flow" {{bindAttr class="view.parentView.supportsConfigLayout:with-enhanced-config"}}>
-  {{! Slider with config versions }}
-  <div class="version-slider">
-    <div {{bindAttr class=":glyphicon :glyphicon-chevron-box :pull-left view.showLeftArrow::disabled"}} {{action shiftBack target="view"}} data-toggle="arrow-tooltip"
-      {{bindAttr data-original-title="view.leftArrowTooltip"}}><i class="glyphicon-chevron-left glyphicon glyphicon-3x"></i></div>
-    <div {{bindAttr class=":glyphicon :glyphicon-chevron-box :pull-left view.showRightArrow::disabled"}} {{action shiftForward target="view"}} data-toggle="arrow-tooltip"
-      {{bindAttr data-original-title="view.rightArrowTooltip"}}><i class="glyphicon-chevron-right glyphicon glyphicon-3x"></i></div>
-    {{#each sV in view.visibleServiceVersion}}
-      {{view App.ConfigsServiceVersionBoxView serviceVersionBinding="sV"}}
-    {{/each}}
-  </div>
-  {{! Slider with config versions end }}
-
-  <div class="version-info-bar-wrapper">
-    {{! Compare config versions bar }}
-    {{#isAuthorized "SERVICE.COMPARE_CONFIGS"}}
-      <div {{bindAttr class="view.showCompareVersionBar::hidden :version-info-bar"}}>
-        <div class="row">
-          <div class="col-md-1 remove-compare-bar" {{action removeCompareVersionBar target="view"}} data-toggle="arrow-tooltip" {{translateAttr data-original-title="services.service.config.configHistory.dismissIcon.tooltip"}}>
-            <i class="glyphicon-remove-circle glyphicon glyphicon-large"></i>
-          </div>
-          <div class="label-wrapper col-md-8" data-toggle="tooltip" {{bindAttr data-original-title="view.compareServiceVersion.fullNotes"}}>
-            {{t services.service.config.configHistory.comparing}}
-            <span class="label label-info current-version-label">{{view.displayedServiceVersion.versionText}}</span>
-            ...
-            <span class="label label-info compare-version-label">{{view.compareServiceVersion.versionText}}</span>
-            {{#if view.compareServiceVersion.isCurrent}}
-              <span class="label label-success">{{t common.current}}</span>
-            {{/if}}
-              <strong>{{view.compareServiceVersion.authorFormatted}}</strong>&nbsp;{{t dashboard.configHistory.info-bar.authoredOn}}
-              &nbsp;<strong>{{view.compareServiceVersion.createdDate}}</strong>
-          </div>
-          {{#isAuthorized "SERVICE.MODIFY_CONFIGS"}}
-            <div class="operations-button col-md-3">
-              <button class="pull-right btn btn-success" {{action doAction view.serviceVersionsReferences.compare view.actionTypes.REVERT target="view"}} {{bindAttr disabled="view.versionActionsDisabled" class="view.compareServiceVersion.canBeMadeCurrent::hidden"}}>{{view.compareServiceVersion.makeCurrentButtonText}}</button>
-            </div>
-          {{/isAuthorized}}
-        </div>
-      </div>
-    {{/isAuthorized}}
-    {{! Compare config versions bar end }}
-
-    {{! Popup for config version }}
-    {{#view App.ConfigHistoryDropdownSubMenuView id="config_version_popup"}}
-      {{#if view.parentView.hoveredServiceVersion}}
-        <div class="content">
-          <span class="label label-info">{{view.parentView.hoveredServiceVersion.versionText}}</span>
-          <span class="stack">{{view.parentView.hoveredServiceVersion.stackVersion}}</span>
-          <div class="group"><strong>{{view.parentView.hoveredServiceVersion.configGroupName}}</strong></div>
-          <div class="date"><strong>{{view.parentView.hoveredServiceVersion.authorFormatted}}</strong>&nbsp;{{t dashboard.configHistory.info-bar.authoredOn}}&nbsp;<strong>{{view.parentView.hoveredServiceVersion.createdDate}}</strong></div>
-          <div class="notes">{{view.parentView.hoveredServiceVersion.fullNotes}}</div>
-        </div>
-        <div class="version-operations-buttons">
-          <button {{bindAttr disabled="view.parentView.hoveredServiceVersion.disabledActionAttr.view" class=":btn :btn-default view.parentView.hoveredServiceVersion.isDisplayed:not-allowed-cursor" title="view.parentView.hoveredServiceVersion.disabledActionMessages.view"}} {{action doAction undefined view.parentView.actionTypes.SWITCH target="view.parentView"}}><i class="glyphicon glyphicon-search"></i>&nbsp;{{t common.view}}</button>
-          {{#havePermissions "SERVICE.COMPARE_CONFIGS"}}
-            <button {{bindAttr disabled="view.parentView.hoveredServiceVersion.disabledActionAttr.compare" class=":btn :btn-default view.parentView.hoveredServiceVersion.isDisplayed:not-allowed-cursor" title="view.parentView.hoveredServiceVersion.disabledActionMessages.compare"}} {{action doAction undefined view.parentView.actionTypes.COMPARE target="view.parentView"}}><i class="glyphicon glyphicon-copy"></i>&nbsp;{{t common.compare}}</button>
-          {{/havePermissions}}
-          {{#havePermissions "SERVICE.MODIFY_CONFIGS"}}
-            <button {{bindAttr disabled="view.parentView.hoveredServiceVersion.disabledActionAttr.revert" class=":btn :btn-default view.parentView.hoveredServiceVersion.isCurrent:not-allowed-cursor view.parentView.hoveredServiceVersion.isCompatible::hidden" title="view.parentView.hoveredServiceVersion.disabledActionMessages.revert"}} {{action doAction undefined view.parentView.actionTypes.REVERT target="view.parentView"}}>{{t dashboard.configHistory.info-bar.revert.button}}</button>
-          {{/havePermissions}}
-        </div>
-      {{/if}}
-    {{/view}}
-    {{! Popup for config version }}
-
-    {{! Config Version Bar }}
-    <div class="version-info-bar">
-      <div class="row">
-        <div class="btn-group col-md-2">
-          <button id="toggle-dropdown-button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" href="#" {{action hideFullList target="view"}} {{bindAttr disabled="view.versionActionsDisabled"}}>
-            <i class="glyphicon glyphicon-random"></i>
-            <span class="caret"></span>
-          </button>
-          <div id="dropdown_content" class="dropdown-menu">
-            <div id="dropdown_outer_container">
-              <div id="dropdown_inner_container">
-                <div id="dropdown_menu_container">
-                  <ul id="dropdown_menu">
-                    {{#each serviceVersion in view.dropDownList}}
-                      {{view App.ConfigHistoryDropdownRowView serviceVersionBinding="serviceVersion"}}
-                    {{/each}}
-                    {{#unless view.showFullList}}
-                      <li class="align-center pointer" id="show_more">
-                        <a {{action openFullList target="view"}}>
-                          {{t dashboard.configHistory.info-bar.showMore}}&nbsp;{{controller.selectedService.displayName}}
-                          &nbsp;<span class="lowercase ellipsis">{{t dashboard.configHistory.title}}</span>
-                        </a>
-                      </li>
-                    {{/unless}}
-                  </ul>
-                </div>
-              </div>
-            </div>
-          </div>
-        </div>
-        <div class="label-wrapper col-md-6" data-toggle="tooltip" {{bindAttr data-original-title="view.displayedServiceVersion.fullNotes"}}>
-          {{#if view.displayedServiceVersion.versionText}}
-            <span class="label label-info current-version-label">{{view.displayedServiceVersion.versionText}}</span>
-          {{/if}}
-          {{#if view.displayedServiceVersion.isCurrent}}
-              <span class="label label-current label-success" data-toggle="tooltip" {{translateAttr title="common.current"}}>
-                <i class="glyphicon glyphicon-ok"></i>
-              </span>
-          {{/if}}
-          {{#if view.displayedServiceVersion.author}}
-            &nbsp;<strong>{{view.displayedServiceVersion.author}}</strong>&nbsp;{{t dashboard.configHistory.info-bar.authoredOn}}&nbsp;<strong>{{view.displayedServiceVersion.createdDate}}</strong>
-          {{/if}}
-        </div>
-        {{#isAuthorized "SERVICE.MODIFY_CONFIGS"}}
-          <div class="operations-button col-md-4">
-            <div {{bindAttr class="view.displayedServiceVersion.isCurrent::hidden :pull-right"}}>
-              <button class="btn btn-default" {{action doCancel target="controller"}} {{bindAttr disabled="view.isDiscardDisabled"}}>
-                {{t common.discard}}
-              </button>
-              <button class="btn btn-success" {{action save target="view"}} {{bindAttr disabled="view.isSaveDisabled"}}>
-                {{t common.save}}
-              </button>
-            </div>
-            <div class="pull-right">
-              <button class="btn btn-success" {{action doAction view.serviceVersionsReferences.displayed view.actionTypes.REVERT target="view"}} {{bindAttr disabled="view.versionActionsDisabled" class="view.displayedServiceVersion.canBeMadeCurrent::hidden"}}>
-                {{view.displayedServiceVersion.makeCurrentButtonText}}
-              </button>
-            </div>
-          </div>
-        {{/isAuthorized}}
-      </div>
-    </div>
-    {{! Config Version Bar end }}
-  </div>
-</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/templates/common/configs/config_versions_control.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/configs/config_versions_control.hbs b/ambari-web/app/templates/common/configs/config_versions_control.hbs
new file mode 100644
index 0000000..251276b
--- /dev/null
+++ b/ambari-web/app/templates/common/configs/config_versions_control.hbs
@@ -0,0 +1,42 @@
+{{!
+* 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.
+}}
+
+<div id="config-versions-control">
+  {{#if view.isCompareMode}}
+    <div class="compare-bar">
+      <i class="glyphicon glyphicon-duplicate" aria-hidden="true"></i>
+      <span>{{t services.service.config.configHistory.comparing}}:</span>
+      {{view App.ConfigVersionsDropdownView
+             serviceVersionsBinding="view.primaryServiceVersionsInCompare"
+             isCompareMode="true"}}
+      <span class="grey-text">{{t common.with}}</span>
+      {{view App.ConfigVersionsDropdownView
+             serviceVersionsBinding="view.secondaryServiceVersionsInCompare"
+             isSecondary="true"
+             isCompareMode="true"}}
+      <a {{action removeCompareVersionBar target="view"}} class="pull-right close">&times;</a>
+    </div>
+  {{else}}
+    {{view App.ConfigVersionsDropdownView serviceVersionsBinding="view.serviceVersions"}}
+    {{#unless view.displayedServiceVersion.isCurrent}}
+      <button class="btn btn-default make-current" {{action makeCurrent view.displayedServiceVersion target="view"}}>
+        {{t dashboard.configHistory.info-bar.revert.button}}
+      </button>
+    {{/unless}}
+  {{/if}}
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/templates/common/configs/config_versions_dropdown.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/configs/config_versions_dropdown.hbs b/ambari-web/app/templates/common/configs/config_versions_dropdown.hbs
new file mode 100644
index 0000000..18083f9
--- /dev/null
+++ b/ambari-web/app/templates/common/configs/config_versions_dropdown.hbs
@@ -0,0 +1,69 @@
+{{!
+* 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.
+}}
+
+<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown" aria-haspopup="true"
+        aria-expanded="false">
+  {{t common.version}}:
+  <span class="pull-right"><strong>{{view.displayedServiceVersion.version}}</strong><span class="caret"></span></span>
+</button>
+<div class="dropdown-menu">
+  <li class="input-group search-input">
+    {{view Em.TextField valueBinding="view.filterValue" class="form-control" placeholderBinding="view.searchLabel"}}
+    <span class="input-group-btn">
+            <button class="btn btn-default" type="button">
+              <span class="glyphicon glyphicon-search" aria-hidden="true"></span>
+            </button>
+          </span>
+  </li>
+  <ul class="versions-list">
+    {{#each item in view.filteredServiceVersions}}
+      <li>
+        <div {{bindAttr class="item.isDisplayed:selected view.isCompareMode:full-width :version-info"}}
+          {{action mainClickAction item target="view"}}>
+          <div class="row">
+            <div class="col-md-4">
+              <span class="h2">{{t common.version}}&nbsp;{{item.version}}&nbsp;</span>
+              <span class="description grey-text">{{item.stackVersion}}</span>
+            </div>
+            <div class="col-md-8 description grey-text">
+                <span class="pull-right">
+                  <strong>{{item.authorFormatted}}</strong>
+                  &nbsp;{{t dashboard.configHistory.info-bar.authoredOn}}&nbsp;
+                  <strong>{{item.createdDate}}</strong>
+                </span>
+            </div>
+          </div>
+          <div class="row">
+            <div class="col-md-10 description notes-color">{{item.fullNotes}}</div>
+            <div class="col-md-2">
+              {{#if item.isCurrent}}
+                <strong class="pull-right current-color">{{t common.current}}</strong>
+              {{/if}}
+            </div>
+          </div>
+        </div>
+        {{#unless view.isCompareMode}}
+          <button {{bindAttr class="item.isDisplayed:hide :compare-button :btn :btn-default"}}
+            {{action compare item target="view.parentView"}}>
+            <i class="glyphicon glyphicon-duplicate" aria-hidden="true"></i>
+          </button>
+        {{/unless}}
+      </li>
+    {{/each}}
+  </ul>
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/templates/common/configs/service_config.hbs
----------------------------------------------------------------------
diff --git a/ambari-web/app/templates/common/configs/service_config.hbs b/ambari-web/app/templates/common/configs/service_config.hbs
index f071dd2..b097b16 100644
--- a/ambari-web/app/templates/common/configs/service_config.hbs
+++ b/ambari-web/app/templates/common/configs/service_config.hbs
@@ -45,54 +45,61 @@
     </div>
   {{/if}}
 {{/if}}
-{{#if view.supportsHostOverrides}}
-  <div class="alert alert-info config-manage-nav">
 
-    {{t common.group}}&nbsp;
-	  <span class="btn-group config-groups-dropdown">
-      {{#if controller.configGroupsAreLoaded}}
-        <button {{bindAttr disabled="controller.isHostsConfigsPage"}} style="text-transform: none;" class="btn btn-default dropdown-toggle first"
-                                                                      data-toggle="dropdown">{{selectedConfigGroup.displayNameHosts}}</button>
-        <button {{bindAttr disabled="controller.isHostsConfigsPage"}} class="btn btn-default dropdown-toggle" data-toggle="dropdown">
-          <span class="caret"></span>
-        </button>
-        <ul class="dropdown-menu config-groups-dropdown-menu">
-          <!-- available config group menu links -->
-          {{#each configGroup in configGroups}}
-            <li>
-              <a href="#" {{action "selectConfigGroup" configGroup target="controller"}}>
-                {{configGroup.displayNameHosts}}
-              </a>
-            </li>
-          {{/each}}
-        </ul>
+
+<div>
+  <div class="mbm">
+    {{#if view.isOnTheServicePage}}
+      {{#if allVersionsLoaded}}
+        {{view App.ConfigVersionsControlView}}
       {{else}}
-        {{view App.SpinnerView classNames="pull-left"}}
+        {{view App.SpinnerView}}
       {{/if}}
-		</span>
+    {{/if}}
+  </div>
+  {{#if view.supportsHostOverrides}}
+    <div {{bindAttr class="controller.isCompareMode:pull-bottom :pull-top :config-manage-nav :pull-right"}}>
       {{#if controller.isHostsConfigsPage}}
         {{#isAuthorized "SERVICE.MANAGE_CONFIG_GROUPS"}}
           &nbsp;<a href="#" {{action "switchHostGroup" target="controller"}}>{{t common.change}}</a>
         {{/isAuthorized}}
+      {{/if}}
+      {{t common.configGroup}}&nbsp;
+      {{#if controller.configGroupsAreLoaded}}
+        <div class="btn-group config-groups-dropdown">
+          <button {{bindAttr disabled="controller.isHostsConfigsPage"}}
+            class="btn btn-default dropdown-toggle"
+            data-toggle="dropdown">
+            {{selectedConfigGroup.displayNameHosts}}
+            <span class="caret"></span>
+          </button>
+          <ul class="dropdown-menu config-groups-dropdown-menu">
+            {{#isAuthorized "SERVICE.MANAGE_CONFIG_GROUPS"}}
+              <li>
+                <a href="#" class="link-left-pad" {{action "manageConfigurationGroup" target="controller"}}>{{t
+                  services.service.actions.manage_configuration_groups.short}}</a>
+              </li>
+              <li role="separator" class="divider"></li>
+            {{/isAuthorized}}
+            <!-- available config group menu links -->
+            {{#each configGroup in configGroups}}
+              <li>
+                <a href="#" {{action "selectConfigGroup" configGroup target="controller"}}>
+                  {{configGroup.displayNameHosts}}
+                </a>
+              </li>
+            {{/each}}
+          </ul>
+        </div>
       {{else}}
-        {{#isAuthorized "SERVICE.MANAGE_CONFIG_GROUPS"}}
-            <a href="#" class="link-left-pad" {{action "manageConfigurationGroup" target="controller"}}>{{t services.service.actions.manage_configuration_groups.short}}</a>
-        {{/isAuthorized}}
+        {{view App.SpinnerView classNames="pull-left"}}
       {{/if}}
-    <div class="pull-right">
-      {{view App.FilterComboCleanableView filterBinding="view.filter" columnsBinding="view.columns" popoverDescriptionBinding="view.propertyFilterPopover"}}
-    </div>
-    <div class="clearfix"></div>
-  </div>
-{{/if}}
+      {{view App.FilterComboCleanableView classNames="col-lg-4" filterBinding="view.filter"
+             columnsBinding="view.columns" popoverDescriptionBinding="view.propertyFilterPopover"}}
 
-{{#if view.isOnTheServicePage}}
-  {{#if allVersionsLoaded}}
-    {{view App.ConfigHistoryFlowView serviceBinding="selectedService"}}
-  {{else}}
-    {{view App.SpinnerView}}
+    </div>
   {{/if}}
-{{/if}}
+</div>
 
 {{#if versionLoaded}}
   {{#unless hideDependenciesInfoBar}}
@@ -149,10 +156,24 @@
     {{view App.ConfigCategoryContainerView categoriesBinding="selectedService.configCategories" canEditBinding="view.canEdit" serviceBinding="selectedService" serviceConfigsBinding="selectedService.configs" supportsHostOverridesBinding="view.supportsHostOverrides"}}
   {{/if}}
   {{#if view.isAllConfigsHidden}}
-    <div class="alert alert-info col-sm-12">
+    <div class="alert alert-info">
       {{t services.service.config.nothing.to.display}}
     </div>
   {{/if}}
 {{else}}
   {{view App.SpinnerView}}
 {{/if}}
+
+<div class="configs-save-panel" {{bindAttr class="view.showSavePanel::hidden"}}>
+  <div class="pull-right">
+    <button class="btn btn-default" {{action doCancel target="controller"}}
+      {{bindAttr disabled="view.isDiscardDisabled"}}>
+      {{t common.discard}}
+    </button> &nbsp;
+    <button class="btn btn-success" {{action save target="view"}}
+      {{bindAttr disabled="view.isSaveDisabled"}}>
+      {{t common.save}}
+    </button>
+  </div>
+  <div class="clearfix"></div>
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/views.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views.js b/ambari-web/app/views.js
index 394e390..e18182f 100644
--- a/ambari-web/app/views.js
+++ b/ambari-web/app/views.js
@@ -75,7 +75,8 @@ require('views/common/configs/config_category_container_view');
 require('views/common/configs/overriddenPropertyRow_view');
 require('views/common/configs/overriddenProperty_view');
 require('views/common/configs/compare_property_view');
-require('views/common/configs/config_history_flow');
+require('views/common/configs/config_versions_control_view');
+require('views/common/configs/config_versions_dropdown_view');
 require('views/common/configs/selectable_popup_body_view');
 require('views/common/configs/custom_category_views/notification_configs_view');
 require('views/common/configs/config_diff_view');

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/views/common/configs/config_history_flow.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/configs/config_history_flow.js b/ambari-web/app/views/common/configs/config_history_flow.js
deleted file mode 100644
index 32a5e71..0000000
--- a/ambari-web/app/views/common/configs/config_history_flow.js
+++ /dev/null
@@ -1,644 +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.
- */
-
-var App = require('app');
-
-App.ConfigHistoryFlowView = Em.View.extend({
-  templateName: require('templates/common/configs/config_history_flow'),
-
-  /**
-   * index of the first element(service version box) in viewport
-   */
-  startIndex: 0,
-  showLeftArrow: false,
-  showRightArrow: false,
-  leftArrowTooltip: Em.computed.ifThenElse('showLeftArrow', Em.I18n.t('services.service.config.configHistory.leftArrow.tooltip'), null),
-  rightArrowTooltip: Em.computed.ifThenElse('showRightArrow', Em.I18n.t('services.service.config.configHistory.rightArrow.tooltip'), null),
-  VERSIONS_IN_FLOW: 6,
-  VERSIONS_IN_DROPDOWN: 25,
-  /**
-   * flag identify whether to show all versions or short list of them
-   */
-  showFullList: false,
-  compareServiceVersion: null,
-
-  /**
-   * types of actions that can't be done to service config versions
-   */
-  actionTypes: {
-    SWITCH: 'switchVersion',
-    COMPARE: 'compare',
-    REVERT: 'revert'
-  },
-
-  /**
-   * serviceVersion object that is currently being hovered in the dropdown menu
-   */
-  hoveredServiceVersion: null,
-  /**
-   * flag to check if sub-menu popup is currently being hovered
-   */
-  displaySubMenuFlag: false,
-  /**
-   * flag to check if any dropdown item is currently hovered by the user
-   */
-  isHovered: false,
-
-  /**
-   * In reason of absence of properties dynamic values support which passed to an action,
-   * used property map to get latest values of properties for action
-   */
-  serviceVersionsReferences: {
-    displayed: Em.Object.create({
-      isReference: true,
-      property: 'displayedServiceVersion'
-    }),
-    compare: Em.Object.create({
-      isReference: true,
-      property: 'compareServiceVersion'
-    })
-  },
-
-  allServiceVersions: function() {
-    return App.ServiceConfigVersion.find().filterProperty('serviceName', this.get('serviceName'));
-  }.property('serviceName'),
-
-  showCompareVersionBar: Em.computed.bool('compareServiceVersion'),
-
-  isSaveDisabled: Em.computed.or('controller.isSubmitDisabled', '!controller.versionLoaded', '!controller.isPropertiesChanged'),
-
-  serviceName: Em.computed.alias('controller.content.serviceName'),
-
-  displayedServiceVersion: Em.computed.findBy('serviceVersions', 'isDisplayed', true),
-  /**
-   * identify whether to show link that open whole content of notes
-   */
-  showMoreLink: Em.computed.gt('displayedServiceVersion.notes.length', 100),
-  /**
-   * formatted notes ready to display
-   */
-  shortNotes: Em.computed.truncate('displayedServiceVersion.notes', 100, 100),
-
-  serviceVersions: function () {
-    var isDefaultGroupSelected = this.get('controller.selectedConfigGroup.isDefault');
-    var groupId = this.get('controller.selectedConfigGroup.id');
-    var self = this;
-
-    this.get('allServiceVersions').forEach(function (version) {
-      version.set('isDisabled', !(version.get('groupId') === groupId || isDefaultGroupSelected && version.get('groupName') === App.ServiceConfigGroup.defaultGroupName));
-    }, this);
-
-    var serviceVersions = this.get('allServiceVersions').filter(function(s) {
-      return s.get('groupId') === groupId || s.get('groupName') === App.ServiceConfigGroup.defaultGroupName;
-    });
-
-    if (!serviceVersions.findProperty('isDisplayed')) {
-      //recompute serviceVersions if displayed version absent
-      Em.run.next(function() {
-        self.propertyDidChange('controller.selectedConfigGroup.name');
-      });
-    }
-
-    return serviceVersions.sort(function (a, b) {
-      return Em.get(b, 'createTime') - Em.get(a, 'createTime');
-    });
-  }.property('serviceName', 'controller.selectedConfigGroup.name'),
-
-  /**
-   * disable versions visible to the user to prevent actions on them
-   */
-  disableVersions: function () {
-    this.get('allServiceVersions').setEach('isDisabled', true);
-  },
-
-  /**
-   * service versions which in viewport and visible to user
-   */
-  visibleServiceVersion: function () {
-    return this.get('serviceVersions').slice(this.get('startIndex'), this.get('startIndex') + this.VERSIONS_IN_FLOW);
-  }.property('startIndex', 'serviceVersions'),
-
-  /**
-   * enable actions to manipulate version only after it's loaded
-   */
-  versionActionsDisabled: Em.computed.or('!controller.versionLoaded', '!dropDownList.length'),
-
-  /**
-   * enable discard to manipulate version only after it's loaded and any property is changed
-   */
-  isDiscardDisabled: Em.computed.or('!controller.versionLoaded', '!controller.isPropertiesChanged'),
-  /**
-   * list of service versions
-   * by default 6 is number of items in short list
-   */
-  dropDownList: function () {
-    var serviceVersions = this.get('serviceVersions').slice(0);
-    if (this.get('showFullList')) {
-      return serviceVersions;
-    }
-    return serviceVersions.slice(0, this.VERSIONS_IN_DROPDOWN);
-  }.property('serviceVersions', 'showFullList', 'displayedServiceVersion'),
-
-  openFullList: function (event) {
-    event.stopPropagation();
-    this.set('showFullList', true);
-  },
-
-  hideFullList: function (event) {
-    this.set('showFullList', !(this.get('serviceVersions.length') > this.VERSIONS_IN_DROPDOWN));
-  },
-
-  didInsertElement: function () {
-    App.tooltip(this.$('[data-toggle=tooltip]'),{
-      placement: 'bottom',
-      html: false
-    });
-    App.tooltip(this.$('[data-toggle=arrow-tooltip]'),{
-      placement: 'top'
-    });
-    this.$(".version-info-bar-wrapper").stick_in_parent({parent: '#serviceConfig', offset_top: 10});
-    this.onChangeConfigGroup();
-  },
-
-  willDestroyElement: function() {
-    this.$('.version-info-bar-wrapper').trigger('sticky_kit:detach').off();
-    this.$('[data-toggle=tooltip]').tooltip('destroy');
-    this.$('[data-toggle=arrow-tooltip]').tooltip('destroy');
-  },
-
-  willInsertElement: function () {
-    this.setDisplayVersion();
-  },
-
-  setDisplayVersion: function () {
-    var serviceVersions = this.get('serviceVersions');
-    var startIndex = 0;
-    var currentIndex = 0;
-    var selectedVersion = this.get('controller.selectedVersion');
-
-    serviceVersions.setEach('isDisplayed', false);
-
-    serviceVersions.forEach(function (serviceVersion, index) {
-      if (selectedVersion === serviceVersion.get('version')) {
-        serviceVersion.set('isDisplayed', true);
-        currentIndex = index;
-      }
-    }, this);
-
-    // show current version as the last one
-    if (currentIndex + 1 > this.VERSIONS_IN_FLOW) {
-      startIndex = currentIndex + 1 - this.VERSIONS_IN_FLOW;
-    }
-    this.set('startIndex', startIndex);
-    this.adjustFlowView();
-  }.observes('allVersionsLoaded'),
-
-  onChangeConfigGroup: function () {
-    var serviceVersions = this.get('serviceVersions');
-    var selectedGroupName = this.get('controller.selectedConfigGroup.name');
-    var preselectedVersion = this.get('controller.selectedVersion');
-    var startIndex = 0;
-    var currentIndex = 0;
-    var isCurrentInDefaultGroupIndex = null;
-
-
-    serviceVersions.setEach('isDisplayed', false);
-    // display selected version from config history
-    serviceVersions.forEach(function (serviceVersion, index) {
-      // find selected version in group
-      if (serviceVersion.get('version') === preselectedVersion && serviceVersion.get('groupName') === selectedGroupName) {
-        serviceVersion.set('isDisplayed', true);
-        currentIndex = index + 1;
-      }
-    });
-    // display current in selected group
-    if (!currentIndex) {
-      serviceVersions.forEach(function (serviceVersion, index) {
-        // find current in selected group
-        if (serviceVersion.get('isCurrent') && serviceVersion.get('groupName') === selectedGroupName) {
-          serviceVersion.set('isDisplayed', true);
-          currentIndex = index + 1;
-        }
-        if (serviceVersion.get('isCurrent') && serviceVersion.get('groupName') === App.ServiceConfigGroup.defaultGroupName) {
-          isCurrentInDefaultGroupIndex = index;
-        }
-      });
-      // if there is no current version in selected group show current version from default group
-      if (!currentIndex && !Em.isNone(isCurrentInDefaultGroupIndex)) {
-        serviceVersions[isCurrentInDefaultGroupIndex].set('isDisplayed', true);
-        currentIndex = isCurrentInDefaultGroupIndex + 1;
-      }
-    }
-    // show current version as the last one
-    if (currentIndex > this.VERSIONS_IN_FLOW) {
-      startIndex = currentIndex - this.VERSIONS_IN_FLOW;
-    }
-    this.set('startIndex', startIndex);
-    this.adjustFlowView();
-  }.observes('controller.selectedConfigGroup'),
-
-  /**
-   *  define the first element in viewport
-   *  change visibility of arrows
-   */
-  adjustFlowView: function () {
-    var startIndex = this.get('startIndex');
-    this.get('serviceVersions').forEach(function (serviceVersion, index) {
-      serviceVersion.set('first', index === startIndex);
-    });
-    this.set('showLeftArrow', startIndex !== 0);
-    this.set('showRightArrow', (this.get('serviceVersions.length') > this.VERSIONS_IN_FLOW) && ((startIndex + this.VERSIONS_IN_FLOW) < this.get('serviceVersions.length')));
-  },
-
-  /**
-   * check action constraints prior to invoke it
-   * @param event
-   */
-  doAction: function (event) {
-    var type = event.contexts[1],
-        controller = this.get('controller'),
-        self = this;
-    if (!controller.get('versionLoaded')) {
-      return;
-    }
-    // action from right popup of pull down version list will have context[0] == undefined, and use 'hoveredServiceVersion'.
-    // refer to AMBARI-19871 for more info
-    var configVersion = event.contexts[0] || this.get('hoveredServiceVersion');
-    if (type === 'switchVersion') {
-      if (configVersion && configVersion.get("isDisplayed"))  return;
-    } else {
-      var isDisabled = configVersion ? configVersion.get('isDisabled') : false;
-      if (isDisabled) return;
-    }
-
-    function callback() {
-      self[type].call(self, event);
-    }
-
-    Em.run.next(function() {
-      if (controller.hasUnsavedChanges()) {
-        controller.showSavePopup(null, callback);
-        return;
-      }
-
-      self.disableVersions();
-      callback();
-    });
-    $("#config_version_popup").removeAttr('style');
-  },
-
-  /**
-   * switch configs view version to chosen
-   */
-  switchVersion: function (event) {
-    var configVersion = event.contexts[0] || this.get('hoveredServiceVersion');
-    var version = configVersion.get('version');
-    var versionIndex = 0;
-    this.set('compareServiceVersion', null);
-    this.get('serviceVersions').forEach(function (serviceVersion, index) {
-      if (serviceVersion.get('version') === version) {
-        serviceVersion.set('isDisplayed', true);
-        versionIndex = index;
-      } else {
-        serviceVersion.set('isDisplayed', false);
-      }
-    });
-    this.shiftFlowOnSwitch(versionIndex);
-    this.get('controller').loadSelectedVersion(version);
-  },
-
-  /**
-   * add config values of chosen version to view for comparison
-   * add a second version-info-bar for the chosen version
-   */
-  compare: function (event) {
-    var serviceConfigVersion = event.contexts[0] || this.get('hoveredServiceVersion');
-    this.set('controller.compareServiceVersion', serviceConfigVersion);
-    this.set('compareServiceVersion', serviceConfigVersion);
-
-    var controller = this.get('controller');
-    controller.get('stepConfigs').clear();
-    controller.loadCompareVersionConfigs(controller.get('allConfigs')).done(function() {
-      controller.onLoadOverrides(controller.get('allConfigs'));
-    });
-  },
-  removeCompareVersionBar: function () {
-    var displayedVersion = this.get('displayedServiceVersion.version');
-    var versionIndex = 0;
-
-    this.set('compareServiceVersion', null);
-    this.get('serviceVersions').forEach(function (serviceVersion, index) {
-      if (serviceVersion.get('version') === displayedVersion) {
-        serviceVersion.set('isDisplayed', true);
-        versionIndex = index;
-      } else {
-        serviceVersion.set('isDisplayed', false);
-      }
-    });
-    this.set('isCompareMode', false);
-    this.shiftFlowOnSwitch(versionIndex);
-    this.get('controller').loadSelectedVersion(displayedVersion);
-  },
-  clearCompareVersionBar: function () {
-    if (this.get('controller.isCompareMode') === false) {
-      this.set('compareServiceVersion', null);
-    }
-  }.observes('controller.isCompareMode'),
-  /**
-   * revert config values to chosen version and apply reverted configs to server
-   */
-  revert: function (event) {
-    var self = this;
-    var serviceConfigVersion = event.contexts[0] || this.get('hoveredServiceVersion') || Em.Object.create({
-      version: this.get('displayedServiceVersion.version'),
-      serviceName: this.get('displayedServiceVersion.serviceName'),
-      notes:''
-    });
-    if (serviceConfigVersion.get('isReference')) {
-      serviceConfigVersion = this.get(serviceConfigVersion.get('property'));
-    }
-    var versionText = serviceConfigVersion.get('versionText');
-    return App.ModalPopup.show({
-      header: Em.I18n.t('dashboard.configHistory.info-bar.makeCurrent.popup.title'),
-      serviceConfigNote: Em.I18n.t('services.service.config.configHistory.makeCurrent.message').format(versionText),
-      bodyClass: Em.View.extend({
-        templateName: require('templates/common/configs/save_configuration'),
-        classNames: ['col-md-12'],
-        notesArea: Em.TextArea.extend({
-          classNames: ['full-width'],
-          value: Em.I18n.t('services.service.config.configHistory.makeCurrent.message').format(versionText),
-          onChangeValue: function() {
-            this.get('parentView.parentView').set('serviceConfigNote', this.get('value'));
-          }.observes('value')
-        })
-      }),
-      primary: Em.I18n.t('dashboard.configHistory.info-bar.revert.button'),
-      secondary: Em.I18n.t('common.discard'),
-      third: Em.I18n.t('common.cancel'),
-      onPrimary: function () {
-        serviceConfigVersion.set('serviceConfigNote', this.get('serviceConfigNote'));
-        self.sendRevertCall(serviceConfigVersion);
-        this.hide();
-      },
-      onSecondary: function () {
-        // force <code>serviceVersions</code> recalculating
-        self.propertyDidChange('controller.selectedConfigGroup.name');
-        this._super();
-      },
-      onThird: function () {
-        this.onSecondary();
-      }
-    });
-  },
-
-  /**
-   * send PUT call to revert config to selected version
-   * @param serviceConfigVersion
-   */
-  sendRevertCall: function (serviceConfigVersion) {
-    App.ajax.send({
-      name: 'service.serviceConfigVersion.revert',
-      sender: this,
-      data: {
-        data: {
-          "Clusters": {
-            "desired_service_config_versions": {
-              "service_config_version": serviceConfigVersion.get('version'),
-              "service_name": serviceConfigVersion.get('serviceName'),
-              "service_config_version_note": serviceConfigVersion.get('serviceConfigNote')
-            }
-          }
-        }
-      },
-      success: 'sendRevertCallSuccess'
-    });
-  },
-
-  sendRevertCallSuccess: function (data, opt, params) {
-    // revert to an old version would generate a new version with latest version number,
-    // so, need to loadStep to update
-    App.router.get('updateController').updateComponentConfig(Em.K);
-    this.get('controller').loadStep();
-  },
-
-  /**
-   * save configuration
-   * @return {object}
-   */
-  save: function () {
-    var self = this;
-    var passwordWasChanged = this.get('controller.passwordConfigsAreChanged');
-    return App.ModalPopup.show({
-      header: Em.I18n.t('dashboard.configHistory.info-bar.save.popup.title'),
-      serviceConfigNote: '',
-      bodyClass: Em.View.extend({
-        templateName: require('templates/common/configs/save_configuration'),
-        classNames: ['col-md-12'],
-        showPasswordChangeWarning: passwordWasChanged,
-        notesArea: Em.TextArea.extend({
-          classNames: ['full-width'],
-          value: passwordWasChanged ? Em.I18n.t('dashboard.configHistory.info-bar.save.popup.notesForPasswordChange') : '',
-          placeholder: Em.I18n.t('dashboard.configHistory.info-bar.save.popup.placeholder'),
-          didInsertElement: function () {
-            if (this.get('value')) {
-              this.onChangeValue();
-            }
-          },
-          onChangeValue: function() {
-            this.get('parentView.parentView').set('serviceConfigNote', this.get('value'));
-          }.observes('value')
-        })
-      }),
-      footerClass: Em.View.extend({
-        templateName: require('templates/main/service/info/save_popup_footer')
-      }),
-      primary: Em.I18n.t('common.save'),
-      secondary: Em.I18n.t('common.cancel'),
-      onSave: function () {
-        var newVersionToBeCreated = App.ServiceConfigVersion.find().filterProperty('serviceName', self.get('serviceName')).get('length') + 1;
-        self.get('controller').setProperties({
-          saveConfigsFlag: true,
-          serviceConfigVersionNote: this.get('serviceConfigNote'),
-          preSelectedConfigVersion: Em.Object.create({
-            version: newVersionToBeCreated,
-            serviceName: self.get('displayedServiceVersion.serviceName'),
-            groupName: self.get('controller.selectedConfigGroup.name')
-          })
-        });
-        self.get('controller').saveStepConfigs();
-        this.hide();
-      },
-      onDiscard: function () {
-        this.hide();
-        self.set('controller.preSelectedConfigVersion', null);
-        self.get('controller').loadStep();
-      },
-      onCancel: function () {
-        this.hide();
-      }
-    });
-  },
-  /**
-   * move back to the later service version
-   */
-  shiftBack: function () {
-    if (!this.get('showLeftArrow')) return;
-    this.decrementProperty('startIndex');
-    this.adjustFlowView();
-  },
-  /**
-   * move forward to the previous service version
-   */
-  shiftForward: function () {
-    if (!this.get('showRightArrow')) return;
-    this.incrementProperty('startIndex');
-    this.adjustFlowView();
-  },
-  /**
-   * shift flow view to position where selected version is visible
-   * @param versionIndex
-   */
-  shiftFlowOnSwitch: function (versionIndex) {
-    var serviceVersions = this.get('serviceVersions');
-
-    if ((this.get('startIndex') + this.VERSIONS_IN_FLOW) < versionIndex || versionIndex < this.get('startIndex')) {
-      versionIndex = (serviceVersions.length < (versionIndex + this.VERSIONS_IN_FLOW)) ? serviceVersions.length - this.VERSIONS_IN_FLOW : versionIndex;
-      this.set('startIndex', versionIndex);
-      this.adjustFlowView();
-    }
-  }
-});
-
-App.ConfigsServiceVersionBoxView = Em.View.extend({
-
-  /**
-   * bound from template
-   */
-  serviceVersion: null,
-
-  actionTypesBinding: 'parentView.actionTypes',
-
-  disabledActionAttr: Em.computed.alias('serviceVersion.disabledActionAttr'),
-
-  disabledActionMessages: Em.computed.alias('serviceVersion.disabledActionMessages'),
-
-  templateName: require('templates/common/configs/service_version_box'),
-
-  didInsertElement: function () {
-    this._super();
-    this.$('.version-box').hoverIntent(function() {
-      $(this).find('.version-popover').delay(700).fadeIn(200).end();
-    }, function() {
-      $(this).find('.version-popover').stop().fadeOut(200).end();
-    });
-    App.tooltip(this.$('[data-toggle=tooltip]'), {
-      placement: 'bottom'
-    });
-    App.tooltip(this.$('[data-toggle=arrow-tooltip]'), {
-      placement: 'top'
-    });
-  },
-
-  willDestroyElement: function() {
-    this.$('.version-box').off();
-    this.$('[data-toggle=tooltip]').tooltip('destroy');
-    this.$('[data-toggle=arrow-tooltip]').tooltip('destroy');
-  }
-});
-
-App.ConfigHistoryDropdownRowView = Em.View.extend({
-
-  templateName: require('templates/common/configs/config_history_dropdown_row'),
-
-  tagName: "li",
-
-  classNameBindings: [':pointer', ':dropdown-submenu', 'isDisplayed:not-allowed'],
-
-  serviceVersion: null,
-
-  isDisplayed: function() {
-    var serviceVersion = this.get('serviceVersion');
-    if(serviceVersion) {
-      return serviceVersion.get('isDisplayed');
-    }
-    return false;
-  }.property('serviceVersion'),
-
-  actionTypesBinding: 'parentView.actionTypes',
-
-  doAction: function(event) {
-    this.get('parentView').doAction(event);
-  },
-
-  eventManager: Ember.Object.create({
-    mouseEnter: function(event, view) {
-      var serviceVersion = view.get('serviceVersion');
-      var version = serviceVersion.get('version');
-      var $el = $('#config_version_popup');
-      var $currentTarget = $(event.currentTarget);
-      var parentView = view.get('parentView');
-      parentView.set('hoveredServiceVersion', null);
-      if (!serviceVersion.get("isDisplayed"))  {
-        parentView.set('hoveredServiceVersion', serviceVersion);
-        parentView.set('isHovered', true);
-        var elHeight = $el.outerHeight(),
-          pagePosition = window.innerHeight + window.pageYOffset,
-          elBottomPosition = $currentTarget[0].getBoundingClientRect().top + elHeight,
-          shouldShowUp = elBottomPosition > pagePosition;
-        $el.css({
-          "position": "fixed",
-          "top": $currentTarget[0].getBoundingClientRect().top,
-          "left": $currentTarget[0].getBoundingClientRect().left + 400,
-          "margin-top": -(elHeight/3),
-          "display": "block"
-        });
-        if (shouldShowUp) {
-          $el.css('margin-top', -(elHeight - $currentTarget.outerHeight()));
-        }
-      }
-      $el = null;
-    },
-    mouseLeave: function(event, view) {
-      var parentView = view.get('parentView');
-      parentView.set('isHovered', false);
-      Em.run.later(function() {
-        if(!parentView.get('displaySubMenuFlag') && !parentView.get('isHovered')) {
-          $('#config_version_popup').removeAttr('style');
-        }
-      }, 200);
-    }
-  })
-});
-
-App.ConfigHistoryDropdownSubMenuView = Em.View.extend({
-
-  tagName: 'ul',
-
-  classNameBindings: [':dropdown-menu', ':version-info-operations'],
-
-  eventManager: Ember.Object.create({
-    mouseEnter: function(event, view) {
-      view.get('parentView').set('displaySubMenuFlag', true);
-    },
-    mouseLeave: function(event, view) {
-      var parentView = view.get('parentView');
-      parentView.set('displaySubMenuFlag', false);
-      $("#config_version_popup").removeAttr('style');
-    }
-  })
-});

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/views/common/configs/config_versions_control_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/configs/config_versions_control_view.js b/ambari-web/app/views/common/configs/config_versions_control_view.js
new file mode 100644
index 0000000..d5f8807
--- /dev/null
+++ b/ambari-web/app/views/common/configs/config_versions_control_view.js
@@ -0,0 +1,235 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+App.ConfigVersionsControlView = Em.View.extend({
+  templateName: require('templates/common/configs/config_versions_control'),
+
+  serviceName: Em.computed.alias('controller.content.serviceName'),
+
+  /**
+   * @type {?App.ServiceConfigVersion}
+   */
+  compareServiceVersion: null,
+
+  displayedServiceVersion: Em.computed.findBy('serviceVersions', 'isDisplayed', true),
+
+  isCompareMode: Em.computed.notEqual('compareServiceVersion', null),
+
+  allServiceVersions: function() {
+    return App.ServiceConfigVersion.find().filterProperty('serviceName', this.get('serviceName'));
+  }.property('serviceName'),
+
+  serviceVersions: function () {
+    const isDefaultGroupSelected = this.get('controller.selectedConfigGroup.isDefault');
+    const groupId = this.get('controller.selectedConfigGroup.id');
+
+    this.get('allServiceVersions').forEach(function (version) {
+      version.set('isDisabled', !(version.get('groupId') === groupId || isDefaultGroupSelected && version.get('groupName') === App.ServiceConfigGroup.defaultGroupName));
+    }, this);
+
+    const serviceVersions = this.get('allServiceVersions').filter(function(s) {
+      return s.get('groupId') === groupId || s.get('groupName') === App.ServiceConfigGroup.defaultGroupName;
+    });
+
+    if (!serviceVersions.findProperty('isDisplayed')) {
+      //recompute serviceVersions if displayed version absent
+      Em.run.next(() => this.propertyDidChange('controller.selectedConfigGroup.name'));
+    }
+
+    return serviceVersions.sort(function (a, b) {
+      return Em.get(b, 'createTime') - Em.get(a, 'createTime');
+    });
+  }.property('serviceName', 'controller.selectedConfigGroup.name'),
+
+  primaryServiceVersionsInCompare: function() {
+    return this.get('serviceVersions').filter((sv) => sv.get('version') !== this.get('compareServiceVersion.version'));
+  }.property('serviceVersions', 'compareServiceVersion'),
+
+  secondaryServiceVersionsInCompare: function() {
+    if (this.get('compareServiceVersion')) {
+      return this.get('serviceVersions')
+        .filter((serviceVersion) => !serviceVersion.get('isDisplayed'))
+        .map((serviceVersion) => {
+        const copy = Em.Object.create({
+          version: serviceVersion.get('version'),
+          stackVersion: serviceVersion.get('stackVersion'),
+          authorFormatted: serviceVersion.get('authorFormatted'),
+          createdDate: serviceVersion.get('createdDate'),
+          fullNotes: serviceVersion.get('fullNotes'),
+          isCurrent: serviceVersion.get('isCurrent'),
+        });
+        copy.set('isDisplayed', serviceVersion.get('version') === this.get('compareServiceVersion.version'));
+        return copy;
+      });
+    } else {
+      return [];
+    }
+  }.property('serviceVersions', 'compareServiceVersion'),
+
+  willInsertElement: function () {
+    this.setDisplayVersion();
+  },
+
+  setDisplayVersion: function () {
+    const serviceVersions = this.get('serviceVersions');
+    const selectedVersion = this.get('controller.selectedVersion');
+    serviceVersions.forEach(function (serviceVersion) {
+      serviceVersion.set('isDisplayed', selectedVersion === serviceVersion.get('version'));
+    });
+    this.set('controller.displayedVersion', this.get('serviceVersions').findProperty('isDisplayed'));
+  },
+
+  onChangeConfigGroup: function () {
+    const serviceVersions = this.get('serviceVersions');
+    const selectedGroupName = this.get('controller.selectedConfigGroup.name');
+    const preselectedVersion = this.get('controller.selectedVersion');
+
+    serviceVersions.forEach(function (serviceVersion) {
+      const isSelected = serviceVersion.get('version') === preselectedVersion && serviceVersion.get('groupName') === selectedGroupName;
+      serviceVersion.set('isDisplayed', isSelected);
+    });
+
+    if (!serviceVersions.someProperty('isDisplayed')) {
+      serviceVersions.forEach(function (serviceVersion) {
+        if (serviceVersion.get('isCurrent') && serviceVersion.get('groupName') === selectedGroupName) {
+          serviceVersion.set('isDisplayed', true);
+        }
+      });
+    }
+  }.observes('controller.selectedConfigGroup'),
+
+  /**
+   * switch configs view version to chosen
+   */
+  switchVersion: function (event) {
+    const version = event.contexts[0];
+    if (this.get('serviceVersions').filterProperty('isDisplayed').someProperty('version', version)) {
+      return;
+    }
+
+    this.get('serviceVersions').forEach(function (serviceVersion) {
+      serviceVersion.set('isDisplayed', serviceVersion.get('version') === version);
+    });
+    this.get('controller').loadSelectedVersion(version);
+    this.set('controller.displayedVersion', this.get('serviceVersions').findProperty('isDisplayed'));
+  },
+
+  switchPrimaryInCompare: function(event) {
+    this.switchVersion({contexts: [event.contexts[0].get('version')]});
+    this.set('controller.compareServiceVersion', this.get('compareServiceVersion'));
+  },
+
+  /**
+   * add config values of chosen version to view for comparison
+   * add a second version-info-bar for the chosen version
+   */
+  compare: function (event) {
+    const serviceConfigVersion = event.contexts[0];
+    this.set('controller.compareServiceVersion', serviceConfigVersion);
+    this.set('compareServiceVersion', serviceConfigVersion);
+
+    const controller = this.get('controller');
+    controller.get('stepConfigs').clear();
+    controller.loadCompareVersionConfigs(controller.get('allConfigs')).done(function() {
+      controller.onLoadOverrides(controller.get('allConfigs'));
+    });
+  },
+
+  removeCompareVersionBar: function () {
+    const displayedVersion = this.get('displayedServiceVersion.version');
+
+    this.set('compareServiceVersion', null);
+    this.set('controller.compareServiceVersion', null);
+    this.get('serviceVersions').forEach(function (serviceVersion) {
+      serviceVersion.set('isDisplayed', serviceVersion.get('version') === displayedVersion);
+    });
+    this.get('controller').loadSelectedVersion(displayedVersion);
+  },
+
+  /**
+   * revert config values to chosen version and apply reverted configs to server
+   */
+  makeCurrent: function (event) {
+    const self = this;
+    const serviceConfigVersion = event.contexts[0];
+    const versionText = serviceConfigVersion.get('versionText');
+    return App.ModalPopup.show({
+      header: Em.I18n.t('dashboard.configHistory.info-bar.makeCurrent.popup.title'),
+      serviceConfigNote: Em.I18n.t('services.service.config.configHistory.makeCurrent.message').format(versionText),
+      bodyClass: Em.View.extend({
+        templateName: require('templates/common/configs/save_configuration'),
+        classNames: ['col-md-12'],
+        notesArea: Em.TextArea.extend({
+          classNames: ['full-width'],
+          value: Em.I18n.t('services.service.config.configHistory.makeCurrent.message').format(versionText),
+          onChangeValue: function() {
+            this.get('parentView.parentView').set('serviceConfigNote', this.get('value'));
+          }.observes('value')
+        })
+      }),
+      primary: Em.I18n.t('dashboard.configHistory.info-bar.revert.button'),
+      secondary: Em.I18n.t('common.discard'),
+      third: Em.I18n.t('common.cancel'),
+      onPrimary: function () {
+        serviceConfigVersion.set('serviceConfigNote', this.get('serviceConfigNote'));
+        self.sendRevertCall(serviceConfigVersion);
+        this.hide();
+      },
+      onSecondary: function () {
+        // force <code>serviceVersions</code> recalculating
+        self.propertyDidChange('controller.selectedConfigGroup.name');
+        this._super();
+      },
+      onThird: function () {
+        this.onSecondary();
+      }
+    });
+  },
+
+  /**
+   * send PUT call to revert config to selected version
+   * @param serviceConfigVersion
+   */
+  sendRevertCall: function (serviceConfigVersion) {
+    App.ajax.send({
+      name: 'service.serviceConfigVersion.revert',
+      sender: this,
+      data: {
+        data: {
+          "Clusters": {
+            "desired_service_config_versions": {
+              "service_config_version": serviceConfigVersion.get('version'),
+              "service_name": serviceConfigVersion.get('serviceName'),
+              "service_config_version_note": serviceConfigVersion.get('serviceConfigNote')
+            }
+          }
+        }
+      },
+      success: 'sendRevertCallSuccess'
+    });
+  },
+
+  sendRevertCallSuccess: function (data, opt, params) {
+    // revert to an old version would generate a new version with latest version number,
+    // so, need to loadStep to update
+    App.router.get('updateController').updateComponentConfig(Em.K);
+    this.get('controller').loadStep();
+  }
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/views/common/configs/config_versions_dropdown_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/configs/config_versions_dropdown_view.js b/ambari-web/app/views/common/configs/config_versions_dropdown_view.js
new file mode 100644
index 0000000..8e5cb76
--- /dev/null
+++ b/ambari-web/app/views/common/configs/config_versions_dropdown_view.js
@@ -0,0 +1,52 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+
+App.ConfigVersionsDropdownView = Em.View.extend({
+  templateName: require('templates/common/configs/config_versions_dropdown'),
+  classNames: ['btn-group'],
+
+  searchLabel: Em.I18n.t('common.search'),
+
+  /**
+   * if true then it's secondary dropdown in Compare Mode
+   * @type {boolean}
+   */
+  isSecondary: false,
+  serviceVersions: [],
+  filterValue: '',
+  isCompareMode: false,
+  displayedServiceVersion: Em.computed.findBy('serviceVersions', 'isDisplayed', true),
+
+  mainClickAction: function (event) {
+    if (this.get('isSecondary')) {
+      this.get('parentView').compare(event);
+    } else {
+      this.get('parentView').switchPrimaryInCompare(event);
+    }
+  },
+
+  filteredServiceVersions: function() {
+    return this.get('serviceVersions').filter((serviceVersion) => {
+      if (!this.get('filterValue').trim()) return true;
+      const searchString = Em.I18n.t('common.version') + ' ' + serviceVersion.get('version') + ' ' + serviceVersion.get('notes');
+      return searchString.indexOf(this.get('filterValue').trim()) !== -1;
+    });
+  }.property('serviceVersions.length', 'filterValue')
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/app/views/common/configs/service_config_view.js
----------------------------------------------------------------------
diff --git a/ambari-web/app/views/common/configs/service_config_view.js b/ambari-web/app/views/common/configs/service_config_view.js
index fe45c79..50f7418 100644
--- a/ambari-web/app/views/common/configs/service_config_view.js
+++ b/ambari-web/app/views/common/configs/service_config_view.js
@@ -24,6 +24,10 @@ App.ServiceConfigView = Em.View.extend({
 
   isRestartMessageCollapsed: false,
 
+  isDiscardDisabled: Em.computed.or('!controller.versionLoaded', '!controller.isPropertiesChanged'),
+
+  isSaveDisabled: Em.computed.or('controller.isSubmitDisabled', '!controller.versionLoaded', '!controller.isPropertiesChanged'),
+
   /**
    * Bound from parent view in the template
    * @type {string}
@@ -58,6 +62,10 @@ App.ServiceConfigView = Em.View.extend({
     }
   }.property('controller.name', 'controller.selectedService'),
 
+  showSavePanel: function() {
+    return this.get('isOnTheServicePage') && !this.get('controller.isCompareMode') && this.get('controller.displayedVersion.isCurrent');
+  }.property('isOnTheServicePage', 'controller.isCompareMode', 'controller.displayedVersion.isCurrent'),
+
   /**
    * Determines if user is on the service configs page
    * @type {boolean}
@@ -83,6 +91,64 @@ App.ServiceConfigView = Em.View.extend({
   }.observes('controller.selectedService.configs.@each.isHiddenByFilter'),
 
   /**
+   * save configuration
+   * @return {object}
+   */
+  save: function () {
+    var self = this;
+    var passwordWasChanged = this.get('controller.passwordConfigsAreChanged');
+    return App.ModalPopup.show({
+      header: Em.I18n.t('dashboard.configHistory.info-bar.save.popup.title'),
+      serviceConfigNote: '',
+      bodyClass: Em.View.extend({
+        templateName: require('templates/common/configs/save_configuration'),
+        classNames: ['col-md-12'],
+        showPasswordChangeWarning: passwordWasChanged,
+        notesArea: Em.TextArea.extend({
+          classNames: ['full-width'],
+          value: passwordWasChanged ? Em.I18n.t('dashboard.configHistory.info-bar.save.popup.notesForPasswordChange') : '',
+          placeholder: Em.I18n.t('dashboard.configHistory.info-bar.save.popup.placeholder'),
+          didInsertElement: function () {
+            if (this.get('value')) {
+              this.onChangeValue();
+            }
+          },
+          onChangeValue: function() {
+            this.get('parentView.parentView').set('serviceConfigNote', this.get('value'));
+          }.observes('value')
+        })
+      }),
+      footerClass: Em.View.extend({
+        templateName: require('templates/main/service/info/save_popup_footer')
+      }),
+      primary: Em.I18n.t('common.save'),
+      secondary: Em.I18n.t('common.cancel'),
+      onSave: function () {
+        var newVersionToBeCreated = App.ServiceConfigVersion.find().filterProperty('serviceName', self.get('serviceName')).get('length') + 1;
+        self.get('controller').setProperties({
+          saveConfigsFlag: true,
+          serviceConfigVersionNote: this.get('serviceConfigNote'),
+          preSelectedConfigVersion: Em.Object.create({
+            version: newVersionToBeCreated,
+            serviceName: self.get('controller.content.serviceName'),
+            groupName: self.get('controller.selectedConfigGroup.name')
+          })
+        });
+        self.get('controller').saveStepConfigs();
+        this.hide();
+      },
+      onDiscard: function () {
+        this.hide();
+        self.set('controller.preSelectedConfigVersion', null);
+        self.get('controller').loadStep();
+      },
+      onCancel: function () {
+        this.hide();
+      }
+    });
+  },
+
+  /**
    * updates filter counters for advanced tab
    * @method updateFilterCounters
    */


[08/13] ambari git commit: AMBARI-22353. Remove properties.json And Switch To Adding Properties to ResourceProviders Dynamically (dlysnichenko)

Posted by rl...@apache.org.
AMBARI-22353. Remove properties.json And Switch To Adding Properties to ResourceProviders Dynamically (dlysnichenko)


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

Branch: refs/heads/branch-feature-AMBARI-20859
Commit: e77a31ab0aa7edbabba29ba8e4d40becf122deef
Parents: 24c64b4
Author: Lisnichenko Dmitro <dl...@hortonworks.com>
Authored: Mon Dec 4 18:20:26 2017 +0200
Committer: Lisnichenko Dmitro <dl...@hortonworks.com>
Committed: Mon Dec 4 18:21:17 2017 +0200

----------------------------------------------------------------------
 ...xternalServerAuthenticationProviderTest.java |   1 -
 .../controller/ResourceProviderFactory.java     |  17 +-
 .../AbstractAuthorizedResourceProvider.java     |  12 +-
 .../AbstractControllerResourceProvider.java     |  83 ++--
 .../internal/AbstractDRResourceProvider.java    |   9 +-
 .../internal/ActionResourceProvider.java        |  34 +-
 .../ActiveWidgetLayoutResourceProvider.java     |   2 +-
 .../AlertDefinitionResourceProvider.java        |   2 +-
 .../internal/AlertGroupResourceProvider.java    |   2 +-
 .../internal/AlertHistoryResourceProvider.java  |   2 +-
 .../internal/AlertNoticeResourceProvider.java   |   2 +-
 .../internal/AlertResourceProvider.java         |   2 +-
 .../internal/AlertTargetResourceProvider.java   |   2 +-
 .../AmbariPrivilegeResourceProvider.java        |  36 +-
 .../internal/BlueprintResourceProvider.java     |  37 +-
 .../internal/ClientConfigResourceProvider.java  |  31 +-
 ...usterKerberosDescriptorResourceProvider.java |   2 +-
 .../ClusterPrivilegeResourceProvider.java       |  31 +-
 .../internal/ClusterResourceProvider.java       |  23 +-
 .../ClusterStackVersionResourceProvider.java    |   2 +-
 .../internal/ConfigGroupResourceProvider.java   |  39 +-
 .../internal/ConfigurationResourceProvider.java |   2 +-
 .../internal/CredentialResourceProvider.java    |   2 +-
 .../internal/DefaultProviderModule.java         |  17 +-
 .../internal/ExtensionLinkResourceProvider.java |  33 +-
 .../internal/ExtensionResourceProvider.java     |  27 +-
 .../ExtensionVersionResourceProvider.java       |  32 +-
 .../internal/FeedResourceProvider.java          |  41 +-
 .../GroupPrivilegeResourceProvider.java         |  42 +-
 .../internal/GroupResourceProvider.java         |  32 +-
 .../HostComponentProcessResourceProvider.java   |  38 +-
 .../internal/HostComponentResourceProvider.java |  49 +-
 .../HostKerberosIdentityResourceProvider.java   |   2 +-
 .../internal/HostResourceProvider.java          |  51 +-
 .../HostStackVersionResourceProvider.java       |   2 +-
 .../internal/InstanceResourceProvider.java      |  35 +-
 .../internal/JobResourceProvider.java           |  57 ++-
 .../KerberosDescriptorResourceProvider.java     |  20 +-
 .../internal/LdapSyncEventResourceProvider.java |  47 +-
 .../internal/LoggingResourceProvider.java       |   9 +-
 .../internal/MemberResourceProvider.java        |  29 +-
 .../OperatingSystemResourceProvider.java        |   2 +-
 .../internal/PermissionResourceProvider.java    |  25 +-
 .../internal/PrivilegeResourceProvider.java     |   2 +-
 .../QuickLinkArtifactResourceProvider.java      |   2 +-
 .../internal/ReadOnlyResourceProvider.java      |   7 -
 .../RecommendationResourceProvider.java         |  65 ++-
 .../internal/RemoteClusterResourceProvider.java |  28 +-
 .../internal/RequestResourceProvider.java       |  25 +-
 .../RequestScheduleResourceProvider.java        |  55 ++-
 .../RoleAuthorizationResourceProvider.java      |   2 +-
 ...eComponentConfigurationResourceProvider.java |   2 +-
 .../RootServiceComponentResourceProvider.java   |  31 +-
 ...ootServiceHostComponentResourceProvider.java |  34 +-
 .../internal/RootServiceResourceProvider.java   |  26 +-
 .../ServiceConfigVersionResourceProvider.java   |   2 +-
 .../internal/SettingResourceProvider.java       |   2 +-
 .../internal/StackAdvisorResourceProvider.java  |   7 +-
 .../internal/StackArtifactResourceProvider.java |   2 +-
 ...ConfigurationDependencyResourceProvider.java |  40 +-
 .../StackConfigurationResourceProvider.java     |  42 +-
 .../StackDependencyResourceProvider.java        |  41 +-
 ...StackLevelConfigurationResourceProvider.java |  40 +-
 .../internal/StackResourceProvider.java         |  28 +-
 .../StackServiceComponentResourceProvider.java  |  52 +-
 .../internal/StackServiceResourceProvider.java  |  45 +-
 .../internal/StackVersionResourceProvider.java  |  39 +-
 .../internal/StageResourceProvider.java         |   2 +-
 .../internal/TargetClusterResourceProvider.java |  31 +-
 .../internal/TaskAttemptResourceProvider.java   |  53 +-
 .../internal/TaskResourceProvider.java          |  27 +-
 .../internal/ThemeArtifactResourceProvider.java |   2 +-
 .../internal/UpgradeGroupResourceProvider.java  |   2 +-
 .../internal/UpgradeItemResourceProvider.java   |   2 +-
 .../internal/UpgradeResourceProvider.java       |   2 +-
 .../UpgradeSummaryResourceProvider.java         |   2 +-
 .../UserAuthorizationResourceProvider.java      |   2 +-
 .../internal/UserPrivilegeResourceProvider.java |  40 +-
 .../internal/UserResourceProvider.java          |  33 +-
 .../internal/ValidationResourceProvider.java    |  86 +++-
 .../VersionDefinitionResourceProvider.java      |   2 +-
 .../internal/ViewInstanceResourceProvider.java  |  55 +--
 .../ViewPermissionResourceProvider.java         |  29 +-
 .../internal/ViewPrivilegeResourceProvider.java |  36 +-
 .../internal/ViewResourceProvider.java          |  19 +-
 .../internal/ViewURLResourceProvider.java       |  25 +-
 .../internal/ViewVersionResourceProvider.java   |  45 +-
 .../internal/WidgetLayoutResourceProvider.java  |   2 +-
 .../internal/WidgetResourceProvider.java        |   2 +-
 .../internal/WorkflowResourceProvider.java      |  54 +-
 .../controller/utilities/PropertyHelper.java    |   6 +-
 .../system/impl/AmbariMetricSinkImpl.java       |   2 -
 .../src/main/resources/key_properties.json      | 161 ------
 .../src/main/resources/properties.json          | 487 -------------------
 .../api/query/render/MinimalRendererTest.java   |   6 +
 .../AbstractControllerResourceProviderTest.java |  10 +-
 .../AbstractDRResourceProviderTest.java         |   2 -
 .../internal/AbstractResourceProviderTest.java  |  26 +-
 .../internal/ActionResourceProviderTest.java    |   4 -
 .../ActiveWidgetLayoutResourceProviderTest.java |   2 -
 .../internal/BlueprintResourceProviderTest.java |  21 +-
 .../ClientConfigResourceProviderTest.java       |  10 -
 .../internal/ClusterControllerImplTest.java     |  14 +-
 ...rKerberosDescriptorResourceProviderTest.java |  17 -
 .../internal/ClusterResourceProviderTest.java   |  14 -
 ...ClusterStackVersionResourceProviderTest.java |  12 +-
 .../ConfigGroupResourceProviderTest.java        |   2 -
 .../ConfigurationResourceProviderTest.java      |   6 -
 .../CredentialResourceProviderTest.java         |  23 -
 .../internal/ExtensionResourceProviderTest.java |   2 -
 .../internal/FeedResourceProviderTest.java      |  29 +-
 .../internal/GroupResourceProviderTest.java     |   8 -
 ...ostComponentProcessResourceProviderTest.java |   2 -
 .../HostComponentResourceProviderTest.java      |  49 +-
 .../internal/HostResourceProviderTest.java      |  53 +-
 .../HostStackVersionResourceProviderTest.java   |  14 +-
 .../internal/InstanceResourceProviderTest.java  |  29 +-
 .../internal/JMXHostProviderTest.java           |   5 +-
 .../internal/JobResourceProviderTest.java       |  37 +-
 .../KerberosDescriptorResourceProviderTest.java |   6 +-
 .../internal/MemberResourceProviderTest.java    |  25 +-
 .../internal/RequestResourceProviderTest.java   |  42 +-
 .../RequestScheduleResourceProviderTest.java    |   2 -
 ...ootServiceComponentResourceProviderTest.java |   2 -
 ...erviceHostComponentResourceProviderTest.java |   2 -
 .../RootServiceResourceProviderTest.java        |   2 -
 .../StackAdvisorResourceProviderTest.java       |  12 +-
 .../StackArtifactResourceProviderTest.java      |   2 -
 ...igurationDependencyResourceProviderTest.java |   2 -
 .../StackConfigurationResourceProviderTest.java |   4 -
 .../StackDependencyResourceProviderTest.java    |   5 +-
 ...kLevelConfigurationResourceProviderTest.java |   4 -
 .../internal/StackResourceProviderTest.java     |   2 -
 .../StackServiceResourceProviderTest.java       |   4 -
 .../TargetClusterResourceProviderTest.java      |  28 +-
 .../TaskAttemptResourceProviderTest.java        |   2 +-
 .../internal/TaskResourceProviderTest.java      |  22 +-
 .../internal/TestIvoryProviderModule.java       |   6 +-
 .../internal/UpgradeResourceProviderTest.java   |   4 +-
 .../internal/UserResourceProviderDBTest.java    |   2 +-
 .../internal/UserResourceProviderTest.java      |   2 -
 .../ValidationResourceProviderTest.java         |   3 +-
 .../internal/WorkflowResourceProviderTest.java  |  30 +-
 143 files changed, 1480 insertions(+), 1925 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-logsearch/ambari-logsearch-server/src/test/java/org/apache/ambari/logsearch/web/security/LogsearchExternalServerAuthenticationProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-logsearch/ambari-logsearch-server/src/test/java/org/apache/ambari/logsearch/web/security/LogsearchExternalServerAuthenticationProviderTest.java b/ambari-logsearch/ambari-logsearch-server/src/test/java/org/apache/ambari/logsearch/web/security/LogsearchExternalServerAuthenticationProviderTest.java
index b6464c2..7ec598d 100644
--- a/ambari-logsearch/ambari-logsearch-server/src/test/java/org/apache/ambari/logsearch/web/security/LogsearchExternalServerAuthenticationProviderTest.java
+++ b/ambari-logsearch/ambari-logsearch-server/src/test/java/org/apache/ambari/logsearch/web/security/LogsearchExternalServerAuthenticationProviderTest.java
@@ -18,7 +18,6 @@
  */
 package org.apache.ambari.logsearch.web.security;
 
-import com.google.common.collect.Lists;
 import org.apache.ambari.logsearch.common.ExternalServerClient;
 import org.apache.ambari.logsearch.conf.AuthPropsConfig;
 import org.junit.Before;

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
index f6ca16b..5b4967d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ResourceProviderFactory.java
@@ -19,28 +19,21 @@
 
 package org.apache.ambari.server.controller;
 
-import java.util.Map;
-import java.util.Set;
-
 import javax.inject.Named;
 
 import org.apache.ambari.server.controller.internal.AlertTargetResourceProvider;
 import org.apache.ambari.server.controller.internal.ClusterStackVersionResourceProvider;
 import org.apache.ambari.server.controller.internal.UpgradeResourceProvider;
 import org.apache.ambari.server.controller.internal.ViewInstanceResourceProvider;
-import org.apache.ambari.server.controller.spi.Resource;
-import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
 
 
 public interface ResourceProviderFactory {
   @Named("host")
-  ResourceProvider getHostResourceProvider(Set<String> propertyIds, Map<Type, String> keyPropertyIds,
-                                           AmbariManagementController managementController);
+  ResourceProvider getHostResourceProvider(AmbariManagementController managementController);
 
   @Named("hostComponent")
-  ResourceProvider getHostComponentResourceProvider(Set<String> propertyIds, Map<Type, String> keyPropertyIds,
-                                                    AmbariManagementController managementController);
+  ResourceProvider getHostComponentResourceProvider(AmbariManagementController managementController);
 
   @Named("service")
   ResourceProvider getServiceResourceProvider(AmbariManagementController managementController);
@@ -49,8 +42,7 @@ public interface ResourceProviderFactory {
   ResourceProvider getComponentResourceProvider(AmbariManagementController managementController);
 
   @Named("member")
-  ResourceProvider getMemberResourceProvider(Set<String> propertyIds, Map<Type, String> keyPropertyIds,
-                                             AmbariManagementController managementController);
+  ResourceProvider getMemberResourceProvider(AmbariManagementController managementController);
 
   @Named("hostKerberosIdentity")
   ResourceProvider getHostKerberosIdentityResourceProvider(AmbariManagementController managementController);
@@ -62,8 +54,7 @@ public interface ResourceProviderFactory {
   ResourceProvider getRepositoryVersionResourceProvider();
 
   @Named("kerberosDescriptor")
-  ResourceProvider getKerberosDescriptorResourceProvider(AmbariManagementController managementController, Set<String> propertyIds,
-                                                         Map<Resource.Type, String> keyPropertyIds);
+  ResourceProvider getKerberosDescriptorResourceProvider(AmbariManagementController managementController);
 
   @Named("upgrade")
   UpgradeResourceProvider getUpgradeResourceProvider(AmbariManagementController managementController);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractAuthorizedResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractAuthorizedResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractAuthorizedResourceProvider.java
index a24c639..8d92dd1 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractAuthorizedResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractAuthorizedResourceProvider.java
@@ -82,16 +82,6 @@ public abstract class AbstractAuthorizedResourceProvider extends AbstractResourc
   private Set<RoleAuthorization> requiredDeleteAuthorizations = Collections.emptySet();
 
   /**
-   * Constructor
-   *
-   * @param propertyIds    the property ids
-   * @param keyPropertyIds the key property ids
-   */
-  protected AbstractAuthorizedResourceProvider(Set<String> propertyIds, Map<Resource.Type, String> keyPropertyIds) {
-    super(propertyIds, keyPropertyIds);
-  }
-
-  /**
    * Create a new resource provider. This constructor will initialize the
    * specified {@link Resource.Type} with the provided keys. It should be used
    * in cases where the provider declares its own keys instead of reading them
@@ -106,7 +96,7 @@ public abstract class AbstractAuthorizedResourceProvider extends AbstractResourc
    */
   AbstractAuthorizedResourceProvider(Resource.Type type, Set<String> propertyIds,
       Map<Resource.Type, String> keyPropertyIds) {
-    this(propertyIds, keyPropertyIds);
+    super(propertyIds, keyPropertyIds);
     PropertyHelper.setPropertyIds(type, propertyIds);
     PropertyHelper.setKeyPropertyIds(type, keyPropertyIds);
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
index cc2548c..f5e61ef 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractControllerResourceProvider.java
@@ -27,7 +27,6 @@ import org.apache.ambari.server.controller.ResourceProviderFactory;
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.utilities.ClusterControllerHelper;
-import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.state.Cluster;
 
 /**
@@ -45,20 +44,6 @@ public abstract class AbstractControllerResourceProvider extends AbstractAuthori
   // ----- Constructors ------------------------------------------------------
 
   /**
-   * Create a  new resource provider for the given management controller.
-   *
-   * @param propertyIds          the property ids
-   * @param keyPropertyIds       the key property ids
-   * @param managementController the management controller
-   */
-  protected AbstractControllerResourceProvider(Set<String> propertyIds,
-                                               Map<Resource.Type, String> keyPropertyIds,
-                                               AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds);
-    this.managementController = managementController;
-  }
-
-  /**
    * Create a new resource provider for the given management controller. This
    * constructor will initialize the specified {@link Resource.Type} with the
    * provided keys. It should be used in cases where the provider declares its
@@ -75,9 +60,8 @@ public abstract class AbstractControllerResourceProvider extends AbstractAuthori
    */
   AbstractControllerResourceProvider(Resource.Type type, Set<String> propertyIds,
       Map<Resource.Type, String> keyPropertyIds, AmbariManagementController managementController) {
-    this(propertyIds, keyPropertyIds, managementController);
-    PropertyHelper.setPropertyIds(type, propertyIds);
-    PropertyHelper.setKeyPropertyIds(type, keyPropertyIds);
+    super(type, propertyIds, keyPropertyIds);
+    this.managementController = managementController;
   }
 
   public static void init(ResourceProviderFactory factory) {
@@ -139,14 +123,11 @@ public abstract class AbstractControllerResourceProvider extends AbstractAuthori
    * Factory method for obtaining a resource provider based on a given type and management controller.
    *
    * @param type                  the resource type
-   * @param propertyIds           the property ids
    * @param managementController  the management controller
    *
    * @return a new resource provider
    */
   public static ResourceProvider getResourceProvider(Resource.Type type,
-                                                     Set<String> propertyIds,
-                                                     Map<Resource.Type, String> keyPropertyIds,
                                                      AmbariManagementController managementController) {
 
     switch (type.getInternalType()) {
@@ -157,75 +138,75 @@ public abstract class AbstractControllerResourceProvider extends AbstractAuthori
       case Component:
         return resourceProviderFactory.getComponentResourceProvider(managementController);
       case Host:
-        return resourceProviderFactory.getHostResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return resourceProviderFactory.getHostResourceProvider(managementController);
       case HostComponent:
-        return resourceProviderFactory.getHostComponentResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return resourceProviderFactory.getHostComponentResourceProvider(managementController);
       case Configuration:
         return new ConfigurationResourceProvider(managementController);
       case ServiceConfigVersion:
         return new ServiceConfigVersionResourceProvider(managementController);
       case Action:
-        return new ActionResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new ActionResourceProvider(managementController);
       case Request:
-        return new RequestResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new RequestResourceProvider(managementController);
       case Task:
-        return new TaskResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new TaskResourceProvider(managementController);
       case User:
-        return new UserResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new UserResourceProvider(managementController);
       case Group:
-        return new GroupResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new GroupResourceProvider(managementController);
       case Member:
-        return resourceProviderFactory.getMemberResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return resourceProviderFactory.getMemberResourceProvider(managementController);
       case Upgrade:
         return resourceProviderFactory.getUpgradeResourceProvider(managementController);
       case Stack:
-        return new StackResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new StackResourceProvider(managementController);
       case StackVersion:
-        return new StackVersionResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new StackVersionResourceProvider(managementController);
       case ClusterStackVersion:
         return resourceProviderFactory.getClusterStackVersionResourceProvider(managementController);
       case HostStackVersion:
         return new HostStackVersionResourceProvider(managementController);
       case StackService:
-        return new StackServiceResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new StackServiceResourceProvider(managementController);
       case StackServiceComponent:
-        return new StackServiceComponentResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new StackServiceComponentResourceProvider(managementController);
       case StackConfiguration:
-        return new StackConfigurationResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new StackConfigurationResourceProvider(managementController);
       case StackConfigurationDependency:
-        return new StackConfigurationDependencyResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new StackConfigurationDependencyResourceProvider(managementController);
       case StackLevelConfiguration:
-        return new StackLevelConfigurationResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new StackLevelConfigurationResourceProvider(managementController);
       case ExtensionLink:
-          return new ExtensionLinkResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new ExtensionLinkResourceProvider(managementController);
       case Extension:
-        return new ExtensionResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new ExtensionResourceProvider(managementController);
       case ExtensionVersion:
-        return new ExtensionVersionResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new ExtensionVersionResourceProvider(managementController);
       case RootService:
-        return new RootServiceResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new RootServiceResourceProvider(managementController);
       case RootServiceComponent:
-        return new RootServiceComponentResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new RootServiceComponentResourceProvider(managementController);
       case RootServiceComponentConfiguration:
         return resourceProviderFactory.getRootServiceHostComponentConfigurationResourceProvider();
       case RootServiceHostComponent:
-        return new RootServiceHostComponentResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new RootServiceHostComponentResourceProvider(managementController);
       case ConfigGroup:
-        return new ConfigGroupResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new ConfigGroupResourceProvider(managementController);
       case RequestSchedule:
-        return new RequestScheduleResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new RequestScheduleResourceProvider(managementController);
       case HostComponentProcess:
-        return new HostComponentProcessResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new HostComponentProcessResourceProvider(managementController);
       case Blueprint:
-        return new BlueprintResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new BlueprintResourceProvider(managementController);
       case KerberosDescriptor:
-        return resourceProviderFactory.getKerberosDescriptorResourceProvider(managementController, propertyIds, keyPropertyIds);
+        return resourceProviderFactory.getKerberosDescriptorResourceProvider(managementController);
       case Recommendation:
-        return new RecommendationResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new RecommendationResourceProvider(managementController);
       case Validation:
-        return new ValidationResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new ValidationResourceProvider(managementController);
       case ClientConfig:
-        return new ClientConfigResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new ClientConfigResourceProvider(managementController);
       case RepositoryVersion:
         return resourceProviderFactory.getRepositoryVersionResourceProvider();
       case CompatibleRepositoryVersion:
@@ -255,7 +236,7 @@ public abstract class AbstractControllerResourceProvider extends AbstractAuthori
       case ClusterKerberosDescriptor:
         return new ClusterKerberosDescriptorResourceProvider(managementController);
       case LoggingQuery:
-        return new LoggingResourceProvider(propertyIds, keyPropertyIds, managementController);
+        return new LoggingResourceProvider(managementController);
       case AlertTarget:
         return resourceProviderFactory.getAlertTargetResourceProvider();
       case ViewInstance:

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractDRResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractDRResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractDRResourceProvider.java
index 953a2a7..74fff00 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractDRResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AbstractDRResourceProvider.java
@@ -68,22 +68,19 @@ public abstract class AbstractDRResourceProvider extends AbstractResourceProvide
    * Factory method for obtaining a resource provider based on a given Ivory service instance.
    *
    * @param type         the resource type
-   * @param propertyIds  the property ids
    * @param service      the Ivory service
    *
    * @return a new resource provider
    */
   public static ResourceProvider getResourceProvider(Resource.Type type,
-                                                     Set<String> propertyIds,
-                                                     Map<Resource.Type, String> keyPropertyIds,
                                                      IvoryService service) {
     switch (type.getInternalType()) {
       case DRFeed:
-        return new FeedResourceProvider(service, propertyIds, keyPropertyIds);
+        return new FeedResourceProvider(service);
       case DRTargetCluster:
-        return new TargetClusterResourceProvider(service, propertyIds, keyPropertyIds);
+        return new TargetClusterResourceProvider(service);
       case DRInstance:
-        return new InstanceResourceProvider(service, propertyIds, keyPropertyIds);
+        return new InstanceResourceProvider(service);
       default:
         throw new IllegalArgumentException("Unknown type " + type);
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java
index 290931555..1adc55a 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActionResourceProvider.java
@@ -19,7 +19,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
@@ -46,6 +45,9 @@ import org.apache.ambari.server.customactions.ActionDefinition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 public class ActionResourceProvider extends AbstractControllerResourceProvider {
 
   private static final Logger LOG = LoggerFactory.getLogger(ActionResourceProvider.class);
@@ -66,13 +68,29 @@ public class ActionResourceProvider extends AbstractControllerResourceProvider {
       .getPropertyId("Actions", "target_type");
   public static final String DEFAULT_TIMEOUT_PROPERTY_ID = PropertyHelper
       .getPropertyId("Actions", "default_timeout");
-  private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{ACTION_NAME_PROPERTY_ID}));
 
-  public ActionResourceProvider(Set<String> propertyIds,
-                                Map<Type, String> keyPropertyIds,
-                                AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  /**
+   * The key property ids for a Action resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.Action, ACTION_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a Action resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      ACTION_NAME_PROPERTY_ID,
+      ACTION_TYPE_PROPERTY_ID,
+      INPUTS_PROPERTY_ID,
+      TARGET_SERVICE_PROPERTY_ID,
+      TARGET_COMPONENT_PROPERTY_ID,
+      DESCRIPTION_PROPERTY_ID,
+      TARGET_HOST_PROPERTY_ID,
+      DEFAULT_TIMEOUT_PROPERTY_ID);
+
+  public ActionResourceProvider(AmbariManagementController managementController) {
+    super(Type.Action, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override
@@ -168,7 +186,7 @@ public class ActionResourceProvider extends AbstractControllerResourceProvider {
 
   @Override
   public Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
   private ActionManager getActionManager() {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProvider.java
index 389f0b2..2b1c671 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ActiveWidgetLayoutResourceProvider.java
@@ -126,7 +126,7 @@ public class ActiveWidgetLayoutResourceProvider extends AbstractControllerResour
    *
    */
   public ActiveWidgetLayoutResourceProvider(AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+    super(Type.ActiveWidgetLayout, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertDefinitionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertDefinitionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertDefinitionResourceProvider.java
index 9579dca..c98cc9d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertDefinitionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertDefinitionResourceProvider.java
@@ -172,7 +172,7 @@ public class AlertDefinitionResourceProvider extends AbstractControllerResourceP
    * @param controller
    */
   AlertDefinitionResourceProvider(AmbariManagementController controller) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
+    super(Resource.Type.AlertDefinition, PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertGroupResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertGroupResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertGroupResourceProvider.java
index 0898bc3..e707496 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertGroupResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertGroupResourceProvider.java
@@ -118,7 +118,7 @@ public class AlertGroupResourceProvider extends
    * @param controller
    */
   AlertGroupResourceProvider(AmbariManagementController controller) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
+    super(Resource.Type.AlertGroup, PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertHistoryResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertHistoryResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertHistoryResourceProvider.java
index 8d716ea..759b5a8 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertHistoryResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertHistoryResourceProvider.java
@@ -118,7 +118,7 @@ public class AlertHistoryResourceProvider extends ReadOnlyResourceProvider imple
    * Constructor.
    */
   AlertHistoryResourceProvider(AmbariManagementController controller) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
+    super(Resource.Type.AlertHistory, PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertNoticeResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertNoticeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertNoticeResourceProvider.java
index 8ffd596..dae1f1e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertNoticeResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertNoticeResourceProvider.java
@@ -105,7 +105,7 @@ public class AlertNoticeResourceProvider extends AbstractControllerResourceProvi
    * Constructor.
    */
   AlertNoticeResourceProvider(AmbariManagementController managementController) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
+    super(Resource.Type.AlertNotice, PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertResourceProvider.java
index 4ab78b7..0f0c7b2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertResourceProvider.java
@@ -145,7 +145,7 @@ public class AlertResourceProvider extends ReadOnlyResourceProvider implements
    * @param controller
    */
   AlertResourceProvider(AmbariManagementController controller) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
+    super(Resource.Type.Alert, PROPERTY_IDS, KEY_PROPERTY_IDS, controller);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java
index c1e9eb4..4f1690c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AlertTargetResourceProvider.java
@@ -130,7 +130,7 @@ public class AlertTargetResourceProvider extends
    */
   @Inject
   AlertTargetResourceProvider() {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS);
+    super(Resource.Type.AlertTarget, PROPERTY_IDS, KEY_PROPERTY_IDS);
 
     EnumSet<RoleAuthorization> requiredAuthorizations = EnumSet.of(RoleAuthorization.CLUSTER_MANAGE_ALERT_NOTIFICATIONS);
     setRequiredCreateAuthorizations(requiredAuthorizations);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProvider.java
index 0ffceca..49b0d91 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/AmbariPrivilegeResourceProvider.java
@@ -24,7 +24,6 @@ import static org.apache.ambari.server.controller.internal.ViewPrivilegeResource
 
 import java.util.EnumSet;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -45,6 +44,9 @@ import org.apache.ambari.server.security.authorization.ResourceType;
 import org.apache.ambari.server.security.authorization.RoleAuthorization;
 import org.apache.ambari.server.view.ViewRegistry;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * Resource provider for Ambari privileges.
  */
@@ -60,28 +62,24 @@ public class AmbariPrivilegeResourceProvider extends PrivilegeResourceProvider<O
   /**
    * The property ids for an Ambari privilege resource.
    */
-  private static Set<String> propertyIds = new HashSet<>();
-  static {
-    propertyIds.add(PRIVILEGE_ID_PROPERTY_ID);
-    propertyIds.add(PERMISSION_NAME_PROPERTY_ID);
-    propertyIds.add(PERMISSION_LABEL_PROPERTY_ID);
-    propertyIds.add(PRINCIPAL_NAME_PROPERTY_ID);
-    propertyIds.add(PRINCIPAL_TYPE_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_VIEW_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_VIEW_VERSION_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_INSTANCE_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_CLUSTER_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_TYPE_PROPERTY_ID);
-
-  }
+  private static Set<String> propertyIds = Sets.newHashSet(
+      PRIVILEGE_ID_PROPERTY_ID,
+      PERMISSION_NAME_PROPERTY_ID,
+      PERMISSION_LABEL_PROPERTY_ID,
+      PRINCIPAL_NAME_PROPERTY_ID,
+      PRINCIPAL_TYPE_PROPERTY_ID,
+      PRIVILEGE_VIEW_NAME_PROPERTY_ID,
+      PRIVILEGE_VIEW_VERSION_PROPERTY_ID,
+      PRIVILEGE_INSTANCE_NAME_PROPERTY_ID,
+      PRIVILEGE_CLUSTER_NAME_PROPERTY_ID,
+      PRIVILEGE_TYPE_PROPERTY_ID);
 
   /**
    * The key property ids for a privilege resource.
    */
-  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<>();
-  static {
-    keyPropertyIds.put(Resource.Type.AmbariPrivilege, PRIVILEGE_ID_PROPERTY_ID);
-  }
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.AmbariPrivilege, PRIVILEGE_ID_PROPERTY_ID)
+      .build();
 
 
   // ----- Constructors ------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java
index 8f4d62e..c665aec 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/BlueprintResourceProvider.java
@@ -19,7 +19,6 @@
 package org.apache.ambari.server.controller.internal;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -66,6 +65,8 @@ import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 import com.google.gson.Gson;
 
 
@@ -119,10 +120,25 @@ public class BlueprintResourceProvider extends AbstractControllerResourceProvide
     "Configuration elements must be Maps";
   public static final String CONFIGURATION_MAP_SIZE_CHECK_ERROR_MESSAGE =
     "Configuration Maps must hold a single configuration type each";
-  // Primary Key Fields
-  private static Set<String> pkPropertyIds =
-    new HashSet<>(Arrays.asList(new String[]{
-      BLUEPRINT_NAME_PROPERTY_ID}));
+
+  /**
+   * The key property ids for a Blueprint resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Blueprint, BLUEPRINT_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a Blueprint resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      BLUEPRINT_NAME_PROPERTY_ID,
+      STACK_NAME_PROPERTY_ID,
+      STACK_VERSION_PROPERTY_ID,
+      BLUEPRINT_SECURITY_PROPERTY_ID,
+      HOST_GROUP_PROPERTY_ID,
+      CONFIGURATION_PROPERTY_ID,
+      SETTING_PROPERTY_ID);
 
   /**
    * Used to create Blueprint instances
@@ -149,15 +165,10 @@ public class BlueprintResourceProvider extends AbstractControllerResourceProvide
   /**
    * Create a  new resource provider for the given management controller.
    *
-   * @param propertyIds     the property ids
-   * @param keyPropertyIds  the key property ids
    * @param controller      management controller
    */
-  BlueprintResourceProvider(Set<String> propertyIds,
-                            Map<Resource.Type, String> keyPropertyIds,
-                            AmbariManagementController controller) {
-
-    super(propertyIds, keyPropertyIds, controller);
+  BlueprintResourceProvider(AmbariManagementController controller) {
+    super(Resource.Type.Blueprint, propertyIds, keyPropertyIds, controller);
   }
 
   /**
@@ -180,7 +191,7 @@ public class BlueprintResourceProvider extends AbstractControllerResourceProvide
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
index f0ede5d..75f47ca 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClientConfigResourceProvider.java
@@ -103,6 +103,8 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 import com.google.gson.Gson;
 import com.google.inject.assistedinject.Assisted;
 import com.google.inject.assistedinject.AssistedInject;
@@ -123,11 +125,24 @@ public class ClientConfigResourceProvider extends AbstractControllerResourceProv
 
   private final Gson gson;
 
-  private static Set<String> pkPropertyIds =
-    new HashSet<>(Arrays.asList(new String[]{
+  /**
+   * The key property ids for a ClientConfig resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Cluster, COMPONENT_CLUSTER_NAME_PROPERTY_ID)
+      .put(Resource.Type.Service, COMPONENT_SERVICE_NAME_PROPERTY_ID)
+      .put(Resource.Type.Component, COMPONENT_COMPONENT_NAME_PROPERTY_ID)
+      .put(Resource.Type.Host, HOST_COMPONENT_HOST_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a ClientConfig resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
       COMPONENT_CLUSTER_NAME_PROPERTY_ID,
       COMPONENT_SERVICE_NAME_PROPERTY_ID,
-      COMPONENT_COMPONENT_NAME_PROPERTY_ID}));
+      COMPONENT_COMPONENT_NAME_PROPERTY_ID,
+      HOST_COMPONENT_HOST_NAME_PROPERTY_ID);
 
   private MaintenanceStateHelper maintenanceStateHelper;
   private static final Logger LOG = LoggerFactory.getLogger(ClientConfigResourceProvider.class);
@@ -137,15 +152,11 @@ public class ClientConfigResourceProvider extends AbstractControllerResourceProv
   /**
    * Create a  new resource provider for the given management controller.
    *
-   * @param propertyIds          the property ids
-   * @param keyPropertyIds       the key property ids
    * @param managementController the management controller
    */
   @AssistedInject
-  ClientConfigResourceProvider(@Assisted Set<String> propertyIds,
-                               @Assisted Map<Resource.Type, String> keyPropertyIds,
-                               @Assisted AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  ClientConfigResourceProvider(@Assisted AmbariManagementController managementController) {
+    super(Resource.Type.ClientConfig, propertyIds, keyPropertyIds, managementController);
     gson = new Gson();
   }
 
@@ -890,7 +901,7 @@ public class ClientConfigResourceProvider extends AbstractControllerResourceProv
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterKerberosDescriptorResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterKerberosDescriptorResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterKerberosDescriptorResourceProvider.java
index 2678d55..9dad423 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterKerberosDescriptorResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterKerberosDescriptorResourceProvider.java
@@ -111,7 +111,7 @@ public class ClusterKerberosDescriptorResourceProvider extends ReadOnlyResourceP
    * Create a new resource provider.
    */
   public ClusterKerberosDescriptorResourceProvider(AmbariManagementController managementController) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
+    super(Type.ClusterKerberosDescriptor, PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProvider.java
index 60cf783..a21de15 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterPrivilegeResourceProvider.java
@@ -20,7 +20,6 @@ package org.apache.ambari.server.controller.internal;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -38,6 +37,9 @@ import org.apache.ambari.server.orm.entities.ResourceEntity;
 import org.apache.ambari.server.orm.entities.UserEntity;
 import org.apache.ambari.server.security.authorization.RoleAuthorization;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * Resource provider for cluster privileges.
  */
@@ -56,25 +58,22 @@ public class ClusterPrivilegeResourceProvider extends PrivilegeResourceProvider<
   /**
    * The property ids for a privilege resource.
    */
-  private static Set<String> propertyIds = new HashSet<>();
-  static {
-    propertyIds.add(PRIVILEGE_CLUSTER_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_ID_PROPERTY_ID);
-    propertyIds.add(PERMISSION_NAME_PROPERTY_ID);
-    propertyIds.add(PERMISSION_NAME_PROPERTY_ID);
-    propertyIds.add(PERMISSION_LABEL_PROPERTY_ID);
-    propertyIds.add(PRINCIPAL_NAME_PROPERTY_ID);
-    propertyIds.add(PRINCIPAL_TYPE_PROPERTY_ID);
-  }
+  private static Set<String> propertyIds = Sets.newHashSet(
+      PRIVILEGE_CLUSTER_NAME_PROPERTY_ID,
+      PRIVILEGE_ID_PROPERTY_ID,
+      PERMISSION_NAME_PROPERTY_ID,
+      PERMISSION_NAME_PROPERTY_ID,
+      PERMISSION_LABEL_PROPERTY_ID,
+      PRINCIPAL_NAME_PROPERTY_ID,
+      PRINCIPAL_TYPE_PROPERTY_ID);
 
   /**
    * The key property ids for a privilege resource.
    */
-  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<>();
-  static {
-    keyPropertyIds.put(Resource.Type.Cluster, PRIVILEGE_CLUSTER_NAME_PROPERTY_ID);
-    keyPropertyIds.put(Resource.Type.ClusterPrivilege, PRIVILEGE_ID_PROPERTY_ID);
-  }
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Cluster, PRIVILEGE_CLUSTER_NAME_PROPERTY_ID)
+      .put(Resource.Type.ClusterPrivilege, PRIVILEGE_ID_PROPERTY_ID)
+      .build();
 
   // ----- Constructors ------------------------------------------------------
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
index b9b3b56..16f04e4 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterResourceProvider.java
@@ -17,7 +17,6 @@
  */
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
@@ -60,6 +59,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.security.core.Authentication;
 
+import com.google.common.collect.ImmutableMap;
 import com.google.gson.Gson;
 
 
@@ -96,6 +96,7 @@ public class ClusterResourceProvider extends AbstractControllerResourceProvider
   public static final String CLUSTER_TOTAL_HOSTS_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + TOTAL_HOSTS;
   public static final String CLUSTER_HEALTH_REPORT_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + HEALTH_REPORT;
   public static final String CLUSTER_CREDENTIAL_STORE_PROPERTIES_PROPERTY_ID = RESPONSE_KEY + PropertyHelper.EXTERNAL_PATH_SEP + CREDENTIAL_STORE_PROPERTIES;
+  public static final String CLUSTER_STATE_PROPERTY_ID = PropertyHelper.getPropertyId("Clusters","state");
 
   static final String BLUEPRINT = "blueprint";
   private static final String SECURITY = "security";
@@ -129,23 +130,16 @@ public class ClusterResourceProvider extends AbstractControllerResourceProvider
   private static SecurityConfigurationFactory securityConfigurationFactory;
 
   /**
-   * The cluster primary key properties.
-   */
-  private static Set<String> pkPropertyIds =
-    new HashSet<>(Arrays.asList(new String[]{CLUSTER_ID_PROPERTY_ID}));
-
-  /**
    * The key property ids for a cluster resource.
    */
-  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<>();
-  static {
-    keyPropertyIds.put(Resource.Type.Cluster, CLUSTER_NAME_PROPERTY_ID);
-  }
+  protected static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Cluster, CLUSTER_NAME_PROPERTY_ID)
+      .build();
 
   /**
    * The property ids for a cluster resource.
    */
-  private static Set<String> propertyIds = new HashSet<>();
+  protected static Set<String> propertyIds = new HashSet<>();
 
   /**
    * Used to serialize to/from json.
@@ -169,6 +163,7 @@ public class ClusterResourceProvider extends AbstractControllerResourceProvider
     propertyIds.add(SECURITY);
     propertyIds.add(CREDENTIALS);
     propertyIds.add(QUICKLINKS_PROFILE);
+    propertyIds.add(CLUSTER_STATE_PROPERTY_ID);
   }
 
 
@@ -180,7 +175,7 @@ public class ClusterResourceProvider extends AbstractControllerResourceProvider
    * @param managementController  the management controller
    */
   ClusterResourceProvider(AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+    super(Resource.Type.Cluster, propertyIds, keyPropertyIds, managementController);
 
     setRequiredCreateAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_ADD_DELETE_CLUSTERS));
     setRequiredDeleteAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_ADD_DELETE_CLUSTERS));
@@ -192,7 +187,7 @@ public class ClusterResourceProvider extends AbstractControllerResourceProvider
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(Collections.singletonList(CLUSTER_ID_PROPERTY_ID));
   }
 
   /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
index 1c36c96..fa13116 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ClusterStackVersionResourceProvider.java
@@ -219,7 +219,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
   @Inject
   public ClusterStackVersionResourceProvider(
           AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+    super(Type.ClusterStackVersion, propertyIds, keyPropertyIds, managementController);
 
     setRequiredCreateAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_MANAGE_STACK_VERSIONS, RoleAuthorization.CLUSTER_UPGRADE_DOWNGRADE_STACK));
     setRequiredDeleteAuthorizations(EnumSet.of(RoleAuthorization.AMBARI_MANAGE_STACK_VERSIONS, RoleAuthorization.CLUSTER_UPGRADE_DOWNGRADE_STACK));

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java
index 737bfa4..33430a5 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigGroupResourceProvider.java
@@ -18,7 +18,6 @@
 package org.apache.ambari.server.controller.internal;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashMap;
@@ -67,6 +66,8 @@ import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 
 @StaticallyInject
@@ -102,8 +103,30 @@ public class ConfigGroupResourceProvider extends
   public static final String CONFIGGROUP_VERSION_TAGS_PROPERTY_ID =
     PropertyHelper.getPropertyId("ConfigGroup", "version_tags");
 
-  private static Set<String> pkPropertyIds = new HashSet<>(Arrays
-    .asList(new String[]{CONFIGGROUP_ID_PROPERTY_ID}));
+  /**
+   * The key property ids for a ConfigGroup resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Cluster, CONFIGGROUP_CLUSTER_NAME_PROPERTY_ID)
+      .put(Resource.Type.ConfigGroup, CONFIGGROUP_ID_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a ConfigGroup resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      CONFIGGROUP_CLUSTER_NAME_PROPERTY_ID,
+      CONFIGGROUP_ID_PROPERTY_ID,
+      CONFIGGROUP_NAME_PROPERTY_ID,
+      CONFIGGROUP_TAG_PROPERTY_ID,
+      CONFIGGROUP_SERVICENAME_PROPERTY_ID,
+      CONFIGGROUP_DESC_PROPERTY_ID,
+      CONFIGGROUP_SCV_NOTE_ID,
+      CONFIGGROUP_HOSTNAME_PROPERTY_ID,
+      CONFIGGROUP_HOSTS_HOSTNAME_PROPERTY_ID,
+      CONFIGGROUP_HOSTS_PROPERTY_ID,
+      CONFIGGROUP_CONFIGS_PROPERTY_ID,
+      CONFIGGROUP_VERSION_TAGS_PROPERTY_ID);
 
   @Inject
   private static HostDAO hostDAO;
@@ -117,14 +140,10 @@ public class ConfigGroupResourceProvider extends
   /**
    * Create a  new resource provider for the given management controller.
    *
-   * @param propertyIds          the property ids
-   * @param keyPropertyIds       the key property ids
    * @param managementController the management controller
    */
-  protected ConfigGroupResourceProvider(Set<String> propertyIds,
-       Map<Resource.Type, String> keyPropertyIds,
-       AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  protected ConfigGroupResourceProvider(AmbariManagementController managementController) {
+    super(Resource.Type.ConfigGroup, propertyIds, keyPropertyIds, managementController);
 
     EnumSet<RoleAuthorization> manageGroupsAuthSet =
         EnumSet.of(RoleAuthorization.SERVICE_MANAGE_CONFIG_GROUPS, RoleAuthorization.CLUSTER_MANAGE_CONFIG_GROUPS);
@@ -141,7 +160,7 @@ public class ConfigGroupResourceProvider extends
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProvider.java
index 0f26085..1ac7563 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ConfigurationResourceProvider.java
@@ -103,7 +103,7 @@ public class ConfigurationResourceProvider extends
    * @param managementController  the associated management controller
    */
   ConfigurationResourceProvider(AmbariManagementController managementController) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
+    super(Resource.Type.Configuration, PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
 
     // creating configs requires authorizations based on the type of changes being performed, therefore
     // checks need to be performed inline.

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CredentialResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CredentialResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CredentialResourceProvider.java
index ebc7645..9e6fe3d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CredentialResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/CredentialResourceProvider.java
@@ -105,7 +105,7 @@ public class CredentialResourceProvider extends AbstractControllerResourceProvid
    */
   @AssistedInject
   public CredentialResourceProvider(@Assisted AmbariManagementController managementController) {
-    super(PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
+    super(Type.Credential, PROPERTY_IDS, KEY_PROPERTY_IDS, managementController);
 
     EnumSet<RoleAuthorization> authorizations = EnumSet.of(
         RoleAuthorization.CLUSTER_MANAGE_CREDENTIALS,

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
index c3758b3..9f92cdd 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/DefaultProviderModule.java
@@ -18,12 +18,8 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Map;
-import java.util.Set;
-
 import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
-import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -50,16 +46,14 @@ public class DefaultProviderModule extends AbstractProviderModule {
   protected ResourceProvider createResourceProvider(Resource.Type type) {
 
     LOGGER.debug("Creating resource provider for the type: {}", type);
-    Set<String> propertyIds = PropertyHelper.getPropertyIds(type);
-    Map<Resource.Type, String> keyPropertyIds = PropertyHelper.getKeyPropertyIds(type);
 
     switch (type.getInternalType()) {
       case Workflow:
-        return new WorkflowResourceProvider(propertyIds, keyPropertyIds);
+        return new WorkflowResourceProvider();
       case Job:
-        return new JobResourceProvider(propertyIds, keyPropertyIds);
+        return new JobResourceProvider();
       case TaskAttempt:
-        return new TaskAttemptResourceProvider(propertyIds, keyPropertyIds);
+        return new TaskAttemptResourceProvider();
       case View:
         return new ViewResourceProvider();
       case ViewVersion:
@@ -67,7 +61,7 @@ public class DefaultProviderModule extends AbstractProviderModule {
       case ViewURL:
         return new ViewURLResourceProvider();
       case StackServiceComponentDependency:
-        return new StackDependencyResourceProvider(propertyIds, keyPropertyIds);
+        return new StackDependencyResourceProvider();
       case Permission:
         return new PermissionResourceProvider();
       case AmbariPrivilege:
@@ -118,8 +112,7 @@ public class DefaultProviderModule extends AbstractProviderModule {
         return new RemoteClusterResourceProvider();
       default:
         LOGGER.debug("Delegating creation of resource provider for: {} to the AbstractControllerResourceProvider", type.getInternalType());
-        return AbstractControllerResourceProvider.getResourceProvider(type, propertyIds,
-          keyPropertyIds, managementController);
+        return AbstractControllerResourceProvider.getResourceProvider(type, managementController);
     }
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExtensionLinkResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExtensionLinkResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExtensionLinkResourceProvider.java
index db904bf..1a4ffc2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExtensionLinkResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExtensionLinkResourceProvider.java
@@ -18,7 +18,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
@@ -43,6 +42,8 @@ import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.orm.dao.ExtensionLinkDAO;
 import org.apache.ambari.server.orm.entities.ExtensionLinkEntity;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 
 /**
@@ -68,16 +69,32 @@ public class ExtensionLinkResourceProvider extends AbstractControllerResourcePro
   public static final String EXTENSION_VERSION_PROPERTY_ID = PropertyHelper
       .getPropertyId("ExtensionLink", "extension_version");
 
-  private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{LINK_ID_PROPERTY_ID, STACK_NAME_PROPERTY_ID, STACK_VERSION_PROPERTY_ID, EXTENSION_NAME_PROPERTY_ID, EXTENSION_VERSION_PROPERTY_ID}));
+  /**
+   * The key property ids for a ExtensionLink resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.ExtensionLink, LINK_ID_PROPERTY_ID)
+      .put(Type.Stack, STACK_NAME_PROPERTY_ID)
+      .put(Type.StackVersion, STACK_VERSION_PROPERTY_ID)
+      .put(Type.Extension, EXTENSION_NAME_PROPERTY_ID)
+      .put(Type.ExtensionVersion, EXTENSION_VERSION_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a ExtensionLink resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      LINK_ID_PROPERTY_ID,
+      STACK_NAME_PROPERTY_ID,
+      STACK_VERSION_PROPERTY_ID,
+      EXTENSION_NAME_PROPERTY_ID,
+      EXTENSION_VERSION_PROPERTY_ID);
 
   @Inject
   private static ExtensionLinkDAO dao;
 
-  protected ExtensionLinkResourceProvider(Set<String> propertyIds,
-      Map<Type, String> keyPropertyIds,
-      AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  protected ExtensionLinkResourceProvider(AmbariManagementController managementController) {
+    super(Type.ExtensionLink, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override
@@ -259,6 +276,6 @@ public class ExtensionLinkResourceProvider extends AbstractControllerResourcePro
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExtensionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExtensionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExtensionResourceProvider.java
index 53e44e1..9ec4bab 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExtensionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExtensionResourceProvider.java
@@ -18,7 +18,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
@@ -40,6 +39,9 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * An extension version is like a stack version but it contains custom services.  Linking an extension
  * version to the current stack version allows the cluster to install the custom services contained in
@@ -50,13 +52,22 @@ public class ExtensionResourceProvider extends ReadOnlyResourceProvider {
   public static final String EXTENSION_NAME_PROPERTY_ID = PropertyHelper
       .getPropertyId("Extensions", "extension_name");
 
-  private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{EXTENSION_NAME_PROPERTY_ID}));
 
-  protected ExtensionResourceProvider(Set<String> propertyIds,
-      Map<Type, String> keyPropertyIds,
-      AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  /**
+   * The key property ids for a Extension resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.Extension, EXTENSION_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a Extension resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      EXTENSION_NAME_PROPERTY_ID);
+
+  protected ExtensionResourceProvider(AmbariManagementController managementController) {
+    super(Type.Extension, propertyIds, keyPropertyIds, managementController);
   }
 
 
@@ -127,6 +138,6 @@ public class ExtensionResourceProvider extends ReadOnlyResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExtensionVersionResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExtensionVersionResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExtensionVersionResourceProvider.java
index 4aa357c..0371058 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExtensionVersionResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ExtensionVersionResourceProvider.java
@@ -19,7 +19,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Map;
@@ -40,6 +39,9 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * An extension version is like a stack version but it contains custom services.  Linking an extension
  * version to the current stack version allows the cluster to install the custom services contained in
@@ -54,13 +56,27 @@ public class ExtensionVersionResourceProvider extends ReadOnlyResourceProvider {
   public static final String EXTENSION_ERROR_SET      = PropertyHelper.getPropertyId("Versions", "extension-errors");
   public static final String EXTENSION_PARENT_PROPERTY_ID      = PropertyHelper.getPropertyId("Versions", "parent_extension_version");
 
-  private static Set<String> pkPropertyIds = new HashSet<>(
-    Arrays.asList(new String[]{EXTENSION_NAME_PROPERTY_ID, EXTENSION_VERSION_PROPERTY_ID}));
-
-  protected ExtensionVersionResourceProvider(Set<String> propertyIds,
-      Map<Type, String> keyPropertyIds,
+  /**
+   * The key property ids for a ExtensionVersion resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Type.Extension, EXTENSION_NAME_PROPERTY_ID)
+      .put(Type.ExtensionVersion, EXTENSION_VERSION_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a ExtensionVersion resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      EXTENSION_VERSION_PROPERTY_ID,
+      EXTENSION_NAME_PROPERTY_ID,
+      EXTENSION_VALID_PROPERTY_ID,
+      EXTENSION_ERROR_SET,
+      EXTENSION_PARENT_PROPERTY_ID);
+
+  protected ExtensionVersionResourceProvider(
       AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+    super(Type.ExtensionVersion, propertyIds, keyPropertyIds, managementController);
   }
 
   @Override
@@ -121,7 +137,7 @@ public class ExtensionVersionResourceProvider extends ReadOnlyResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/FeedResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/FeedResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/FeedResourceProvider.java
index f9d75fd..82c781b 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/FeedResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/FeedResourceProvider.java
@@ -18,7 +18,6 @@
 
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -39,6 +38,9 @@ import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * DR feed resource provider.
  */
@@ -62,20 +64,39 @@ public class FeedResourceProvider extends AbstractDRResourceProvider {
   protected static final String FEED_TARGET_CLUSTER_ACTION_PROPERTY_ID = PropertyHelper.getPropertyId("Feed/targetCluster/retention", "action");
   protected static final String FEED_PROPERTIES_PROPERTY_ID = PropertyHelper.getPropertyId("Feed", "properties");
 
-  private static Set<String> pkPropertyIds =
-    new HashSet<>(Arrays.asList(new String[]{
-      FEED_NAME_PROPERTY_ID}));
+  /**
+   * The key property ids for a Feed resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.DRFeed, FEED_NAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a Feed resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      FEED_NAME_PROPERTY_ID,
+      FEED_DESCRIPTION_PROPERTY_ID,
+      FEED_STATUS_PROPERTY_ID,
+      FEED_SCHEDULE_PROPERTY_ID,
+      FEED_SOURCE_CLUSTER_NAME_PROPERTY_ID,
+      FEED_SOURCE_CLUSTER_START_PROPERTY_ID,
+      FEED_SOURCE_CLUSTER_END_PROPERTY_ID,
+      FEED_SOURCE_CLUSTER_LIMIT_PROPERTY_ID,
+      FEED_SOURCE_CLUSTER_ACTION_PROPERTY_ID,
+      FEED_TARGET_CLUSTER_NAME_PROPERTY_ID,
+      FEED_TARGET_CLUSTER_START_PROPERTY_ID,
+      FEED_TARGET_CLUSTER_END_PROPERTY_ID,
+      FEED_TARGET_CLUSTER_LIMIT_PROPERTY_ID,
+      FEED_TARGET_CLUSTER_ACTION_PROPERTY_ID,
+      FEED_PROPERTIES_PROPERTY_ID);
 
   /**
    * Construct a provider.
    *
    * @param ivoryService    the ivory service
-   * @param propertyIds     the properties associated with this provider
-   * @param keyPropertyIds  the key property ids
    */
-  public FeedResourceProvider(IvoryService ivoryService,
-                              Set<String> propertyIds,
-                              Map<Resource.Type, String> keyPropertyIds) {
+  public FeedResourceProvider(IvoryService ivoryService) {
     super(propertyIds, keyPropertyIds, ivoryService);
   }
 
@@ -201,7 +222,7 @@ public class FeedResourceProvider extends AbstractDRResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/GroupPrivilegeResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/GroupPrivilegeResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/GroupPrivilegeResourceProvider.java
index f9f838f..18f3d0c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/GroupPrivilegeResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/GroupPrivilegeResourceProvider.java
@@ -19,7 +19,6 @@ package org.apache.ambari.server.controller.internal;
 
 import java.util.Collection;
 import java.util.EnumSet;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
@@ -49,6 +48,8 @@ import org.apache.ambari.server.security.authorization.ResourceType;
 import org.apache.ambari.server.security.authorization.RoleAuthorization;
 import org.apache.ambari.server.security.authorization.Users;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
 import com.google.inject.Inject;
 
 /**
@@ -96,21 +97,18 @@ public class GroupPrivilegeResourceProvider extends ReadOnlyResourceProvider {
   /**
    * The property ids for a privilege resource.
    */
-  private static Set<String> propertyIds = new HashSet<>();
-
-  static {
-    propertyIds.add(PRIVILEGE_PRIVILEGE_ID_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_PERMISSION_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_PERMISSION_LABEL_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_PRINCIPAL_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_PRINCIPAL_TYPE_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_VIEW_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_VIEW_VERSION_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_INSTANCE_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_CLUSTER_NAME_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_TYPE_PROPERTY_ID);
-    propertyIds.add(PRIVILEGE_GROUP_NAME_PROPERTY_ID);
-  }
+  private static Set<String> propertyIds = Sets.newHashSet(
+      PRIVILEGE_PRIVILEGE_ID_PROPERTY_ID,
+      PRIVILEGE_PERMISSION_NAME_PROPERTY_ID,
+      PRIVILEGE_PERMISSION_LABEL_PROPERTY_ID,
+      PRIVILEGE_PRINCIPAL_NAME_PROPERTY_ID,
+      PRIVILEGE_PRINCIPAL_TYPE_PROPERTY_ID,
+      PRIVILEGE_VIEW_NAME_PROPERTY_ID,
+      PRIVILEGE_VIEW_VERSION_PROPERTY_ID,
+      PRIVILEGE_INSTANCE_NAME_PROPERTY_ID,
+      PRIVILEGE_CLUSTER_NAME_PROPERTY_ID,
+      PRIVILEGE_TYPE_PROPERTY_ID,
+      PRIVILEGE_GROUP_NAME_PROPERTY_ID);
 
   /**
    * Static initialization.
@@ -137,19 +135,17 @@ public class GroupPrivilegeResourceProvider extends ReadOnlyResourceProvider {
   /**
    * The key property ids for a privilege resource.
    */
-  private static Map<Resource.Type, String> keyPropertyIds = new HashMap<>();
-
-  static {
-    keyPropertyIds.put(Resource.Type.Group, PRIVILEGE_GROUP_NAME_PROPERTY_ID);
-    keyPropertyIds.put(Resource.Type.GroupPrivilege, PRIVILEGE_PRIVILEGE_ID_PROPERTY_ID);
-  }
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Group, PRIVILEGE_GROUP_NAME_PROPERTY_ID)
+      .put(Resource.Type.GroupPrivilege, PRIVILEGE_PRIVILEGE_ID_PROPERTY_ID)
+      .build();
 
 
   /**
    * Constructor.
    */
   public GroupPrivilegeResourceProvider() {
-    super(propertyIds, keyPropertyIds, null);
+    super(Resource.Type.GroupPrivilege, propertyIds, keyPropertyIds, null);
 
     EnumSet<RoleAuthorization> requiredAuthorizations = EnumSet.of(RoleAuthorization.AMBARI_ASSIGN_ROLES);
     setRequiredCreateAuthorizations(requiredAuthorizations);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/GroupResourceProvider.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/GroupResourceProvider.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/GroupResourceProvider.java
index 6cdd24e..3da64ae 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/GroupResourceProvider.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/GroupResourceProvider.java
@@ -17,7 +17,6 @@
  */
 package org.apache.ambari.server.controller.internal;
 
-import java.util.Arrays;
 import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.Map;
@@ -41,6 +40,9 @@ import org.apache.ambari.server.security.authorization.RoleAuthorization;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
 /**
  * Resource provider for group resources.
  */
@@ -55,21 +57,29 @@ public class GroupResourceProvider extends AbstractControllerResourceProvider {
   public static final String GROUP_LDAP_GROUP_PROPERTY_ID = PropertyHelper.getPropertyId("Groups", "ldap_group");
   public static final String GROUP_GROUPTYPE_PROPERTY_ID  = PropertyHelper.getPropertyId("Groups", "group_type");
 
-  private static Set<String> pkPropertyIds =
-    new HashSet<>(Arrays.asList(new String[]{
-      GROUP_GROUPNAME_PROPERTY_ID}));
+
+  /**
+   * The key property ids for a Group resource.
+   */
+  private static Map<Resource.Type, String> keyPropertyIds = ImmutableMap.<Resource.Type, String>builder()
+      .put(Resource.Type.Group, GROUP_GROUPNAME_PROPERTY_ID)
+      .build();
+
+  /**
+   * The property ids for a Group resource.
+   */
+  private static Set<String> propertyIds = Sets.newHashSet(
+      GROUP_GROUPNAME_PROPERTY_ID,
+      GROUP_LDAP_GROUP_PROPERTY_ID,
+      GROUP_GROUPTYPE_PROPERTY_ID);
 
   /**
    * Create a new resource provider for the given management controller.
    *
-   * @param propertyIds           the property ids
-   * @param keyPropertyIds        the key property ids
    * @param managementController  the management controller
    */
-  GroupResourceProvider(Set<String> propertyIds,
-                       Map<Resource.Type, String> keyPropertyIds,
-                       AmbariManagementController managementController) {
-    super(propertyIds, keyPropertyIds, managementController);
+  GroupResourceProvider(AmbariManagementController managementController) {
+    super(Resource.Type.Group, propertyIds, keyPropertyIds, managementController);
 
     EnumSet<RoleAuthorization> manageUserAuthorizations = EnumSet.of(RoleAuthorization.AMBARI_MANAGE_USERS);
     setRequiredCreateAuthorizations(manageUserAuthorizations);
@@ -188,7 +198,7 @@ public class GroupResourceProvider extends AbstractControllerResourceProvider {
 
   @Override
   protected Set<String> getPKPropertyIds() {
-    return pkPropertyIds;
+    return new HashSet<>(keyPropertyIds.values());
   }
 
   private GroupRequest getRequest(Map<String, Object> properties) {


[04/13] ambari git commit: AMBARI-22353. Remove properties.json And Switch To Adding Properties to ResourceProviders Dynamically (dlysnichenko)

Posted by rl...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/InstanceResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/InstanceResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/InstanceResourceProviderTest.java
index ba67939..50b378c 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/InstanceResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/InstanceResourceProviderTest.java
@@ -61,9 +61,7 @@ public class InstanceResourceProviderTest {
 
     Request request = PropertyHelper.getCreateRequest(propertySet, Collections.emptyMap());
 
-    InstanceResourceProvider provider = new InstanceResourceProvider(service,
-        PropertyHelper.getPropertyIds(Resource.Type.DRInstance),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.DRInstance));
+    InstanceResourceProvider provider = new InstanceResourceProvider(service);
 
     try {
       provider.createResources(request);
@@ -106,9 +104,7 @@ public class InstanceResourceProviderTest {
 
     Request request = PropertyHelper.getCreateRequest(propertySet, Collections.emptyMap());
 
-    InstanceResourceProvider provider = new InstanceResourceProvider(service,
-        PropertyHelper.getPropertyIds(Resource.Type.DRInstance),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.DRInstance));
+    InstanceResourceProvider provider = new InstanceResourceProvider(service);
 
     Set<Resource> resources = provider.getResources(request, null);
 
@@ -147,9 +143,7 @@ public class InstanceResourceProviderTest {
 
     Request request = PropertyHelper.getCreateRequest(propertySet, Collections.emptyMap());
 
-    InstanceResourceProvider provider = new InstanceResourceProvider(service,
-        PropertyHelper.getPropertyIds(Resource.Type.DRInstance),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.DRInstance));
+    InstanceResourceProvider provider = new InstanceResourceProvider(service);
 
     provider.updateResources(request, null);
 
@@ -171,9 +165,7 @@ public class InstanceResourceProviderTest {
     // replay
     replay(service);
 
-    InstanceResourceProvider provider = new InstanceResourceProvider(service,
-        PropertyHelper.getPropertyIds(Resource.Type.DRInstance),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.DRInstance));
+    InstanceResourceProvider provider = new InstanceResourceProvider(service);
 
     Predicate predicate = new PredicateBuilder().property(InstanceResourceProvider.INSTANCE_ID_PROPERTY_ID).equals("Instance1").toPredicate();
 
@@ -182,17 +174,4 @@ public class InstanceResourceProviderTest {
     // verify
     verify(service);
   }
-
-  @Test
-  public void testGetKeyPropertyIds() throws Exception {
-    IvoryService service = createMock(IvoryService.class);
-
-    Map<Resource.Type, String> keyPropertyIds = PropertyHelper.getKeyPropertyIds(Resource.Type.DRInstance);
-
-    InstanceResourceProvider provider = new InstanceResourceProvider(service,
-        PropertyHelper.getPropertyIds(Resource.Type.DRInstance),
-        keyPropertyIds);
-
-    Assert.assertEquals(keyPropertyIds, provider.getKeyPropertyIds());
-  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java
index e19ad29..a1def85 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JMXHostProviderTest.java
@@ -44,7 +44,6 @@ import org.apache.ambari.server.controller.spi.ResourceAlreadyExistsException;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
-import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
 import org.apache.ambari.server.orm.OrmTestHelper;
@@ -667,9 +666,7 @@ public class JMXHostProviderTest {
         maintenanceStateHelper, repositoryVersionDAO);
 
     ResourceProvider hostCompResourceProvider = new
-      HostComponentResourceProvider(PropertyHelper.getPropertyIds(Resource
-      .Type.HostComponent), PropertyHelper.getKeyPropertyIds(Resource.Type
-      .HostComponent), controller, injector);
+      HostComponentResourceProvider(controller, injector);
 
     ResourceProvider configResourceProvider = new ConfigurationResourceProvider(
         controller);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JobResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JobResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JobResourceProviderTest.java
index 6fd1a23..f8590df 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JobResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/JobResourceProviderTest.java
@@ -25,7 +25,6 @@ import static org.easymock.EasyMock.verify;
 import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.util.HashSet;
-import java.util.Map;
 import java.util.Set;
 
 import org.apache.ambari.server.controller.internal.JobResourceProvider.JobFetcher;
@@ -35,7 +34,6 @@ import org.apache.ambari.server.controller.spi.NoSuchResourceException;
 import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.Resource;
-import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
@@ -57,18 +55,15 @@ public class JobResourceProviderTest {
     expected.add(createJobResponse("Cluster100", "workflow2", "job2"));
     expected.add(createJobResponse("Cluster100", "workflow2", "job3"));
 
-    Resource.Type type = Resource.Type.Job;
-    Set<String> propertyIds = PropertyHelper.getPropertyIds(type);
+
+    Set<String> propertyIds = JobResourceProvider.propertyIds;
 
     JobFetcher jobFetcher = createMock(JobFetcher.class);
     expect(jobFetcher.fetchJobDetails(propertyIds, null, "workflow2", null))
         .andReturn(expected).once();
     replay(jobFetcher);
 
-    Map<Resource.Type,String> keyPropertyIds = PropertyHelper
-        .getKeyPropertyIds(type);
-    ResourceProvider provider = new JobResourceProvider(propertyIds,
-        keyPropertyIds, jobFetcher);
+    ResourceProvider provider = new JobResourceProvider(jobFetcher);
 
     Request request = PropertyHelper.getReadRequest(propertyIds);
     Predicate predicate = new PredicateBuilder()
@@ -101,10 +96,7 @@ public class JobResourceProviderTest {
     Set<String> requestedIds = new HashSet<>();
     requestedIds.add(JobResourceProvider.JOB_ID_PROPERTY_ID);
 
-    Map<Resource.Type,String> keyPropertyIds = PropertyHelper
-        .getKeyPropertyIds(Resource.Type.Job);
-    ResourceProvider provider = new TestJobResourceProvider(requestedIds,
-        keyPropertyIds, 1);
+    ResourceProvider provider = new TestJobResourceProvider(1);
 
     Request request = PropertyHelper.getReadRequest(requestedIds);
     Predicate predicate = new PredicateBuilder()
@@ -128,10 +120,7 @@ public class JobResourceProviderTest {
     requestedIds.add(JobResourceProvider.JOB_ID_PROPERTY_ID);
     requestedIds.add(JobResourceProvider.JOB_SUBMIT_TIME_PROPERTY_ID);
 
-    Map<Resource.Type,String> keyPropertyIds = PropertyHelper
-        .getKeyPropertyIds(Resource.Type.Job);
-    ResourceProvider provider = new TestJobResourceProvider(requestedIds,
-        keyPropertyIds, 2);
+    ResourceProvider provider = new TestJobResourceProvider(2);
 
     Request request = PropertyHelper.getReadRequest(requestedIds);
     Predicate predicate = new PredicateBuilder()
@@ -157,10 +146,7 @@ public class JobResourceProviderTest {
     requestedIds.add(JobResourceProvider.JOB_ID_PROPERTY_ID);
     requestedIds.add(JobResourceProvider.JOB_ELAPSED_TIME_PROPERTY_ID);
 
-    Map<Resource.Type,String> keyPropertyIds = PropertyHelper
-        .getKeyPropertyIds(Resource.Type.Job);
-    ResourceProvider provider = new TestJobResourceProvider(requestedIds,
-        keyPropertyIds, 3);
+    ResourceProvider provider = new TestJobResourceProvider(3);
 
     Request request = PropertyHelper.getReadRequest(requestedIds);
     Predicate predicate = new PredicateBuilder()
@@ -187,10 +173,8 @@ public class JobResourceProviderTest {
     requestedIds.add(JobResourceProvider.JOB_SUBMIT_TIME_PROPERTY_ID);
     requestedIds.add(JobResourceProvider.JOB_ELAPSED_TIME_PROPERTY_ID);
 
-    Map<Resource.Type,String> keyPropertyIds = PropertyHelper
-        .getKeyPropertyIds(Resource.Type.Job);
-    ResourceProvider provider = new TestJobResourceProvider(requestedIds,
-        keyPropertyIds, 4);
+
+    ResourceProvider provider = new TestJobResourceProvider(4);
 
     Request request = PropertyHelper.getReadRequest(requestedIds);
     Predicate predicate = new PredicateBuilder()
@@ -220,9 +204,8 @@ public class JobResourceProviderTest {
   }
 
   private static class TestJobResourceProvider extends JobResourceProvider {
-    protected TestJobResourceProvider(Set<String> propertyIds,
-        Map<Type,String> keyPropertyIds, int type) {
-      super(propertyIds, keyPropertyIds);
+    protected TestJobResourceProvider(int type) {
+      super();
       this.jobFetcher = new TestJobFetcher(type);
     }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/KerberosDescriptorResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/KerberosDescriptorResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/KerberosDescriptorResourceProviderTest.java
index ca8127e..caea9f2 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/KerberosDescriptorResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/KerberosDescriptorResourceProviderTest.java
@@ -80,7 +80,7 @@ public class KerberosDescriptorResourceProviderTest {
     EasyMock.replay(request);
 
     kerberosDescriptorResourceProvider = new KerberosDescriptorResourceProvider(kerberosDescriptorDAO,
-        kerberosDescriptorFactory, Collections.emptySet(), Collections.emptyMap(), null);
+        kerberosDescriptorFactory, null);
 
     // WHEN
     kerberosDescriptorResourceProvider.createResources(request);
@@ -97,7 +97,7 @@ public class KerberosDescriptorResourceProviderTest {
     EasyMock.replay(request);
 
     kerberosDescriptorResourceProvider = new KerberosDescriptorResourceProvider(kerberosDescriptorDAO,
-        kerberosDescriptorFactory, Collections.emptySet(), Collections.emptyMap(), null);
+        kerberosDescriptorFactory, null);
 
     // WHEN
     kerberosDescriptorResourceProvider.createResources(request);
@@ -112,7 +112,7 @@ public class KerberosDescriptorResourceProviderTest {
 
     // GIVEN
     kerberosDescriptorResourceProvider = new KerberosDescriptorResourceProvider(kerberosDescriptorDAO,
-        kerberosDescriptorFactory, Collections.emptySet(), Collections.emptyMap(), null);
+        kerberosDescriptorFactory, null);
 
     EasyMock.expect(request.getProperties())
         .andReturn(requestPropertySet(KERBEROS_DESCRIPTORS_KERBEROS_DESCRIPTOR_NAME, TEST_KERBEROS_DESCRIPTOR_NAME))

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MemberResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MemberResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MemberResourceProviderTest.java
index 39ba4b9..ce9b50f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MemberResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/MemberResourceProviderTest.java
@@ -43,7 +43,6 @@ import org.apache.ambari.server.controller.utilities.PredicateBuilder;
 import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.security.TestAuthenticationFactory;
 import org.apache.ambari.server.security.authorization.AuthorizationException;
-import org.easymock.EasyMock;
 import org.junit.Before;
 import org.junit.Test;
 import org.springframework.security.core.Authentication;
@@ -78,8 +77,8 @@ public class MemberResourceProviderTest {
 
     AbstractControllerResourceProvider.init(resourceProviderFactory);
 
-    expect(resourceProviderFactory.getMemberResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(), eq(managementController)))
-        .andReturn(new MemberResourceProvider(PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type), managementController)).anyTimes();
+    expect(resourceProviderFactory.getMemberResourceProvider(eq(managementController)))
+        .andReturn(new MemberResourceProvider(managementController)).anyTimes();
 
     managementController.createMembers(AbstractResourceProviderTest.Matcher.getMemberRequestSet("engineering", "joe"));
     expectLastCall().atLeastOnce();
@@ -91,8 +90,6 @@ public class MemberResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     // add the property map to a set for the request.  add more maps for multiple creates
@@ -134,8 +131,8 @@ public class MemberResourceProviderTest {
 
     AbstractControllerResourceProvider.init(resourceProviderFactory);
 
-    expect(resourceProviderFactory.getMemberResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(), eq(managementController)))
-        .andReturn(new MemberResourceProvider(PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type), managementController)).anyTimes();
+    expect(resourceProviderFactory.getMemberResourceProvider(eq(managementController)))
+        .andReturn(new MemberResourceProvider(managementController)).anyTimes();
 
     expect(managementController.getMembers(AbstractResourceProviderTest.Matcher.getMemberRequestSet(null, null)))
         .andReturn(Collections.emptySet())
@@ -148,8 +145,6 @@ public class MemberResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     // create the request
@@ -183,8 +178,8 @@ public class MemberResourceProviderTest {
     AbstractControllerResourceProvider.init(resourceProviderFactory);
 
     // set expectations
-    expect(resourceProviderFactory.getMemberResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(), eq(managementController)))
-        .andReturn(new MemberResourceProvider(PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type), managementController)).anyTimes();
+    expect(resourceProviderFactory.getMemberResourceProvider(eq(managementController)))
+        .andReturn(new MemberResourceProvider(managementController)).anyTimes();
 
     managementController.updateMembers(AbstractResourceProviderTest.Matcher.getMemberRequestSet("engineering", "joe"));
     expectLastCall().atLeastOnce();
@@ -196,8 +191,6 @@ public class MemberResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     // add the property map to a set for the request.
@@ -238,8 +231,8 @@ public class MemberResourceProviderTest {
     AbstractControllerResourceProvider.init(resourceProviderFactory);
 
     // set expectations
-    expect(resourceProviderFactory.getMemberResourceProvider(EasyMock.anyObject(), EasyMock.anyObject(), eq(managementController)))
-        .andReturn(new MemberResourceProvider(PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type), managementController)).anyTimes();
+    expect(resourceProviderFactory.getMemberResourceProvider(eq(managementController)))
+        .andReturn(new MemberResourceProvider(managementController)).anyTimes();
 
     managementController.deleteMembers(AbstractResourceProviderTest.Matcher.getMemberRequestSet("engineering", null));
     expectLastCall().atLeastOnce();
@@ -251,8 +244,6 @@ public class MemberResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     PredicateBuilder builder = new PredicateBuilder();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java
index c0695b1..b3f2c3c 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestResourceProviderTest.java
@@ -172,8 +172,6 @@ public class RequestResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     // add the property map to a set for the request.  add more maps for multiple creates
@@ -220,9 +218,7 @@ public class RequestResourceProviderTest {
     expect(managementController.getClusters()).andReturn(clusters).anyTimes();
     replay(managementController, clusters, cluster);
 
-    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(type,
-      PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type),
-      managementController);
+    ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(type, managementController);
 
     Map<String, String> requestInfoProperties = new HashMap<>();
     Request request;
@@ -314,8 +310,6 @@ public class RequestResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     Set<String> propertyIds = new HashSet<>();
@@ -366,8 +360,6 @@ public class RequestResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     Set<String> propertyIds = new HashSet<>();
@@ -419,8 +411,6 @@ public class RequestResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     Set<String> propertyIds = new HashSet<>();
@@ -480,8 +470,6 @@ public class RequestResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     Set<String> propertyIds = new HashSet<>();
@@ -547,8 +535,6 @@ public class RequestResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     Set<String> propertyIds = new HashSet<>();
@@ -601,8 +587,6 @@ public class RequestResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     Set<String> propertyIds = new HashSet<>();
@@ -672,8 +656,6 @@ public class RequestResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     Set<String> propertyIds = new HashSet<>();
@@ -753,8 +735,6 @@ public class RequestResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     Set<String> propertyIds = new HashSet<>();
@@ -835,8 +815,6 @@ public class RequestResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     // TEST CASE: Check update request validation (abort reason not specified)
@@ -921,8 +899,6 @@ public class RequestResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     Predicate predicate = new PredicateBuilder().property(RequestResourceProvider.REQUEST_ID_PROPERTY_ID).
@@ -1014,8 +990,6 @@ public class RequestResourceProviderTest {
     Request request = PropertyHelper.getCreateRequest(propertySet, requestInfoProperties);
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     provider.createResources(request);
@@ -1117,8 +1091,6 @@ public class RequestResourceProviderTest {
     Request request = PropertyHelper.getCreateRequest(propertySet, requestInfoProperties);
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     // Neither action nor commands are specified
@@ -1219,8 +1191,6 @@ public class RequestResourceProviderTest {
     Request request = PropertyHelper.getCreateRequest(propertySet, requestInfoProperties);
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     provider.createResources(request);
@@ -1334,8 +1304,6 @@ public class RequestResourceProviderTest {
     Request request = PropertyHelper.getCreateRequest(propertySet, requestInfoProperties);
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     requestInfoProperties.put(RequestOperationLevel.OPERATION_CLUSTER_ID, c1);
@@ -1526,8 +1494,6 @@ public class RequestResourceProviderTest {
     Request request = PropertyHelper.getCreateRequest(propertySet, requestInfoProperties);
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
     provider.createResources(request);
     ExecuteActionRequest capturedRequest = actionRequest.getValue();
@@ -1582,8 +1548,6 @@ public class RequestResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     Set<String> propertyIds = new HashSet<>();
@@ -1636,8 +1600,6 @@ public class RequestResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     Set<String> propertyIds = new HashSet<>();
@@ -1754,8 +1716,6 @@ public class RequestResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     Set<String> propertyIds = ImmutableSet.of(

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestScheduleResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestScheduleResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestScheduleResourceProviderTest.java
index 6d4f72d..a1e33009 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestScheduleResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RequestScheduleResourceProviderTest.java
@@ -65,8 +65,6 @@ public class RequestScheduleResourceProviderTest {
     return (RequestScheduleResourceProvider)
       AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController
       );
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProviderTest.java
index 4316647..b861830 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceComponentResourceProviderTest.java
@@ -70,8 +70,6 @@ public class RootServiceComponentResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<String> propertyIds = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProviderTest.java
index ce3656c..1f37f93 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceHostComponentResourceProviderTest.java
@@ -101,8 +101,6 @@ public class RootServiceHostComponentResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<String> propertyIds = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceResourceProviderTest.java
index 96bc7c9..83be941 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/RootServiceResourceProviderTest.java
@@ -63,8 +63,6 @@ public class RootServiceResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<String> propertyIds = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackAdvisorResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackAdvisorResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackAdvisorResourceProviderTest.java
index 05232ea..a6c7d42 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackAdvisorResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackAdvisorResourceProviderTest.java
@@ -28,7 +28,6 @@ import static org.mockito.Mockito.doReturn;
 import static org.mockito.Mockito.mock;
 
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -40,7 +39,6 @@ import javax.annotation.Nonnull;
 
 import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.spi.Request;
-import org.apache.ambari.server.controller.spi.Resource;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -73,11 +71,8 @@ public class StackAdvisorResourceProviderTest {
 
   @Nonnull
   private RecommendationResourceProvider createRecommendationResourceProvider() {
-    Map<Resource.Type, String> keyPropertyIds = Collections.emptyMap();
-    Set<String> propertyIds = Collections.emptySet();
     AmbariManagementController ambariManagementController = mock(AmbariManagementController.class);
-    return new RecommendationResourceProvider(propertyIds,
-        keyPropertyIds, ambariManagementController);
+    return new RecommendationResourceProvider(ambariManagementController);
   }
 
   @Nonnull
@@ -136,11 +131,8 @@ public class StackAdvisorResourceProviderTest {
  
   @Test
   public void testStackAdvisorWithEmptyHosts() {
-    Map<Resource.Type, String> keyPropertyIds = Collections.emptyMap();
-    Set<String> propertyIds = Collections.emptySet();
     AmbariManagementController ambariManagementController = mock(AmbariManagementController.class);
-    RecommendationResourceProvider provider = new RecommendationResourceProvider(propertyIds,
-            keyPropertyIds, ambariManagementController);
+    RecommendationResourceProvider provider = new RecommendationResourceProvider(ambariManagementController);
 
     Request request = mock(Request.class);
     Set<Map<String, Object>> propertiesSet = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProviderTest.java
index 21df88d..3203aa1 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackArtifactResourceProviderTest.java
@@ -82,8 +82,6 @@ public class StackArtifactResourceProviderTest {
 
     return (StackArtifactResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
       type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackConfigurationDependencyResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackConfigurationDependencyResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackConfigurationDependencyResourceProviderTest.java
index 7c88852..c09852a 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackConfigurationDependencyResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackConfigurationDependencyResourceProviderTest.java
@@ -58,8 +58,6 @@ public class StackConfigurationDependencyResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<String> propertyIds = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProviderTest.java
index 9c48ad0..cddfe2f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackConfigurationResourceProviderTest.java
@@ -67,8 +67,6 @@ public class StackConfigurationResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<String> propertyIds = new HashSet<>();
@@ -139,8 +137,6 @@ public class StackConfigurationResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<String> propertyIds = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackDependencyResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackDependencyResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackDependencyResourceProviderTest.java
index f350153..637bd5f 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackDependencyResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackDependencyResourceProviderTest.java
@@ -42,7 +42,6 @@ import org.apache.ambari.server.controller.spi.Resource;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
-import org.apache.ambari.server.controller.utilities.PropertyHelper;
 import org.apache.ambari.server.state.DependencyInfo;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -164,8 +163,6 @@ public class StackDependencyResourceProviderTest {
   }
 
   private StackDependencyResourceProvider createProvider() {
-    return new StackDependencyResourceProvider(
-        PropertyHelper.getPropertyIds(Resource.Type.StackServiceComponentDependency),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.StackServiceComponentDependency));
+    return new StackDependencyResourceProvider();
   }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackLevelConfigurationResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackLevelConfigurationResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackLevelConfigurationResourceProviderTest.java
index e9742bd..3d9607a 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackLevelConfigurationResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackLevelConfigurationResourceProviderTest.java
@@ -67,8 +67,6 @@ public class StackLevelConfigurationResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<String> propertyIds = new HashSet<>();
@@ -133,8 +131,6 @@ public class StackLevelConfigurationResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<String> propertyIds = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackResourceProviderTest.java
index 4281e33..9d81d15 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackResourceProviderTest.java
@@ -58,8 +58,6 @@ public class StackResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Set<String> propertyIds = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackServiceResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackServiceResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackServiceResourceProviderTest.java
index 2a2ef0b..a9bd831 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackServiceResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/StackServiceResourceProviderTest.java
@@ -86,8 +86,6 @@ public class StackServiceResourceProviderTest {
     Request request = PropertyHelper.getReadRequest(SERVICE_PROPERTIES_PROPERTY_ID);
 
     ResourceProvider stackServiceResourceProvider = AbstractControllerResourceProvider.getResourceProvider(type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     // When
@@ -129,8 +127,6 @@ public class StackServiceResourceProviderTest {
     Request request = PropertyHelper.getReadRequest(SERVICE_PROPERTIES_PROPERTY_ID);
 
     ResourceProvider stackServiceResourceProvider = AbstractControllerResourceProvider.getResourceProvider(type,
-      PropertyHelper.getPropertyIds(type),
-      PropertyHelper.getKeyPropertyIds(type),
       managementController);
 
     // When

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TargetClusterResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TargetClusterResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TargetClusterResourceProviderTest.java
index 492c012..0fedc65 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TargetClusterResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TargetClusterResourceProviderTest.java
@@ -89,9 +89,7 @@ public class TargetClusterResourceProviderTest {
 
     Request request = PropertyHelper.getCreateRequest(propertySet, Collections.emptyMap());
 
-    TargetClusterResourceProvider provider = new TargetClusterResourceProvider(service,
-        PropertyHelper.getPropertyIds(Resource.Type.DRTargetCluster),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.DRTargetCluster));
+    TargetClusterResourceProvider provider = new TargetClusterResourceProvider(service);
 
     provider.createResources(request);
 
@@ -136,9 +134,7 @@ public class TargetClusterResourceProviderTest {
 
     Request request = PropertyHelper.getCreateRequest(propertySet, Collections.emptyMap());
 
-    TargetClusterResourceProvider provider = new TargetClusterResourceProvider(service,
-        PropertyHelper.getPropertyIds(Resource.Type.DRTargetCluster),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.DRTargetCluster));
+    TargetClusterResourceProvider provider = new TargetClusterResourceProvider(service);
 
     Set<Resource> resources = provider.getResources(request, null);
 
@@ -185,9 +181,7 @@ public class TargetClusterResourceProviderTest {
 
     Request request = PropertyHelper.getCreateRequest(propertySet, Collections.emptyMap());
 
-    TargetClusterResourceProvider provider = new TargetClusterResourceProvider(service,
-        PropertyHelper.getPropertyIds(Resource.Type.DRTargetCluster),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.DRTargetCluster));
+    TargetClusterResourceProvider provider = new TargetClusterResourceProvider(service);
 
     provider.updateResources(request, null);
 
@@ -219,9 +213,7 @@ public class TargetClusterResourceProviderTest {
     replay(service);
 
 
-    TargetClusterResourceProvider provider = new TargetClusterResourceProvider(service,
-        PropertyHelper.getPropertyIds(Resource.Type.DRTargetCluster),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.DRTargetCluster));
+    TargetClusterResourceProvider provider = new TargetClusterResourceProvider(service);
 
     Predicate predicate = new PredicateBuilder().property(TargetClusterResourceProvider.CLUSTER_NAME_PROPERTY_ID).equals("Cluster1").toPredicate();
 
@@ -231,16 +223,4 @@ public class TargetClusterResourceProviderTest {
     verify(service);
   }
 
-  @Test
-  public void testGetKeyPropertyIds() throws Exception {
-    IvoryService service = createMock(IvoryService.class);
-
-    Map<Resource.Type, String> keyPropertyIds = PropertyHelper.getKeyPropertyIds(Resource.Type.DRTargetCluster);
-
-    TargetClusterResourceProvider provider = new TargetClusterResourceProvider(service,
-        PropertyHelper.getPropertyIds(Resource.Type.DRTargetCluster),
-        keyPropertyIds);
-
-    Assert.assertEquals(keyPropertyIds, provider.getKeyPropertyIds());
-  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TaskAttemptResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TaskAttemptResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TaskAttemptResourceProviderTest.java
index 992bce0..c028082 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TaskAttemptResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TaskAttemptResourceProviderTest.java
@@ -61,7 +61,7 @@ public class TaskAttemptResourceProviderTest {
         "taskAttempt3"));
 
     Resource.Type type = Resource.Type.TaskAttempt;
-    Set<String> propertyIds = PropertyHelper.getPropertyIds(type);
+    Set<String> propertyIds = TaskAttemptResourceProvider.propertyIds;
 
     TaskAttemptFetcher taskAttemptFetcher = createMock(TaskAttemptFetcher.class);
     expect(

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TaskResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TaskResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TaskResourceProviderTest.java
index 365d408..d7ac273 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TaskResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TaskResourceProviderTest.java
@@ -74,8 +74,6 @@ public class TaskResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     // add the property map to a set for the request.  add more maps for multiple creates
@@ -112,7 +110,7 @@ public class TaskResourceProviderTest {
 
     Injector m_injector = Guice.createInjector(new InMemoryDefaultTestModule());
     TaskResourceProvider provider = (TaskResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
-        type, PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type), amc);
+        type, amc);
 
     m_injector.injectMembers(provider);
     TaskResourceProvider.s_dao = hostRoleCommandDAO;
@@ -176,7 +174,7 @@ public class TaskResourceProviderTest {
 
     Injector m_injector = Guice.createInjector(new InMemoryDefaultTestModule());
     TaskResourceProvider provider = (TaskResourceProvider) AbstractControllerResourceProvider.getResourceProvider(
-      type, PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type), amc);
+      type, amc);
 
     m_injector.injectMembers(provider);
     TaskResourceProvider.s_dao = hostRoleCommandDAO;
@@ -245,8 +243,6 @@ public class TaskResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     // add the property map to a set for the request.
@@ -280,8 +276,6 @@ public class TaskResourceProviderTest {
 
     ResourceProvider provider = AbstractControllerResourceProvider.getResourceProvider(
         type,
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type),
         managementController);
 
     Predicate predicate = new PredicateBuilder().property(TaskResourceProvider.TASK_ID_PROPERTY_ID).equals("Task100").toPredicate();
@@ -296,9 +290,7 @@ public class TaskResourceProviderTest {
     // Test general case
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
 
-    TaskResourceProvider taskResourceProvider = new TaskResourceProvider(
-            PropertyHelper.getPropertyIds(type),
-            PropertyHelper.getKeyPropertyIds(type), managementController);
+    TaskResourceProvider taskResourceProvider = new TaskResourceProvider(managementController);
 
     replay(managementController);
 
@@ -332,9 +324,7 @@ public class TaskResourceProviderTest {
     // Test general case
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
 
-    TaskResourceProvider taskResourceProvider = new TaskResourceProvider(
-            PropertyHelper.getPropertyIds(type),
-            PropertyHelper.getKeyPropertyIds(type), managementController);
+    TaskResourceProvider taskResourceProvider = new TaskResourceProvider(managementController);
 
     replay(managementController);
 
@@ -356,9 +346,7 @@ public class TaskResourceProviderTest {
     // Test general case
     AmbariManagementController managementController = createMock(AmbariManagementController.class);
 
-    TaskResourceProvider taskResourceProvider = new TaskResourceProvider(
-        PropertyHelper.getPropertyIds(type),
-        PropertyHelper.getKeyPropertyIds(type), managementController);
+    TaskResourceProvider taskResourceProvider = new TaskResourceProvider(managementController);
 
     replay(managementController);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TestIvoryProviderModule.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TestIvoryProviderModule.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TestIvoryProviderModule.java
index 90f1011..dca7b35 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TestIvoryProviderModule.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/TestIvoryProviderModule.java
@@ -40,11 +40,11 @@ public class TestIvoryProviderModule extends DefaultProviderModule{
 
     switch (type.getInternalType()) {
       case DRFeed:
-        return new FeedResourceProvider(service, propertyIds, keyPropertyIds);
+        return new FeedResourceProvider(service);
       case DRTargetCluster:
-        return new TargetClusterResourceProvider(service, propertyIds, keyPropertyIds);
+        return new TargetClusterResourceProvider(service);
       case DRInstance:
-        return new InstanceResourceProvider(service, propertyIds, keyPropertyIds);
+        return new InstanceResourceProvider(service);
     }
     return super.createResourceProvider(type);
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
index ec240df..d7f55b3 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UpgradeResourceProviderTest.java
@@ -1174,9 +1174,7 @@ public class UpgradeResourceProviderTest extends EasyMockSupport {
     AbstractControllerResourceProvider.init(factory);
 
     Resource.Type type = Type.Upgrade;
-    return (UpgradeResourceProvider) AbstractControllerResourceProvider.getResourceProvider(type,
-        PropertyHelper.getPropertyIds(type), PropertyHelper.getKeyPropertyIds(type),
-        amc);
+    return (UpgradeResourceProvider) AbstractControllerResourceProvider.getResourceProvider(type, amc);
   }
 
   private RequestStatus testCreateResources() throws Exception {

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UserResourceProviderDBTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UserResourceProviderDBTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UserResourceProviderDBTest.java
index c4f0f34..7d9a964 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UserResourceProviderDBTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UserResourceProviderDBTest.java
@@ -91,7 +91,7 @@ public class UserResourceProviderDBTest {
         Set<String> propertyIds    = PropertyHelper.getPropertyIds(userType);
         Map<Resource.Type,String> keyPropertyIds = PropertyHelper.getKeyPropertyIds(userType);
 
-        userResourceProvider = new UserResourceProvider(propertyIds, keyPropertyIds, amc);
+        userResourceProvider = new UserResourceProvider(amc);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UserResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UserResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UserResourceProviderTest.java
index 9efad8a..f36bb63 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UserResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/UserResourceProviderTest.java
@@ -540,8 +540,6 @@ public class UserResourceProviderTest extends EasyMockSupport {
   private ResourceProvider getResourceProvider(AmbariManagementController managementController) {
     return AbstractControllerResourceProvider.getResourceProvider(
         Resource.Type.User,
-        PropertyHelper.getPropertyIds(Resource.Type.User),
-        PropertyHelper.getKeyPropertyIds(Resource.Type.User),
         managementController);
   }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ValidationResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ValidationResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ValidationResourceProviderTest.java
index 42d4770..34337ae 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ValidationResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/ValidationResourceProviderTest.java
@@ -47,8 +47,7 @@ public class ValidationResourceProviderTest {
     Map<Resource.Type, String> keyPropertyIds = Collections.emptyMap();
     Set<String> propertyIds = Collections.singleton(ValidationResourceProvider.VALIDATION_ID_PROPERTY_ID);
     AmbariManagementController ambariManagementController = mock(AmbariManagementController.class);
-    ValidationResourceProvider provider = spy(new ValidationResourceProvider(propertyIds,
-        keyPropertyIds, ambariManagementController));
+    ValidationResourceProvider provider = spy(new ValidationResourceProvider(ambariManagementController));
     StackAdvisorRequest stackAdvisorRequest = mock(StackAdvisorRequest.class);
     Request request = mock(Request.class);
     doReturn(stackAdvisorRequest).when(provider).prepareStackAdvisorRequest(request);

http://git-wip-us.apache.org/repos/asf/ambari/blob/e77a31ab/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/WorkflowResourceProviderTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/WorkflowResourceProviderTest.java b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/WorkflowResourceProviderTest.java
index 337dc46..ac064c5 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/WorkflowResourceProviderTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/controller/internal/WorkflowResourceProviderTest.java
@@ -35,7 +35,6 @@ import org.apache.ambari.server.controller.spi.NoSuchResourceException;
 import org.apache.ambari.server.controller.spi.Predicate;
 import org.apache.ambari.server.controller.spi.Request;
 import org.apache.ambari.server.controller.spi.Resource;
-import org.apache.ambari.server.controller.spi.Resource.Type;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
 import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.controller.spi.UnsupportedPropertyException;
@@ -58,7 +57,20 @@ public class WorkflowResourceProviderTest {
     expected.add(createWorkflowResponse("Cluster100", "workflow3"));
 
     Resource.Type type = Resource.Type.Workflow;
-    Set<String> propertyIds = PropertyHelper.getPropertyIds(type);
+    Set<String> propertyIds = new HashSet<>();
+    propertyIds.add(WorkflowResourceProvider.WORKFLOW_CLUSTER_NAME_PROPERTY_ID);
+    propertyIds.add(WorkflowResourceProvider.WORKFLOW_ID_PROPERTY_ID);
+    propertyIds.add(WorkflowResourceProvider.WORKFLOW_NAME_PROPERTY_ID);
+    propertyIds.add(WorkflowResourceProvider.WORKFLOW_USER_NAME_PROPERTY_ID);
+    propertyIds.add(WorkflowResourceProvider.WORKFLOW_START_TIME_PROPERTY_ID);
+    propertyIds.add(WorkflowResourceProvider.WORKFLOW_LAST_UPDATE_TIME_PROPERTY_ID);
+    propertyIds.add(WorkflowResourceProvider.WORKFLOW_ELAPSED_TIME_PROPERTY_ID);
+    propertyIds.add(WorkflowResourceProvider.WORKFLOW_INPUT_BYTES_PROPERTY_ID);
+    propertyIds.add(WorkflowResourceProvider.WORKFLOW_OUTPUT_BYTES_PROPERTY_ID);
+    propertyIds.add(WorkflowResourceProvider.WORKFLOW_NUM_JOBS_TOTAL_PROPERTY_ID);
+    propertyIds.add(WorkflowResourceProvider.WORKFLOW_NUM_JOBS_COMPLETED_PROPERTY_ID);
+    propertyIds.add(WorkflowResourceProvider.WORKFLOW_PARENT_ID_PROPERTY_ID);
+    propertyIds.add(WorkflowResourceProvider.WORKFLOW_CONTEXT_PROPERTY_ID);
 
     WorkflowFetcher workflowFetcher = createMock(WorkflowFetcher.class);
     expect(workflowFetcher.fetchWorkflows(propertyIds, "Cluster100", null))
@@ -67,8 +79,7 @@ public class WorkflowResourceProviderTest {
 
     Map<Resource.Type,String> keyPropertyIds = PropertyHelper
         .getKeyPropertyIds(type);
-    ResourceProvider provider = new WorkflowResourceProvider(propertyIds,
-        keyPropertyIds, workflowFetcher);
+    ResourceProvider provider = new WorkflowResourceProvider(workflowFetcher);
 
     Request request = PropertyHelper.getReadRequest(propertyIds);
     Predicate predicate = new PredicateBuilder()
@@ -100,11 +111,7 @@ public class WorkflowResourceProviderTest {
       NoSuchParentResourceException {
     Set<String> requestedIds = new HashSet<>();
     requestedIds.add(WorkflowResourceProvider.WORKFLOW_ID_PROPERTY_ID);
-
-    Map<Resource.Type,String> keyPropertyIds = PropertyHelper
-        .getKeyPropertyIds(Resource.Type.Workflow);
-    ResourceProvider provider = new TestWorkflowResourceProvider(requestedIds,
-        keyPropertyIds);
+    ResourceProvider provider = new TestWorkflowResourceProvider();
 
     Request request = PropertyHelper.getReadRequest(requestedIds);
     Predicate predicate = new PredicateBuilder()
@@ -131,9 +138,8 @@ public class WorkflowResourceProviderTest {
 
   private static class TestWorkflowResourceProvider extends
       WorkflowResourceProvider {
-    protected TestWorkflowResourceProvider(Set<String> propertyIds,
-        Map<Type,String> keyPropertyIds) {
-      super(propertyIds, keyPropertyIds, null);
+    protected TestWorkflowResourceProvider() {
+      super(null);
       this.workflowFetcher = new TestWorkflowFetcher();
     }
 


[11/13] ambari git commit: AMBARI-22586 - Remove Beacon conf-select Changes Since It's Not Part of HDP (jonathanhurley)

Posted by rl...@apache.org.
AMBARI-22586 - Remove Beacon conf-select Changes Since It's Not Part of HDP (jonathanhurley)


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

Branch: refs/heads/branch-feature-AMBARI-20859
Commit: 0afe0c00d797f22efc94c394de86af2bec94b448
Parents: 2e9c964
Author: Jonathan Hurley <jh...@hortonworks.com>
Authored: Mon Dec 4 12:56:12 2017 -0500
Committer: Jonathan Hurley <jh...@hortonworks.com>
Committed: Mon Dec 4 14:52:43 2017 -0500

----------------------------------------------------------------------
 .../stacks/HDP/2.0.6/properties/stack_packages.json         | 9 ---------
 .../resources/stacks/HDP/3.0/properties/stack_packages.json | 9 ---------
 2 files changed, 18 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/0afe0c00/ambari-server/src/main/resources/stacks/HDP/2.0.6/properties/stack_packages.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.0.6/properties/stack_packages.json b/ambari-server/src/main/resources/stacks/HDP/2.0.6/properties/stack_packages.json
index 1783655..946686a 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.0.6/properties/stack_packages.json
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.6/properties/stack_packages.json
@@ -994,12 +994,6 @@
           "current_dir": "{0}/current/atlas-client/conf"
         }
       ],
-      "beacon": [
-        {
-          "conf_dir": "/etc/beacon/conf",
-          "current_dir": "{0}/current/beacon-client/conf"
-        }
-      ],
       "druid": [
         {
           "conf_dir": "/etc/druid/conf",
@@ -1194,9 +1188,6 @@
       "ATLAS": {
         "packages": ["atlas"]
       },
-      "BEACON": {
-        "packages": ["beacon"]
-      },
       "DRUID": {
         "packages": ["druid", "superset"]
       },

http://git-wip-us.apache.org/repos/asf/ambari/blob/0afe0c00/ambari-server/src/main/resources/stacks/HDP/3.0/properties/stack_packages.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/3.0/properties/stack_packages.json b/ambari-server/src/main/resources/stacks/HDP/3.0/properties/stack_packages.json
index 4b4d0bb..4f05377 100644
--- a/ambari-server/src/main/resources/stacks/HDP/3.0/properties/stack_packages.json
+++ b/ambari-server/src/main/resources/stacks/HDP/3.0/properties/stack_packages.json
@@ -871,12 +871,6 @@
           "current_dir": "{0}/current/atlas-client/conf"
         }
       ],
-      "beacon": [
-        {
-          "conf_dir": "/etc/beacon/conf",
-          "current_dir": "{0}/current/beacon-client/conf"
-        }
-      ],
       "druid": [
         {
           "conf_dir": "/etc/druid/conf",
@@ -1071,9 +1065,6 @@
       "ATLAS": {
         "packages": ["atlas"]
       },
-      "BEACON": {
-        "packages": ["beacon"]
-      },
       "DRUID": {
         "packages": ["druid", "superset"]
       },


[03/13] ambari git commit: AMBARI-22578. hive2 queries fails after adding any service to the cluster. (jaimin via yusaku)

Posted by rl...@apache.org.
AMBARI-22578. hive2 queries fails after adding any service to the cluster. (jaimin via yusaku)


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

Branch: refs/heads/branch-feature-AMBARI-20859
Commit: 24c64b44d9b26e41cd1e30c93b993784008892f5
Parents: 5caac19
Author: Yusaku Sako <yu...@hortonworks.com>
Authored: Mon Dec 4 08:08:55 2017 -0800
Committer: Yusaku Sako <yu...@hortonworks.com>
Committed: Mon Dec 4 08:08:55 2017 -0800

----------------------------------------------------------------------
 .../stacks/HDP/2.6/services/TEZ/configuration/tez-site.xml   | 8 ++++++++
 1 file changed, 8 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/24c64b44/ambari-server/src/main/resources/stacks/HDP/2.6/services/TEZ/configuration/tez-site.xml
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.6/services/TEZ/configuration/tez-site.xml b/ambari-server/src/main/resources/stacks/HDP/2.6/services/TEZ/configuration/tez-site.xml
index 393d077..81c52f9 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.6/services/TEZ/configuration/tez-site.xml
+++ b/ambari-server/src/main/resources/stacks/HDP/2.6/services/TEZ/configuration/tez-site.xml
@@ -26,6 +26,14 @@
     <on-ambari-upgrade add="false"/>
   </property>
   <property>
+    <name>tez.am.launch.cmd-opts</name>
+    <value>-XX:+PrintGCDetails -verbose:gc -XX:+PrintGCTimeStamps -XX:+UseNUMA -XX:+UseParallelGC{{heap_dump_opts}}</value>
+    <description>Java options for the Tez AppMaster process. The Xmx value is derived based on tez.am.resource.memory.mb and is 80% of the value by default.
+      Used only if the value is not specified explicitly by the DAG definition.
+    </description>
+    <on-ambari-upgrade add="false"/>
+  </property>
+  <property>
     <name>tez.history.logging.timeline-cache-plugin.old-num-dags-per-group</name>
     <value>5</value>
     <description>DAGs per group</description>


[09/13] ambari git commit: AMBARI-22582 Clean up Configs page. (atkach)

Posted by rl...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/test/views/common/configs/config_history_flow_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/configs/config_history_flow_test.js b/ambari-web/test/views/common/configs/config_history_flow_test.js
deleted file mode 100644
index 8a6ab4d..0000000
--- a/ambari-web/test/views/common/configs/config_history_flow_test.js
+++ /dev/null
@@ -1,756 +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.
- */
-
-var App = require('app');
-require('views/common/configs/config_history_flow');
-var testHelpers = require('test/helpers');
-
-describe.skip('App.ConfigHistoryFlowView', function () {
-
-  var view = App.ConfigHistoryFlowView.create({
-    controller: Em.Object.create({
-      loadSelectedVersion: Em.K,
-      loadStep: Em.K
-    }),
-    displayedServiceVersion: Em.Object.create(),
-    serviceVersions: []
-  });
-
-  App.TestAliases.testAsComputedAlias(view, 'serviceName', 'controller.selectedService.serviceName', 'string');
-
-  App.TestAliases.testAsComputedOr(view, 'isSaveDisabled', ['controller.isSubmitDisabled', '!controller.versionLoaded', '!controller.isPropertiesChanged']);
-
-  App.TestAliases.testAsComputedGt(view, 'displayedServiceVersion.notes.length', 100);
-
-  App.TestAliases.testAsComputedTruncate(view, 'shortNotes', 'displayedServiceVersion.notes', 100, 100);
-
-  describe('#visibleServiceVersion', function () {
-    var testCases = [
-      {
-        params: {
-          startIndex: 0,
-          serviceVersions: []
-        },
-        result: []
-      },
-      {
-        params: {
-          startIndex: 0,
-          serviceVersions: [1, 2, 3]
-        },
-        result: [1, 2, 3]
-      },
-      {
-        params: {
-          startIndex: 0,
-          serviceVersions: [1, 2, 3, 4, 5, 6, 7]
-        },
-        result: [1, 2, 3, 4, 5]
-      },
-      {
-        params: {
-          startIndex: 3,
-          serviceVersions: [1, 2, 3, 4, 5, 6, 7]
-        },
-        result: [4, 5, 6, 7]
-      }
-    ];
-    testCases.forEach(function (test) {
-      it('start index - ' + test.params.startIndex + ', serviceVersions length - ' + test.params.serviceVersions.length, function () {
-        view.set('serviceVersions', test.params.serviceVersions);
-        view.set('startIndex', test.params.startIndex);
-        view.propertyDidChange('visibleServiceVersion');
-        expect(view.get('visibleServiceVersion')).to.eql(test.result);
-      });
-    });
-  });
-
-  describe('#versionActionsDisabled', function () {
-    it('versionLoaded is false', function () {
-      view.set('controller.versionLoaded', false);
-      expect(view.get('versionActionsDisabled')).to.be.true;
-    });
-    it('versionLoaded is true', function () {
-      view.set('controller.versionLoaded', true);
-      expect(view.get('versionActionsDisabled')).to.be.false;
-    });
-  });
-
-  describe('#dropDownList', function () {
-    var displayedServiceVersion = {version: 1};
-
-    it('Only one service version is present', function () {
-      view.set('serviceVersions', [displayedServiceVersion]);
-      view.set('displayedServiceVersion', displayedServiceVersion);
-      view.propertyDidChange('dropDownList');
-      expect(view.get('dropDownList')).to.be.empty;
-    });
-    it('Three service version', function () {
-      view.set('serviceVersions', [displayedServiceVersion, {version: 2}, {version: 3}]);
-      view.set('displayedServiceVersion', displayedServiceVersion);
-      view.propertyDidChange('dropDownList');
-      expect(view.get('dropDownList')).to.eql([{version: 3}, {version: 2}]);
-    });
-    it('Seven service version, showFullList is false', function () {
-      view.set('serviceVersions', [
-        displayedServiceVersion,
-        {version: 2},
-        {version: 3},
-        {version: 4},
-        {version: 5},
-        {version: 6},
-        {version: 7},
-        {version: 8}
-      ]);
-      view.set('displayedServiceVersion', displayedServiceVersion);
-      view.set('showFullList', false);
-      view.propertyDidChange('dropDownList');
-      expect(view.get('dropDownList')).to.eql([
-        {version: 8},
-        {version: 7},
-        {version: 6},
-        {version: 5},
-        {version: 4},
-        {version: 3}
-      ]);
-    });
-    it('Seven service version, showFullList is true', function () {
-      view.set('serviceVersions', [
-        displayedServiceVersion,
-        {version: 2},
-        {version: 3},
-        {version: 4},
-        {version: 5},
-        {version: 6},
-        {version: 7},
-        {version: 8}
-      ]);
-      view.set('displayedServiceVersion', displayedServiceVersion);
-      view.set('showFullList', true);
-      view.propertyDidChange('dropDownList');
-      expect(view.get('dropDownList')).to.eql([
-        {version: 8},
-        {version: 7},
-        {version: 6},
-        {version: 5},
-        {version: 4},
-        {version: 3},
-        {version: 2}
-      ]);
-    });
-  });
-
-  describe('#openFullList()', function () {
-    var event;
-    beforeEach(function () {
-      event = {
-        stopPropagation: Em.K
-      };
-      sinon.spy(event, 'stopPropagation');
-      view.openFullList(event);
-    });
-
-    afterEach(function () {
-      event.stopPropagation.restore();
-    });
-
-    it('stopPropagation is called once', function () {
-      expect(event.stopPropagation.calledOnce).to.be.true;
-    });
-
-    it('stopPropagation is true', function () {
-      expect(view.get('stopPropagation')).to.be.true;
-    });
-  });
-
-  describe('#hideFullList()', function () {
-    var testCases = [
-      {
-        params: {
-          serviceVersions: new Array(0)
-        },
-        result: true
-      },
-      {
-        params: {
-          serviceVersions: new Array(6)
-        },
-        result: true
-      },
-      {
-        params: {
-          serviceVersions: new Array(7)
-        },
-        result: false
-      }
-    ];
-    testCases.forEach(function (test) {
-      it('notes length - ' + test.params.count, function () {
-        view.set('serviceVersions', test.params.serviceVersions);
-        view.hideFullList();
-        expect(view.get('showFullList')).to.equal(test.result);
-      });
-    });
-  });
-
-  describe('#didInsertElement()', function () {
-
-    beforeEach(function () {
-      sinon.stub(App, 'tooltip');
-      view.didInsertElement();
-    });
-
-    afterEach(function () {
-      App.tooltip.restore();
-    });
-
-    it('App.tooltip is called on�e', function () {
-      expect(App.tooltip.calledOnce).to.be.true;
-    });
-  });
-
-  describe('#willInsertElement()', function () {
-
-    beforeEach(function () {
-      sinon.stub(view, 'adjustFlowView', Em.K);
-      sinon.stub(view, 'keepInfoBarAtTop', Em.K);
-    });
-
-    afterEach(function () {
-      view.adjustFlowView.restore();
-      view.keepInfoBarAtTop.restore();
-    });
-
-    describe('Only current version is present', function () {
-
-      beforeEach(function () {
-        view.set('serviceVersions', [Em.Object.create({isCurrent: true})]);
-        view.willInsertElement();
-      });
-
-      it('adjustFlowView is called once', function () {
-        expect(view.adjustFlowView.calledOnce).to.be.true;
-      });
-      it('keepInfoBarAtTop is called once', function () {
-        expect(view.keepInfoBarAtTop.calledOnce).to.be.true;
-      });
-      it('startIndex = 0', function () {
-        expect(view.get('startIndex')).to.equal(0);
-      });
-      it('serviceVersions.@each.isDisplayed = [true]', function () {
-        expect(view.get('serviceVersions').mapProperty('isDisplayed')).to.eql([true]);
-      });
-    });
-
-    describe('Five service versions are present', function () {
-
-      beforeEach(function () {
-        view.set('serviceVersions', [
-          Em.Object.create({isCurrent: true}),
-          Em.Object.create(),
-          Em.Object.create(),
-          Em.Object.create(),
-          Em.Object.create()
-        ]);
-        view.willInsertElement();
-      });
-      it('adjustFlowView is called once', function () {
-        expect(view.adjustFlowView.calledOnce).to.be.true;
-      });
-      it('keepInfoBarAtTop is called once', function () {
-        expect(view.keepInfoBarAtTop.calledOnce).to.be.true;
-      });
-      it('startIndex = 0', function () {
-        expect(view.get('startIndex')).to.equal(0);
-      });
-      it('serviceVersions.@each.isDisplayed = [true, false, false, false, false]', function () {
-        expect(view.get('serviceVersions').mapProperty('isDisplayed')).to.eql([true, false, false, false, false]);
-      });
-    });
-
-    describe('Six service versions are present', function () {
-      beforeEach(function () {
-        view.set('serviceVersions', [
-          Em.Object.create({isCurrent: true}),
-          Em.Object.create(),
-          Em.Object.create(),
-          Em.Object.create(),
-          Em.Object.create(),
-          Em.Object.create()
-        ]);
-        view.willInsertElement();
-      });
-
-      it('adjustFlowView is called once', function () {
-        expect(view.adjustFlowView.calledOnce).to.be.true;
-      });
-      it('keepInfoBarAtTop is called once', function () {
-        expect(view.keepInfoBarAtTop.calledOnce).to.be.true;
-      });
-      it('startIndex is 1', function () {
-        expect(view.get('startIndex')).to.equal(1);
-      });
-      it('serviceVersions.@each.isDisplayed = [true, false, false, false, false, false]', function () {
-        expect(view.get('serviceVersions').mapProperty('isDisplayed')).to.eql([true, false, false, false, false, false]);
-      });
-    });
-
-  });
-
-  describe('#setInfoBarPosition()', function () {
-    var testCases = [
-      {
-        params: {
-          scrollTop: 0,
-          defaultTop: 0
-        },
-        result: 'auto'
-      },
-      {
-        params: {
-          scrollTop: 1,
-          defaultTop: 11
-        },
-        result: '10px'
-      },
-      {
-        params: {
-          scrollTop: 1,
-          defaultTop: 0
-        },
-        result: '10px'
-      }
-    ];
-    var infoBar = {
-      css: Em.K
-    };
-
-    beforeEach(function () {
-      sinon.spy(infoBar, 'css');
-    });
-
-    afterEach(function () {
-      infoBar.css.restore();
-    });
-
-    testCases.forEach(function (test) {
-      it('scroll top - ' + test.params.scrollTop + ', default top - ' + test.params.defaultTop, function () {
-        view.setInfoBarPosition(infoBar, test.params.defaultTop, test.params.scrollTop);
-        expect(infoBar.css.calledWith('top', test.result)).to.be.true;
-      });
-    });
-  });
-
-  describe('#adjustFlowView()', function () {
-    var testCases = [
-      {
-        params: {
-          serviceVersions: [Em.Object.create()],
-          startIndex: 0
-        },
-        result: {
-          first: [true],
-          showLeftArrow: false,
-          showRightArrow: false
-        }
-      },
-      {
-        params: {
-          serviceVersions: [
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create()
-          ],
-          startIndex: 0
-        },
-        result: {
-          first: [true, false, false, false, false],
-          showLeftArrow: false,
-          showRightArrow: false
-        }
-      },
-      {
-        params: {
-          serviceVersions: [
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create()
-          ],
-          startIndex: 0
-        },
-        result: {
-          first: [true, false, false, false, false, false],
-          showLeftArrow: false,
-          showRightArrow: true
-        }
-      },
-      {
-        params: {
-          serviceVersions: [
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create()
-          ],
-          startIndex: 1
-        },
-        result: {
-          first: [false, true, false, false, false, false],
-          showLeftArrow: true,
-          showRightArrow: false
-        }
-      },
-      {
-        params: {
-          serviceVersions: [
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create(),
-            Em.Object.create()
-          ],
-          startIndex: 1
-        },
-        result: {
-          first: [false, true, false, false, false, false, false],
-          showLeftArrow: true,
-          showRightArrow: true
-        }
-      }
-    ];
-
-    testCases.forEach(function (test) {
-      it('start index - ' + test.params.startIndex + ', serviceVersions length - ' + test.params.serviceVersions.length, function () {
-        view.set('startIndex', test.params.startIndex);
-        view.set('serviceVersions', test.params.serviceVersions);
-
-        view.adjustFlowView();
-        expect(view.get('serviceVersions').mapProperty('first')).to.eql(test.result.first);
-        expect(view.get('showLeftArrow')).to.eql(test.result.showLeftArrow);
-        expect(view.get('showRightArrow')).to.eql(test.result.showRightArrow);
-      });
-    });
-  });
-
-  describe('#switchVersion()', function () {
-    var event = {
-      context: Em.Object.create({
-        version: 2
-      })
-    };
-    beforeEach(function(){
-      sinon.stub(view, 'shiftFlowOnSwitch', Em.K);
-      sinon.spy(view.get('controller'), 'loadSelectedVersion');
-    });
-    afterEach(function(){
-      view.shiftFlowOnSwitch.restore();
-      view.get('controller').loadSelectedVersion.restore();
-    });
-    it('Only one service version is present', function () {
-      view.set('serviceVersions', [Em.Object.create({version: 2})]);
-      view.switchVersion(event);
-      expect(view.get('serviceVersions').mapProperty('isDisplayed')).to.eql([true]);
-      expect(view.get('controller').loadSelectedVersion.calledWith(2)).to.be.true;
-      expect(view.shiftFlowOnSwitch.calledWith(0)).to.be.true;
-    });
-    it('Two service versions are present', function () {
-      view.set('serviceVersions', [
-        Em.Object.create({version: 1}),
-        Em.Object.create({version: 2})
-      ]);
-      view.switchVersion(event);
-      expect(view.get('serviceVersions').mapProperty('isDisplayed')).to.eql([false, true]);
-      expect(view.get('controller').loadSelectedVersion.calledWith(2)).to.be.true;
-      expect(view.shiftFlowOnSwitch.calledWith(1)).to.be.true;
-    });
-  });
-
-  describe('#compare()', function () {
-    it('should set compareServiceVersion', function () {
-      view.compare({context: Em.Object.create({version: 1})});
-
-      expect(view.get('controller.compareServiceVersion')).to.eql(Em.Object.create({version: 1}));
-    });
-  });
-
-  describe('#revert()', function () {
-    beforeEach(function () {
-      sinon.stub(App.ModalPopup, 'show', function (options) {
-        options.onPrimary.call(Em.Object.create({
-          serviceConfigNote: 'note',
-          hide: Em.K
-        }));
-      });
-      sinon.stub(view, 'sendRevertCall', Em.K);
-    });
-    afterEach(function () {
-      App.ModalPopup.show.restore();
-      view.sendRevertCall.restore();
-    });
-    it('context passed', function () {
-      view.revert({context: Em.Object.create({
-        version: 1,
-        serviceName: 'S1'
-      })});
-
-      expect(App.ModalPopup.show.calledOnce).to.be.true;
-      expect(view.sendRevertCall.calledWith(Em.Object.create({
-        version: 1,
-        serviceName: 'S1',
-        serviceConfigNote: 'note'
-      }))).to.be.true;
-    });
-    it('context is not passed', function () {
-      view.set('displayedServiceVersion', Em.Object.create({
-        version: 1,
-        serviceName: 'S1'
-      }));
-      view.revert({});
-
-      expect(App.ModalPopup.show.calledOnce).to.be.true;
-      expect(view.sendRevertCall.calledWith(Em.Object.create({
-        version: 1,
-        serviceName: 'S1',
-        serviceConfigNote: 'note',
-        notes: ''
-      }))).to.be.true;
-    });
-  });
-
-  describe('#sendRevertCall()', function () {
-
-    beforeEach(function () {
-      view.sendRevertCall(Em.Object.create());
-    });
-
-    it('request is sent', function () {
-      var args = testHelpers.findAjaxRequest('name', 'service.serviceConfigVersion.revert');
-      expect(args).exists;
-    });
-  });
-
-  describe('#sendRevertCallSuccess()', function () {
-    beforeEach(function () {
-      sinon.spy(view.get('controller'), 'loadStep');
-      sinon.stub(App.router.get('updateController'), 'updateComponentConfig', Em.K);
-      view.sendRevertCallSuccess();
-    });
-    afterEach(function () {
-      view.get('controller').loadStep.restore();
-      App.router.get('updateController').updateComponentConfig.restore();
-    });
-
-    it('loadStep is called', function () {
-      expect(view.get('controller').loadStep.calledOnce).to.be.true;
-    });
-
-    it('updateComponentConfig is called', function () {
-      expect(App.router.get('updateController').updateComponentConfig.calledOnce).to.be.true;
-    });
-  });
-
-  describe('#save()', function () {
-
-    beforeEach(function () {
-      sinon.stub(App.ModalPopup, 'show', Em.K);
-      sinon.stub(App.ServiceConfigVersion, 'find').returns([
-        { serviceName: 'service'}
-      ]);
-    });
-
-    afterEach(function () {
-      App.ModalPopup.show.restore();
-      App.ServiceConfigVersion.find.restore();
-    });
-
-    it('modal popup should be displayed', function () {
-      view.save();
-      expect(App.ModalPopup.show.calledOnce).to.be.true;
-    });
-
-    it('controller properties should be modified on save', function () {
-      view.setProperties({
-        'serviceName': 'service',
-        'controller.saveConfigsFlag': false,
-        'controller.serviceConfigVersionNote': '',
-        'controller.serviceConfigNote': '',
-        'controller.preSelectedConfigVersion': null,
-        'serviceConfigNote': 'note',
-        'displayedServiceVersion.serviceName': 'service',
-        'controller.selectedConfigGroup.name': 'group'
-      });
-      var popup = view.save();
-      popup.onSave();
-      expect(view.get('controller.saveConfigsFlag')).to.be.true;
-      expect(view.get('controller').getProperties(['saveConfigsFlag', 'serviceConfigVersionNote', 'serviceConfigNote', 'preSelectedConfigVersion'])).to.eql({
-        saveConfigsFlag: true,
-        serviceConfigVersionNote: 'note',
-        serviceConfigNote: this.get('serviceConfigNote'),
-        preSelectedConfigVersion: Em.Object.create({
-          version: 2,
-          serviceName: 'service',
-          groupName: 'group'
-        })
-      });
-    });
-  });
-
-  describe('#shiftBack()', function () {
-
-    beforeEach(function () {
-      sinon.stub(view, 'decrementProperty', Em.K);
-      sinon.stub(view, 'adjustFlowView', Em.K);
-      view.shiftBack();
-    });
-
-    afterEach(function () {
-      view.adjustFlowView.restore();
-      view.decrementProperty.restore();
-    });
-
-    it('decrementProperty is called with correct data', function () {
-      expect(view.decrementProperty.calledWith('startIndex')).to.be.true;
-    });
-
-    it('adjustFlowView is called once', function () {
-      expect(view.adjustFlowView.calledOnce).to.be.true;
-    });
-  });
-
-  describe('#shiftForward()', function () {
-
-    beforeEach(function () {
-      sinon.stub(view, 'incrementProperty', Em.K);
-      sinon.stub(view, 'adjustFlowView', Em.K);
-      view.shiftForward();
-    });
-
-    afterEach(function () {
-      view.adjustFlowView.restore();
-      view.incrementProperty.restore();
-    });
-
-    it('startIndex++', function () {
-      expect(view.incrementProperty.calledWith('startIndex')).to.be.true;
-    });
-
-    it('adjustFlowView is called once', function () {
-      expect(view.adjustFlowView.calledOnce).to.be.true;
-    });
-  });
-
-  describe('#adjustFlowView()', function () {
-    var testCases = [
-      {
-        params: {
-          serviceVersions: [],
-          startIndex: 0,
-          versionIndex: 1
-        },
-        result: {
-          startIndex: 0,
-          adjustFlowViewCall: false
-        }
-      },
-      {
-        params: {
-          serviceVersions: new Array(6),
-          startIndex: 7,
-          versionIndex: 6
-        },
-        result: {
-          startIndex: 1,
-          adjustFlowViewCall: true
-        }
-      },
-      {
-        params: {
-          serviceVersions: new Array(12),
-          startIndex: 7,
-          versionIndex: 6
-        },
-        result: {
-          startIndex: 6,
-          adjustFlowViewCall: true
-        }
-      },
-      {
-        params: {
-          serviceVersions: new Array(12),
-          startIndex: 0,
-          versionIndex: 6
-        },
-        result: {
-          startIndex: 6,
-          adjustFlowViewCall: true
-        }
-      },
-      {
-        params: {
-          serviceVersions: new Array(6),
-          startIndex: 0,
-          versionIndex: 6
-        },
-        result: {
-          startIndex: 1,
-          adjustFlowViewCall: true
-        }
-      }
-    ];
-
-    beforeEach(function () {
-      sinon.stub(view, 'adjustFlowView', Em.K);
-    });
-
-    afterEach(function () {
-      view.adjustFlowView.restore();
-    });
-
-    testCases.forEach(function (test) {
-      it('start index - ' + test.params.startIndex + ', serviceVersions length - ' + test.params.serviceVersions.length + ', versionIndex - ' + test.params.versionIndex, function () {
-        view.set('serviceVersions', test.params.serviceVersions);
-        view.set('startIndex', test.params.startIndex);
-        view.shiftFlowOnSwitch(test.params.versionIndex);
-
-        expect(view.get('startIndex')).to.eql(test.result.startIndex);
-        expect(view.adjustFlowView.calledOnce).to.eql(test.result.adjustFlowViewCall);
-      });
-    });
-  });
-});
-
-function getView() {
-  return App.ConfigsServiceVersionBoxView.create();
-}
-
-describe('App.ConfigsServiceVersionBoxView', function () {
-
-  App.TestAliases.testAsComputedAlias(getView(), 'disabledActionAttr', 'serviceVersion.disabledActionAttr', 'object');
-
-  App.TestAliases.testAsComputedAlias(getView(), 'disabledActionMessages', 'serviceVersion.disabledActionMessages', 'object');
-
-});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/test/views/common/configs/config_versions_control_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/configs/config_versions_control_view_test.js b/ambari-web/test/views/common/configs/config_versions_control_view_test.js
new file mode 100644
index 0000000..9f72fc5
--- /dev/null
+++ b/ambari-web/test/views/common/configs/config_versions_control_view_test.js
@@ -0,0 +1,152 @@
+/**
+ * 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.
+ */
+
+var App = require('app');
+require('views/common/configs/config_versions_control_view');
+var testHelpers = require('test/helpers');
+
+describe('App.ConfigVersionsControlView', function () {
+
+  var view = App.ConfigVersionsControlView.create({
+    controller: Em.Object.create({
+      loadSelectedVersion: Em.K,
+      loadStep: Em.K,
+      loadCompareVersionConfigs: Em.K,
+      onLoadOverrides: Em.K,
+      stepConfigs: []
+    }),
+    displayedServiceVersion: Em.Object.create(),
+    serviceVersions: []
+  });
+
+  App.TestAliases.testAsComputedAlias(view, 'serviceName', 'controller.content.serviceName', 'string');
+
+  describe('#switchVersion()', function () {
+    var event = {
+      contexts: [2]
+    };
+    beforeEach(function(){
+      sinon.spy(view.get('controller'), 'loadSelectedVersion');
+    });
+    afterEach(function(){
+      view.get('controller').loadSelectedVersion.restore();
+    });
+    it('Choose not displayed version', function () {
+      view.set('serviceVersions', [
+        Em.Object.create({version: 1, isDisplayed: true}),
+        Em.Object.create({version: 2})
+      ]);
+      view.switchVersion(event);
+      expect(view.get('serviceVersions').mapProperty('isDisplayed')).to.eql([false, true]);
+      expect(view.get('controller').loadSelectedVersion.calledWith(2)).to.be.true;
+      expect(view.get('controller.displayedVersion')).to.be.eql(view.get('serviceVersions')[1]);
+    });
+
+    it('Choose displayed version', function () {
+      view.set('serviceVersions', [
+        Em.Object.create({version: 1}),
+        Em.Object.create({version: 2, isDisplayed: true})
+      ]);
+      view.switchVersion(event);
+      expect(view.get('controller').loadSelectedVersion.called).to.be.false;
+    });
+  });
+
+  describe('#compare()', function () {
+    beforeEach(function(){
+      sinon.stub(view.get('controller'), 'loadCompareVersionConfigs').returns({
+        done: Em.clb
+      });
+      sinon.spy(view.get('controller'), 'onLoadOverrides');
+    });
+    afterEach(function(){
+      view.get('controller').loadCompareVersionConfigs.restore();
+      view.get('controller').onLoadOverrides.restore();
+    });
+    it('should set compareServiceVersion', function () {
+      view.compare({contexts: [Em.Object.create({version: 1})]});
+
+      expect(view.get('controller.compareServiceVersion')).to.eql(Em.Object.create({version: 1}));
+      expect(view.get('controller').loadCompareVersionConfigs.calledOnce).to.be.true;
+      expect(view.get('controller').onLoadOverrides.calledOnce).to.be.true;
+    });
+  });
+
+  describe('#makeCurrent()', function () {
+    beforeEach(function () {
+      sinon.stub(App.ModalPopup, 'show', function (options) {
+        options.onPrimary.call(Em.Object.create({
+          serviceConfigNote: 'note',
+          hide: Em.K
+        }));
+      });
+      sinon.stub(view, 'sendRevertCall', Em.K);
+    });
+    afterEach(function () {
+      App.ModalPopup.show.restore();
+      view.sendRevertCall.restore();
+    });
+    it('context passed', function () {
+      view.makeCurrent({contexts: [
+        Em.Object.create({
+          version: 1,
+          serviceName: 'S1'
+        })
+      ]});
+
+      expect(App.ModalPopup.show.calledOnce).to.be.true;
+      expect(view.sendRevertCall.calledWith(Em.Object.create({
+        version: 1,
+        serviceName: 'S1',
+        serviceConfigNote: 'note'
+      }))).to.be.true;
+    });
+  });
+
+  describe('#sendRevertCall()', function () {
+
+    beforeEach(function () {
+      view.sendRevertCall(Em.Object.create());
+    });
+
+    it('request is sent', function () {
+      var args = testHelpers.findAjaxRequest('name', 'service.serviceConfigVersion.revert');
+      expect(args).exists;
+    });
+  });
+
+  describe('#sendRevertCallSuccess()', function () {
+    beforeEach(function () {
+      sinon.spy(view.get('controller'), 'loadStep');
+      sinon.stub(App.router.get('updateController'), 'updateComponentConfig', Em.K);
+      view.sendRevertCallSuccess();
+    });
+    afterEach(function () {
+      view.get('controller').loadStep.restore();
+      App.router.get('updateController').updateComponentConfig.restore();
+    });
+
+    it('loadStep is called', function () {
+      expect(view.get('controller').loadStep.calledOnce).to.be.true;
+    });
+
+    it('updateComponentConfig is called', function () {
+      expect(App.router.get('updateController').updateComponentConfig.calledOnce).to.be.true;
+    });
+  });
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/test/views/common/configs/service_config_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/configs/service_config_view_test.js b/ambari-web/test/views/common/configs/service_config_view_test.js
index 8a01d72..6d0bab7 100644
--- a/ambari-web/test/views/common/configs/service_config_view_test.js
+++ b/ambari-web/test/views/common/configs/service_config_view_test.js
@@ -24,7 +24,10 @@ describe('App.ServiceConfigView', function () {
 
   var controller = App.WizardStep7Controller.create({
     selectedServiceObserver: Em.K,
-    switchConfigGroupConfigs: Em.K
+    switchConfigGroupConfigs: Em.K,
+    saveStepConfigs: Em.K,
+    content: Em.Object.create(),
+    selectedConfigGroup: Em.Object.create()
   });
 
   var view = App.ServiceConfigView.create({
@@ -157,4 +160,51 @@ describe('App.ServiceConfigView', function () {
 
   });
 
+  describe('#save()', function () {
+
+    beforeEach(function () {
+      sinon.spy(App.ModalPopup, 'show', Em.K);
+      sinon.stub(App.ServiceConfigVersion, 'find').returns([
+        { serviceName: 'service'}
+      ]);
+      sinon.stub(view.get('controller'), 'saveStepConfigs');
+    });
+
+    afterEach(function () {
+      App.ModalPopup.show.restore();
+      App.ServiceConfigVersion.find.restore();
+      view.get('controller').saveStepConfigs.restore();
+    });
+
+    it('modal popup should be displayed', function () {
+      view.save();
+      expect(App.ModalPopup.show.calledOnce).to.be.true;
+    });
+
+    it('controller properties should be modified on save', function () {
+      view.setProperties({
+        'serviceName': 'service',
+        'controller.saveConfigsFlag': false,
+        'controller.serviceConfigVersionNote': '',
+        'controller.preSelectedConfigVersion': null,
+        'controller.content.serviceName': 'service',
+        'controller.selectedConfigGroup.name': 'group'
+      });
+      var popup = view.save();
+      popup.set('serviceConfigNote', 'note');
+      popup.onSave();
+      expect(view.get('controller.saveConfigsFlag')).to.be.true;
+      expect(view.get('controller').getProperties(['saveConfigsFlag', 'serviceConfigVersionNote', 'preSelectedConfigVersion'])).to.eql({
+        saveConfigsFlag: true,
+        serviceConfigVersionNote: 'note',
+        preSelectedConfigVersion: Em.Object.create({
+          version: 2,
+          serviceName: 'service',
+          groupName: 'group'
+        })
+      });
+      expect(view.get('controller').saveStepConfigs.calledOnce).to.be.true;
+    });
+  });
+
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/2e9c9646/ambari-web/test/views/common/host_progress_popup_body_view_test.js
----------------------------------------------------------------------
diff --git a/ambari-web/test/views/common/host_progress_popup_body_view_test.js b/ambari-web/test/views/common/host_progress_popup_body_view_test.js
index 7f905ea..93e8efb 100644
--- a/ambari-web/test/views/common/host_progress_popup_body_view_test.js
+++ b/ambari-web/test/views/common/host_progress_popup_body_view_test.js
@@ -295,24 +295,27 @@ describe('App.HostProgressPopupBodyView', function () {
 
       it("setBackgroundOperationHeader should be called", function() {
         view.set('parentView.isOpen', true);
+        view.resetState();
         expect(view.get('controller').setBackgroundOperationHeader.calledWith(false)).to.be.true;
       });
 
       it("controller.hosts should be empty", function() {
         view.set('controller.hosts', [Em.Object.create({})]);
         view.set('parentView.isOpen', true);
+        view.resetState();
         expect(view.get('controller.hosts')).to.be.empty;
       });
 
       it("setOnStart should be called", function() {
         view.set('parentView.isOpen', true);
-        //console.log("setOnStart.callCount:", view.setOnStart.callCount);
-        expect(view.setOnStart.calledOnce, "calledOnce").to.be.true;
+        view.resetState();
+        expect(view.setOnStart.called).to.be.true;
       });
 
       it("rerender should be called", function() {
         view.set('parentView.isOpen', true);
-        expect(view.rerender.calledOnce).to.be.true;
+        view.resetState();
+        expect(view.rerender.called).to.be.true;
       });
     });
 


[12/13] ambari git commit: AMBARI-22587. Storm service check failed during PU due to CNF StormAtlasHook (ncole)

Posted by rl...@apache.org.
AMBARI-22587. Storm service check failed during PU due to CNF StormAtlasHook (ncole)


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

Branch: refs/heads/branch-feature-AMBARI-20859
Commit: c7cc5607e78991726753ef5d968d6cf2378c5f5b
Parents: 0afe0c0
Author: Nate Cole <nc...@hortonworks.com>
Authored: Mon Dec 4 14:58:25 2017 -0500
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Mon Dec 4 14:58:25 2017 -0500

----------------------------------------------------------------------
 .../main/resources/stacks/HDP/2.0.6/properties/stack_packages.json  | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/c7cc5607/ambari-server/src/main/resources/stacks/HDP/2.0.6/properties/stack_packages.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.0.6/properties/stack_packages.json b/ambari-server/src/main/resources/stacks/HDP/2.0.6/properties/stack_packages.json
index 946686a..62a46b9 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.0.6/properties/stack_packages.json
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.6/properties/stack_packages.json
@@ -1268,6 +1268,7 @@
       }
     },
     "upgrade-dependencies" : {
+      "ATLAS": ["STORM"],
       "HIVE": ["TEZ", "MAPREDUCE2"],
       "TEZ": ["HIVE"],
       "MAPREDUCE2": ["HIVE"],