You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ao...@apache.org on 2018/08/29 11:02:56 UTC

[ambari] 01/02: AMBARI-24543. Client installs failing with Ambari-2.7.0.0 on Ubuntu14 (aonishuk)

This is an automated email from the ASF dual-hosted git repository.

aonishuk pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git

commit e7c69231d682fcc99d85239e2a2e037ec300fecd
Author: Andrew Onishuk <ao...@hortonworks.com>
AuthorDate: Mon Aug 27 10:15:45 2018 +0300

    AMBARI-24543. Client installs failing with Ambari-2.7.0.0 on Ubuntu14 (aonishuk)
---
 .../src/main/python/ambari_agent/PythonExecutor.py |   5 +-
 .../resource_management/TestRepositoryResource.py  |  45 +++----
 .../libraries/functions/repository_util.py         |  10 +-
 .../libraries/providers/__init__.py                |   6 +-
 .../libraries/providers/repository.py              | 139 +++++++++++----------
 .../libraries/resources/repository.py              |   9 +-
 .../custom_actions/scripts/update_repo.py          |   3 +-
 .../before-INSTALL/scripts/repo_initialization.py  |   4 +-
 .../python/custom_actions/TestInstallPackages.py   |  66 +++++-----
 .../test/python/custom_actions/TestUpdateRepo.py   |   4 +-
 10 files changed, 153 insertions(+), 138 deletions(-)

diff --git a/ambari-agent/src/main/python/ambari_agent/PythonExecutor.py b/ambari-agent/src/main/python/ambari_agent/PythonExecutor.py
index 977562b..8346f7c 100644
--- a/ambari-agent/src/main/python/ambari_agent/PythonExecutor.py
+++ b/ambari-agent/src/main/python/ambari_agent/PythonExecutor.py
@@ -139,9 +139,8 @@ class PythonExecutor(object):
     """
     Log some useful information after task failure.
     """
-    pass
-    #logger.info("Command %s failed with exitcode=%s", pprint.pformat(pythonCommand), result['exitcode'])
-    #log_process_information(logger)
+    self.logger.info("Command %s failed with exitcode=%s", pprint.pformat(python_command), result['exitcode'])
+    log_process_information(self.logger)
 
   def prepare_process_result(self, returncode, tmpoutfile, tmperrfile, tmpstructedoutfile, timeout=None):
     out, error, structured_out = self.read_result_from_files(tmpoutfile, tmperrfile, tmpstructedoutfile)
diff --git a/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py b/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py
index a69b57b..91d4939 100644
--- a/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py
+++ b/ambari-agent/src/test/python/resource_management/TestRepositoryResource.py
@@ -64,6 +64,8 @@ class TestRepositoryResource(TestCase):
     @patch.object(OSCheck, "is_ubuntu_family")
     @patch.object(OSCheck, "is_redhat_family")
     @patch("resource_management.libraries.providers.repository.File")
+    @patch("filecmp.cmp", new=MagicMock(return_value=False))
+    @patch("os.path.isfile", new=MagicMock(return_value=True))
     @patch.object(System, "os_family", new='redhat')
     def test_create_repo_redhat(self, file_mock,
                                 is_redhat_family, is_ubuntu_family, is_suse_family):
@@ -77,6 +79,8 @@ class TestRepositoryResource(TestCase):
                        mirror_list='https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
                        repo_file_name='Repository',
                        repo_template=RHEL_SUSE_DEFAULT_TEMPLATE)
+                       
+            Repository(None, action="create")
 
             self.assertTrue('hadoop' in env.resources['Repository'])
             defined_arguments = env.resources['Repository']['hadoop'].arguments
@@ -91,20 +95,16 @@ class TestRepositoryResource(TestCase):
             self.assertEqual(defined_arguments, expected_arguments)
             self.assertEqual(file_mock.call_args[0][0], '/etc/yum.repos.d/Repository.repo')
 
