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

[1/4] ambari git commit: AMBARI-20871. Unify repository file creation (ncole)

Repository: ambari
Updated Branches:
  refs/heads/branch-feature-AMBARI-12556 13d806b85 -> b68662490


http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/test/python/stacks/2.0.6/hooks/before-INSTALL/test_before_install.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/hooks/before-INSTALL/test_before_install.py b/ambari-server/src/test/python/stacks/2.0.6/hooks/before-INSTALL/test_before_install.py
index 082d200..008a1e7 100644
--- a/ambari-server/src/test/python/stacks/2.0.6/hooks/before-INSTALL/test_before_install.py
+++ b/ambari-server/src/test/python/stacks/2.0.6/hooks/before-INSTALL/test_before_install.py
@@ -61,3 +61,33 @@ class TestHookBeforeInstall(RMFTestCase):
     self.assertResourceCalled('Package', 'unzip', retry_count=5, retry_on_repo_unavailability=False)
     self.assertResourceCalled('Package', 'curl', retry_count=5, retry_on_repo_unavailability=False)
     self.assertNoMoreResources()
+
+
+
+  def test_hook_default_repository_file(self):
+    self.executeScript("2.0.6/hooks/before-INSTALL/scripts/hook.py",
+                       classname="BeforeInstallHook",
+                       command="hook",
+                       config_file="repository_file.json"
+    )
+    self.assertResourceCalled('Repository', 'HDP-2.2-repo-4',
+        action=['create'],
+        base_url='http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
+        components=['HDP', 'main'],
+        mirror_list=None,
+        repo_file_name='ambari-hdp-4',
+        repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0',
+        append_to_file=False)
+
+    self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20-repo-4',
+        action=['create'],
+        base_url='http://repo1/HDP-UTILS/centos5/2.x/updates/2.2.0.0',
+        components=['HDP-UTILS', 'main'],
+        mirror_list=None,
+        repo_file_name='ambari-hdp-4',
+        repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0',
+        append_to_file=True)
+
+    self.assertResourceCalled('Package', 'unzip', retry_count=5, retry_on_repo_unavailability=False)
+    self.assertResourceCalled('Package', 'curl', retry_count=5, retry_on_repo_unavailability=False)
+    self.assertNoMoreResources()


[4/4] ambari git commit: AMBARI-20871. Unify repository file creation (ncole)

Posted by nc...@apache.org.
AMBARI-20871. Unify repository file creation (ncole)


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

Branch: refs/heads/branch-feature-AMBARI-12556
Commit: b68662490a64277f4d5eb7ae18b54850678deff2
Parents: 13d806b
Author: Nate Cole <nc...@hortonworks.com>
Authored: Thu Apr 27 10:15:29 2017 -0400
Committer: Nate Cole <nc...@hortonworks.com>
Committed: Thu Apr 27 16:11:15 2017 -0400

----------------------------------------------------------------------
 .../libraries/functions/repository_util.py      |  127 ++
 .../ambari/server/agent/CommandRepository.java  |  170 +++
 .../ambari/server/agent/ExecutionCommand.java   |   32 +-
 .../commands/StackAdvisorCommand.java           |    6 +-
 .../DistributeRepositoriesStructuredOutput.java |   12 -
 .../controller/ActionExecutionContext.java      |   35 +
 .../controller/AmbariActionExecutionHelper.java |    2 +
 .../AmbariCustomCommandExecutionHelper.java     |  222 ++-
 .../AmbariManagementControllerImpl.java         |    4 +-
 .../ClusterStackVersionResourceProvider.java    |  105 +-
 .../HostStackVersionResourceProvider.java       |   70 +-
 .../stack/upgrade/RepositoryVersionHelper.java  |  130 +-
 .../custom_actions/scripts/install_packages.py  |   63 +-
 .../hooks/before-INSTALL/scripts/params.py      |    2 +
 .../scripts/repo_initialization.py              |   22 +-
 ...ClusterStackVersionResourceProviderTest.java |   19 +-
 .../HostStackVersionResourceProviderTest.java   |    3 +-
 .../upgrades/UpgradeActionTest.java             |   15 +-
 .../UpdateActiveRepoVersionOnStartupTest.java   |   25 +-
 .../upgrade/RepositoryVersionHelperTest.java    |   27 +-
 .../custom_actions/TestInstallPackages.py       |  118 +-
 .../install_packages_repository_file.json       |  112 ++
 .../stacks/2.0.6/configs/repository_file.json   | 1275 ++++++++++++++++++
 .../hooks/before-INSTALL/test_before_install.py |   30 +
 24 files changed, 2293 insertions(+), 333 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py b/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py
new file mode 100644
index 0000000..c9920e2
--- /dev/null
+++ b/ambari-common/src/main/python/resource_management/libraries/functions/repository_util.py
@@ -0,0 +1,127 @@
+"""
+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.
+
+"""
+
+from resource_management.core.exceptions import Fail
+from resource_management.core.logger import Logger
+from resource_management.libraries.resources.repository import Repository
+import ambari_simplejson as json
+
+
+__all__ = ["create_repo_files", "CommandRepository"]
+
+# components_lits = repoName + postfix
+UBUNTU_REPO_COMPONENTS_POSTFIX = ["main"]
+
+
+def create_repo_files(template, command_repository):
+  """
+  Creates repositories in a consistent manner for all types
+  :param command_repository: a CommandRepository instance
+  :return:
+  """
+
+  if command_repository.version_id is None:
+    raise Fail("The command repository was not parsed correctly")
+
+  if 0 == len(command_repository.repositories):
+    raise Fail("Cannot create repository files when no repositories are defined")
+
+  # add the stack name to the file name just to make it a little easier to debug
+  # version_id is the primary id of the repo_version table in the database
+  file_name = "ambari-{0}-{1}".format(command_repository.stack_name.lower(),
+                                      command_repository.version_id)
+
+  append_to_file = False  # initialize to False to create the file anew.
+
+  for repository in command_repository.repositories:
+
+    if repository.repo_id is None:
+      raise Fail("Repository with url {0} has no id".format(repository.base_url))
+
+    Repository(repository.repo_id,
+               action = "create",
+               base_url = repository.base_url,
+               mirror_list = repository.mirrors_list,
+               repo_file_name = file_name,
+               repo_template = template,
+               components = repository.ubuntu_components,
+               append_to_file = append_to_file)
+    append_to_file = True
+
+
+def _find_value(dictionary, key):
+  """
+  Helper to find a value in a dictionary
+  """
+  if key not in dictionary:
+    return None
+
+  return dictionary[key]
+
+
+class CommandRepository(object):
+  """
+  Class that encapsulates the representation of repositories passed in a command.  This class
+  should match the CommandRepository class.
+  """
+
+  def __init__(self, jsonvalue):
+
+    if isinstance(jsonvalue, dict):
+      json_dict = jsonvalue
+    elif isinstance(jsonvalue, basestring):
+      json_dict = json.loads(jsonvalue)
+
+    if json_dict is None:
+      raise Fail("Cannot deserialize command repository {0}".format(str(jsonvalue)))
+
+    # version_id is the primary id of the repo_version table in the database
+    self.version_id = _find_value(json_dict, 'repoVersionId')
+    self.stack_name = _find_value(json_dict, 'stackName')
+    self.repositories = []
+
+    repos_def = _find_value(json_dict, 'repositories')
+    if repos_def is not None:
+       if not isinstance(repos_def, list):
+         repos_def = [repos_def]
+
+       for repo_def in repos_def:
+         self.repositories.append(_CommandRepositoryEntry(repo_def))
+
+
+class _CommandRepositoryEntry(object):
+  """
+  Class that represents the entries of a CommandRepository.  This isn't meant to be instantiated
+  outside a CommandRepository
+  """
+  def __init__(self, json_dict):
+    self.repo_id = _find_value(json_dict, 'repoId')  # this is the id within the repo file, not an Ambari artifact
+    self.repo_name = _find_value(json_dict, 'repoName')
+    self.base_url = _find_value(json_dict, 'baseUrl')
+    self.mirrors_list = _find_value(json_dict, 'mirrorsList')
+
+    # if repoName is changed on the java side, this will fail for ubuntu since we rely on the
+    # name being the same as how the repository was built
+    self.ubuntu_components = [self.repo_name] + UBUNTU_REPO_COMPONENTS_POSTFIX
+
+
+
+
+
+

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandRepository.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandRepository.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandRepository.java
new file mode 100644
index 0000000..849d6fb
--- /dev/null
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/CommandRepository.java
@@ -0,0 +1,170 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.agent;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.apache.ambari.server.orm.entities.RepositoryEntity;
+import org.apache.ambari.server.state.RepositoryInfo;
+
+import com.google.gson.annotations.SerializedName;
+
+/**
+ * Wraps the information required to create repositories from a command.  This was added
+ * as a top level command object.
+ */
+public class CommandRepository {
+
+  @SerializedName("repositories")
+  private List<Repository> m_repositories = new ArrayList<>();
+
+  @SerializedName("repoVersion")
+  private String m_repoVersion;
+
+  @SerializedName("repoVersionId")
+  private long m_repoVersionId;
+
+  @SerializedName("stackName")
+  private String m_stackName;
+
+  /**
+   * @param version the repo version
+   */
+  public void setRepositoryVersion(String version) {
+    m_repoVersion = version;
+  }
+
+  /**
+   * @param id the repository id
+   */
+  public void setRepositoryVersionId(long id) {
+    m_repoVersionId = id;
+  }
+
+  /**
+   * @param name the stack name
+   */
+  public void setStackName(String name) {
+    m_stackName = name;
+  }
+
+  /**
+   * @param repositories the repositories if sourced from the stack instead of the repo_version.
+   */
+  public void setRepositories(Collection<RepositoryInfo> repositories) {
+    m_repositories = new ArrayList<>();
+
+    for (RepositoryInfo info : repositories) {
+      m_repositories.add(new Repository(info));
+    }
+  }
+
+  /**
+   * @param osType        the OS type for the repositories
+   * @param repositories  the repository entities that should be processed into a file
+   */
+  public void setRepositories(String osType, Collection<RepositoryEntity> repositories) {
+    m_repositories = new ArrayList<>();
+
+    for (RepositoryEntity entity : repositories) {
+      m_repositories.add(new Repository(osType, entity));
+    }
+  }
+
+  /**
+   * @return the repositories that the command should process into a file.
+   */
+  public Collection<Repository> getRepositories() {
+    return m_repositories;
+  }
+
+  /**
+   * Sets a uniqueness on the repo ids.
+   *
+   * @param suffix  the repo id suffix
+   */
+  public void setUniqueSuffix(String suffix) {
+    for (Repository repo : m_repositories) {
+      repo.m_repoId = repo.m_repoId + suffix;
+    }
+  }
+
+  /**
+   * Minimal information required to generate repo files on the agent.  These are copies
+   * of the repository objects from repo versions that can be changed for URL overrides, etc.
+   */
+  public static class Repository {
+
+    @SerializedName("baseUrl")
+    private String m_baseUrl;
+
+    @SerializedName("repoId")
+    private String m_repoId;
+
+    /**
+     * The name should not change.  Ubuntu requires that it match exactly as the repo was built.
+     */
+    @SerializedName("repoName")
+    private final String m_repoName;
+
+    @SerializedName("mirrorsList")
+    private String m_mirrorsList;
+
+    private transient String m_osType;
+
+    private Repository(RepositoryInfo info) {
+      m_baseUrl = info.getBaseUrl();
+      m_osType = info.getOsType();
+      m_repoId = info.getRepoId();
+      m_repoName = info.getRepoName();
+      m_mirrorsList = info.getMirrorsList();
+    }
+
+    private Repository(String osType, RepositoryEntity entity) {
+      m_baseUrl = entity.getBaseUrl();
+      m_repoId = entity.getRepositoryId();
+      m_repoName = entity.getName();
+      m_mirrorsList = entity.getMirrorsList();
+      m_osType = osType;
+    }
+
+    public void setBaseUrl(String url) {
+      m_baseUrl = url;
+    }
+
+    public String getOsType() {
+      return m_osType;
+    }
+
+    public String getRepoId() {
+      return m_repoId;
+    }
+
+    public String getRepoName() {
+      return m_repoName;
+    }
+
+
+    public String getBaseUrl() {
+      return m_baseUrl;
+    }
+  }
+
+}

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
index 8c726a0..bd62cbb 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/agent/ExecutionCommand.java
@@ -24,6 +24,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.ambari.annotations.Experimental;
+import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.RoleCommand;
 import org.apache.ambari.server.state.ServiceInfo;
 import org.apache.ambari.server.utils.StageUtils;
@@ -76,8 +78,7 @@ public class ExecutionCommand extends AgentCommand {
   private RoleCommand roleCommand;
 
   @SerializedName("clusterHostInfo")
-  private Map<String, Set<String>> clusterHostInfo =
-    new HashMap<>();
+  private Map<String, Set<String>> clusterHostInfo = new HashMap<>();
 
   @SerializedName("configurations")
   private Map<String, Map<String, String>> configurations;
@@ -144,6 +145,14 @@ public class ExecutionCommand extends AgentCommand {
   @SerializedName("configuration_credentials")
   private Map<String, Map<String, String>> configurationCredentials;
 
+
+  /**
+   * Provides information regarding the content of repositories.  This structure replaces
+   * the deprecated use of {@link KeyNames#REPO_INFO}
+   */
+  @SerializedName("repositoryFile")
+  private CommandRepository commandRepository;
+
   public void setConfigurationCredentials(Map<String, Map<String, String>> configurationCredentials) {
     this.configurationCredentials = configurationCredentials;
   }
@@ -395,6 +404,20 @@ public class ExecutionCommand extends AgentCommand {
   }
 
   /**
+   * @return the repository file that is to be written.
+   */
+  public CommandRepository getRepositoryFile() {
+    return commandRepository;
+  }
+
+  /**
+   * @param repository  the command repository instance.
+   */
+  public void setRepositoryFile(CommandRepository repository) {
+    commandRepository = repository;
+  }
+
+  /**
    * Contains key name strings. These strings are used inside maps
    * incapsulated inside command.
    */
@@ -420,6 +443,11 @@ public class ExecutionCommand extends AgentCommand {
     String ORACLE_JDBC_URL = "oracle_jdbc_url";
     String DB_DRIVER_FILENAME = "db_driver_filename";
     String CLIENTS_TO_UPDATE_CONFIGS = "clientsToUpdateConfigs";
+    /**
+     * Keep for backward compatibility.
+     */
+    @Deprecated
+    @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES)
     String REPO_INFO = "repo_info";
     String DB_NAME = "db_name";
     String GLOBAL = "global";

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommand.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommand.java b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommand.java
index 74a2cf2..a291a88 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommand.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/api/services/stackadvisor/commands/StackAdvisorCommand.java
@@ -348,13 +348,13 @@ public abstract class StackAdvisorCommand<T extends StackAdvisorResponse> extend
         return file.isDirectory() && !FileUtils.isFileNewer(file, cutoffDate);
       }
     });
-    
+
     if(oldDirectories.length > 0) {
       LOG.info(String.format("Deleting old directories %s from %s", StringUtils.join(oldDirectories, ", "), recommendationsDir));
     }
-    
+
     for(String oldDirectory:oldDirectories) {
-      FileUtils.deleteDirectory(new File(recommendationsDir, oldDirectory));
+      FileUtils.deleteQuietly(new File(recommendationsDir, oldDirectory));
     }
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/main/java/org/apache/ambari/server/bootstrap/DistributeRepositoriesStructuredOutput.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/bootstrap/DistributeRepositoriesStructuredOutput.java b/ambari-server/src/main/java/org/apache/ambari/server/bootstrap/DistributeRepositoriesStructuredOutput.java
index 662b856..7c961b5 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/bootstrap/DistributeRepositoriesStructuredOutput.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/bootstrap/DistributeRepositoriesStructuredOutput.java
@@ -19,8 +19,6 @@
 
 package org.apache.ambari.server.bootstrap;
 
-import java.util.List;
-
 import com.google.gson.annotations.SerializedName;
 
 /**
@@ -36,12 +34,6 @@ public class DistributeRepositoriesStructuredOutput {
   private String installedRepositoryVersion;
 
   /**
-   * All Ambari-managed repositories that are installed side by side on host
-   */
-  @SerializedName("ambari_repositories")
-  private List<String> ambariRepositories;
-
-  /**
    * Either SUCCESS or FAIL
    */
   @SerializedName("package_installation_result")
@@ -64,10 +56,6 @@ public class DistributeRepositoriesStructuredOutput {
     return installedRepositoryVersion;
   }
 
-  public List<String> getAmbariRepositories() {
-    return ambariRepositories;
-  }
-
   public String getPackageInstallationResult() {
     return packageInstallationResult;
   }

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java
index 3681eda..5566fe2 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/ActionExecutionContext.java
@@ -19,10 +19,12 @@
 
 package org.apache.ambari.server.controller;
 
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
 import org.apache.ambari.server.actionmanager.TargetHostType;
+import org.apache.ambari.server.agent.ExecutionCommand;
 import org.apache.ambari.server.controller.internal.RequestOperationLevel;
 import org.apache.ambari.server.controller.internal.RequestResourceFilter;
 
@@ -42,6 +44,8 @@ public class ActionExecutionContext {
   private boolean hostsInMaintenanceModeExcluded = true;
   private boolean allowRetry = false;
 
+  private List<ExecutionCommandVisitor> m_visitors = new ArrayList<>();
+
   /**
    * {@code true} if slave/client component failures should be automatically
    * skipped. This will only automatically skip the failure if the task is
@@ -168,6 +172,16 @@ public class ActionExecutionContext {
     this.autoSkipFailures = autoSkipFailures;
   }
 
+  /**
+   * Adds a command visitor that will be invoked after a command is created.  Provides access
+   * to the command.
+   *
+   * @param visitor the visitor
+   */
+  public void addVisitor(ExecutionCommandVisitor visitor) {
+    m_visitors.add(visitor);
+  }
+
   @Override
   public String toString() {
     return "ActionExecutionContext{" +
@@ -207,4 +221,25 @@ public class ActionExecutionContext {
     hostsInMaintenanceModeExcluded = excluded;
   }
 
+  /**
+   * Called as a way to post-process the command after it has been created and various objects
+   * have been set.
+   *
+   * @param command the command
+   */
+  public void visitAll(ExecutionCommand command) {
+    for (ExecutionCommandVisitor visitor : m_visitors) {
+      visitor.visit(command);
+    }
+  }
+
+  /**
+   * Interface that allows a final attempt to setting values on an {@link ExecutionCommand}
+   * @author ncole
+   *
+   */
+  public static interface ExecutionCommandVisitor {
+    public void visit(ExecutionCommand command);
+  }
+
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java
index d556b60..835d607 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariActionExecutionHelper.java
@@ -487,6 +487,8 @@ public class AmbariActionExecutionHelper {
           execCmd.getLocalComponents().add(sch.getServiceComponentName());
         }
       }
+
+      actionContext.visitAll(execCmd);
     }
   }
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
index ab8b659..d6905fb 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariCustomCommandExecutionHelper.java
@@ -58,6 +58,8 @@ import java.util.Random;
 import java.util.Set;
 import java.util.TreeMap;
 
+import org.apache.ambari.annotations.Experimental;
+import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.RoleCommand;
@@ -65,6 +67,7 @@ import org.apache.ambari.server.actionmanager.HostRoleCommand;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import org.apache.ambari.server.actionmanager.Stage;
 import org.apache.ambari.server.agent.AgentCommand.AgentCommandType;
+import org.apache.ambari.server.agent.CommandRepository;
 import org.apache.ambari.server.agent.ExecutionCommand;
 import org.apache.ambari.server.agent.ExecutionCommand.KeyNames;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
@@ -108,6 +111,7 @@ import org.apache.commons.lang.math.NumberUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.google.common.base.Function;
 import com.google.gson.Gson;
 import com.google.gson.JsonArray;
 import com.google.gson.JsonElement;
@@ -500,6 +504,8 @@ public class AmbariCustomCommandExecutionHelper {
       execCmd.setCommandParams(commandParams);
       execCmd.setRoleParams(roleParams);
 
+      execCmd.setRepositoryFile(getCommandRepository(cluster, host));
+
       // perform any server side command related logic - eg - set desired states on restart
       applyCustomCommandBackendLogic(cluster, serviceName, componentName, commandName, hostName);
     }
