You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by dm...@apache.org on 2014/12/10 17:41:01 UTC

ambari git commit: AMBARI-8639. Distribute Repository/Install: parallel install not working (dlysnichenko)

Repository: ambari
Updated Branches:
  refs/heads/trunk 96b7f56fe -> b60f26ee9


AMBARI-8639. Distribute Repository/Install: parallel install not working (dlysnichenko)


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

Branch: refs/heads/trunk
Commit: b60f26ee9a3ae20a37e49f0158e581862643ef86
Parents: 96b7f56
Author: Lisnichenko Dmitro <dl...@hortonworks.com>
Authored: Wed Dec 10 10:46:26 2014 +0200
Committer: Lisnichenko Dmitro <dl...@hortonworks.com>
Committed: Wed Dec 10 18:39:55 2014 +0200

----------------------------------------------------------------------
 .../resource_management/TestPackageResource.py  | 12 +++++
 .../core/providers/package/__init__.py          |  4 +-
 .../core/providers/package/apt.py               |  6 +--
 .../core/providers/package/yumrpm.py            | 14 ++++--
 .../core/providers/package/zypper.py            |  6 +--
 .../core/resources/packaging.py                 |  4 ++
 .../ClusterStackVersionResourceProvider.java    | 32 +++++++------
 .../HostStackVersionResourceProvider.java       |  5 +-
 .../custom_actions/scripts/install_packages.py  | 17 ++++---
 .../custom_actions/TestInstallPackages.py       | 50 ++++++++++----------
 .../configs/install_packages_config.json        |  4 +-
 11 files changed, 94 insertions(+), 60 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/b60f26ee/ambari-agent/src/test/python/resource_management/TestPackageResource.py
----------------------------------------------------------------------
diff --git a/ambari-agent/src/test/python/resource_management/TestPackageResource.py b/ambari-agent/src/test/python/resource_management/TestPackageResource.py
index 140dda9..a357d46 100644
--- a/ambari-agent/src/test/python/resource_management/TestPackageResource.py
+++ b/ambari-agent/src/test/python/resource_management/TestPackageResource.py
@@ -90,6 +90,18 @@ class TestPackageResource(TestCase):
 
   @patch.object(shell, "call", new = MagicMock(return_value=(0, None)))
   @patch.object(shell, "checked_call")
+  @patch.object(System, "os_family", new = 'redhat')
+  def test_action_install_use_repos_rhel(self, shell_mock):
+    with Environment('/') as env:
+      Package("some_package", use_repos=['HDP-UTILS-2.2.0.1-885', 'HDP-2.2.0.1-885']
+              )
+    self.assertEquals(shell_mock.call_args[0][0],
+                      ['/usr/bin/yum', '-d', '0', '-e', '0', '-y', 'install',
+                       '--disablerepo=*',
+                       '--enablerepo=HDP-UTILS-2.2.0.1-885,HDP-2.2.0.1-885', 'some_package'])
+
+  @patch.object(shell, "call", new = MagicMock(return_value=(0, None)))
+  @patch.object(shell, "checked_call")
   @patch.object(System, "os_family", new = 'suse')
   def test_action_install_existent_suse(self, shell_mock):
     with Environment('/') as env:

http://git-wip-us.apache.org/repos/asf/ambari/blob/b60f26ee/ambari-common/src/main/python/resource_management/core/providers/package/__init__.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/core/providers/package/__init__.py b/ambari-common/src/main/python/resource_management/core/providers/package/__init__.py
index 5ab2b27..e1c06bb 100644
--- a/ambari-common/src/main/python/resource_management/core/providers/package/__init__.py
+++ b/ambari-common/src/main/python/resource_management/core/providers/package/__init__.py
@@ -37,11 +37,11 @@ class PackageProvider(Provider):
 
   def action_install(self):
     package_name = self.get_package_name_with_version()
-    self.install_package(package_name)
+    self.install_package(package_name, self.resource.use_repos)
 
   def action_upgrade(self):
     package_name = self.get_package_name_with_version()
-    self.upgrade_package(package_name)
+    self.upgrade_package(package_name, self.resource.use_repos)
 
   def action_remove(self):
     package_name = self.get_package_name_with_version()