-            template_item = file_mock.call_args[1]['content']
-            template = str(template_item.name)
-            expected_template_arguments.update({'repo_id': 'hadoop'})
-
-            self.assertEqual(expected_template_arguments, template_item.context._dict)
-            self.assertEqual(RHEL_SUSE_DEFAULT_TEMPLATE, template)
-
 
     @patch.object(OSCheck, "is_suse_family")
     @patch.object(OSCheck, "is_ubuntu_family")
     @patch.object(OSCheck, "is_redhat_family")
     @patch.object(System, "os_family", new='suse')
+    @patch("resource_management.libraries.providers.repository.checked_call")
+    @patch("os.path.isfile", new=MagicMock(return_value=True))
+    @patch("filecmp.cmp", new=MagicMock(return_value=False))
     @patch("resource_management.libraries.providers.repository.File")
-    def test_create_repo_suse(self, file_mock,
+    def test_create_repo_suse(self, file_mock, checked_call,
                               is_redhat_family, is_ubuntu_family, is_suse_family):
         is_redhat_family.return_value = False
         is_ubuntu_family.return_value = False
@@ -116,6 +116,8 @@ class TestRepositoryResource(TestCase):
                        mirror_list='https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
                        repo_template = RHEL_SUSE_DEFAULT_TEMPLATE,
                        repo_file_name='Repository')
+                       
+            Repository(None, action="create")
 
             self.assertTrue('hadoop' in env.resources['Repository'])
             defined_arguments = env.resources['Repository']['hadoop'].arguments
@@ -130,13 +132,6 @@ class TestRepositoryResource(TestCase):
             self.assertEqual(defined_arguments, expected_arguments)
             self.assertEqual(file_mock.call_args[0][0], '/etc/zypp/repos.d/Repository.repo')
 
-            template_item = file_mock.call_args[1]['content']
-            template = str(template_item.name)
-            expected_template_arguments.update({'repo_id': 'hadoop'})
-
-            self.assertEqual(expected_template_arguments, template_item.context._dict)
-            self.assertEqual(RHEL_SUSE_DEFAULT_TEMPLATE, template)
-
 
     @patch.object(OSCheck, "is_suse_family")
     @patch.object(OSCheck, "is_ubuntu_family")
@@ -146,8 +141,10 @@ class TestRepositoryResource(TestCase):
     @patch("resource_management.libraries.providers.repository.checked_call")
     @patch("resource_management.core.sudo.read_file")
     @patch("os.path.isfile", new=MagicMock(return_value=True))
-    def test_recreate_repo_suse(self, read_file_mock, checked_call_mock, file_mock,
+    @patch("filecmp.cmp")
+    def test_recreate_repo_suse(self, filecmp_mock, read_file_mock, checked_call_mock, file_mock,
                               is_redhat_family, is_ubuntu_family, is_suse_family):
+        filecmp_mock.return_value = False
         is_redhat_family.return_value = False
         is_ubuntu_family.return_value = False
         is_suse_family.return_value = True
@@ -161,27 +158,30 @@ class TestRepositoryResource(TestCase):
                        mirror_list='https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
                        repo_template = RHEL_SUSE_DEFAULT_TEMPLATE,
                        repo_file_name='Repository')
-
+            
+            Repository(None, action="create")
+            
             self.assertTrue(checked_call_mock.called)
 
             expected_repo_file_content = "[hadoop]\nname=hadoop\nmirrorlist=https://mirrors.base_url.org/?repo=Repository&arch=$basearch\n\npath=/\nenabled=1\ngpgcheck=0"
-            template = file_mock.call_args[1]['content']
+            template = file_mock.call_args_list[0][1]['content']
             self.assertEqual(expected_repo_file_content, template)
 
             # Check that if content is equal, zypper cache is not flushed
             checked_call_mock.reset_mock()
-            read_file_mock.return_value = expected_repo_file_content
+            filecmp_mock.return_value = True
 
             Repository('hadoop',
                        base_url='http://download.base_url.org/rpm/',
                        mirror_list='https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
                        repo_template = RHEL_SUSE_DEFAULT_TEMPLATE,
                        repo_file_name='Repository')
