http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --cc 
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
index 4f57881,455814a..6118229
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
@@@ -130,9 -107,8 +132,10 @@@ import org.apache.ambari.server.control
  import org.apache.ambari.server.controller.metrics.MetricsCollectorHAManager;
  import 
org.apache.ambari.server.controller.metrics.timeline.cache.TimelineMetricCacheProvider;
  import org.apache.ambari.server.controller.spi.Resource;
+ import org.apache.ambari.server.controller.spi.SystemException;
  import org.apache.ambari.server.customactions.ActionDefinition;
 +import org.apache.ambari.server.events.MetadataUpdateEvent;
 +import org.apache.ambari.server.events.TopologyUpdateEvent;
  import org.apache.ambari.server.events.publishers.AmbariEventPublisher;
  import org.apache.ambari.server.metadata.ActionMetadata;
  import org.apache.ambari.server.metadata.RoleCommandOrder;
@@@ -353,26 -325,8 +358,29 @@@ public class AmbariManagementController
    protected OsFamily osFamily;
  
    @Inject
 +  private TopologyDeleteFormer topologyDeleteFormer;
 +
 +  @Inject
 +  private AmbariCustomCommandExecutionHelper 
ambariCustomCommandExecutionHelper;
 +
 +  @Inject
 +  private Provider<TopologyHolder> m_topologyHolder;
 +
 +  @Inject
 +  private Provider<MetadataHolder> m_metadataHolder;
 +
 +  @Inject
 +  private Provider<AgentConfigsHolder> m_agentConfigsHolder;
 +
 +  @Inject
 +  private Provider<HostLevelParamsHolder> m_hostLevelParamsHolder;
 +
 +  @Inject
 +  private ServiceComponentDesiredStateDAO serviceComponentDesiredStateDAO;
 +
++  @Inject
+   private RepositoryVersionHelper repoVersionHelper;
+ 
    /**
     * The KerberosHelper to help setup for enabling for disabling Kerberos
     */
@@@ -2595,7 -2469,12 +2610,8 @@@
      }
      StageUtils.useAmbariJdkInCommandParams(commandParams, configs);
  
 -    String repoInfo;
 -    try {
 -      repoInfo = repoVersionHelper.getRepoInfo(cluster, component, host);
 -    } catch (SystemException e) {
 -      throw new AmbariException("", e);
 -    }