http://git-wip-us.apache.org/repos/asf/ambari/blob/b60f26ee/ambari-common/src/main/python/resource_management/core/providers/package/apt.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/core/providers/package/apt.py b/ambari-common/src/main/python/resource_management/core/providers/package/apt.py
index c683be5..33814d8 100644
--- a/ambari-common/src/main/python/resource_management/core/providers/package/apt.py
+++ b/ambari-common/src/main/python/resource_management/core/providers/package/apt.py
@@ -40,7 +40,7 @@ def replace_underscores(function_to_decorate):
 class AptProvider(PackageProvider):
 
   @replace_underscores
-  def install_package(self, name):
+  def install_package(self, name, use_repos=[]):
     if not self._check_existence(name):
       cmd = INSTALL_CMD + [name]
       Logger.info("Installing package %s ('%s')" % (name, string_cmd_from_args_list(cmd)))
@@ -61,8 +61,8 @@ class AptProvider(PackageProvider):
       Logger.info("Skipping installing existent package %s" % (name))
 
   @replace_underscores
-  def upgrade_package(self, name):
-    return self.install_package(name)
+  def upgrade_package(self, name, use_repos=[]):
+    return self.install_package(name, use_repos)
 
   @replace_underscores
   def remove_package(self, name):

http://git-wip-us.apache.org/repos/asf/ambari/blob/b60f26ee/ambari-common/src/main/python/resource_management/core/providers/package/yumrpm.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/core/providers/package/yumrpm.py b/ambari-common/src/main/python/resource_management/core/providers/package/yumrpm.py
index 7d868b0..c447225 100644
--- a/ambari-common/src/main/python/resource_management/core/providers/package/yumrpm.py
+++ b/ambari-common/src/main/python/resource_management/core/providers/package/yumrpm.py
@@ -30,16 +30,20 @@ REMOVE_CMD = ['/usr/bin/yum', '-d', '0', '-e', '0', '-y', 'erase']
 CHECK_CMD = "installed_pkgs=`rpm -qa %s` ; [ ! -z \"$installed_pkgs\" ]"
 
 class YumProvider(PackageProvider):
-  def install_package(self, name):
-    if not self._check_existence(name):
-      cmd = INSTALL_CMD + [name]
+  def install_package(self, name, use_repos=[]):
+    if not self._check_existence(name) or use_repos:
+      cmd = INSTALL_CMD
+      if use_repos:
+        enable_repo_option = '--enablerepo=' + ",".join(use_repos)
+        cmd = cmd + ['--disablerepo=*', enable_repo_option]
+      cmd = cmd + [name]
       Logger.info("Installing package %s ('%s')" % (name, string_cmd_from_args_list(cmd)))
       shell.checked_call(cmd, sudo=True)
     else:
       Logger.info("Skipping installing existent package %s" % (name))
 
-  def upgrade_package(self, name):
-    return self.install_package(name)
+  def upgrade_package(self, name, use_repos=[]):
+    return self.install_package(name, use_repos)
 
   def remove_package(self, name):
     if self._check_existence(name):

http://git-wip-us.apache.org/repos/asf/ambari/blob/b60f26ee/ambari-common/src/main/python/resource_management/core/providers/package/zypper.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/core/providers/package/zypper.py b/ambari-common/src/main/python/resource_management/core/providers/package/zypper.py
index 764da73..fb0b862 100644
--- a/ambari-common/src/main/python/resource_management/core/providers/package/zypper.py
+++ b/ambari-common/src/main/python/resource_management/core/providers/package/zypper.py
@@ -30,7 +30,7 @@ REMOVE_CMD = ['/usr/bin/zypper', '--quiet', 'remove', '--no-confirm']
 CHECK_CMD = "installed_pkgs=`rpm -qa %s` ; [ ! -z \"$installed_pkgs\" ]"
 
 class ZypperProvider(PackageProvider):
-  def install_package(self, name):
+  def install_package(self, name, use_repos=[]):
     if not self._check_existence(name):
       cmd = INSTALL_CMD + [name]
       Logger.info("Installing package %s ('%s')" % (name, string_cmd_from_args_list(cmd)))
@@ -38,8 +38,8 @@ class ZypperProvider(PackageProvider):
     else:
       Logger.info("Skipping installing existent package %s" % (name))
 
-  def upgrade_package(self, name):
-    return self.install_package(name)
+  def upgrade_package(self, name, use_repos=[]):
+    return self.install_package(name, use_repos)
   
   def remove_package(self, name):
     if self._check_existence(name):