+            Repository(None, action="create")
 
             self.assertFalse(checked_call_mock.called)
 
             expected_repo_file_content = "[hadoop]\nname=hadoop\nmirrorlist=https://mirrors.base_url.org/?repo=Repository&arch=$basearch\n\npath=/\nenabled=1\ngpgcheck=0"
-            template = file_mock.call_args[1]['content']
+            template = file_mock.call_args_list[0][1]['content']
             self.assertEqual(expected_repo_file_content, template)
 
 
@@ -213,6 +213,7 @@ class TestRepositoryResource(TestCase):
                      repo_template = DEBIAN_DEFAUTL_TEMPLATE,
                      components = ['a','b','c']
           )
+          Repository(None, action="create")
 
       call_content = file_mock.call_args_list[0]
       template_name = call_content[0][0]
@@ -256,6 +257,7 @@ class TestRepositoryResource(TestCase):
                      repo_template = DEBIAN_DEFAUTL_TEMPLATE,
                      components = ['a','b','c']
           )
+          Repository(None, action="create")
 
       call_content = file_mock.call_args_list[0]
       template_name = call_content[0][0]
@@ -292,6 +294,7 @@ class TestRepositoryResource(TestCase):
                      repo_template = DEBIAN_DEFAUTL_TEMPLATE,
                      components = ['a','b','c']
           )
+          Repository(None, action="create")
 
       call_content = file_mock.call_args_list[0]
       template_name = call_content[0][0]
@@ -347,7 +350,7 @@ class TestRepositoryResource(TestCase):
                        action='remove',
                        base_url='http://download.base_url.org/rpm/',
                        mirror_list='https://mirrors.base_url.org/?repo=Repository&arch=$basearch',
-                       repo_file_name='Repository')
+                       repo_file_name='Repository')        
 
             self.assertTrue('hadoop' in env.resources['Repository'])
             defined_arguments = env.resources['Repository']['hadoop'].arguments
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
index 684e3dc..c2123da 100644
--- 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
@@ -59,7 +59,6 @@ class RepositoryUtil:
           self.command_repository.stack_name, self.command_repository.version_string))
       return {}
 
-    append_to_file = False  # initialize to False to create the file anew.
     repo_files = {}
     for repository in self.command_repository.items:
       if repository.repo_id is None:
@@ -75,16 +74,17 @@ class RepositoryUtil:
             self.command_repository.stack_name, self.command_repository.version_string, repository.repo_id))
       else:
         Repository(repository.repo_id,
-                   action="create",
+                   action="prepare",
                    base_url=repository.base_url,
                    mirror_list=repository.mirrors_list,
                    repo_file_name=self.command_repository.repo_filename,
                    repo_template=self.template,
-                   components=repository.ubuntu_components,
-                   append_to_file=append_to_file)
-        append_to_file = True
+                   components=repository.ubuntu_components
+        )
         repo_files[repository.repo_id] = self.command_repository.repo_filename
 
+    Repository(None, action="create")
+
     return repo_files
 
 def create_repo_files(template, command_repository):