++    // TODO add TODO to ambariMetaInfo.getRepoInfoString
 +    String repoInfo = ambariMetaInfo.getRepoInfoString(cluster, component, 
host);
      if (LOG.isDebugEnabled()) {
        LOG.debug("Sending repo information to agent, hostname={}, 
clusterName={}, stackInfo={}, repoInfo={}",
          scHost.getHostName(), clusterName, stackId.getStackId(), repoInfo);
@@@ -2665,9 -2572,9 +2681,10 @@@
      execCmd.setRoleParams(roleParams);
      execCmd.setCommandParams(commandParams);
  
 +    execCmd.setRepositoryFile(ambariMetaInfo.getCommandRepository(cluster, 
component, host));
+     execCmdWrapper.setVersions(cluster);
  
 -    if (execCmd.getConfigurationTags().containsKey("cluster-env")) {
 +    if ((execCmd != null) && 
(execCmd.getConfigurationTags().containsKey("cluster-env"))) {
        LOG.debug("AmbariManagementControllerImpl.createHostAction: created 
ExecutionCommand for host {}, role {}, roleCommand {}, and command ID {}, with 
cluster-env tags {}",
          execCmd.getHostname(), execCmd.getRole(), execCmd.getRoleCommand(), 
execCmd.getCommandId(), 
execCmd.getConfigurationTags().get("cluster-env").get("tag"));
      }
@@@ -5802,259 -5649,4 +5767,259 @@@
      return QuickLinkVisibilityControllerFactory.get(quickLinkProfileJson);
    }
  
 +  /**
 +   * Collects metadata info about clusters for agent.
 +   * @return metadata info about clusters
 +   * @throws AmbariException
 +   */
 +  public MetadataUpdateEvent getClustersMetadata() throws AmbariException {
 +    TreeMap<String, MetadataCluster> metadataClusters = new TreeMap<>();
 +
 +    for (Cluster cl : clusters.getClusters().values()) {
 +      StackId stackId = cl.getDesiredStackVersion();
 +
 +      SecurityType securityType = cl.getSecurityType();
 +
 +      TreeMap<String, MetadataServiceInfo> serviceLevelParams = new 
TreeMap<>();
 +      Collection<ServiceInfo> servicesInfo = 
ambariMetaInfo.getServices(stackId.getStackName(),
 +          stackId.getStackVersion()).values();
 +      for (ServiceInfo serviceInfo : servicesInfo) {
 +        Long statusCommandTimeout = null;
 +        if (serviceInfo.getCommandScript() != null) {
 +          statusCommandTimeout = new Long 
(ambariCustomCommandExecutionHelper.getStatusCommandTimeout(serviceInfo));
 +        }
 +
 +        String servicePackageFolder = serviceInfo.getServicePackageFolder();
 +
 +        serviceLevelParams.put(serviceInfo.getName(),
 +            new MetadataServiceInfo(serviceInfo.getVersion(),
 +                serviceInfo.isCredentialStoreEnabled(),
 +                statusCommandTimeout,
 +                servicePackageFolder));
 +      }
 +
 +      MetadataCluster metadataCluster = new MetadataCluster(securityType,
 +          serviceLevelParams,
 +          getMetadataClusterLevelParams(cl, stackId));
 +      metadataClusters.put(Long.toString(cl.getClusterId()), metadataCluster);
 +    }
 +
 +    MetadataUpdateEvent metadataUpdateEvent = new 
MetadataUpdateEvent(metadataClusters,
 +        getMetadataAmbariLevelParams());
 +    return metadataUpdateEvent;
 +  }
 +
 +  public MetadataUpdateEvent getClusterMetadata(Cluster cl) throws 
AmbariException {
 +    TreeMap<String, MetadataCluster> metadataClusters = new TreeMap<>();
 +    StackId stackId = cl.getDesiredStackVersion();
 +
 +    SecurityType securityType = cl.getSecurityType();
 +
 +    TreeMap<String, MetadataServiceInfo> serviceLevelParams = new TreeMap<>();
 +    Collection<ServiceInfo> servicesInfo = 
ambariMetaInfo.getServices(stackId.getStackName(),
 +        stackId.getStackVersion()).values();
 +    for (ServiceInfo serviceInfo : servicesInfo) {
 +      Long statusCommandTimeout = null;
 +      if (serviceInfo.getCommandScript() != null) {
 +        statusCommandTimeout = new 
Long(ambariCustomCommandExecutionHelper.getStatusCommandTimeout(serviceInfo));
 +      }
 +
 +      String servicePackageFolder = serviceInfo.getServicePackageFolder();
 +
 +      serviceLevelParams.put(serviceInfo.getName(),
 +          new MetadataServiceInfo(serviceInfo.getVersion(),
 +              serviceInfo.isCredentialStoreEnabled(),
 +              statusCommandTimeout,
 +              servicePackageFolder));
 +    }
 +
 +    MetadataCluster metadataCluster = new MetadataCluster(securityType,
 +        serviceLevelParams,
 +        getMetadataClusterLevelParams(cl, stackId));
 +    metadataClusters.put(Long.toString(cl.getClusterId()), metadataCluster);
 +
 +    MetadataUpdateEvent metadataUpdateEvent = new 
MetadataUpdateEvent(metadataClusters,
 +        null);
 +    return metadataUpdateEvent;
 +  }
 +
 +  public MetadataUpdateEvent getClusterMetadataOnConfigsUpdate(Cluster cl) 
throws AmbariException {
 +    TreeMap<String, MetadataCluster> metadataClusters = new TreeMap<>();
 +    StackId stackId = cl.getDesiredStackVersion();
 +
 +    MetadataCluster metadataCluster = new MetadataCluster(null,
 +        new TreeMap<>(),
 +        getMetadataClusterLevelConfigsParams(cl, stackId));
 +    metadataClusters.put(Long.toString(cl.getClusterId()), metadataCluster);
 +
 +    MetadataUpdateEvent metadataUpdateEvent = new 
MetadataUpdateEvent(metadataClusters,
 +        null);
 +    return metadataUpdateEvent;
 +  }
 +
 +  private String getClientsToUpdateConfigs(ComponentInfo componentInfo) {
 +    List<String> clientsToUpdateConfigsList = 
componentInfo.getClientsToUpdateConfigs();
 +    if (clientsToUpdateConfigsList == null) {
 +      clientsToUpdateConfigsList = new ArrayList<>();
 +      clientsToUpdateConfigsList.add("*");
 +    }
 +    return gson.toJson(clientsToUpdateConfigsList);
 +  }
 +
 +  private Boolean getUnlimitedKeyJCERequirement(ComponentInfo componentInfo, 
SecurityType clusterSecurityType) {
 +    UnlimitedKeyJCERequirement unlimitedKeyJCERequirement = 
componentInfo.getUnlimitedKeyJCERequired();
 +    // Ensure that the unlimited key requirement is set. If null, the default 
value should be used.
 +    if(unlimitedKeyJCERequirement == null) {
 +      unlimitedKeyJCERequirement = UnlimitedKeyJCERequirement.DEFAULT;
 +    }
 +
 +    return (UnlimitedKeyJCERequirement.ALWAYS == unlimitedKeyJCERequirement) 
||
 +        ((UnlimitedKeyJCERequirement.KERBEROS_ENABLED == 
unlimitedKeyJCERequirement) &&
 +            (clusterSecurityType == SecurityType.KERBEROS));
 +
 +  }
 +
 +  //TODO will be a need to change to multi-instance usage
 +  public TreeMap<String, String> getTopologyComponentLevelParams(StackId 
stackId, String serviceName, String componentName,
 +                                                             SecurityType 
clusterSecurityType) throws AmbariException {
 +    ComponentInfo componentInfo = ambariMetaInfo.getComponent(
 +        stackId.getStackName(), stackId.getStackVersion(),
 +        serviceName, componentName);
 +
 +    TreeMap<String, String> statusCommandParams = new TreeMap<>();
 +    
statusCommandParams.put(ExecutionCommand.KeyNames.CLIENTS_TO_UPDATE_CONFIGS,
 +        getClientsToUpdateConfigs(componentInfo));
 +    
statusCommandParams.put(ExecutionCommand.KeyNames.UNLIMITED_KEY_JCE_REQUIRED,
 +         Boolean.toString(getUnlimitedKeyJCERequirement(componentInfo, 
clusterSecurityType)));
 +    return statusCommandParams;
 +  }
 +
 +  //TODO will be a need to change to multi-instance usage
 +  public TreeMap<String, String> getTopologyCommandParams(StackId stackId, 
String serviceName, String componentName) throws AmbariException {
 +    ServiceInfo serviceInfo = 
ambariMetaInfo.getService(stackId.getStackName(),
 +        stackId.getStackVersion(), serviceName);
 +    ComponentInfo componentInfo = ambariMetaInfo.getComponent(
 +        stackId.getStackName(), stackId.getStackVersion(),
 +        serviceName, componentName);
 +
 +    String scriptName = null;
 +    String scriptCommandTimeout = "";
 +    CommandScriptDefinition script = componentInfo.getCommandScript();
 +    if 
(serviceInfo.getSchemaVersion().equals(AmbariMetaInfo.SCHEMA_VERSION_2)) {
 +      if (script != null) {
 +        scriptName = script.getScript();
 +        if (script.getTimeout() > 0) {
 +          scriptCommandTimeout = String.valueOf(script.getTimeout());
 +        }
 +      } else {
 +        String message = String.format("Component %s of service %s has not " +
 +            "command script defined", componentName, serviceName);
 +        throw new AmbariException(message);
 +      }
 +    }
 +    String agentDefaultCommandTimeout = 
configs.getDefaultAgentTaskTimeout(false);
 +    String actualTimeout = (!scriptCommandTimeout.equals("") ? 
scriptCommandTimeout : agentDefaultCommandTimeout);
 +
 +    TreeMap<String, String> commandParams = new TreeMap<>();
 +    commandParams.put(COMMAND_TIMEOUT, actualTimeout);
 +    commandParams.put(SCRIPT, scriptName);
 +    commandParams.put(SCRIPT_TYPE, script.getScriptType().toString());
 +    return commandParams;
 +  }
 +
 +  public TreeMap<String, String> getMetadataClusterLevelParams(Cluster 
cluster, StackId stackId) throws AmbariException {
 +    TreeMap<String, String> clusterLevelParams = new TreeMap<>();
 +    clusterLevelParams.put(STACK_NAME, stackId.getStackName());
 +    clusterLevelParams.put(STACK_VERSION, stackId.getStackVersion());
 +
 +    Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs();
 +    if (MapUtils.isNotEmpty(desiredConfigs)) {
 +
 +      Set<String> userSet = 
configHelper.getPropertyValuesWithPropertyType(stackId, PropertyType.USER, 
cluster, desiredConfigs);
 +      String userList = gson.toJson(userSet);
 +      clusterLevelParams.put(USER_LIST, userList);
 +
 +      //Create a user_group mapping and send it as part of the hostLevelParams
 +      Map<String, Set<String>> userGroupsMap = 
configHelper.createUserGroupsMap(
 +          stackId, cluster, desiredConfigs);
 +      String userGroups = gson.toJson(userGroupsMap);
 +      clusterLevelParams.put(USER_GROUPS, userGroups);
 +
 +      Set<String> groupSet = 
configHelper.getPropertyValuesWithPropertyType(stackId, PropertyType.GROUP, 
cluster, desiredConfigs);
 +      String groupList = gson.toJson(groupSet);
 +      clusterLevelParams.put(GROUP_LIST, groupList);
 +    }
 +    Set<String> notManagedHdfsPathSet = 
configHelper.getPropertyValuesWithPropertyType(stackId,
 +        PropertyType.NOT_MANAGED_HDFS_PATH, cluster, desiredConfigs);
 +    String notManagedHdfsPathList = gson.toJson(notManagedHdfsPathSet);
 +    clusterLevelParams.put(NOT_MANAGED_HDFS_PATH_LIST, 
notManagedHdfsPathList);
 +
 +    clusterLevelParams.put(CLUSTER_NAME, cluster.getClusterName());
 +
 +    StackInfo stackInfo = ambariMetaInfo.getStack(stackId.getStackName(), 
stackId.getStackVersion());
-     clusterLevelParams.put(HOOKS_FOLDER, StackManager.DEFAULT_HOOKS_FOLDER);
++    clusterLevelParams.put(HOOKS_FOLDER, 
configs.getProperty(Configuration.HOOKS_FOLDER));
 +
 +    return clusterLevelParams;
 +  }
 +
 +  public TreeMap<String, String> getMetadataClusterLevelConfigsParams(Cluster 
cluster, StackId stackId) throws AmbariException {
 +    TreeMap<String, String> clusterLevelParams = new TreeMap<>();
 +
 +    Map<String, DesiredConfig> desiredConfigs = cluster.getDesiredConfigs();
 +    if (MapUtils.isNotEmpty(desiredConfigs)) {
 +
 +      Set<String> userSet = 
configHelper.getPropertyValuesWithPropertyType(stackId, PropertyType.USER, 
cluster, desiredConfigs);
 +      String userList = gson.toJson(userSet);
 +      clusterLevelParams.put(USER_LIST, userList);
 +
 +      //Create a user_group mapping and send it as part of the hostLevelParams
 +      Map<String, Set<String>> userGroupsMap = 
configHelper.createUserGroupsMap(
 +          stackId, cluster, desiredConfigs);
 +      String userGroups = gson.toJson(userGroupsMap);
 +      clusterLevelParams.put(USER_GROUPS, userGroups);
 +
 +      Set<String> groupSet = 
configHelper.getPropertyValuesWithPropertyType(stackId, PropertyType.GROUP, 
cluster, desiredConfigs);
 +      String groupList = gson.toJson(groupSet);
 +      clusterLevelParams.put(GROUP_LIST, groupList);
 +    }
 +    Set<String> notManagedHdfsPathSet = 
configHelper.getPropertyValuesWithPropertyType(stackId,
 +        PropertyType.NOT_MANAGED_HDFS_PATH, cluster, desiredConfigs);
 +    String notManagedHdfsPathList = gson.toJson(notManagedHdfsPathSet);
 +    clusterLevelParams.put(NOT_MANAGED_HDFS_PATH_LIST, 
notManagedHdfsPathList);
 +
 +    return clusterLevelParams;
 +  }
 +
 +  public TreeMap<String, String> getMetadataAmbariLevelParams() throws 
AmbariException {
 +    TreeMap<String, String> clusterLevelParams = new TreeMap<>();
 +    clusterLevelParams.put(JDK_LOCATION, getJdkResourceUrl());
 +    clusterLevelParams.put(JAVA_HOME, getJavaHome());
 +    clusterLevelParams.put(JAVA_VERSION, 
String.valueOf(configs.getJavaVersion()));
 +    clusterLevelParams.put(JDK_NAME, getJDKName());
 +    clusterLevelParams.put(JCE_NAME, getJCEName());
 +    clusterLevelParams.put(DB_NAME, getServerDB());
 +    clusterLevelParams.put(MYSQL_JDBC_URL, getMysqljdbcUrl());
 +    clusterLevelParams.put(ORACLE_JDBC_URL, getOjdbcUrl());
 +    clusterLevelParams.put(DB_DRIVER_FILENAME, configs.getMySQLJarName());
 +    clusterLevelParams.putAll(getRcaParameters());
 +    clusterLevelParams.put(HOST_SYS_PREPPED, configs.areHostsSysPrepped());
 +    clusterLevelParams.put(AGENT_STACK_RETRY_ON_UNAVAILABILITY, 
configs.isAgentStackRetryOnInstallEnabled());
 +    clusterLevelParams.put(AGENT_STACK_RETRY_COUNT, 
configs.getAgentStackRetryOnInstallCount());
 +
 +    return clusterLevelParams;
 +  }
 +
 +  @Override
 +  public HostRepositories retrieveHostRepositories(Cluster cluster, Host 
host) throws AmbariException {
 +    List<ServiceComponentHost> hostComponents = 
cluster.getServiceComponentHosts(host.getHostName());
 +    Map<Long, CommandRepository> hostRepositories = new HashMap<>();
 +    Map<String, Long> componentsRepos = new HashMap<>();
 +    for (ServiceComponentHost serviceComponentHost : hostComponents) {
 +      CommandRepository commandRepository = 
ambariMetaInfo.getCommandRepository(cluster,
 +          serviceComponentHost.getServiceComponent(), host);
 +      hostRepositories.put(commandRepository.getM_repoVersionId(), 
commandRepository);
 +      componentsRepos.put(serviceComponentHost.getServiceComponentName(), 
commandRepository.getM_repoVersionId());
 +    }
 +    return new HostRepositories(hostRepositories, componentsRepos);
 +  }
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java
----------------------------------------------------------------------

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

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

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
----------------------------------------------------------------------
diff --cc 
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
index 99ecd76,482e5d2..759ec82
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/ComponentResourceProvider.java
@@@ -60,12 -60,12 +60,14 @@@ import org.apache.ambari.server.state.S
  import org.apache.ambari.server.state.ServiceComponentHost;
  import org.apache.ambari.server.state.StackId;
  import org.apache.ambari.server.state.State;
 +import org.apache.ambari.server.topology.TopologyDeleteFormer;
  import org.apache.commons.lang.StringUtils;
  import org.apache.commons.lang.Validate;
+ import org.slf4j.Logger;
+ import org.slf4j.LoggerFactory;
  
  import com.google.common.collect.Sets;
 +import com.google.inject.Inject;
  import com.google.inject.assistedinject.Assisted;
  import com.google.inject.assistedinject.AssistedInject;
  import com.google.inject.persist.Transactional;

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
----------------------------------------------------------------------
diff --cc 
ambari-server/src/main/java/org/apache/ambari/server/controller/internal/HostResourceProvider.java
index 5cc360f,5c740f1..519794e
--- 
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
@@@ -1034,12 -956,9 +1030,12 @@@ public class HostResourceProvider exten
        }
      }
      clusters.publishHostsDeletion(allClustersWithHosts, hostNames);
 +    TopologyUpdateEvent topologyUpdateEvent = new 