@@ -1169,54 +1175,186 @@ public class AmbariCustomCommandExecutionHelper {
    *
    * @return the repo info
    *
+   * @deprecated use {@link #getCommandRepository(Cluster, Host)} instead.
    * @throws AmbariException if the repository information can not be obtained
    */
+  @Deprecated
   public String getRepoInfo(Cluster cluster, Host host) throws AmbariException {
 
-    return getRepoInfo(cluster, host.getOsType(), host.getOsFamily(), host.getHostName());
+    Function<List<RepositoryInfo>, JsonArray> function = new Function<List<RepositoryInfo>, JsonArray>() {
+      @Override
+      public JsonArray apply(List<RepositoryInfo> input) {
+        return null == input ? null : (JsonArray) gson.toJsonTree(input);
+      }
+    };
+
+    final JsonArray gsonList = getBaseUrls(cluster, host, function);
+
+    if (null == gsonList) {
+      return "";
+    }
+
+    BaseUrlUpdater<JsonArray> updater = new BaseUrlUpdater<JsonArray>(gsonList) {
+      @Override
+      public JsonArray apply(final RepositoryVersionEntity rve) {
+
+        JsonArray result = new JsonArray();
+
+        for (JsonElement e : gsonList) {
+          JsonObject obj = e.getAsJsonObject();
+
+          String repoId = obj.has("repoId") ? obj.get("repoId").getAsString() : null;
+          String repoName = obj.has("repoName") ? obj.get("repoName").getAsString() : null;
+          String baseUrl = obj.has("baseUrl") ? obj.get("baseUrl").getAsString() : null;
+          String osType = obj.has("osType") ? obj.get("osType").getAsString() : null;
+
+          if (null == repoId || null == baseUrl || null == osType || null == repoName) {
+            continue;
+          }
+
+          for (OperatingSystemEntity ose : rve.getOperatingSystems()) {
+            if (ose.getOsType().equals(osType) && ose.isAmbariManagedRepos()) {
+              for (RepositoryEntity re : ose.getRepositories()) {
+                if (re.getName().equals(repoName) &&
+                    re.getRepositoryId().equals(repoId) &&
+                    !re.getBaseUrl().equals(baseUrl)) {
+                  obj.addProperty("baseUrl", re.getBaseUrl());
+                }
+              }
+            result.add(e);
+            }
+          }
+        }
+
+        return result;
+      }
+    };
+
+    return updateBaseUrls(cluster, updater).toString();
+  }
+
+  /**
+   * Builds repository information for inclusion in a command.  This replaces escaping json on
+   * a command.
+   *
+   * @param cluster the cluster
+   * @param host    the host
+   * @return  the command repository
+   * @throws AmbariException
+   */
+  @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES)
+  public CommandRepository getCommandRepository(final Cluster cluster, Host host) throws AmbariException {
+
+    Function<List<RepositoryInfo>, List<RepositoryInfo>> function = new Function<List<RepositoryInfo>, List<RepositoryInfo>>() {
+      @Override
+      public List<RepositoryInfo> apply(List<RepositoryInfo> input) {
+        // !!! just return what is given
+        return input;
+      }
+    };
+
+    final List<RepositoryInfo> repoInfos = getBaseUrls(cluster, host, function);
+
+    if (null == repoInfos) {
+      return null;
+    }
+
+    final CommandRepository command = new CommandRepository();
+    StackId stackId = cluster.getDesiredStackVersion();
+    command.setRepositories(repoInfos);
+    command.setStackName(stackId.getStackName());
+
+    final BaseUrlUpdater<Void> updater = new BaseUrlUpdater<Void>(null) {
+      @Override
+      public Void apply(RepositoryVersionEntity rve) {
+
+        command.setRepositoryVersionId(rve.getId());
+        command.setRepositoryVersion(rve.getVersion());
+        command.setStackName(rve.getStackName());
+        command.setUniqueSuffix(String.format("-repo-%s", rve.getId()));
+
+        for (CommandRepository.Repository commandRepo : command.getRepositories()) {
+          String osType = commandRepo.getOsType();
+          String repoId = commandRepo.getRepoId();
+          String repoName = commandRepo.getRepoName();
+          String baseUrl = commandRepo.getBaseUrl();
+
+          for (OperatingSystemEntity ose : rve.getOperatingSystems()) {
+            if (ose.getOsType().equals(osType) && ose.isAmbariManagedRepos()) {
+              for (RepositoryEntity re : ose.getRepositories()) {
+                if (re.getName().equals(repoName) &&
+                    re.getRepositoryId().equals(repoId) &&
+                    !re.getBaseUrl().equals(baseUrl)) {
+                  commandRepo.setBaseUrl(re.getBaseUrl());
+                }
+              }
+            }
+          }
+        }
+
+        return null;
+      }
+    };
+
+    updateBaseUrls(cluster, updater);
+
+    return command;
   }
 
-  public String getRepoInfo(Cluster cluster, String hostOSType, String hostOSFamily, String hostName) throws AmbariException {
+  /**
+   * Executed by two different representations of repos.  When we are comfortable with the new
+   * implemenation, this may be removed and called inline in {@link #getCommandRepository(Cluster, Host)}
+   *
+   * @param cluster   the cluster to isolate the stack
+   * @param host      used to resolve the family for the repositories
+   * @param function  function that will transform the supplied repositories for specific use.
+   * @return <T> the type as defined by the supplied {@code function}.
+   * @throws AmbariException
+   */
+  @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES)
+  private <T> T getBaseUrls(Cluster cluster, Host host, Function<List<RepositoryInfo>, T> function) throws AmbariException {
+
+    String hostOsType = host.getOsType();
+    String hostOsFamily = host.getOsFamily();
+    String hostName = host.getHostName();
 
     StackId stackId = cluster.getDesiredStackVersion();
 
     Map<String, List<RepositoryInfo>> repos = ambariMetaInfo.getRepository(
             stackId.getStackName(), stackId.getStackVersion());
 
-    String family = os_family.find(hostOSType);
+    String family = os_family.find(hostOsType);
     if (null == family) {
-      family = hostOSFamily;
+      family = hostOsFamily;
     }
 
-    JsonElement gsonList = null;
+    final List<RepositoryInfo> repoInfos;
 
     // !!! check for the most specific first
-    if (repos.containsKey(hostOSType)) {
-      gsonList = gson.toJsonTree(repos.get(hostOSType));
+    if (repos.containsKey(hostOsType)) {
+      repoInfos = repos.get(hostOsType);
     } else if (null != family && repos.containsKey(family)) {
-      gsonList = gson.toJsonTree(repos.get(family));
+      repoInfos = repos.get(family);
     } else {
+      repoInfos = null;
       LOG.warn("Could not retrieve repo information for host"
               + ", hostname=" + hostName
               + ", clusterName=" + cluster.getClusterName()
               + ", stackInfo=" + stackId.getStackId());
     }
 
-    if (null != gsonList) {
-      gsonList = updateBaseUrls(cluster, JsonArray.class.cast(gsonList));
-      return gsonList.toString();
-    } else {
-      return "";
-    }
+    // leave it to function implementation to handle null.
+    return function.apply(repoInfos);
   }
 
   /**
    * Checks repo URLs against the current version for the cluster and makes
    * adjustments to the Base URL when the current is different.
-   * @param cluster   the cluster to load the current version
-   * @param jsonArray the array containing stack repo data
+   *
+   * @param <T> the result after appling the repository version, if found.
    */
-  private JsonArray updateBaseUrls(Cluster cluster, JsonArray jsonArray) throws AmbariException {
+  @Experimental(feature = ExperimentalFeature.PATCH_UPGRADES)
+  private <T> T updateBaseUrls(Cluster cluster, BaseUrlUpdater<T> function) throws AmbariException {
     ClusterVersionEntity cve = cluster.getCurrentClusterVersion();
 
     if (null == cve) {
@@ -1235,40 +1373,12 @@ public class AmbariCustomCommandExecutionHelper {
 
     if (null == cve || null == cve.getRepositoryVersion()) {
       LOG.info("Cluster {} has no specific Repository Versions.  Using stack-defined values", cluster.getClusterName());
-      return jsonArray;
+      return function.getDefault();
     }
 
     RepositoryVersionEntity rve = cve.getRepositoryVersion();
 
-    JsonArray result = new JsonArray();
-
-    for (JsonElement e : jsonArray) {
-      JsonObject obj = e.getAsJsonObject();
-
-      String repoId = obj.has("repoId") ? obj.get("repoId").getAsString() : null;
-      String repoName = obj.has("repoName") ? obj.get("repoName").getAsString() : null;
-      String baseUrl = obj.has("baseUrl") ? obj.get("baseUrl").getAsString() : null;
-      String osType = obj.has("osType") ? obj.get("osType").getAsString() : null;
-
-      if (null == repoId || null == baseUrl || null == osType || null == repoName) {
-        continue;
-      }
-
-      for (OperatingSystemEntity ose : rve.getOperatingSystems()) {
-        if (ose.getOsType().equals(osType) && ose.isAmbariManagedRepos()) {
-          for (RepositoryEntity re : ose.getRepositories()) {
-            if (re.getName().equals(repoName) &&
-                re.getRepositoryId().equals(repoId) &&
-                !re.getBaseUrl().equals(baseUrl)) {
-              obj.addProperty("baseUrl", re.getBaseUrl());
-            }
-          }
-        result.add(e);
-        }
-      }
-    }
-
-    return result;
+    return function.apply(rve);
   }
 
 
@@ -1488,4 +1598,22 @@ public class AmbariCustomCommandExecutionHelper {
     hosts.removeAll(removedHosts);
     return removedHosts;
   }
+
+  /**
+   * Class that is used to update base urls.  There are two implementations of this - when we no
+   * longer are sure the deprecated repo info can be removed, so too can this class.
+   */
+  @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES)
+  abstract static class BaseUrlUpdater<T> implements Function<RepositoryVersionEntity, T> {
+    private T m_default;
+
+    private BaseUrlUpdater(T defaultValue) {
+      m_default = defaultValue;
+    }
+
+    private T getDefault() {
+      return m_default;
+    }
+
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariManagementControllerImpl.java
----------------------------------------------------------------------
diff --git 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
index 751ce08..04b72ea 100644
--- 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
@@ -2356,7 +2356,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
       commandParams.put(ExecutionCommand.KeyNames.REFRESH_TOPOLOGY, "True");
     }
 
-    String repoInfo = customCommandExecutionHelper.getRepoInfo(cluster, hostEntity.getOsType(), osFamily , hostname);
+    String repoInfo = customCommandExecutionHelper.getRepoInfo(cluster, host);
     if (LOG.isDebugEnabled()) {
       LOG.debug("Sending repo information to agent"
         + ", hostname=" + scHost.getHostName()
@@ -2472,7 +2472,7 @@ public class AmbariManagementControllerImpl implements AmbariManagementControlle
     execCmd.setCommandParams(commandParams);
 
     execCmd.setAvailableServicesFromServiceInfoMap(ambariMetaInfo.getServices(stackId.getStackName(), stackId.getStackVersion()));
-
+    execCmd.setRepositoryFile(customCommandExecutionHelper.getCommandRepository(cluster, host));
 
     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 {}",

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/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 e39588e..c3e66fc 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
@@ -29,6 +29,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.ambari.annotations.Experimental;
+import org.apache.ambari.annotations.ExperimentalFeature;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.Role;
 import org.apache.ambari.server.StaticallyInject;
@@ -41,7 +43,6 @@ import org.apache.ambari.server.actionmanager.Stage;
 import org.apache.ambari.server.actionmanager.StageFactory;
 import org.apache.ambari.server.agent.CommandReport;
 import org.apache.ambari.server.agent.ExecutionCommand;
-import org.apache.ambari.server.agent.ExecutionCommand.KeyNames;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.ActionExecutionContext;
@@ -79,10 +80,9 @@ import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.RepositoryType;
 import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.ServiceComponentHost;
-import org.apache.ambari.server.state.ServiceInfo;
-import org.apache.ambari.server.state.ServiceOsSpecific;
 import org.apache.ambari.server.state.StackId;
 import org.apache.ambari.server.state.repository.VersionDefinitionXml;
+import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
 import org.apache.ambari.server.utils.StageUtils;
 import org.apache.ambari.server.utils.VersionUtils;
 import org.apache.commons.lang.StringUtils;
@@ -91,7 +91,6 @@ import org.apache.hadoop.metrics2.sink.relocated.google.common.collect.Lists;
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Sets;
-import com.google.gson.Gson;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.Provider;
@@ -126,7 +125,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
   protected static final String CLUSTER_STACK_VERSION_FORCE = "ClusterStackVersions/force";
 
   protected static final String INSTALL_PACKAGES_ACTION = "install_packages";
-  protected static final String INSTALL_PACKAGES_FULL_NAME = "Install version";
+  protected static final String INSTALL_PACKAGES_FULL_NAME = "Install Version";
 
   /**
    * The default success factor that will be used when determining if a stage's
@@ -173,9 +172,6 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
   private static HostRoleCommandFactory hostRoleCommandFactory;
 
   @Inject
-  private static Gson gson;
-
-  @Inject
   private static Provider<AmbariActionExecutionHelper> actionExecutionHelper;
 
   @Inject
@@ -193,6 +189,9 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
   @Inject
   private static HostComponentStateDAO hostComponentStateDAO;
 
+  @Inject
+  private static RepositoryVersionHelper repoVersionHelper;
+
   /**
    * We have to include such a hack here, because if we
    * make finalizeUpgradeAction field static and request injection
@@ -602,6 +601,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
           throws SystemException {
     // Determine repositories for host
     String osFamily = host.getOsFamily();
+
     final List<RepositoryEntity> repoInfo = perOsRepos.get(osFamily);
     if (repoInfo == null) {
       throw new SystemException(String.format("Repositories for os type %s are " +
@@ -614,7 +614,6 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
     }
 
     // determine packages for all services that are installed on host
-    List<ServiceOsSpecific.Package> packages = new ArrayList<>();
     Set<String> servicesOnHost = new HashSet<>();
     List<ServiceComponentHost> components = cluster.getServiceComponentHosts(host.getHostName());
     for (ServiceComponentHost component : components) {
@@ -627,65 +626,9 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
       return null;
     }
 
-    List<String> blacklistedPackagePrefixes = configuration.getRollingUpgradeSkipPackagesPrefixes();
-    for (String serviceName : servicesOnHost) {
-      try{
-        if(ami.isServiceRemovedInStack(stackId.getStackName(), stackId.getStackVersion(), serviceName)){
-          LOG.info(String.format("%s has been removed from stack %s-%s. Skip calculating its installation packages", stackId.getStackName(), stackId.getStackVersion(), serviceName));
-          continue; //No need to calculate install packages for removed services
-        }
-      } catch (AmbariException e1) {
-        throw new SystemException(String.format("Cannot obtain stack information for %s-%s", stackId.getStackName(), stackId.getStackVersion()), e1);
-      }
-
-      ServiceInfo info;
-      try {
-        info = ami.getService(stackId.getStackName(), stackId.getStackVersion(), serviceName);
-      } catch (AmbariException e) {
-        throw new SystemException("Cannot enumerate services", e);
-      }
-
-      List<ServiceOsSpecific.Package> packagesForService = managementController.getPackagesForServiceHost(info,
-              new HashMap<String, String>(), // Contents are ignored
-        osFamily);
-      for (ServiceOsSpecific.Package aPackage : packagesForService) {
-        if (! aPackage.getSkipUpgrade()) {
-          boolean blacklisted = false;
-          for(String prefix : blacklistedPackagePrefixes) {
-            if (aPackage.getName().startsWith(prefix)) {
-              blacklisted = true;
-              break;
-            }
-          }
-          if (! blacklisted) {
-            packages.add(aPackage);
-          }
-        }
-      }
-    }
-
-    final String packageList = gson.toJson(packages);
-    final String repoList = gson.toJson(repoInfo);
-
-    Map<String, String> params = new HashMap<>();
-    params.put("stack_id", stackId.getStackId());
-    params.put("repository_version", repoVersion.getVersion());
-    params.put("base_urls", repoList);
-    params.put(KeyNames.PACKAGE_LIST, packageList);
-    params.put(KeyNames.REPO_VERSION_ID, repoVersion.getId().toString());
-
-    VersionDefinitionXml xml = null;
-    try {
-      xml = repoVersion.getRepositoryXml();
-    } catch (Exception e) {
-      throw new SystemException(String.format("Could not load xml from repo version %s",
-          repoVersion.getVersion()));
-    }
-
-    if (null != xml && StringUtils.isNotBlank(xml.getPackageVersion(osFamily))) {
-      params.put(KeyNames.PACKAGE_VERSION, xml.getPackageVersion(osFamily));
-    }
 
+    Map<String, String> roleParams = repoVersionHelper.buildRoleParams(managementController, repoVersion,
+        osFamily, servicesOnHost);
 
     // add host to this stage
     RequestResourceFilter filter = new RequestResourceFilter(null, null,
@@ -694,9 +637,11 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
     ActionExecutionContext actionContext = new ActionExecutionContext(
             cluster.getClusterName(), INSTALL_PACKAGES_ACTION,
             Collections.singletonList(filter),
-            params);
+            roleParams);
     actionContext.setTimeout(Short.valueOf(configuration.getDefaultAgentTaskTimeout(true)));
 
+    repoVersionHelper.addCommandRepository(actionContext, osFamily, repoVersion, repoInfo);
+
     return actionContext;
 
   }
@@ -734,29 +679,6 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
     return false;
   }
 
-
-  /**
-   *  Sets host versions states to not-required.
-   *
-   *  Transitioning host version to NOT_REQUIRED state manually is ok since
-   *  other completion handlers set success/fail states correctly during heartbeat.
-   *  The number of NOT_REQUIRED components for a cluster will be low.
-   */
-  private void transitionHostVersionToNotRequired(Host host, Cluster cluster, RepositoryVersionEntity repoVersion) {
-    LOG.info(String.format("Transitioning version %s on host %s directly to %s" +
-                    " without distributing bits to host since it has no versionable components.",
-            repoVersion.getVersion(), host.getHostName(), RepositoryVersionState.NOT_REQUIRED));
-
-    for (HostVersionEntity hve : host.getAllHostVersions()) {
-      if (hve.getRepositoryVersion().equals(repoVersion)) {
-        hve.setState(RepositoryVersionState.NOT_REQUIRED);
-        hostVersionDAO.merge(hve);
-      }
-    }
-
-  }
-
-
   private RequestStageContainer createRequest() {
     ActionManager actionManager = getManagementController().getActionManager();
 
@@ -876,6 +798,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
         // !!! revisit for PU
         // If forcing to become CURRENT, get the Cluster Version whose state is CURRENT and make sure that
         // the Host Version records for the same Repo Version are also marked as CURRENT.
+        @Experimental(feature=ExperimentalFeature.PATCH_UPGRADES)
         ClusterVersionEntity current = cluster.getCurrentClusterVersion();
 
         if (!current.getRepositoryVersion().equals(rve)) {

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/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 811ce9b..71b9b6b 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
@@ -19,7 +19,6 @@ package org.apache.ambari.server.controller.internal;
 
 import static org.apache.ambari.server.agent.ExecutionCommand.KeyNames.JDK_LOCATION;
 
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -34,7 +33,6 @@ import org.apache.ambari.server.actionmanager.ActionManager;
 import org.apache.ambari.server.actionmanager.RequestFactory;
 import org.apache.ambari.server.actionmanager.Stage;
 import org.apache.ambari.server.actionmanager.StageFactory;
-import org.apache.ambari.server.agent.ExecutionCommand.KeyNames;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.ActionExecutionContext;
@@ -61,17 +59,14 @@ import org.apache.ambari.server.state.Cluster;
 import org.apache.ambari.server.state.Host;
 import org.apache.ambari.server.state.RepositoryVersionState;
 import org.apache.ambari.server.state.ServiceComponentHost;
-import org.apache.ambari.server.state.ServiceInfo;
-import org.apache.ambari.server.state.ServiceOsSpecific;
 import org.apache.ambari.server.state.StackId;
-import org.apache.ambari.server.state.repository.VersionDefinitionXml;
+import org.apache.ambari.server.state.stack.upgrade.RepositoryVersionHelper;
 import org.apache.ambari.server.utils.StageUtils;
 import org.apache.commons.lang.BooleanUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.Validate;
 
 import com.google.common.collect.Sets;
-import com.google.gson.Gson;
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
@@ -107,7 +102,7 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
 
   protected static final String INSTALL_PACKAGES_ACTION = "install_packages";
   protected static final String STACK_SELECT_ACTION = "ru_set_all";
-  protected static final String INSTALL_PACKAGES_FULL_NAME = "Install version";
+  protected static final String INSTALL_PACKAGES_FULL_NAME = "Install Version";
 
 
   private static Set<String> pkPropertyIds = Sets.newHashSet(
@@ -147,8 +142,6 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
   @Inject
   private static RepositoryVersionDAO repositoryVersionDAO;
 
-  private static Gson gson = StageUtils.getGson();
-
   @Inject
   private static StageFactory stageFactory;
 
@@ -161,6 +154,8 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
   @Inject
   private static Configuration configuration;
 
+  @Inject
+  private static RepositoryVersionHelper repoVersionHelper;
 
   /**
    * Constructor.
@@ -403,8 +398,6 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
       LOG.error(String.format("Repository list is empty. Ambari may not be managing the repositories for %s", osFamily));
     }
 
-    // For every host at cluster, determine packages for all installed services
-    List<ServiceOsSpecific.Package> packages = new ArrayList<>();
     Set<String> servicesOnHost = new HashSet<>();
 
     if (forceInstallOnNonMemberHost) {
@@ -426,7 +419,6 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
           LOG.error("Service not found for component {}!", componentName, e);
           throw new IllegalArgumentException("Service not found for component : " + componentName);
         }
-
       }
 
     } else {
@@ -435,53 +427,9 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
         servicesOnHost.add(component.getServiceName());
       }
     }
-    List<String> blacklistedPackagePrefixes = configuration.getRollingUpgradeSkipPackagesPrefixes();
-    for (String serviceName : servicesOnHost) {
-      ServiceInfo info;
-      try {
-        info = ami.getService(stackName, stackVersion, serviceName);
-      } catch (AmbariException e) {
-        throw new SystemException("Can not enumerate services", e);
-      }
-      List<ServiceOsSpecific.Package> packagesForService = managementController.getPackagesForServiceHost(info,
-              new HashMap<String, String>(), // Contents are ignored
-        osFamily);
-      for (ServiceOsSpecific.Package aPackage : packagesForService) {
-        if (! aPackage.getSkipUpgrade()) {
-          boolean blacklisted = false;
-          for(String prefix : blacklistedPackagePrefixes) {
-            if (aPackage.getName().startsWith(prefix)) {
-              blacklisted = true;
-              break;
-            }
-          }
-          if (! blacklisted) {
-            packages.add(aPackage);
-          }
-        }
-      }
-    }
-    final String packageList = gson.toJson(packages);
-    final String repoList = gson.toJson(repoInfo);
-
-    Map<String, String> params = new HashMap<String, String>(){{
-      put("stack_id", stackId.getStackId());
-      put("repository_version", desiredRepoVersion);
-      put("base_urls", repoList);
-      put(KeyNames.PACKAGE_LIST, packageList);
-    }};
-
-    VersionDefinitionXml xml = null;
-    try {
-      xml = repoVersionEnt.getRepositoryXml();
-    } catch (Exception e) {
-      throw new SystemException(String.format("Could not load xml from repo version %s",
-          repoVersionEnt.getVersion()));
-    }
 
-    if (null != xml && StringUtils.isNotBlank(xml.getPackageVersion(osFamily))) {
-      params.put(KeyNames.PACKAGE_VERSION, xml.getPackageVersion(osFamily));
-    }
+    Map<String, String> roleParams = repoVersionHelper.buildRoleParams(managementController, repoVersionEnt,
+        osFamily, servicesOnHost);
 
     // Create custom action
     RequestResourceFilter filter = new RequestResourceFilter(null, null,
@@ -490,9 +438,11 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
     ActionExecutionContext actionContext = new ActionExecutionContext(
             cluster.getClusterName(), INSTALL_PACKAGES_ACTION,
             Collections.singletonList(filter),
-            params);
+            roleParams);
     actionContext.setTimeout(Short.valueOf(configuration.getDefaultAgentTaskTimeout(true)));
 
+    repoVersionHelper.addCommandRepository(actionContext, osFamily, repoVersionEnt, repoInfo);
+
     String caption = String.format(INSTALL_PACKAGES_FULL_NAME + " on host %s", hostName);
     RequestStageContainer req = createRequest(caption);
 
@@ -553,7 +503,7 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
     Stage stage;
     long stageId;
     ActionExecutionContext actionContext;
-    Map<String, String> commandParams = new HashMap();
+    Map<String, String> commandParams = new HashMap<>();
     commandParams.put("version", desiredRepoVersion);
 
     stage = stageFactory.createNew(req.getId(),

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
index fdb7c8d..14e0179 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelper.java
@@ -19,18 +19,33 @@ package org.apache.ambari.server.state.stack.upgrade;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.agent.CommandRepository;
+import org.apache.ambari.server.agent.ExecutionCommand;
+import org.apache.ambari.server.agent.ExecutionCommand.KeyNames;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
+import org.apache.ambari.server.configuration.Configuration;
+import org.apache.ambari.server.controller.ActionExecutionContext;
+import org.apache.ambari.server.controller.ActionExecutionContext.ExecutionCommandVisitor;
+import org.apache.ambari.server.controller.AmbariManagementController;
 import org.apache.ambari.server.controller.internal.OperatingSystemResourceProvider;
 import org.apache.ambari.server.controller.internal.RepositoryResourceProvider;
 import org.apache.ambari.server.controller.internal.RepositoryVersionResourceProvider;
+import org.apache.ambari.server.controller.spi.SystemException;
 import org.apache.ambari.server.orm.entities.OperatingSystemEntity;
 import org.apache.ambari.server.orm.entities.RepositoryEntity;
+import org.apache.ambari.server.orm.entities.RepositoryVersionEntity;
 import org.apache.ambari.server.state.RepositoryInfo;
+import org.apache.ambari.server.state.ServiceInfo;
+import org.apache.ambari.server.state.ServiceOsSpecific;
+import org.apache.ambari.server.state.StackId;
+import org.apache.ambari.server.state.repository.VersionDefinitionXml;
 import org.apache.ambari.server.state.stack.UpgradePack;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -44,6 +59,7 @@ import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonParser;
 import com.google.inject.Inject;
+import com.google.inject.Provider;
 import com.google.inject.Singleton;
 
 /**
@@ -57,8 +73,11 @@ public class RepositoryVersionHelper {
   @Inject
   private Gson gson;
 
-  @Inject(optional = true)
-  private AmbariMetaInfo ambariMetaInfo;
+  @Inject
+  private Provider<AmbariMetaInfo> ami;
+
+  @Inject
+  private Provider<Configuration> configuration;
 
   /**
    * Parses operating systems json to a list of entities. Expects json like:
@@ -198,7 +217,7 @@ public class RepositoryVersionHelper {
    * @throws AmbariException if no upgrade packs suit the requirements
    */
   public String getUpgradePackageName(String stackName, String stackVersion, String repositoryVersion, UpgradeType upgradeType) throws AmbariException {
-    final Map<String, UpgradePack> upgradePacks = ambariMetaInfo.getUpgradePacks(stackName, stackVersion);
+    final Map<String, UpgradePack> upgradePacks = ami.get().getUpgradePacks(stackName, stackVersion);
     for (UpgradePack upgradePack : upgradePacks.values()) {
       final String upgradePackName = upgradePack.getName();
 
@@ -218,4 +237,109 @@ public class RepositoryVersionHelper {
     throw new AmbariException("There were no suitable upgrade packs for stack " + stackName + " " + stackVersion +
         ((null != upgradeType) ? " and upgrade type " + upgradeType : ""));
   }
+
+  /**
+   * Build the role parameters for an install command.
+   *
+   * @param amc           the management controller.  Tests don't use the same instance that gets injected.
+   * @param repoVersion   the repository version
+   * @param osFamily      the os family
+   * @param services      the set of services to check for packages
+   * @param repos         the list of individual repositories
+   * @return a Map<String, String> to use in
+   * @throws SystemException
+   */
+  public Map<String, String> buildRoleParams(AmbariManagementController amc, RepositoryVersionEntity repoVersion, String osFamily, Set<String> servicesOnHost)
+    throws SystemException {
+
+    StackId stackId = repoVersion.getStackId();
+
+    List<ServiceOsSpecific.Package> packages = new ArrayList<>();
+
+    for (String serviceName : servicesOnHost) {
+      ServiceInfo info;
+
+      try {
+        if (ami.get().isServiceRemovedInStack(stackId.getStackName(), stackId.getStackVersion(), serviceName)) {
+          LOG.info(String.format("%s has been removed from stack %s-%s. Skip calculating its installation packages", stackId.getStackName(), stackId.getStackVersion(), serviceName));
+          continue; //No need to calculate install packages for removed services
+        }
+
+        info = ami.get().getService(stackId.getStackName(), stackId.getStackVersion(), serviceName);
+      } catch (AmbariException e) {
+        throw new SystemException(String.format("Cannot obtain stack information for %s-%s", stackId.getStackName(), stackId.getStackVersion()), e);
+      }
+
+      List<ServiceOsSpecific.Package> packagesForService = amc.getPackagesForServiceHost(info,
+        new HashMap<String, String>(), osFamily);
+
+      List<String> blacklistedPackagePrefixes = configuration.get().getRollingUpgradeSkipPackagesPrefixes();
+
+      for (ServiceOsSpecific.Package aPackage : packagesForService) {
+        if (!aPackage.getSkipUpgrade()) {
+          boolean blacklisted = false;
+          for (String prefix : blacklistedPackagePrefixes) {
+            if (aPackage.getName().startsWith(prefix)) {
+              blacklisted = true;
+              break;
+            }
+          }
+          if (! blacklisted) {
+            packages.add(aPackage);
+          }
+        }
+      }
+    }
+
+    Map<String, String> roleParams = new HashMap<>();
+    roleParams.put("stack_id", stackId.getStackId());
+    roleParams.put("repository_version", repoVersion.getVersion());
+    // !!! TODO make roleParams <String, Object> so we don't have to do this awfulness.
+    roleParams.put(KeyNames.PACKAGE_LIST, gson.toJson(packages));
+    roleParams.put(KeyNames.REPO_VERSION_ID, repoVersion.getId().toString());
+
+    VersionDefinitionXml xml = null;
+    try {
+      xml = repoVersion.getRepositoryXml();
+    } catch (Exception e) {
+      throw new SystemException(String.format("Could not load xml from repo version %s",
+          repoVersion.getVersion()));
+    }
+
+    if (null != xml && StringUtils.isNotBlank(xml.getPackageVersion(osFamily))) {
+      roleParams.put(KeyNames.PACKAGE_VERSION, xml.getPackageVersion(osFamily));
+    }
+
+    return roleParams;
+  }
+
+  /**
+   * Adds a command repository to the action context
+   * @param context       the context
+   * @param osFamily      the OS family
+   * @param repoVersion   the repository version entity
+   * @param repos         the repository entities
+   */
+  public void addCommandRepository(ActionExecutionContext context, String osFamily,
+      RepositoryVersionEntity repoVersion, List<RepositoryEntity> repos) {
+    StackId stackId = repoVersion.getStackId();
+
+    final CommandRepository commandRepo = new CommandRepository();
+    commandRepo.setRepositories(osFamily, repos);
+    commandRepo.setRepositoryVersion(repoVersion.getVersion());
+    commandRepo.setRepositoryVersionId(repoVersion.getId());
+    commandRepo.setStackName(stackId.getStackName());
+    commandRepo.setUniqueSuffix(String.format("-repo-%s", repoVersion.getId()));
+
+    context.addVisitor(new ExecutionCommandVisitor() {
+      @Override
+      public void visit(ExecutionCommand command) {
+        if (null == command.getRepositoryFile()) {
+          command.setRepositoryFile(commandRepo);
+        }
+      }
+    });
+  }
+
+
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py b/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py
index 33adce1..c12dff1 100644
--- a/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py
+++ b/ambari-server/src/main/resources/custom_actions/scripts/install_packages.py
@@ -16,36 +16,30 @@ 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.
 
-Ambari Agent
-
 """
-import os
 import signal
 
 import re
-import os.path
 
-import ambari_simplejson as json  # simplejson is much faster comparing to Python 2.6 json module and has the same functions set.
+import ambari_simplejson as json
 
-from resource_management import *
-import resource_management
-from resource_management.libraries.functions.list_ambari_managed_repos import list_ambari_managed_repos
-from ambari_commons.os_check import OSCheck, OSConst
+from ambari_commons.os_check import OSCheck
 from ambari_commons.str_utils import cbool, cint
+from resource_management.core.exceptions import Fail
+from resource_management.core.logger import Logger
+from resource_management.core.resources import Package
 from resource_management.libraries.functions.packages_analyzer import allInstalledPackages, verifyDependencies
 from resource_management.libraries.functions import conf_select
 from resource_management.libraries.functions import stack_tools
 from resource_management.libraries.functions.stack_select import get_stack_versions
 from resource_management.libraries.functions.version import format_stack_version
 from resource_management.libraries.functions.repo_version_history \
-  import read_actual_version_from_history_file, write_actual_version_to_history_file, REPO_VERSION_HISTORY_FILE
-from resource_management.libraries.script.script import Script
-from resource_management.core.resources.system import Execute
-from resource_management.libraries.functions.stack_features import check_stack_feature
+    import read_actual_version_from_history_file, write_actual_version_to_history_file, REPO_VERSION_HISTORY_FILE
 from resource_management.libraries.functions import StackFeature
-
-from resource_management.core.logger import Logger
-
+from resource_management.libraries.functions.repository_util import create_repo_files, CommandRepository
+from resource_management.libraries.functions.stack_features import check_stack_feature
+from resource_management.libraries.resources.repository import Repository
+from resource_management.libraries.script.script import Script
 
 class InstallPackages(Script):
   """
@@ -73,22 +67,20 @@ class InstallPackages(Script):
 
     self.repository_version_id = None
 
+    base_urls = []
     # Select dict that contains parameters
     try:
+      if 'base_urls' in config['roleParams']:
+        base_urls = json.loads(config['roleParams']['base_urls'])
+
       self.repository_version = config['roleParams']['repository_version']
-      base_urls = json.loads(config['roleParams']['base_urls'])
       package_list = json.loads(config['roleParams']['package_list'])
       stack_id = config['roleParams']['stack_id']
+
       if 'repository_version_id' in config['roleParams']:
         self.repository_version_id = config['roleParams']['repository_version_id']
     except KeyError:
-      # Last try
-      self.repository_version = config['commandParams']['repository_version']
-      base_urls = json.loads(config['commandParams']['base_urls'])
-      package_list = json.loads(config['commandParams']['package_list'])
-      stack_id = config['commandParams']['stack_id']
-      if 'repository_version_id' in config['commandParams']:
-        self.repository_version_id = config['commandParams']['repository_version_id']
+      pass
 
     # current stack information
     self.current_stack_version_formatted = None
@@ -110,9 +102,7 @@ class InstallPackages(Script):
 
     self.repository_version = self.repository_version.strip()
 
-
     # Install/update repositories
-    installed_repositories = []
     self.current_repositories = []
     self.current_repo_files = set()
 
@@ -130,21 +120,22 @@ class InstallPackages(Script):
       Logger.warning("Repository list is empty. Ambari may not be managing the repositories for {0}.".format(self.repository_version))
 
     try:
-      append_to_file = False
-      for url_info in base_urls:
-        repo_name, repo_file = self.install_repository(url_info, append_to_file, template)
-        self.current_repositories.append(repo_name)
-        self.current_repo_files.add(repo_file)
-        append_to_file = True
-
-      installed_repositories = list_ambari_managed_repos(self.stack_name)
+      if 'repositoryFile' in config:
+        create_repo_files(template, CommandRepository(config['repositoryFile']))
+      else:
+        append_to_file = False
+        for url_info in base_urls:
+          repo_name, repo_file = self.install_repository(url_info, append_to_file, template)
+          self.current_repositories.append(repo_name)
+          self.current_repo_files.add(repo_file)
+          append_to_file = True
+
     except Exception, err:
-      Logger.logger.exception("Cannot distribute repositories. Error: {0}".format(str(err)))
+      Logger.logger.exception("Cannot install repository files. Error: {0}".format(str(err)))
       num_errors += 1
 
     # Build structured output with initial values
     self.structured_output = {
-      'ambari_repositories': installed_repositories,
       'installed_repository_version': self.repository_version,
       'stack_id': stack_id,
       'package_installation_result': 'FAIL'

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/params.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/params.py b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/params.py
index 6193c11..50c5a40 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/params.py
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/params.py
@@ -111,3 +111,5 @@ if has_hbase_masters:
 #repo params
 repo_info = config['hostLevelParams']['repo_info']
 service_repo_info = default("/hostLevelParams/service_repo_info",None)
+
+repo_file = default("/repositoryFile", None)

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/repo_initialization.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/repo_initialization.py b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/repo_initialization.py
index a35dce7..cbbc466 100644
--- a/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/repo_initialization.py
+++ b/ambari-server/src/main/resources/stacks/HDP/2.0.6/hooks/before-INSTALL/scripts/repo_initialization.py
@@ -19,11 +19,10 @@ limitations under the License.
 
 from ambari_commons.os_check import OSCheck
 from resource_management.libraries.resources.repository import Repository
+from resource_management.libraries.functions.repository_util import create_repo_files, CommandRepository, UBUNTU_REPO_COMPONENTS_POSTFIX
 from resource_management.core.logger import Logger
-import ambari_simplejson as json # simplejson is much faster comparing to Python 2.6 json module and has the same functions set.
+import ambari_simplejson as json
 
-# components_lits = repoName + postfix
-_UBUNTU_REPO_COMPONENTS_POSTFIX = ["main"]
 
 def _alter_repo(action, repo_string, repo_template):
   """
@@ -45,17 +44,17 @@ def _alter_repo(action, repo_string, repo_template):
       repo['baseUrl'] = None
     if not 'mirrorsList' in repo:
       repo['mirrorsList'] = None
-    
-    ubuntu_components = [ repo['repoName'] ] + _UBUNTU_REPO_COMPONENTS_POSTFIX
-    
+
+    ubuntu_components = [ repo['repoName'] ] + UBUNTU_REPO_COMPONENTS_POSTFIX
+
     Repository(repo['repoId'],
                action = action,
                base_url = repo['baseUrl'],
                mirror_list = repo['mirrorsList'],
                repo_file_name = repo['repoName'],
                repo_template = repo_template,
-               components = ubuntu_components, # ubuntu specific
-    )
+               components = ubuntu_components) # ubuntu specific
+
 
 def install_repos():
   import params
@@ -63,6 +62,13 @@ def install_repos():
     return
 
   template = params.repo_rhel_suse if OSCheck.is_suse_family() or OSCheck.is_redhat_family() else params.repo_ubuntu
+
+  # use this newer way of specifying repositories, if available
+  if params.repo_file is not None:
+    create_repo_files(template, CommandRepository(params.repo_file))
+    return
+
   _alter_repo("create", params.repo_info, template)
+
   if params.service_repo_info:
     _alter_repo("create", params.service_repo_info, template)

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/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 8f7b31d..6245708 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
@@ -219,9 +219,14 @@ public class ClusterStackVersionResourceProviderTest {
     Map<String, String> hostLevelParams = new HashMap<>();
     StackId stackId = new StackId("HDP", "2.0.1");
 
+    StackEntity stackEntity = new StackEntity();
+    stackEntity.setStackName("HDP");
+    stackEntity.setStackVersion("2.1.1");
+
     RepositoryVersionEntity repoVersion = new RepositoryVersionEntity();
     repoVersion.setId(1l);
     repoVersion.setOperatingSystems(OS_JSON);
+    repoVersion.setStack(stackEntity);
 
     final String hostWithoutVersionableComponents = "host2";
 
@@ -647,12 +652,17 @@ public class ClusterStackVersionResourceProviderTest {
 
     File f = new File("src/test/resources/hbase_version_test.xml");
 
+    StackEntity stackEntity = new StackEntity();
+    stackEntity.setStackName("HDP");
+    stackEntity.setStackVersion("2.1.1");
+
     RepositoryVersionEntity repoVersion = new RepositoryVersionEntity();
     repoVersion.setId(1l);
     repoVersion.setOperatingSystems(OS_JSON);
     repoVersion.setVersionXml(IOUtils.toString(new FileInputStream(f)));
     repoVersion.setVersionXsd("version_definition.xsd");
     repoVersion.setType(RepositoryType.STANDARD);
+    repoVersion.setStack(stackEntity);
 
     ambariMetaInfo.getComponent("HDP", "2.1.1", "HBASE", "HBASE_MASTER").setVersionAdvertised(true);
 
@@ -890,12 +900,17 @@ public class ClusterStackVersionResourceProviderTest {
 
     File f = new File("src/test/resources/hbase_version_test.xml");
 
+    StackEntity stackEntity = new StackEntity();
+    stackEntity.setStackName("HDP");
+    stackEntity.setStackVersion("2.1.1");
+
     RepositoryVersionEntity repoVersion = new RepositoryVersionEntity();
     repoVersion.setId(1l);
     repoVersion.setOperatingSystems(os_json);
     repoVersion.setVersionXml(IOUtils.toString(new FileInputStream(f)));
     repoVersion.setVersionXsd("version_definition.xsd");
     repoVersion.setType(RepositoryType.STANDARD);
+    repoVersion.setStack(stackEntity);
 
     ambariMetaInfo.getComponent("HDP", "2.1.1", "HBASE", "HBASE_MASTER").setVersionAdvertised(true);
 
@@ -1096,8 +1111,8 @@ public class ClusterStackVersionResourceProviderTest {
     Assert.assertEquals(Float.valueOf(0.85f), successFactor);
 
     Assert.assertTrue(executionCommand.getRoleParams().containsKey(KeyNames.PACKAGE_VERSION));
-    Assert.assertTrue(executionCommand.getRoleParams().containsKey("base_urls"));
-    Assert.assertEquals("[]", executionCommand.getRoleParams().get("base_urls"));
+    Assert.assertNotNull(executionCommand.getRepositoryFile());
+    Assert.assertEquals(0, executionCommand.getRepositoryFile().getRepositories().size());
   }
 
    @Test

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/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 4bed482..1ae83d4 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
@@ -154,9 +154,10 @@ public class HostStackVersionResourceProviderTest {
 
     StackEntity stack = new StackEntity();
     stack.setStackName("HDP");
-    stack.setStackVersion("2.2");
+    stack.setStackVersion("2.0.1");
     repoVersion.setStack(stack);
     repoVersion.setVersion("2.2");
+    repoVersion.setId(1L);
   }
 
   @After

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java
index c6ee875..5513271 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/serveraction/upgrades/UpgradeActionTest.java
@@ -40,6 +40,7 @@ import org.apache.ambari.server.actionmanager.HostRoleCommand;
 import org.apache.ambari.server.actionmanager.HostRoleCommandFactory;
 import org.apache.ambari.server.actionmanager.HostRoleStatus;
 import org.apache.ambari.server.agent.CommandReport;
+import org.apache.ambari.server.agent.CommandRepository;
 import org.apache.ambari.server.agent.ExecutionCommand;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.controller.AmbariCustomCommandExecutionHelper;
@@ -632,9 +633,6 @@ public class UpgradeActionTest {
     CommandReport report = finalizeUpgradeAction.execute(null);
     assertNotNull(report);
     assertEquals(HostRoleStatus.COMPLETED.name(), report.getStatus());
-
-    // Verify the metainfo url
-    verifyBaseRepoURL(helper, cluster, host, "http://foo1");
   }
 
   /**
@@ -699,6 +697,7 @@ public class UpgradeActionTest {
   }
 
   private void verifyBaseRepoURL(AmbariCustomCommandExecutionHelper helper, Cluster cluster, Host host, String expectedRepoBaseURL) throws AmbariException {
+
     String repoInfo = helper.getRepoInfo(cluster, host);
     Gson gson = new Gson();
     JsonElement element = gson.fromJson(repoInfo, JsonElement.class);
@@ -709,6 +708,13 @@ public class UpgradeActionTest {
     JsonObject o = list.get(0).getAsJsonObject();
     assertTrue(o.has("baseUrl"));
     assertEquals(expectedRepoBaseURL, o.get("baseUrl").getAsString());
+
+    CommandRepository commandRepo = helper.getCommandRepository(cluster, host);
+
+    assertNotNull(commandRepo);
+    assertNotNull(commandRepo.getRepositories());
+    assertEquals(1, commandRepo.getRepositories().size());
+    assertEquals(expectedRepoBaseURL, commandRepo.getRepositories().iterator().next().getBaseUrl());
   }
 
   @Test
@@ -1019,9 +1025,6 @@ public class UpgradeActionTest {
     assertNotNull(report);
     assertEquals(HostRoleStatus.COMPLETED.name(), report.getStatus());
 
-    // Verify the metainfo url
-    verifyBaseRepoURL(helper, cluster, host, "http://foo1");
-
     // ensure that history now exists
     historyEntites = serviceComponentDesiredStateDAO.findHistory(cluster.getClusterId(),
             nnSCH.getServiceName(), nnSCH.getServiceComponentName());

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/test/java/org/apache/ambari/server/stack/UpdateActiveRepoVersionOnStartupTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/stack/UpdateActiveRepoVersionOnStartupTest.java b/ambari-server/src/test/java/org/apache/ambari/server/stack/UpdateActiveRepoVersionOnStartupTest.java
index df69f68..d67cdfc 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/stack/UpdateActiveRepoVersionOnStartupTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/stack/UpdateActiveRepoVersionOnStartupTest.java
@@ -24,6 +24,7 @@ import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
 
 import java.io.IOException;
+import java.lang.reflect.Field;
 
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.orm.InMemoryDefaultTestModule;
@@ -45,6 +46,7 @@ import org.junit.Test;
 import com.google.common.base.Charsets;
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.Resources;
+import com.google.gson.Gson;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 import com.google.inject.Provider;
@@ -97,8 +99,14 @@ public class UpdateActiveRepoVersionOnStartupTest {
     ClusterDAO clusterDao = mock(ClusterDAO.class);
     ClusterVersionDAO clusterVersionDAO = mock(ClusterVersionDAO.class);
     repositoryVersionDao = mock(RepositoryVersionDAO.class);
+
     final RepositoryVersionHelper repositoryVersionHelper = new RepositoryVersionHelper();
-    AmbariMetaInfo metaInfo = mock(AmbariMetaInfo.class);
+    Field field = RepositoryVersionHelper.class.getDeclaredField("gson");
+    field.setAccessible(true);
+    field.set(repositoryVersionHelper, new Gson());
+
+
+    final AmbariMetaInfo metaInfo = mock(AmbariMetaInfo.class);
 
     StackManager stackManager = mock(StackManager.class);
     when(metaInfo.getStackManager()).thenReturn(stackManager);
@@ -123,15 +131,26 @@ public class UpdateActiveRepoVersionOnStartupTest {
     stackInfo.getRepositories().add(repositoryInfo);
     when(stackManager.getStack("HDP", "2.3")).thenReturn(stackInfo);
 
-    Provider<RepositoryVersionHelper> repositoryVersionHelperProvider = mock(Provider.class);
+    final Provider<RepositoryVersionHelper> repositoryVersionHelperProvider = mock(Provider.class);
     when(repositoryVersionHelperProvider.get()).thenReturn(repositoryVersionHelper);
+
+
+
     InMemoryDefaultTestModule testModule = new InMemoryDefaultTestModule() {
       @Override
       protected void configure() {
-        bind(RepositoryVersionHelper.class).toInstance(repositoryVersionHelper);
+        bind(RepositoryVersionHelper.class).toProvider(repositoryVersionHelperProvider);
+        bind(AmbariMetaInfo.class).toProvider(new Provider<AmbariMetaInfo>() {
+          @Override
+          public AmbariMetaInfo get() {
+            return metaInfo;
+          }
+        });
+
         requestStaticInjection(RepositoryVersionEntity.class);
       }
     };
+
     Injector injector = Guice.createInjector(testModule);
     if (addClusterVersion) {
       repoVersion = new RepositoryVersionEntity();

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelperTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelperTest.java
index 3a5532b..339786e 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelperTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/stack/upgrade/RepositoryVersionHelperTest.java
@@ -17,19 +17,15 @@
  */
 package org.apache.ambari.server.state.stack.upgrade;
 
+import java.lang.reflect.Field;
 import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.ambari.server.state.RepositoryInfo;
-import org.junit.Before;
+import org.junit.Assert;
 import org.junit.Test;
 
 import com.google.gson.Gson;
-import com.google.inject.AbstractModule;
-import com.google.inject.Guice;
-import com.google.inject.Injector;
-
-import junit.framework.Assert;
 
 /**
  * Tests the {@link RepositoryVersionHelper} class
@@ -38,20 +34,15 @@ public class RepositoryVersionHelperTest {
 
   private RepositoryVersionHelper helper;
 
-  @Before
-  public void before() throws Exception {
-    final Injector injector = Guice.createInjector(new AbstractModule() {
-
-      @Override
-      protected void configure() {
-        bind(Gson.class).toInstance(new Gson());
-      }
-    });
-    helper = injector.getInstance(RepositoryVersionHelper.class);
-  }
-
   @Test
   public void testSerializeOperatingSystems() throws Exception {
+    Gson gson = new Gson();
+    Field field = RepositoryVersionHelper.class.getDeclaredField("gson");
+    field.setAccessible(true);
+
+    RepositoryVersionHelper helper = new RepositoryVersionHelper();
+    field.set(helper, gson);
+
     final List<RepositoryInfo> repositories = new ArrayList<>();
     final RepositoryInfo repository = new RepositoryInfo();
     repository.setBaseUrl("baseurl");


[2/4] ambari git commit: AMBARI-20871. Unify repository file creation (ncole)

Posted by nc...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/test/python/stacks/2.0.6/configs/repository_file.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/stacks/2.0.6/configs/repository_file.json b/ambari-server/src/test/python/stacks/2.0.6/configs/repository_file.json
new file mode 100644
index 0000000..1554f1b
--- /dev/null
+++ b/ambari-server/src/test/python/stacks/2.0.6/configs/repository_file.json
@@ -0,0 +1,1275 @@
+{
+    "localComponents": [
+        "NAMENODE",
+        "SECONDARY_NAMENODE",
+        "ZOOKEEPER_SERVER",
+        "DATANODE",
+        "HDFS_CLIENT",
+        "ZOOKEEPER_CLIENT",
+        "RESOURCEMANAGER",
+        "HISTORYSERVER",
+        "NODEMANAGER",
+        "YARN_CLIENT",
+        "MAPREDUCE2_CLIENT",
+        "SLIDER",
+        "PIG",
+        "SQOOP",
+        "HIVE_CLIENT",
+        "TEZ_CLIENT",
+        "HIVE_CLIENT",
+        "SPARK_CLIENT",
+        "SPARK2_CLIENT"
+    ],
+    "roleCommand": "SERVICE_CHECK",
+    "clusterName": "c1",
+    "hostname": "c6401.ambari.apache.org",
+    "hostLevelParams": {
+        "not_managed_hdfs_path_list": "[\"/apps/hive/warehouse\",\"/apps/falcon\",\"/mr-history/done\",\"/app-logs\",\"/tmp\"]",
+        "agent_stack_retry_count": "5",
+        "agent_stack_retry_on_unavailability": "false",
+        "agentCacheDir": "/var/lib/ambari-agent/cache",
+        "jdk_location": "http://c6401.ambari.apache.org:8080/resources/",
+        "ambari_db_rca_password": "mapred",
+        "ambari_db_rca_url": "jdbc:postgresql://c6401.ambari.apache.org/ambarirca",
+        "repo_info": "[{\"baseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\",\"osType\":\"centos6\",\"repoId\":\"HDP-2.0._\",\"repoName\":\"HDP\",\"defaultBaseUrl\":\"http://public-repo-1.hortonworks.com/HDP/centos6/2.x/updates/2.0.6.0\"}]",
+        "jce_name": "UnlimitedJCEPolicyJDK7.zip",
+        "stack_version": "2.0",
+        "stack_name": "HDP",
+        "ambari_db_rca_driver": "org.postgresql.Driver",
+        "jdk_name": "jdk-7u67-linux-x64.tar.gz",
+        "ambari_db_rca_username": "mapred",
+        "java_home": "/usr/jdk64/jdk1.7.0_45",
+        "java_version": "8",
+        "db_name": "ambari",
+        "user_group": "{\"sample\":[\"sample\",\"users\"]}",
+        "group_list": "[\"hadoop\",\"nobody\",\"users\"]",
+        "user_list": "[\"hive\",\"oozie\",\"nobody\",\"ambari-qa\",\"flume\",\"hdfs\",\"storm\",\"mapred\",\"hbase\",\"tez\",\"zookeeper\",\"falcon\",\"sqoop\",\"yarn\",\"hcat\"]",
+        "custom_mysql_jdbc_name" : "mysql-connector-java.jar",
+        "custom_oracle_jdbc_name" : "oracle-jdbc-driver.jar",
+        "custom_postgres_jdbc_name" : "test-postgres-jdbc.jar",
+        "custom_sqlanywhere_jdbc_name" : "sqla-client-jdbc.tar.gz"
+    },
+    "commandType": "EXECUTION_COMMAND",
+    "roleParams": {},
+    "serviceName": "HIVE",
+    "role": "HIVE_SERVER",
+    "repositoryFile": {
+        "stackName": "HDP",
+        "repoVersionId": 4,
+        "repoVersion": "2.2.0.1-885",
+        "repositories": [
+          {
+            "repoName": "HDP",
+            "baseUrl": "http://repo1/HDP/centos5/2.x/updates/2.2.0.0",
+            "repoId": "HDP-2.2-repo-4"
+          },
+          {
+            "repoName": "HDP-UTILS",
+            "baseUrl": "http://repo1/HDP-UTILS/centos5/2.x/updates/2.2.0.0",
+            "repoId": "HDP-UTILS-1.1.0.20-repo-4"
+          }
+        ]
+    },
+    "commandParams": {
+        "command_timeout": "300",
+        "service_package_folder": "OOZIE",
+        "script_type": "PYTHON",
+        "script": "scripts/service_check.py",
+        "excluded_hosts": "host1,host2",
+        "mark_draining_only" : "false",
+        "update_exclude_file_only" : "false",
+        "xml_configs_list":[{"hdfs-site.xml":"hdfs-site"}],
+        "env_configs_list":[{"hadoop-env.sh":"hadoop-env"},{"log4j.properties":"hdfs-log4j,yarn-log4j"}],
+        "properties_configs_list":[{"runtime.properties":"falcon-runtime.properties"},{"startup.properties":"falcon-startup.properties"}],
+        "output_file":"HDFS_CLIENT-configs.tar.gz",
+        "refresh_topology": "True"
+    },
+    "taskId": 152,
+    "public_hostname": "c6401.ambari.apache.org",
+    "configurations": {
+        "sqoop-site": {
+            "atlas.cluster.name": "c1",
+            "sqoop.job.data.publish.class": "org.apache.atlas.sqoop.hook.SqoopHook"
+        },
+        "mapred-site": {
+            "mapreduce.jobhistory.address": "c6402.ambari.apache.org:10020",
+            "mapreduce.cluster.administrators": " hadoop",
+            "mapreduce.reduce.input.buffer.percent": "0.0",
+            "mapreduce.output.fileoutputformat.compress": "false",
+            "mapreduce.framework.name": "yarn",
+            "mapreduce.map.speculative": "false",
+            "mapreduce.reduce.shuffle.merge.percent": "0.66",
+            "yarn.app.mapreduce.am.resource.mb": "683",
+            "mapreduce.map.java.opts": "-Xmx273m",
+            "mapreduce.application.classpath": "$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/*,$HADOOP_MAPRED_HOME/share/hadoop/mapreduce/lib/*",
+            "mapreduce.job.reduce.slowstart.completedmaps": "0.05",
+            "mapreduce.output.fileoutputformat.compress.type": "BLOCK",
+            "mapreduce.reduce.speculative": "false",
+            "mapreduce.reduce.java.opts": "-Xmx546m",
+            "mapreduce.am.max-attempts": "2",
+            "yarn.app.mapreduce.am.admin-command-opts": "-Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN",
+            "mapreduce.reduce.log.level": "INFO",
+            "mapreduce.map.sort.spill.percent": "0.7",
+            "mapreduce.task.timeout": "300000",
+            "mapreduce.map.memory.mb": "341",
+            "mapreduce.task.io.sort.factor": "100",
+            "mapreduce.jobhistory.intermediate-done-dir": "/mr-history/tmp",
+            "mapreduce.reduce.memory.mb": "683",
+            "yarn.app.mapreduce.am.log.level": "INFO",
+            "mapreduce.map.log.level": "INFO",
+            "mapreduce.shuffle.port": "13562",
+            "mapreduce.admin.user.env": "LD_LIBRARY_PATH=/usr/lib/hadoop/lib/native:/usr/lib/hadoop/lib/native/`$JAVA_HOME/bin/java -d32 -version &amp;&gt; /dev/null;if [ $? -eq 0 ]; then echo Linux-i386-32; else echo Linux-amd64-64;fi`",
+            "mapreduce.map.output.compress": "false",
+            "yarn.app.mapreduce.am.staging-dir": "/user",
+            "mapreduce.reduce.shuffle.parallelcopies": "30",
+            "mapreduce.reduce.shuffle.input.buffer.percent": "0.7",
+            "mapreduce.jobhistory.webapp.address": "c6402.ambari.apache.org:19888",
+            "mapreduce.jobhistory.done-dir": "/mr-history/done",
+            "mapreduce.admin.reduce.child.java.opts": "-Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN",
+            "mapreduce.task.io.sort.mb": "136",
+            "yarn.app.mapreduce.am.command-opts": "-Xmx546m",
+            "mapreduce.admin.map.child.java.opts": "-Djava.net.preferIPv4Stack=true -Dhadoop.metrics.log.level=WARN"
+        },
+        "oozie-site": {
+            "oozie.service.PurgeService.purge.interval": "3600",
+            "oozie.service.CallableQueueService.queue.size": "1000",
+            "oozie.service.SchemaService.wf.ext.schemas": "shell-action-0.1.xsd,email-action-0.1.xsd,hive-action-0.2.xsd,sqoop-action-0.2.xsd,ssh-action-0.1.xsd,distcp-action-0.1.xsd,shell-action-0.2.xsd,oozie-sla-0.1.xsd,oozie-sla-0.2.xsd,hive-action-0.3.xsd",
+            "oozie.service.JPAService.jdbc.url": "jdbc:derby:${oozie.data.dir}/${oozie.db.schema.name}-db;create=true",
+            "oozie.service.HadoopAccessorService.nameNode.whitelist": " ",
+            "use.system.libpath.for.mapreduce.and.pig.jobs": "false",
+            "oozie.db.schema.name": "oozie",
+            "oozie.credentials.credentialclasses": "hcat=org.apache.oozie.action.hadoop.HCatCredentials",
+            "oozie.service.JPAService.create.db.schema": "false",
+            "oozie.authentication.kerberos.name.rules": "\n        RULE:[2:$1@$0]([jt]t@.*TODO-KERBEROS-DOMAIN)s/.*/TODO-MAPREDUSER/\n        RULE:[2:$1@$0]([nd]n@.*TODO-KERBEROS-DOMAIN)s/.*/TODO-HDFSUSER/\n        RULE:[2:$1@$0](hm@.*TODO-KERBEROS-DOMAIN)s/.*/TODO-HBASE-USER/\n        RULE:[2:$1@$0](rs@.*TODO-KERBEROS-DOMAIN)s/.*/TODO-HBASE-USER/\n        DEFAULT",
+            "oozie.service.ActionService.executor.ext.classes": "\n            org.apache.oozie.action.email.EmailActionExecutor,\n            org.apache.oozie.action.hadoop.HiveActionExecutor,\n            org.apache.oozie.action.hadoop.ShellActionExecutor,\n            org.apache.oozie.action.hadoop.SqoopActionExecutor,\n            org.apache.oozie.action.hadoop.DistcpActionExecutor",
+            "oozie.base.url": "http://c6402.ambari.apache.org:11000/oozie",
+            "oozie.service.JPAService.jdbc.password": "asd",
+            "oozie.service.coord.normal.default.timeout": "120",
+            "oozie.service.AuthorizationService.security.enabled": "true",
+            "oozie.service.JPAService.pool.max.active.conn": "10",
+            "oozie.service.PurgeService.older.than": "30",
+            "oozie.service.coord.push.check.requeue.interval": "30000",
+            "oozie.service.HadoopAccessorService.hadoop.configurations": "*=/etc/hadoop/conf",
+            "oozie.service.HadoopAccessorService.jobTracker.whitelist": " ",
+            "oozie.service.CallableQueueService.callable.concurrency": "3",
+            "oozie.service.JPAService.jdbc.username": "oozie",
+            "oozie.service.CallableQueueService.threads": "10",
+            "oozie.services.ext": "org.apache.oozie.service.PartitionDependencyManagerService,org.apache.oozie.service.HCatAccessorService",
+            "oozie.systemmode": "NORMAL",
+            "oozie.service.WorkflowAppService.system.libpath": "/user/${user.name}/share/lib",
+            "oozie.services": "\n        org.apache.oozie.service.SchedulerService,\n        org.apache.oozie.service.InstrumentationService,\n        org.apache.oozie.service.CallableQueueService,\n        org.apache.oozie.service.UUIDService,\n        org.apache.oozie.service.ELService,\n        org.apache.oozie.service.AuthorizationService,\n        org.apache.oozie.service.UserGroupInformationService,\n        org.apache.oozie.service.HadoopAccessorService,\n        org.apache.oozie.service.URIHandlerService,\n        org.apache.oozie.service.MemoryLocksService,\n        org.apache.oozie.service.DagXLogInfoService,\n        org.apache.oozie.service.SchemaService,\n        org.apache.oozie.service.LiteWorkflowAppService,\n        org.apache.oozie.service.JPAService,\n        org.apache.oozie.service.StoreService,\n        org.apache.oozie.service.CoordinatorStoreService,\n        org.apache.oozie.service.SLAStoreService,\n        org.apache.oozie.service.DBLiteWorkflowStoreServic
 e,\n        org.apache.oozie.service.CallbackService,\n        org.apache.oozie.service.ActionService,\n        org.apache.oozie.service.ActionCheckerService,\n        org.apache.oozie.service.RecoveryService,\n        org.apache.oozie.service.PurgeService,\n        org.apache.oozie.service.CoordinatorEngineService,\n        org.apache.oozie.service.BundleEngineService,\n        org.apache.oozie.service.DagEngineService,\n        org.apache.oozie.service.CoordMaterializeTriggerService,\n        org.apache.oozie.service.StatusTransitService,\n        org.apache.oozie.service.PauseTransitService,\n        org.apache.oozie.service.GroupsService,\n        org.apache.oozie.service.ProxyUserService",
+            "oozie.service.URIHandlerService.uri.handlers": "org.apache.oozie.dependency.FSURIHandler,org.apache.oozie.dependency.HCatURIHandler",
+            "oozie.authentication.type": "simple",
+            "oozie.service.JPAService.jdbc.driver": "org.apache.derby.jdbc.EmbeddedDriver",
+            "oozie.system.id": "oozie-${user.name}"
+        },
+        "storm-site": {
+            "topology.tuple.serializer": "backtype.storm.serialization.types.ListDelegateSerializer",
+            "topology.workers": "1",
+            "drpc.worker.threads": "64",
+            "storm.zookeeper.servers": "['c6401.ambari.apache.org','c6402.ambari.apache.org']",
+            "supervisor.heartbeat.frequency.secs": "5",
+            "topology.executor.send.buffer.size": "1024",
+            "drpc.childopts": "-Xmx768m",
+            "nimbus.thrift.port": "6627",
+            "storm.zookeeper.retry.intervalceiling.millis": "30000",
+            "storm.local.dir": "/hadoop/storm",
+            "topology.receiver.buffer.size": "8",
+            "storm.messaging.netty.client_worker_threads": "1",
+            "transactional.zookeeper.root": "/transactional",
+            "drpc.request.timeout.secs": "600",
+            "topology.skip.missing.kryo.registrations": "false",
+            "worker.heartbeat.frequency.secs": "1",
+            "zmq.hwm": "0",
+            "storm.zookeeper.connection.timeout": "15000",
+            "topology.max.error.report.per.interval": "5",
+            "storm.messaging.netty.server_worker_threads": "1",
+            "supervisor.worker.start.timeout.secs": "120",
+            "zmq.threads": "1",
+            "topology.acker.executors": "null",
+            "storm.local.mode.zmq": "false",
+            "topology.max.task.parallelism": "null",
+            "storm.zookeeper.port": "2181",
+            "nimbus.childopts": "-Xmx1024m",
+            "worker.childopts": "-Xmx768m",
+            "drpc.queue.size": "128",
+            "storm.zookeeper.retry.times": "5",
+            "nimbus.monitor.freq.secs": "10",
+            "storm.cluster.mode": "distributed",
+            "dev.zookeeper.path": "/tmp/dev-storm-zookeeper",
+            "drpc.invocations.port": "3773",
+            "storm.zookeeper.root": "/storm",
+            "logviewer.childopts": "-Xmx128m",
+            "transactional.zookeeper.port": "null",
+            "topology.worker.childopts": "null",
+            "topology.max.spout.pending": "null",
+            "nimbus.cleanup.inbox.freq.secs": "600",
+            "storm.messaging.netty.min_wait_ms": "100",
+            "nimbus.task.timeout.secs": "30",
+            "nimbus.thrift.max_buffer_size": "1048576",
+            "topology.sleep.spout.wait.strategy.time.ms": "1",
+            "topology.optimize": "true",
+            "nimbus.reassign": "true",
+            "storm.messaging.transport": "backtype.storm.messaging.netty.Context",
+            "logviewer.appender.name": "A1",
+            "nimbus.host": "c6401.ambari.apache.org",
+            "ui.port": "8744",
+            "supervisor.slots.ports": "[6700, 6701]",
+            "nimbus.file.copy.expiration.secs": "600",
+            "supervisor.monitor.frequency.secs": "3",
+            "ui.childopts": "-Xmx768m",
+            "transactional.zookeeper.servers": "null",
+            "zmq.linger.millis": "5000",
+            "topology.error.throttle.interval.secs": "10",
+            "topology.worker.shared.thread.pool.size": "4",
+            "java.library.path": "/usr/local/lib:/opt/local/lib:/usr/lib",
+            "topology.spout.wait.strategy": "backtype.storm.spout.SleepSpoutWaitStrategy",
+            "task.heartbeat.frequency.secs": "3",
+            "topology.transfer.buffer.size": "1024",
+            "storm.zookeeper.session.timeout": "20000",
+            "topology.executor.receive.buffer.size": "1024",
+            "topology.stats.sample.rate": "0.05",
+            "topology.fall.back.on.java.serialization": "true",
+            "supervisor.childopts": "-Xmx256m",
+            "topology.enable.message.timeouts": "true",
+            "storm.messaging.netty.max_wait_ms": "1000",
+            "nimbus.topology.validator": "backtype.storm.nimbus.DefaultTopologyValidator",
+            "nimbus.supervisor.timeout.secs": "60",
+            "topology.disruptor.wait.strategy": "com.lmax.disruptor.BlockingWaitStrategy",
+            "nimbus.inbox.jar.expiration.secs": "3600",
+            "drpc.port": "3772",
+            "topology.kryo.factory": "backtype.storm.serialization.DefaultKryoFactory",
+            "storm.zookeeper.retry.interval": "1000",
+            "storm.messaging.netty.max_retries": "30",
+            "topology.tick.tuple.freq.secs": "null",
+            "supervisor.enable": "true",
+            "nimbus.task.launch.secs": "120",
+            "task.refresh.poll.secs": "10",
+            "topology.message.timeout.secs": "30",
+            "storm.messaging.netty.buffer_size": "5242880",
+            "topology.state.synchronization.timeout.secs": "60",
+            "supervisor.worker.timeout.secs": "30",
+            "topology.trident.batch.emit.interval.millis": "500",
+            "topology.builtin.metrics.bucket.size.secs": "60",
+            "storm.thrift.transport": "backtype.storm.security.auth.SimpleTransportPlugin",
+            "logviewer.port": "8000",
+            "topology.debug": "false"
+        },
+        "webhcat-site": {
+            "templeton.pig.path": "pig.tar.gz/pig/bin/pig",
+            "templeton.exec.timeout": "60000",
+            "templeton.override.enabled": "false",
+            "templeton.jar": "/usr/lib/hcatalog/share/webhcat/svr/webhcat.jar",
+            "templeton.zookeeper.hosts": "c6401.ambari.apache.org:2181,c6402.ambari.apache.org:2181",
+            "templeton.hive.properties": "hive.metastore.local=false,hive.metastore.uris=thrift://c6402.ambari.apache.org:9083,hive.metastore.sasl.enabled=yes,hive.metastore.execute.setugi=true,hive.metastore.warehouse.dir=/apps/hive/warehouse",
+            "templeton.storage.class": "org.apache.hive.hcatalog.templeton.tool.ZooKeeperStorage",
+            "templeton.hive.archive": "hdfs:///apps/webhcat/hive.tar.gz",
+            "templeton.streaming.jar": "hdfs:///apps/webhcat/hadoop-streaming.jar",
+            "templeton.port": "50111",
+            "templeton.libjars": "/usr/lib/zookeeper/zookeeper.jar",
+            "templeton.hadoop": "/usr/bin/hadoop",
+            "templeton.hive.path": "hive.tar.gz/hive/bin/hive",
+            "templeton.hadoop.conf.dir": "/etc/hadoop/conf",
+            "templeton.hcat": "/usr/bin/hcat",
+            "templeton.pig.archive": "hdfs:///apps/webhcat/pig.tar.gz",
+            "templeton.sqoop.archive": "hdfs:///apps/webhcat/sqoop.tar.gz"
+        },
+        "capacity-scheduler": {
+            "yarn.scheduler.capacity.node-locality-delay": "40",
+            "yarn.scheduler.capacity.root.capacity": "100",
+            "yarn.scheduler.capacity.root.acl_administer_queue": "*",
+            "yarn.scheduler.capacity.root.queues": "default",
+            "yarn.scheduler.capacity.maximum-applications": "10000",
+            "yarn.scheduler.capacity.root.default.user-limit-factor": "1",
+            "yarn.scheduler.capacity.root.default.maximum-capacity": "100",
+            "yarn.scheduler.capacity.root.default.state": "RUNNING",
+            "yarn.scheduler.capacity.maximum-am-resource-percent": "0.2",
+            "yarn.scheduler.capacity.root.default.acl_administer_jobs": "*",
+            "yarn.scheduler.capacity.root.default.capacity": "100",
+            "yarn.scheduler.capacity.root.default.acl_submit_applications": "*"
+        },
+        "hdfs-site": {
+            "dfs.namenode.checkpoint.period": "21600",
+            "dfs.namenode.avoid.write.stale.datanode": "true",
+            "dfs.block.access.token.enable": "true",
+            "dfs.support.append": "true",
+            "dfs.datanode.address": "0.0.0.0:${ambari.dfs.datanode.port}",
+            "nfs.file.dump.dir": "/tmp/.hdfs-nfs",
+            "dfs.datanode.address": "0.0.0.0:${ambari.dfs.datanode.port}", 
+            "dfs.cluster.administrators": "test_user1,test_user2 hdfs,test_group",
+            "dfs.replication": "3",
+            "ambari.dfs.datanode.http.port": "50075",
+            "dfs.datanode.balance.bandwidthPerSec": "6250000",
+            "dfs.namenode.safemode.threshold-pct": "1.0f",
+            "dfs.namenode.checkpoint.edits.dir": "${dfs.namenode.checkpoint.dir}",
+            "dfs.permissions.enabled": "true",
+            "fs.checkpoint.size": "67108864",
+            "dfs.client.read.shortcircuit": "true",
+            "dfs.namenode.https-address": "c6401.ambari.apache.org:50470",
+            "dfs.journalnode.edits.dir": "/grid/0/hdfs/journal",
+            "dfs.blocksize": "134217728",
+            "dfs.datanode.max.transfer.threads": "1024",
+            "dfs.datanode.du.reserved": "1073741824",
+            "dfs.webhdfs.enabled": "true",
+            "dfs.namenode.handler.count": "100",
+            "dfs.namenode.checkpoint.dir": "/hadoop/hdfs/namesecondary,/hadoop/hdfs/namesecondary2",
+            "fs.permissions.umask-mode": "022",
+            "dfs.datanode.http.address": "0.0.0.0:50075",
+            "dfs.datanode.ipc.address": "0.0.0.0:8010",
+            "dfs.datanode.data.dir": "/hadoop/hdfs/data",
+            "dfs.namenode.http-address": "c6401.ambari.apache.org:50070",
+            "dfs.blockreport.initialDelay": "120",
+            "dfs.datanode.failed.volumes.tolerated": "0",
+            "dfs.namenode.accesstime.precision": "0",
+            "ambari.dfs.datanode.port": "50010",
+            "dfs.namenode.avoid.read.stale.datanode": "true",
+            "dfs.namenode.secondary.http-address": "c6402.ambari.apache.org:50090",
+            "dfs.namenode.stale.datanode.interval": "30000",
+            "dfs.heartbeat.interval": "3",
+            "dfs.client.read.shortcircuit.streams.cache.size": "4096",
+            "dfs.permissions.superusergroup": "hdfs",
+            "dfs.https.port": "50470",
+            "dfs.journalnode.http-address": "0.0.0.0:8480",
+            "dfs.domain.socket.path": "/var/lib/hadoop-hdfs/dn_socket",
+            "dfs.namenode.write.stale.datanode.ratio": "1.0f",
+            "dfs.hosts.exclude": "/etc/hadoop/conf/dfs.exclude",
+            "dfs.datanode.data.dir.perm": "750",
+            "dfs.namenode.name.dir.restore": "true",
+            "dfs.replication.max": "50",
+            "dfs.namenode.name.dir": "/hadoop/hdfs/namenode"
+        },
+        "hbase-site": {
+            "hbase.hstore.flush.retries.number": "120",
+            "hbase.client.keyvalue.maxsize": "10485760",
+            "hbase.hstore.compactionThreshold": "3",
+            "hbase.rootdir": "hdfs://c6401.ambari.apache.org:8020/apps/hbase/data",
+            "hbase.regionserver.handler.count": "60",
+            "hbase.regionserver.global.memstore.lowerLimit": "0.38",
+            "hbase.hregion.memstore.block.multiplier": "2",
+            "hbase.hregion.memstore.flush.size": "134217728",
+            "hbase.superuser": "hbase",
+            "hbase.zookeeper.property.clientPort": "2181",
+            "hbase.regionserver.global.memstore.upperLimit": "0.4",
+            "zookeeper.session.timeout": "30000",
+            "hbase.tmp.dir": "/hadoop/hbase",
+            "hbase.local.dir": "${hbase.tmp.dir}/local",
+            "hbase.hregion.max.filesize": "10737418240",
+            "hfile.block.cache.size": "0.40",
+            "hbase.security.authentication": "simple",
+            "hbase.defaults.for.version.skip": "true",
+            "hbase.zookeeper.quorum": "c6401.ambari.apache.org,c6402.ambari.apache.org",
+            "zookeeper.znode.parent": "/hbase-unsecure",
+            "hbase.hstore.blockingStoreFiles": "10",
+            "hbase.master.port": "60000",
+            "hbase.hregion.majorcompaction": "86400000",
+            "hbase.security.authorization": "false",
+            "hbase.cluster.distributed": "true",
+            "hbase.hregion.memstore.mslab.enabled": "true",
+            "hbase.client.scanner.caching": "100",
+            "hbase.zookeeper.useMulti": "true"
+        },
+        "core-site": {
+            "io.serializations": "org.apache.hadoop.io.serializer.WritableSerialization",
+            "gluster.daemon.user": "null",
+            "hadoop.proxyuser.oozie.groups": "users",
+            "hadoop.proxyuser.hcat.hosts": "c6402.ambari.apache.org",
+            "hadoop.proxyuser.hive.groups": "users",
+            "hadoop.security.authentication": "simple",
+            "hadoop.proxyuser.oozie.hosts": "c6402.ambari.apache.org",
+            "io.compression.codecs": "org.apache.hadoop.io.compress.GzipCodec,org.apache.hadoop.io.compress.DefaultCodec",
+            "mapreduce.jobtracker.webinterface.trusted": "false",
+            "fs.AbstractFileSystem.glusterfs.impl": "null",
+            "fs.defaultFS": "hdfs://c6401.ambari.apache.org:8020",
+            "fs.trash.interval": "360",
+            "ipc.client.idlethreshold": "8000",
+            "io.file.buffer.size": "131072",
+            "hadoop.security.authorization": "false",
+            "hadoop.proxyuser.hive.hosts": "c6402.ambari.apache.org",
+            "hadoop.security.auth_to_local": "\n        RULE:[2:$1@$0]([rn]m@.*)s/.*/yarn/\n        RULE:[2:$1@$0](jhs@.*)s/.*/mapred/\n        RULE:[2:$1@$0]([nd]n@.*)s/.*/hdfs/\n        RULE:[2:$1@$0](hm@.*)s/.*/hbase/\n        RULE:[2:$1@$0](rs@.*)s/.*/hbase/\n        DEFAULT",
+            "hadoop.proxyuser.hcat.groups": "users",
+            "ipc.client.connection.maxidletime": "30000",
+            "ipc.client.connect.max.retries": "50"
+        },
+        "hive-site": {
+            "hive.enforce.sorting": "true",
+            "javax.jdo.option.ConnectionPassword": "!`\"' 1",
+            "javax.jdo.option.ConnectionDriverName": "com.mysql.jdbc.Driver",
+            "hive.optimize.bucketmapjoin.sortedmerge": "true",
+            "hive.security.metastore.authorization.manager": "org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider",
+            "fs.file.impl.disable.cache": "true",
+            "hive.auto.convert.join.noconditionaltask": "true",
+            "hive.map.aggr": "true",
+            "hive.optimize.index.filter": "true",
+            "hive.security.authorization.enabled": "false",
+            "hive.optimize.reducededuplication.min.reducer": "1",
+            "hive.optimize.bucketmapjoin": "true",
+            "hive.metastore.uris": "thrift://c6402.ambari.apache.org:9083",
+            "hive.mapjoin.bucket.cache.size": "10000",
+            "hive.auto.convert.join.noconditionaltask.size": "1000000000",
+            "hive.vectorized.execution.enabled": "false",
+            "javax.jdo.option.ConnectionUserName": "hive",
+            "hive.metastore.cache.pinobjtypes": "Table,Database,Type,FieldSchema,Order",
+            "hive.optimize.reducededuplication": "true",
+            "hive.metastore.warehouse.dir": "/apps/hive/warehouse",
+            "hive.metastore.client.socket.timeout": "60",
+            "hive.auto.convert.join": "true",
+            "hive.enforce.bucketing": "true",
+            "hive.mapred.reduce.tasks.speculative.execution": "false",
+            "hive.security.authenticator.manager": "org.apache.hadoop.hive.ql.security.ProxyUserAuthenticator",
+            "javax.jdo.option.ConnectionURL": "jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true",
+            "hive.auto.convert.sortmerge.join": "true",
+            "fs.hdfs.impl.disable.cache": "true",
+            "hive.security.authorization.manager": "org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider",
+            "ambari.hive.db.schema.name": "hive",
+            "hive.metastore.execute.setugi": "true",
+            "hive.auto.convert.sortmerge.join.noconditionaltask": "true",
+            "hive.server2.enable.doAs": "true",
+            "hive.server2.authentication": "NOSASL",
+            "hive.server2.transport.mode": "binary",
+            "hive.optimize.mapjoin.mapreduce": "true",
+            "hive.exec.scratchdir" : "/custompath/tmp/hive"
+        },
+        "hive-interactive-site": {
+            "hive.enforce.sorting": "true",
+            "javax.jdo.option.ConnectionPassword": "!`\"' 1",
+            "javax.jdo.option.ConnectionDriverName": "com.mysql.jdbc.Driver",
+            "hive.optimize.bucketmapjoin.sortedmerge": "true",
+            "hive.security.metastore.authorization.manager": "org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider",
+            "fs.file.impl.disable.cache": "true",
+            "hive.auto.convert.join.noconditionaltask": "true",
+            "hive.map.aggr": "true",
+            "hive.optimize.index.filter": "true",
+            "hive.security.authorization.enabled": "false",
+            "hive.optimize.reducededuplication.min.reducer": "1",
+            "hive.optimize.bucketmapjoin": "true",
+            "hive.metastore.uris": "thrift://c6402.ambari.apache.org:9084",
+            "hive.mapjoin.bucket.cache.size": "10000",
+            "hive.auto.convert.join.noconditionaltask.size": "1000000000",
+            "hive.vectorized.execution.enabled": "false",
+            "javax.jdo.option.ConnectionUserName": "hive",
+            "hive.metastore.cache.pinobjtypes": "Table,Database,Type,FieldSchema,Order",
+            "hive.optimize.reducededuplication": "true",
+            "hive.metastore.warehouse.dir": "/apps/hive/warehouse",
+            "hive.metastore.client.socket.timeout": "60",
+            "hive.auto.convert.join": "true",
+            "hive.enforce.bucketing": "true",
+            "hive.mapred.reduce.tasks.speculative.execution": "false",
+            "hive.security.authenticator.manager": "org.apache.hadoop.hive.ql.security.ProxyUserAuthenticator",
+            "javax.jdo.option.ConnectionURL": "jdbc:mysql://c6402.ambari.apache.org/hive?createDatabaseIfNotExist=true",
+            "hive.auto.convert.sortmerge.join": "true",
+            "fs.hdfs.impl.disable.cache": "true",
+            "hive.security.authorization.manager": "org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider",
+            "ambari.hive.db.schema.name": "hive",
+            "hive.metastore.execute.setugi": "true",
+            "hive.auto.convert.sortmerge.join.noconditionaltask": "true",
+            "hive.server2.enable.doAs": "true",
+            "hive.server2.authentication": "NOSASL",
+            "hive.server2.transport.mode": "binary",
+            "hive.optimize.mapjoin.mapreduce": "true",
+            "hive.exec.scratchdir" : "/custompath/tmp/hive"
+        },
+        "hiveserver2-site": {
+            "hive.metastore.metrics.enabled": "true",
+            "hive.service.metrics.reporter": "HADOOP2"
+        },
+		"ranger-hive-plugin-properties": {
+            "XAAUDIT.HDFS.DESTINTATION_FLUSH_INTERVAL_SECONDS": "900",
+            "XAAUDIT.HDFS.DESTINATION_DIRECTORY": "hdfs://__REPLACE__NAME_NODE_HOST:8020/ranger/audit/%app-type%/%time:yyyyMMdd%",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_DIRECTORY": "__REPLACE__LOG_DIR/hadoop/%app-type%/audit",
+            "common.name.for.certificate": "-",
+            "XAAUDIT.HDFS.IS_ENABLED": "false",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_FILE": "%time:yyyyMMdd-HHmm.ss%.log",
+            "SSL_KEYSTORE_PASSWORD": "myKeyFilePassword",
+            "XAAUDIT.DB.IS_ENABLED": "true",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_ROLLOVER_INTERVAL_SECONDS": "600",
+            "XAAUDIT.SOLR.SOLR_URL": "http://localhost:6083/solr/ranger_audits",
+            "XAAUDIT.SOLR.IS_ENABLED": "false",
+            "SSL_KEYSTORE_FILE_PATH": "/etc/hadoop/conf/ranger-plugin-keystore.jks",
+            "XAAUDIT.HDFS.DESTINTATION_OPEN_RETRY_INTERVAL_SECONDS": "60",
+            "policy_user": "ambari-qa",
+            "UPDATE_XAPOLICIES_ON_GRANT_REVOKE": "true",
+            "XAAUDIT.HDFS.DESTINTATION_FILE": "%hostname%-audit.log",
+            "XAAUDIT.HDFS.DESTINTATION_ROLLOVER_INTERVAL_SECONDS": "86400",
+            "XAAUDIT.HDFS.LOCAL_ARCHIVE_MAX_FILE_COUNT": "10",
+            "SSL_TRUSTSTORE_PASSWORD": "changeit",
+            "XAAUDIT.HDFS.LOCAL_ARCHIVE_DIRECTORY": "__REPLACE__LOG_DIR/hadoop/%app-type%/audit/archive",
+            "ranger-hive-plugin-enabled": "No",
+            "jdbc.driverClassName": "org.apache.hive.jdbc.HiveDriver",
+            "REPOSITORY_CONFIG_USERNAME": "hive",
+            "XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS": "1000",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_FLUSH_INTERVAL_SECONDS": "60",
+            "SSL_TRUSTSTORE_FILE_PATH": "/etc/hadoop/conf/ranger-plugin-truststore.jks",
+            "REPOSITORY_CONFIG_PASSWORD": "hive",
+            "XAAUDIT.SOLR.MAX_QUEUE_SIZE": "1"
+        },
+		"ranger-knox-plugin-properties": {
+            "XAAUDIT.HDFS.DESTINTATION_FLUSH_INTERVAL_SECONDS": "900",
+            "KNOX_HOME": "/usr/hdp/current/knox-server",
+            "XAAUDIT.HDFS.DESTINATION_DIRECTORY": "hdfs://__REPLACE__NAME_NODE_HOST:8020/ranger/audit/%app-type%/%time:yyyyMMdd%",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_DIRECTORY": "__REPLACE__LOG_DIR/hadoop/%app-type%/audit",
+            "common.name.for.certificate": "-",
+            "XAAUDIT.HDFS.IS_ENABLED": "false",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_FILE": "%time:yyyyMMdd-HHmm.ss%.log",
+            "SSL_KEYSTORE_PASSWORD": "myKeyFilePassword",
+            "XAAUDIT.DB.IS_ENABLED": "true",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_ROLLOVER_INTERVAL_SECONDS": "600",
+            "XAAUDIT.HDFS.DESTINTATION_OPEN_RETRY_INTERVAL_SECONDS": "60",
+            "XAAUDIT.SOLR.SOLR_URL": "http://localhost:6083/solr/ranger_audits",
+            "XAAUDIT.SOLR.IS_ENABLED": "false",
+            "SSL_KEYSTORE_FILE_PATH": "/etc/hadoop/conf/ranger-plugin-keystore.jks",
+            "ranger-knox-plugin-enabled": "No",
+            "policy_user": "ambari-qa",
+            "XAAUDIT.HDFS.DESTINTATION_FILE": "%hostname%-audit.log",
+            "XAAUDIT.HDFS.DESTINTATION_ROLLOVER_INTERVAL_SECONDS": "86400",
+            "XAAUDIT.HDFS.LOCAL_ARCHIVE_MAX_FILE_COUNT": "10",
+            "SSL_TRUSTSTORE_PASSWORD": "changeit",
+            "XAAUDIT.HDFS.LOCAL_ARCHIVE_DIRECTORY": "__REPLACE__LOG_DIR/hadoop/%app-type%/audit/archive",
+            "REPOSITORY_CONFIG_USERNAME": "admin",
+            "XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS": "1000",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_FLUSH_INTERVAL_SECONDS": "60",
+            "SSL_TRUSTSTORE_FILE_PATH": "/etc/hadoop/conf/ranger-plugin-truststore.jks",
+            "REPOSITORY_CONFIG_PASSWORD": "admin-password",
+            "XAAUDIT.SOLR.MAX_QUEUE_SIZE": "1"
+        },
+        "yarn-site": {
+            "yarn.nodemanager.disk-health-checker.min-healthy-disks": "0.25",
+            "yarn.nodemanager.container-executor.class": "org.apache.hadoop.yarn.server.nodemanager.DefaultContainerExecutor",
+            "yarn.nodemanager.local-dirs": "/hadoop/yarn/local,/hadoop/yarn/local1",
+            "yarn.resourcemanager.resource-tracker.address": "c6402.ambari.apache.org:8025",
+            "yarn.nodemanager.remote-app-log-dir-suffix": "logs",
+            "yarn.resourcemanager.hostname": "c6402.ambari.apache.org",
+            "yarn.nodemanager.health-checker.script.timeout-ms": "60000",
+            "yarn.resourcemanager.scheduler.class": "org.apache.hadoop.yarn.server.resourcemanager.scheduler.capacity.CapacityScheduler",
+            "yarn.nodemanager.resource.memory-mb": "2048",
+            "yarn.scheduler.minimum-allocation-mb": "683",
+            "yarn.resourcemanager.address": "c6402.ambari.apache.org:8050",
+            "yarn.resourcemanager.scheduler.address": "c6402.ambari.apache.org:8030",
+            "yarn.log-aggregation.retain-seconds": "2592000",
+            "yarn.scheduler.maximum-allocation-mb": "2048",
+            "yarn.log-aggregation-enable": "true",
+            "yarn.nodemanager.address": "0.0.0.0:45454",
+            "yarn.nodemanager.container-monitor.interval-ms": "3000",
+            "yarn.nodemanager.log-aggregation.compression-type": "gz",
+            "yarn.nodemanager.log.retain-seconds": "604800",
+            "yarn.nodemanager.delete.debug-delay-sec": "0",
+            "yarn.nodemanager.log-dirs": "/hadoop/yarn/log,/hadoop/yarn/log1",
+            "yarn.nodemanager.health-checker.interval-ms": "135000",
+            "yarn.resourcemanager.am.max-attempts": "2",
+            "yarn.nodemanager.remote-app-log-dir": "/app-logs",
+            "yarn.nodemanager.admin-env": "MALLOC_ARENA_MAX=$MALLOC_ARENA_MAX",
+            "yarn.nodemanager.aux-services": "mapreduce_shuffle",
+            "yarn.nodemanager.vmem-check-enabled": "false",
+            "yarn.nodemanager.vmem-pmem-ratio": "2.1",
+            "yarn.admin.acl": "*",
+            "yarn.resourcemanager.webapp.address": "c6402.ambari.apache.org:8088",
+            "yarn.resourcemanager.nodes.exclude-path": "/etc/hadoop/conf/yarn.exclude",
+            "yarn.nodemanager.linux-container-executor.group": "hadoop",
+            "yarn.acl.enable": "true",
+            "yarn.log.server.url": "http://c6402.ambari.apache.org:19888/jobhistory/logs",
+            "yarn.application.classpath": "/etc/hadoop/conf,/usr/lib/hadoop/*,/usr/lib/hadoop/lib/*,/usr/lib/hadoop-hdfs/*,/usr/lib/hadoop-hdfs/lib/*,/usr/lib/hadoop-yarn/*,/usr/lib/hadoop-yarn/lib/*,/usr/lib/hadoop-mapreduce/*,/usr/lib/hadoop-mapreduce/lib/*",
+            "yarn.resourcemanager.admin.address": "c6402.ambari.apache.org:8141",
+            "yarn.nodemanager.aux-services.mapreduce_shuffle.class": "org.apache.hadoop.mapred.ShuffleHandler",
+            "yarn.timeline-service.leveldb-timeline-store.path": "/var/log/hadoop-yarn/timeline",
+            "yarn.http.policy": "HTTP_ONLY",
+            "yarn.resourcemanager.webapp.https.address": "c6402.ambari.apache.org:8090"
+        },
+        "ranger-yarn-plugin-properties": {
+            "ranger-yarn-plugin-enabled": "No"
+        },
+        "tez-site": {
+            "tez.am.log.level": "WARN",
+            "tez.lib.uris": "hdfs:///apps/tez/,hdfs:///apps/tez/lib/",
+            "tez.staging-dir": "/tmp/${user.name}/staging",
+            "tez.am.am-rm.heartbeat.interval-ms.max": "250"
+        },
+        "slider-env": {
+            "content": "export JAVA_HOME={{java64_home}}\nexport HADOOP_CONF_DIR={{hadoop_conf_dir}}"
+        },
+        "yarn-env": {
+            "yarn_pid_dir_prefix": "/var/run/hadoop-yarn",
+            "apptimelineserver_heapsize": "1024",
+            "nodemanager_heapsize": "1024",
+            "content": "\nexport HADOOP_YARN_HOME={{hadoop_yarn_home}}\nexport YARN_LOG_DIR={{yarn_log_dir_prefix}}/$USER\nexport YARN_PID_DIR={{yarn_pid_dir_prefix}}/$USER\nexport HADOOP_LIBEXEC_DIR={{hadoop_libexec_dir}}\nexport JAVA_HOME={{java64_home}}\n\n# User for YARN daemons\nexport HADOOP_YARN_USER=${HADOOP_YARN_USER:-yarn}\n\n# resolve links - $0 may be a softlink\nexport YARN_CONF_DIR=\"${YARN_CONF_DIR:-$HADOOP_YARN_HOME/conf}\"\n\n# some Java parameters\n# export JAVA_HOME=/home/y/libexec/jdk1.6.0/\nif [ \"$JAVA_HOME\" != \"\" ]; then\n  #echo \"run java in $JAVA_HOME\"\n  JAVA_HOME=$JAVA_HOME\nfi\n\nif [ \"$JAVA_HOME\" = \"\" ]; then\n  echo \"Error: JAVA_HOME is not set.\"\n  exit 1\nfi\n\nJAVA=$JAVA_HOME/bin/java\nJAVA_HEAP_MAX=-Xmx1000m\n\n# For setting YARN specific HEAP sizes please use this\n# Parameter and set appropriately\nYARN_HEAPSIZE={{yarn_heapsize}}\n\n# check envvars which might override default args\nif [ \"$YARN_HEAPSIZE\" != \"\" ]; then\n  JAVA_HEAP_M
 AX=\"-Xmx\"\"$YARN_HEAPSIZE\"\"m\"\nfi\n\n# Resource Manager specific parameters\n\n# Specify the max Heapsize for the ResourceManager using a numerical value\n# in the scale of MB. For example, to specify an jvm option of -Xmx1000m, set\n# the value to 1000.\n# This value will be overridden by an Xmx setting specified in either YARN_OPTS\n# and/or YARN_RESOURCEMANAGER_OPTS.\n# If not specified, the default value will be picked from either YARN_HEAPMAX\n# or JAVA_HEAP_MAX with YARN_HEAPMAX as the preferred option of the two.\nexport YARN_RESOURCEMANAGER_HEAPSIZE={{resourcemanager_heapsize}}\n\n# Specify the JVM options to be used when starting the ResourceManager.\n# These options will be appended to the options specified as YARN_OPTS\n# and therefore may override any similar flags set in YARN_OPTS\n#export YARN_RESOURCEMANAGER_OPTS=\n\n# Node Manager specific parameters\n\n# Specify the max Heapsize for the NodeManager using a numerical value\n# in the scale of MB. For example, to 
 specify an jvm option of -Xmx1000m, set\n# the value to 1000.\n# This value will be overridden by an Xmx setting specified in either YARN_OPTS\n# and/or YARN_NODEMANAGER_OPTS.\n# If not specified, the default value will be picked from either YARN_HEAPMAX\n# or JAVA_HEAP_MAX with YARN_HEAPMAX as the preferred option of the two.\nexport YARN_NODEMANAGER_HEAPSIZE={{nodemanager_heapsize}}\n\n# Specify the max Heapsize for the HistoryManager using a numerical value\n# in the scale of MB. For example, to specify an jvm option of -Xmx1000m, set\n# the value to 1024.\n# This value will be overridden by an Xmx setting specified in either YARN_OPTS\n# and/or YARN_HISTORYSERVER_OPTS.\n# If not specified, the default value will be picked from either YARN_HEAPMAX\n# or JAVA_HEAP_MAX with YARN_HEAPMAX as the preferred option of the two.\nexport YARN_HISTORYSERVER_HEAPSIZE={{apptimelineserver_heapsize}}\n\n# Specify the JVM options to be used when starting the NodeManager.\n# These options will be
  appended to the options specified as YARN_OPTS\n# and therefore may override any similar flags set in YARN_OPTS\n#export YARN_NODEMANAGER_OPTS=\n\n# so that filenames w/ spaces are handled correctly in loops below\nIFS=\n\n\n# default log directory and file\nif [ \"$YARN_LOG_DIR\" = \"\" ]; then\n  YARN_LOG_DIR=\"$HADOOP_YARN_HOME/logs\"\nfi\nif [ \"$YARN_LOGFILE\" = \"\" ]; then\n  YARN_LOGFILE='yarn.log'\nfi\n\n# default policy file for service-level authorization\nif [ \"$YARN_POLICYFILE\" = \"\" ]; then\n  YARN_POLICYFILE=\"hadoop-policy.xml\"\nfi\n\n# restore ordinary behaviour\nunset IFS\n\n\nYARN_OPTS=\"$YARN_OPTS -Dhadoop.log.dir=$YARN_LOG_DIR\"\nYARN_OPTS=\"$YARN_OPTS -Dyarn.log.dir=$YARN_LOG_DIR\"\nYARN_OPTS=\"$YARN_OPTS -Dhadoop.log.file=$YARN_LOGFILE\"\nYARN_OPTS=\"$YARN_OPTS -Dyarn.log.file=$YARN_LOGFILE\"\nYARN_OPTS=\"$YARN_OPTS -Dyarn.home.dir=$YARN_COMMON_HOME\"\nYARN_OPTS=\"$YARN_OPTS -Dyarn.id.str=$YARN_IDENT_STRING\"\nYARN_OPTS=\"$YARN_OPTS -Dhadoop.root.logger=$
 {YARN_ROOT_LOGGER:-INFO,console}\"\nYARN_OPTS=\"$YARN_OPTS -Dyarn.root.logger=${YARN_ROOT_LOGGER:-INFO,console}\"\nif [ \"x$JAVA_LIBRARY_PATH\" != \"x\" ]; then\n  YARN_OPTS=\"$YARN_OPTS -Djava.library.path=$JAVA_LIBRARY_PATH\"\nfi\nYARN_OPTS=\"$YARN_OPTS -Dyarn.policy.file=$YARN_POLICYFILE\"",
+            "yarn_heapsize": "1024",
+            "yarn_user": "yarn",
+            "resourcemanager_heapsize": "1024",
+            "yarn_log_dir_prefix": "/var/log/hadoop-yarn",
+            "min_user_id": "1000",
+            "is_supported_yarn_ranger": "false",
+            "service_check.queue.name": "default"
+        },
+        "hadoop-env": {
+            "hdfs_tmp_dir": "/tmp",
+            "namenode_opt_maxnewsize": "200m",
+            "hdfs_log_dir_prefix": "/var/log/hadoop",
+            "namenode_heapsize": "1024m",
+            "namenode_opt_newsize": "200m",
+            "namenode_opt_permsize" : "128m",
+            "namenode_opt_maxpermsize" : "256m",
+            "content": "\n# Set Hadoop-specific environment variables here.\n\n# The only required environment variable is JAVA_HOME.  All others are\n# optional.  When running a distributed configuration it is best to\n# set JAVA_HOME in this file, so that it is correctly defined on\n# remote nodes.\n\n# The java implementation to use.  Required.\nexport JAVA_HOME={{java_home}}\nexport HADOOP_HOME_WARN_SUPPRESS=1\n\n# Hadoop home directory\nexport HADOOP_HOME=${HADOOP_HOME:-/usr/lib/hadoop}\n\n# Hadoop Configuration Directory\n#TODO: if env var set that can cause problems\nexport HADOOP_CONF_DIR=${HADOOP_CONF_DIR:-{{hadoop_conf_dir}}}\n\n{# this is different for HDP1 #}\n# Path to jsvc required by secure HDP 2.0 datanode\nexport JSVC_HOME={{jsvc_path}}\n\n\n# The maximum amount of heap to use, in MB. Default is 1000.\nexport HADOOP_HEAPSIZE=\"{{hadoop_heapsize}}\"\n\nexport HADOOP_NAMENODE_INIT_HEAPSIZE=\"-Xms{{namenode_heapsize}}\"\n\n# Extra Java runtime options.  Empty by defaul
 t.\nexport HADOOP_OPTS=\"-Djava.net.preferIPv4Stack=true ${HADOOP_OPTS}\"\n\n# Command specific options appended to HADOOP_OPTS when specified\nexport HADOOP_NAMENODE_OPTS=\"-server -XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -XX:ErrorFile={{hdfs_log_dir_prefix}}/$USER/hs_err_pid%p.log -XX:NewSize={{namenode_opt_newsize}} -XX:MaxNewSize={{namenode_opt_maxnewsize}} -XX:PermSize={{namenode_opt_permsize}} -XX:MaxPermSize={{namenode_opt_maxpermsize}} -Xloggc:{{hdfs_log_dir_prefix}}/$USER/gc.log-`date +'%Y%m%d%H%M'` -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xms{{namenode_heapsize}} -Xmx{{namenode_heapsize}} -Dhadoop.security.logger=INFO,DRFAS -Dhdfs.audit.logger=INFO,DRFAAUDIT ${HADOOP_NAMENODE_OPTS}\"\nHADOOP_JOBTRACKER_OPTS=\"-server -XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -XX:ErrorFile={{hdfs_log_dir_prefix}}/$USER/hs_err_pid%p.log -XX:NewSize={{jtnode_opt_newsize}} -XX:MaxNewSize={{jtnode_opt_maxnewsize}} -Xloggc:{{hdfs_log_dir_prefix}
 }/$USER/gc.log-`date +'%Y%m%d%H%M'` -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xmx{{jtnode_heapsize}} -Dhadoop.security.logger=INFO,DRFAS -Dmapred.audit.logger=INFO,MRAUDIT -Dhadoop.mapreduce.jobsummary.logger=INFO,JSA ${HADOOP_JOBTRACKER_OPTS}\"\n\nHADOOP_TASKTRACKER_OPTS=\"-server -Xmx{{ttnode_heapsize}} -Dhadoop.security.logger=ERROR,console -Dmapred.audit.logger=ERROR,console ${HADOOP_TASKTRACKER_OPTS}\"\nHADOOP_DATANODE_OPTS=\"-Xmx{{dtnode_heapsize}} -Dhadoop.security.logger=ERROR,DRFAS ${HADOOP_DATANODE_OPTS}\"\nHADOOP_BALANCER_OPTS=\"-server -Xmx{{hadoop_heapsize}}m ${HADOOP_BALANCER_OPTS}\"\n\nexport HADOOP_SECONDARYNAMENODE_OPTS=\"-server -XX:ParallelGCThreads=8 -XX:+UseConcMarkSweepGC -XX:ErrorFile={{hdfs_log_dir_prefix}}/$USER/hs_err_pid%p.log -XX:NewSize={{namenode_opt_newsize}} -XX:MaxNewSize={{namenode_opt_maxnewsize}} -XX:PermSize={{namenode_opt_permsize}} -XX:MaxPermSize={{namenode_opt_maxpermsize}} -Xloggc:{{hdfs_log_dir_prefix}}/
 $USER/gc.log-`date +'%Y%m%d%H%M'` -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps ${HADOOP_NAMENODE_INIT_HEAPSIZE} -Xmx{{namenode_heapsize}} -Dhadoop.security.logger=INFO,DRFAS -Dhdfs.audit.logger=INFO,DRFAAUDIT ${HADOOP_SECONDARYNAMENODE_OPTS}\"\n\n# The following applies to multiple commands (fs, dfs, fsck, distcp etc)\nexport HADOOP_CLIENT_OPTS=\"-Xmx${HADOOP_HEAPSIZE}m $HADOOP_CLIENT_OPTS\"\n# On secure datanodes, user to run the datanode as after dropping privileges\nexport HADOOP_SECURE_DN_USER={{hdfs_user}}\n\n# Extra ssh options.  Empty by default.\nexport HADOOP_SSH_OPTS=\"-o ConnectTimeout=5 -o SendEnv=HADOOP_CONF_DIR\"\n\n# Where log files are stored.  $HADOOP_HOME/logs by default.\nexport HADOOP_LOG_DIR={{hdfs_log_dir_prefix}}/$USER\n\n# History server logs\nexport HADOOP_MAPRED_LOG_DIR={{mapred_log_dir_prefix}}/$USER\n\n# Where log files are stored in the secure data environment.\nexport HADOOP_SECURE_DN_LOG_DIR={{hdfs_log_dir_prefix}}/$HAD
 OOP_SECURE_DN_USER\n\n# File naming remote slave hosts.  $HADOOP_HOME/conf/slaves by default.\n# export HADOOP_SLAVES=${HADOOP_HOME}/conf/slaves\n\n# host:path where hadoop code should be rsync'd from.  Unset by default.\n# export HADOOP_MASTER=master:/home/$USER/src/hadoop\n\n# Seconds to sleep between slave commands.  Unset by default.  This\n# can be useful in large clusters, where, e.g., slave rsyncs can\n# otherwise arrive faster than the master can service them.\n# export HADOOP_SLAVE_SLEEP=0.1\n\n# The directory where pid files are stored. /tmp by default.\nexport HADOOP_PID_DIR={{hadoop_pid_dir_prefix}}/$USER\nexport HADOOP_SECURE_DN_PID_DIR={{hadoop_pid_dir_prefix}}/$HADOOP_SECURE_DN_USER\n\n# History server pid\nexport HADOOP_MAPRED_PID_DIR={{mapred_pid_dir_prefix}}/$USER\n\nYARN_RESOURCEMANAGER_OPTS=\"-Dyarn.server.resourcemanager.appsummary.logger=INFO,RMSUMMARY\"\n\n# A string representing this instance of hadoop. $USER by default.\nexport HADOOP_IDENT_STRING=$USER\n\n#
  The scheduling priority for daemon processes.  See 'man nice'.\n\n# export HADOOP_NICENESS=10\n\n# Use libraries from standard classpath\nJAVA_JDBC_LIBS=\"\"\n#Add libraries required by mysql connector\nfor jarFile in `ls /usr/share/java/*mysql* 2>/dev/null`\ndo\n  JAVA_JDBC_LIBS=${JAVA_JDBC_LIBS}:$jarFile\ndone\n#Add libraries required by oracle connector\nfor jarFile in `ls /usr/share/java/*ojdbc* 2>/dev/null`\ndo\n  JAVA_JDBC_LIBS=${JAVA_JDBC_LIBS}:$jarFile\ndone\n#Add libraries required by nodemanager\nMAPREDUCE_LIBS={{mapreduce_libs_path}}\nexport HADOOP_CLASSPATH=${HADOOP_CLASSPATH}${JAVA_JDBC_LIBS}:${MAPREDUCE_LIBS}\n\nif [ -d \"/usr/lib/tez\" ]; then\n  export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/usr/lib/tez/*:/usr/lib/tez/lib/*:/etc/tez/conf\nfi\n\n# Setting path to hdfs command line\nexport HADOOP_LIBEXEC_DIR={{hadoop_libexec_dir}}\n\n#Mostly required for hadoop 2.0\nexport JAVA_LIBRARY_PATH=${JAVA_LIBRARY_PATH}:/usr/lib/hadoop/lib/native/Linux-amd64-64",
+            "hdfs_user": "hdfs",
+            "dtnode_heapsize": "1024m",
+            "proxyuser_group": "users",
+            "hadoop_heapsize": "1024",
+            "hadoop_pid_dir_prefix": "/var/run/hadoop"
+        },
+        "hive-env": {
+            "hcat_pid_dir": "/var/run/webhcat",
+            "hcat_user": "hcat",
+            "hive_ambari_database": "MySQL",
+            "hive_hostname": "abtest-3.c.pramod-thangali.internal",
+            "hive_metastore_port": "9083",
+            "webhcat_user": "hcat",
+            "content": "\n if [ \"$SERVICE\" = \"cli\" ]; then\n   if [ -z \"$DEBUG\" ]; then\n     export HADOOP_OPTS=\"$HADOOP_OPTS -XX:NewRatio=12 -Xms10m -XX:MaxHeapFreeRatio=40 -XX:MinHeapFreeRatio=15 -XX:+UseParNewGC -XX:-UseGCOverheadLimit\"\n   else\n     export HADOOP_OPTS=\"$HADOOP_OPTS -XX:NewRatio=12 -Xms10m -XX:MaxHeapFreeRatio=40 -XX:MinHeapFreeRatio=15 -XX:-UseGCOverheadLimit\"\n   fi\n fi\n\n# The heap size of the jvm stared by hive shell script can be controlled via:\n\nexport HADOOP_HEAPSIZE=\"{{hive_heapsize}}\"\nexport HADOOP_CLIENT_OPTS=\"-Xmx${HADOOP_HEAPSIZE}m $HADOOP_CLIENT_OPTS\"\n\n# Larger heap size may be required when running queries over large number of files or partitions.\n# By default hive shell scripts use a heap size of 256 (MB).  Larger heap size would also be\n# appropriate for hive server (hwi etc).\n\n\n# Set HADOOP_HOME to point to a specific hadoop install directory\nHADOOP_HOME=${HADOOP_HOME:-{{hadoop_home}}}\n\n# Hive Configuration Director
 y can be controlled by:\nexport HIVE_CONF_DIR={{conf_dir}}\n\n# Folder containing extra ibraries required for hive compilation/execution can be controlled by:\nif [ \"${HIVE_AUX_JARS_PATH}\" != \"\" ]; then\n  export HIVE_AUX_JARS_PATH=${HIVE_AUX_JARS_PATH}\nelif [ -d \"/usr/lib/hive-hcatalog/\" ]; then\n  export HIVE_AUX_JARS_PATH=/usr/lib/hive-hcatalog/share/hcatalog/hive-hcatalog-core-*.jar\nelse\n  export HIVE_AUX_JARS_PATH=/usr/lib/hcatalog/share/hcatalog/hcatalog-core.jar\nfi\nexport METASTORE_PORT={{hive_metastore_port}}",
+            "hive_database_name": "hive",
+            "hive_database_type": "mysql",
+            "hive_pid_dir": "/var/run/hive",
+            "hive_log_dir": "/var/log/hive",
+            "hive_user": "hive",
+            "hcat_log_dir": "/var/log/webhcat",
+            "hive_database": "New MySQL Database",
+            "hive_security_authorization": "None"
+        },
+        "ranger-env": {
+            "xml_configurations_supported" : "false"
+        },
+      "cluster-env": {
+          "managed_hdfs_resource_property_names": "",
+          "security_enabled": "false",
+          "hdfs_user_principal" : "",
+          "hdfs_user_keytab" : "",
+          "ignore_groupsusers_create": "false",
+          "smokeuser": "ambari-qa",
+          "kerberos_domain": "EXAMPLE.COM",
+          "user_group": "hadoop",
+          "repo_suse_rhel_template": "[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0",
+          "repo_ubuntu_template": "{{package_type}} {{base_url}} {{components}}",
+          "metrics_collector_vip_host": "c6402.ambari.apache.org",
+          "metrics_collector_vip_port": "6189",
+          "override_uid" : "true",
+          "fetch_nonlocal_groups": "true",
+          "manage_dirs_on_root": "true",
+          "ignore_bad_mounts": "false"
+      },
+      "hbase-env": {
+            "hbase_pid_dir": "/var/run/hbase",
+            "hbase_user": "hbase",
+            "hbase_master_heapsize": "1024m",
+            "content": "\n# Set environment variables here.\n\n# The java implementation to use. Java 1.6 required.\nexport JAVA_HOME={{java64_home}}\n\n# HBase Configuration directory\nexport HBASE_CONF_DIR=${HBASE_CONF_DIR:-{{hbase_conf_dir}}}\n\n# Extra Java CLASSPATH elements. Optional.\nexport HBASE_CLASSPATH=${HBASE_CLASSPATH}\n\n# The maximum amount of heap to use, in MB. Default is 1000.\n# export HBASE_HEAPSIZE=1000\n\n# Extra Java runtime options.\n# Below are what we set by default. May only work with SUN JVM.\n# For more on why as well as other possible settings,\n# see http://wiki.apache.org/hadoop/PerformanceTuning\nexport HBASE_OPTS=\"-XX:+UseConcMarkSweepGC -XX:ErrorFile={{log_dir}}/hs_err_pid%p.log\"\nexport SERVER_GC_OPTS=\"-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:{{log_dir}}/gc.log-`date +'%Y%m%d%H%M'`\"\n# Uncomment below to enable java garbage collection logging.\n# export HBASE_OPTS=\"$HBASE_OPTS -verbose:gc -XX:+PrintGCDetails -XX:+PrintG
 CDateStamps -Xloggc:$HBASE_HOME/logs/gc-hbase.log\"\n\n# Uncomment and adjust to enable JMX exporting\n# See jmxremote.password and jmxremote.access in $JRE_HOME/lib/management to configure remote password access.\n# More details at: http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html\n#\n# export HBASE_JMX_BASE=\"-Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false\"\nexport HBASE_MASTER_OPTS=\"-Xmx{{master_heapsize}}\"\nexport HBASE_REGIONSERVER_OPTS=\"-Xmn{{regionserver_xmn_size}} -XX:CMSInitiatingOccupancyFraction=70  -Xms{{regionserver_heapsize}} -Xmx{{regionserver_heapsize}}\"\n# export HBASE_THRIFT_OPTS=\"$HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10103\"\n# export HBASE_ZOOKEEPER_OPTS=\"$HBASE_JMX_BASE -Dcom.sun.management.jmxremote.port=10104\"\n\n# File naming hosts on which HRegionServers will run. $HBASE_HOME/conf/regionservers by default.\nexport HBASE_REGIONSERVERS=${HBASE_CONF_DIR}/regionservers\n\n# 
 Extra ssh options. Empty by default.\n# export HBASE_SSH_OPTS=\"-o ConnectTimeout=1 -o SendEnv=HBASE_CONF_DIR\"\n\n# Where log files are stored. $HBASE_HOME/logs by default.\nexport HBASE_LOG_DIR={{log_dir}}\n\n# A string representing this instance of hbase. $USER by default.\n# export HBASE_IDENT_STRING=$USER\n\n# The scheduling priority for daemon processes. See 'man nice'.\n# export HBASE_NICENESS=10\n\n# The directory where pid files are stored. /tmp by default.\nexport HBASE_PID_DIR={{pid_dir}}\n\n# Seconds to sleep between slave commands. Unset by default. This\n# can be useful in large clusters, where, e.g., slave rsyncs can\n# otherwise arrive faster than the master can service them.\n# export HBASE_SLAVE_SLEEP=0.1\n\n# Tell HBase whether it should manage it's own instance of Zookeeper or not.\nexport HBASE_MANAGES_ZK=false\n\n{% if security_enabled %}\nexport HBASE_OPTS=\"$HBASE_OPTS -Djava.security.auth.login.config={{client_jaas_config_file}}\"\nexport HBASE_MASTER_OPTS=\
 "$HBASE_MASTER_OPTS -Djava.security.auth.login.config={{master_jaas_config_file}}\"\nexport HBASE_REGIONSERVER_OPTS=\"$HBASE_REGIONSERVER_OPTS -Djava.security.auth.login.config={{regionserver_jaas_config_file}}\"\n{% endif %}",
+            "hbase_regionserver_heapsize": "1024m",
+            "hbase_regionserver_xmn_max": "512",
+            "hbase_regionserver_xmn_ratio": "0.2",
+            "hbase_log_dir": "/var/log/hbase",
+            "hbase_java_io_tmpdir" : "/tmp",
+            "hbase_regionserver_shutdown_timeout": "30"
+        },
+        "ganglia-env": {
+            "gmond_user": "nobody",
+            "ganglia_runtime_dir": "/var/run/ganglia/hdp",
+            "rrdcached_base_dir": "/var/lib/ganglia/rrds",
+            "rrdcached_flush_timeout": "7200",
+            "gmetad_user": "nobody",
+            "rrdcached_write_threads": "4",
+            "rrdcached_delay": "1800",
+            "rrdcached_timeout": "3600"
+        },
+        "zookeeper-env": {
+          "zk_user": "zookeeper",
+          "zk_log_dir": "/var/log/zookeeper",
+          "content": "\nexport JAVA_HOME={{java64_home}}\nexport ZOO_LOG_DIR={{zk_log_dir}}\nexport ZOOPIDFILE={{zk_pid_file}}\nexport SERVER_JVMFLAGS={{zk_server_heapsize}}\nexport JAVA=$JAVA_HOME/bin/java\nexport CLASSPATH=$CLASSPATH:/usr/share/zookeeper/*\n\n{% if security_enabled %}\nexport SERVER_JVMFLAGS=\"$SERVER_JVMFLAGS -Djava.security.auth.login.config={{zk_server_jaas_file}}\"\nexport CLIENT_JVMFLAGS=\"$CLIENT_JVMFLAGS -Djava.security.auth.login.config={{zk_client_jaas_file}}\"\n{% endif %}",
+          "zk_pid_dir": "/var/run/zookeeper",
+          "zookeeper_principal_name": "zookeeper/_HOST@EXAMPLE.COM",
+          "zookeeper_keytab_path": "/etc/security/keytabs/zk.service.keytab"
+        },
+        "zoo.cfg": {
+          "clientPort": "2181",
+          "syncLimit": "5",
+          "initLimit": "10",
+          "dataDir": "/hadoop/zookeeper",
+          "tickTime": "2000"
+        },
+        "mapred-env": {
+            "content": "\n# export JAVA_HOME=/home/y/libexec/jdk1.6.0/\n\nexport HADOOP_JOB_HISTORYSERVER_HEAPSIZE={{jobhistory_heapsize}}\n\nexport HADOOP_MAPRED_ROOT_LOGGER=INFO,RFA\n\n#export HADOOP_JOB_HISTORYSERVER_OPTS=\n#export HADOOP_MAPRED_LOG_DIR=\"\" # Where log files are stored.  $HADOOP_MAPRED_HOME/logs by default.\n#export HADOOP_JHS_LOGGER=INFO,RFA # Hadoop JobSummary logger.\n#export HADOOP_MAPRED_PID_DIR= # The pid files are stored. /tmp by default.\n#export HADOOP_MAPRED_IDENT_STRING= #A string representing this instance of hadoop. $USER by default\n#export HADOOP_MAPRED_NICENESS= #The scheduling priority for daemons. Defaults to 0.",
+            "mapred_pid_dir_prefix": "/var/run/hadoop-mapreduce",
+            "mapred_user": "mapred",
+            "jobhistory_heapsize": "900",
+            "mapred_log_dir_prefix": "/var/log/hadoop-mapreduce"
+        },
+        "tez-env": {
+            "content": "\n# Tez specific configuration\nexport TEZ_CONF_DIR={{config_dir}}\n\n# Set HADOOP_HOME to point to a specific hadoop install directory\nexport HADOOP_HOME=${HADOOP_HOME:-{{hadoop_home}}}\n\n# The java implementation to use.\nexport JAVA_HOME={{java64_home}}",
+            "tez_user": "tez"
+        },
+        "flume-env": {
+             "content": "export JAVA_HOME={{java64_home}}\nexport HIVE_HOME={{flume_hive_home}}",
+             "flume_user": "flume",
+             "flume_log_dir": "/var/log/flume",
+             "flume_run_dir": "/var/run/flume"
+        },
+      "storm-env": {
+            "content": "\n#!/bin/bash\n\n# Set Storm specific environment variables here.\n\n# The java implementation to use.\nexport JAVA_HOME={{java_home}}\n\n# export STORM_CONF_DIR=\"\"",
+            "storm_log_dir": "/var/log/storm",
+            "storm_pid_dir": "/var/run/storm",
+            "storm_user": "storm"
+        },
+        "falcon-env": {
+            "falcon_apps_hdfs_dir": "/apps/falcon",
+            "falcon_port": "15000",
+            "falcon_pid_dir": "/var/run/falcon",
+            "falcon_log_dir": "/var/log/falcon",
+            "falcon.emeddedmq.port": "61616",
+            "falcon_user": "falcon",
+            "falcon_local_dir": "/hadoop/falcon",
+            "content": "\n# The java implementation to use. If JAVA_HOME is not found we expect java and jar to be in path\nexport JAVA_HOME={{java_home}}\n\n# any additional java opts you want to set. This will apply to both client and server operations\n#export FALCON_OPTS=\n\n# any additional java opts that you want to set for client only\n#export FALCON_CLIENT_OPTS=\n\n# java heap size we want to set for the client. Default is 1024MB\n#export FALCON_CLIENT_HEAP=\n\n# any additional opts you want to set for prisim service.\n#export FALCON_PRISM_OPTS=\n\n# java heap size we want to set for the prisim service. Default is 1024MB\n#export FALCON_PRISM_HEAP=\n\n# any additional opts you want to set for falcon service.\nexport FALCON_SERVER_OPTS=\"-Dfalcon.embeddedmq={{falcon_embeddedmq_enabled}} -Dfalcon.emeddedmq.port={{falcon_emeddedmq_port}}\"\n\n# java heap size we want to set for the falcon server. Default is 1024MB\n#export FALCON_SERVER_HEAP=\n\n# What is is considered as falco
 n home dir. Default is the base locaion of the installed software\n#export FALCON_HOME_DIR=\n\n# Where log files are stored. Defatult is logs directory under the base install location\nexport FALCON_LOG_DIR={{falcon_log_dir}}\n\n# Where pid files are stored. Defatult is logs directory under the base install location\nexport FALCON_PID_DIR={{falcon_pid_dir}}\n\n# where the falcon active mq data is stored. Defatult is logs/data directory under the base install location\nexport FALCON_DATA_DIR={{falcon_embeddedmq_data}}\n\n# Where do you want to expand the war file. By Default it is in /server/webapp dir under the base install dir.\n#export FALCON_EXPANDED_WEBAPP_DIR=",
+            "falcon.embeddedmq.data": "/hadoop/falcon/embeddedmq/data",
+            "falcon.embeddedmq": "true",
+            "falcon_store_uri": "file:///hadoop/falcon/store",
+            "supports_hive_dr": "true"
+        },
+        "oozie-env": {
+            "oozie_derby_database": "Derby",
+            "oozie_admin_port": "11001",
+            "oozie_hostname": "abtest-3.c.pramod-thangali.internal",
+            "oozie_pid_dir": "/var/run/oozie",
+            "content": "\n#!/bin/bash\n\nif [ -d \"/usr/lib/bigtop-tomcat\" ]; then\n  export OOZIE_CONFIG=${OOZIE_CONFIG:-/etc/oozie/conf}\n  export CATALINA_BASE=${CATALINA_BASE:-/var/lib/oozie/oozie-server}\n  export CATALINA_TMPDIR=${CATALINA_TMPDIR:-/var/tmp/oozie}\n  export OOZIE_CATALINA_HOME=/usr/lib/bigtop-tomcat\nfi\n\n#Set JAVA HOME\nexport JAVA_HOME={{java_home}}\n\nexport JRE_HOME=${JAVA_HOME}\n\n# Set Oozie specific environment variables here.\n\n# Settings for the Embedded Tomcat that runs Oozie\n# Java System properties for Oozie should be specified in this variable\n#\n# export CATALINA_OPTS=\n\n# Oozie configuration file to load from Oozie configuration directory\n#\n# export OOZIE_CONFIG_FILE=oozie-site.xml\n\n# Oozie logs directory\n#\nexport OOZIE_LOG={{oozie_log_dir}}\n\n# Oozie pid directory\n#\nexport CATALINA_PID={{pid_file}}\n\n#Location of the data for oozie\nexport OOZIE_DATA={{oozie_data_dir}}\n\n# Oozie Log4J configuration file to load from Oozie config
 uration directory\n#\n# export OOZIE_LOG4J_FILE=oozie-log4j.properties\n\n# Reload interval of the Log4J configuration file, in seconds\n#\n# export OOZIE_LOG4J_RELOAD=10\n\n# The port Oozie server runs\n#\nexport OOZIE_HTTP_PORT={{oozie_server_port}}\n\n# The admin port Oozie server runs\n#\nexport OOZIE_ADMIN_PORT={{oozie_server_admin_port}}\n\n# The host name Oozie server runs on\n#\n# export OOZIE_HTTP_HOSTNAME=`hostname -f`\n\n# The base URL for callback URLs to Oozie\n#\n# export OOZIE_BASE_URL=\"http://${OOZIE_HTTP_HOSTNAME}:${OOZIE_HTTP_PORT}/oozie\"\nexport JAVA_LIBRARY_PATH=/usr/lib/hadoop/lib/native/Linux-amd64-64",
+            "oozie_user": "oozie",
+            "oozie_admin_users": "{oozie_user}, {oozie_user}-admin",
+            "oozie_database": "New Derby Database",
+            "oozie_data_dir": "/hadoop/oozie/data",
+            "oozie_log_dir": "/var/log/oozie",
+            "oozie_tmp_dir": "/var/tmp/oozie"
+        },
+        "webhcat-env": {
+            "content": "\n# The file containing the running pid\nPID_FILE={{pid_file}}\n\nTEMPLETON_LOG_DIR={{templeton_log_dir}}/\n\n\nWEBHCAT_LOG_DIR={{templeton_log_dir}}/\n\n# The console error log\nERROR_LOG={{templeton_log_dir}}/webhcat-console-error.log\n\n# The console log\nCONSOLE_LOG={{templeton_log_dir}}/webhcat-console.log\n\n#TEMPLETON_JAR=templeton_jar_name\n\n#HADOOP_PREFIX=hadoop_prefix\n\n#HCAT_PREFIX=hive_prefix\n\n# Set HADOOP_HOME to point to a specific hadoop install directory\nexport HADOOP_HOME=/usr/lib/hadoop"
+        },
+        "hcat-env": {
+            "content": "JAVA_HOME={{java64_home}}\n      HCAT_PID_DIR={{hcat_pid_dir}}/\n      HCAT_LOG_DIR={{hcat_log_dir}}/\n      HCAT_CONF_DIR={{hcat_conf_dir}}\n      HADOOP_HOME=${HADOOP_HOME:-{{hadoop_home}}}\n      #DBROOT is the path where the connector jars are downloaded\n      DBROOT={{hcat_dbroot}}\n      USER={{hcat_user}}\n      METASTORE_PORT={{hive_metastore_port}}"
+        },
+        "pig-env": {
+            "content": "\nJAVA_HOME={{java64_home}}\nHADOOP_HOME=${HADOOP_HOME:-{{hadoop_home}}}\n\nif [ -d \"/usr/lib/tez\" ]; then\n  PIG_OPTS=\"$PIG_OPTS -Dmapreduce.framework.name=yarn\"\nfi"
+        },
+        "sqoop-env": {
+            "content": "\n# Set Hadoop-specific environment variables here.\n\n#Set path to where bin/hadoop is available\n#Set path to where bin/hadoop is available\nexport HADOOP_HOME=${HADOOP_HOME:-/usr/lib/hadoop}\n\n#set the path to where bin/hbase is available\nexport HBASE_HOME=${HBASE_HOME:-/usr/lib/hbase}\n\n#Set the path to where bin/hive is available\nexport HIVE_HOME=${HIVE_HOME:-/usr/lib/hive}\n\n#Set the path for where zookeper config dir is\nexport ZOOCFGDIR=${ZOOCFGDIR:-/etc/zookeeper/conf}\n\n# add libthrift in hive to sqoop class path first so hive imports work\nexport SQOOP_USER_CLASSPATH=\"`ls ${HIVE_HOME}/lib/libthrift-*.jar 2> /dev/null`:${SQOOP_USER_CLASSPATH}\"",
+            "sqoop_user": "sqoop"
+        },
+        "hdfs-log4j": {
+            "content": "log4jproperties\nline2"
+        },
+        "yarn-log4j": {
+            "content": "log4jproperties\nline2"
+        },
+        "hbase-log4j": {
+            "content": "log4jproperties\nline2"
+        },
+        "hive-log4j": {
+            "content": "log4jproperties\nline2"
+        },
+        "hive-exec-log4j": {
+            "content": "log4jproperties\nline2"
+        },
+        "webhcat-log4j": {
+             "content": "log4jproperties\nline2"
+        },
+        "zookeeper-log4j": {
+            "content": "log4jproperties\nline2"
+        },
+        "pig-log4j": {
+            "content": "log4jproperties\nline2"
+        },
+        "pig-properties": {
+            "content": "pigproperties\nline2"
+        },
+        "oozie-log4j": {
+            "content": "log4jproperties\nline2"
+        },
+        "flume-conf": {
+          "content": "a1.sources = r1\n a1.sinks = k1\n a1.channels = c1\n # Describe/configure the source\n a1.sources.r1.type = netcat\n a1.sources.r1.bind = localhost\n a1.sources.r1.port = 44444\n \n # Describe the sink\n a1.sinks.k1.type = logger\n \n # Use a channel which buffers events in memory\n a1.channels.c1.type = memory\n a1.channels.c1.capacity = 1000\n a1.channels.c1.transactionCapacity = 100\n \n # Bind the source and sink to the channel\n a1.sources.r1.channels = c1\n a1.sinks.k1.channel = c1\n"
+        },
+        "flume-log4j": {
+          "content": "log4jproperties\nline2"
+        },
+       "ranger-hbase-plugin-properties": {
+            "POLICY_MGR_URL": "{{policymgr_mgr_url}}",
+            "XAAUDIT.HDFS.DESTINTATION_FLUSH_INTERVAL_SECONDS": "900",
+            "XAAUDIT.HDFS.DESTINATION_DIRECTORY": "hdfs://__REPLACE__NAME_NODE_HOST:8020/ranger/audit/%app-type%/%time:yyyyMMdd%",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_DIRECTORY": "__REPLACE__LOG_DIR/hadoop/%app-type%/audit",
+            "common.name.for.certificate": "-",
+            "XAAUDIT.HDFS.IS_ENABLED": "false",
+            "SQL_CONNECTOR_JAR": "{{sql_connector_jar}}",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_FILE": "%time:yyyyMMdd-HHmm.ss%.log",
+            "ranger-hbase-plugin-enabled": "No",
+            "REPOSITORY_NAME": "{{repo_name}}",
+            "SSL_KEYSTORE_PASSWORD": "myKeyFilePassword",
+            "XAAUDIT.DB.IS_ENABLED": "true",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_ROLLOVER_INTERVAL_SECONDS": "600",
+            "XAAUDIT.SOLR.SOLR_URL": "http://localhost:6083/solr/ranger_audits",
+            "XAAUDIT.DB.DATABASE_NAME": "{{xa_audit_db_name}}",
+            "XAAUDIT.DB.HOSTNAME": "{{xa_db_host}}",
+            "XAAUDIT.SOLR.IS_ENABLED": "false",
+            "SSL_KEYSTORE_FILE_PATH": "/etc/hadoop/conf/ranger-plugin-keystore.jks",
+            "XAAUDIT.HDFS.DESTINTATION_OPEN_RETRY_INTERVAL_SECONDS": "60",
+            "XAAUDIT.DB.USER_NAME": "{{xa_audit_db_user}}",
+            "policy_user": "ambari-qa",
+            "UPDATE_XAPOLICIES_ON_GRANT_REVOKE": "true",
+            "XAAUDIT.HDFS.DESTINTATION_FILE": "%hostname%-audit.log",
+            "XAAUDIT.HDFS.DESTINTATION_ROLLOVER_INTERVAL_SECONDS": "86400",
+            "XAAUDIT.DB.PASSWORD": "{{xa_audit_db_password}}",
+            "XAAUDIT.HDFS.LOCAL_ARCHIVE_MAX_FILE_COUNT": "10",
+            "SSL_TRUSTSTORE_PASSWORD": "changeit",
+            "XAAUDIT.HDFS.LOCAL_ARCHIVE_DIRECTORY": "__REPLACE__LOG_DIR/hadoop/%app-type%/audit/archive",
+            "REPOSITORY_CONFIG_USERNAME": "hbase",
+            "XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS": "1000",
+            "XAAUDIT.DB.FLAVOUR": "{{xa_audit_db_flavor}}",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_FLUSH_INTERVAL_SECONDS": "60",
+            "SSL_TRUSTSTORE_FILE_PATH": "/etc/hadoop/conf/ranger-plugin-truststore.jks",
+            "REPOSITORY_CONFIG_PASSWORD": "hbase",
+            "XAAUDIT.SOLR.MAX_QUEUE_SIZE": "1"
+        },
+        "ranger-hdfs-plugin-properties": {
+            "XAAUDIT.HDFS.DESTINTATION_FLUSH_INTERVAL_SECONDS": "900",
+            "XAAUDIT.HDFS.DESTINATION_DIRECTORY": "hdfs://__REPLACE__NAME_NODE_HOST:8020/ranger/audit/%app-type%/%time:yyyyMMdd%",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_DIRECTORY": "__REPLACE__LOG_DIR/hadoop/%app-type%/audit",
+            "common.name.for.certificate": "-",
+            "XAAUDIT.HDFS.IS_ENABLED": "false",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_FILE": "%time:yyyyMMdd-HHmm.ss%.log",
+            "SSL_KEYSTORE_PASSWORD": "myKeyFilePassword",
+            "XAAUDIT.DB.IS_ENABLED": "true",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_ROLLOVER_INTERVAL_SECONDS": "600",
+            "XAAUDIT.SOLR.SOLR_URL": "http://localhost:6083/solr/ranger_audits",
+            "XAAUDIT.SOLR.IS_ENABLED": "false",
+            "hadoop.rpc.protection": "-",
+            "ranger-hdfs-plugin-enabled": "No",
+            "SSL_KEYSTORE_FILE_PATH": "/etc/hadoop/conf/ranger-plugin-keystore.jks",
+            "XAAUDIT.HDFS.DESTINTATION_OPEN_RETRY_INTERVAL_SECONDS": "60",
+            "policy_user": "ambari-qa",
+            "XAAUDIT.HDFS.DESTINTATION_FILE": "%hostname%-audit.log",
+            "XAAUDIT.HDFS.DESTINTATION_ROLLOVER_INTERVAL_SECONDS": "86400",
+            "XAAUDIT.HDFS.LOCAL_ARCHIVE_MAX_FILE_COUNT": "10",
+            "SSL_TRUSTSTORE_PASSWORD": "changeit",
+            "XAAUDIT.HDFS.LOCAL_ARCHIVE_DIRECTORY": "__REPLACE__LOG_DIR/hadoop/%app-type%/audit/archive",
+            "REPOSITORY_CONFIG_USERNAME": "hadoop",
+            "XAAUDIT.SOLR.MAX_FLUSH_INTERVAL_MS": "1000",
+            "XAAUDIT.HDFS.LOCAL_BUFFER_FLUSH_INTERVAL_SECONDS": "60",
+            "SSL_TRUSTSTORE_FILE_PATH": "/etc/hadoop/conf/ranger-plugin-truststore.jks",
+            "REPOSITORY_CONFIG_PASSWORD": "hadoop",
+            "XAAUDIT.SOLR.MAX_QUEUE_SIZE": "1"
+        },
+        "ams-hbase-env": {
+            "hbase_pid_dir": "/var/run/ambari-metrics-collector/",
+            "regionserver_xmn_size": "256m",
+            "max_open_files_limit": "32768",
+            "hbase_master_maxperm_size": "128m",
+            "hbase_regionserver_xmn_ratio": "0.2",
+            "hbase_master_heapsize": "512m",
+            "hbase_regionserver_heapsize": "512m",
+            "hbase_log_dir": "/var/log/ambari-metrics-collector",
+            "hbase_master_xmn_size": "256m",
+            "content": "\n",
+            "hbase_regionserver_shutdown_timeout": "30"
+        },
+        "ams-log4j": {
+            "content": "\n"
+        },
+        "ams-hbase-site": {
+            "hbase.master.info.bindAddress": "0.0.0.0",
+            "hbase.zookeeper.property.dataDir": "${hbase.tmp.dir}/zookeeper",
+            "hbase.master.wait.on.regionservers.mintostart": "1",
+            "hbase.replication": "false",
+            "hbase.regionserver.global.memstore.lowerLimit": "0.3",
+            "hbase.hregion.memstore.block.multiplier": "4",
+            "hbase.hregion.memstore.flush.size": "134217728",
+            "hbase.rootdir": "hdfs://localhost:8020/apps/hbase/data",
+            "hbase.zookeeper.property.clientPort": "61181",
+            "phoenix.spool.directory": "${hbase.tmp.dir}/phoenix-spool",
+            "hbase.client.scanner.timeout.period": "900000",
+            "phoenix.groupby.maxCacheSize": "307200000",
+            "hbase.snapshot.enabled": "false",
+            "hbase.regionserver.global.memstore.upperLimit": "0.35",
+            "hbase_master_xmn_size": "128m",
+            "phoenix.query.spoolThresholdBytes": "12582912",
+            "zookeeper.session.timeout": "120000",
+            "hbase.tmp.dir": "/var/lib/ambari-metrics-collector/hbase-tmp",
+            "hfile.block.cache.size": "0.3",
+            "hbase.regionserver.port": "61320",
+            "hbase.regionserver.thread.compaction.small": "3",
+            "hbase.master.info.port": "61310",
+            "hbase.hregion.majorcompaction": "0",
+            "phoenix.query.maxGlobalMemoryPercentage": "15",
+            "hbase.zookeeper.quorum": "{{zookeeper_quorum_hosts}}",
+            "hbase.regionserver.info.port": "61330",
+            "hbase.hstore.blockingStoreFiles": "200",
+            "hbase.master.port": "61300",
+            "hbase.zookeeper.leaderport": "61388",
+            "hbase.regionserver.thread.compaction.large": "2",
+            "phoenix.query.timeoutMs": "1200000",
+            "hbase.local.dir": "${hbase.tmp.dir}/local",
+            "hbase.cluster.distributed": "true",
+            "zookeeper.session.timeout.localHBaseCluster": "20000",
+            "hbase.client.scanner.caching": "10000",
+            "phoenix.sequence.saltBuckets": "2",
+            "hbase.hstore.flusher.count": "2",
+            "hbase.zookeeper.peerport": "61288"
+        },
+        "ams-env": {
+            "ambari_metrics_user": "ams",
+            "metrics_monitor_log_dir": "/var/log/ambari-metrics-monitor",
+            "metrics_collector_log_dir": "/var/log/ambari-metrics-collector",
+            "metrics_monitor_pid_dir": "/var/run/ambari-metrics-monitor",
+            "content": "\n",
+            "metrics_collector_pid_dir": "/var/run/ambari-metrics-collector",
+            "metrics_collector_heapsize": "512m"
+        },
+        "ams-hbase-policy": {
+            "security.masterregion.protocol.acl": "*",
+            "security.admin.protocol.acl": "*",
+            "security.client.protocol.acl": "*"
+        },
+        "ams-hbase-log4j": {
+            "content": "\n"
+        },
+        "ams-site": {
+            "timeline.metrics.service.http.policy": "HTTPS_ONLY",
+            "timeline.metrics.host.aggregator.minute.ttl": "604800",
+            "timeline.metrics.cluster.aggregator.daily.checkpointCutOffMultiplier": "1",
+            "timeline.metrics.cluster.aggregator.daily.ttl": "63072000",
+            "timeline.metrics.cluster.aggregator.minute.timeslice.interval": "30",
+            "timeline.metrics.service.resultset.fetchSize": "2000",
+            "timeline.metrics.service.checkpointDelay": "60",
+            "timeline.metrics.host.aggregator.hourly.disabled": "false",
+            "timeline.metrics.cluster.aggregator.daily.interval": "86400",
+            "timeline.metrics.cluster.aggregator.hourly.ttl": "31536000",
+            "timeline.metrics.host.aggregator.daily.disabled": "false",
+            "timeline.metrics.hbase.compression.scheme": "SNAPPY",
+            "timeline.metrics.cluster.aggregator.hourly.interval": "3600",
+            "phoenix.spool.directory": "/tmp",
+            "timeline.metrics.host.aggregator.ttl": "86400",
+            "timeline.metrics.cluster.aggregator.hourly.checkpointCutOffMultiplier": "2",
+            "timeline.metrics.service.cluster.aggregator.appIds": "datanode,nodemanager,hbase",
+            "timeline.metrics.service.webapp.address": "0.0.0.0:6188",
+            "timeline.metrics.cluster.aggregator.hourly.disabled": "false",
+            "timeline.metrics.aggregator.checkpoint.dir": "/var/lib/ambari-metrics-collector/checkpoint",
+            "timeline.metrics.hbase.data.block.encoding": "FAST_DIFF",
+            "timeline.metrics.cluster.aggregator.minute.ttl": "2592000",
+            "timeline.metrics.host.aggregator.minute.disabled": "false",
+            "phoenix.query.maxGlobalMemoryPercentage": "25",
+            "timeline.metrics.service.operation.mode": "distributed",
+            "timeline.metrics.host.aggregator.minute.checkpointCutOffMultiplier": "2",
+            "timeline.metrics.cluster.aggregator.minute.checkpointCutOffMultiplier": "2",
+            "timeline.metrics.host.aggregator.hourly.checkpointCutOffMultiplier": "2",
+            "timeline.metrics.cluster.aggregator.daily.disabled": "false",
+            "timeline.metrics.service.rpc.address": "0.0.0.0:60200",
+            "timeline.metrics.cluster.aggregator.minute.disabled": "false",
+            "timeline.metrics.host.aggregator.hourly.ttl": "2592000",
+            "timeline.metrics.host.aggregator.minute.interval": "120",
+            "timeline.metrics.service.default.result.limit": "5760",
+            "timeline.metrics.host.aggregator.daily.ttl": "31536000",
+            "timeline.metrics.host.aggregator.daily.checkpointCutOffMultiplier": "1",
+            "timeline.metrics.daily.aggregator.minute.interval": "86400",
+            "timeline.metrics.cluster.aggregator.minute.interval": "120",
+            "timeline.metrics.host.aggregator.hourly.interval": "3600"
+        },
+        "ams-grafana-env": {
+            "metrics_grafana_log_dir": "/var/log/ambari-metrics-grafana",
+            "metrics_grafana_pid_dir": "/var/run/ambari-metrics-grafana",
+            "metrics_grafana_data_dir": "/var/lib/ambari-metrics-grafana",
+            "content": "\n",
+            "metrics_grafana_username" : "admin",
+            "metrics_grafana_password" : "admin"
+        },
+        "ams-ssl-server": {
+            "content": "\n"
+        },
+        "ams-ssl-client": {
+            "ssl.client.truststore.location": "/etc/security/clientKeys/all.jks",
+            "ssl.client.truststore.type": "jks",
+            "ssl.client.truststore.password": "bigdata"
+        },
+        "ams-grafana-ini": {
+            "content": "\n"
+        },
+        "hadoop-metrics2.properties": {
+            "content": "# Licensed to the Apache Software Foundation (ASF) under one or more\r\n# contributor license agreements. See the NOTICE file distributed with\r\n# this work for additional information regarding copyright ownership.\r\n# The ASF licenses this file to You under the Apache License, Version 2.0\r\n# (the \"License\"); you may not use this file except in compliance with\r\n# the License. You may obtain a copy of the License at\r\n#\r\n# http:\/\/www.apache.org\/licenses\/LICENSE-2.0\r\n#\r\n# Unless required by applicable law or agreed to in writing, software\r\n# distributed under the License is distributed on an \"AS IS\" BASIS,\r\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r\n# See the License for the specific language governing permissions and\r\n# limitations under the License.\r\n\r\n# syntax: [prefix].[source|sink|jmx].[instance].[options]\r\n# See package.html for org.apache.hadoop.metrics2 for details\r\n\r\n{% if has_gang
 lia_server %}\r\n*.period=60\r\n\r\n*.sink.ganglia.class=org.apache.hadoop.metrics2.sink.ganglia.GangliaSink31\r\n*.sink.ganglia.period=10\r\n\r\n# default for supportsparse is false\r\n*.sink.ganglia.supportsparse=true\r\n\r\n.sink.ganglia.slope=jvm.metrics.gcCount=zero,jvm.metrics.memHeapUsedM=both\r\n.sink.ganglia.dmax=jvm.metrics.threadsBlocked=70,jvm.metrics.memHeapUsedM=40\r\n\r\n# Hook up to the server\r\nnamenode.sink.ganglia.servers={{ganglia_server_host}}:8661\r\ndatanode.sink.ganglia.servers={{ganglia_server_host}}:8659\r\njobtracker.sink.ganglia.servers={{ganglia_server_host}}:8662\r\ntasktracker.sink.ganglia.servers={{ganglia_server_host}}:8658\r\nmaptask.sink.ganglia.servers={{ganglia_server_host}}:8660\r\nreducetask.sink.ganglia.servers={{ganglia_server_host}}:8660\r\nresourcemanager.sink.ganglia.servers={{ganglia_server_host}}:8664\r\nnodemanager.sink.ganglia.servers={{ganglia_server_host}}:8657\r\nhistoryserver.sink.ganglia.servers={{ganglia_server_host}}:8666\r\njo
 urnalnode.sink.ganglia.servers={{ganglia_server_host}}:8654\r\nnimbus.sink.ganglia.servers={{ganglia_server_host}}:8649\r\nsupervisor.sink.ganglia.servers={{ganglia_server_host}}:8650\r\n\r\nresourcemanager.sink.ganglia.tagsForPrefix.yarn=Queue\r\n\r\n{% endif %}\r\n\r\n{% if has_metric_collector %}\r\n\r\n*.period={{metrics_collection_period}}\r\n*.sink.timeline.plugin.urls=file:\/\/\/usr\/lib\/ambari-metrics-hadoop-sink\/ambari-metrics-hadoop-sink.jar\r\n*.sink.timeline.class=org.apache.hadoop.metrics2.sink.timeline.HadoopTimelineMetricsSink\r\n*.sink.timeline.period={{metrics_collection_period}}\r\n*.sink.timeline.sendInterval={{metrics_report_interval}}000\r\n*.sink.timeline.slave.host.name={{hostname}}\r\n*.sink.timeline.zookeeper.quorum={{zookeeper_quorum}}\r\n*.sink.timeline.protocol={{metric_collector_protocol}}\r\n*.sink.timeline.port={{metric_collector_port}}\r\n\r\n# HTTPS properties\r\n*.sink.timeline.truststore.path = {{metric_truststore_path}}\r\n*.sink.timeline.trusts
 tore.type = {{metric_truststore_type}}\r\n*.sink.timeline.truststore.password = {{metric_truststore_password}}\r\n\r\ndatanode.sink.timeline.collector={{metric_collector_hosts}}\r\nnamenode.sink.timeline.collector={{metric_collector_hosts}}\r\nresourcemanager.sink.timeline.collector={{metric_collector_hosts}}\r\nnodemanager.sink.timeline.collector={{metric_collector_hosts}}\r\njobhistoryserver.sink.timeline.collector={{metric_collector_hosts}}\r\njournalnode.sink.timeline.collector={{metric_collector_hosts}}\r\nmaptask.sink.timeline.collector={{metric_collector_hosts}}\r\nreducetask.sink.timeline.collector={{metric_collector_hosts}}\r\napplicationhistoryserver.sink.timeline.collector={{metric_collector_hosts}}\r\n\r\nresourcemanager.sink.timeline.tagsForPrefix.yarn=Queue\r\n\r\n{% if is_nn_client_port_configured %}\r\n# Namenode rpc ports customization\r\nnamenode.sink.timeline.metric.rpc.client.port={{nn_rpc_client_port}}\r\n{% endif %}\r\n{% if is_nn_dn_port_configured %}\r\nnamen
 ode.sink.timeline.metric.rpc.datanode.port={{nn_rpc_dn_port}}\r\n{% endif %}\r\n{% if is_nn_healthcheck_port_configured %}\r\nnamenode.sink.timeline.metric.rpc.healthcheck.port={{nn_rpc_healthcheck_port}}\r\n{% endif %}\r\n\r\n{% endif %}"
+        }
+    },
+    "configuration_attributes": {
+        "ams-hbase-env": {},
+        "ams-hbase-security-site": {},
+        "ams-log4j": {},
+        "ams-hbase-site": {},
+        "ams-hbase-policy": {},
+        "ams-hbase-log4j": {},
+        "ams-site": {},
+        "ams-ssl-server": {},
+        "ams-ssl-client": {},
+        "sqoop-site": {},
+        "yarn-site": {
+        "final": {
+          "yarn.nodemanager.disk-health-checker.min-healthy-disks": "true",
+          "yarn.nodemanager.container-executor.class": "true",
+          "yarn.nodemanager.local-dirs": "true"
+        }
+      },
+      "tez-site": {
+        "final": {
+          "tez.am.log.level": "true"
+        }
+      },
+      "capacity-scheduler": {
+        "final": {
+          "yarn.scheduler.capacity.node-locality-delay": "true"
+        }
+      },
+      "mapred-site": {
+        "final": {
+          "mapred.healthChecker.script.path": "true",
+          "mapreduce.jobtracker.staging.root.dir": "true"
+        }
+      },
+      "oozie-site": {
+        "final": {
+          "oozie.service.PurgeService.purge.interval": "true",
+          "oozie.service.CallableQueueService.queue.size": "true"
+        }
+      },
+      "webhcat-site": {
+        "final": {
+          "templeton.pig.path": "true",
+          "templeton.exec.timeout": "true",
+          "templeton.override.enabled": "true"
+        }
+      },
+      "hdfs-site": {
+        "final": {
+          "dfs.web.ugi": "true",
+          "dfs.support.append": "true",
+          "dfs.cluster.administrators": "true"
+        }
+      },
+      "hbase-site": {
+        "final": {
+          "hbase.client.keyvalue.maxsize": "true",
+          "hbase.hstore.compactionThreshold": "true",
+          "hbase.rootdir": "true"
+        }
+      },
+      "core-site": {
+        "final": {
+          "hadoop.proxyuser.hive.groups": "true",
+          "webinterface.private.actions": "true",
+          "hadoop.proxyuser.oozie.hosts": "true"
+        }
+      },
+      "hive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      },
+      "hiveserver2-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      },
+      "hive-interactive-site": {
+        "final": {
+          "javax.jdo.option.ConnectionPassword": "true",
+          "javax.jdo.option.ConnectionDriverName": "true",
+          "hive.optimize.bucketmapjoin.sortedmerge": "true"
+        }
+      }
+    },
+    "configurationTags": {
+        "ams-hbase-env": {
+            "tag": "version1"
+        },
+        "ams-hbase-security-site": {
+            "tag": "version1"
+        },
+        "ams-hbase-site": {
+            "tag": "version1"
+        },
+        "ams-env": {
+            "tag": "version1"
+        },
+        "ams-site": {
+            "tag": "version1"
+        },
+        "ams-ssl-server": {
+            "tag": "version1"
+        },
+        "ams-ssl-client": {
+            "tag": "version1"
+        },
+        "ams-hbase-policy": {
+            "tag": "version1"
+        },
+        "ams-log4j": {
+            "tag": "version1"
+        },
+        "ams-hbase-log4j": {
+            "tag": "version1"
+        },
+        "capacity-scheduler": {
+            "tag": "version1"
+        },
+        "oozie-site": {
+            "tag": "version1"
+        },
+        "storm-site": {
+            "tag": "version1"
+        },
+        "webhcat-site": {
+            "tag": "version1"
+        },
+        "global": {
+            "tag": "version1"
+        },
+        "mapred-site": {
+            "tag": "version1"
+        },
+        "hdfs-site": {
+            "tag": "version1"
+        },
+        "hbase-site": {
+            "tag": "version1"
+        },
+        "core-site": {
+            "tag": "version1"
+        },
+        "yarn-site": {
+            "tag": "version1"
+        },
+        "hive-site": {
+            "tag": "version1"
+        },
+        "hive-interactive-site": {
+            "tag": "version1"
+        },
+        "hiveserver2-site": {
+            "tag": "version1"
+        },
+        "hdfs-log4j": {
+            "tag": "version1"
+        },
+        "yarn-log4j": {
+            "tag": "version1"
+        },
+        "hbase-log4j": {
+            "tag": "version1"
+        },
+        "hive-log4j": {
+            "tag": "version1"
+        },
+        "hive-exec-log4j": {
+            "tag": "version1"
+        },
+        "zookeeper-log4j": {
+            "tag": "version1"
+        },
+        "oozie-log4j": {
+            "tag": "version1"
+        },
+        "pig-log4j": {
+            "tag": "version1"
+        },
+        "pig-properties": {
+            "tag": "version1"
+        }
+    },
+    "commandId": "7-1",
+    "clusterHostInfo": {
+        "ambari_server_host": [
+            "c6401.ambari.apache.org"
+        ],
+        "snamenode_host": [
+            "c6402.ambari.apache.org"
+        ],
+        "nm_hosts": [
+            "c6402.ambari.apache.org"
+        ],
+        "drpc_server_hosts": [
+            "c6402.ambari.apache.org"
+        ],
+        "slave_hosts": [
+            "c6402.ambari.apache.org"
+        ],
+        "ganglia_server_host": [
+            "c6401.ambari.apache.org"
+        ],
+        "hive_server_host": [
+            "c6402.ambari.apache.org"
+        ],
+        "logviewer_server_hosts": [
+            "c6402.ambari.apache.org"
+        ],
+        "hive_metastore_host": [
+            

<TRUNCATED>

[3/4] ambari git commit: AMBARI-20871. Unify repository file creation (ncole)

Posted by nc...@apache.org.
http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/test/python/custom_actions/TestInstallPackages.py
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/custom_actions/TestInstallPackages.py b/ambari-server/src/test/python/custom_actions/TestInstallPackages.py
index 77e3bee..5206ea3 100644
--- a/ambari-server/src/test/python/custom_actions/TestInstallPackages.py
+++ b/ambari-server/src/test/python/custom_actions/TestInstallPackages.py
@@ -90,8 +90,7 @@ class TestInstallPackages(RMFTestCase):
                       {'package_installation_result': 'SUCCESS',
                        'installed_repository_version': VERSION_STUB,
                        'stack_id': 'HDP-2.2',
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': []})
+                       'actual_version': VERSION_STUB})
     self.assertResourceCalled('Repository', 'HDP-UTILS-2.2.0.1-885',
                               base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
                               action=['create'],
@@ -157,8 +156,7 @@ class TestInstallPackages(RMFTestCase):
                       {'package_installation_result': 'SUCCESS',
                        'installed_repository_version': VERSION_STUB,
                        'stack_id': 'HDP-2.2',
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': []})
+                       'actual_version': VERSION_STUB})
     
     self.assertResourceCalled('Package', 'hdp-select', action=["upgrade"], retry_count=5, retry_on_repo_unavailability=False)
     self.assertResourceCalled('Package', 'hadoop_2_2_0_1_885', action=["upgrade"], retry_count=5, retry_on_repo_unavailability=False)
@@ -200,8 +198,7 @@ class TestInstallPackages(RMFTestCase):
                       {'package_installation_result': 'SUCCESS',
                        'installed_repository_version': VERSION_STUB,
                        'stack_id': 'HDP-2.2',
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': []})
+                       'actual_version': VERSION_STUB})
     self.assertResourceCalled('Repository', 'HDP-UTILS-2.2.0.1-885',
                               base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
                               action=['create'],
@@ -263,8 +260,7 @@ class TestInstallPackages(RMFTestCase):
                       {'package_installation_result': 'SUCCESS',
                        'installed_repository_version': VERSION_STUB,
                        'stack_id': 'HDP-2.2',
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': ["HDP-UTILS-2.2.0.1-885"]})
+                       'actual_version': VERSION_STUB})
     self.assertResourceCalled('Repository', 'HDP-UTILS-2.2.0.1-885',
                               base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
                               action=['create'],
@@ -340,7 +336,6 @@ class TestInstallPackages(RMFTestCase):
     self.assertEquals(put_structured_out_mock.call_args[0][0],
                       {'stack_id': 'HDP-2.2',
                       'installed_repository_version': VERSION_STUB,
-                      'ambari_repositories': [],
                       'package_installation_result': 'FAIL'})
     self.assertResourceCalled('Repository', 'HDP-UTILS-2.2.0.1-885',
                               base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
@@ -397,8 +392,7 @@ class TestInstallPackages(RMFTestCase):
                       {'package_installation_result': 'SUCCESS',
                        'installed_repository_version': VERSION_STUB,
                        'stack_id': 'HDP-2.2',
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': []})
+                       'actual_version': VERSION_STUB})
     self.assertResourceCalled('Repository', 'HDP-UTILS-2.2.0.1-885',
                               base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
                               action=['create'],
@@ -468,8 +462,7 @@ class TestInstallPackages(RMFTestCase):
                       {'package_installation_result': 'SUCCESS',
                        'installed_repository_version': VERSION_STUB,
                        'stack_id': 'HDP-2.2',
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': []})
+                       'actual_version': VERSION_STUB})
     self.assertResourceCalled('Repository', 'HDP-UTILS-2.2.0.1-885',
                               base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
                               action=['create'],
@@ -535,8 +528,7 @@ class TestInstallPackages(RMFTestCase):
                       {'package_installation_result': 'SUCCESS',
                        'installed_repository_version': VERSION_STUB,
                        'stack_id': 'HDP-2.2',
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': []})
+                       'actual_version': VERSION_STUB})
     self.assertTrue(write_actual_version_to_history_file_mock.called)
     self.assertEquals(write_actual_version_to_history_file_mock.call_args[0], (VERSION_STUB_WITHOUT_BUILD_NUMBER, VERSION_STUB))
 
@@ -571,8 +563,7 @@ class TestInstallPackages(RMFTestCase):
                       {'package_installation_result': 'SUCCESS',
                        'installed_repository_version': VERSION_STUB,
                        'stack_id': 'HDP-2.2',
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': []})
+                       'actual_version': VERSION_STUB})
 
     self.assertFalse(write_actual_version_to_history_file_mock.called)
 
@@ -622,7 +613,7 @@ class TestInstallPackages(RMFTestCase):
 
     self.assertTrue(put_structured_out_mock.called)
     self.assertEquals(put_structured_out_mock.call_args_list[-1][0][0],
-                      { 'ambari_repositories': [],
+                      {
                         'package_installation_result': 'FAIL',
                         'installed_repository_version': '2.2.0.1',
                         'stack_id': u'HDP-2.2'})
@@ -678,8 +669,7 @@ class TestInstallPackages(RMFTestCase):
     self.assertEquals(put_structured_out_mock.call_args_list[-1][0][0],
                       {'package_installation_result': 'FAIL',
                        'stack_id': u'HDP-2.2',
-                       'installed_repository_version': '2.2.0.1',
-                       'ambari_repositories': []})
+                       'installed_repository_version': '2.2.0.1'})
 
     self.assertFalse(write_actual_version_to_history_file_mock.called)
 
@@ -720,8 +710,7 @@ class TestInstallPackages(RMFTestCase):
                       {'package_installation_result': 'FAIL',
                        'stack_id': u'HDP-2.2',
                        'installed_repository_version': VERSION_STUB,
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': []})
+                       'actual_version': VERSION_STUB})
 
     self.assertFalse(write_actual_version_to_history_file_mock.called)
 
@@ -762,8 +751,7 @@ class TestInstallPackages(RMFTestCase):
                       {'package_installation_result': 'SUCCESS',
                        'installed_repository_version': VERSION_STUB_WITHOUT_BUILD_NUMBER,
                        'stack_id': 'HDP-2.2',
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': []})
+                       'actual_version': VERSION_STUB})
     self.assertTrue(write_actual_version_to_history_file_mock.called)
     self.assertEquals(write_actual_version_to_history_file_mock.call_args[0], (VERSION_STUB_WITHOUT_BUILD_NUMBER, VERSION_STUB))
 
@@ -798,8 +786,7 @@ class TestInstallPackages(RMFTestCase):
                       {'package_installation_result': 'SUCCESS',
                        'installed_repository_version': VERSION_STUB_WITHOUT_BUILD_NUMBER,
                        'stack_id': 'HDP-2.2',
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': []})
+                       'actual_version': VERSION_STUB})
 
     self.assertFalse(write_actual_version_to_history_file_mock.called)
 
@@ -840,8 +827,7 @@ class TestInstallPackages(RMFTestCase):
                       {'package_installation_result': 'SUCCESS',
                        'installed_repository_version': '2.2.0.1-500',
                        'stack_id': 'HDP-2.2',
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': []})
+                       'actual_version': VERSION_STUB})
     self.assertTrue(write_actual_version_to_history_file_mock.called)
     self.assertEquals(write_actual_version_to_history_file_mock.call_args[0], ('2.2.0.1', VERSION_STUB))
 
@@ -876,8 +862,7 @@ class TestInstallPackages(RMFTestCase):
                       {'package_installation_result': 'SUCCESS',
                        'installed_repository_version': '2.2.0.1-500',
                        'stack_id': 'HDP-2.2',
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': []})
+                       'actual_version': VERSION_STUB})
 
     self.assertFalse(write_actual_version_to_history_file_mock.called)
 
@@ -926,8 +911,7 @@ class TestInstallPackages(RMFTestCase):
     self.assertEquals(put_structured_out_mock.call_args_list[-1][0][0],
                       {'package_installation_result': 'FAIL',
                        'stack_id': u'HDP-2.2',
-                       'installed_repository_version': '2.2.0.1',
-                       'ambari_repositories': []})
+                       'installed_repository_version': '2.2.0.1'})
 
     self.assertFalse(write_actual_version_to_history_file_mock.called)
 
@@ -968,8 +952,7 @@ class TestInstallPackages(RMFTestCase):
                       {'package_installation_result': 'FAIL',
                        'stack_id': u'HDP-2.2',
                        'installed_repository_version': VERSION_STUB,
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': []})
+                       'actual_version': VERSION_STUB})
 
     self.assertFalse(write_actual_version_to_history_file_mock.called)
 
@@ -1011,8 +994,7 @@ class TestInstallPackages(RMFTestCase):
                        'installed_repository_version': VERSION_STUB,
                        'stack_id': 'HDP-2.2',
                        'repository_version_id': '2',
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': []})
+                       'actual_version': VERSION_STUB})
     self.assertTrue(write_actual_version_to_history_file_mock.called)
     self.assertEquals(write_actual_version_to_history_file_mock.call_args[0], (VERSION_STUB_WITHOUT_BUILD_NUMBER, VERSION_STUB))
 
@@ -1049,7 +1031,65 @@ class TestInstallPackages(RMFTestCase):
                        'installed_repository_version': VERSION_STUB,
                        'stack_id': 'HDP-2.2',
                        'repository_version_id': '2',
-                       'actual_version': VERSION_STUB,
-                       'ambari_repositories': []})
+                       'actual_version': VERSION_STUB})
 
-    self.assertFalse(write_actual_version_to_history_file_mock.called)
\ No newline at end of file
+    self.assertFalse(write_actual_version_to_history_file_mock.called)
+
+  @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos")
+  @patch("resource_management.libraries.functions.packages_analyzer.allInstalledPackages")
+  @patch("resource_management.libraries.script.Script.put_structured_out")
+  @patch("resource_management.libraries.functions.stack_select.get_stack_versions")
+  @patch("resource_management.libraries.functions.repo_version_history.read_actual_version_from_history_file")
+  @patch("resource_management.libraries.functions.repo_version_history.write_actual_version_to_history_file")
+  def test_normal_flow_rhel_with_command_repo(self,
+                            write_actual_version_to_history_file_mock,
+                            read_actual_version_from_history_file_mock,
+                            stack_versions_mock,
+                            put_structured_out_mock, allInstalledPackages_mock, list_ambari_managed_repos_mock):
+    stack_versions_mock.side_effect = [
+      [],  # before installation attempt
+      [VERSION_STUB]
+    ]
+    allInstalledPackages_mock.side_effect = TestInstallPackages._add_packages
+    list_ambari_managed_repos_mock.return_value=[]
+    self.executeScript("scripts/install_packages.py",
+                       classname="InstallPackages",
+                       command="actionexecute",
+                       config_file="install_packages_repository_file.json",
+                       target=RMFTestCase.TARGET_CUSTOM_ACTIONS,
+                       os_type=('Redhat', '6.4', 'Final'),
+    )
+    self.assertTrue(put_structured_out_mock.called)
+    self.assertEquals(put_structured_out_mock.call_args[0][0],
+                      {'package_installation_result': 'SUCCESS',
+                       'installed_repository_version': VERSION_STUB,
+                       'stack_id': 'HDP-2.2',
+                       'actual_version': VERSION_STUB})
+
+    self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20-repo-4',
+                              base_url=u'http://repo1/HDP-UTILS/centos5/2.x/updates/2.2.0.0',
+                              action=['create'],
+                              components=[u'HDP-UTILS', 'main'],
+                              repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0',
+                              repo_file_name=u'ambari-hdp-4',
+                              mirror_list=None,
+                              append_to_file=False,
+    )
+    self.assertResourceCalled('Repository', 'HDP-2.2-repo-4',
+                              base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
+                              action=['create'],
+                              components=[u'HDP', 'main'],
+                              repo_template='[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0',
+                              repo_file_name=u'ambari-hdp-4',
+                              mirror_list=None,
+                              append_to_file=True,
+    )
+    self.assertResourceCalled('Package', 'hdp-select', action=["upgrade"], retry_count=5, retry_on_repo_unavailability=False)
+    self.assertResourceCalled('Package', 'hadoop_2_2_0_1_885', action=["upgrade"], retry_count=5, retry_on_repo_unavailability=False)
+    self.assertResourceCalled('Package', 'snappy', action=["upgrade"], retry_count=5, retry_on_repo_unavailability=False)
+    self.assertResourceCalled('Package', 'snappy-devel', action=["upgrade"], retry_count=5, retry_on_repo_unavailability=False)
+    self.assertResourceCalled('Package', 'lzo', action=["upgrade"], retry_count=5, retry_on_repo_unavailability=False)
+    self.assertResourceCalled('Package', 'hadooplzo_2_2_0_1_885', action=["upgrade"], retry_count=5, retry_on_repo_unavailability=False)
+    self.assertResourceCalled('Package', 'hadoop_2_2_0_1_885-libhdfs', action=["upgrade"], retry_count=5, retry_on_repo_unavailability=False)
+    self.assertResourceCalled('Package', 'ambari-log4j', action=["upgrade"], retry_count=5, retry_on_repo_unavailability=False)
+    self.assertNoMoreResources()

http://git-wip-us.apache.org/repos/asf/ambari/blob/b6866249/ambari-server/src/test/python/custom_actions/configs/install_packages_repository_file.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/custom_actions/configs/install_packages_repository_file.json b/ambari-server/src/test/python/custom_actions/configs/install_packages_repository_file.json
new file mode 100644
index 0000000..761dced
--- /dev/null
+++ b/ambari-server/src/test/python/custom_actions/configs/install_packages_repository_file.json
@@ -0,0 +1,112 @@
+{
+    "configuration_attributes": {}, 
+    "roleCommand": "ACTIONEXECUTE", 
+    "clusterName": "cc", 
+    "hostname": "0b3.vm", 
+    "passiveInfo": [], 
+    "hostLevelParams": {
+        "agent_stack_retry_count": "5",
+        "agent_stack_retry_on_unavailability": "false",
+        "jdk_location": "http://0b3.vm:8080/resources/", 
+        "ambari_db_rca_password": "mapred", 
+        "java_home": "/usr/jdk64/jdk1.7.0_67",
+        "java_version": "8",
+        "ambari_db_rca_url": "jdbc:postgresql://0b3.vm/ambarirca", 
+        "jce_name": "UnlimitedJCEPolicyJDK7.zip", 
+        "oracle_jdbc_url": "http://0b3.vm:8080/resources//ojdbc6.jar", 
+        "stack_version": "2.1", 
+        "stack_name": "HDP", 
+        "db_name": "ambari", 
+        "ambari_db_rca_driver": "org.postgresql.Driver", 
+        "jdk_name": "jdk-7u67-linux-x64.tar.gz", 
+        "ambari_db_rca_username": "mapred", 
+        "db_driver_filename": "mysql-connector-java.jar", 
+        "mysql_jdbc_url": "http://0b3.vm:8080/resources//mysql-connector-java.jar"
+    }, 
+    "commandType": "EXECUTION_COMMAND", 
+    "repositoryFile": {
+        "stackName": "HDP",
+        "repoVersionId": 4,
+        "repoVersion": "2.2.0.1-885",
+        "repositories": [
+          {
+            "repoName": "HDP-UTILS",
+            "baseUrl": "http://repo1/HDP-UTILS/centos5/2.x/updates/2.2.0.0",
+            "repoId": "HDP-UTILS-1.1.0.20-repo-4"
+          },
+          {
+            "repoName": "HDP",
+            "baseUrl": "http://repo1/HDP/centos5/2.x/updates/2.2.0.0",
+            "repoId": "HDP-2.2-repo-4"
+          }
+        ]
+    },
+    "roleParams": {
+        "stack_id": "HDP-2.2",
+        "repository_version": "2.2.0.1-885",
+        "package_list": "[{\"name\":\"hadoop_${stack_version}\", \"condition\": \"\"},{\"name\":\"snappy\", \"condition\": \"\"},{\"name\":\"snappy-devel\", \"condition\": \"\"},{\"name\":\"lzo\", \"condition\": \"\"},{\"name\":\"hadooplzo_${stack_version}\", \"condition\": \"\"},{\"name\":\"hadoop_${stack_version}-libhdfs\", \"condition\": \"\"},{\"name\":\"ambari-log4j\", \"condition\": \"\"}]"
+    }, 
+    "serviceName": "null", 
+    "role": "install_packages", 
+    "forceRefreshConfigTags": [], 
+    "taskId": 61, 
+    "public_hostname": "0b3.vm", 
+    "configurations": {
+            "cluster-env": {
+                "repo_suse_rhel_template": "[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0",
+                "repo_ubuntu_template": "{{package_type}} {{base_url}} {{components}}"
+        }
+    },
+    "commandParams": {
+        "command_timeout": "60", 
+        "script_type": "PYTHON",
+        "repository_version": "2.2.0.1-885",
+        "package_list": "[{\"name\":\"hadoop_${stack_version}\", \"condition\": \"\"},{\"name\":\"snappy\", \"condition\": \"\"},{\"name\":\"snappy-devel\", \"condition\": \"\"},{\"name\":\"lzo\", \"condition\": \"\"},{\"name\":\"hadooplzo_${stack_version}\", \"condition\": \"\"},{\"name\":\"hadoop_${stack_version}-libhdfs\", \"condition\": \"\"},{\"name\":\"ambari-log4j\", \"condition\": \"\"}]",
+        "script": "install_packages.py"
+    }, 
+    "commandId": "14-1", 
+    "clusterHostInfo": {
+        "snamenode_host": [
+            "0b3.vm"
+        ], 
+        "nm_hosts": [
+            "0b3.vm"
+        ], 
+        "app_timeline_server_hosts": [
+            "0b3.vm"
+        ], 
+        "all_ping_ports": [
+            "8670"
+        ], 
+        "rm_host": [
+            "0b3.vm"
+        ], 
+        "all_hosts": [
+            "0b3.vm"
+        ], 
+        "slave_hosts": [
+            "0b3.vm"
+        ], 
+        "namenode_host": [
+            "0b3.vm"
+        ], 
+        "ambari_server_host": [
+            "0b3.vm"
+        ], 
+        "zookeeper_hosts": [
+            "0b3.vm"
+        ], 
+        "hs_host": [
+            "0b3.vm"
+        ]
+    },
+    "configurations": {
+        "cluster-env": {
+            "repo_suse_rhel_template": "[{{repo_id}}]\nname={{repo_id}}\n{% if mirror_list %}mirrorlist={{mirror_list}}{% else %}baseurl={{base_url}}{% endif %}\n\npath=/\nenabled=1\ngpgcheck=0", 
+            "repo_ubuntu_template": "{{package_type}} {{base_url}} {{components}}"
+        },
+        "core-site": {
+            "io.compression.codecs": "com.hadoop.compression.lzo"
+        }
+    }
+}