diff --git a/ambari-common/src/main/python/resource_management/libraries/providers/__init__.py b/ambari-common/src/main/python/resource_management/libraries/providers/__init__.py
index 770f9b5..aed6c5f 100644
--- a/ambari-common/src/main/python/resource_management/libraries/providers/__init__.py
+++ b/ambari-common/src/main/python/resource_management/libraries/providers/__init__.py
@@ -22,13 +22,13 @@ Ambari Agent
 
 PROVIDERS = dict(
   amazon=dict(
-    Repository="resource_management.libraries.providers.repository.RhelSuseRepositoryProvider",
+    Repository="resource_management.libraries.providers.repository.RhelRepositoryProvider",
   ),
   redhat=dict(
-    Repository="resource_management.libraries.providers.repository.RhelSuseRepositoryProvider",
+    Repository="resource_management.libraries.providers.repository.RhelRepositoryProvider",
   ),
   suse=dict(
-    Repository="resource_management.libraries.providers.repository.RhelSuseRepositoryProvider",
+    Repository="resource_management.libraries.providers.repository.SuseRepositoryProvider",
   ),
   ubuntu=dict(
     Repository="resource_management.libraries.providers.repository.UbuntuRepositoryProvider",
diff --git a/ambari-common/src/main/python/resource_management/libraries/providers/repository.py b/ambari-common/src/main/python/resource_management/libraries/providers/repository.py
index f476e29..8b3fe38 100644
--- a/ambari-common/src/main/python/resource_management/libraries/providers/repository.py
+++ b/ambari-common/src/main/python/resource_management/libraries/providers/repository.py
@@ -35,102 +35,90 @@ from resource_management.core.shell import checked_call
 from resource_management.core import sudo
 from resource_management.core.logger import Logger
 import re
+from collections import defaultdict
 
 REPO_TEMPLATE_FOLDER = 'data'
 
+class RepositoryProvider(Provider):
+  repo_files_content = defaultdict(lambda:'')
 
-class RhelSuseRepositoryProvider(Provider):
+  def action_create(self):
+    with tempfile.NamedTemporaryFile() as tmpf:
+      with tempfile.NamedTemporaryFile() as old_repo_tmpf:
+        for repo_file_path, repo_file_content in RepositoryProvider.repo_files_content.iteritems():
+          repo_file_content = repo_file_content.strip()
 
-  update_cmd = ['zypper', 'clean', '--all']
+          File(tmpf.name,
+               content=repo_file_content
+          )
 
-  def action_create(self):
+          if os.path.isfile(repo_file_path):
+            # a copy of old repo file, which will be readable by current user
+            File(old_repo_tmpf.name,
+                 content=StaticFile(repo_file_path),
+            )
+
+          if not os.path.isfile(repo_file_path) or not filecmp.cmp(tmpf.name, old_repo_tmpf.name):
+            Logger.info(format("Rewriting {repo_file_path} since it has changed."))
+            File(repo_file_path,
+                 content = StaticFile(tmpf.name)
+            )
+
+            self.update(repo_file_path)
+            
+    RepositoryProvider.repo_files_content.clear()
+
+class RhelRepositoryProvider(RepositoryProvider):
+  def action_prepare(self):
     repo_file_name = self.resource.repo_file_name
-    repo_dir = get_repo_dir()
+    repo_dir = self.get_repo_dir()
     new_content = InlineTemplate(self.resource.repo_template, repo_id=self.resource.repo_id, repo_file_name=self.resource.repo_file_name,
-                           base_url=self.resource.base_url, mirror_list=self.resource.mirror_list)
+                           base_url=self.resource.base_url, mirror_list=self.resource.mirror_list).get_content() + '\n'
     repo_file_path = format("{repo_dir}/{repo_file_name}.repo")
 
-    if os.path.isfile(repo_file_path):
-      existing_content_str = sudo.read_file(repo_file_path)
-      new_content_str = new_content.get_content()
-      if existing_content_str != new_content_str and OSCheck.is_suse_family():
-        # We need to reset package manager's cache when we replace base urls
-        # at existing repo. That is a case at least under SLES
-        Logger.info("Flushing package manager cache since repo file content is about to change")
-        checked_call(self.update_cmd, sudo=True)
-      if self.resource.append_to_file:
-        content = existing_content_str + '\n' + new_content_str
-      else:
-        content = new_content_str
-    else: # If repo file does not exist yet
-      content = new_content
-
-    File(repo_file_path,
-         content=content
-    )
+    RepositoryProvider.repo_files_content[repo_file_path] += new_content
   
   def action_remove(self):
     repo_file_name = self.resource.repo_file_name
-    repo_dir = get_repo_dir()
+    repo_dir = self.get_repo_dir()
 
     File(format("{repo_dir}/{repo_file_name}.repo"),
          action="delete")
     
-  
-def get_repo_dir():
-  if OSCheck.is_redhat_family():
+  def get_repo_dir(self):
     return '/etc/yum.repos.d'
-  elif OSCheck.is_suse_family():
+
+  def update(self, repo_file_path):
+    # Centos will usually update automatically. Don't need to waste deploy time.
+    # Also in cases of failure of package install 'yum clean metadata' and retry is ran anyway.
+    pass
+
+class SuseRepositoryProvider(RhelRepositoryProvider):
+  update_cmd = ['zypper', 'clean', '--all']
+
+  def get_repo_dir(self):
     return '/etc/zypp/repos.d'
 
+  def update(self, repo_file_path):
+    Logger.info("Flushing package manager cache since repo file content is about to change")
+    checked_call(self.update_cmd, sudo=True)
 
-class UbuntuRepositoryProvider(Provider):
+class UbuntuRepositoryProvider(RepositoryProvider):
   package_type = "deb"
   repo_dir = "/etc/apt/sources.list.d"
   update_cmd = ['apt-get', 'update', '-qq', '-o', 'Dir::Etc::sourcelist=sources.list.d/{repo_file_name}', '-o', 'Dir::Etc::sourceparts=-', '-o', 'APT::Get::List-Cleanup=0']
   missing_pkey_regex = "The following signatures couldn't be verified because the public key is not available: NO_PUBKEY ([A-Z0-9]+)"
   app_pkey_cmd_prefix = ('apt-key', 'adv', '--recv-keys', '--keyserver', 'keyserver.ubuntu.com')
 
-  def action_create(self):
-    with tempfile.NamedTemporaryFile() as tmpf:
-      with tempfile.NamedTemporaryFile() as old_repo_tmpf:
-        repo_file_name = format("{repo_file_name}.list",repo_file_name=self.resource.repo_file_name)
-        repo_file_path = format("{repo_dir}/{repo_file_name}", repo_dir=self.repo_dir)
-
-        new_content = InlineTemplate(self.resource.repo_template, package_type=self.package_type,
-                                      base_url=self.resource.base_url,
-                                      components=' '.join(self.resource.components)).get_content()
-        old_content = ''
-        if self.resource.append_to_file and os.path.isfile(repo_file_path):
-            old_content = sudo.read_file(repo_file_path) + '\n'
-
-        File(tmpf.name, 
-             content=old_content+new_content
-        )
-        
-        if os.path.isfile(repo_file_path):
-          # a copy of old repo file, which will be readable by current user
-          File(old_repo_tmpf.name, 
-               content=StaticFile(repo_file_path),
-          )
+  def action_prepare(self):
+    repo_file_name = format("{repo_file_name}.list",repo_file_name=self.resource.repo_file_name)
+    repo_file_path = format("{repo_dir}/{repo_file_name}", repo_dir=self.repo_dir)
 
-        if not os.path.isfile(repo_file_path) or not filecmp.cmp(tmpf.name, old_repo_tmpf.name):
-          File(repo_file_path,
-               content = StaticFile(tmpf.name)
-          )
-          
-          update_cmd_formatted = [format(x) for x in self.update_cmd]
-          # this is time expensive
-          retcode, out = checked_call(update_cmd_formatted, sudo=True, quiet=False)
-          
-          # add public keys for new repos
-          missing_pkeys = set(re.findall(self.missing_pkey_regex, out))
-          for pkey in missing_pkeys:
-            Execute(self.app_pkey_cmd_prefix + (pkey,),
-                    timeout = 15, # in case we are on the host w/o internet (using localrepo), we should ignore hanging
-                    ignore_failures = True,
-                    sudo = True,
-            )
+    new_content = InlineTemplate(self.resource.repo_template, package_type=self.package_type,
+                                  base_url=self.resource.base_url,
+                                  components=' '.join(self.resource.components)).get_content() + '\n'
+
+    RepositoryProvider.repo_files_content[repo_file_path] += new_content
   
   def action_remove(self):
     repo_file_name = format("{repo_file_name}.list", repo_file_name=self.resource.repo_file_name)
@@ -143,3 +131,18 @@ class UbuntuRepositoryProvider(Provider):
       # this is time expensive
       update_cmd_formatted = [format(x) for x in self.update_cmd]
       Execute(update_cmd_formatted)
+
+  def update(self, repo_file_path):
+    repo_file_name = os.path.basename(repo_file_path)
+    update_cmd_formatted = [format(x) for x in self.update_cmd]
+    # this is time expensive
+    retcode, out = checked_call(update_cmd_formatted, sudo=True, quiet=False)
+
+    # add public keys for new repos
+    missing_pkeys = set(re.findall(self.missing_pkey_regex, out))
+    for pkey in missing_pkeys:
+      Execute(self.app_pkey_cmd_prefix + (pkey,),
+              timeout = 15, # in case we are on the host w/o internet (using localrepo), we should ignore hanging
+              ignore_failures = True,
+              sudo = True,
+      )
diff --git a/ambari-common/src/main/python/resource_management/libraries/resources/repository.py b/ambari-common/src/main/python/resource_management/libraries/resources/repository.py
index 2484d67..99bdc40 100644
--- a/ambari-common/src/main/python/resource_management/libraries/resources/repository.py
+++ b/ambari-common/src/main/python/resource_management/libraries/resources/repository.py
@@ -25,13 +25,16 @@ _all__ = ["Repository"]
 from resource_management.core.base import Resource, ForcedListArgument, ResourceArgument, BooleanArgument
 
 class Repository(Resource):
-  action = ForcedListArgument(default="create")
+  action = ForcedListArgument(default="prepare")
   repo_id = ResourceArgument(default=lambda obj: obj.name)
   base_url = ResourceArgument()
   mirror_list = ResourceArgument()
   repo_file_name = ResourceArgument()
   repo_template = ResourceArgument()
-  append_to_file = ResourceArgument(default=False)
   components = ForcedListArgument(default=[]) # ubuntu specific
 
-  actions = Resource.actions + ["create","remove"]
\ No newline at end of file
+  """
+  'prepare' action only adds repositories information into memory.
+  'create' action writes prepared repositories into file (possibly multiple repos into single file)
+  """
+  actions = Resource.actions + ["prepare", "create","remove"]
\ No newline at end of file
diff --git a/ambari-server/src/main/resources/custom_actions/scripts/update_repo.py b/ambari-server/src/main/resources/custom_actions/scripts/update_repo.py
index 6f8a939..ece27f5 100644
--- a/ambari-server/src/main/resources/custom_actions/scripts/update_repo.py
+++ b/ambari-server/src/main/resources/custom_actions/scripts/update_repo.py
@@ -54,7 +54,7 @@ class UpdateRepo(Script):
                             [components.replace(",", " ") if components else self.UBUNTU_REPO_COMPONENTS_POSTFIX]
 
         Repository(repo_id,
-                 action = "create",
+                 action = "prepare",
                  base_url = base_url,
                  mirror_list = None,
                  repo_file_name = repo_name,
@@ -62,6 +62,7 @@ class UpdateRepo(Script):
                  components = ubuntu_components, # ubuntu specific
         )
         structured_output["repo_update"] = {"exit_code" : 0, "message": format("Repository files successfully updated!")}
+      Repository(None, action="create")
     except Exception, exception:
       Logger.logger.exception("ERROR: There was an unexpected error while updating repositories")
       raise Fail("Failed to update repo files!")
diff --git a/ambari-server/src/main/resources/stack-hooks/before-INSTALL/scripts/repo_initialization.py b/ambari-server/src/main/resources/stack-hooks/before-INSTALL/scripts/repo_initialization.py
index 382b506..f6f2a12 100644
--- a/ambari-server/src/main/resources/stack-hooks/before-INSTALL/scripts/repo_initialization.py
+++ b/ambari-server/src/main/resources/stack-hooks/before-INSTALL/scripts/repo_initialization.py
@@ -48,13 +48,15 @@ def _alter_repo(action, repo_dicts, repo_template):
                         + [repo['components'].replace(",", " ") if 'components' in repo and repo['components'] else UBUNTU_REPO_COMPONENTS_POSTFIX]
 
     Repository(repo['repoId'],
-               action = action,
+               action = "prepare",
                base_url = repo['baseUrl'],
                mirror_list = repo['mirrorsList'],
                repo_file_name = repo['repoName'],
                repo_template = repo_template,
                components = ubuntu_components) # ubuntu specific
 
+  Repository(None, action = "create")
+
 
 def install_repos():
   import params
diff --git a/ambari-server/src/test/python/custom_actions/TestInstallPackages.py b/ambari-server/src/test/python/custom_actions/TestInstallPackages.py
index 6e04938..a8840f0 100644
--- a/ambari-server/src/test/python/custom_actions/TestInstallPackages.py
+++ b/ambari-server/src/test/python/custom_actions/TestInstallPackages.py
@@ -130,21 +130,22 @@ class TestInstallPackages(RMFTestCase):
                          'actual_version': VERSION_STUB})
       self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20',
                                 base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