TopologyUpdateEvent(topologyUpdates,
 +        TopologyUpdateEvent.EventType.DELETE);
 +    topologyHolder.updateData(topologyUpdateEvent);
    }
  
-   private void validateHostInDeleteFriendlyState(HostRequest hostRequest, 
Clusters clusters, boolean forceDelete) throws AmbariException {
+   private void validateHostInDeleteFriendlyState(HostRequest hostRequest, 
Clusters clusters) throws AmbariException {
      Set<String> clusterNamesForHost = new HashSet<>();
      String hostName = hostRequest.getHostname();
      if (null != hostRequest.getClusterName()) {

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

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

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/state/DefaultServiceCalculatedState.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/state/FlumeServiceCalculatedState.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/state/HBaseServiceCalculatedState.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/state/HDFSServiceCalculatedState.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/state/HiveServiceCalculatedState.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/state/OozieServiceCalculatedState.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/state/YARNServiceCalculatedState.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/events/AmbariEvent.java
----------------------------------------------------------------------
diff --cc 
ambari-server/src/main/java/org/apache/ambari/server/events/AmbariEvent.java
index 47c83e7,0ece73b..5f410f5
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/events/AmbariEvent.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/events/AmbariEvent.java
@@@ -143,19 -143,10 +143,24 @@@ public abstract class AmbariEvent 
      USER_CREATED,
  
      /**
 +     * Host status has been changed.
 +     */
 +    HOST_STATUS_CHANGE,
 +
 +    /**
 +     * Host state has been changed.
 +     */
 +    HOST_STATE_CHANGE,
 +
 +    /**
 +     * Received new heartbeat with host info.
 +     */
-     HOST_HEARTBEAT_UPDATED;
++    HOST_HEARTBEAT_UPDATED,
++
++    /**
+      * Ambari configuration changed event;
+      */
+     AMBARI_CONFIGURATION_CHANGED;
 -
    }
  
    /**

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/events/ServiceComponentUninstalledEvent.java
----------------------------------------------------------------------
diff --cc 
ambari-server/src/main/java/org/apache/ambari/server/events/ServiceComponentUninstalledEvent.java
index 3e4d6a2,b91135f..b4ae216
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/events/ServiceComponentUninstalledEvent.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/events/ServiceComponentUninstalledEvent.java
@@@ -27,11 -27,21 +27,12 @@@ public class ServiceComponentUninstalle
    private final String m_componentName;
    private final String m_hostName;
    private final boolean m_recoveryEnabled;
 +  private final boolean masterComponent;
+   private final Long m_hostId;
  
 -  /**
 -   * Constructor.
 -   *
 -   * @param clusterId
 -   * @param stackName
 -   * @param stackVersion
 -   * @param serviceName
 -   * @param componentName
 -   * @param hostName
 -   */
    public ServiceComponentUninstalledEvent(long clusterId, String stackName,
        String stackVersion, String serviceName, String componentName,
-       String hostName, boolean recoveryEnabled, boolean masterComponent) {
 -      String hostName, boolean recoveryEnabled, Long hostId) {
++      String hostName, boolean recoveryEnabled, boolean masterComponent, Long 
hostId) {
      super(AmbariEventType.SERVICE_COMPONENT_UNINSTALLED_SUCCESS, clusterId,
          stackName,
          stackVersion, serviceName);
@@@ -39,7 -49,7 +40,8 @@@
      m_componentName = componentName;
      m_hostName = hostName;
      m_recoveryEnabled = recoveryEnabled;
 +    this.masterComponent = masterComponent;
+     m_hostId = hostId;
    }
  
    /**
@@@ -63,10 -73,10 +65,14 @@@
      return m_recoveryEnabled;
    }
  
 +  public boolean isMasterComponent() {
 +    return masterComponent;
 +  }
 +
+   public Long getHostId() {
+     return m_hostId;
+   }
+ 
    /**
     * {@inheritDoc}
     */

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertReceivedListener.java
----------------------------------------------------------------------
diff --cc 
ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertReceivedListener.java
index 33f172c,7198814..5aba046
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertReceivedListener.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/events/listeners/alerts/AlertReceivedListener.java
@@@ -26,11 -24,10 +26,11 @@@ import java.util.concurrent.locks.Lock
  
  import org.apache.ambari.server.AmbariException;
  import org.apache.ambari.server.EagerSingleton;
 +import org.apache.ambari.server.api.query.render.AlertSummaryGroupedRenderer;
  import org.apache.ambari.server.configuration.Configuration;
  import org.apache.ambari.server.controller.MaintenanceStateHelper;
- import 
org.apache.ambari.server.controller.RootServiceResponseFactory.Components;
- import 
org.apache.ambari.server.controller.RootServiceResponseFactory.Services;
+ import org.apache.ambari.server.controller.RootComponent;
+ import org.apache.ambari.server.controller.RootService;
  import org.apache.ambari.server.events.AlertEvent;
  import org.apache.ambari.server.events.AlertReceivedEvent;
  import org.apache.ambari.server.events.AlertStateChangeEvent;

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/orm/dao/AlertDefinitionDAO.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/state/ConfigHelper.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/state/ServiceImpl.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/state/alert/AlertDefinitionHash.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
----------------------------------------------------------------------
diff --cc 
ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
index bbbb613,8f5e4f4..b634fb2
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/cluster/ClusterImpl.java
@@@ -58,9 -57,8 +58,9 @@@ import org.apache.ambari.server.control
  import org.apache.ambari.server.controller.ClusterResponse;
  import org.apache.ambari.server.controller.ConfigurationResponse;
  import org.apache.ambari.server.controller.MaintenanceStateHelper;
- import 
org.apache.ambari.server.controller.RootServiceResponseFactory.Services;
+ import org.apache.ambari.server.controller.RootService;
  import org.apache.ambari.server.controller.ServiceConfigVersionResponse;
 +import 
org.apache.ambari.server.controller.internal.DeleteHostComponentStatusMetaData;
  import org.apache.ambari.server.events.AmbariEvent.AmbariEventType;
  import org.apache.ambari.server.events.ClusterConfigChangedEvent;
  import org.apache.ambari.server.events.ClusterEvent;

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/ClusterGrouping.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
----------------------------------------------------------------------
diff --cc 
ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
index 22bcfc7,e30c2ce..ef7d471
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/state/svccomphost/ServiceComponentHostImpl.java
@@@ -21,14 -21,11 +21,14 @@@ package org.apache.ambari.server.state.
  import java.text.MessageFormat;
  import java.util.Collections;
  import java.util.HashMap;
 -import java.util.List;
 +import java.util.HashSet;
- import java.util.List;
++ import java.util.List;
  import java.util.Map;
  import java.util.Map.Entry;
 +import java.util.TreeMap;
  import java.util.concurrent.ConcurrentHashMap;
  import java.util.concurrent.ConcurrentMap;
 +import java.util.concurrent.atomic.AtomicReference;
  import java.util.concurrent.locks.Lock;
  import java.util.concurrent.locks.ReadWriteLock;
  import java.util.concurrent.locks.ReentrantReadWriteLock;
@@@ -1387,15 -1280,9 +1387,15 @@@ public class ServiceComponentHostImpl i
  
        ServiceComponentUninstalledEvent event = new 
ServiceComponentUninstalledEvent(
            clusterId, stackName, stackVersion, serviceName, componentName,
-           hostName, recoveryEnabled, masterComponent);
 -          hostName, recoveryEnabled, host.getHostId());
++          hostName, recoveryEnabled, masterComponent, host.getHostId());
  
        eventPublisher.publish(event);
 +      deleteMetaData.addDeletedHostComponent(componentName,
 +          serviceName,
 +          hostName,
 +          getHost().getHostId(),
 +          Long.toString(clusterId),
 +          version);
      }
    }
  

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/topology/AmbariContext.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/upgrade/AbstractUpgradeCatalog.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog300.java
----------------------------------------------------------------------
diff --cc 
ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog300.java
index be6b960,2de6095..1ee1679
--- 
a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog300.java
+++ 
b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog300.java
@@@ -47,7 -45,7 +47,8 @@@ import org.apache.ambari.server.state.C
  import org.apache.ambari.server.state.Clusters;
  import org.apache.ambari.server.state.Config;
  import org.apache.ambari.server.state.ConfigHelper;