http://git-wip-us.apache.org/repos/asf/ambari/blob/b60f26ee/ambari-common/src/main/python/resource_management/core/resources/packaging.py
----------------------------------------------------------------------
diff --git a/ambari-common/src/main/python/resource_management/core/resources/packaging.py b/ambari-common/src/main/python/resource_management/core/resources/packaging.py
index c2ff20e..f38482e 100644
--- a/ambari-common/src/main/python/resource_management/core/resources/packaging.py
+++ b/ambari-common/src/main/python/resource_management/core/resources/packaging.py
@@ -29,6 +29,10 @@ class Package(Resource):
   action = ForcedListArgument(default="install")
   package_name = ResourceArgument(default=lambda obj: obj.name)
   location = ResourceArgument(default=lambda obj: obj.package_name)
+
+  # Allow using only specific list of repositories when performing action
+  use_repos = ResourceArgument(default=[])
+
   version = ResourceArgument()
   actions = ["install", "upgrade", "remove"]
   build_vars = ForcedListArgument(default=[])

http://git-wip-us.apache.org/repos/asf/ambari/blob/b60f26ee/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 1c2297b..9b7c3c9 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
@@ -220,7 +220,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
           NoSuchParentResourceException {
     Iterator<Map<String, Object>> iterator = request.getProperties().iterator();
     String clName;
-    String desiredRepoVersion;
+    final String desiredRepoVersion;
     String stackName;
     String stackVersion;
     if (request.getProperties().size() != 1) {
@@ -334,6 +334,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
       final String repoList = gson.toJson(repoInfo);
 
       Map<String, String> params = new HashMap<String, String>() {{
+        put("repository_version", desiredRepoVersion);
         put("base_urls", repoList);
         put("package_list", packageList);
       }};
@@ -346,7 +347,7 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
               cluster.getClusterName(), INSTALL_PACKAGES_ACTION,
               Collections.singletonList(filter),
               params);
-      actionContext.setTimeout((short) 60);
+      actionContext.setTimeout((short) 600);
 
       try {
         actionExecutionHelper.get().addExecutionCommandsToStage(actionContext, stage);
@@ -356,20 +357,23 @@ public class ClusterStackVersionResourceProvider extends AbstractControllerResou
     }
 
     try {
-      req.persist();
-
-      try {  // Create/persist cluster stack version
-        cluster.createClusterVersion(stackId, desiredRepoVersion, managementController.getAuthName(), RepositoryVersionState.INSTALLED);
-        ClusterVersionEntity newCSVer = clusterVersionDAO.findByClusterAndStackAndVersion(clName, stackId, desiredRepoVersion);
-        cluster.initHostVersions(newCSVer);
-      } catch (AmbariException e) {
-        throw new SystemException(
-                String.format(
-                        "Can not create cluster stack version %s for cluster %s",
-                        desiredRepoVersion, clName),
-                e);
+      ClusterVersionEntity existingCSVer = clusterVersionDAO.findByClusterAndStackAndVersion(clName, stackId, desiredRepoVersion);
+      if (existingCSVer == null) {
+        try {  // Create/persist new cluster stack version
+          cluster.createClusterVersion(stackId, desiredRepoVersion, managementController.getAuthName(), RepositoryVersionState.INSTALLED);
+          ClusterVersionEntity newCSVer = clusterVersionDAO.findByClusterAndStackAndVersion(clName, stackId, desiredRepoVersion);
+          cluster.initHostVersions(newCSVer);
+        } catch (AmbariException e) {
+          throw new SystemException(
+                  String.format(
+                          "Can not create cluster stack version %s for cluster %s",
+                          desiredRepoVersion, clName),
+                  e);
+        }
       }
 
+      req.persist();
+
     } catch (AmbariException e) {
       throw new SystemException("Can not persist request", e);
     }

http://git-wip-us.apache.org/repos/asf/ambari/blob/b60f26ee/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 b278177..2886266 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
@@ -235,7 +235,7 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
           NoSuchParentResourceException {
     Iterator<Map<String,Object>> iterator = request.getProperties().iterator();
     String hostName;
-    String desiredRepoVersion;
+    final String desiredRepoVersion;
     String stackName;
     String stackVersion;
     if (request.getProperties().size() != 1) {
@@ -362,6 +362,7 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
     final String repoList = gson.toJson(repoInfo);
 
     Map<String, String> params = new HashMap<String, String>(){{
+      put("repository_version", desiredRepoVersion);
       put("base_urls", repoList);
       put("package_list", packageList);
     }};
@@ -374,7 +375,7 @@ public class HostStackVersionResourceProvider extends AbstractControllerResource
             cluster.getClusterName(), INSTALL_PACKAGES_ACTION,
             Collections.singletonList(filter),
             params);
-    actionContext.setTimeout((short) 60);
+    actionContext.setTimeout((short) 600);
 
     String caption = String.format(INSTALL_PACKAGES_FULL_NAME + " on host %s", hostName);
     RequestStageContainer req = createRequest(caption);

http://git-wip-us.apache.org/repos/asf/ambari/blob/b60f26ee/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 3e8113a..e6057e4 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
@@ -47,18 +47,22 @@ class InstallPackages(Script):
 
     # Select dict that contains parameters
     try:
+      repository_version = config['roleParams']['repository_version']
       base_urls = json.loads(config['roleParams']['base_urls'])
       package_list = json.loads(config['roleParams']['package_list'])
     except KeyError:
       # Last try
+      repository_version = config['commandParams']['repository_version']
       base_urls = json.loads(config['commandParams']['base_urls'])
       package_list = json.loads(config['commandParams']['package_list'])
 
     # Install/update repositories
     installed_repositories = []
+    current_repositories = ['base']  # Some our packages are installed from the base repo
     try:
       for url_info in base_urls:
-        self.install_repository(url_info)
+        repo_name = self.install_repository(url_info, repository_version)
+        current_repositories.append(repo_name)
 
       installed_repositories = list_ambari_managed_repos()
     except Exception, err:
@@ -70,7 +74,7 @@ class InstallPackages(Script):
     if not delayed_fail:
       try:
         for package in package_list:
-          Package(package['name'])
+          Package(package['name'], use_repos=current_repositories)
         package_install_result = True
       except Exception, err:
         print "Can not install packages."
@@ -81,6 +85,7 @@ class InstallPackages(Script):
     # Build structured output
     structured_output = {
       'ambari_repositories': installed_repositories,
+      'installed_repository_version': repository_version,
       'package_installation_result': 'SUCCESS' if package_install_result else 'FAIL'
     }
     self.put_structured_out(structured_output)
@@ -90,11 +95,11 @@ class InstallPackages(Script):
       raise Fail("Failed to distribute repositories/install packages")
 
 
-  def install_repository(self, url_info):
+  def install_repository(self, url_info, repository_version):
     template = "repo_suse_rhel.j2" if OSCheck.is_redhat_family() or OSCheck.is_suse_family() else "repo_ubuntu.j2"
 
     repo = {
-      'repoName': url_info['repositoryId']
+      'repoName': "{0}-{1}".format(url_info['name'], repository_version)
     }
 
     if not 'baseUrl' in url_info:
@@ -107,7 +112,7 @@ class InstallPackages(Script):
     else:
       repo['mirrorsList'] = url_info['mirrorsList']
 
-    ubuntu_components = [repo['repoName']] + self.UBUNTU_REPO_COMPONENTS_POSTFIX
+    ubuntu_components = [url_info['repositoryId']] + self.UBUNTU_REPO_COMPONENTS_POSTFIX
 
     Repository(repo['repoName'],
       action = "create",
@@ -117,7 +122,7 @@ class InstallPackages(Script):
       repo_template = template,
       components = ubuntu_components,  # ubuntu specific
     )
-
+    return repo['repoName']
 
 if __name__ == "__main__":
   InstallPackages().execute()

http://git-wip-us.apache.org/repos/asf/ambari/blob/b60f26ee/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 bbb96e7..b87569a 100644
--- a/ambari-server/src/test/python/custom_actions/TestInstallPackages.py
+++ b/ambari-server/src/test/python/custom_actions/TestInstallPackages.py
@@ -42,35 +42,36 @@ class TestInstallPackages(RMFTestCase):
     self.assertTrue(put_structured_out.called)
     self.assertEquals(put_structured_out.call_args[0][0],
                       {'package_installation_result': 'SUCCESS',
+                       'installed_repository_version': u'2.2.0.1-885',
                        'ambari_repositories': []})
-    self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20',
+    self.assertResourceCalled('Repository', 'HDP-UTILS-2.2.0.1-885',
                               base_url='http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos5/2.x/updates/2.2.0.0',
                               action=['create'],
                               components=[u'HDP-UTILS-1.1.0.20', 'main'],
                               repo_template='repo_suse_rhel.j2',
-                              repo_file_name='HDP-UTILS-1.1.0.20',
+                              repo_file_name='HDP-UTILS-2.2.0.1-885',
                               mirror_list=None,
     )
-    self.assertResourceCalled('Repository', 'HDP-2.2',
+    self.assertResourceCalled('Repository', 'HDP-2.2.0.1-885',
                               base_url='http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos5/2.x/updates/2.2.0.0',
                               action=['create'],
                               components=[u'HDP-2.2', 'main'],
                               repo_template='repo_suse_rhel.j2',
-                              repo_file_name='HDP-2.2',
+                              repo_file_name='HDP-2.2.0.1-885',
                               mirror_list=None,
     )
-    self.assertResourceCalled('Package', 'hadoop_2_2_*',)
-    self.assertResourceCalled('Package', 'snappy',)
-    self.assertResourceCalled('Package', 'snappy-devel',)
-    self.assertResourceCalled('Package', 'lzo',)
-    self.assertResourceCalled('Package', 'hadooplzo_2_2_*',)
-    self.assertResourceCalled('Package', 'hadoop_2_2_*-libhdfs',)
-    self.assertResourceCalled('Package', 'ambari-log4j',)
+    self.assertResourceCalled('Package', 'hadoop_2_2_*', use_repos=['HDP-UTILS-2.2.0.1-885', 'HDP-2.2.0.1-885'])
+    self.assertResourceCalled('Package', 'snappy', use_repos=['HDP-UTILS-2.2.0.1-885', 'HDP-2.2.0.1-885'])
+    self.assertResourceCalled('Package', 'snappy-devel', use_repos=['HDP-UTILS-2.2.0.1-885', 'HDP-2.2.0.1-885'])
+    self.assertResourceCalled('Package', 'lzo', use_repos=['HDP-UTILS-2.2.0.1-885', 'HDP-2.2.0.1-885'])
+    self.assertResourceCalled('Package', 'hadooplzo_2_2_*', use_repos=['HDP-UTILS-2.2.0.1-885', 'HDP-2.2.0.1-885'])
+    self.assertResourceCalled('Package', 'hadoop_2_2_*-libhdfs', use_repos=['HDP-UTILS-2.2.0.1-885', 'HDP-2.2.0.1-885'])
+    self.assertResourceCalled('Package', 'ambari-log4j', use_repos=['HDP-UTILS-2.2.0.1-885', 'HDP-2.2.0.1-885'])
     self.assertNoMoreResources()
 
 
   @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos",
-         new=MagicMock(return_value=["HDP-UTILS-1.0.0.20"]))
+         new=MagicMock(return_value=["HDP-UTILS-2.2.0.1-885"]))
   @patch("resource_management.libraries.script.Script.put_structured_out")
   def test_exclude_existing_repo(self, put_structured_out):
     self.executeScript("scripts/install_packages.py",
@@ -83,30 +84,31 @@ class TestInstallPackages(RMFTestCase):
     self.assertTrue(put_structured_out.called)
     self.assertEquals(put_structured_out.call_args[0][0],
                       {'package_installation_result': 'SUCCESS',
-                       'ambari_repositories': ["HDP-UTILS-1.0.0.20"]})
-    self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20',
+                       'installed_repository_version': u'2.2.0.1-885',
+                       'ambari_repositories': ["HDP-UTILS-2.2.0.1-885"]})
+    self.assertResourceCalled('Repository', 'HDP-UTILS-2.2.0.1-885',
                               base_url='http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos5/2.x/updates/2.2.0.0',
                               action=['create'],
                               components=[u'HDP-UTILS-1.1.0.20', 'main'],
                               repo_template='repo_suse_rhel.j2',
-                              repo_file_name='HDP-UTILS-1.1.0.20',
+                              repo_file_name='HDP-UTILS-2.2.0.1-885',
                               mirror_list=None,
     )
-    self.assertResourceCalled('Repository', 'HDP-2.2',
+    self.assertResourceCalled('Repository', 'HDP-2.2.0.1-885',
                               base_url='http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos5/2.x/updates/2.2.0.0',
                               action=['create'],
                               components=[u'HDP-2.2', 'main'],
                               repo_template='repo_suse_rhel.j2',
-                              repo_file_name='HDP-2.2',
+                              repo_file_name='HDP-2.2.0.1-885',
                               mirror_list=None,
     )
-    self.assertResourceCalled('Package', 'hadoop_2_2_*',)
-    self.assertResourceCalled('Package', 'snappy',)
-    self.assertResourceCalled('Package', 'snappy-devel',)
-    self.assertResourceCalled('Package', 'lzo',)
-    self.assertResourceCalled('Package', 'hadooplzo_2_2_*',)
-    self.assertResourceCalled('Package', 'hadoop_2_2_*-libhdfs',)
-    self.assertResourceCalled('Package', 'ambari-log4j',)
+    self.assertResourceCalled('Package', 'hadoop_2_2_*', use_repos=['HDP-UTILS-2.2.0.1-885', 'HDP-2.2.0.1-885'])
+    self.assertResourceCalled('Package', 'snappy', use_repos=['HDP-UTILS-2.2.0.1-885', 'HDP-2.2.0.1-885'])
+    self.assertResourceCalled('Package', 'snappy-devel', use_repos=['HDP-UTILS-2.2.0.1-885', 'HDP-2.2.0.1-885'])
+    self.assertResourceCalled('Package', 'lzo', use_repos=['HDP-UTILS-2.2.0.1-885', 'HDP-2.2.0.1-885'])
+    self.assertResourceCalled('Package', 'hadooplzo_2_2_*', use_repos=['HDP-UTILS-2.2.0.1-885', 'HDP-2.2.0.1-885'])
+    self.assertResourceCalled('Package', 'hadoop_2_2_*-libhdfs', use_repos=['HDP-UTILS-2.2.0.1-885', 'HDP-2.2.0.1-885'])
+    self.assertResourceCalled('Package', 'ambari-log4j', use_repos=['HDP-UTILS-2.2.0.1-885', 'HDP-2.2.0.1-885'])
     self.assertNoMoreResources()
 
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/b60f26ee/ambari-server/src/test/python/custom_actions/configs/install_packages_config.json
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/python/custom_actions/configs/install_packages_config.json b/ambari-server/src/test/python/custom_actions/configs/install_packages_config.json
index 9ea9f47..bf0086b 100644
--- a/ambari-server/src/test/python/custom_actions/configs/install_packages_config.json
+++ b/ambari-server/src/test/python/custom_actions/configs/install_packages_config.json
@@ -22,6 +22,7 @@
     }, 
     "commandType": "EXECUTION_COMMAND", 
     "roleParams": {
+        "repository_version": "2.2.0.1-885",
         "base_urls": "[{\"name\":\"HDP-UTILS\",\"baseUrl\":\"http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos5/2.x/updates/2.2.0.0\",\"repositoryId\":\"HDP-UTILS-1.1.0.20\"},{\"name\":\"HDP\",\"baseUrl\":\"http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos5/2.x/updates/2.2.0.0\",\"repositoryId\":\"HDP-2.2\"}]",
         "package_list": "[{\"name\":\"hadoop_2_2_*\"},{\"name\":\"snappy\"},{\"name\":\"snappy-devel\"},{\"name\":\"lzo\"},{\"name\":\"hadooplzo_2_2_*\"},{\"name\":\"hadoop_2_2_*-libhdfs\"},{\"name\":\"ambari-log4j\"}]"
     }, 
@@ -33,7 +34,8 @@
     "configurations": {}, 
     "commandParams": {
         "command_timeout": "60", 
-        "script_type": "PYTHON", 
+        "script_type": "PYTHON",
+        "repository_version": "2.2.0.1-885",
         "base_urls": "[{\"name\":\"HDP-UTILS\",\"baseUrl\":\"http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos5/2.x/updates/2.2.0.0\",\"repositoryId\":\"HDP-UTILS-1.1.0.20\"},{\"name\":\"HDP\",\"baseUrl\":\"http://s3.amazonaws.com/dev.hortonworks.com/HDP/centos5/2.x/updates/2.2.0.0\",\"repositoryId\":\"HDP-2.2\"}]",
         "package_list": "[{\"name\":\"hadoop_2_2_*\"},{\"name\":\"snappy\"},{\"name\":\"snappy-devel\"},{\"name\":\"lzo\"},{\"name\":\"hadooplzo_2_2_*\"},{\"name\":\"hadoop_2_2_*-libhdfs\"},{\"name\":\"ambari-log4j\"}]",
         "script": "install_packages.py"