-                                action=['create'],
+                                action=['prepare'],
                                 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=repo_file_name,
                                 mirror_list=None,
-                                append_to_file=False,
       )
       self.assertResourceCalled('Repository', 'HDP-2.2',
                                 base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
-                                action=['create'],
+                                action=['prepare'],
                                 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=repo_file_name,
                                 mirror_list=None,
-                                append_to_file=True,
+      )
+      self.assertResourceCalled('Repository', None,
+                                action=['create'],
       )
       self.assertNoMoreResources()
 
@@ -249,23 +250,23 @@ class TestInstallPackages(RMFTestCase):
                          'actual_version': VERSION_STUB})
       self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20',
                                 base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
-                                action=['create'],
+                                action=['prepare'],
                                 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=repo_file_name,
                                 mirror_list=None,
-                                append_to_file=False,
                                 )
       self.assertResourceCalled('Repository', 'HDP-2.2',
                                 base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
-                                action=['create'],
+                                action=['prepare'],
                                 components=[u'HDP', 'main'],
                                 repo_template=u'[{{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=repo_file_name,
                                 mirror_list=None,
-                                append_to_file=True,
                                 )
-
+      self.assertResourceCalled('Repository', None,
+                                action=['create'],
+      )
       self.assertNoMoreResources()
 
   @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos")