+ import org.apache.commons.collections.MapUtils;
 +import org.apache.ambari.server.state.State;
  import org.apache.commons.lang.StringUtils;
  import org.slf4j.Logger;
  import org.slf4j.LoggerFactory;
@@@ -68,15 -66,10 +69,11 @@@ public class UpgradeCatalog300 extends 
    protected static final String STAGE_DISPLAY_STATUS_COLUMN = 
"display_status";
    protected static final String REQUEST_TABLE = "request";
    protected static final String REQUEST_DISPLAY_STATUS_COLUMN = 
"display_status";
-   protected static final String CLUSTER_CONFIG_TABLE = "clusterconfig";
-   protected static final String CLUSTER_CONFIG_SELECTED_COLUMN = "selected";
-   protected static final String CLUSTER_CONFIG_SELECTED_TIMESTAMP_COLUMN = 
"selected_timestamp";
    protected static final String HOST_ROLE_COMMAND_TABLE = "host_role_command";
    protected static final String HRC_OPS_DISPLAY_NAME_COLUMN = 
"ops_display_name";
-   protected static final String COMPONENT_TABLE = 
"servicecomponentdesiredstate";
    protected static final String COMPONENT_DESIRED_STATE_TABLE = 
"hostcomponentdesiredstate";
    protected static final String COMPONENT_STATE_TABLE = "hostcomponentstate";
 +  protected static final String COMPONENT_LAST_STATE_COLUMN = 