@@ -317,21 +318,22 @@ class TestInstallPackages(RMFTestCase):
                          'actual_version': VERSION_STUB})
       self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20',
                                 base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
-                                action=['create'],
+                                action=['prepare'],
                                 components=[u'HDP-UTILS', 'main'],
                                 repo_template=u'[{{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=repo_file_name,
                                 mirror_list=None,
-                                append_to_file=False,
       )
       self.assertResourceCalled('Repository', 'HDP-2.2',
                                 base_url='http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
-                                action=['create'],
+                                action=['prepare'],
                                 components=[u'HDP', 'main'],
                                 repo_template=u'[{{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=repo_file_name,
                                 mirror_list=None,
-                                append_to_file=True,
+      )
+      self.assertResourceCalled('Repository', None,
+                                action=['create'],
       )
       self.assertNoMoreResources()
 
@@ -403,22 +405,23 @@ class TestInstallPackages(RMFTestCase):
                         'package_installation_result': 'FAIL'})
       self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20',
                                 base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
-                                action=['create'],
+                                action=['prepare'],
                                 components=[u'HDP-UTILS', 'main'],
                                 repo_template=u'[{{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-1',
                                 mirror_list=None,
-                                append_to_file=False,
                                 )
       self.assertResourceCalled('Repository', 'HDP-2.2',
                                 base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
-                                action=['create'],
+                                action=['prepare'],
                                 components=[u'HDP', 'main'],
                                 repo_template=u'[{{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-1',
                                 mirror_list=None,
-                                append_to_file=True,
                                 )