"last_live_state";
    protected static final String SERVICE_DESIRED_STATE_TABLE = 
"servicedesiredstate";
    protected static final String SECURITY_STATE_COLUMN = "security_state";
  
@@@ -126,7 -123,7 +127,8 @@@
      updateStageTable();
      addOpsDisplayNameColumnToHostRoleCommand();
      removeSecurityState();
+     addAmbariConfigurationTable();
 +    addHostComponentLastStateTable();
    }
  
    protected void updateStageTable() throws SQLException {
@@@ -138,11 -135,16 +140,21 @@@
          new DBAccessor.DBColumnInfo(REQUEST_DISPLAY_STATUS_COLUMN, 
String.class, 255, HostRoleStatus.PENDING, false));
    }
  
+   protected void addAmbariConfigurationTable() throws SQLException {
+     List<DBAccessor.DBColumnInfo> columns = new ArrayList<>();
+     columns.add(new 
DBAccessor.DBColumnInfo(AMBARI_CONFIGURATION_CATEGORY_NAME_COLUMN, 
String.class, 100, null, false));
+     columns.add(new 
DBAccessor.DBColumnInfo(AMBARI_CONFIGURATION_PROPERTY_NAME_COLUMN, 
String.class, 100, null, false));
+     columns.add(new 
DBAccessor.DBColumnInfo(AMBARI_CONFIGURATION_PROPERTY_VALUE_COLUMN, 
String.class, 255, null, true));
+ 
+     dbAccessor.createTable(AMBARI_CONFIGURATION_TABLE, columns);
+     dbAccessor.addPKConstraint(AMBARI_CONFIGURATION_TABLE, 
"PK_ambari_configuration", AMBARI_CONFIGURATION_CATEGORY_NAME_COLUMN, 
AMBARI_CONFIGURATION_PROPERTY_NAME_COLUMN);
+   }
+ 
 +  protected void addHostComponentLastStateTable() throws SQLException {
 +    dbAccessor.addColumn(COMPONENT_STATE_TABLE,
 +        new DBAccessor.DBColumnInfo(COMPONENT_LAST_STATE_COLUMN, 
String.class, 255, State.UNKNOWN, true));
 +  }
 +
    /**
     * {@inheritDoc}
     */