+      self.assertResourceCalled('Repository', None,
+                                action=['create'],
+      )
       self.assertNoMoreResources()
 
       TestInstallPackages._install_failed = False
@@ -473,23 +476,23 @@ class TestInstallPackages(RMFTestCase):
                          'actual_version': VERSION_STUB})
       self.assertResourceCalled('Repository', 'HDP-UTILS-1.1.0.20',
                                 base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
-                                action=['create'],
+                                action=['prepare'],
                                 components=[u'HDP-UTILS', 'main'],
                                 repo_template=u'[{{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=repo_file_name,
                                 mirror_list=None,
-                                append_to_file=False,
                                 )
       self.assertResourceCalled('Repository', 'HDP-2.2',
                                 base_url=u'http://repo1/HDP/centos5/2.x/updates/2.2.0.0',
-                                action=['create'],
+                                action=['prepare'],
                                 components=[u'HDP', 'main'],
                                 repo_template=u'[{{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=repo_file_name,
                                 mirror_list=None,
-                                append_to_file=True,
                                 )
-
+      self.assertResourceCalled('Repository', None,
+                                action=['create'],
+      )
       self.assertNoMoreResources()
 
 
@@ -551,22 +554,23 @@ class TestInstallPackages(RMFTestCase):
                          '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'],