@@@ -159,7 -161,7 +171,8 @@@
      showHcatDeletedUserMessage();
      setStatusOfStagesAndRequests();
      updateLogSearchConfigs();
+     updateKerberosConfigurations();
 +    updateHostComponentLastStateTable();
    }
  
    protected void showHcatDeletedUserMessage() {
@@@ -358,21 -360,27 +371,45 @@@
      }
    }
  
+   protected void updateKerberosConfigurations() throws AmbariException {
+     AmbariManagementController ambariManagementController = 
injector.getInstance(AmbariManagementController.class);
+     Clusters clusters = ambariManagementController.getClusters();
+     if (clusters != null) {
+       Map<String, Cluster> clusterMap = clusters.getClusters();
+ 
+       if (!MapUtils.isEmpty(clusterMap)) {
+         for (Cluster cluster : clusterMap.values()) {
+           Config config = cluster.getDesiredConfigByType("kerberos-env");
+ 
+           if (config != null) {
+             Map<String, String> properties = config.getProperties();
+             if (properties.containsKey("group")) {
+               // Covert kerberos-env/group to kerberos-env/ipa_user_group
+               updateConfigurationPropertiesForCluster(cluster, "kerberos-env",
+                   Collections.singletonMap("ipa_user_group", 
properties.get("group")), Collections.singleton("group"),
+                   true, false);
+             }
+           }
+         }
+       }
+     }
+   }
++
 +  protected void updateHostComponentLastStateTable() throws SQLException {
 +    executeInTransaction(new Runnable() {
 +      @Override
 +      public void run() {
 +        try {
 +          HostComponentStateDAO hostComponentStateDAO = 
injector.getInstance(HostComponentStateDAO.class);
 +          List<HostComponentStateEntity> hostComponentStateEntities = 
hostComponentStateDAO.findAll();
 +          for (HostComponentStateEntity hostComponentStateEntity : 
hostComponentStateEntities) {
 +            
hostComponentStateEntity.setLastLiveState(hostComponentStateEntity.getCurrentState());
 +            hostComponentStateDAO.merge(hostComponentStateEntity);
 +          }
 +        } catch (Exception e) {
 +          LOG.warn("Setting status for stages and Requests threw exception. 
", e);
 +        }
 +      }
 +    });
 +  }
  }

http://git-wip-us.apache.org/repos/asf/ambari/blob/366f6ca9/ambari-server/src/main/java/org/apache/ambari/server/view/ViewRegistry.java
----------------------------------------------------------------------

Reply via email to