+                                action=['prepare'],
                                 components=[u'HDP-UTILS', 'main'],
                                 repo_template=u'[{{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=repo_file_name,
                                 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'],
+                                action=['prepare'],
                                 components=[u'HDP', 'main'],
                                 repo_template=u'[{{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=repo_file_name,
                                 mirror_list=None,
-                                append_to_file=True,
                                 )
+      self.assertResourceCalled('Repository', None,
+                                action=['create'],
+      )
       self.assertNoMoreResources()
 
   @patch("resource_management.libraries.functions.list_ambari_managed_repos.list_ambari_managed_repos")
@@ -1257,23 +1261,23 @@ class TestInstallPackages(RMFTestCase):
 
       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'],
+                                action=['prepare'],
                                 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=repo_file_name,
                                 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'],
+                                action=['prepare'],
                                 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=repo_file_name,
                                 mirror_list=None,
-                                append_to_file=True,
       )
-
+      self.assertResourceCalled('Repository', None,
+                                action=['create'],
+      )
       self.assertNoMoreResources()
 
   def test_os_family_check_with_inheritance(self):
diff --git a/ambari-server/src/test/python/custom_actions/TestUpdateRepo.py b/ambari-server/src/test/python/custom_actions/TestUpdateRepo.py
index f984da9..43114ac 100644
--- a/ambari-server/src/test/python/custom_actions/TestUpdateRepo.py
+++ b/ambari-server/src/test/python/custom_actions/TestUpdateRepo.py
@@ -92,14 +92,14 @@ class TestUpdateRepo(TestCase):
       updateRepo.actionexecute(None)
 
     self.assertTrue(file_mock.called)
-    self.assertEquals(file_mock.call_args[0][0], "/etc/yum.repos.d/HDP-UTILS.repo")
+    self.assertEquals(file_mock.call_args[0][0], "/etc/yum.repos.d/HDP.repo")
     self.assertEquals(structured_out_mock.call_args[0][0], {'repo_update': {'message': 'Repository files successfully updated!', 'exit_code': 0}})
 
     ###### invalid repo info
     file_mock.reset_mock()
     failed = False
     mock_config.return_value = { "configurations": {
-                                        "cluster-env": {
+                                        "clugit ster-env": {
                                                 "repo_suse_rhel_template": "REPO_SUSE_RHEL_TEST_TEMPLATE",
                                                 "repo_ubuntu_template": "REPO_UBUNTU_TEMPLATE"
                                         }